From b70d208f38160eb9db28570cca84416934133bc2 Mon Sep 17 00:00:00 2001 From: iTracerFacer <134304944+iTracerFacer@users.noreply.github.com> Date: Tue, 4 Nov 2025 08:32:11 -0600 Subject: [PATCH] Too many changes to list accross to many files. Save more often dummy. :) --- .../DUAL_COALITION_CHANGES.md | 155 - .../F99th-Operation_Polar_Shield_1.1.4.miz | Bin 0 -> 2343958 bytes .../F99th-Operation_Polar_Shield_1.1.5.miz | Bin 0 -> 2344025 bytes .../Moose_CaptureZones.lua | 26 +- .../Moose_FAC2MarkRecceZone.lua | 20 +- .../Moose_NavalGroup.lua | 77 +- .../Moose_TADC_CargoDispatcher.lua | 7 + .../Operation_Polar_Shield/OnBirthMessage.lua | 14 +- Moose_.lua | 716 +- Moose_.lua.backup | 132469 +++++++++++++++ Moose_CTLD_Pure/Moose_CTLD.lua | 552 + Moose_CTLD_Pure/Moose_CTLD_FAC.lua | 207 + Moose_CTLD_Pure/README.md | 106 + .../catalogs/CrateCatalog_CTLD_Extract.lua | 166 + Moose_CTLD_Pure/init_example.lua | 44 + Patch-MooseMissions/Download-MooseInclude.ps1 | 83 + Patch-MooseMissions/README.md | 21 + 17 files changed, 134378 insertions(+), 285 deletions(-) delete mode 100644 DCS_Kola/Operation_Polar_Shield/DUAL_COALITION_CHANGES.md create mode 100644 DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.4.miz create mode 100644 DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.5.miz create mode 100644 Moose_.lua.backup create mode 100644 Moose_CTLD_Pure/Moose_CTLD.lua create mode 100644 Moose_CTLD_Pure/Moose_CTLD_FAC.lua create mode 100644 Moose_CTLD_Pure/README.md create mode 100644 Moose_CTLD_Pure/catalogs/CrateCatalog_CTLD_Extract.lua create mode 100644 Moose_CTLD_Pure/init_example.lua create mode 100644 Patch-MooseMissions/Download-MooseInclude.ps1 diff --git a/DCS_Kola/Operation_Polar_Shield/DUAL_COALITION_CHANGES.md b/DCS_Kola/Operation_Polar_Shield/DUAL_COALITION_CHANGES.md deleted file mode 100644 index cacc48f..0000000 --- a/DCS_Kola/Operation_Polar_Shield/DUAL_COALITION_CHANGES.md +++ /dev/null @@ -1,155 +0,0 @@ -# Dual Coalition Zone Capture - Full Analysis & Changes - -## Summary -The script has been refactored to provide **complete parity between RED and BLUE coalitions**. Both sides now have equal access to all features, information, and victory conditions. - ---- - -## ✅ Changes Made for Full Dual-Coalition Support - -### 1. **Tactical Markers** (Lines ~390-440) -**BEFORE:** Only BLUE coalition received tactical markers -**AFTER:** Both RED and BLUE receive separate tactical markers -- Each coalition sees enemy unit positions (when ≤10 units) -- Markers are coalition-specific and read-only -- Uses `TacticalMarkerID_BLUE` and `TacticalMarkerID_RED` for tracking - -### 2. **Victory Conditions** (Lines ~490-600) -**BEFORE:** Only checked for BLUE victory -**AFTER:** Both coalitions can win -- BLUE Victory: All zones captured → "BLUE_VICTORY" flag set -- RED Victory: All zones captured → "RED_VICTORY" flag set -- Each side gets appropriate celebration effects (smoke colors, flares) -- Proper victory/defeat messages for both sides - -### 3. **Zone Status Reports** (Lines ~710-740) -**BEFORE:** Only BLUE received status broadcasts -**AFTER:** Both coalitions receive status reports -- Each coalition sees their specific victory progress percentage -- Same zone ownership data, customized messaging per coalition - -### 4. **Victory Progress Monitoring** (Lines ~745-780) -**BEFORE:** Only warned BLUE when approaching victory -**AFTER:** Both sides get symmetric warnings -- BLUE approaching victory (80%+) → BLUE gets encouragement, RED gets warning -- RED approaching victory (80%+) → RED gets encouragement, BLUE gets warning - -### 5. **F10 Radio Menu Commands** (Lines ~840-900) -**BEFORE:** Only BLUE had F10 menu access -**AFTER:** Both coalitions have identical F10 menus -- "Get Zone Status Report" - Shows current zone ownership -- "Check Victory Progress" - Shows their specific progress percentage -- "Refresh Zone Colors" - Forces zone border redraw - -### 6. **Zone Color Refresh Messages** (Line ~835) -**BEFORE:** Only BLUE notified when colors refreshed -**AFTER:** Both coalitions receive confirmation message - -### 7. **Mission Definitions** (Lines 52-88) -**BEFORE:** Only BLUE mission defined -**AFTER:** Both coalitions have missions -- BLUE: "Capture the Airfields" (offensive mission) -- RED: "Defend the Motherland" (defensive mission) - ---- - -## 🎯 Features Now Available to BOTH Coalitions - -| Feature | BLUE | RED | -|---------|------|-----| -| Mission Objectives | ✅ | ✅ | -| Tactical Markers (enemy positions) | ✅ | ✅ | -| Zone Status Reports | ✅ | ✅ | -| Victory Progress Tracking | ✅ | ✅ | -| Victory Conditions | ✅ | ✅ | -| F10 Menu Commands | ✅ | ✅ | -| Zone Color Indicators | ✅ | ✅ | -| Capture/Attack/Guard Messages | ✅ | ✅ | - ---- - -## 🔧 Configuration - -Mission makers can now set up asymmetric scenarios by configuring the `ZONE_CONFIG` table: - -```lua -local ZONE_CONFIG = { - RED = { - "Kilpyavr", - "Severomorsk-1", - -- ... more zones - }, - - BLUE = { - "Banak", -- Example: BLUE starting zone - "Kirkenes" - }, - - NEUTRAL = { - "Contested Valley" -- Starts empty - } -} -``` - ---- - -## 🎮 Gameplay Impact - -### Balanced Competition -- Both sides can now win by capturing all zones -- Victory celebrations are coalition-specific (blue/red smoke & flares) -- Mission end triggers coalition-specific flags - -### Equal Information Access -- Both coalitions see enemy positions in contested zones -- Both receive periodic status updates -- Both have access to F10 menu commands - -### Symmetric Design -- All event handlers work equally for both sides -- Messages are dynamically generated based on zone ownership -- No hardcoded coalition bias anywhere in the code - ---- - -## 📝 Technical Notes - -### Global Variables Used -- `US_CC` - BLUE coalition command center -- `RU_CC` - RED coalition command center -- Both must be defined before loading this script - -### User Flags Set on Victory -- `BLUE_VICTORY` = 1 when BLUE wins -- `RED_VICTORY` = 1 when RED wins - -### Storage Structure -- `zoneCaptureObjects[]` - Array of zone capture objects -- `zoneNames[]` - Array of zone names -- `zoneMetadata{}` - Dictionary with coalition info -- All zones accessible via table iteration (no global zone variables) - ---- - -## 🚀 Migration from Old Script - -If migrating from `Moose_CaptureZones.lua`: - -1. **Update zone configuration** - Move zone names to `ZONE_CONFIG` table -2. **Remove manual zone creation** - The loop handles it now -3. **No code changes needed** for existing trigger zones in mission editor -4. **F10 menus now available** to RED players automatically - ---- - -## ✨ Benefits of Refactoring - -1. **Easy to configure** - Simple table instead of repetitive code -2. **Coalition agnostic** - Works equally for RED/BLUE/NEUTRAL -3. **Maintainable** - Zone logic centralized in loops -4. **Extensible** - Easy to add new features for both sides -5. **Balanced** - True dual-coalition gameplay - ---- - -*Last Updated: Analysis completed with full dual-coalition parity* diff --git a/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.4.miz b/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.4.miz new file mode 100644 index 0000000000000000000000000000000000000000..e44634f5f0405efd5a5f28019baa7dc0f71ce8db GIT binary patch literal 2343958 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
Xpi7zz6Q~58$w0} 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 z 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�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

*9fGoJV@|>ToBH6Z~ksFdmBh?x{!K;sg>zw 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 we=K^~ff)&~wMh77iD2T#EM;^JG49KSgr{@MA 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%0AW7(U96k84x&x674;7We#n5r*X*g#ROn4b;qEWW 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%0A1<<}@nL9JGCmACV|-NRrN@WISzVR|C~7YNjcLyv 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

+X*WCSeY_LiAUY33 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

Zm`92@;a}h={9D<{+e3=yws*SPehH3E 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
  • LS8{Xj{RtHh?>?gm?~_ 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 z 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

      CTlJIP)uNfiIuq_gE|i8f494dTQ+IgeDm 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

      a3r$~{Wg5H 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 DPe9;5 literal 0 HcmV?d00001 diff --git a/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.5.miz b/DCS_Kola/Operation_Polar_Shield/F99th-Operation_Polar_Shield_1.1.5.miz new file mode 100644 index 0000000000000000000000000000000000000000..86a980986cf0ee1b277e880349de364702ab2ab0 GIT binary patch literal 2344025 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%0DWi-y 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%0D96VM!#hU=T(o6X9irc|L!0 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%0D9_;=SvK?-ZO@7UoJA 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%0D1W^TlBf>AgTOs@Rvh56{= z_W^m}D30}Ijb3v{!5xM7#=+86#cU|;fv_aSX6AdxgjC<G(FPyD-^;<0PZ^ZJux&29 zX?R@H&%}JwutyhrPy$dL9Q_v5r%9J5{w9wb<zK_116P9}cOjxuVsSB2IBZRkHMUDT z$!zlHUVpD6M5j)gWYcwJSfEgj9YbHw0tonw3b!$8bw;YnoFhpK3IV-@Y@ErQ7a=wh zRJ>5>Nhufz46m*5N~wTA@`RSyQXqj07+XXJTqAnx2@evjKP4ZLcLA*^yiypPtcX36 z=axsw9E5d`ID>4n80Cc^T8*~LLK}rAP6cLF;IP1V+1gPUevyyD1fLkh3{!`=R>*Vm zA)KRg8$mnAh2l7?(v0;6?S_<yQ$zt5A~Pu^K_eK+cVeoCNwgRhj$gYV%A-U-(uc+y zs~f!4V!KmvtmFqBp*!l=LsXN}h-{U``-^ImmR+wNNqs{x2f`D+>D7j@9FiW`%6K0C zgc05oUq)c|SRM&(f5<{G^8A%8f;rTML`4OG`^7c+*~HV!$jFDpW@>>iNrmY&e)#K; zzbLPcU!XppF|cZ9g8bKVg?})ZP$)=w9N=yOw^ri^y;CXX6bR0*AH=C&V#8K7M-a@x zVLB39cA`k2*B{*SlSs++_KtUxr@LC<Un;HO=n~l)7BM=kdU15vIqY9B{?wJYDLSlr zv<k_1VC^2@OcIVjt)hUadK?m7l!8%@%T_cXg4ZK5F2&|L6zxtRp~^Z7RUk4Edw4P^ zq&X#co|QCd%No6RkNk<pWE<|CvJRP~n<o>oW^#PYDum>+By-5HwOi!9B&nMDEH{9P z1zZ{`wMzlp4o2WiBF4KxGy;Cop=SUCs(=M-AcIVIg$M~LCC`DR(IQr)tqt5Q6($`3 zFs(m{3q)q{_xI}&ERP@)!pYSh1;i0=29AzHR}11A?YA#z4D-blgqrTUDez`Q(Zu-H z6gpV8{^|<&y^GJ-53?(Zvk<i6ukd9i3_J-z#h#%Ug2Cs&zNa%}2mbRzfqzLK_?J~+ z{{!e6+brQZOyVwn)eM^wCl%H0F+nN>e7_4FRS;o4j8nJMSNb=uc(DuNo^-($ff)o~ zmIATM#1*ycT?5L6kPwTX0zL7h)D(cS$}TWDsNxc@hS;EQ@sWh#Y_Y475H*xgbyuR7 zGykLtd@xmBC=zoJgvf(mN%fH*fcxZ{_0sxNfjTDir5Mzg_Z>`mVR^VSt<-LBaDl;~ z+`_Iun7ja0u`wHvpY^~Hw+$|~y#1jKE_qteB<RW$337-RgjM2Tj$rx3opCQ^&Hmk= zu%|C+{E+u#lXDX1;>r_iCHxp5*#<MySZ_c)n2MQC=ES&ZzK9bqa$~Vsv3Q&cgjpj7 zZvdP(*{zGjAf%ONA7bp~hQbemCsZ&iC)XMgA0;XHAStrgGf`L45=tGygOMim_sMQv z(}hz6z8l_(1Yz6;Xw}dM(-|<MFN*@fo)2iVFo6*DpUN}vle0okR5T*M1%(I*tW9Ez zg0!R|Ew#Hy(((2LhHy@n`e={DGP=?PO^T&mcgX8f27`Y*W|(}Z1d<Z`&mGcz{1Fh< z$6uE~^YOm~qC$P1p}_^PonogUahtT9qd4WHwe#jtW*C0x>he^0^a#cT-v`LRgE(2> zFJdF{^5&yO3c~@o)E<fe{`%uZ2rh-z43~~yFcjN`G|9-vOIbR}(5N#{#6hETg~P)? zNW?CU1erUR5120;^9KFvTkZbg`#t7u@0HiRc;qt?#{p6c41UIm76br(i_xnT<P!Xb z6kixAet~+_Epz<Xv?C-*AUc7-+s4A`y}C~C;P8};MTSG!mOh;wANHN&R%cJAxnfSZ zgF+-h>3rJq`O0#AVj-mJ;DyNRCkUsw=fB7iLs-{q=a@IJ3d#cUEM&P5`|%wL;|wh! zN3`Q&d%=tmhy|Hl@E!-3m@7l>GI_;ePv8c=ppK_%;X>AO{URrZ$kW3xcW0=oIfgHY z*%3!H!#^4M)<B^K(_`Ey<9D&oYxiFGViM3NT8%Zlb9aI{FAiGp*Wm-QQZJka79rDw z)oGMsdQs$EN9w_1!)65qjQ(g5pm)Ddi4RBj+L^2Zr&faDz|VE(TSc`vgrx|IS3d$u z4(LRhlfsR5fh@w=U9Qn7Ok>$L@BGp9-u*PwS}-X}ZP7zZCrDg43vXc)S8CQQ-mJ3# zP2vQugu*ROKwNw8F404PkKJn=Sn)<JP)*)qqKx8A-UZ>!?Gp7{BlmVO1Dmz%&Eyu+ z_z~K*-yc_BHYm*S4H!Ga9SUb}lF}h2hFh;gx2%!Z$Q7MxJi|)+KuQv6r4tc3s*TYt zg^CyXZnzGB8&`*|G$C40(jP~q%6f$kxIE54Jk)uH-{!HGr#KE-%^C}kG}g6=HuU9` z6&l()S}Qb-3))&`Bd?Q9twP;aVJok~%e)G&@+!Q}s{knn;x)tu-dV|el9)dN)s`E3 zXCcjZ(T)mEN}#Q==6CUJO|N8ZZF)6rd($gz7OAwAs8ml@dRe5>t0I+N7pbIgJN!qG z9g<>1`vrH8rubQpj<(hASt+1JDjg@o*co_|93$91Cr<>&H;Oxh7EAIE&@6bmC7Wo9 zPXKJo77u8|D-{N!0z&Q+8?W%IT78E9oX!b^zNVjAO4@2^2iyb)LG|Q4gokdGDn{9X zH-i@!uCMXA_pZ9Nu74|?9l)2PShaq2V-r7_!)PCzoSyD=Z9{qIRyWsUK<L{=)94LT zV0ZfQPmPV!_&8h5jmDAfW5@atgeaJN#ac80?am}V=lX&1rF~G{c)5Q$swZdNI_$Q) zt^K}j+F<ptUf<h^^-EtNOGE7I%?vFgCeEIVZ}Y>$Sou-4`MPcS_Dg(gJ3G~8^L5Hs z$Y&TY@Mj>VsqWWzQVVudOZHMreo8CZ-Hi{ew}3PR{n*E!-P`JBBe~p=T4m?3YsdF1 zSlHL^sv9v-`*%+L^?K`7{PTGgKJUJceLk$#x8h?DLa@@92m3pn+xPK(IR(tvg)9%& z&l}0loAq7WH-Jz*POQw-pF<u+?`Xesd-&JP!uEOmjPA>>B;8x>Q7&vz1a&+`=YeCY zF36A&9pg_rzRvO95#$i9)_FX}w}$0g(`oIu+ED=<b_)pYYs32007C~j4#oJ`uzfUO z@R5%LF~2sfUz^si8wz;JJruov_p}hDZ@VXFr@d6+&I9&T3xp~%?5T^TB+BX%r{sr5 z{6jPTVI%%wGyY*K{^4c(!>jm**YOYa_4I{wj+DJPa`-(k!U2aSP_*q~I@j~#!()qf z{$cAW)y%FL6q+1sBAs<)1g13C32zQok1C-#13M$%o@jRx?|t#zeAUa!mbbeovOKm$ ziS6w!iW0AF@!kHWwiGrK5Y1Pm_?mb%i|?_wv8-)*0gIyKJ69IOU#I*%6|WeZ$Zs3$ zVEd4nxOaL2?#u7@4i4K#dp#$GU2F|m_&o+)z{oJqA|xT%pPrXlLyE}0J~G!-8VMHq z5pE1Gl^umNP9t2E?_P0i06~S38JG!uVT(18{*8qsAIrb^tU@0_v^$^unpHwvPSNhE zG`$4Cw9$^+acWrma;vjjsz~E7pG?(ZNx<mLLsK~R(Gwm^pcumJ8Sq%AdSeiFqiGs= z^bT&&3Jv|Cfi!jnXq}r)+dNt)xvtn5`VbE9VX5G>a_nPabCR-+Sbt6Ch?SOmXtR6i zgDJNb`JHq^Y&%3?S=K5ei87g?(Fjvm^3h-`6gG~O!y$hmoA6qBqlGflDGpAb1k)rb zt&XG~?B7UQRakpeK!}Jg(gqO~KR5$npNXM2SbY-<$|6>dqH@IO6Ed?pznroo(&&p@ z_xAc{r=%O<W0tZBr;B;Q{E|eq`T=73EDP|_t%L%eGbYza{`*0&_-NT*-y)R-FBn-R zQtPvWy3zwir%(u-g}FVstbpniP0L_)2t-HAnk)`DjTIIieE$X**>c7aw`UY+710`f zVU$4%HbL(%vI8<!)e)g85HS43K_hYB&{r6Bu*5%vs`>}>@q?4ysKiT;QoeW8_abl2 z53$Fl4wF4A)Db10i}i}xn%|wY9Y!nh`c(U*x1mR<Y*Oqc`awQ0697NRcc!%~%SstV zos1&O>c=YZ1C-V!K6xESqk`ykQKRNEZ_*FyQ5s)uRVES$Cdv{IR9h{6rlytr(y|uG zCu>F-K3uKE(epLCcsHkfFQ@#c>~eh8+A4_0t*uBraqTFa{?7fNJ#=kg)pOTcC?CDH zLVEgIXK6lwZB^7WIK6Nqtq|X-sU_lJY+YOPd7NLReQvEJp31UF-dBb08sYOJO^e4E zIs^?W4MyIdkmuWoZcCl8uSnWWI#!83o0LIK#&-R-l;O53%t_?s>-2v<-Fu81SOZK= zk5Br0PBpq1(Us%*CyzrHM}9#nxJ*pofHl~vTev6rrZ+jd6a|xi$hb3#NfL`E48n1i z8f!qHcJ7tGtKs-|iPB^}`YEfiP4`oBC7^H&5rbh+@2?DDTX)&nCJU%<ORygFg6)yx z8muEcKTb|gd#btRwvpXJPw2=l`o%$Tx7;O5p+!6At@{OhR6R@gGB`Z>*b^v&V`(Xq zq}8!HYZAuV$vN0K8Ew{KUW-nF7OQeUxdXSbMFrbL%u>My8W&Zlg~45AwkWCq_#iX@ z`NtvA=AyYoD}yi=Tpf+^E4(^OA)JL(T(*(@SQl#=v6sb~=8~>t1M}Kh0%Hm@s)ct( z=U|IBva+^?n@2qFQcZqoE!Rfpl9z2H+2`WzOul-BcDt)K+*`HbPb)T*ynFHEFPQpe zh?&OiFL6MMKLd)7#CRYq(M*3j6mO;;6~&uao*RX?#(0Mm@6vdoEYnOr9F}aOy=scL zw7hp#Z7g0w#hYtyq|CiY5%!($9lky2JMGp{`|OB(o>(t)c)Z^_?stDq)pJS3%%OCf zl_EIyHl-)PXdv7+F%9ETdNaz%7tbLG3vs~G2t7)92Y*2>hFf8_yNBV=qL3O?3;mGi zclbVez5a|K)En?45EdZ4lcU|kz3v51Pjzuml6W@daLJ&UoC8HEbP0hA#%OI$K;D5@ z76T}=U9A-AUeCy{Q5f;h{HqbWx4W3Cp4)a0_mB3B*65}vW-eQHTF0lYU0}Q6rNqtn zi`fngkE_u0ZK63wE}?E=A;EoK4jVoj06H#)e+QfE#blyd(?&qDrXd7)At2!91#cL5 zW5C43SWGbFyr9~O2;{gG72&^5sa5<*Kpq1U2wCYHqk%_@i^{s$Cl?oyH-lH77J_GV z1p!FNjYEwFG&-$r1WLSd%#EhFGWd|Vy{;(VLgn#2wBn2a6m2&7yfF|_rf;V7{#1p= zmf_?6mDyJ92Dy80nQgVQy4j~OUmTLzQd?JY{+5NdGaf(7c)m{$+wVZGpCU^jxd9qB zg+kACMbWTW2P7Tksc3wSC7s5`Yx>irlMi!-%Y{F<_(4X_fhYbUgva5Qj0hBNrm<76 z%MTpP5GtT^6c-cf3GA;3b9UNY)SX~q3*rr9$^>OmPr)eA8Ng+Eh|r?2eBp{k{PREv z_~YSXsGWQTW5hxg6Nu~&4KD`~6^ql`hUAV3;G~mg$d>pGoCf*v5z^5T?d@t25N*2t zuQc#&Yna}WB1P1yRIbn-L6C<E?g)ARxfBsgnBUQAk#>nAw2^#?$4=syEw!s?YuI_q zVwDE`uOvP=B^JBL)d&lW6N#4tR(R0}abzxyEHWR=h0uo)m>_U+TLnP~lG8(ShfoBf z;X#gM51A061UAtqHY$vv+fKdUB5y=7CYZ?Sc)j8R_b}8V9|9cOaw9@bnQERtkeo$o ze0H=ulF>O@u6jeD=7!k4jiQTBaFd9%ArMK!g2I4Ie3B!oH<kkxo2&Dq1D_e$vgWNJ zV7*ba!)Es4z7m~msiUzB+~neJiN$^GEDy+BTsb1R7MB8*dT8sf3WC|p1k+qE2u6p1 zR^|pBibzR?iT$=XdK}?c96dg9>Hvae2YQjCAUBmSCyOXDX%X_}l$-ioaKkeC65O8P zLWwrkcb;;n5R5g(qPQWKaIzX9s|0Z|4%mA&x_rsC`%Z>tVsW+}3(p9S8)?Fg7)Ogs zHd{a|C*W?b^pK!Z4f6zqJd_*U%yRNof8=Pfx>Tepy<ELHCeFLJM!~KZ5(|OD0fVo> z%x6bM@e;vNb@q<Wj5g9hEXy(|unfYC8|J9+#VTPN*^B5wKjb<QgMv2ZB0F0>k)16{ z5D>*S<E_#LK=_AY<s{#NDv31K!)V#V_`BNraF{hPA_DCgyZaB(cYTbn2w#MwfXxJz z!&4KIG&z0p<g45iijP{WuUDvp)I*ktISHqX)_U8q1*8;*P54D5x?8X3bO&<xR?|5J zH)=@Ep?5`Q_BwPzKv)j+eO8()w&UWUEe<am+dz2{uHmw=*E;jja+TskZDbGiU@`vW zArpylF^xru$Nw~zB(1lXx%<%EP)ptFzwN{}B3^2A`{YS_$6MJQAGO|t=uYoUe97JF zjhq=ZS`B9hUZ^AQUV`6-eU3gBT)EfT{orai?^`=g$D4uzbRI;V!Pg7*wP0_XdHd9A zw8;-|9BQ+|uNS?&(~I{_t)q$)$uH$OB_d$!yk5^eJrKmT`l`{=H%op}oz_!lhaKeL zyoesF!<WH!3xRLufQK-<O#?c8C<r_U-}==}1C8l#19aLcLExKtz+X0YnkIPqlG*{@ z$r##U%o%Toa0x%<(r+rbE?U{jbZ1{}<lKs+`FPUlwoaX@dYdRJ;(q>oItwnaI7Vy9 zS)L=5(MyI+HYv|8Yq-V5&B3F{?m*s0ew6$!eZY;pYvC2JsV$V^fuq>q))=(|Wra>} zJ_2^CuV20*KG~ZYec<PVy-vR`3$v+Tz1GOtg1z%DCL#kCb^jEcCF(CDVj(}oyU@bx zW)ceMy`Iy1-@l$&5CA`4G@8xz=9Y=L-+TY-Is1PGy4>nUv$0-n)>F_xuTq3!V6V-* zo8y-%<^%&41M-C#2*E}1ev(+wEQ$s7qk1z!0sPB>!X){KQ2}5=_30^NDxeqCKdh_y z-*4Fi(y}H}#Jo~Di+f<eh2S|NII+HnP+0ACAaH6)`l2Ea9df|tr_e%i=uL?8n;HXH zE=oi<TQdw!2)c<SDQ6>}avpU}4jBK|FZ9@BBZWRRa{0a980=hbF4_j0#~<_iOWm+W zE(JWQ1ED>l25J@I-Lp9!8!RByx<FZUA-dbhWirKV5B8F?#g7FRIIZJ6CKMII<~svF z6zH%p-v*<|BX7Odne+Bj@MQ>YH^vI+-y>46>>}jd2EEe*r_rmwb~@l45$~VA73e#G z;q{GNntts<a6n)mU&aV|^nIm{bGgiFqYjcfkQ(8oq4$j+s}N%HXtj=Wn8eegU#jby zAo;pPH=>A0X#;>N>znzV%LA_Q1wi#$ttIK*tK9SP)|;YO6G7|CL|+S?{a3lH^U>*f z52D?7TL!5kX6u4JU!2~!kPqr}4$t)}pURxVJe>E75eln1^(}*6=g;|l<h(X_f-8&| zwy|y!%uD*bv7W)yWfPHCxu=*Ipyta>=a;i;qnTihqLNJPs%LFw9v%CohaG_9E(C-c znWQXURA3N^wa+`)(8tB*%Zo;=U;b90LwTm2XosrT>R`yl8ODO2h)mYS4_Gswp)m5d zm|`TYVAUJ2ng6ufc;&Pqvma>tO<HIcJYWDhyVeax_?l?#8jO|p^#NVy32U|}Brckp z#1`KuNYDhb)OM$+lj{lRK}1%Q`+iA#PycO*|2A{DZvm4yZ<$N3T!hNL%*8VST82{B zCp)8}i>uJRkU^kJ1v_mN>a^EQ>FyFjyA099>SBhEprXAt3-t<)wefA$x<*+%*g;`C ztaY&{%FMpZy)#AsUAQEDqkFT!N$CyksyMnn*Dua!HgoTY*YBE5=Oi>JGyLhiZo&7_ zWMv++nR_*0A}vRz)iQWYGu77W1IRh+jdzWP(_cUa<IudB8ojOP`vdyVV?J7t&_}Jn zdZ%ey1pHiJ2nMno{8W8uqd(0Wr0H^u|JEb=1NsYSmquzx=EMI0v}Lx99JLVwzpxP- zE;zpEojzc#^Mq^ENe?obK`-&X#pfatqGqoAhSo57(DlzL9Yv>{_b(y(1-@hK4~udg zhzG6ncj`Jy6A5jIOKC$~N*hE?>AxG|zneLi6!nvFMVZ2fc=vVDeO+{4&$|<kTd)+p z74F21+&htGVntH-?$#iOjjUc81$yC(nk?%}^b{7m`8INIKI)3@y_BBjg?rj4(9>!A zG||I!FipML;(cru=%Wqx{E1EmkhY|7FIxqAu^eITbN)?@wPR#i;BE3i8l%g*umu!} zq-YmwNbI>B32M6-w&vZ_a@d5gFH&$x^h)0^I;THvZS2<zB39lTPV^6^Cu8LQPa$rP zrDsumLB$0--YC>@5);gVTvXudnM@n}{qAf>BuL33mJLBHbH(-uF5@asU6j0w6ye$k z<U6n+YMesCV}obR>Zp<5Q3B1dmwNAY9fG#ZN(Cp>EYMG4i?y%z*+kn5RqdBG#;021 zwmubEdh#ypO>tpwiVJ%){}m}gFMnlj=3bc+whbv{*=SNK*jb}kX9>iR1&9|;!M>Ws z`r2#vY(3%U)T1BoYNJ?JhwZklE4V-l_q17XQm3cZNu8b+?`o@9SFO%lTUYqmDQ1$i znX4O9c#$~Bv6B3YTQo4q_0HM5ynDNuXNhxW=PdCRSO-1lt#fpYuWoqp)eDlgW+T7L zG&VEpw%2uD_v){T_u9<wwcXC@5lUb8HeN0<(T)5rlUuKSO}mle*K1Q;uTAk5Y35N@ z?4!^%iwFi;&;Y@p2_hF_`;#YV(b)n6H+l2pml*EnJ*=ty+l4>GsK|B{yLh?Txp*Ip zAgN>e>oeYMy+F5+d;)SaWA15FqBjLMS0}92fgcEG#k*`2=@K+GJ-k`_MvuMYF3j?M z@xGb``Z8ZL-CgLRa0dmXKMf1g>Yp>Zin9bP(AgCH;ifR}z-fLfFpNwLCL|Ta5o=4- zHO-R28FxLwza|$Y52*;u+Zm+qfVuVejvV7cq+;-j+dO@>*)}=NoXuz~(=TB46r}yb zYAcRpqW_Kcovn^DFOJ!HZydA#_6QO-^uWJ$6gyT%|GUc^t-QC6Ie;A>lFehXAba;) z8wXo^OZC3F)btzHJ>Ph@WpF|dJ%7}v<pAp6mpFlSaq{Zo<kg!Mweq|M`6m(mN{e15 z;y~hP<BtzW!!${Kb2y!!s;_Z=z!;=lxLf%;$_R$dYLrXesaN22oE%f)oeWWyCf7#+ z5dG?5>X7qDiw46oWUVw`KARYha@w~!-C+8<k>+~yp@iN=@$LCgf+(UGe3vcMN@r|J zSu$e8pnC!rgR8+9R~HHKhf)YiS?_|9bHqw@@DmE1Ml~?fKpbmA%-5VZECLalkmJ2y z-d)Hrx3dd!T}qopX0_Y_i}0zjA?Gh-$~s!-BFmqU-XnKxTCBJa9~?+*G4L>(w(!)1 zSg}_grQaeKA`E~)j$LXQAhrFGhiNQA_a3s0O;yOW#pD)(FQCyW0YV!}@-Cw2!uDNo zFTtj%VJ@sb^Tkd5Mw9|-Pr!$t1|{90)tE4T_a{GCgq&A!D9@**N3g=ZxC}n0_enKW zX&RhMurGiUlMW_PAr(?8Cgxya8o;Xy=sO)!tT+`4>?1mAX8=mnNQ32vL6JEc)r!Ll z(LlE#RIZ!_JMeR+ov4roiO$BwrGK3c%Tgs9TFzXpmC_*2J-B(M!7v?MvPLQ_I{g<Y zP0RpitCRyVXTtVcA3v(B+`i^!iN1^~MSM7?<nl78$Jj+@M@n%j(yB%Y%8{PXrHMWS zXg*AlEVPK{rUOFUA%z2>gS!kmL5AoWc?b3pLx?Ck2q=~)1X*8TD$W2$OVKrFm~*-J z?i7U)GI%uk14<u35jP!!O(PW0JuA9Bx`)8&GFtvmIG!&3uVM&FPw*e6JBb(?u2!wL zoKsL_yK~Nes52aVZK!1+_6@`*K4cMgDB1`o^=4mA%5F?yTo$30&Kv1=FuU|IdIu(6 zi*i&bkS$<X=L_O&Ug{uS`8@|(O4_F-{#jwDOq+X@Y17#k!ADclM?KCs5XuApahxHF zHm~J51>xZ}hEKtJTO{2aBW7utLTZp91A?Z#ApjA_NPz-c^F9MuD{+t};6wpkIG<$& z4<(g~q?(Kc9IWR(B%+|avkaG;V|vjN**O6R#Ch2lu-LB1k;dU_do5~lA(CcpCzFG! z)EW?thK8woAai&6z=$W}W#G8&6P4|Nv#F}!KA6zUWz@O|Nm42Bep`eBigI^f1v8PT z0fX;T6k5y)z~iE%s*r4sNDgFK#>huTx>T+<4MGkMQ^out+#vz>Cf@kItRlhgeRjw2 zw0o1WJDke5fr;+07$uo_P9qo;TGwMhdS-%#TvS-z8EwWy8zm()29iTbi8(5d42Q)q zVq-?%ZdwdpuF<`4Ouwela0-Kyt{PPOd_*e5ujA|Odc~b@H!7~X-K;?Lgzb$Ahfdgr z7c9>fZD$*DwtNOccrA^i=v5UFkjBCLyaL`j^anhtD-cXXWn55EvT%}{B0@vRqrH+b zh*QUWp-{Xckr#ewh*&X^s?3xd)2NT21R)Ag5yC=Fk8n_fEYg^Ua7_nRrprdu7wIot z%$rMB10bkGE_v_5g%j%pP8R1S)}j%}emTx_Em+L^Kq}U(Pgu-oR~s!{XRq5m>ArE= zlmq$7rzZmU0aL?_A<qCGjlm;!mZM&09>x#mzrBg#>BZ7e9&!vCC8wbl8t1^Y#GHj* z!>McE1t|C`q!gGgJEdL2+OClpB`vH@EdC6s3uEJn5tH?_slui;D8J=r_+MkYYIFo^ zpCRW^O3@d5?`g2$9)+4{q>Ko3K*EVN>Y*I(vl;b?<*F9|QE|Sg&-c!^*m!BZc0J&@ zNu)q%at)LKB@KO~c*H-Y91XFk<rqv%1UmJGeI}UO+JW2U5;}J@6Od^cLx49a$H6rZ z+Mo2TGLWYpM}N8yA>*t!6G(52282JA*Z|+a+9FD?mCH7a$^nSdrhJHqCIVN!8>8^v z8$eVG%00g_uRzVMoI(Wsx8xFbV_bqZ=WVA2NtobII!o|qfap74Kf~Q~4_D8Z?dG={ zlDA|ca+lv5R6h*fQ24u=+`tn41-8Vvqr5ide<9vN?55%@jOF;(WG}>&3Njb*8Gla} zBb~kAG21EVluuNgt@y8cd;Ye!5pTtRz3T|&2&h5`>A5MBOK`v=UNtziMuNK;$XY-Y z9a36GQD?B2u}A|2H<tmNmH43m!7nD!Qt9Z{$R$QF)*8Q!;NrU|^eO@)<_ZQ9=m<_( z-xzB0KXe}13>=2^Nlb+1!35hj4Xu^<2k<c@g~-E-13sBhWgbgK&ccb|gNpjeTO(@A zNvmZj+xny(v+iFTWKRBM!7_C^1}u4sZd4I<%*RA_bpHqzf$Kqv%7uz@Hg!XhxaDf( za;`xYC~kqw#Tfq+-5FyKZv+{jO^GXn$i;~MEC68qON_ND>&h&4a5-NEB1s!p_3=Ff z6dI*^C|$xpcQ`(ok>-ocAx}VYymHRsK1c3HMY>$W94*mWl^wx;M{^OGK<_9xEZtf$ zSrT?bcLz+WEyCDAW3P5y)1yZmPUyLZic`uzkFWX7a{N3PbuVx(fB-m&V;u>^0T7FY zbyHuL2x6sYr2+gqzA9<Iv?ry*Ltg4Ji7mh=8x{d3Kd&vo#XYRy$9{n9pjd?{W<SVY z5vfADEqrklC^ILeIN~ftbBZ8CNGBOXg@xv2Oji+cy!7OXZWC|F2thPG`I#v*eHXGT zMk!MJiFhdS#~F3jrjtOICKn=FUQ|RW9R)Nk09vArtqd7Fb$Ul_s9ca+NIyHryt=X0 ziH5v}fML9DW`RCTjX2Y6PA>leK_%CsPRmKKNRE7r2kwnwHx}2|%nnLw#X@#b38OMn zZ2N0|*g&{;Qr2?<scVWCuA<2UV~TOF-0KMmqRoC0;d#j7a==#n1+U5@{|c^3=P!~= ziT}ge0`VshH&x8AjOT`!g>vGui7gkt613IY6_19sXb9q|QBlZVwt>TW5Uf9M8z;CX zWclU^*8iD^rT_J#&Mqb{9_t75T9T&@pPxjJ!};RsioeE)2vh+KoPlxF^_oWZD*Ax5 za}4l5!IEDE5c21!_0}oXYFevWtt8O~3#<@;t_ZpaI0c4;9;h0JB0A&T2eo`H#H$8U zKS`Crnk3k37jR6?ZLpAVtn;D%5oSQY8XqHu3*I75lEkAAB=?LwjgLGUYysXBVlnY@ zhZ~S{oym7RULXicytnSbd{Mkf){rTYoLbotY#=|^-~bW%y~OkfU<>9Cz(E;vD&U=m z;j^Y}EhFA=7>%FP>7tqqRCg4*bso$Cg@IF0&mg2MuA{b_uU~Pa0(lvF6a-$e2c)Tk zVUa}wgxVL(qsf>=IuF4|0F|cRF)XVo_!m_}{q4ykA*M!q-g<J!a5+Ubce?P@rHsMy zLXqrQTv7qvm^3((u>mS6Vt>}8>Jq0oq|C9HZ!a7Nx3Jg5tW@iggOXiQqqj4>e}J%q z4SAPiL{uPUxjz?y2u{e=gEEjhJIJ6>{OIEor`I`ow+DY!>uP#B0}`9xn#|AsMKB@& zx>_&uzH@C0ZV}FiDbwF^C=kz5uxb&PDK;}gJLVoGqb68NdS(xaf2NcYv{Z5?Hd%dg zO39OiPc(${JJVD^EUjM_rc^pv@~aA^i{23HxM6T@Vh;9s#2Lv8RtXTk3TYsB1?NZv z`xf{^7(>E%KCOhE+a_Agq|m~0#j0`BmU<C_h99U0xRk2qHHC%{YJi3Wg@&RtB>d$s zL_J~*h157<4S7}R<z@+VnQ@J2@WcdS@|Qx>igR|Hq+A?(;N<3%))L0>$-<1q`?Z}V zJ=XOct`9hx5Vemahhp<&UqiYX<L&h0VQ?<-wTPo20_SC`NeL1Cp;Mb^aAH`@U_i|5 z#as{noWW?ATP8ZOF$c|c{nTqGT?}9`5!-pC5W|iZYZ499q(Yo1G>!34w<_Z)-6nGk zdCw_P)a)sOxa2O-NC&#WT@xY!$R#wVSu)?wu<+52xPtkkk~jE_#`VZIc<dHU^pU(p z%Tj_w^6aH=P;oW7bDAztI+-biugI+XFgZA;XQu4HAc+q;+7XqCf%zY{lZuCcmgI|Z z5SJp609AIYqa|{~C&&H6<Fk{q9=K8*zJ0sbb@tDW+nBs8660J&>4uTVp_dIk=UKL= zaV(l<j10q(^0Ff>z!E8wVnQ>;_Yi~0qNuxowvD;ame9(P37ZtiabVj^k8H>kKr&pT zW8k?%!9yWR5CCQ@4Otf_XbPpWhal@xY$bT2V<C)saAe3o@-N^tlY*!;IFipoeGA^g z@DpRA!ml`j{myBvB%TtDU{RHr=TAlnuDo6p<Hbf%<|w;%Aw@-?f0oHN;??DMZ1Bw# zJ&9u@I*(*XYCtSTGNexx)|4PpI$9G0l-Vq<7&@D9j&><I5sDiHHo?~b?)*`2`j>=e zD%MTW&0AKo6O94H1CK4?vCDX%t)<_#OzX5p0;_sCLrO#}gNB*WZ;%rG$==3PRwbb6 z*sT4L0WU6kT2>ylnlwtIcWRX7{APkSR-&cS<yV>jD>^vL8Ndao`aww+elS4%HW%R8 z@nL_-`!C~$B0PNf1*L=e{eJrWev<dozu67-=y#NuB70Y;$whr9XIAufLy*NUwTE78 z>T;9aE_<h~a<ApzZL8gHsdwC?Tz;#oW4`wV$k<-={xfVHq&h@o9=-(o0M6>>N;AB( zgMBcXdk_DM7uLc4i~SC$bRqB~5b%3C2RD!tcyb-xm*<B^M-EyCoS$^x8Nz(b2g_a5 zg6nIc8Nok82(S)=#g9U`FEkTRpFXvU<k5C0*rB#9AyQyS_`6gQW_tCFjrB_D+`VVP zCD<OCf_gdMgm6KFrF<??tDy4IvaEq@4pHWU9Vr>jT4Mv&WC7}&GRx+HRt+6}81fZL zc~{UBP+R;kRSl6j=N&TQleT<~_2p-}qpV4BXrv=an{H!0635xJ3(1j6-a=(U#j^lO z;~<<qs)*56hbj8+T*gDW3>qPCtE8TZPo$ZS7J~)(yb5@+$-hepTSy`DFY)F&e=Iq* zS^~V)sxiv_oMLBb$DcJh`wA-b)&-)N*n<dwC(vf%mkYH)|CbLnF3@cWnJN;`sXw>{ z8I=+$rIfLRN+5%<m!4}@Q+sa(qc7#Pr_`2@I>JF95QjJ-wd4j#&ka>91hz8!lQ{r+ zy5}CmFoDY^etaz*(@Gia){@6_W%r!iBPumFH~uu;no)yda8RTt!j?(?Mk(EdwhOBn zM(YNfVy?s2Z|TJ~O@HQ3=2pc+?9^D+;5*VO%qxpalAu>{FC}f1@{NGiq$pc)#B8am zkSSphg;SL9aeg`!5VBZVSKz-$u`!^;z-YjPCXe?B3;Z6zKn+mr*7MMa7N)_L4(tFe zEFgq5y&}|V$UC9>Togfg`*5CAtLX#V_-M0E)|6^wvOgw^DpJb36tIB}CDk!NgRJLJ zc;ka*2=fCFCU>HOMif-I8ORnNB@D7!m4{l;r^MX&8OSN$AiPbF^|%~4gKbRYk|*=R zEit(GDmFekf7#A>p&^ZvOGUkp-Px@-vsYC1rURE~3-GX?yctA_nkuEHXz!3_>+@VH zJq0oWs#qao>R$p(+J_s|yiG_AminZ81nU3`)Lcse`$(3z8pv1Q3Qse0FUy7BQTipi z>$w@%XliNUi*)EMbCnA84z<e^`FAw60;eI2-hg?d#oam&64$HLtcH;iHKf*&0`>A< z8Cg}>tQw95TYSMgKt_$B(O@r?gekbP|KV%?IpuPkqE82<s(wymAT=!!A&k5LR1s{6 zD42tJ+gn%X_xt{z?7sgMpCwB;BmWB5evA_P&xg)G&}Tu|p!<}v6mM^L1pNK*o=wmr zq#ov7ju>Pksvc9ZTZtBmOm4`K5YHi~=E3(7FBsv~7rDE*pP(CJ%yFRvjUdlbMJTlA zJ%Q{>Xe=9rT$yp2wV1N&1Fi;$QbMo`;f^EszU4qwn*>Xk7&H~M*qc5drrJ%kwHa&j zt>0<Kzw2A!Ux;`R#Kjb%`*;YEWE2>oA`NNnvfqdV=+Ap4)w4eSjnbu`|FU%k*TVi{ zB%X`e3$rUQ(<#;i2$wV-3bM2}KsA*+nulw`+{2Y_Wej1pU5cy7PMb*WNQywcrO6MB zk?S1AuR#<3DNn>BoQb=Cr#E!-U*Zkj{QV96`y2XS>J6Q|k21<vct@Le(%m$1BSo)h zQHY1sc0u_Q&5tS`-$KUlK(aD}7>CO}t<xX6sTb4gSJUs$w<0%AlB}-w`ikxVN!TKv z4J=2}MOOB$Lykqmkr#~kDx}0hE@Fbg10=4!P`-Y2EQAl7h_r&zAqc)Wm`9wIt3i~p zYLsm~w;JPfm2NN0PK)C89$jdH=c4hk97h6=V=fQzZ~{>^Kl@{Ue%}xF5VRKU;X-!) z$Wb21Z$??8jNE$;R>pQADPbT$Og5#OyvEF(who^fmB@Dwu=p5`JBX&7Pk!j*OPSXU z1YYpaC$~Qe_XFWQ?~xAp^XEV!2>Y?358DLECjoJ;z!So~bMK8lMz~l^6nFtJmgdFS z{k*GoDn{rhJQ`YExoX-d-}4}~#jlhopl)*cl~z@Um=ZceXCG{#FNlFiv%wLx4I{Oh z5iqDx8V96B#Lnh41Ooc=HpSDP-AfxW?uLyU(noIiZx<dqw_0}WS?<%KB>~pnanibS zB4gnSY7hl433xu%NV?KVo?r;a1Km{A4+VL)A81R|mPbCl2~1lF%Zwq@Hhql<4>tOi z?mqP$F(`9b)aqNtQ$D&)jwnu#2xf$1k>iuhkkpFeWf-C}7M|(Ldut>gbDw{sU5<ss z*@tNmyYki1!UIw0hf;|)(D_zgcGJ=}B(GbJ{-pPtF4Kzkhy<N3ohD50u9+f5tRHeS zV?4MrP!2p;pv#1GVmNFIFc2R?{8H0T27{7S!irft8k~rH2CM)*l5qt{=*tl?NZu>i zlwWjLzjJzfC=T|D;%x|NjV((BS&GG^##Duhr8O8Ey=|_8&70se**lJ;Cmetdf)y;r zpFG{4j&QtAYdF(Q+_HKSW@eB%C9A7B#Qw2%$Gu(ZCT7-{Z+f2>9CPM^(~4Ad!`x+J z#;$BI_NxVpeGH2+4qk&9Beu2B8W7POSbB<S^I;B|SZ9E<YhppmhHIkM{yWZ;PYE&T zB3TU2SB&UkQE|hpkbdFv(fq>Y0{Q)>5o}p=uu=$HB-e*S?Mga^ojs$EYw^oV7y~jQ z)voZN4&fx9h0Y(J`K5}6MKugaUXj2}OU3A*_vWC)9<0e_RrR&Vj>1YW0xYNjZ_o0? z`BX;Qd>~aOII1C~RJcS*7iJ`yC1Ru!&#5AkLPZ%Sb?2S~rJnkufG*8su+(Do-w4&Y zH2LSXvBe`TcqgQHU-U{y9YWq+A>xCYmxV;2i<=?)GW||0{~3wpzcTHC|48JDDA0FF z$g#8Mv|HW1{j($Zd318_9PD-XoTXr_mXO2gL(ap{K^%q1N^n3q$sWdyX|+TG-cZZ< zg4FL0>tU6U6*?GGLiqI`LsF}d8j09g+z?|~ipUcb(Sj4Eaup?B)1o9nv<smC#n_hA z7X?WXaV05OG8Txgs7O*3e94ip4iU4&I^YsUh3fA)Z?wS6m!5)0g1>=38;rb2v^WUB z?gQR!9E=0is%XR|05t%VoQ6=aAj666hTfG6YbahP?va}8m;-iFT+|!RloJh`R^jl9 zG-6}u6n#*KfyWv+^vv;Rq%K25rBpxST8ifV38IH<6F=sVi6stm9ta@|4XV}ReeHV? z%9;Zcew9Z^OGGE#0uEZ|?;>Q-GsX>sE5fGsjq$?BXh(1rH23b7^N5Pnfec?I(XB-2 zu`S{mij{+YjO>6(u#_Iu01Iz#cwTa1<m|R#qOFm~IlJ+cvSb>qPa%_ScB8?ao9MHB z-s&37^xreekg4j*gqdcNKFbEG{NGu7*j!={jU@AO{E4jeSv$Frx-@38_c(A=70iMW zF;}Hr7@>g>@~hZaq-0s>0U1Z*@Qhv7GsqWc%X!}8jqz)N#+bQ1*%-b$yGMW)Ae}FO zG_kzw`FL~O>a{w($3q*2cX4!l(bi@odQo(;-dJz1h&!SK+Ruy5=}%i5`}Jf`y#Fr> zkp=;=jY*Rx!wYaOnkNB@Qin?O_d&EuZo?DH9$>cfN85mu#P@PK*q1uJPSzGQQx_~H z<-Fd7%2ZzfNUsY(>aP+oQfae&$@RSSxoH3HY$tok8%r$tyTzr`IEAF_2Cc*{3em~* zg+{>j-s^gd$RXsSt3q|Hs{$k_@=1<Xh7&a>)`ly|)!8z>#?~i_)&5lt*_MI4V)kh! zAWvVex;BF%9qp!cw96d{9xB;SV~Kvu)aJ?lRA%$yAkA#$DIh6Xd2yI}0`eq8m4AGR zK{jlQD^iM^V9dWF1T_<b%Q_iH7YIiq`|NHMIJ?n=E?#bSF5U;Do8Xf^8SLfl!XJ*% z0H7GZljK}gFVkxMwG&qBKqQC>HM#-pnLGQKfT7ndrNihQcVVpW6RqKq&;u72#Ju#z z-CbxKZyIA??G%J+7AC9*KUH5okgP`BGQhgfmR|1zIgH+E=6*CX_Jct5`dx-$02W^h zFz7hd_`*ElEB?t73A5`?Awsl?uuq=oH~W((+Dbs4Q$_w~)b!#ibT3BHDySW0!0D(- z?1mj2#Ju)F8iNw70hk4n%p?iA&!wddK$mblhF~@7UCii0O27~p{p1P%Z?t-%JX*ge zX1aHJ1)sa5W&Qe1|JXsF2mY8$Bjy|)_xHNTts@l=s^{1;hiU)w&-;%J9Uy7|*biY2 z*_&V({?iYcMNZQhr(gpaI%Yr+0n&#a<~LxW{&gZT&RPIC?0xb^hFYZ4`s>Bf-g~&o z;YhD5(I-{Z1-J4G*rzGO0afoW8W?LXn(MvUEP#ZaU}=QmSwTJ|Qm&xjh=&K_Ac)AK zM9K<aIU&A<_zSV%Ydn=Xn%-`!QjFh&iJ{j5GR-QHBD)l~n~;tEHYu5rnr^-O3g@g* z27o~_d=b|4x7WqWTB93@9_T+16#@d!WLWCh8q{E2a5xaOW*dHr-K4RJet(2`L|D_9 zL}cFqLg@HnNZd$Wj}NlO$5J|!%OHTDqDdf7FEGr!trIML!19m!kQ335qT!&G#K*Mh zCA+pqcUIt_xKPImAA@pM^gn5a1&x%T+dO_OiYFBZ)~djM)yfJ{QA9~SnnO;*cQn1i zZNMgFG<tc?qkL}POo1^}+qPzWd@vX^R94BtMMw0R(kWp?>WTi-9_o^zO<N2u?##sp z1`_Hq2-|_7rXT!|(a2r?P|i6xvBUF5s6Q5yDVnwr*m5CbauM8`4S6|GaP)aVMyuLq z@(uyYOG`t)P)UO^sI1O*V73Y++h)zRrZzCyG1aV1$Ye(mRM9(^NzY1O8VTzt!eGdj zj2c;Siz@-~c>X^>r=T@d75{$Y&<Dn8jRIr<%W0gb|2$DkGi#0;j)^-&B=XV^kocs` zQ=_A%Dgy?o7#%V`n6n1}SwN=05xk;EJ)mNPpQ42x5G*l}bM~cq%%PkY8A@Uxhy#x~ zio=ygv5Sao8wMbY9Eq}Mq{=buS!%ekA@61mITxpp3HOSQohm=#*!xS3ohnU~>KA1- ze-d8}ov@yYp{!|jji&K0TI4HvmdzT;VUWYK8izTOs4R6TQI*7}jKPR1DI2<kspzp5 z+sjJJ6nRf7<T0@kj5}tYV(*LU>aGL$;f)`XJ1lw)L?4a3U<ngeF)XT@X3R}vwyw-7 zDt(J0AO06y4?K9<0{c<68H^-N4@Gi1vogR!Yb*Q@Fa+z`it%u1kUNX(bI6hCMtRq` z5bc)GMp>mpvpcn4n;2%IrtX8T*B4iBiN%(j5&Dl9D)L%lp1oaC((<7sJUB|o$*`5L zQ3Kv_A4&o&)scNv;(*wXGYt+@Aj^Cz|C-c=Mb+-P8);*OUP-kt8TCI~>VHmjj_9I| zpRAhWb>?n(n;f6v8OW{4#G2ftw)G%&e42%Apd)b=Yym3{q2*UZ$nDZu>zC@r*6UIQ z$F$9e%;>!>(A>1^2Jcg_Rsb~!sP{XEy?$ae1L*rYAp0D`g<4yDsA1xU<J~_cTPTAb zdBpx?ORK{t<E=m)h8@uo3TQaIpR|TU5k9wEo5W-LqR|JQ`rzscoQYB`t3nYXxOI4P zb+u;nTs9N>Xs6Xe-n2-Rp70sb-FhOrU{Bc*<peYXHV(m`x*bgK*KDSQ9RvzlJR;!w zBS12wCQ*32Zc7BT6z}qpfTQ813EOlOVZhp<C4^6wf7Z)CC(Fl>9*(OpK~L6*4zT&w zkmbU1hpND7OI8qw&M=e}oyH_Z=&Y_EN@$sde_WGOeCl{;47zNIMEpqhi(yK-ZEH5x z543bJ|ESy4u$zgLt*Wt;Xq~v?V|Qx$Wxs#2v&?;Oz0A!^4fa_OKicRL#JZV-;naX) zY=yc$0!|LNvwIf`u}ZgKbpm;5K&}m@ly$Q%9&4_Jwkc>5%r>`CHM*1dmXlYdn1l|; zJSawyc}9#P6ZtFVbSIQK*Lv}q$6{ToDC9C0IU2dg!oo%^c`&L~I}8<e7QKITfI6a> zgULj|G!$GK@BDN_*X6MD0Qh8l2ZXE=N}}X`t9zP;h-Mk0UoQ5MsUXG0SYKZaEh+I@ zE!MgydXjdo0Cu7VEgLs;Ff$9Qmch(Nz{@9(g*oQNgF!FayV|kl)CG0&t-F&&oBTA) z*jybms`Yf#h(;|UPsc}Ko{S#g$^g!?7o*v$lDmiF(?1oRdrWldIIrrj(ojhiE{jKv zObUbIldU+eB=Ko89i4b!`G|Bjac5(6uK68{Ose$c(Mi(&0<?>}-ZV%hOmBM~r@IJO z!l%tVd|J=Pr$!EWie~Ve5UG5g?7ujMwZ`MX*<FmMV2lgh!y2X_TF-;~@7?Jth}O&_ zT-73&wwZ%ziJ3ee!WHGR{@t*x*uD5fVkNjUlAYAooM+y}oeRP@s(mpcC(|^f%W1MS zBIZ%N#>4P1W4OO2^?ULy%8XQK&uO3ndH9c|U$7FylP7em|GQz%MlK2a_d%T}zZveV zDsiAHlu3OthUXCY8eZN{LH^m6=8l-+JRx3z-WMU}^P3^+O)<#CT1GZ|z!vGLIKUN^ zj>n)wxQ1kv?4e15aB#$=urw5}4}y2yQ+WL0kjywSEjW(;&00b`u#D)EY-1ou;zx^? zK`1IybfeU=u1lbWB@(ww%F*M|I1`ECMc7kjH(*1?anNhF?J!lKMo2YHacY{aez4a6 zNHq&q{YxV8eM$fyh-8M*+d8b7?*}5`B0{ZL-PL>G_ev4lIMUr6n%O=BHxmy+wGJ^s z_Z0?emnjS|%&dzJtw8u_&|v1fR%{AjKM<QkxlCEkmfAPdS)Vo|^5$k|=8?^ePXtR8 z*dL{POg6TseU$M#+QqRwlGEF=J!+8Bvopqt#aDR_Dmnn+#r`cdXk2!R#HCj~ZXuAs ze1FpNXN+{^xZc|yqRyWj1=m1h{XxhvehRcLg!7IS>3;@vM)!6kAcIj5q8oLvxF*%= z)y#+4Ly+5%91#&qM0`g1r=?^-=;dPo^SDBcX^0dK7gonc4%3yB`II6g9*|wU3XNyO zHF+T8i9z%7Wk*pLj}AMB{R_;8yuF>8Gh8Xhv~eYa{T0g|YVF$kwW>$8$j=s<+N)*0 zsPFo%Cd_@?KQB4uB>qXnP~*-aLCc@8V~qO=Ck%(~h)_F6-qk!hJhskk$0wbDCF5#m z-OCw4EOYO!?Zox_W2_~9&K=^CoQ}1zX1XBEdNY$*$WADxPHSFooB+MU*m=Bn&G=44 zF|S0TN2gS8l(Hg=?%u<Dz#kC5-gc*W2TJm7UvhH_r6IR3St_nN3DGz<g<_jiD1c4e zK!!u**ywCZi-(53NnsG=+awwYy<#W@_0qv`*6jv#8V8N90}Aj9URdO@Vi}zB)6xtF z*m7e@?$u6bTF9)5xJo#Dl%PFpIJXeO#SJ-|(B%xTc1W?cm=lWvaah2~5;)qK^Q`Fv z&k2_t>#AGUMxs@mcTH0F$auDmDH>u?pnQyE1B*wSS4wf%KsHZ44|Pk;HG28*TQGji zuv?F;&tup{L4QP0s%K$|-;m`r<6TZ2%~%C43AnBt?;E|(Eb-ZG$CE?AUVzOP*maeY zMzT?xUGN(ePgtW7U|~7kepWQzdd&V{scs-}dVa6zARwHyC_0>A!diD?hOAPi+$GTj zR+ctIc#y~mn4(qQkP|BUE1GcOK>6cZ+K&AII|i}aoRsoZ_`k&9uUFDQl<o7157wBT zQCKbj;g>83zm(&l6BXT$LZ6FoF;xTP#2R^WsxCwTZ>*{2wa=jCcJx0#<E@|ETLa?f z6S<)Ta}dB2lX@w`UdY}4F}9gzqG%IB=uh$?{E~=RDe_K5^Vc$2i4&nhOG-hX9J~rH zDW!yROd|dy7f{$q>k)~?fo9@;!C%X9<7t0F><=(dR30&4lJ!anx-Moa<9lxxgBE|& ziWtx-FH;F!%*c56nni2~tXKG>y~bZs-xBG;(XG!0Ga`Drmzd>MsLxELOR&vN7G}*Z zR_9lrpB8o6=Cq}?k7c0{c?V@C69^***(T;31s;Rg`C&X00tB^_lZeSoZI^_4Kb*|? zZBHz5+}omPUIyKv0^1-+Zjmv0YY%yTM*d{)GsXg#YjPNiOUbDuF{%$qVu~gw@uF@L z*-5HZl()#N49F(Q+-9-!k5x2YU1o+@i^gb<fy449(mW8DKbu)lY9i%YnrPXmyiEFn z2nR#=iY9mELid1(lt~ss{CUKrj#xYoQrGp`rqdy=%b8*tD3Z-4bP52hAM69DZeYVV zUUahUmX!`EP&(a}cIT9oQ=}BOKnpwyk82t9E9Z9ng5$2;2&t=H9L@Pgv-C#ZHbaC6 zJ#jI&+4a#$fb0BOI<<+pbzDfcvKVuSWwchTt<zXYlk>?N)W+_0^iX>50YX7&1rSO* ze|8$RM!9TXiim!tA0cLtVJ|!n-t+ud{0v=rbjOQQxZ0bw#;f&L&DXDENTXTmlWWl$ zH7%!}-e}npw1x}ID{i*7cbm>&{DPt~6DA^MWK>Xfch34qPf=xX6F_=87ZLXgqd(kW zLNZGF#wlQ>GYI-H7T6llS8nF(U<yqvv8&b<H4~iJnVE+%Bd}cX$PVsRK1M5dQj9NI zitUJau#~fwPFJ$B)v;df&U-Ed>_GMft&b&$iqUfILWq_y{W6NPG)D70y@7s(Fb5zq zh-_;jm0d2;gb><ASBY;!dfprRw$=VIcL%u2<_IDLc{4%{GyE5&25Tj(UMlBEqE&Ec z5=e163{DNqbQ6KRh1^T{f*T&WK>piM6~<mKrvpu9)kp<HJ(mkexj|BeIaN}oo((8P zp#30ihkc&L@Icv6N!_e+mdt<UE>YUQe4pvdQ;04}vZ6(eu)={TPt!Ta+wTV?{#}cK zD(C5z49b&@+4d0Z;MNmuvu)>7#D*X=L`I=1xPLKYitP{5Lpb0824=o==Thj9&eB(G zTzQs~BU=yj=<^)@CUeZe!Rag*06U>l`Fs^gl*9$gd7(VKN=@Xii1a|DIN$<tO_siC zSpkYIceSeDOHYg35^WKzEuNU>3=S~F?gO?(yM}64@Fn#O#6hmv?`{@4X;stUB|T}= z2URgamVc)g52qK;nk$~8ieoS@>^uFhK|g-IIj1VN^H*j?%~C%IASX50gkUP$Ks?f6 z&bS_OF*G9j)H$G+%_Xq%cc_%27ap{wWIuA5jHhAxd(}!?iwVB6nR@FZAX6GxK-8DY z(F@d38TnRWu4S*vxakp1TvE9&Ibwt5lOHn~uq=izw>y*FE7qU=qAf<aKSdj3CEX7p z+bdr4@6~oEFM2uL(zkMfEZvVs`92vLCBGZ*l%Fd+F6%)=I)t(C{<dZ_7xLN?X~Lc= zY{XpQFH|ai8-agFQj7K|^@=ciHVhz(nMGJpT<;jvO~T+q8=#}0D(eKhVT2$SPGlgV z=0PuL4WzV`P{}DRVF{vf8OdbhLVSMT_9g64rKF-&f=w0)RVvC{yc|nGF8HFaW)e7I zgsKuRNwK<1)_`$iJ`vwfjt!Q+2NE?1m>cq;T;p9vV+_J*cf{Y5F@xg$st|{~`N_T4 zO<cIoa|uG%4!;KVFr;xn1tqOq@8oFraIbrDzIXWcpbts8!OJ`rheQoU{`xWAg)p#s z2R3g4&X0*HT8@jp&3XtC4GUyI%J??wkymZ0cjNUT+fT}UDx+~U(k!6nhOo(gkV|5l z;Vi&Wz^Kla0aPMUWIiKQuv^H+@X9&79=Vv0bqaA`mgzXolG%1TiNdxHc#xge@o8&U zpg=j>Ksg2jY;S&*{poBtZ@X_Ts{{l14*LUf6kQ71)OxpEpO3UP*aHu+d$@nJx6;;( zuYaALX>7c<tkL-TJ8a9T3zr3czzFZ}dexU3OZEInn*$w)bMtnkjd5+Jz{@W{_w;SG zzGWjE^OOZxl}^khE}pJ7VK7n#N%YE-ZtOtj8irxpZYp@(84H+VmruI=R(GX|llI{^ zC671)xi%H2guGAbSEG|fI!~O*h(k-7v8=eAG!D(mU-3ExDXh6dNnSqcDrRC4<L!k@ zld)<x!=XIfz&buC;~N>`Iio{^R;Sc2w6ygM%4ZG2hf)Y28|RP#QauM*wd{j%qalC( z8PmBGoQ#DAKE{-+#4UABJ?0mqscdLd*<5yCB=`9!Ta&`f<x4j0D8rQHQC8S~(3X@m zE{*&ars4M^@XvDu5-*{DqC;R3>fhi5JdOvAxPm`iPzr@eNF=BF5E)SfBN7T_8|p0+ zjM)~5S&o6KmNfG#!8pXSa$DO{MIAsa)5FD3m{a0%u_#^&)qs<UhOPoMJ9;-sk0V~I zC>pYA2r^3P*u-+LWVB%AP`w>R;3md$JDT&ixb$r(O(vBgWDm0%!_@Zc>ye-fc^Njp z4e7VEjxwcmEJ7AmLefghh=Q<^)18WjzP*G&S*%B?TsE_Bkjrt7F0+6_!#G1xPpnb` zd!b{<nCXS{q?#*k(vlr7cxA|_%1Gf@4N08pK~p)YC9--FkQykq3TR8qDMArbCOkr^ zqyt&~)E|I<eli7!W``_r=W9&2!To*9GPBn3FbxQWVln_pe2I*KM-&g5ha8}SL8u*) zi6B%zra2<I^ifWAO{A%tZ))&=jC2}!Z`PaZC`Jdn_kpTj>eSaaHl2e`=ls3XKRGX% zB~4M%0y={3X{E=pgcM2PF%>%I44Y0z6oy2OHbR^DOyxl(6JZwbCKdy6Ov-l=&$6oV zSFpE>)9hr&Nt$wmZq;ixwU6}(sMWI38f`7VI+{kI;%M5tuixa&mb}bHU{#xRI>;d_ z)JjfGb_A+4HASEtwj+_-4(Wn*5v<0paZA_jbk&SivzOSdij(w>EvH7Kf4B-!=r?t9 zfoF{e>I`EMx^r}_5&9(TRU-{64pX<IvT3rDRsylzcyHP6w0*H{LNc<Du#Ebnz~Ki^ z{F6nwOjA$MEPpR_02OjXf0wYM5t_aneX@42in-WDE2On5r1np7k<G#fU4=>tQ-fF; zG%bUSrNz7d_2`zaJjW{--z{M2?u)oW2rur{w45qEuCz6V#vAj2vrOQf2Vqe)9jjW$ z#Jg(#P`$hHo=Wonv3qFcXO;Dl6P@2BpE<_6On>nddgbIlVUir$8S#TMuffBfBsP-* z8A@%L2aE0Awc3hVQej#km~rXyLtx0riWAer!xs1{84&g)g`<=!oa#BOFOck7TEj)* z!%iX=Oq+b{!YR^eA|{K)D?KuH3oTJXs#Qce85sgYRctu{$Ebjhi!cFtSugekfJ~?L z>ehOq!F`sGIyJD&Kigk)`DiN3N}DnxufUFSlp<Yr6pOc#5}r0SiHRi$i*1aRWjyia z%72Szq{zD%BSTmwg$jlBd@%8xI!S?m6+|p8Obmu8CwzP(J*W(Jw;uW!s$I<Irc#*c z<;{e5RsRtVZLN>#+&+)aErgqig^d$JYmF!o<yn#@EkEFBn9BFv<uP7@BUdS9VV0(S z%S_K^oBZI}9TBhnu=%i>_xnExG}Ogp<HLJmECp)cKV24`<4-pb+DMsLJIZ?)zhboq z-JF-CH5r;7^~t+Kz%{5Lw#T4~;<FM{aW9~4hsl-_l*@pmhojI7YV4_x*-5OH-H(km z={D6%;myAg?i9UDaxN5o&uHJzL@1gVu_)@kVZU-#>LsbTs#e)YHYWT|0S}I@z=q$O z+(p_|xxCv6MIYhdq{&#M;w^+DyCf!&q`Hg(99Il&)RRFL3z(Bfa^-yh!OZygd$q)$ zg_<~(D>dm^TQcR!AnFP3_LNS7Yi@jepw>o@zGOU2PDyQG@jaIhr_4}CRvTignDe2L zY)5?VZ(NMSCp8Ex@=9XDV<BpyXC=Ey@7p|jMK(leXY?I5kRYK4x&rabT*M$iLMQ;B z)L*X6%)5r+Q8)_--~%8zRsl$FT=E1(!~-2v!Hru|S@)O<y9^V#$5PxCjwtmjEP>{g z_1zXhcf~61pOdQ2{Pon70zq}@J&p(QxfbKWZFGt1Q8-|XF6{ip9`u+(m0*%%VAtuS zkc14q9`EBJiCHT;9RjVu&f8pZO%7=2eXc+T9eY62bQPz0StMFpgN!}m)r_G-VfGYT zbRr@g&pZtBIU9HsrPFagfn*S=4PC;G^|Ud@BAaFTb7oPzM+$;Yw2#q`H<tDA4*v9Y zenX()cfM9qMz!LFqU4o!<B`X(8hI=c?E|@!xQ$6RfAUxog=5AOlupuuTHf52*(Kko zV&y0g#igedcp~~f^2HXKl|$QdukVM5eoW8!xEQ6e{uqw2%Y<Oi^_mPq%$t@f#cg(# z7!Tjk?S41zbo*N_t4(1n7FHHLd}*`1uq}_(Rh_ai=H=w^?(TZ_<!euTza%}1^FZ0L z*wR=t>ucA0Jd45aO#2JOKFMpp#Nz+{R$cwAx}w$FiY8!C&#(c*cHeTI(M0+T@A8Z& z$Y#^NFu#4Um8uzN@9}L_SA}o4ST(0>c99aAI-a0sSqs6G6cb;N^#fZdV+=KV4<QJo zO5vJSjLW0=b8g$m&a%X*#i|a7G}$-<#VsJX_CpG&GXfgP;cxwU&H3BpZxdP-ECvH9 zd?Axr6ivM%W|3z6)Ob)jrlgr+Y^8?rD8H6gHDwBuyUss2XmLxA=_?n~j^QG}7f4z` z;eFXb!?u$taF>r4X^ll`b8ED$)}t#jBI2a%BnbmB+RCFuS$VLu%1VtsWN*icDvpR4 ztpq=XU(8{Q_3OdxRp)#~ff;bGfF8v*4XYAGuT5jg6XYZhZem4Nf74nd$1DelBs;0n zo3vZ>y)tB9@+P$}QarNO>QYpjSobk{N%sSZ(X{um*kcw3!eW3NZyizUrO$l!vD8-W zL!#5-C%;%H#_3<KmtU1!Yevl9lVGn(!ECX_Bn>kxzKhea*k)){EQf{_qGDN+fXAU@ zs)tNU_A6VFo3^!T?NTFik#diQ(W4Al>iHfs3lz4%@~N(}7N7}<5-y5cPPjoWApnp) zlpkb*E4so|YrLsihrDhlS7P0?4rO<;4cW=aKhS-tw6ryqY#w(ch#b_qbS^?85a?X4 ziF1dkQ+!O?;e{z1CaQ`}Q|rd56+@^rTtIFLnaeu0Wrd%<$&8H6MD`If_Kd9Zg&0IY zJM~8aEohixs82P|CiWK`BZ1WhQ)`!YmqF;^C_5bHWm9k+YPbuc3dj3|j&+$<Nb)dB z<4Zf)uo*2CY|$HmnJgMbWwt9|USgpHF@&}{JS2`mtdS+^G1}Flyb{91nN2DZct&!! z)XwxV!ZKd8yRE+TmxsZ=T3;^`<4@0}zD?FGHWC|ObUBQV3DHt|O*jExziIBDl&g_X z?wy%%#fni8AQO3&5x=OOChSt}&7%>uOP+~@3{_RG>6tMs5=tU}M#77fSFgGJ#-FuX zD#K%nDV;USFIoQE1elyZ8r>>!YV9r_f-y7lq0uNO2vO2eN?Rw>PgY+kRiD->7RuMY zT9SwoqZMULH{05?rKipm+gRtB8svG!J&Ox?ao6OQnKRI-!cyiQ;!r8myPSg+(cZMP zWm~a0snKe$urPJaRy2_7Qdig<@2s3Q=MX|wBSiRx1c;0fEo-0!7yV;Vx@CzyJJ5}b z^Fe&@KUy-^YnJCVHT<3$z2&)S!(VQ1L*Nzhl*eWxEut?y6K#^Ln0TqunQ497xWQG% z+7ITi7h)wqjyu2$(s|<$`tX2_(Z&2L%^uU9Dg?AvN{`&D((r2VQZ9319VsSz#Bdg3 zH?=mYtY*Eo9#<EJqQwQsMNp=@?M&hOXibjF6m>n2L)G)PdhCjol-(}P#%48^k8}<; zBO!{LSNv(qOc+1QGEF$9^oq{3#;%bP02s|g&&1QzS7KHRRWmrIh*1wFV1Lc_q-tX* z589mUlqjDW=Gv8!OW=t$@vOXxTr@qpexZ^5IlgY#R96Zs*yX4Q>0#TQz?#nPrP#u# zX}CculcCg<?pjMJFiQ>mU&Nmzf@cFH&xc5st+)?{oX&OV131%U0E09if%H651Kr_- zvp2Y(<@nJ?z8$|;gz%BpkO(h2y5y#vs#Y1hIH%#$+~i(2>RvJqo^YtFp~lTNT~(gm z0ZT9l`d`G1{Rw5IKqMEb6h-nq`Yn?#jz#hcty<o!bsFQ3)%AW85nqA*c|hoF5rnkI zc4|hNWM{@OklN=%N)A82U3LnWbjapdt8r?$+(Zd{&N$Q4I3<=pJ@xN0>STq|De}w% zMQ$(Qmm@hS)*l~Ws!2{TN$TT<NKhF*rQ$=12hMg+!vK7%!#Td|z%>)i|2fAC#0<Q1 z$!jWhrUf5{Qza>NMWiEn_%^5SP-;G<$6C!J5syTyV#>6Q`Q{G@=oyp$OAkbXC^Li< zu|P7P7Mu&U?m)8-CK>-|w?0foN}V_s)bpl}Nq72Y9gux!dBBQcguPqV3a!|0{y`>+ zGbrNgmYaNX>PP<ZTK?Lh=S|ze^nT66v2u}dMKEozHyiis6w1Jp!+KSWuFC~6*rxTc zu-GeXlH&FaBd)Z6mtgUBn_flwh{P}R<ei^?S{_1$Fw+($%>pZ!n;^K2h<YYXPb1Oh zJq)yKvk0j!uvFi70VvhjKl2LMgmX^u)ND!IM$}_;&M>+ub}y#N>U8DY8oqJFGd*q> zh1wWzHVbBJvA`gtoZ0JkPr4xLpcUumeYsr3pZ1uvtilU^l2COlt6;J|Bh&0QS9ocg z@Avq7`@6oiV^+?I$L3=lHM9gK2NO)o2OP>3x^MvpNU6$&GqvD_QrWz?RbdRbS9}AT z&6T4<%ulSyyEu8wjHm1-<WNtK-oK(mBK?N=mH5-F+@TNR1+)0S!a)a$-6NSi-|~Is z<lv3-*_j=r=y;aq7ax~Ld<b9oeRx52ZqqwnmPO1;VC+EJP^oz_tZ(e=4#r>8#k><< zr^(>;ASh2uDRb1+Ix#AcCY8f~df(A+P&br7dl0D|viAUVJ9OliU`3XoL26ie4}6<l zc{<x;{X@8E$^fyCddYz%r7g5^kl6t)iA@MdC4z;d+-p_~4k?-RTyR;3XTbum92TNn z!na@&J_onFIj|I9^uvxdS8!TA2*!xFD~eaJG6cgK41(DZPvt#Aoue=3^T>sI;(6re z2}T?XP?_Ar`d$H>b))x$VH)Ai1PzpfEF;8i4W=b*gcGU7nJ)pL>kj>3hXE8bII=WM zRRV3Tm*bH@**ETj$Gj_ISjN;l?8W8{^*-Vkw`7Od2~VrJX2MRS_Kj;VM7)7T2rCRT z`_F|p8Q^C9=&+e1<&9K6mWv5ij6+dDP7y$SHrU|oV1GY?Z5PhtHB9Ycz~&rki<_$@ z)ARx$&+Jr;uABvdXPh={fZ(r~_#$_K-al-CKCQGs?;pHC?|-!g+V4DMeXhnUERWIU zDytI*u<GIfl^uET`T+kZo)-5Pv*Jz+!A3?Zf&?uW`HADT4Q_Y+nKy_G!X>Y*ClTlc z3y5^_#yNm;V203rxJP<;a`SR0x8c*6T3io&O5n`Mr?n}9MgM+P5seF?D0LDHS&^S+ zMp3oHx=}+l0M0zPD<MRh29ns&Pu`#wE-s@Gs+D->am7EE9)QIr>Lmmi7=`#EU3M|R z!3~BB3CVtfH4zYBZHOu1;d1rJ4$FBSJg1<M&k-3&(;+GY*bwekM-H6sKKQQBFJ`_> z{lAAjh2ys^!i+{CUX5`BQ-DH(bq+Zig>^M6MUjyIfA+q-xve9~^KWm&eurl`v;u4p z<{?>@yXjeqq%2O8qL!rW=+S5xAOVtS5y#>Ik|+iHvu_@CWL@t7LD{`y#Y~%cbysC& zWo2dlGS<ec{&WHaHaG_{ytF|$fhc7%fB?bkm74d81f2mc^8o~4eZ7_|+5@S{U-7or zeScl2D4Z`^nKKuD%`wDYr?qx47;+l?aTNxxrochOqWb<CJiwWTHhx$|>m~Z>*$cUy zxd5?hs=$1)#dT<q3$Jz_xBM12H`7h7ttX9mR5y}wx8a69oOJX28E*ib><eXw2-9sQ z6F<9`$6@y!pw6Ffs1mEZ>99?*V1x~WsW<?3GerShxrKLBovM*ky(+nO-5$vOx!E1M zM!@}Dp%HaH@>VbjH#*@)!2#=pPdedKuoHTNsXGFg)E(5TLDQtdyzog<GaIKA+%~|I zRD76?clwubb~dqv7S4jdwyK_#P86yVI?)91g7t*32GUE6;uJXbBRuMu_~_Ru|BM;{ zsrszUp<Awj7+UvlngCbLtlK`zTDlWmt)4sMKg<T@lRu~62?{}#stTMPs;LA6bsz+1 zU#)7y;^<yHhn3K{@jplKR>8em0V6?h=Z612c$5wCKaVqY&^4s*N&L~>{b+0e?J(Mv z1R1NRY87}qc}L0_Yb-PnrJig^*seU^I&(PXHbu_*X2GnR9_hbQ2AkH>cLf!wH0kSl z(%E3s=~w9-n%tG9Q9g5goE6x7GCxoXi$=t`i7i-h-qnbuNvk+{xS2-7pZy}gC{Zxp zKiRpTfS}g|xfc7i7IxMsra#V-{Stkn|FEhIR<0b+z%5lYGD9VK)_e&^meHLe*J+s% z^I!@Mk1M#CL4TCHVdCt^^8tEvoH!TKdP^LJ7RB<P8m-^^*iiQnm^O14$$iEmkCS6o z`ag%SA=E5qCUa5#Gc>iLzI;$-s_F#+ThGInBkYq1RD+qq3wP06BV)(;{@)zR3bR_? z0SS5?j%O^rK?`w4;aZ3nv`9cA?QABYk<sA`E<w;<{<UK;Ue(<Zdo5`(kU|qf@x!ZO z2>R1&Hfsmrx!2i0oQ?PQDYJh+jTGJ=T|(_z?wXDH{Ta)fn%mh%TfZrvcd@S1or7a} zEw@|ba+-5z{TdH`IXZ5t4(`v!@@GMR(Rd&&p4t9~(j=%OAVlrhU<QoOl#b$!ZYTnS zB+5l$07TniAX7NsI_nqN-(GymT$#ewN}9Cq>HKZgtM#C$*14&5$rXcQ%da<bpHfAW zTs5%~=JbGYI_rO&DZ|G0DQcpE>uMOcNyluWI>eE!bB0)ARB<A<P$5cz>a2<K6z^~P zt!$x+>*>$ferjiMabYIJQ-P`2H*?n%TWnzK4a}917)Y;TD*DS!OXu~ok|6_S#lKkb zM3J4{urlgasbk69hK~2DAt20p6^Z8}c%iwTgV0U~AIrmE$L{wfmnZ+y_1VAQ!Xpva zQ9rPyDeA=T5l{Qk!>PDbG^iz=w=@Lhd)%|nLF()^wfdKal@*j8&eO3v{F~_E**`#9 zZ`$^}kWz@G3p#<k-yecq?)>udhMorX({Vl~#RX?VcrJ`rOA-ug7}@ZjEUqs}DZuel zAuXTa+ug8x2?Pr(A9K8uu{?|hcz<w#k7z$<tD(?~Ih)cNh}F>MsjF24xz-bb{7CDe zDNHDzY4^2*SX3$OH7dCy0@9fakWp&4Gu7@XU!`pLI<xG7YmxITVS=MLtyQ~U>5JI{ zyTKIIQx=Kl5#11_1sB~Drs8|v6P4-nUy0Z_R$`{r2M{If9;i;A7w3xR3iP-|QGh6v zWWe&Vgo!3(Oq;X@?F#N}P@z!DudI2BPm|&TFDRpCQSvbzypt)RY~)#wecqH`tKy4< zaWWr)b;~;xsXtud0}RkAXSxEz+=Z2J&6v7vQ$^?`Z3l<!q*;hrLCUcTRai{RU~&pl zZ$@Slr<0mC1^yaNI=dL!EI)^no6u!Mmd{iZ$?np^skiehx#$~GwN)i#IDu)lwRL=x z&-z0}v8UZG|BljXK6}yq@Q&k(-ko3tEtzPh$U2~j9iLOO4IjLeT*CvR?sE#t=1O#u z{)^l5*$rL6Y*U`lkXf<R=IL}AKV^+hN4^RmOF6z8e`v~{$~!+DNu~>u;hL|J(<*w3 znNq45P~3EK8heLBJ0jqdS~31oz`spoS*IHbC{?}1;mXm2cW=AL1rSEuY(bTf<K|Bl zPMX+u56>H0UG)R!9yvs@MQu$+;4%bv!`X$aZ3CO|cc^H>=Y@R<y7tdP)!}D_hr1b; zw1;~zOShhuOI1cpCu!IrC85v*K`~VqvLvSfrqAY=zm2Ewx-9Q|aw8ve&`aDal9z}k zJc&`uXdE7uyOb*FjZk;9Adm+h(c(>UPQh4`5Dnn!5#lqrI_HJ8$BqVBY^P|X<+SPE z;*lAP<l?kI)(Rc^txrZQMzc}oAU{xtXm`3h8qY7U&^un2@rtBJd`EnDaNu}2Q^Fd< zGoZTo>+A#`@9|9@Ug$rN0(me)(^I&%_IqD97Q&8Bx>$sF3H{{v<nd~p4Kb%ZFL(qr zccy6i%JIS0{(hqbyql-RT+W2x?<ihk;}2m>D-3siHGP_CvZA0#)SnZuUppW_VY5-H zIVV&@u84(9SQ@<fjdmzP%RFcVv?n|_!na5f<zN=#ZC17_FF@Pqc183=z16q2^v4)= zwNj#rsH;dC5mp5L{l(S*=87mGRq?OkoSx*Zue+kk*1~QzyatID%&oLSQ)!99z6+A& zyF#obYnX)h#sH%oUC#zgGXEC${RropJ9`AirvnT;9odEPj6WATJ3)V_GmcD9Fqa3I zIdYV^M@kW)*YtJ4sf7D?<RTb5_FieNdm0O+ypjdsV`LRCdQqcLuf}#(h_9egiPM9} z>zWbZwC_wRxON>suJ~FMYy&N9v4))ZsH-+7nsNB+XJ^fB?FW~=hy<L~+rleNO^E+0 z?tZ0^3wLnuE3do6ov#ES``po^WbI6@4_!Cpdbt6waJM&#XFDOFtnIIDWV^o|HLA=y zc%neolWzX5>Gq~o44))?xcOmhtA{>S*lc|!UND&FuZ~yN)}H+9jAiN2@A>>3Y3yQ- zPFmUl0nN&kE&9cvf8DEu{l0(~FLx^c_miz{4GR|)ZLAQ9Sx@m{Vt0g+V6POE%6O+@ z-1CUf1%^rar9bLpqrH8Iqy{tDLos@-RkWz!RH$bt>7p2SR7o~SeJrFUGXrqpMpeH< zg-+yHstUT<Jf-G@;_+Iyh+%k!<9GB8j036AHTZ(G>S99F35u`?*u9CEt}f1`UV*0Z zR>~f3$jsV!sbWTmuuq%`9S{do_<AwxMCJ6PCa9f7bPmfyoPcaGxCsJfKbsG(dte-f zFYaH*)gq<0zKZw!B}EHe=3PAjst@y`>K4+qqY2{h2UdcOS{a-TE}x5MPWM46AHqSK zPM#rLs!a2M>8%lbB@1GaUuYDvlwGM;prUOtNrK*>-QVBE5a-+%#b9RL(YE61gtG1` zEl2WY$zKfr%kn!O_2cW#z}L1nct3#i1B`1|Lp71tuQX_$M?wBNG`*U>-{`DX3yNM) zZzaecS^noup{+6ZOb{^8J~TeAh}yjZ()NlnZDpQK2z~+*r(TboCoXl-$@F7(p!_8} zCzm}Gz4r!Gl!9crLj*EuoUsTv$WjnZ$|IRMrXb7d=OQ)5LLxaEpI5kDq$r3)I#Yz> zy~$U&M<>vNKz5jp2hzxLTYb_!bUKm1FerG;@SZ&#d(M||Eugp=y##DCKdoks9WC?Y zcKU`56uGuUQ)mb%@BUD(se|LTb=kIw(W4NtBlA5}q5+3v8>`!g*|)`F^tF;}UMs+V z#{xMXZ;GvODfF=(fc!)UN*s^d`eQ5Y5qT%@7d2;ob>&rAiy+0``aUj%ok99*!~8`P z?e$7yTEuitfxWgy_WGQm`SfP2Uuakj@wJo5b4&(n=6EV3+@>C%C^iO%y5B;R`~n-| z_}Zg{Oim@G>%ROe^K&qa$zhAKn2shy(2=jT!wue3RVZ0RA43NY2zx()u|f$j(FkG^ zr}^%e>~@X5dIvkJ?-W~W%QF!6!1TtkT9D`BZ47<IEN%}!K?hsG<)lO<=0FpeURlK# zP>ZMa@}mvmmAEO&>U2ujh8yy<^9#7kj*2Q-f>s7E_}*#(;tT!-su>%fq>cRZ!{GWF zm+nHZF~;uO(2$Y<IB5V8hTSPHF4+mwfI5{lJ3<<3hl@m15;YJgcNPRRd%RFnbwrT_ z>O9M)Eam0s=D1Hmg+)x3W(I>pQCWV30?^i)3PEgq;9A<OS-BaJ!UpPo-@S$<rs&1% zqKvAHMLz7y;gn$=)b=JvrJ2THdV(NKPz8Z0jj<6uoiSO}oyb<LNN(26E(CO%kI=b~ zp(f~=K#9~8zRiV`z}KlUe^f@_AoHH}XCDyO`BCRF;*YOpLxisgBEF#rNUntHeW*r& zzPiEpDnL_KkDqm#2%uFZwqGSb^7(WMq_kZrqK)m$n{TS-blj=j)?z)^r!2v&@+oW8 zr`NgxH0L<zkLERD%1V?#dVi>1g3ivw*Wh>>TDoI!_mgp^JD90=MgfYura72$Q!x7w z*O6Rg@c#j}CwmS=%QFHn6T>bty+#Bx*E!6Tnj)C0f5G{vHrPMVph^}`<JtkM>W5ND z!r9b!%<@bngN*rr9t2{?a%e5qOM(Cyfjb(}10Bdrv<Kl*7Fg(5%x)_3a|+Qle7~r` zK-!gAO)M~F4A#=))k`3%4}BG{0YS4tYi#!VRaZqFQ1|YBFDjQt0ernRVPHlcGy;+) zU`iL5EPW$|GGM*eh_ys|e->ezLAo@oPN|`SGJ%J;-wXXd>@>}eSFOU55xYjGk|4dL zK6f`b-LWaH)^Zgap?mH(4+cRHHm*Ki(GXtAu9eS5sD$$1tvzc<TtqQy0OEfF;#EQ~ zteKXP#PRpmY;FCJkUjL~*@#)0g_vxOwe?2YL~mh}I(Ir6%DJYI$b6R}sR~L46n&6f zkOP^heTLiQ-HSe)Z1WL<_bV$#5T4;#3#|X90(K>!DBbbYO+R4uNEjjllctvfOz&ln zQfYVL8^&ya0lI@K)dPg)Oe%0Z64>v4fLQ}2wo`9Ll@vy8NtCOUmR^*`Hj52yk_g&z zN3;?rPt_CDz0pyR@dcO^YZ^jw2>c%rB@sOE!#Lwer}SbBauOXI0PabYq<;e%Dy8FT z%6>5@yHR+CG5+7n!xL!vl7I%hNQ<E|QqRk|7L@33nm{{S3>|!fGAII9=2C~F)yD+* zsTl*?L2T_vR8r|i&mAFM5olH1w_I+^0h_SR$1g`Z2bzKe>L(Y3lgIr`<^PtUfg?^3 zg*7@ol63^v$Ta8(P5eE<j4T0Tgu53*6~UFxQ4xl6HWG+jDx!@L^2ULR!yNn|Vel{_ z(+=)SD=VWu-jk;D5h8x$7MYAeqzo_ZZl~-IL}CK%2e;;6phU{~q6LC}ynFFU<9~c_ zU_crQgjRr*=r0byi2mq-gSgt2s|#(|XW5$Ap{zx*yVTp6rvI+a=Ka0YdNEv9r4bAo z;Yn@jK|N#W$!<F-#voGvEo`N1#<{3s?o=VB-Yi433VsezOX++!<<+0j;xnHtMVh5| zP5L6y@MO|^8wSl8Zk>qqrSRhhQayNfNx&1wiwpEfo0@cLD?SEH43iKf93`a<kBy|V zDryXI!o8wl24yP{*f1!ON29RcpnQ0=^>XL%z~8!2+rt><IbpVfn9~~%o2fzTt5Uc` zQ4DlwUbuoellg1)$^11rnZK4z=C2hd)AFO_RQ+0Ms(!68RRJ3M`>TsM)j7!Eh4bX* z6w~A+L}tk^n4TnJGx0g{5X|FK<U+F-&QJiUKJ<6^XU#b2L0IwO_x5p^UxKyGk1hn6 zH>t#X`~&{yw!jy3S?5QHdWFgajeHdxxW$?W7g!oQr+K_Mmfkep5Ap#_Y~!sC{AAfS zOvjss>Jz0K<SJRg)d0-JN3rsdNK!qeeRgj?@b(gZ<T5whmO^`K$Fks+hH^E)*m&!u zV&aWxUYvB!ONb_p1&J$Gkz$6vyx|Y7`1LlZpKRxOka~vHH7(W=1=daZR--u>dK}&y zccuU|NErzhDV8^X2d}C;uHBF4{cC(Kj8DKvIiDZBEVuUOZQGS}gY{6Lk_dnBDUtVM zB=1LuBFu7R4W>u6Ae#1r6>&<>z`KFT$?a{ITo&-!N&W!2QWfAO^I-4zL{<U!jQ-_# z%A;anif#3&^UKlU>z6xDi)#1sxYQ3%Zn12`h&Jeqp%flw`^Vdod$Z**E*~_5?meK^ z0{4ujEYwlvOHt9KvN#pW+W}}t5Ftc&I&}{ysbQX|!Aheg6{w6+X15PUE{+K$Uh2%~ zr2nE6x)lzGO#ddDA!0Y_n)sPcv?cU{uBx3WHA6V57<Gu={xv_%hU^=%O5SG?B#3!z zRP(Y?&6hW-dC92e&Zrpat!z-52;`W=-6T4sNcw^!QZ=Op1ed4ODy_u^WHmwvy%N@^ zFHbAJjz)TRnBsrMX`=~=*YZ!)IkZs4|BcuS{|se9WL#aNkuYJk+-E<3&y)gbq9-yj z9MXnT3=w2I;oa6#hT0q{6IR)+`I5RdFYVU6PPaU=U9?xhE!^*v&QNact4<RU)YG{l z61p?RQ3E?2jLwRBc11|nKy3o>SE?|X$i(=p6mY851o&UTZt|d;IKqP_<`!nqb_0e8 zZyK^vAI(pnnd0%$ka+@(iZ=H47>(vYQkoj0(9Wd=g3^i27$8ed)<{a$rlQCA#a(=^ zQZa@Id|INC=i3{})iY%p*K4bz?{{{eZ@u0>`5vZ}Q=GisD1QP?`r(9Z2DbJ({8#4} zn*YwA*Eu@eZD&CO7@lED=eOOhSBEc8UmWi5csMN@Yyj;$W`b%_xj>d?h;gHx592}z zns8l>0fnU3zvzPFf(-Z9O4~lh_lmcW5ldSV(8y$w%(>YVO%pP_nt`1*^jHEqsmMvr z@Gv7kO<*8EV!&6bF1k6Wph>FCjEqfowvW}J(j=cVgH}s9@u?CJ89Mz=_WYoY&mnDm zBT3J|G#ouqK|3I4x`M8?TzD?dGbHCqK84jMJmuP2{hON4IM5vj9ZiN_al#=+A@-|6 z9hF3D@$rv*#~b1tA7l8Rl_Mk?<T4F)VYQkG<haCpx_~p+f8uRN*E{Q*&<l++x21Y< zCl-8|rAbll1Yt-D&uw*Swp`#^yTyq6PWyqMYz4S%d_WF77rqc7)&$~0Hy?5{0bk1@ z5Gg!VYsWKAhPx#4AksM@%Y}ehV|wW)U*kM!aaLmK@OU*eX0PIqlJMH8?0d3^--*_& zMNQVDujeD{fWmmr-tmBj=WKR<0mjw{i*t|0^9IGB>ri$Ftr01{MY+X$#G{3=<kwg2 z(dX{OI~c#|V7ajX_KI5Fp}3$^uJM32!ytTA$ATb?sEaxOW%g|$5xD@aYIk^6TjdC@ zB`B`H^EsC^{<=)5b9yOVlHZj}Ul;Jr>1DxHe-S)W&mgy*ofZgFt^Yr8O${CDm8grY zQAap&+mw2pU=ZP;E2t-(`qLy;K~3q_G%u;CKwarp<f|*|X<3%2X(`pVMAx^P)@6yB zms0IZvYVw^nB{3=%Cs>lfAD1s6?|CUMW%3xRf-e$A=*1Ky>?i8yt+E<#0C5>Akrww z#GSzcNd}{p@J$}wF+r;Y8h|eN3Xag*4lTUUh5l>GsV>Xl9Xf%0s1;zboTLS|tBoNk zhwk`}+ag6Y;26fMLO(|FxV5FI47{dlaSZdJ8jjnC(R$Szp-d%<9{69A`YEN|9vR$< zZ&XW(phPOT4>b9`DWw9<LPPeOePJ_!f;PiIK{iN`6CfxOXebR?Es;xw<*U>=o-*RQ zCr)W_PlMnY0n$-W@d}xAb5l4XhKxyfm<uJ(Q`M&lskDq1RJDX(lR}+!g2Z=P$jONH z2_Bj1PMuH)B;%&%e!q(wrawg?3%&m2S_IIj@o@|M*XY=B+%(i{)mFj8n<=S2w&=*< z);b*q*smjw_pq%%O9j{u8n5Ue0%Fic4~~}6AAmXa$lV$^SN|j8OQ1trH{<2`H<Ou> zYfwwj@8jsLYa;pxWO^E0EUwbE@JSshNDjz_QHorUFycj~N@UxI2e0;bPj<7dt;{Dc z0ht9^xm^?1FBvwYU;-tmm90_ApiYVgyxLe@Es5m-rbl>+vOSbijiX;UDYQ8~BWi^M zA-0J$FE@2WlO05$NIIDNhj>A;pcC#WFH6EtXnv7<FURz$D0&2LQ{?e$ZIj)11`FDF z^YLws*c3_^hS=Be+A#i*gX#+jo~$i+_BpCe@jXba;2WnK_{k#tB$A3cmjL{c6&2ql z!%B!q+NsV|t_F#v9eRuET9wCW>&{m}-~R?k067@FH4;MtFmnjVkd5ZUGZvooei`)7 z6;_ETq5u`uRzM1)XQnHiKkofT^l*aX-vwC;t#;*_x1885<`7{bVq#bA{hZF1B2yCk z;1IA3I+{nrfk9*^ekw}%Qw4E%-lTT3hfEc@ufz(9yGv4$;{o^<;VWB`*JO)y*GfWf zMusO_bH`=nHqNYcpf2KQ*?F)Cl(Bo@l|ULxU>Bl<1fcQ#V&+oIbTP!==ovT|)kMw> z2%pvIQrEl$DC`7AoFie>!E#F@W2aEw7H=vJh)f(HfuXMKB^JU@Pjxg2q0WJ|dg+)O zjBkZvCXh%E{qrC`CxFAu78CiEu}S*6<!xINQmLKZvUTETi4bJM8|T)yBB4DV4XTwm zIc<GtEtU$h+twiwO@ck8+nIVHGimy}x?gSvGXNkPaeRll1@Vs=o#`8m=yhUAB8Mam z+=&QJUkbr!R-G=mAT;U?(M6?w*GH>(usE4ZAOUXLyTX|o)F0;UF&27{-x%Zeu<@82 zMfb88Nyb0~oRh(W5s+!Eg7Ui2Sb3e6D(`pGuOk>nfW}<^&KkKDh9-vU0P<y^1d_5A zH7NHhyv{p&7Xu5!fdZ!rut>BpAype@E7lNrCz#L^_%e=Z7~9pm)u;t9_Gx}@KCx51 z(JO3viUtq?hMI6Gfq%BMmtzxUlD@0o@I0;Ty+Efo)j?F?+`M(BR9)$Lka(ll)#)N_ zhOy?#&JZ}C?5tvnsaK-;w8C6w)?Hjn*g?v*dt+ygE>boriC4u@Ig|r|xbub)PJH-m zjwmbQt*)*L4GL)=@O+Emv=ib_kC51g+IEeoi>LbL;nd#aF%6U!$AX@VLAIUU>(E>Q z4=7*(ew@n)RJS`71v(5(;3+ulV&D{2+U+PRPoug7hc1{T64qL7CyC&+8A_xUrpSb3 zZ+q)hBfD%9k^(Kk>bs<=hfpA=#S4ULoaD{gX&H#VYMUZ!L2FTol?Wb~3PSM#lE?*6 z@QlpTp$wg@ee%PnJaR{*uDDR2ocPTo{I~<*3k4Jlj;wd`f!~yqJSrXB2~~A$ziCtu ziZ>Y6ODd%yMAHB*1UM88EqWNkTCz3+Em+J89G)*zhIMoluu8x~qZ!Dp4Ka%5!HcDp z*rjf+f*X$jQ1UBw(370R0#k=99u%y^V!^JFINz#_p&;r^jI(TtrfNq0BB;y{1N7?n z&{v0OcSK(`e9V|}H*@5FlV}Txei_OXn<5%2AiYD?Ic1`W2w4E)_rMW1#=znDvPeRJ zK`J7PWxhP5IIR=;T@sr~Nb{)3Sk+D`;8y8EHMpdEOG{Q+7+oO|sNQGZ?JNP-UZF0_ zltcBaAC;|DJ6-|86B3`&57PK@%!*Q>4mTW5!Oo7H?DT@Iw5pn2DQ0&yfI0@KW@oNQ z(iG(*LsX65V%sBvB(cg;px!oG+$1R+ZSyC6vh=;aF{3#g;bT>fM(RRl!&fjg7yy(b zWE{Fa(|<K8P3GVS3cgK9omdASR6}6mH^_l$Bm*@eh-iHN4i7f{qM+H36g#)gv<717 zp!YGBN`fH{Q-wFeKdo@<#bGfC-V?ps_8U{*+c<Q;Y@(IYWyt=v3!3obBgdvA+6~!2 zD?z4kcuvs{Q!Q7LSb^T&A^x{mT5AKXxu4TNsM+2TRLd_kQD{hHwkkBu#8-^Bt}g1W z7_<?)MDpw?N%I@G3bC%-Nq0S0or|6-WO}TSli6CP>%SK`)*rIbpxdf1Ax2}gPi|e` z%i(<&DN)R+c!p@{#8qu$mENr(7#1j*&?uOn^LT|>=SL$}IdGpdY{cMG-}0AfAB3;L zdvhrAbZOos+wV@#k5Jjl2o#e6fM2b97g2@<w+6x%$#82r?cRhe0MvAe6eMRq32&qh zuXN<-K&7FuBZPLsxBGY%Gkq||0Kn+fRabL#L^Ne#1m#ykICr;FL{Gr^|LT0RvT~?3 zm?=*{bOemPRvZj+MvY$sXP36DmXQ65Y|k*{R^AWJF9C<n$AiA7bWu^_o>u9{c0=`o zCyrd=*7qfKgm!Zsi&=N3H%6#-IDE)dBWtQt5B0;5ev4C1OPs8d$j8IJBK8ry>V(&7 z)!`!PJ29w&jLJw$8CStRmryOM?TyyA&K7QGH#Yl?vgXqESY?H8tGpiTIrGnq;2Z#_ zn3RzOA-}&Df>^kkD9nyX&frxLtH%A0i_rAug$)$0f>Pu=lc88qm0(|Rn}p0)M(k0# zMI?H-pXY+s(Y!HN_fqxH)fRd{c!#40^wAAJRS>Clwe=5g9Ie94W0Q%EY-!ErT9Kxw zqZOb<6XO*z>eSL3rPB`vv$VsgVyF<k22zm2nVe!28R1P!&1e670FS3Vz4d2GsT@}1 zbT6EgQpnOm@wCnIyAi}G@ZbbODJVf4o|DH@pH@Ka0PT=SF$y#q-Ko_e^KDUQu!lw5 z%tAjJXc$xOYbtb}KM&8jtDBLdW+nXgAa?jvibI!fc&%h9oP`uWzD-sd?%pey(QC6z z8u1kEfoaRa?f^SL#J{ASswQse$~znl!<=owDu_P)T;K+ygrCvn96XdDOlTjC7L+XX zy{IH*)O9*wt1i)8%CJid;uJuAGiy4HehV%!1B~W@D5S_1TMxJwg>`*AytqK8F~vg9 z$M~{?^|zox=R_&2=EkiC<d1YUi73aOaTiO3?eNglT`oBuO_y$4RT|WSW;@gUrkDF% zoP<LpEZXYlIO{ABgSRLj?^;YE;;Pc35nye!v;}!<YU&J(Y~`UN)s$r~>36AGMH4Y; zC+zvSDc;SueZwU$e1fimnYJ`u;xDOkA|5xj{uAP8_&q`N3{{Ux=O50?z2AFKHv*F| zJ@U|TmTHW2IJfV!#6Zlu8ARXM<^UZT!H(d;#+LxoGa0z4;K7)T6X2e~PVX_;!}=~F zPTVK#)`RtQv?VX#GfWIeT1weXVQ+mO7iVl<i0VkpP=_bix*En_dnoL2uH&C@s6!-a zYbl0rKrn>!ekAU1{293*U>?22Ue2LWL>}^m5ZgL1=5sQ7XR%l5``{W!*}J6KCh)>` zsNzHC5PqB?AbHgFB~L>-$4<sO{p+Zd#^?FB<x+>O5~|wfr!wC?SI&XH{p%+MJmH-y zYw8S^8lLD{cg`bk&Ed-9)DrZG_J-0Ek2lU(m`kzlVu*irrm*<=XF=P*rN)u1_71e% zkgydWvI+vdMs5bR4F~H4jg9?t=vw^169qL*BoKm170DEh2#5H<8pO##8tWAeF8at* zzFLtu&&%^*MrG{QZ+`<R`Pu8gWk<VPJAeN=v>mEtA8kY*DWzxuCq(182Mg(91L-=3 z(TmzevprsM%*!PkL<{(hm_;;41p_%nfzK#kAuXi*1feS-S&3v19^J)&+6p>NUr76I zttG>nxQ?gB??4(ZKn#yL-rLV%Ht?-8*UqU{OQa<}D}=?2bBo2&8Vp>6qDlq9K29St z(3n4OvH&o7&$iV35wT>gD3Ql)Qt3%WJ^e`gVb||7*oz6=Ib)<8LkBQT`Dip&_P2RJ z(*Mar(xa=+G00DjWwLJ^X1gHW-5l#_ZyhT`eAF??j`@_OUCP2U;j%xI&m(D_o4#*_ z*06Gx5SUn7EG6q$f`4BHAHS5JUtCSPkUw5cpS(Nz<t@iI@1Fhhmgb|kL_fW>+>;bv z;x1)h(9!O9akh)gw4R5++CmavC7*)O*&EM>V#|3mqLy!yT;>t&dPBbeCRXkX?Y1Tl zZ&^*m0UEy-xj(DUfVZOTNZL7(>hoO_-Sdu>mZSa$yfZ}FiZRa6@wpl+)rQ)he}EcJ zcwtVk2r_DqX)I%|wwyauSH`&pWk%M~D!7X%w=(n@^-rBe*2BNCMlwg;L+`~c^xiK! zU;L88?BR=Ea=6L#C8yT4g(D28>xdr|xUw#1S^k{~6ryGLbB1^RsQ+eN^-FbsO{jU< zXh%wwt>9-KtaZTpGV67RP`rm^p^V9Z*AE;1nx|->7;TmB^auFPNh7Y}NhS|PF3%68 za^}T3cy?o}kNb93^~5Rlq)B0b1lc9{Nj+$k_<<0NGq7KdN@Cx{CMeY%&w@WKT_tpD z^#!UGW0A&O_1qdlET!}5i0f%?kcz=BT+IUK+jwmz+<Nubn}{Mmn1d9UQ+>;?l7T1g z6$@zXm!heU>wA}@k&jwfg_?Kr)32>;ucTn7s$)9my9ihs5DmgP;ooT{#Oa2_Z#}h< z+hmHuv|rKgbUL1@!0bNzS7z29x@-)oDhA^Z2w^pupt%dEDu0<yAnHJ)9Bk0!b)~yl zVCDP9^bor1F9+vgwAXNSD=TM`=s?FpcC;Ic%T$x_qU6Co%@J1Y2ims$-FvZiEU2qI zuz!s@_r006KFe`*uA|DdPw(w8zVt)95M_+T{8&H67Ywz^@e-eq;3iQhpW%cg&?KWF z1>>(q?AQ_Bpd4qEbPPcsm-(e~0H)e7EFVQ+(_z^LuG<GX-ehqNaai-6LJbZUi!%6y zgV>4Z0zXV$q(g5S9Q36>OAN$>w`&|>NSsj@tmDxRt>IPzECrjF)!+KiCnUA3t*?Sf zn|5)4(9J)ta?q#Vpi92>n4#CdgqWMTFs9LzfEG0e|7YcCcGT~JIaz}hMNaZ>bRdGm z;mRHdoS>-$6Y3R+xd7(sz~=uQVl+lhG!Q6z2ZNF8^5Uj;KNh8;9kXM($;J`9NnF^| zs9RO_P@0hvJqs(t%51ZPP6uxp0EQ~m0U<T)ix-;vH60<y&GYP=2ZKi2sYMlTW!{TH z)bu=84?FM|mM%6yH`!v+`~UnOUw!ozQ+9`S*jS$vjzLE_&B@AfmFJvH8CN6Fa?HC( zGPc0<t*^dH;YV=OI#6ROOrt$|q^Mm;brsh+vc|l~^iS~0c2@i@pxWa?ni7hOFd8ct zsY)zsf>ylvp0JW%UBkoj^o9?G#=~=X4}O^Ca0eR_U-^pvQ9M!AZsP@*PsM_X%70)6 z-|wjc5IHE)?xcHjjj}Q^s;?&SL*aP<%E_FJt=2X$;t)kkV91m6tM0`G|9Lqdan0GS zr2l|Sm_pZL1ez5v@hbnk;{vFgTKEUpx9=dG9g&|}*^0)tVC^zJ6RtBk5$XN1wRiMt zf9vJ0wL9Z&;ya4b%yAk-CO8`qyeyqI#1oWl8;zVk;>OSf1kr0rvrEU9{`lFD7cY?c zX%nDe_nObcC#yt8B7p=V73de9VX!-NWo@**@~1W;@UyL>LpPmKx6vxX>73IGtfto+ zPiFSi)+s=)td>KW(ydLlLi>SAuX)2Tr+TX80heol;lkPY1ar5Yba)cz4*kwMb$lgd z4*A{5<gY@Q0qW_GPz%+Q(TCj(-T7?n$S-cP9?Wmk?qmXXB)o<}Hhzrc`3e%_0}gxZ z(ukMl=M{b1eYJmd?Dwg#;Yf9mouJE7GetS1OuHIn@JUOx?q&0G=@GlRs#N9XS#uNL zte4Y<ShV#;>EaL>OGpo;WLJkK;DR=TFnbMiC>WN#rIOk~p$WwU9I;&8*e2JAMwm@+ zb3XUhAGhzi4C~%9Z2S?o=*Ab{q8yd-i|kQzoBQF9wLv$WM6bMJ_aaAW1CbisBg`J6 z1*h%q$yUJ4=<6wllZ#Vj`u=Tmq;B2b)+=m<C1ogms_nygIAR1T9_Y`W5@uBLt&^xO z;Fz|u?0<n+H&vpRmAgDd4izFp34t8+&ehSVIC#+CxIVcs()^_pWZnr1A!-qdEDCs{ zY&vi~t~E?WM8gGxLJp*KTsp2_Ph+fd6VLjf)x#L4!|umpas}~CIUPlo*58?rvCP$V zQ>Yp8bW=_Xd;jW+Dz`tkuC<U@fWp{!yxyR6aUE8X2BU9sxp9CDtaAp20;Cd0zFkD$ z!#saef$Jf?O}_^<u2WUCl0rw*jn!zGLa)+|zzL|1e#Lr`8a0b<PP>4bIV*~rRCyi3 zD5F0V2N`u{y$imx>)iWKs>>fk?MmSsuWW>BzrqP#;Tc|(lonl?rWppfz@V=6l%7@e zDm6`~o#f&b3m(jKc-KIi*>QHTcYNZq`w|`5Us8vIjqOOE{^FzWE_^`fPA6V2^?N}F zZrh6MdtGVAN222~ieTiv{bYaCAKn<0JAO2>oXi{^@z+e5&g%^y2E+M~Ke~?Pp@;B? z$$y~MM89^8e(T=QuEMYSU<)kR#OsOUU%{0@EmUX3p>;e3{4=WNWPAYjNhf1|$q!mk zkt^G#PTywHdKtg4cq$)M=YeJJjWX&4`WCAyge2g;(W<GSWq38tBSxybm}FNRUz4;+ zVDxyu%Ybz^(!l6Z`Nb7d!oGWb&K>FqTueBm9u;-NaY$JtFDQjI(;Ku$g+T<|SK7?O zVdiv%)0-XK*nNuU#+_Yx+2^Oiyt$UxhtZWUu4=ucD!Ve;AcjRWYY@ZL#|*YEi{m`{ z9xC@1@kljv4V#FZBNLHVEDSZemT~U;4WE?MD4VXD@=NxtjQg*sW=oNMoC#%aqJAU| zmm(38laYR3sr_r}FNx@jm}kMhEScfhKE}E#7O^9S?k(4?HLx|JH(PapLLlogL+B~M zE5%W~IKJG+1b#Q&mi5WPp6yh5BY-?`>noI2Kk8fUs{|;Sb8h1?VZ$h|RL&YS`^jzg z(-&&?#%=cIzM2gdM1k0RR46r{+BcifncFg}UvX5rCM$}0#}7Hm>c(hEWQv}jPAy`; z!%%lWg1OQ8tjdw;h5nA7Mx<RRJCVxboyR>s{{_!6IZ&~BnbL?jUEJG2<2FY{<N2R} z$(^z*x{Qd%?Mx5*^KEwf$2e7s{U-J7Rl!5AeHI%iz*(m6b7x(IGKP(q8hUuW-El8n z?&&Hth6`d?2zuR#SjxmbBYm?Oor4KT#!b>GTrN%&aie-?@KjaX>1OLsDaU82)ubHB zf-6cn9`AS7rebMR?4IQ#A@@Wg%SVn-eFQkAFm{j`ZEO;5<MNLTHe6;nDz#Jy5_A*j zn}VYlJTDdGzoQaYn&=x>VXU8s%q1SbBy`R?%Sfu7S)a~3-OZ*9q#SKJD<wD|4?`wT z$gmk~iFc;J`Q@9C%|nJw>e>I}dH?#l&o5em8vUbhN~r}@H9rZt2NYSmza62~MpJ00 zjOPdTum^YV91S`NWa-0r`cCV|&*ln876DwR9kj~o&9D2<RSQksRP(g|Vd@*Yn?rcw zpvu8aC;?2A@uiJ&Sp&KY9t$vCQ{H6iSk@n#t-nNz!Cbh6WZFf({t%KMMy#;#!8%+# zfxZb(nel2p)5zP@PS#)B5$S^`AJ3uzohRRA>#bzS@}w$?nJjHH49rdMkgdeqlVI|^ zR(?jXMz|94u;+#hiQ3GP=%_<>^uN7ohKENxdk8A%><A3;9=0JOmc}2bT%#CGtS+b5 zLqzi?=LoS<yzmE{Bo{xmtop?>vfA3Kn>y^Ryr?<yn6=c+*qvV1*@uuFp60&DF0@JL zDZ@q-O;Jlb+uG~!=gu#@(gOh7+21-kI6XeuI@yh601FD4qqFt;<gm4jX2FXm(Hx|7 z4qxrQJbk`*wClAcs{IKXW6q0Hy#BUTzWYCi+h3FIZ7C-}nAIsk65>s8aQ+T9^Cto= zaCyXF^okN$`|sl?sVrNAsY;9ECVkG-1Au->Rv1*9*$P}?2n3M+cCO}&U2^f7j^l`f z9Zk$wQWsw3@}zpJ9iU)Z&v7n!7DWBA&EQl~vMKVbf!t~*=vFitPg(h2)R0k$V+C=! z*7q94tc9|;H~1L3kId4Uc#8VM%qkKFDDPLvb0fbR&%t2|P{_{)ml~-Bmk_&I=-=r5 z^ryTa4j*GL^-L_mF@-JYPZJODl`bT~gtWp%;tR=UbV3T(4jVH1gF<g5ze!0tkKVF- zD{4+$qI&$+pk&!*a2ti0R$B$vr*NN>{A0GcQ{Tp0yXV1};dU9m*e2TESuR%Wn4iU- z!&i@Yk(T&_a^Kc|oLJh`m%$hL+>RN-uq5R)RfnFS4HvD+rF2b7YmZ~kB4z6U_T1>E zAUW<|iY|=K?V&ms|4TYxc6v$NB@AH@AVF&`2ZE)ebT@l``0O~r&~XVjGXV0R4bBhG z{sHJwQjMu94W=1ONk}1Fl|jCX(NEwkHJ>UX&dK~G3OHAo#mV5Ix2l0VF$u@c_%3=w zOvWJe#*g_OPQBAPuY#rD@dz(G!Eq3W+|4g^gbOlgdVDOo;64l8cq=*R?{g?E<5*Jb zj7()Q^f5&taRN2Q8gUAZ8lsq2`WiI!;XWlmK(r#nZqqRiNkf>Z|F!^?@!@U98PL`v zMO(yVLi$|0SE8GI8G`%loo7b!4BEBYb$5+!7o*qD?vZyJAzifD$}RvS5MrX-z=U1G zAP47pf{6EZy2EHC0L4xpZtn_!!q1OaJS^e|s-|j|z_2T`>qv*45<%}ML2GObvXS!= zsq3Thz78!K{q~9?cKfdqs@4KYz>BG&L&2Jo5iBfGD|WY_Hiz8&afoW1vFPtU46ey9 z1r+_UmPjHC6`I?)>|*hANj4bABlRaoRqIR)erpw6v!scD?#F(59q-{_GyLHKc!R#% zPQd`BTa{Bl!Cfl%9E$1A|GvVR7N~X46gLjw$|`N@J8aQ=*bU`J<bBe-V`8)ehS6lB zN>pA(<bx3rIU(to7^KNqCAO85!^3QQ|L}M>)f5Lf7fUV3r#9rQsV8wSoc1rk*yieZ zIDRLvjx}jR@9<ItXzr8&7cml&B@t3bN`t?+wwRwYUni(ojJ#t2nv_Sch4Q6sr@*n} zjuK`qJ!55Eqo^%~$5*6mTu9+qQR!G)@fa~@2=K^wON>XriB;7&#GEJ$;J$%0w_ffL zYo>rgB)=E0fn-2(`M?_)V4zpSghvGey4tZPs%zY@VR!nDqCplYd-HW0@-&z;@TubP zZDGo%EDh$~C48D|7yyHz;01>~N7h?KJ=u`KSMzn#I8<li#=+;CxYdgXK1MS@jc&C4 z`K=#f-nnY#e~^pgqQrP-LM*;1RwKgY6JTB9TL$4RMsz7lWOc3~6+MP0>CxO^W+vWc zgVV5$D;ayt1Gt%1;xxtMi;q%#OAKse)crAW3}6XKnHn!M^{iqZcdy6usS{+}#O%Ww z*WdE7&9h6>x(!99oudfcsd^gKH3HgZ!v#|;ulCvXykAx?LT%Qr_?Ib0ek!T?m!sX? zm$j=tgq64~?e*c&*2`a<e!GXAe+Vap`Q(;$w`pW+*4dVcEh$@&d(yO(#1?lqq?*tB z1tagVV>jYBQtQ>=D0#uEqD&8FVEMJ(olb9l1qWsDI_7v2Gk@<Yt5b!hh0%?soG}Q@ z5x<kkhm-f*lG*>e48`H<T(n&sl;6kJg2qF&iH7=u2O$mx&=%#}XtPZ4Y3bK1_Yz+D z&K=I_&JDCXIEQ(?9B+3gI6O10c5vr_t=SI^_Nz~|Ed*?vq5P=MH&n-4!$);$OjI`| zy=zuXDVQ7@Hn;iaLH@QSlqL94UO0<Lq9<y79d{|NOAreX1$zo}0dW2RH`d;`&xpHZ z<Am6#nZmfqGc=*;4hZ7o;mSjdrO6RkyCA4sf?5D@*wA?*W=n1+JyiQ7T*cy&B`uU# zaj222POc*-(^}c3;*YJCr;k;{u4{}^`yfY<KwL8BLbT{E45sfg8KrMgu8dX?he$WL zbULAB4+*8UMD1NwJ~HXSL4abaiV)c}K}&msi;F;6A+!l^IOp4x=#<LOxJgB+-*Mxf zq*YYnuTiybaSv9DOm31ze|Vd=1oRJcaQcCF?&sIt%Vt4+?V^6Bl<ZFIxny}j8G*3V zAXNcEaCsx?6Wqt=K0Q}|ZAk&#faI%0KN6q%oVs6vc5j9lji-ihO|XbH=4^#xV{wPn zpnRQblU_c!x!9J&dF>NSx(DmIeX_rk=}E{4N&P2Q-JiP5E!>V$aZXk_9PyDmp&~wl zfhCa8csv1aI|ViRl!0Q&;u_&O`R9DZe^bt!HSsy5!vWFdN;!q}^J9)A!<NE<0|NGA zYwwu)U}v}J?&cIpUf$LP^n)e}Jk?)@s`Hr^&t46#$CM$DNobljXjv*yhVW`i-vxD- zS`nQ9_}H?`0>8Ho`-sB4wfA-0dCyTvXd%i9&#aj*RbYN{a4Do+suyI+X97&Djcr^U zq}L8<z2{D3g#tS|4PT)Z&o~N-md*==#B?}18+WHY?nzq0_2MO%p23=9Lv14Cf*vM) zp4fi_Llhp7r|j0?q~9I#6y*txd8AWZSZy+86+FQ3RYR~2AjA1mN4XiaTNXB2lf{Ce zvvnKf8GLa)h8b*1FX3;L8l{JGkONi?n7tuh68#6@Yg!e;WaC1d(9+@q98uY4yGeP4 z+a@Q<-wYA)#%cQvb@lDrHckI+>n_o|tBv{$6d%9auubDN#=Tg8?CPBb#Js{zBwQbr z$|hzUN6dzpz#SQY&jO@@UR#}GHQ1Gz7cR*&)69Y?iB3h@1GG#<QRqj!I144AyjAL? zT!|3aTvbv+n&$4X=ykeWuttnbciUQ~BWP5_TR_4inT~JZ-GQn=iFlO1rDvf?Ii9i& zHsS|G%H~-;;Tx%Y$-)GTT}1g*INcMvc_+MBi%X^SOH_)XV-GJ*lsK90J_=0?K%1BJ zUF8Zpp6Yg3AZf71v0gTb_c4{y-?y&s55S$}AheC<0}4Ss26f5ReApe4-+II^)GW>O zwbcVC#(qw@BO|8tRaJ@yYAaK(rvj}b=++f-ePs>g1Y?eduE4QDB7Wc*W{HS+30WJL zPI~|QL7t1iDV%5zItq@fCH6V5E|)%s{Gr;GoYAV!g{O|KMXx#tL1V8bnbc~Ph_jsS z&1}p}$adpxH9!ilTTmZr3F(rGq|aBc#YQX^2lm+P75lg<?>hj$hpp7haRkTnGbDI; ze^4Hj8fi5VObR;JXtgQ=QYf|{=pxF4MzK4b{1@rB`nz(!$&rQ>#|?b`(38>@H)-Oa z`erOnyn+K+?kqJdb@WyW-EJP{p@bgX(w2&blNoN}47)U5``u^!H3<+P-YayVj1MU4 zMlj&E6gpG^&L3NeQp6Txve)e`GMx>IJBXqhAu={%J#JN8St&8Zn7k)SM6}NFs_|TW zdFE<C)47qIs6g=rHcVj|HGARkiz{HA5zW76(-yg!wUXFC-Y!%2&Z<s=v?ON(@6+aH z{PJFYZ<hgD*zs=gsh|BXC393M$(An8n*Y2hdpH}<y4N+j61ZH6mBg(v>!$<%5fwLD za5b~-bEsj9jbK*jwpFb|$@_4vOr;r&uQVNm_Gw29zZ%`3cC|+m2A`<|CxUx&9rf-~ ze|#r{pA{^=F1MLIWnJO`UN*jwyN@0ap;HrxS*ZLIrx-mE9`KtNFv1ztfe(ZY=7x=m z3nRAc-OmmT)<s=JcCBl!*by^#YfB)M+Gi0FOb54x?RYzN3vY+Yhc;J0^|gy{x)lMs zmZ7GI94*Q`V(DUo>J}W_;Iz7^_^?zFLQfQRAu{ZCsIh3*(O4|E)BCQ}Q?c`<v{_X} z6r(y7#0J*$8A8qACBrC+a`I((HoyE0OcxY7OEUVv7nwP=>PUSQm9@gmaS<q?;@vN} z_{--;mF^<xv6Wv-?!cEyl3n82wh@Az%Z>^QTrSX5;eaKPzGKjgz?p1#;!I)m<2l>C zo?La$`as*Df4Qm3RjHb7TT8jDtc4XF9st(UlXeNc!Omedu_ciEyq>j9gUh08ZVe~Y zZ>vHJzJeu~M%R+aZ=e!4Q<9v~jL^IyFJl_4y2LD=9CZD7xFyFeH*&B{A<I2!)eiff zqYwGVZ50wEdD(=i5av+cY*!{gZP&rW(ulIUg<5qeKCzj_w!|CR#M`O|j*#r3cn#s+ z3aN?;#E(jXz9Z~&9SB__Bz}Jbq^17q*TDNAK}XK_8faDTnlqbgOT0+>+xA#3bfulU zsQM#L{)^1Hr0YfJ*BE8d31=Po&TF0~F>N~6>2qiP+^Vzwq?}O&J3}y}8cZ-)5T1)x zh5!f2?W*EJf(Xcr)aW}rqf%}?VQN!jT1+eMwD9Lv&AOG|O4SJyqUx~{IQ}}tr*&iC zUVnNFa4t=OR)gUS1h(jXj%mjhZPaJ+7^iuBkW=7uZWTZ+&ljtAWd-^BfGyzonG+4| z)KN0+|KIsw+9zm9LeK<ZaM+(g__WK#nzQrAEgb0vq-|I<!_Sqhg35V&FnRg|8i6*^ z#v;}{B(@rhHC>qpr{_v<_GM2%<6AO%^%B1DFg4byIzDa~S)Em`ZpYf0=B0|M-Y(Xn z&!J`09+x&rby-rmURl&#zv|kvU8_Ll%#|}PP1RhqhVkXAvvPM5cdd|SB`EiIWx>}G zeobwj{98@qU5`xeB8XKGenstdk9col*Y1Iu@1zHpV{3~WSWH{S<(RjBAg9Sc($i46 z&Z?Qxc)GHv*2NSnv?{&v@?B3Y%F>K1GF`roCO|9Mt^h23%Er}Jsir3YRi!k1)HENc z-CM!@S~QZXsJaZWByBN9K{~r(-AOZV*;}lxSSX1(ucCROMr|#NXsfMFIBR-g<f>Jh z$-B=Y+K`q{A9?Iw!!8Or#xh>Vmhn<FL64rT(T#XBh>c`U8F}~D8^;nT7Lk!8#pY>x zg{*>JYuO`}y!?DA%A(Oi!^ML{VB7`hX(?|Sgh4?YpnOiWE(nV-&s+kZXSk>X#w)4A z=a;na5!-_LzygpSTib)_2wusfAQ`t`rq2YNv6N0zO<$<j3OZvc{Z@5-p`J6I$Wl7a zRo%9hw0(PY_kIRfiSel3E=EMx@lqu=>Pp6a`NBJy_^i{i9GzgbV!FQg(Z^et+D`Tn zDM|G4OLy_8PqA3HIaXL%XQz~Vq3%j2o*n@sI;2c-Bq99bpVWL0)JzQKEBdGZ`^RM} zbPXi8>Ku-0xb2)=4T9z1L40-hng6Yy&Drz<>|MLlAsp#1=0ord*Iwz=9ae6h_0PL1 z^9?v#f#<t&*8&+FE-&b`4pRrZderk|W5|XE67wA8Pw40zF4(AbqYDpyLr|jg@nnV` z^PtX0$6l<5@8X^8K<k**<(yjV0_ahfI){FH0DS=}dfbz}PL_dN$7I@n4?e-#NuT_x z+w==wWG^Ag)-_}qUqV={A@(4L{4m3S#$?S&aut>N`i30J2m*d>eVCmOrub|RzX38A znt*XqnJdI$nqu>?PBdPaLvUH55yOFaL*h62r2`0RH^b@BgUUX@9QCuC@f=X*M`#49 zTo6CtpHw2p)Tx1c;$j=CLx6yt0ub%>O+k--Lmk|iG5!KrtSN{PIr!`51H90w;bWo6 zppR|AOh61ph$5z1r?l%X_%U7KD%mB*??C(ADJ)dBg&y8$nE?fGg&}bWpLeJpex>P} zTGS8-pS+t*=OX|;#LMsukdfifHjaD<pY+;{VD7L&oGTv93~1x<*WGOEx2?Zt&yNld zvXd9P+40^9{Lf*wcarTK?jFB<c#=JPy$8gL7==5#$0tXJf6xAY`1&Z@esTEf)$UPs zM&t6CkQeCvX!%U3qh+BNQ3Cnre*BsuHTH0CEz>V)Veim#zfj%v-Lzk*8p#Fds*#qo zZL8xTT8gCtl^h~R^IQds9SkESv|%@>#sPdpp><@ywcxP_I>>?ZD!?(uYfoZ(7`(Uo z{)#FnQ4hQ^LD8b%HB5*&*xJAtr`-!=q1{=wb+r5P#7;7YmJTs`DxbU1Is#rJ&I%$U zs`m2;Vi3#-Rfoca+R@GR7)Xe&4-gz{R=3tF1s|e!eMF&R+s)@|NrWS405cy64g~$J zH{hUxwN~i}6CIx-<tb_^=<*R}yHlUT8me~M_Zlze3?<&;E>~b_MKxRCIxZOmTPmQJ zGW1#%<xKz>J}89fO%UNF0coA0okkF(R8_iZ<F;6Q$J{G}uk*S<0^3Vl6>&C-No-Av zRM`TA@B)WlTVoUy+;#a4&w}M0X-jd_jl1a5EycMd-Q`SN(yb}Dwb22PzA)K^lJVV( zJg65DRqBMwOC7fXZ~O1PMYsV7m968lM?xRS4S;75P2U!--`)0sC)W5YldWiON;YmJ zQ(Kvl@CQ6Ih!_>7Hi{T>S}x|<!R9B68VcZqX|v6H+p{!5EE?cu)g89jz4%4AebnEs zRo1;|*T(S5F8YXfN+5M0P*Pkj@@B#1g*#mTat>F^Od*7)NSBIk`m$-fLC}yvXXpW+ z4FM^%G~VRljtyb0XW|a3X^r#)5V%!!10+*$GC`2OS)am_b@ks}3*rYzth6Eu(C?fV zQ?)Z-{toUWprU|kuLs?;0kD`GeaS`D$&~M<qwf2`CDcbxZBq(PqMc9ShWxVsfxT~) z76U~cx>*B<Mw`Y<fa{^o;%0&k+(n}2o*`x|E+h#VoIf0>s6ovO%~z+GJM4GW`EaBF z;lJ}JNPXYIx-hs4t)PClR;^<vag=X})4s)Ivtf(ODbl^*c2eb5R#>4xN(<cTtRCQd zD$N-7rie*kqucW-ifFIE3`iLkeFoIc&43TwR_uf(2sAFjN{z9WB476LC0i)9K-K%J z>pWo#L^fc;4~?QyXqK-_77nqU0ap2@Y$Q2oR)3S0ihwH#aEY$2WPnSu??Z}Ck@B4P z87SAd2c}dJ2I>!?m8OYvM!`j5c!!r&+LI`mE8Dq|Hu^FP1Bn*{zHq1&p~YYyd6g+I zB_q`=IVQw2lRSZWX>>H<8l%|r7}K9i><(eDj&$l>ZfF!M*}?A1*YF=acHut?2o~1} z$0ZJ8r)RBVm#meQftV={078ru^<o4As5mQ6;#r^Ev_S9##xO0i`;!xDqe{Dz^2Y7z zTe52}d^B|HL(b~8fU$tkIKEujuY#bQ@hy>vRvA?oQmMMr^&F`SC*%W$j!IzQ*!>ys za$rlK*@f1+XXE$%Y6c%>YL2bRpFd$V1K(86zPY)+pwUR-p03<}>yA(oi)<6@!3pZf zXZe04z@NKU+#9J^G#E{p&F`Y!RR@`Bx^9o%($P*=c?H8_Y)Pq%WD-}C2v|%$>7Ng} z*Q~xgL7iZPD;~>C)sbT&m3J<$$7kK^lkw$cE$4+`gvA>AtQfEVzKjitK@+K50ha+i z)O8<(D|#tob~B@e#u?7Z#+MwE0N$SGDI4<y69jelJp>e@^=Q64gqM|{AifixAru(L z3b@!B9Qor9BgNgW^D*1knu8+f3-_YjsI}70^4MBYPQc_@Bk#1T8^9bIcIoQ^cKEDL zxzoDa+ie#8UmDpl90$~DqmrAnD~-rsl}!9sR-Uh$bw!=^u=@@Url)uskvTtvw#f%b z4HI>0wORVZ_2h$Ii@&r%)T!8kx=>J<L2dAMcjH{Pu<F<qC3%$dcpgBnFtl_nWG7T^ zzwb|jTf;f8KcCk$Ab!QP)Q^0svSb)tmEfvTOEn<{^LDJlWg!75ZFW=;j!joZcz{Zx zNzFNlZK_4*X3>M!A5-0<w^aVA3Xgz06%+<wNO6<C$vn&r*|X;tD|3kLK^p26P=Eza zJ)}oI5=*<*-LeDL4Tjmfq(SwPcnloAmuph7a&R41$&A?DE3?iVtUPkCn(6}>-Q=cO zM~19K086+$&XfSA{8nQ#)ya+zK#zhCRsaz+M}QJ!g|HTII<98DIVskZRtmj~a>ZG} z5F*E27u+!FfL}OQ)#?jkMK7@^grZ-WaSOSr4$Jn0k~+@&uDn>`l3qnPU6Ndyluu)# z=|WEDiDg^Rz1$%k`3vL<x)=8ibRFv{o&8UoNJ*X5C^mM4Mv3t5mUhbd3-$0J?`bXI z&04QWib|v3zgt^?8lp8l0O_u#{IvY_2&I~^&IO#1YfdT9FFlfEMx|QQxpu*o5BEOK zKz;`Vh)8XLkhQq0{t_&~_l~!o?L%1i7T#|B{zCMioURmcLTLN>b9#}1_c8b0wCO8a zv-e%}_E7qW+eN(EOZ6D{H)p#q#gu*N86$B1F9HLw&<roZ@PGIJyauDt-)VXkK>`Ef zF9QxFNw&ji68tX%rBIRk0gtM#qp2k(*1x?eQw1%t-{C<dyguV&c#e;|R5`t0v+xK~ z5t^ps#cNEV;fD6{nFBQF5?{)b`iMGu^2>=-HN_+$jUB+Y37l4e)OkQE5pE2(m8Wv) zGH2Blgvg2j962LnbkzOW3*i9FA2e7ynCc_YBwDB6xb3qsg1YY2xv<PsunqO<P!+0- zuPIik>s?QZ-Xm(=Ra7VCg7S}!8~v#ctO*;Cs0T&t9P5dVib;*?tPg|4mA#&^(+F%8 zbk~4_S|wTQ&Q(kGD@OcJ@g7-RlEBtm3xl0;n@DG;qv%x2z$~@JPQUhrB~D4PZ@gOX zB5D@a+vyIG5#XFu$yN*8=I#<-@sw2G)%B(%vMcEa#;V4hWBH;@yw{~!``5;fs?K@! ze6%r`uVue-nigTRW+Jg#HLZ7I)l|<Si(hyS*I_>Jy0jK~U4lRE_`FmbyXx*bkd&7C zF1n99X`afYB_*LadhB{yj+z>dTB4~du<N};PoPag0#w@pKeX;oKD9soXs}n=(%k9d zPCrp2&V>6<B6nc#QNg}H87xl35!-nNRr3qb&a<2Zp#0g*9@;cBE@;zWn(pm@{rFpJ z<gbeR@tt>`b>hM2RG309Q!1Jvy?+=dAQV%3(8=!ToQzihj+A16ga7Z4{ca(Y{4D!0 zo?iDN)3Bq8f>Hc<Fq*BQ?*aa??oG+Z*BtLpW$S#Di8o&2C#NLGIMwxfCB4K?UaLC; z2>rULT3_M1oboEejmmJt8Jzi|c)<Dp1-wbF?psyucdGQa{NI)nZ{7am8=d%o83H?2 zG>yfK4aiBdZD4+9ZN)`#Fh2(PEgZWBi8e`lNAd3je1iBrK?+$a(npF%Mz5+D_L9%` z<mhpx49#Vw=vb{wDs?d2D*N!nNUwsBdfm-QKajYH_?>Yr*{EWDxw7UBS_=Ygkk>x- z6?@5zWlf#o0^_2w6%poPBO$()^~r<2)dBE22*(ZY%h}HMF>5u(Xa4}zLe7Ud6dp`* zdt8lsxv>#4TSr}@sRy4qbS<ViGf$cd@J8axp*t#gP9=N%TxBxWPI&Z_!z%TyOFe_f zSq_RtL;5fPSOb$|jf~iVZ!|TGGZX-2AA|)%-^0Z7AECsqtk9yf!oXChy$$AMp6^>* z;cU~~W1Y~UDOt-JM|xWRE6_r4Ks7SM7*EmnpR+n2!QGJECM2!nPQ*Fxo!uOa5e%9- z`i&6Oou|i5;mAs{+mCJ8zt}QLM~d4{Wyml`Lu6sKD64<|qIGrf@p#rd!@O<d%7CgU za3O}wz5Y4)l2A~0nyl^srb6*dTQhGE7>MuO%YMb##dY`6PAm?^X1rBByu~g7g;4>( zs~%jAxLFv9CPX!Pdc)ITX!0Iao;)mzpv?d;lbAii1A}%!7guTaF#q9*_kb7*^%8h3 zbrV&NA_MH^{_$iC-ljx3f?mH_uP~BG@x)jreIQ+tt;&Fq1%reL9zS{ao|aj$f}FaC zoae&;f!IZ(n&}|}fsu0A)2I7`k=ZaCRo9$K#V6=#hG|u11*@Zq#4xx!x;kx|_CNoJ z<dN3*OY_HfU^tVbH!>*PU`u_t8Uy#cQotX~DAakx>P%5t#L6jNCGtCM9b@>OS(S&m zX2!YJHT&mq=x_w8g!NVO1%vqkNeZrs$OhSm3r$!VDuEA?8{p=kPe<1<;{!!nMd2W( z&NB9*YK3l8u2kSVC1F?C1FEYTyfysMo>^$fZ{4zpGSNMT@HCVOtZK!RrS-%L6|}TQ ziaCT)cx>bJiZjCJ0X;QX|0MTZklmH*+#mH3mZeAH&^GX9E5>+heW|lT%{>Z9bc4~H zl+_eM0|BNB3ItIh%U12L{Z4n*RS78my?MiQzuhH}iO4Jvm~p>HfHAa|AG!lJFlNf2 z=|@QfCgiI7-uf<HU}o#5Lb3^oXKgK%fOL+wU1nQv!GjHsp`!&`w1&Hcsi(&}vTz-n zQ@INuHJ3l>9&;N5G^JA=2C<^k@2GSzwiCUeTe^~6y98!57|(MMZ2BKz!EpUdb*i#f zn>&Q#q))kNlWCMn=2?>ifx_B9yCG?rgt{(1NDg}Z+`*%#vOf*-T`Z>r_?(`D;qrY3 zns-#wkH$)#<)LsH73VoOg#ZMpKb(NOBvs$)=&92%NqHvcmZp$q9k$76KA~mSkW;X* zy>Xu(NiPP{x|{_?$KV`8Lx3h}&MyVRCek!@4YAd@&<OXZ_K(7|;SxBP>glr^A}PMZ zonbSUXlVK-<H`J*wt{-5a2lauBJs9?N=9T<JRT?{CeV6JXux)?(CFK@{{2vS15bS$ zakwO2>z%6M8S&fr{2jus0`TH|s?m*<LWAznaV#0xZP1)7-qdXXJ@egKE1?09joy89 zuBW>93|!XU=7U@|xmm@K*Jc-w#1a$^@6_~%(MnJxV@`9m52k>8B0x2UX(OVM(b29= z7SLiDy@>5x2sB_zkY2?8#J6|&=YIyr-?blp{4t>`mEAyn4c+xGV1rGYq8p$XSX*6P zZG8{_+bXVPdxt_4dnMsNs*P{qXR?M1G+2hsc0;qFJl{7~zf)zu(@lK4+F5<vD#Ic1 z$VgS<k_Uf_`gc{RY<nkC+xE@^)tQmI6`Ie{Dw*&)m<cD{WKQNBj!~*?TnrnP;XSNU zj;Wjh?(|ORM4lmKim$hgRqW_cLf?WY%za52y8dJA4MMgX%+#4e=Gyv{@G29m+-DlT zo-sN*$lc<I94blP$KXRyNlMy^jLvQ^uc(p4Vuchpb6B0p<s+WN=RlNtP2tt;_(e@7 zhSfLj*VVu*TH6t@mIe-1#FPxx+=CHCGzR+(3bq?zWg7NnJUSZ#l!9kX;gyd+>){}D z@qd;ftBA~<8Fxx5tKB5lM{7HT@=Tllt|>JqUs<8cQa%Q#$o^D6xoP|=6mV|5sf}`{ z!aYzGelTvswZC<|Yi+nt=cRksHc}cyhGqFiL(y1SYy{pp<c3(~YzMGB^LG?VugIIX z2(*vVJZURiT=vOs3!(mE|0Dyd@y;j7RRu1N6Rb`wA=yZ_6w#KDtg7ixlKt;XvP*dh zO#)4%c{!DXlV@;oV`D0&QJ?r2d$5-MZEx#qSkYi9*H+tAKrg(TPh?C6sf8YGP}fsO zR!K-J^ujBI5`$tQ_bnjI*ev3(m$)9Lq!)}*_Fn-jM!KF}C)CnPnb8H!0#gGDgz5FC zow=8_?ADz~{kDcZX@`#Tz|)TX=O+DF<ms~21+bD8bPNXd#A@y$WLQ>XXnv+;F1s|W z_=-OCI~g^ASnR-9Sy8WI*<s9YZ;6g|^_^%cdC4TfE9!C;XR+Of%L?mVwWMQj7q9^| zI(SD~Fn%0jUhL`^_?vt4h*L^r&r%4$#FU$w#l^+M1({Dz0q515(CECERfB-D<qPAE znP=l3hO8>~yLvdPJlb>(RR$W27-%2|r1f)#DAVu%^T^$chC0a6De`@vhshD-{Q0SK zg47q2lzTMvp<N^zZLC%njY4r_!xe{qckyRqHGS;bEv=4Iczzjbb02-<R)!$>wP_YJ zkT5hw%qKlW;Gc=3jZQLaFwB;M;~8R68FNx?tZ(cq@TmoTAs}|j%;{pUf6;~D4ZD6% zQFD*+&EP5g*8$mkQWmGnIBhLKy%KUP@AtL+26ecrdxpI*-8y4CkepsClw*|yuizI0 z$NwNO88MFhGw1wgQ<6d6=ChK_NX{_45r#Hpqy)RE>_VBK-xV18KasoCEMS`wAfYaY zTBfUr@gpcy33C>;{KAK!IKN|$`P%a?DTcEwJ1HIW_)5@}B`zXD;IuWjt)GxT4C}eU znFuD>&4PA}sUXtM&bP%<qu^P!rU%iB$pbJq^oifnayxsl9$Zw~9=X|3wTe1&F~7b( zFrCre0<+#|zrdF4aAy~A*w;GQt3wFwv3L0LC)FFlY&HLTHO}dDK2}h-rh}~_q+I{% zCc4O%v6Kj)xp`ZUqjfg~Y{@)%5q5w@PBBE3E04-7`(v`}3sQj>nk$J(j&Y?;tCy)t z@d?aq#rDCde1bLap+7`re<@F5HPHR&w$N;x>>j+zUcZE(E_*MZAO6JA;blYoOhAxX zVVd5Gt%BY{Pw_wYX}ozF)bEscC%9S1Eez+pBEM?+GOOvY)Til>NTB<J3*`GhXRBVC zE7T=o{yIeEqT7X%YDlCZ9^P_pFjA4hqH#heV2yI$gzNV<1g+6##WX``oH2*xLDK~2 z*{m<EjaP)EsKOg|&l#}=M}bDKgVDTyK$xJuokieK?Dav8Zx*}ZS3it`0Xjy*uJn!u zx7U%E@K)ps5#<^#0b!Ov==*2-dWE+V5;i?=Pd4StZ_q#k;vpvps`{}UbV}-j#5o<! z7d@_{IrXXS4-&Ol7ARd=RHJS2couuhXR1ma)oA)OQ_d}oSOkHD_M{_Be`_Iw6nBSe z#qof+4Y?ky!O_emT2=13rt*00YOV@u4OLGt1(G#e2VP=oi;S^Nr^$HQoesbTYvCb6 zF?MD0jF{8oxMROHBZ2Y^ZxL;o15)~|{0{B)bR`9imM+_3>ttlu;ze?&c08>+`qGt@ zAEJU-@hO_j<O+K+=3xc>5KUC|A8}5K8C|U6q~QKg3+WH3W^1v7!k84>8%E5Ji0Xca zS{2?{?j)!OCy@~Y*vlp^19*Z!N*F+El8S<WIs_-mggfZgIo!jb6D0J6%1NWa6yjVg zkcO&-J-{P%S&@J;9$Qa`aA}M-tF?gfPv4gdv>ni0k1b!YpL#arkI94_e}LKpVtIT( zeT}0|)SAB@*=y$7a@XpD$o5$R*voquxjg*ZKhJzU%&&dO2GK&~wh9Vri#hU+b1Uq8 z{IB)zyiYgbr%(U29yBoQetb<zz8!Y{dQ3Q>9|yzvQ21L>%vWtZ4c1L$?4;04reH9A zt<73F2q@0fWK0vn8pOCAR7%?`y6u>#iSHiV4p#^5vR<<<=rE<@l<EOb)E-EnP8`JL zm_oqLFD?e>1NI-gK!|FT)!5<-VzQz^{TN&nFXjxOebr^XpfkfpQ_a&vRL-OXm1u3N zGlzti+WgQr;So4)oLQ1<xUTW@VsA=+juW&?&9odzTvFH1n{H3PcXmh0sFb^m>gnTI zf0Fri$OeGJbg$3J3fjg8%CS^FwqvrB&i2+rrmF79qg1*EkyiB@R|4m&hu8pv@VKr2 zvS2%*!Z*<SK{ot8H|s|x8A|rVLF6hhCm3Q>cxMoVY(BbE8NriM2(2M-2AJ<782-23 zVt_TSvxY1FYC)XNl@%^bs%^vEXlZny8i!6{PB2pMB^?2R$f<-TyV-}aLwa!KVHyY5 zoH>VMwu|4?hWm;D=t03Id-Z^O;~czI$Vr3L>1;QztooHQ9(;fZU0$_n_(Dv@SNfu} zuS&N+*Jdjb8+U(^Vqpmpn;}G`353S_WNjDtfuU@D0T7g2PQL@^QOuLn7w*>`?V2R5 z7d`1Y`TkIkdrr@i577y&oYGa|_94;igkz{hwO)}&ptqr12`)-Pu+;9N?0fqd_i`Qz zn{M+`|LCUtH5h(jyw8Zp*{?5aO7o<6+`<GXAlzLnwZ0r@DCZ&;4Zcu<QsetfyEPBd zt+^UPpqA;cyPq^@4VcslkJ75WbN3SK>%`%toSJmqg}tk+`TPBM`{SZ5{`ilzuOGJ( zFF202z+8aRIu4WHUeg;!pV5e2rjqKR>K2J$hWKDT6N;iv@X(hTMM||xcFXR>QoYiG z9W@%J<@Gj+P$TIFuk~?Fd6^#xzl#{G7)E$i00Tr*0^GoDKOo}fDNI7%a@;+_bg;mL zA<|##=C2L&*CX@SWAoP!Z&N;cr9LgFr+_@#a~_aO<~i9HoOg5STT;$;pr&nZ&70Ud z?;aIRA!8*<U#Uc)g{>G_6#@S2?3+#%!0nST0DyHe76=OD$>0aotsW~{JJPU<lsA=p zgT&;RH@j3E3^v{ILuaU%BLiV~1XpAQCD89Vc0lNY3=@SA23>)1Qf|uaymhB7tlfO2 z(QDkfuNIfOLN5Ygu_SW!U7}atIf8XOiuLarF0j4@MyY{$jB!*5ZY1%-2-*rZ{D^6n zwdp#%lBN{SWPK*l-@mW?&vh9KU(qG}C0M_CFMB`eX2(azJ|p*!+EasYehT_PTvwR< zHpj!XO7l~=m``U1p6cAwdqdNRWC-O&^{Sp&E55U|Yy)+u^0!qVySbuXl72-)S%)h? z9iN;Wv++Ls(ZTMYj8Sm|X0mjxv7V~ZLpHk4wePIW7i59^11iXr_k(q$g}vH%e$WW= zzaL-E`T3gjs^6G>t+N{D*N@%8Z5Hzq7+R1S;5&K*H>0wv-&kPSz3ztvK)DCzsG<S= z0gLoUE3c1ZBN&`J1Aw1lPsU?F&%u?joiU#fC(V5f3zn+stazK3qAjPpt>?1MlVk`S zs0XCPww{f)8D(4by)C-eirp~7O>hi2mA%+5XwcX|uQllaUQnY{@T__*w#Tiy(F3QK zH~7j*f-opM*(8IDe9ZKi9E*d;4*IHJI=soD%T@Dp_R*B0+?|im3_X5;wBH*Kn=78p zJ9PPSFgm>0olcQC6{WUx>~di-e{lgk^YmjoyYbq+NoIx!^PjxTpT0yVKj9VAu56qv zDu~cZnG7`jQNtmgHaZ=76+&ATZ&}gEfiCNtF(2}z!JalsqoPqKIfM-Bs5@KJ<ZVTa zn+lqXnr^vPf)CX-6V)#L3?8OCGzE^3B1dUt-q5-pbL}0;nb0VZWzztqDo(=QQEUoQ z?Zn4lf9y0WcjOCSOZUyATzDnDcG60(qbYJ<!n+^7O_@EDyu2GVSHo?$)d(aNSjpT# zR0R*)8Z;@ey_eh*UThKEtB`%h%e+=^u4vw7IVq=g94@E6A)8z8tV))qQa-uHY6Z4q z5#YbdHe_-L`n5VX_SidlIo^q1tqXhNrzRiXPJe^#;`XjP8;<h{0(;?si0RG9I@Ic{ z*NEF!FEP?pe!P|thWLCfU+d6wSii&eU^mnA<{7{_pdAZ`7#cxm0@Xg9Y>+XWvChYq zKKbJ5Hznzx*c7?QMZ{9o^RAlwHHycnKZ6WN-v!!VcQUyi*pMsEtRS8vyhDx{&(`1u z>IYAH3&YoU(z1Xd1i`gk4LJ0vemhfu0ts^(h4H4mgSZL>RZ5pLxXOY;BI4u{A)$`H zjqUgEvdDq}PO?8^)!Mm9v~v?}=Vsw{J|)`u6m92IX**H>V$`K00^EIV1aCX~`@m1W zDNbH+7XUg{&5a=DWZ`Xq2s%A5cwjK(-azRdi#CF4eLNv64FkGOy)nDvuDf9+3s>bH zHbbPD*j_+<ahSav@4($N)V%0*LRteGlGz+oi0FJs_Ah2N2)Xn6L-!^Jf*^~AJRa|> z-qwory5i3AS9Ewb7#ZN@voQukXTuEij<_cB7@@8oVsu;((B(Op?{@)fP3dOOpaz0z zL}L;#GDE|X8N6hH_0$+m%W!_k!pb1Xpi8oyJEX^}e)s(ikq;t^`t*;8iX$>r>)}HK z%B<+y&b=gG_c_5TK3aW8gCH`*YE6sQ^ylg7yU7(As(e5sbKEFXc(^s=AT+5DXe2cz zGetd~Hg*N8Q1F^)&NM)C6gY>bZTCEahOq}}s|qE9z%y>G`&U@J-j&55`sj8I;Fhkd z&~-zp8?L)4TjWy)J4Zz#Q_f~KL93mn7V%@D!dSe1^Kih!e)yK+w!+<sn*(2-Y4@n# zlg`2{2(Pm2Yed~ux=fc!Y_iR3GuwW%v<{26>D^1>&^D?Y!48c%c@T1*!jg|4DtI&O zqq?E_aQEow@JQQd^HQ`~tyal_f%MN*s-qUA&~28l<>q1<La>n0cm`_VbJ!a|WmF|& zmBY0)qM2%ydgvBhn*FZpfLLHbhIW_Tk@meJ+m{N@2i}xenkk)?(m4SJvd;%|d?Gp> zZEO$eaRb-r^c1UA!jV*cMDcwC0~Vo-USljmGM+-1Je}*OT;Gq&H+9^<L~*s!*7lBS zw^bPO1||Xz0~?>hm~|Kk19lHX*zAW$n=^dWfujeMjrejA1dFK(^bo|-akWVD#$U(f z*G$$t>Nr~~LSm5yPV1PBx=N%ellEAW_APM-D`2QZ2FE@`e{Z%TMU=YR&9BroZp5J= z-cZafcV6g{>uCA#CS&aNJ$0Vx*F2>{B7W>m%RDk*uVOX7VR$01p>}jiTA|Z2Rrpt- z`39Ts9pQv93Iz-t_xpj0?inW2p2@EVmwcT=kZ3)-h1<4m+qP}nIBnauZJ)Mn+qP}H z`<`$55ALo?)lLSf$|RMQto6L=ZRG-B>MLMUZx@Nc@LuE#l4C|iLP%kCGT~bM?I*~| ztwdTVN5)S8H^$ZBld*xGDs7laGrnng5RR2`%#}t>4lhxaQH{I&?*{O4*c{q&$e{$X z$S+Zw!QVfWPck7X?O<A0Fpi*u3r}FnFP`yG=2U}bs%Ehf0$M|KdGHWPIRr*b2YnQN z%oW^vrE3b`Fw;-T16XM3-U>QunxK{=p>@`I7qVzwB?t$#4IQ|r1_+?E;P4cQ`RvTf zn7VdGDz~WWhbgMX%;JL^=dxob$h7=KcBZamc|M~UF@iwfp!Pm;Kc58}zoI%IftdMJ z*?|=<z9l9)<1_b_=$+!7Hd(MlfzDwG7);2#h;pNwwq)MzIj8-B=?KhJEYe3^s0rEM z>L8(q8!YrRQ<~@BwbX0o?#58ZSPo}Hr2RvZDyi#u@~9OlYZee<AcGQVg`d!^j2l=o zQCJK!0aPn&(#S^8PJ4aDPq+!>3t`7Tk8fwHL^Hvxlpi@3s5{IoPihxWu9q+3Yg9l# z*Y|*Wj<%h0lMHxm4}IN6D=eP{vWnYm@;273vK8F8n7)kes}Sj#edLHp<WBHA@nJaS zHRHe6)<J!KoVh#B2wq|v3HG*)+Sis2<LX`M^<Rv39(Mp4M-zz9ebHQTbU#iYw*oI3 zg4~`yJ59x=Rk7_wLQqQS_#9tTf{(r4mXH&5ll0?KC!5PATp05E)zjXPeCem~K1s?5 z%FQs=(~18O_`4#K+U@Q81|pcaWn-dRS#geH4mXKN*v1I;wImkb3|&DlQpo!`&RZp0 z=4}cICas#SK44jrh+?fpW1rE#3`0XK(IKFq%BCwX85L$-Xjbqx0Q_C+D=ir-$XKO@ z`PR%X&~zJ_-a^Z#-ITUO17UX-byldjK!}AU$>o4k2{Nr%jP-I+&bG|Mu1S8$3A8>2 z8$~*ljMI!>x4<o}IVi>jb)}ITcZJ4QC#$BP+;<8MC{VbeuLaQI0jslCELi6p8U@+x z+IAhx6aZZBzCUaa1o+hRb)r~yxbXPLvdrlfctmSz!=5`V0xe^%bz2_21t}OVC(CS; zhYbBD)`71I@X6~aZctsT>?q7O8bOX6*Y8>UC;-6%g%4B!h;@hsrWVpu()ZgmqPLda zwFR#S4FyCDY@jIF0~r8wM{a~ypVPni%nCz%D&TEwUluhTxz)(_&@WsneBo+iv^{^+ zI`n=#t~*<;@<!LdQ8pM<cz-;Oooc-OcGj|2d1N_<)u{vx^6ace?dD5%)8Cu&<?W7H zq-p;8MO3DlJOC#fU2Q^RX&_|A1==ch>;%AxO=1n*jES+nVme7Z63m38(t~VnDh`p( z`C#1h*0Z2|Mu<v_iPP*FB>tm@L^?%fbu{}mbv8e~UYT5;rEMpPQBy&CG31>i%d{Iw z$X+KvJxEHh=?+!S6W-icjKcX@0~ZOK`OYr#gJeM!do>*p#3JX0i6wbtcrJ9P5RQ7s zSDOIhmgf>DU-aFRk#$}7Dqj!}Hms@R*|L9-saXJCz(5a4`(J2`o0zJp^h9&rW{o7N zjkui!RX0{){~(>6^SB82jl|I@3h^ZS5cihZ9HZsvd9MfLHMP{wXUI3;&s#_~^+ynG z*p?a3OAavha(=(9c)^>Xcmx4W`m_5YcJ44B;ijckRhdzBfv<rKnCMUg{d81l&8#EY z^lk@ZAf%<C>lfpB(j)1+D|GQBWT=P{QAXd28Ve6==5y;pmVurvp*0|#k7$MYh)QYH z7)J=t1^e=%aZ6qejQK7M7F3n@Pq=Zi8I6gefVJ=u*)zRdsO;Ce;1CXr2bC-KM;Fwc zvIp{6Q_Vc7>aWHT*7aiyfOw4X!k~Ez;>muIad`g7h3MJk5}x2AaZ^b^s7-}t1vP4R zmb_IGXO~rzeT$6RI(chvO(MS@?S7+kEl2Apt_Rm)hN~fPTSp29|CLa$=@&1S-3>^M zde@svkgE^!oT67!C(?=veTU+vJ&5pV!R;HcbRaf(EhD{$)%f;paC!K6E4$(s&$n|s zX5Ec|@Vk8yq-dKVUck<S&7BLaC}zaWg?jIAqb);6fn>?l6M@Vvh~pD*#z-2f5g5Eb zz`+m*VUHcwnM{%A!uE7(;nSjIv_D9v(O-uLIxHU*9(<qsFbWhl@xhE7t1n6DfY{9? zL+l*0A1>sOlc}zk&Me_XOI)mxg$_NSggwz^&9>VBNz3KMqUJ~bv89P_DC$V29)#c= zCs42W^DIsk3J&nl6}F*pVi0T(@L<WlCA(5@`}nW;%W;j_KDk-V+ys5PVee|K{?GOC zz8yXGa%N27Mn@}ao?c0>K{=uZuD`oW<#6}9hEQELlwe2&v2#>UJ6n7VhP}AbNEKtC zUujX3>J<|Yg}+$%2h71V==<tePv_a)&CzO-xOD0tPWvCozx8KpSwl_@gQv6F_o$Jt zTG=CIKonj5Fk|-6fa1B~Bt!Q)7`k1Eg;8l?-vv;6P4sh2deG7lR8VjJhcJm}U!YEi zIkpPqGmJ(jXJtb(sQJpw-Wc`ie5?J!#v!rJTq?3<#)ubGh*k|;xff6>i4dL|F}4Sr z$<2WqeiGV<JQ~ECktikU%eqju@e4<PG7J^}a`)vQ0S5$EcNHXDp<t*0oiM>(BcsR( z#Zut5tT<InW|TUAVY*rVieFVMN=jfQFxX}9`bI(q)fmu3u0kfB9?`~iT~ez_4y?|N zkA3b_mEYxR<5-D74shu(U`APpQ_27Uh6z=e?n%yxB8R?n2Amm`6c}kp?n4N}8)&8x zhltzO>_OqTOOz^KoDCEIh_>e<zt)Z+z`iHy#ZWN<*o^xqDkVhdYdXjXEHBsPP5=U2 z0s>1t&{kj15P}*zA;zenOk%*RsL-cNP$|jj^jRs3q#nq%PINRjtp%vws*DE>;!7y* zR))}(quh1l1l3cZ>=#Zbw4CMNl}9;j2gCFzn6z;Z3uyzHQa6kcBVTd)$FWw3RABB5 zDy>F*yP$ueF;igB-k=LuXZtt9dW5s{i+>{oQ^nMyB~RR-6>a-Bq&ow`ph`o4tn_o& zI&SN|q)5cw{P%u45EcDr&BwezuJK14irB<q5VgV6ug`9dj}kLtnMqFAaJguDkt6w? z+7)=(a91V2rB!ZEY}ILAG@mqBYY5L~!5#7w03`7S6cBLlE=GV;QLh_p5h)b|Eo-}; zOD7I3jVE2(H(yD4<uWfwxx1futkdAV2-{K=L?eu>MWAL&jCu4E)l8n1*ZyDmoQ8#8 z4#k4MqsBulaEREWjf3yjOnDiFMfD#D)Vd@n<gmKbi%jr90*Iq6@})toDR`qtUW#oD zo^InMdl3NCv<%^+!wc;96VQ~AWCQabhpnVkbQKf=c|?;IW->?1|J=!{5F=Al35E5< zd;}o*nESbBtVr`)tcvz|!bTd!lEZ(YH=WlKT1=Q86F44w=gu{TNYS}?pYYoGW3@}{ zB3*33u&FyP1Cc*xx7B-4A?QacFj1nTi0jrczmdEe&BA`NuD320u5Vj|jD28S8+tVl zPbmOLVu_?W_#a&9HcLR|E8K+B>|gV%*)OCOS|Be*Xe`ZpyVtnaRRvQ$zsFfY1qt71 zb|&`Gx@)JC+vJyroL>U1kuV-!44`spxPxvGCTy#IN*MV5sG?Z(Uc5y9mY{|?ztqVc z-c6(a0VgSYRzq|Tcu(MIrge2YT1wsID3A2(fDiZa+mgMxS6pqoWbUu*Y~F6EV470K z^5n2HQ!8|OnRIq^Zi@nQMz+BEv6g&nm)xQf$f8E#YGqPjaj_)*1aIpIYKBQAyJReX zl}tA@EYc9(`p3O%sP2x9oO*x`NXd_13@D!2uiQ>6n|+OSEm}U%NG3E$z%*EbnEUvl zv?6Gs4i3EY-5$++K={U&DK7Kh86^Z(8QwfGZX{*v{*G=OE3%5j+Stzr@19xtS()#r z+_1QAIcy|ybZ*hh!)dwMAdzVlCTXH+K?oGc@n=O*R6gI#aJI-2=V>vMn$^8Bt#1&5 z?>s&HLFv9sX(cQhr%INk1-k&%;7SsxEdkVH70`nHP=2<*<FtZN5x-wY$1NUXujL=k z0}&nf6VgbPY!&wlXg7A-sG|pa`ukMlx40ry?Gug`(|$W2Fj{ldR8!oi=_Uvcn(yS! zo|V+{VdgrV@P@$)CSq|zvC)dD@8%~O6Ia@puLX=*<-RqfhCv;Q`*IkV)8~2>H`b>? zX$DaMmvgjUWCZ&Y(EYTLgzsmq4Ee@?t>0hs)7?)hgh?&j`-74b5{eNE%}XnQ2yfL| zBVF+-3fIWpnfdamvz0mr_hOa&ItrIkZ0lGC!HDPVo$dm6>J1<8TnB_wQdh>W^s2UB zORlpf^MDE9>$msD`l!Pjr<7wwE$<A#7>j?Bg}@9o(9;5H*)m|kLnS|J;)u8@%n$<Y zlEXFHl}k^O5mC*nr~T-<!fBtF@dUf?-l=m?TPGo(%aC>w?FYI)=B2C(=$T+17FXS2 z`g7~nf+=rw+=eg_VG6!lD=E6M9;a%rT1c8lr{l<aeRINrhf=MYHM$iU1c&`fHUVNr zj)@kDNs-e(`PoUOhV!SxgL4_5Ov+9$8qEzz>~SA6Bw?RlZe$jG09_6r#6a~kaY1rW z$`2ItuMh~zGlewD5BWe$hsYsHiU)pQ&cLKuhk(&PLO$D`pb>IU7*YST<Wlc>>;qr= z>jzasjCdtTQdi4ID|+79Bk{-Aq46{4;_f}P{fLX4dlk|_*WoJq>^usvJ>cAgG)}L9 zX~0?jDo~TiBe=70TU|+ALT~pQe9TSs+@Js)`YNzHq@dwELuPZ?Q2lD2QXIf#@h&eu zwzas2LNB(ANUKimF?k$bYe5Swhe)UT1FhlVXmiWgv&2u}8E>5Waai;7jPbpf&2_|A z`@MzkmuJI$TV2g4c8==%{yg#f<+!ru$9>1A^vT!$KW_PW`;T+A@>-O*9(i8JxO`6P zikhE2mEXfy9(Km(eVkmc+G>t3uLCo`gV%GB^=WxhOV7*LIZ`xwDHdI|yx~ZLc-+1p zn_6B|BYtjQYs_=m9e?`WQ3Uh*T<g_1)o}=>C2+TJ0(l*f0<qeQ`*a5Smq^lK)l1ym z4*caDlj;-3kCwLh^`LS-u%Fp#PJ5u`G~WKNbyYyB@uB#|F}(eOfeXLEsYPg4%9!t) zpxi+m|ChfF|Ge&`ua5p{u6dlr-C9g@GybY<D7nV?;WK_tfuTp?<&`)NnQY+1?_d$D z)KKCQW0n1~CLF@wI&=mN3C&@{`6phF1DIFvt#SI#+s^Kqu$K{mAObEx`Fqz|XxRMg z<ACb^UVuW$JK*7~_CEcD{r=v*T@qp6esnez8~q!eq$|p3g|Jn;RSz+Ya8Spt$ta;s zB@Vc@sa6)7D=|S_x%92em+i;=70GLS@d_!{Qi;KWK14bd?Pu<4w-;XAo+89ru+#MM zSBvFR<z#V~B89p>d&lqgzME{nfaC5#pvS-rP_TLnt-78plH{-U0e$a~#mmn%ZGFOj zd@Pjq`zK4+y953WchDRq3jBxEpd_@O(%^|zhk^y?PnTujK>2W0{kPRCAg<Owalr@W zp1N$R5$zE&a?j`c2mmK0#xX-96G_0N<=oZ@%IfNPztfV(yd}ta6H<g+L}x~-NEgg_ zla2tH>BRYA8w1qT<;R}B3SByK9}Q}iD?`vW*s~-&wf-cBG~6W><;DIeaX~(En(lm* zql<rw!XZq!$*o2EG_3|mfZX<07zYr&`*yeReD^%HBSZG4VPMksB7vZtR?Poi!~a#e z=nwgbMpTnX`jMzLK&2I|!?Ky5-LU@(5bn4|Eo|~pS`}Z@;t;;#KsDF6z}vJa_RiYZ zL?8|jfJK4F0pQ{O3~Rjq=@C&~4Zp%&;`B3>zKNqN2y!<JTP!S69n@G+*%W)23*hZ4 z{C<=wNoelexf-0boMApp<9j<kYby_}=f|GR6D<mK>m0R3{(@)$WlWkgz^zZ&JB1E3 zuv3b9#QX>>oF)`8(tu|;YkqIm^S|=@J+&a+TxXOs_IyxK7m)-X<!_JR;k~jC<+Nwu zib@BR(jRYmk$+LCIK$_qVHviNz!Vb=&6lT~{`vl6Zj5?s(y=sLMHpLZm-ZmvD0RC# zfAg|WPd_ff$L;%lvAjPo`SSHVY4c?-V;WmKg8y)fS$O1S$_O|?3_%{vH0opkGk62S z>)m{d>b=d+V@B@e_>k?-hG*OygF=HH!ruGIf1&$p?8ebQCg)ZmrWpj_#C-rrbr{$^ z|HHwL(@y~3kyL6PKbNjwU0YR<wZgTHzwf8*Ysz8ia`8ab*WN3wp2|8Mi93NlE#o6d zK}w`L&2%pdh~N9_xesg+4~Uwh1_m9TI`&A);oRlj^E!E1L`$>?VY!Jp_%6s|@GZ|9 zjl_YLOV6oDqaMY^-#~*_e9EHC_Gd>h1l!_kx_;$-IK*Fg9Ae7|X>wv*#kg`cC?=nZ z9EJ)?DtYsCE&DlAUDqDC>*8hUG8~Ze#t5`QivTJ#jc*}8<kB09dQ<||3?j=eJORL| zmVqvqD$+;mu%WHnWgHJe4WJ7Kn@4MO#hXnn3#`J}sKnsV^Fotnklg%B)HIx*0lI(B zO7|~N(>yQ-vMo%s6TD{R0i9f4fM@JJCU#)g>#Jv>OEs%_CTdi4lqdKNK}$dw?CK?M zh70H+tvlPb!<bt!3~=zkt*s_9{>$BLqm|Rl1?=HmHMJ%~C`1vKg6zqvC)WX;aBX}* zc#ATTWf(tuiS%D<adc{!q~d=x{q*Q=_X@0qpE0DLaM#`-$mUh6NKb9jd@ZkTq*q^a z&+8j6<9u%y-s;xjd_>0J${fBfPpYH@3{rw%`#7C{c;sQU5z1oY`{|&sYJUk=L?@Ou zRR=eBq4Eewp3}PgP%l*%;?Wu0+1dD}+_*BNv_G}0GeRrs3wp(_&u$uC4zgxUJ~xr# zx%5&jsLB@mkmh3A%^?j=-Pb`wWV+|9`;=gM#(!0GtTU&EB`UOpZyG+17!{g(3MRji z$%U6U<_tqb@tp2b)4Ftt#)l~{Km)!wP>vTA)kKY~xS=%`EW=)l<;NU-8^2`JcHGIs zYR@QEPA%t?mo36T*Vo+x9~o%ZLZ8_Tzh%`s7o%({I&Fv?;N`!mM-09WR2o6qM?Q(M z=i<L5*-_6+dCW0QOBD2pPAww@L_gLj3CZCg7Ql=8p85gegSrhwSV3Z%3Md5bdV}k( zm3;su+(_0Zxru!jerZl;uJq6<9t0ecC4rpbe_D82Hy_q)BD7u4k7antME^x%snOQ) z+RM;tnJdF`t<FB6T$-1L<Gpj%5g66qfmr{L#z?tyebU5pw}aQ|BF^tSQNXmK^HA6! zUyEzls}Xgo7}h4_?y4POy^h$R@3sAtOae4D%C;J5lb%Mlmp__f?~&e;xrXu?f3Oy3 z-MX1+Z*P)2gxh;v#%8#)56dT0zOLDw>L3V5Zgd{l1Eu>sw^ynbxZ5fp7pxi0v_|$) zCuF5-IiyWWCp+%H#--B+rIqa{QQJ$=G^#!niCdR8^<91vh%_I_AE*$bMgATUbL=u^ zBXfi1Yb4bmvO&Mg+s4(7zS(X8OuG!uI@BQX2c;ZS{py>4voRCt8r&rX1Dj8~{)KS( z^w)BNH(YSuzu$PhwBWA%?JVUAf@4|@fb{ei58tmjb5Qe|>hEIV7jLfL!|Vt}t4YSi zFJXKK(ND?D!|(A}J71G?<AUGqQT!3L!{2GyP?^)5R9nOJMSV2>+FO(~3B6lkSsOAy z!GJGh;x%Ms5b0eAnB6T({P2uU&|yLrAuoOT1#f*eyK4cS7mLbDzP87>ZTF<|PmSCG zbC<XDGud9t^6Nsa{o!(^G!0y3|04=Wa<{3}6>@h!|7)bnKXBQ6IOQ#OGeCYw8@`%S zdfl=spdCAFNT-<vx$$K#i|O3dJr?qiN0i3C`<K5*+Y1|xN>9ZxfPHsNUuWEWSvhum z=t9Sh5oK?$uxmE-T{$;K?-^+E&Q_Lz_8#IYY%>HER0<`-#WnXhr;>9FpOb%}H{v0> z^-e2!)2I4(;B`I2l|zuIbX7rSUhPlxXTo5?F>i>cnz-Y&5kWmtp`~PG?Ag86rP)jt zu1BD2Ow4o+=i<R*briSq)q~_Dv6YHowhf}(IU^)mLj8)_^NJyQ(;r1$XNW9)qi$&1 zV(U|29NQHpM;O0Lj)(CF5{h*p3dZx~rlY2+mf>${<BvF1Z*qv1Z9jet;Z4s*?Skou zaUp(S(26J!g=Y`RCq%`o{(jtC^{_)`7S-b<&Fugni)<uq=$l-%bx{_-VfvZ?JpuVW zqmKaYUuaYqz;@qzy7$aT3?ILHxp%D?dn=!ReXe+Wdf#=tZQpauJI!IYt3m93_=tK+ z@)wCI$HF}Wcs5Du<74e}BD|Y+kmb>{ni9G^9I2`H(?rX5UNA})i<UM{6M`O!PiYU5 zzB1Mi5kI2~qtcv?6tyfF?)3(z_RxOF&B?><q}AGn!|S4Mb#hIO3E*jeTcF6<y`+TA zrt&2{l8KMpnHVBekVK+KA#A`q^&cbPsv^MqWSfB$A1&-dudh>xj(4Ni+x7mPd&cz8 znyV|k+wTX**E6d#dNO>NSa}K%5^<dC!|z6DyHtJU!hnVnYwR3+1yfJZl~Wjarkpsj zIev?yDtO#mzsg>F|Ee!<uJoy%RL0>ZP7DF9xM9-VfDp26_#$6BY}3y#3pa6We<rXI z4PEdVO3gKYr83oZ6`R=?{aZSfoWFJKxbkFkcEQ089c3^os-9x$j1wxXs$1vshVOM? zpxsE9fl6f-+?pt}v+64VT8E!7YF9YL@jSZvRq`oRD5`K`D4+<=d@M5JUMFVmzHiZK zr3AD0tXxI_oRQguPLAhu5-(Nq$z_8Gj&}!@e0^{Lo=h7y3)EaAe{ozW!y(3V`br(G z!N>X7wo8jVd!QTADV?dfvV;v}#+<I;0Sa#Hn505`a@v(6+EP{teC=#-cL9oj7;t(f z@*|dMkOKE%PWM;=$Nwbiz}MWbGXrTsR0PXWam$1Z%^hkO+ZZ}+ftxu4)BR3JP7^DJ z9E!KVM~JE9xR<ck`86oEiv6@)4~{Ef5nYk+g3HG0OFIp1tygeSq<*%cdrn)5Yr>)h zJE#CSTmdhz1Oy?&!4m>fil9mo1wRXuN{nK;=HSfCnEx{3y>Ej5yUc8mPd`gmx|Qhc z20YpdMRvck6==Q>k2%CsesAPM-D6<zo*#uBZwDu~7H4q`*+;~LpM8Si25Du&3_^Uh z%T+w7@(NwhNV9TghbD;6R@Br@;q_8Ye6}iG+ag&D$c*BIW!8lX;VUEy=+8OqV@7Ba zJ1Z&UEJIQ-K#w+~-#eLVv-7O(4;<xuG;PT<5W6QA*&q0Aa)w-_gdK_~Cjuk$Q#b&g zvHMp8YCF~1-N~^912Aa(uX_<`V?`fohnb_W2Ua!0k0)yz*gU`>!e<0y>hH*Hjlz>; zNffv3GGVO8EGkak%}>YY!;$mruG{!>B=OBTT$D$_&TslfcMf8v_lnB7;Pp?C!%+cS z$I49~!FGn$4a2X#*J#70SZo*g82{5BcqQTnwp<fByf=fml$eAFUV9!!uuw#cl2n=@ zC2U*D*t+!ZmumD~6aH*~D9}V<0%;S~1e(NQ&kvT8fVRoz-1oVvRp1kvBPJ<tjWI+b zpl--uQ+&5^YI5zhYEKb#NY}&b8+A^l1lZ^i5LTJ$mD~mJ8Je}WtmsF=`X$jYpy5tF zI!dq>Key4s)nHmQl|lFV;IDsH4><p6k|TT2_TS1X_=QW_GoR0F{TTR3M_BgC>~tK$ zV8WzGIF^Vl2YXkHW5Gepb7+>EfGQ-Vl&tY>)DUAwds!;1ql8WOq|*9gU?CoqnLK)w zEwl<xxkFJ2eB-`9D4*k>BM(+hgo|)*Bw@}}ohb*~Q2(gC!94D-lavkBTVgL;`|5aQ zj>a7;-gGG`{c=)Hv3Uh3E=@5^`Hn?-2QkHG*?*otM%Z_>;`hos{U?35qwHgagd*iv zf|bd1*usC1J3*I2c-AbeZeZRE(^>mN=DuX-aUW1!tpatGe&TNWW~;jhEzeBeZ(u&x zSiQmF4%KeEeRw=qN{%YT9uHp#Em?Mp+Q^R7CsNcYJi?ElA+0NfZrXiC8P&W##}m3b z_Rj{>T(Qm(-k(yLMCD2^A{yZvrX~>z4lL9Abrnm<@0!)ks905(ZcKf+xUD)57t6C} zwQt<4efaX&ZQksef7eR+TP%&r6hP?JTux*Bx5|uOF@Y>jQkAy^2~xGzy#{O$Pwz&@ zV{sWa>fa8(;ctHWw||{(Y~6x5+|<6m?<<b~wdL;wAB9cnCG_Igx|HfaQMAsPzHWJ% z-(#d~&4(P%pN3*FG*&@?I7j}+baKw_Z(aFfw7OphoPOS-Pjf(6)#zC8VO9Xq9aCmw zE+Ki-nW(SX@|mieSwK@tf4u~ssk!g>UJUU{w2<SI^mc$#tY-4^9ex5gaA@fPXKuGD zc0|}aNuq0J39Qfo?XJWrNn^PTwfy43?!58>8YH?=w(}|yoAeAs8D;!-O1tqy*93Fa z@JMssXl3QFKIE$lRuOkq)O1X2JVzSZu1&x$Tl`mG?M4Rk;e7x%Skh&T$n_!mt{;dj zl(Jyvnn0Ts&Ar#kKnGAJmJ6B1&K`~s<=D2#ogbZ@b@~fFA=<U2oB9JN_ykM;+1O!0 z7cJSgWp5eAC%5U;kD+Y~uz+=3hn=PWn8t#nRJrEgc^+{={Kfa{>joG5jafNa^&n6* zIG?Aq+6%L0h;^4dq9xR&YSaeq%X<VnSc+~dnY{EVm#C??k!wEV?kiRj*@c0b`Rlag zCIyCFez<59c~x0k$I>Xrift^rKgr;L-l8?!Izq8HhC~<#Z_KNAWv+(g!DhP^xet<o z2?L#_ZKGod4Is0&){qSYq#X%6&+5?zF(zW#1uvsrUgfW4Qc*47f>e=vosLLbiWma) zxdv?H>V-n8fy_LKh9QbwEF)VGD_Gh8T@QK_XXD@(T~H(VbK*mML-1+=<pwc{#6ek) z-cB9<t?ire9drX^ewuawHLNB>j*4;<aGdP(SucbVSTTWWcABYj%oQVvYWrecNN{i6 z1UelZ+Icud0751=4HdzVNnzTm=w~d+O}s=P($BFV>s=2fmlyzz5Esc8?)FX7C(2)7 zy%HCmuYv<U01rmT`xJYg6uug#j_AA@Ct(6?2UOl2Vr~-PE1D$pYgDBXfEk(9hKwj4 zFD^Cqw~Y`pG<2B(A}liT?QkL4ib)^DL=!@(1&>vdPQ%kkeJHNm<QoHi$e{1g@w`4P zwbiMQWY->jB0M+vx>H=zkU*Zq;_j7#h2}8zw7OKHHXjm3zil=cq}xRr-RHbg%b9{8 z@nUy_XQh?4osJXkAz-T}^lKa|G^mL7`Gum6`c1uR9KKkr#o|#OHB3msD0?sodS){& z-R2tvY6$0c2UUqxW|{IjvScOfc*DS)x#Xjg8&CRy;CcjmN~@CT@B+}lXq(rO-ak)_ zIH>M$42yY|r`(}3G$!T`w)d<F3#=BPo9c);In{7kdmb()Aku|@FAaok>=K5<%yoIH zyDE3gvdy-t{qxXD)cyQ;UiX&Nb4Qv3dgzoyWx~;WbQ^xNJx{}T?9$!dHXAL8tZ|d_ z4zr?Jtd){Y$=p9AE`J~q7Y&-!+|Np(*54r=W2bA`o}Vr{{8ipVAYqThF?5vNp*P|P z!=>>OeV$OG9<knE*Qe9B17z>u-(Uai*&PC0q{JLgvaveQnZw1X$yS>?g+V<U|9S06 zWtt^ZjAf3PU1;#7X?L2CQ<JD4BB%{P2*nEKPl+lfJ|$ViGcB6cqv23+6QU(WFZqn~ z#TmOo-BIbKPfHT1KX!DqZIX7C_Ee^4YUb?d<*}S&-R;QBwKo{Mq~3r1S;03IV@+ya z0bgH~(WZ07ec-nEla=p^J);WZv)9?!6!tManx6*cd|>By%BKm-I`VHE7sVrTwKOYp zC(tjMuyeLbD_fxuPae@nka=6?2hKZ`-wX=inj!t#Q>j!&nQKlBx&U4WL;{?d&m*zC z>f48en!1XXT1!>it^a0h`f~ypCGGvBlS|2(iK9@AGts6yo?!)<vxMi^FV3)&99|Tr z-vLicw!}tiZS*i_F|Oi5CLiLWp4zyF!J;btxvKcM&Kt9;zW+W32vXk6s(PV}H*FxD zuIFbL{<LT~<sTkk91*?@JK-`S*MO?fuAF2k4f^#_jt&*ssh1Ek4Zo6#&N=LMXvnWr zBk0sx5S0E(K$6}i2qt?BqdE@K<4Rj6VqW{&Vz;(W?_lS0(7a~yrPurH)!TuShdNcW zb2{d%L5U)5XPt!(rvPs~DjAwWz*dyNy;4I<v|MbU8FSk$rAcaK4Ji33PEu(XT8#Ic zPKDaMQ5rO(7;*B~4{Gw~HXa!J`j@v)gv3HBYzaeG5TUjs{B<R8Xa@SG;eoz&Ws9-= z2qrx+y<tqj;uQu%U~X8GL$e<W;yl(jJzjyOB3QGQ!~}Bgy~KO_v%MC>M%rs}B?fgB zGniaqy6rUuO*h=RQTPflg${#BN*64-K#`3EWlZ4%HoO^hFBwjC?tT`PFu@GI>zf$A zG8Qk(|4y_GzY9*+@Qd?d&@<We7eI#tApiL3g#bHGaj7a|3in{EUB4fs<0u0X*V6>- z79xUqLFYQ*kNcPh<y~tB1&{|`&>%8NCdNWoy>lZB_|{;1u>$Q(w>_U%!uc(!m6gG$ z^mHfFm=&NKvP)8Z=TL2Thw9{jsqo}X)+7In9GnKNe;6PQ+<_uIgcWXj6VJ`Y0nF)K z#-OKCEg3up#P*oc+wI`|r$eBM^M24UR-Q|~=1evi5V7FtomF-p4Y%Jbt<$=O`%H5A zz*@Eq=p39g6Tqdx^)$XGR~tVw;<FM+xc4Z@i1<|msVJ@?6<0KD=2o>79R&<+9)A(g z?bj&5FKOkcGUf4zN$BtBcmvVwAP^_g#H-J6--@ZIJgAfyX#MS;1or@<FQ(v+nbG#E zeP!QV>|`yB8Jhy>`Pcm()1BL+wYqJiOaFZV5_t$+rgF!l`mr_Vu0s{Yl7>EA3%pK5 z9PtC}R76KI;1=+xzN9}NjxNK!LEj9+EQ=SA(9u#kYiG%^t^e>&P%s#S<|XY%bvl(g zA586#D$jL4_}?kdIG)k~;^pHlE>)N3Aq+GIJfe~W7DzFZa1&z!wx>kpfTVNMyGH?2 z#eDD^yHj!UL*y|Fh9eN7Omz5t=QgSv0*cNx>QyfksZlZAD>Lx|c!6tX>eew{>JxC5 z9~?fv(kfyBJU%vl6l}%oibl+SAFzzV^N^^OEx%vX+;a=(kL)O3#IkPk@no9h)jT^D zEi&`XiXZ*V55IOusI0$@OBeESvv`b4Y4c*d|7!L<2}{KK*t>Jp%1>UX``=yCay9V5 zw6s?y4@UIE7yoFg8CTK4#9*}2uD%gXqoo;PD>q2cTL^^mW&K>Ah^<d1KJhV45(vr{ zsx7VyR-nIC_eptSaYYUAxZ_pxZ!)G8os|Z95Am1;dwB*%5O}GF<0lc$ak~b#8iC!n zr0)XY`7tBI=_mZUiF*D!%)NK??&Cn%%K>t5tchv9)KJ{)n+5J43YHPA5RwHw62~)T z&IpJI%Q>ZcK3pPc)kUCf-QO|$d&U(UIRBCJD8|D<k3twhQRL%!Z%0xxPeP4MX6r-5 zA+OaxxtB&#3iw8S9Q5SenC0zB1g0>=aP(tUBb@A69A^{aa+hYkrRy2oP;1=U9dek= zkhZRwU1L-o=JWo!>Q#^ihXBt6cys*%05}5$1yGO%20;OUf`9<{-w*%afHfn7Exm}S zn4qeR3cb9okfo!ug{-NQlcBjOowbYMu-2yS;Rt5W3(zMV^0o$;HK#TSh0&6LX~d4| z3YS2bb*p4u{#XJJ<FH|9F|JKK5yf0*e)qWQ29ZsG9{aVZV!pr!)C~0zXr}nt>nseV z61ny`7^|zHX7>9jzwfW1yYrA%Bj#&JmVN3Shhc<CE)2QQw8j-BBB{&}O?(ag!1*9J zPghNZJyB)K;-c~j>};?U-6l`$Hf1en`6OM(vsvY1`o6>Q-hPls#CdXM<|V06C~F3p z@Q<QWb+TJcu1e)HRoK=1CBgk&|2*O)=uI{?8YSO;WEftYX0}8~H#|Pbf)g;>IqIzY z-Z&=y9SLAcdQL+e|F}9ugb(8@EaPK*z?(w*P6{bP5|I5AD?IYaq%+Q)b&;As;WEy% z9!wZIJ(yh4rX`%f`TS+H#CG^x8oP+FjBq)}<01tDo~3$H^tuRDs*aF}+sJi>+KAJf z#Uq31spa2gRP#~UEA;3vI*bM(tz%W#1VxHOwa2-{D}OHM*48?8%|mi4Nk$wrd;LcZ z!{!a7`erI$xB3&GGeSj5nTFP#n^UF6_92JkP5!S?%?fKXj);uK@;qIR=_%+Ii31Bs zHiv29yr<4$3H_m3nItRAZXi{;ErK20G`}xv)wJoAy`BkcEJN4D(#y~GCqt+inP61+ z&R(`lzF~fMaRO@vydTVe2j-$a9upnP@{M~Gttg56<>+Rr>RoE0A!E|T@Rj4P92t+o zUR_=5rH+P<Wg5Dig`EK^*~+%)A3L-)hNVBb7>dk)-XNUjBcjYjOC2W!V)^pMtq7*X ziR74$Qvzs&3*5QsWBfY_6#>Le|DgKp$N+$uuEjTIV1GEso(E||=JlV6g{A%qzc`RS z3QO~a@}MGDS)VH&C#j3<blk>?`AJYJ1wApB*Bqz|za|yZVn-^sq_-3OOOFj2G-XDk zJYaWwcjqAF2RT~@IYktx`bJ(6;3&dlFpb%clSU2GK*dKjA}q$9=t%=kDP;F9Svt}} zzdT~0vAGX>+Tb!3_O?PeJigMML-J!Qx@5H4tXtv=nPNzrJx+(^JlBuM=ywY>kTfQV zwH&A8su*ogvWApBH{`f9<0N*TTadGlQL~^_uyaHM-Rd3K!W+pVF%eyEM6*c-8T3$o zYZktdlhGtgwnR)!+~JXXU@^zHkk<&5wziWdFghd3Rcg}l)|nqm>W7k5_tFB&cDVY! z5zqrh!pobSDQuKq965>Kmp&#n1EJVAjk!X{TFA=2fvZ{THeAATq{fg6oL4R5^BLMB zh@2d%je0O*tb7hC)@r!KAp)))0A|V_3VcjP6d4m{f%#5*GrRA19Xf~7!<bt4S{c6Y z1$k){5vCmI8BsKv;1%fZLH6wX#`YV`<3(4+(M>zU7d+R<CTqVN<qXpnr%7QykZCwX zaHP<7f3;KUhldU1e!bD2Zo1MIKO<*^{)}^pw=fti?2wAXhbGy+@kwE_`zL)oiq3`_ zBRZS?{)s|sq&g;hBkf?4-hjX^#O9u^%7(ZT#u~Cy4f-oAD3r<uLbrG1T%t)cP^t;1 z_pIgEL51s7{L5#+uWbpBPPM7#k;XmjGG7}d)Dn*(KB7((i9oV4;N=xbUOoYPv?=q? z1`7dwlQt#TRu$l{E7arfUz6{=S>rVkLoX}Y-fAq`)7nF!e;5-o;ceH<p-<c4qWomB z{Sk2Ye(@3N3|ya3Z)5tsu<(yzG)AI%jur}WCB$;QWO&3zSj6(qkz<DG_MI<QVrT(f z_X%>Q_4@&U5bGZlg^G8&a8A0cV^z|(f>jC%o}zjKekVpYF-S%orQ4)j)JZencSZoL zz?N2?8mzM#vs!${uCB@Q&jFdXZc@r%Z=~693|aZ%eNY;Jmzu#DnTI%8?`X9i5|1p1 zh~`S8hn}Fjmur+tmE7ghL%C{kL>G|=SUG{P970k+l&FaBXkRwFG+Gz#%Dq`=Z8?8# z{#q`enM>z@sSl)?20ESs;~a^p(1&Gc2;8u=O+|}k(6|K*T~BRoEpk?oC#yK}DAVmB zl8oRvyP}pc#XC%lZanBx3e1Am;J&#u#ujr4&XUB->ywrfbzWi%wd)C8f`|f1ofTP2 z4y<0^U$Pf48+)B6uLDxznfIcmp_jdBJQv}v^!|>>D+6IvLmV}(ay$#JQ&45ZZ=NQJ zG)z7^+T)>+B^Q^+>i2H=ZMv;uc!q~c#jvP4!sXSWX=!%pi$c4np|I5bq9=jHX3j4z z;bl7};UgnQR!TOOL$u_y%mbw0;(zqxNL{B7EU7GR#^gGR55PRcdh66%HTiX_yK>F> z{ZY4kU8nb2xMLnfPJ3E7zC%w-?fAK!*8BVD_xsGf;yjZxlm8q$xKZ8j4}nupu4|3U z=b+KOi_wC0)wO#Kqb--WE_)jyDiyS1UmVA0_>F=U2$e6H8KB?sH^u0tM1@P=Ay^tn z`my{@gT&Zy!)aA{!5RFD5@yB|Cm*9MK-+kBJUC+|<mSloF1}4G;|)k)bWmfCa>R0r zG8eF&``OTq-|SNqeS^Gc?U?DYy-f|Rbk(l;^82*P>!k&Feb)hu+_d`p#jZ;6R#5Uf z8d;qJ1?>n)DFS3nG*|54Y2G&1<x`g8rUd34Do4%y><L@W4&sj-ff*6WmJn;<I`~@% zPrXjyvran)eXNdMN-mpel481)6myefw0$@r5`}JZwj`=PZi8#ZT-8FEZQo$K*H~^O zL1yPF)U1DJn)g4P5xJBOA;?xkY|r<B{1NBS&#>ra{h}quRn@NJ%(>Yx4-M__6FtDM z75e=_qha^D!9CB&T}0%XRk2B%K;~FR))`Y~Ult{vczh;((s==g$e@5I9;P7@Lh=xF z+1ohwD8J}v2}Ki8TEjRLF)f;3dPfgY$xgUG)t_YFv~V};MYQ}4p#7VBiiosU?%9uY zQ_>|}`nA&<A*wcql$jGvVD*)C=CWA-3u0Nyp$75r^GyH&L%7Yw_EjP@<A4cM-?3ov zq2%z|NRvH=Z%^oi6|qerqDhqHE0OUu9KwK#)F%5Ojx8T3|4iWy1^6mN8)wSn_6g=} zo4)i$g5y`P4Dx4J?3r#%lYi@XdPu%`ry9wA&iPP=W%@?!sdQr+WAbth#8~<>_Fq1% z;28+zB?{8i4}0Ovzmde85+K+QWKHUgDG(>XcU~DS9LO4L(5*JoP%98rid0kLk_~kh zy=tKYGgA1u`+jUZxz4fSdh7;RGRQnuc*tU*#!>OX9e~Dy6U`faz&<5inVbcy81X`d zf{$1ohNzJ3Z!0ZHRRQBwYc5y5k~~re7_Ei6@Fo(sht_+4_;Ii|TdPN4>^NZbgdY@U z6OM()nSn)rat(`H4blK^m4fj29x3T+Mu8BzI3|WoKMu7c;7K79Oh<r7u=W~p<H%*m zxPmG?Mm&n|^O@|#OrqJTe|*NZTz=2-x6J{nu}jn}8mEo0hyaG9=x2Uv2rU}H&o8i$ zN~?cl@;|vTM?JsQFg4?*@B6a~gr*52#PU60867GId8TLF#3ekdgq!Ih3QhU}_C^AL zyHcK8p<gHGb_SE`-w2a~QXb@r-ZLwQaRxk_Fjw%ME+ztT3&CkVyk?G0JZd{w<5Z#K zQxz5LmLfK4-(=x3d)Ra6JVkb8Sp-NH@z#7<Qc4r2AWJTdxO~>K8HCIh`TPmKR0jB6 z18Kt}$(iuSa_CHvC=Mc4;V^c)SYprnNGJYz&RnwDgor9teapCdCufd7C?5IDn^aqo zHu)GE_iFN^1%<WU8fZ_9Bo?VOXi6M&Yne1KhiVNCbr-qxAO|Wyh+sO54BRc6|2*FX z7W=IFT6I!cj+vZG*Iqg5URG8+mrJbcl(Cc~*WS%_lysn@Kjb8Tty^(2ecjgq+uXEO z4NFgHGUmZSxA$GEL?DRIOja|(u^p%%y(E5MH=`VW9edr{q%m@q3HE3r<{7~&D3sGS z<3@=Aw0N1m$oFJ){`UH`Re$&AJ4@cK*R1uof7EZs*X7gh>u2;@efR4lYgR8Jv^?&s z0P02?c1yq4O%W$V9pfo9gkqDYZ)`Q&7W;OcQUz_d(hO_vioaK8QmkUm;qL7D4&z$I z$C;4_%$^ibT$Q3LGutS+yH%WT&e@!huI=<{3O7#l<znDK$i{B*dlikAA?##9yS58z zvH8=YnYdAN>7b>kDmQyVjVS6f2MAJ_kQg8*S_msEo;)}lp!iWie$Zmg;}GjNyxr2_ zdRiTI8tDWG@#6A5prqmWAbdxQ_>3j!hx_IrvNh;~HJK7s_N8KK3ukWAW;1*1N+a8X zeg4yrqkpT>F#c~XWL~=Y@`3JQKih*`0tv$~PK)!u(0|*hRg4OKG#0Em0|&mY4$rS| zEyu!V%tz+pBD$W{NYmeM2$0A1X523Ir?C&e{{+=_DX$+0EC4_qCBXk9sEGepP|4ca zIhpDU8`?X&IGSqN*_t~2C#tS_H*JZ<U2nm@;7RFFlB^<A#d1T0tI*~Zl4&%Mz)4I8 z(;`|#*-CZ_Ix=obM;e%;z69|e5DXH+M0<#K8~Nk)$J$j?)m8P^mK3PT*98wyJ1-qC zvX#r^a<p%+!V~i7&<js#7fi3B9tk7^DP)FrBW?@l<cCJ_eZJ;rVma3C__3Zk`$hGi zz|4aPzg`dCo{k*dIrwmO=A<Db+8%d49EiyDD7@(*PvDIjWERfo-p0}S0mF@urim@= zFGu-YuI}yN)sTaY+#jT-3g2d=I}c6^_-&$+)?No&+*$QMZil(Az<}j#hr7Y$MdHJ^ zXKEyf>sQx(3QJ~-BG}88_2)0d4+Orx?!|@rtRc{7#<RdFYw*<5_bS!R)8;<zp5GkT z_y=A(Z2*5;Uwdee_?O!;yP?0!+kEr$Xt&?(dHAk;O1N*^bG+dFjXIsQX$H&jq3LD2 z$F;Gf0wL3#3y$0XazIb;0@|~ti#^Sm`)gA#{s2Yja??-G%()<V?Z?=?(t$q?=$F>B z|5o|6O5ih@yv*vy^-kZ_ed@LS=F{ItScE3@wHsl)bZ^1ve>{T9uxp1RYw<Bm#^gml zt)TB1A&N(F+$oKxk9iLim80&v^dj>Q%ZkBl4xu@sFF>`?@-DmcA&6DdIj`1cisg|E zuRq$PIb4OEL+rB2l61!gQNRK4d+E-1K9k#tG8|TeX7vxzw1lZUegV&O6p#Ki1z5q~ zH!JwS=EF0|os;x0-4bwP@dk$rf(;k66LX<WI&%BvzOjmlk7zTtjaxci*+=?~{W>5% z76LHxH7uDEGHbvw580DxLFE(BRi(T1Qj4|DbDQ-Zv1v%e{>i23c8A)6_mlpR^SCG` z1=LIeGJR9W&hYn!d6Blai?O2pS<9NO4Jfma-v=8yJ#H(SX(E5eC~`SxzB-I6O&E(! z6q$D7>`08OA^E9+3vx$$d$a`lJo$2F2~_^;wcl%Hw5eB1i*?~YBwK^cz6TnAITMAC zWusTWsnGR+6dyBpM5{!D0zc1$HtN-RXEFayXdNym{=)N+#1e}KK>V`}T*VjI9d=+0 z^u13q2#CBk_{ITYcjy0T@KeQKs4J2*?s(rvz9AAQMDs}}VJC<{d!mO0Snmr_{x22Y zEBcpckIKUl=)<n)U4^DFn6evY(SXjMYvpePBhGw5cj{y?BR~|2tcH#BMF05KtC7Yu zOS(IYElZIrMf=h%&eh8tx?-fU7bVX7&Nr~VI1<2X7;;{6uocIQpUztn%G|YN0nX5> zL`XHhkX3Q5yw_p>owf>JteoQg*&p7syDOP1AGl7cP#YIynWH~|v;aDLyTqYN@y)OO zBrylz*aJHVVwbqNF2jl>bYR9BxcR^iX*)pjhgcEN02dshN=VLy9xc&#iUfL}$oa>x z@vkUNiGOL~PIop<vr7e`*?9@oD#UMrFkY|_(~IkRz=G!JHtuMBN4a6&JXs=)c*w=N z`|q9(g5Px??M99Ut~EM5I>HtyW1*}Ha|W54F0MLnAQA#j6L*%IYG(_xutnxcpv?QH znaJqQfnMxvPul+YdR^~&z6S8vENUany3IRtzNT0p^rjJ=Mh1_q?;U}tZQTpsdct`- z5}4tIx9$@A2o66bq`3oR10I1v^e{+?&J$>Dp!R^^3Uf3z4HLbX_s89J-gjS-%viRt z!`|!B?<%4J#GmBkk?g=mGdwH9?`2bY=(l&s;4GdWko$Vib|M1+R?#9uA{sen?Db>} zDJC-HN%Bk-b=woQ<2}wj4}Qua%oLhIc}spN%r}Mv{_TH|Xic-SX>J(o^|o)VcgVCd zBhnL?epHAAp3feh&%waQd$xZ0L-=5q8FL%=QA;Pk6TXPxiez1uhamXJFaKl(RUh<m zILHm3JwMJnh`wgYiGYc2ZC$$q{U+v?iFNwA6i$lc8E#fXXkI{+xj9PiAaw)a)cyy? z$BqkPAIRmjtaUz_W1|zCPl#<F8H{b_-GJdD%8LUc{?c`5>J{R|G9G~&6?m(=gQ&Wg z@?~O$#I0=&yu`~-y-i|8+8k86AX`2}(z!MLvwYX$e&(-uHsY9NKEoE+?#)#@3X`7R zHEPoM&23Gk#Xs6k;|DMNG7SQign4UaX<kSbInjYHD&ng;vO{lT_-7o+!O!ErUoynk zRf2;bun6}a5NMh7t`N3z{4kbecDM3!EnUs($Z;*E!p^q|!b^k>cmLA@cSai2V)}E1 zY2e}XZ4zb?!oRKTV<wz%V|pp^+h_k?I%}M0fy}#eBPuWfREt@(s`K*#LZ=aJ0JQFd zP8Xu`(2}HH?9q)}%7qDT?s%H^+o{KhuvL^r=scW;II@TPwdu1@&I<HVl1MI3YX+}1 z!WcScALqp6^#yaQWLZNRj_qP44z*F#4cPAk=Sq;fI+boCB~71Q(^TiW;rgd+XN8%O z1ECr;rz<GU4=e|Vu)*r8h$iNv92*>Z3t2O8FOi}@c<`GoJfl=BCMj*3GnJzKrxVXj zIP*{yA@kCZBRo;($IjH!MAnYqDS{ho*QA$BSY0g6vq)z!(?gSpF6N>fAMASzo74YI z75;Ck5Q`5~k^{C%%c03#kc2*{X=f#P#}o53+lu~_KMFFvUmQ1qlVBCXvpTy%+OLbq zY~bRc0gpD7kU4{UiwN1-&~ypshKz>o-JKkb!ni<EX(NpYF()+yD8030aJ8?J5QW=3 zoZWie6!VuZz1cul&Q&F=m3*@zB)onpMzxz&|4>vP>c~^}$Q+1xke?|$ZvlLmPrL>q zh+PTS@+b4nVKs_tHOhA>VC52hmrcZEd&RQj_t12tZ3h0rECjl!-89k=#t#+}0tCSg z2${);W#Y!V0}5xoTnL5?X-SrPM&z;FlyWJLc&0v84p|ccB0IEJBU4$2LQEHNwRH4y zqeGmu$I0h-;7)bu&vW`vcmn*EKU)U)Y@Xx&*Ek<<qt*QIWb;5;Y&)$K`QYv3g0nVP zv)^9yG9HxYgMmRV(f#0cO=QnpkpuEdj74Q<U4ZNtNI060VJ+^ben52dCC&n~f`=ka zcM?<BwV#9kcG0i9!c}%xGBFm;zakaLy9C~Z*4tu}&(x@4PdG)ZzR5ye)3TmfEWJ)f zUL*rCqrtX@pt4^$NwWxVA6SDOXY`o1f&4qr<eoxczcl0s^Z*lZ{XPU}W4f}S_yqEx z%4_|CZ^(KB_GJE!3{RYg@>q__{z7GVJDYWqFDT-3anmP`0+mtGn1FZV?Xf0{2}mH9 zOo9&5n-@t#r6z1lF5Ixa#@?umtw(%N;nqLVgI%q=4Ej{@03Ijl>tal~t^vXyeKu{C zOcw^g-33PsB&>IFH<pg!TQDX}yw(55*Eu!mqC{J^u*<e>+qQSv##gp&+ctLDwr$(C ztv-DpJ38(k$d`=Bn2~F&F;AGMB$+M}5s(^3^eCbup=vDt{eG!j0pv{L=PK%*fDPVe zNqt^kjYE6S^kc)q%-XSV@f&<M9vK_8{3@yqnI7bl@aFLN5d~WW6|jbVy9)5gTTsY0 z6OVC)6~eZ!%iTkM+x>t21&{h+Tn|IsAc}3RL|a*ko9O1WGw+vtRXUw4=cGa@#_=-Y zhT|HqEn}l^chn_2i1MIMDFzi80{03=p*!^BDQSQK!jpsMv9G-b{ey!_1`A{XCJ`&? z<;T2aggpUkb-7vxH=)PrU~%_@YYy^M7Y)714ZuhpL(r7_=2ThnQI-K8@-q1v-X=n@ zy+H~RM<)T~>1|m&G}Y#~K{s%PWI$qS)cX<8lDTK|D4hhLPHrd^()CllDL5z6EroMr zox1R;PCcN4m`uWKvErmSio9!b(*>K*ux@Ufx=-*WY%bIFSqwQXmZ!C$Ph$8=kx9|1 zRH34BARV=|U6>|JSL|Mx+I5V%#m)u2k4K(I6O}8uR@wSp4(Y1K#`=aN^7W_Mmm})$ z9;?vI{ErK>GsNhVvkiJXHi#*kp#qAT_Y*>#**SQ4IqLaiihT5ft7mq`vJKeQx=qLS z2Gx1CwScHu0+JgP3H*%(Z`d?G5!wU!6+gtwn8`aENTEBpR=>y*(C|OO{v%D}63*Hd z0w=wQq0HiGnW{aynL+`Gs7>)I!@mytJ#I`{NomW_MRVv;?L=+Ol6i_<6x)*LWu(HJ zG{ib|WHnmLpCkyncx&{;C`}RrMnVn1a@xQUR|um-Vt__raqKjK>qwh1#Dy@v-y?KX zlsIH?f)&LPmgkac`Hz;#i)yuQm;olRw?S3G!4V*=QFiK-VBOFw^~iA<p($PPHi-=6 zU6RKo4eXY`{WT%td;&964}=1};B4lR&K%9}XCDZNmc3fbW`j}Wntq(Pu)C<y!5M7% z@vK^@TDh|*SRO0{DqJb9DFDv5ctWHoZA3LEne`tlJ@QBluPGjl3)7{rgSbb@GQDn6 zqSFxEr6x|mx(Nm?tPIzf;6o(<h>9?EUAg!tuH0oa-fr~mtB)@U72d#)Od$A=v5`(7 zn=wt_hNEr{X5+`v?kaVRqLLuLn%l~5KmjFBBCdN?9-`h&AB87u2%ibftX=$?VBo+` zHp@mwB5E%mqE{z-xI37{9dFK<NL*P7aHAn&QkYrwqzhlYr0CElWeMT1tRU+4zdc~o zFX`FZA+{<Kud{p)vO*kz;KQW*vPuM-Y-R(^2qiiVLAAdNQ{-riV;x~&;F;#5#?-jQ z?uMo}HK=KFTc7F5Nd^sxE)(`~oX>+(*|L#9+p(s1M;r2ZIeOC2SEiJtcvt_amQq)z zM+9tpKb^fGuGeBxy_<5JeWww!&%NR=P>F|zIAqB=3ygm0L6V$<a@kerAsrz-NsLfw z#s{+gv`ACe#&I5TT@wDmrY44F#kJ>oUjmNxjl#80b250s%SJj|87{x=${8B1gzuyg z4Ri!CDZAYg1MNb&MWYO`y6L(;A~-WyJhL^Mv{J34zMNjtGp5#-swk<EE1fW|i>VL~ zlrm%0R$w-))cPF%ZyQS&V$;f~<Nf@l32<$1AR;+Vqtx|~csuqVv*65x5Y;WW05FX} znHW*dFyC7OwVMqRsIF{#jtnJ*N^$msgi2d~H=u7>uHYGNXL`tvm0WroIzoTLV+J!m zfX4^@Z!9P^MUsH_?@BhAP@)m*J?f74wD6BFWk{6GTYs8ZXdVa&LT07AMxx_P^f+%@ zyPOahbignn60?*l^>I#Y@ZrA`tU>!1QpSf^IIQP!Tq2KpnB1&c{lp-+pPtE)8Dt>9 z5C1qLL$K%~0ns}$Sr*J5?2uOl0`lS21*J<;gkxsLV#P8b6V+^>ON9%{c_&v|&!UOO zY&@NEGoa=>+JuEZfI+t+qeSRNb>{-^j~kW@r(Yv9qZ2{q41vh}77c6AL>hxyIu=j? z2Z!(0{h2O>9t!oUrGdx`u^Xafb_3W}8=dr4rd(wVNs<H+6M}vHf3gV4LCT6w^OH1U z!l&J14}8o7Z*5JBXh_<b6Zoaq_)hBvW?sqf-6N_$4!D3&TV*9xvTsw$d2J<KBTnl6 z^++~_;*YYEnSUU3Ffy%@38H7fLvn72M1@d~wU8+D8fC5P+3v|FIXnM}GoN5yHCnnW zhyKco+ne;^4DF<<yRMXMzV(Xwm8jJAtfCgT*3@C2S&@#WuI;ft7}XGBp-V3HhM`2> zj;rNQ!XKf}g7nPpK$Rd3R5*A~Ofk>`m?1y^8;?$)o~YSG8FQj-@*3j6vR-rzjvmB8 z+>yGWG3W5?s;cqs7azIkOrN+Hb)Hr4q82^&tNT#X&KE#)pS;_*6J|l=l)efzEM?`~ zAhCKXuTYP1PG%o6XOHagw2-VpK&wA;meF_a!@CuOZx(DRVhX8^&-?Y7M`6IPDkDYR za8XDV@moeBO6a57TZ}>X`q$DvQ<#>7PR<(^4FHk#NxSY4#K6mc;ANLPWrE27!twNe z3W1p2^x6Cje%yUt`aYk@+Xt(28jw!bQ0YQtD6jW?IPI(>H90`z_<x_rf7cT&^ibi= z%eR_iD$(vulxmc?3Uqoc)s8<@Cp@*M%P0nYe?csD#~n3QHYqtmCM%D<D`;?h5S{pA zkw{VYxMal9=%I?(_gBL12M=E+k^-CP^;eE2q+L~9dRLCd>}-RUY6lZEa)Y83Zf(my zu=kkI<m6{2nrkc@%zRV_49rwjOM3JaJyS0OUE7XWx*DBe(RI=85MnVLE2@0LQI8bM zSa-xp_dI!jW8}#SFd@4@IxrqxfX8M|8c^ni>#GpL&xRX2{&dC(JThO|O1^5u&1Fe2 z<k=CBmgTAaDR>3c`{RV$>1np1uj;IjrEB~&ijLD2fgJenmPu!cfmv?cz;r6fEN^~q zZ6<agwVR4R1Hb0Tdb<&rS*+gR(Db&Rk)0-@cNd_J6k=p^pZ1JX7`D@KPEtU0N{^03 zTKG<*Eis1sO$@xy2X3;UAx(Z()<YLv%`4-{-p4eg43NPXO^$oas@fn7)jo6?W_px! zjJqE&=msL~%E+fO`R~t7AY^&8sJx4=L%9Szc;>p?G_)^sBREgV6#(?pnue^Pa~j(6 zUixbg?`}%ouZUgLIM0DT&QzL%EWtIqxjjnj#aG(_?YPwvaAp7zG*guSih!ncs%4;k z*Kd8EL*?CtuV0=Tugj~5-)4gyVoZgt)hWL5tSK692);`Uc^E;2thrm^R&34CmT;k) zA8O5015Y*Eg(lwv6fl-#aZRd}2blVd={pG@wME(SO-z{KL^!ZKcM&OD@l_0SAlyv! zO$RqA(#z3G&fs=HXh^YokdUqEW!M7cF7r|~_G=f<S+#16LDeZY$1@$J@M45)Bvq9h zWkMaOzLDMz@iaz6|7Zeo6(5i)&_C=k{JpeV5KE=WV5K!u6v3B3qxgtz1J}wF%F$~; z=8fI4*8yCHRlp)ZjNP#(3Xx9EQO6jHy^6Wrv1h-W_oq(0*1KZ&n{;NuPK^(wlBn6Y z9G(7Z$$L@~k7bn0yp+muIGTUT)IwN+B)$)S_R|%+u<IKb|20C+6*Z7AV$KZ5ce{a~ zI72zcc3&p%^`AOc;S2_PkPC}%HIt?ZWF>&GB!LOSaaCVx)p8bBUTcDR)VXBgtf#B$ zK7EL%n}#j3-7@1s+l97!W5KsSLz14)A8Y!Jc~tDBSwwX)^d-RikVjzqbUdZ7{k387 zzJ`pZ6(6`y4~PSvSRWa6LLl#l3Co5s?@DtbUrIs&|D?QqMgKzE0jf`Pij%vq(5OSz znc)v6iUp;e3IXd*v-f?HwFoL4h>xMS!nx8M&iCr<&@_b)Le!=l`^nPHs#s7DaRX70 zpNMP+!-j-vsX!5PV$UXwwSDXaRW6|6ql90k+}IHwzBV+v^e2?O$VP;9+(%MW_Fk6= zR+Z&Kk*b40twIT_@i0`A_=k{6g)a5a=YBQif=&Lfa)nt~W`)4DwDW@>SNQpo7%Vls z(!Z$Fgo7<`vG-+TdgS)X;OpRD3pk84EbPo*Q~&Gqxy6(0AJi2PkVG0t*5Uj0{kilS zx*y+FR4lZF-QMsdVF)hG5ilx_iyRb_uS#yp3#q75PD=YQv?ccceqhdL!DWI|ap4<a z067_6P$Kg9jMqwTm8>e2vn0twBDGeydMv(L`gK$tM1sQa6IPnHiFl-Z>+k|3K#S}w zi15@jH~!}1rL}7~>>SZmw-4zxYRAZU<=vsc-wrh|mg*N;wl4@zMHi}1gW6x{{VLQD zk}AoMFE;v{LAW4Uj?YZ&mdc|EFBY`n{Sv0}wpjZ_^83->;ApaNgRUTj6FMzaMk~OB z&a=O_Ly-YVEe_p3BF^16M-z#qiVtOk!J{`>-arEkwwvacbSE%dhT#=_;QJ&;vlpC5 zxhTd{CV~X%iQq@xsFx&k+1WD+oQnM-b-UaF`*AG6wvH>$)+Ge2j~x|>o%cTvr2@aN ze&3a2{G$yvlOQi~wgon>yWf~F88KCmJs|GdE-GZ|aus$Y_Nzr;qp9tQ@PoJZ?WoQ2 zjenF01x6HeC<emD51VzDveHH~E-a-*-}!I_DwoBV>v~vf(BfGaevwoh+Af3vb$@z3 z|B%(aMF(Sg)3#<3sI7`^?xMY41y6e#;@Q0LpVl01VnS;@wurJMdt6q{x*A3%A8s@o z$#D&!3sgcZ+K1OkM~dh5qdqFz!kQHn=Ds|$Kb@)pJ-=}9WkY<v<sVIgbjf3z0(+X% zMr9A`Yuebn8LHZ)_O{d3eF+_#jq`1cP2>!8c9A0>Xflj)HKo#hm&Q4ZrD`EKuHwc_ z-3D>EGnq5rE|hwLyu$j~ER^{d4}(EA!YZIy+d`m#qP_$zz<;HTg3_4(4PQ8+j-<LQ z$W3;g&)ej&w@ZhoHd#q_08KWee1zaN4zHzhA*Ygs*GMS-QU)YC(s%4Kug3!)G5p@! z>EvCY41<a)%DKz#eTl{}X&d<ntBxZ=1UCtOT^LvXmux8iN-pY6#!bwVrygUhe~<4n zFRAJA`-h~BwJLe@DAt!%#G<C&N#s3rS27!{z?7!6R7r>}pp#*YIb(s^h9UcXIKfFX zqFbOYM31|#yY!@&%p3m0G<urSnW*>5qv;|A)=E5}m70=fub!A7+KQJ-h&S%^m_yY{ zWG_YyWlNvca5Q%!u198$Frp}wDk99Am#Xm3_|0j&?_>iKY?v++1r1lR@y#|epHLfY zp(wlvZl{Ne1^dUzuI4o%I2Jx~bVz0G$!ULzuszX^14!#0P+jYnS7LvpSk8PZI+u3P zRSfCvT1iyJXn8oMTmAT98hw;>n|TL{%$N@Y8$R2dZ}aPUF<9DPdmp<A?lrm$K30%C zW2T}R<x;p_`*Yz->sGD`mXK1%8g+JkGI3N+@r5=vU|;C!8flVpIQ8K0O@N^Q!`4Uo zR}v)bR>3$%gO}3QgiX_iuSl2!_0E+5Y_W<EjTF;s@hnI6O!yUBxfImFWr1m7{-7!V z1fYB`dqVfcq|e~n1Y(3INWpBV#suw`q^_mQ<u=ZZ5nW5X`fl3bpm8WdKOB<hXpP$E z7%bW`XiYtC%3a4*1esgPntZuI)s%y*C=+G=K#Mm%c*0QmflQ90JxTwb+{i|GfBzbZ zYiB=ho!DL6rg5`txi-vw8MjFJ0$crYRu>TGZOG3>a{HeTBZ)9*%9<b+2J;^-T6+lq zWZdJ9R7S-`m7`9UOQk4PfbkYX>42Z7WXkD)JGSfmkMcqL1Nm+Dn!X^n*G;&433icA zIVV9yEHcX+B1J-KxDFrgyN|(=5Yv_+FK%`K@uMdru3PnguEi)d7VlM9{H6^<Yq=Ox zj49N=pp{TM+qPvdkoodEYxVChEgv<_M6w$f5O}^XUK4h7est@Nbx?$7Ei73g>~@V7 zku|ebBXsvx_IwSw>yFS*Wwi&HCbN=*b}S2mA=t!2ihkbip6nMBaTJxAyVgu3aG-G_ z{BUxiGc!VNCZBFS#H0E@#{%^&V9TNnS5B<jm2EpHWj*V#>{<P=E6F3TsWekYBjMN7 z0=F`T%Pdyj@)|fX2%~959Nvi9dt(bMO-<lK9qf*5;}4y$Y@++3%IA^nAbnye)hq}H zWR!dRi30YsZ++eFGuJB7g0i~}dT4+4tS|qw4t>}cRPmm1qI@KCSR(@<tbFS`V?4)o zi;LW8^<nge;Y@$F1IACujY0KqU3<(ed<380s)v6<n`+F^+%#_Qo-g<J>R!nzj=2$` zOaj4sp}g@vepFVlml6;kz*_)f5E}8<=?1MAqBB=Mf?e^A^ngQ*qQ(1TqRf<*wzb-1 zw>H``!GID)&Nzrevb#=T2UZ3hlm)wQwlkYbW1^R{PE_+zF)NBJ&M||I(n0mQ<UNpR znm`Xc?MaS83ufQ`zlN3I&M>A1LnV*29+FC9TWL6_V*4ZKhOM<RdY86Dbl_`=AopuB z)V6f!G<}OiE)`{jJzitc-H34(9*hpHK-TF%>ES!a_G`VENmszbC=6$Q8sz21v>yWY zIUZlj#e2j@baSrw5S-8`!6M;7qJ~=?)M#`Wa%M`Pg?Z$}QRJmce(ql2k1@&xNMA%u z8&sI+J|qp{mEs>3VijNVfE_cqR@P0;UKm+7@H5R4n&4T`&RIG4urr}1tewzo7sbRj z2ao&Z;k~S=P=|ubYTqnSw#iyPaUTqBMr^ZE3jJ6>G^|COWgz<SBP;meU=)gb7`E}t zM7!y6J}HbRS~y$==U+Id!{vZpOM7FkiK(6!+;{B)Hn8mt$r$?Ve9z^I*rs`k&LLC) zgeEZxo8ZUXU(#%BGtU~eh@|=OCQ!AXu07{>x%KnF>gV$ZkMr{bHTFb$F^{%8{+<$9 z?Kxh+G?>TH)oE;YWhED-1}QQnD~ZQ5p@65qIFqe02IfI{>S(sKcsJv#B(<h;5=O%y z3^07W+0tSj*-b`%4%-TpVMjr<<Y3{GP!asy#9#=dqLx65WLKs1F_bBG>Ktq5G0!4W z>^!{4DEkWl@t%Qs;_F^;K(s>rB{q5Qii|34T^n#ahHb*8Blk{I+Dg_x!A2M+jbaa; z^)r<KobcXHf&<_3_Ry;o=Y`Z_a}Vl;lAfbJk2bE&=pjR&yETwfvEXPl2J<Dov4a8j zVALzCXJAFg@S^KssHNK%8WW-sQ*4cD{BK&h0!y5^+Bgd90TD633N5Bs=lE!(ZTLCa z^(m{w`bUoL3#=?e1BGM8Qe4{4R7riCMI5`qGGmqU_aF9;9NU*)6?RP>OuddnU~uCS zHPs-OZQa({{X*nE_v=8(1Yx2pTLs0m*en<tXsBl9sKG;cw*^oL(YO8jgp{Agy<<Yg zz9(-eFHmvBD!#~c5~jZ8lA8V=kgyni*SVu}tPg@g07lwPm;%h30@&5_n$D8K33VsW zmkWGeGH(SoIDi3enC1^rsH?IdThJ1HgZRcs{qv~_=)Z|PMOR<rnL^z1joi4Zci~uA zbx2xYT6lcJx!=2d{l(8>W;(ERUPJ9z@vC|J#-cw-|G^JBA5zd8aN~iHi!NgI1Y#|N za#m;^%?^w7cL^!nYHFHVmE^)sEPJW50gsFGknZ5YQ}36JKW)7!lTTD<-yv7t?ymfp zF~e_@Kk+;@XRk^xJXo-?tUpe8IQq|@wZlyK3I_2z%v}N12$I5+WJZO13drLMDsp7a zP&{5xH6~?i_zql`l$ipac{0l?lJx;Bm^d|(lW1ZI9JaJMTM4E<*&VA!&1jscqwo05 zm(KgzJysQL`2jR+NWh?Kd)htmrZxO!(FAj3=i2Z6hF`zZ7IyOIp7tT`R}IbH$2$7> z+kMpu_qrFD%=F6MaY_oz?(Hxs#tj}8F2dH1VQHFP&u~^4o-`XWT=|a9K_y;iJxs<Y zEo=Gr0{@rfs1%to^B@8Oy3PCFNDh|&KgppYBr2k>?BHT(;%H|pVrOe=VdkVSYiDS} z<mCK6WJk`W?SUk^|1Zfse96~()1Qn#!rY5WzL<;=W^L7QjXZqV1(8&JDEgTCiKY^C z*CbbYJ^?;W9*KOaJwYP!;fohHxU36^o2M$v?MrSGF}lmr-9M8ICXPks#idUG=5$Mx zg;Xg&QkP?T@5>k!teHV9DXheRLw9TTgpM2(mVD96vI%#k>aX|R->%%>3bcmTqHiB+ zm*x3*XYs*YM?Te(2xjaaZW2|R35Be(MR<blml`cD9wNLn#k_=&dY$(vvL$<$G<xp? z7Au<ptT<ZSv?hrpoI;)@R`0=jKBKiEeI_HUTnIlDb`I~+YBg*M6KkcM`y})NeqhBc zMRgt63cGR$XpX;v_+{5&>hJIlD^qAW_IOe8mL*Wzj@D;Nd(4HxQ(nCg&Nt$4g8`aX zbDC#!mdCs_3pet|U9bWTG%D4yNBwOKawg2l;1mDZx)(34G^3^;PkVnywY?-_-Lvp4 zc&(HL>Y_Dot6WrI;;08Bs$7rmP5v=u?O-(qIBdWDP@<kp2R51KL?L8YVB?4D+dDXL zra;Iu`mkNHVJ9>hU79kQm2X2epVnhV$kCB|50<qOjbyL))H6CyFdT^_p*GW57@0Wo zrc;g8BdENFG)a_=`qU9Qcc18ih`8`zbFH-d#;xNwdCu;ThVC^WqD>tdBd6{SLXJ-N z>OweSzp=8sRf%%C6F+Z!Z3OHT)X3Oik`3k1b;!y2njWmpWY&xYd+;lkcbg;(<kqu& zNgOIf_Y_HYLt*`eu+fZx%V)|H>=P027NKx8*k)cO(b>=T_pTZR^g@JA($<w@KnvS@ z7#zw5p4pSutwiWMU(n;l2hVSWwjMMj;FU?)j74al2r!yTTx$!PLlyb6ZX%8W-IWY8 z9R261z@Biq>7h?h(OeiSgMgnKK}?g@KBq~_D*_ff|6~}2uTE(F!-XF$jtFWsx<y;i z%T_4z+K<OJ;QdYdaJ9ikdttj16ze7$wQypGUr$L{JO{+3_varJ-s?&}DLiCc0Mto@ zLDq#^{|66)MlIfI+>s7Df^*$<Dy91t2eQ<<(M{s|M<{KX#ZF+ZWac`JZ9LvRf6?oG zI#ICAAZkP%YmT<1u%LYwDRaRXA)^ndPErQCGbFzq7#-4SZaevrzafK2wMEOFK#>MY zgt0AjqAAB$+pqr;$AbKXB-w)iS-NQ=tu+sQTrs`2U}XOr%L|2iyu70svyz#TpErpR z|IyUcY-?$EZq<xCio?JAV96yw3{6cKV`dCM6>E%f*<XBYRXgd~NLwFi7mk?a`8+gW zRtcbMT<=f9s2O$=$|)x+i4W_ChQp97uUjsD;wNDXL?=~xFgSFK#jy3SlX3cNkMqWv z@w>Ly5oYD`2n`WSy!~{rbZbU3&>4b|Of33ED_Xf4H6MTAIj(LC1>l&hHJ~DuqE3NV zmLUOp+%220K`s#Yj~a_IlRT22{!>DWX(VJO{_*JoX({X)IB~#=<n6%`!1HR{>@;|Y z;#I}AB<}g#s21k`A!%0jLhc{Y3qLP#8j+E>?VPGt!9=XDXIw$??Juq=$gfX*w*#`{ z1TB)Ro6sn3Baa(60Q_yB5s)&`*Mu<(S}uM&1N2u1Ns4R!Z8hm~zD%2Dg_3Iin7q@> z^q)GT;%C=YJ8_Ki+tSOErL4~?lXAi#nDI}RtltVOc_Yn&b<WBQJ))9s!PtGy^_!mf zqE>be=D<sgnoS<L16pwKX;eihu68J%AX$#$solyz1mYZrx6(<!UVeo9{&O97!rPH# zwis_cb}Kk)2#(`b)!+hD;SQ?K)_`GX&bYxt-#*eVez`7i7$1_sT75&?J>nu1Nz{KU z6)|*)LK0SS&Hsj1g>%6C3uIchHC8e`4)`k6O~hr(ZWE0}%4k)xeWS90#kL}Ma13<g z-uahc^k#s8^>?P$1BIJ`kJkbPQSZYS3Yg6vqm6bn+VrGO8|iLIi-WIt*P-;!;wZCS zT3$#}wG1PS85NU6wM1n+z9Vp$>9TWmmU90I%p+&U9c`}l^AQYrTt^s(H>1K16cP+A z5N4BE=4H30cL!r0h;cOy9gCKYpd8iPbdO)|mM0Ku@wV^)QQhTqK!n8i9MG&6k0Q{N zJ%!xV;R4vRZrj!aCd^m@9(N{~-g#a0_D+Bq1{TF6fJpY%eN5(eaXA)zlhti#ZAJk; zr-r!Aic5aBJ`TFYps7Mr&iF(6hJLPH*#YyTcbB7DZ+?1>B~XLc3)i9lb%tq@a5PZ+ zCHBo1b1wc6O&((9<@mBrJ%{dey41I&J}ja(t!P5!1%mGF1k!9gHJ16JPSzX6n$$hH z_(*sKd^E!>*H2C!b=}Yjj&`8<4CBQV!w)vF{?grjRlltb8kdu-;wwKVRY|YfbDO-t zaTb6dt4iFw9`6^63pODxm{mU}5_bDF$%i;MDzX<_dG+0CQp&|INLm!LDt!P+mqO$T z>0OJBR}y(7bV=%wG9+S*e^w{FN-Zt#rBbf#I&^n_WC+?d@;;m-m%iDgitT3qoD#l0 z(Fooh1GxTsERwy#IwJlv*OLSy^@r~bV)S-m+IDk>YKI#RF&beqMPrJ?9!hh{)SK#N zvG4T224n^HZ8Y_43vvP3@<a4hGZ6H}M75G_N7}YXgWZvVU;;-2i35@NPijJNTpDF~ zz9eGOTLN=M<BG$Rge44)?XR{W;{W+NR}fr7=x#(_?W@=7-zM0*FJ4IPjX1f6@J2Yk zJy!SM9nq9}`|jELoGT62A7VJbxQ}|P4zY0DQ{wEmUzaC77Swr2k_<NzWh%r}jHVPv z^{c1!#SX>O)~_#VE8XN_NEj&B13u9E?qY>3t;lmi`8c3?V^b@tT6N7%^+f4d7k(o4 zMCuOL6Sbpz@pitj|7g)m?4c{ZUCe_P{~-2B=#kVfzQvH+1x@WHac{i~jr5u&`vIa^ z`T*(ef=2VZwA**rUTKs#J^nempnE{~i0TsCA-1y$`wg;-+&Y;gYK<5ZJ0f;OY7f^D zy=e{FVpQfoaK%3$c@gnk-t<7d9(W$}#UJ>u6Y)&3>vP44<0;&=F;IU>Ke?$u!q%_K z%<jzLhZ)Dyq@q!T{fY8A4LGe-|K-rai{{KEjt}vp@^*ffO!R^Hn_@=<wR{c%7c<<- z+mek$>&t2~Lj%B%l-rsp<s56M&inT~5c?_Nuiwfl*7am~_hpvEj){s|Xz~|%k=<2J z5Ak2<Rra>RezfUJz4^OqAee0bSsOL@{%S{gxzi*CZxHK{0gwg!*o{JZV*P|#hQ8HV zp;e`fNL;a4Vu@a$SZVTZ7@e_vX3b1Wx|Gs57qpB>S+Re_$_eFTOA8s)KN;0p@Bfn} z@jc1yE}?*c1j7HfEQ$92W=VSsTQhn)GqbBs7Y$YUO-Al4aV1eLVGE=ZAu1u%_{8}5 zWZU8_x&^X@?d@>MLG<EI5hX-XrH)rkZNJ$^{@u@<OV3}<Qy#w@mufz*>I_XQ)0@xS z&a}eva%e%&U)<3Ozu%~Zj|hV%Ml<ct)f4zKXx2TD&qc=&QDVj4W=654q&<N=(P#JQ z^g42nz%RQ|h^OA#gAh;i^vw(h>W!=g?TlXE_tI3o(A-bp*B}TG1ov~zl$e-o*l8Qt z^AhXq>1!LCsu&yGbp?_>#^0VGIpGH~*gZiu9ml8Zy8=lzpm5+hGZT_%_5{Ppm~j&q zneYU0-DUyEzu{1}rHrtL7jNo9vsTV1K(Ih&!!iHiW%Zbd%q0d9b+d@f>WEXNqwpU8 z)unHGj#-;0y;99CnEJ;+g$bgdfB`vJfcq%{RPMRMiTpvRK`gF1F&~t#YU?pf-t-P{ z3jHWXyK_;h@9et?c@Fj&R^&yH-Cy}*#wHwMdRb|$1{Us}F%h+7-b?$w8{s|8>5(;( z#fOkN%T^)kkIB|VYCk$@J%J>uzt$m?GNc!Fq%(gE#fSM~F*x2rJ&ILSj+gTXr6ji3 z-51s^7S?50`hQic(@d*>E2;c)jQv0({rzT8YD0{d-p$UR7~>rzC~Y(7F4<LA+zM!& zd;O7F4T3?S_-vPKTFR_5cu}I5ACG2Dhx4kv1RS4yhkh5qgc(K%RLs&Tj=$|nBTTdJ zf4w8KT<Sp`AX9Vf%(-_NrKwn4H=GQ91O6Ki*;Cg{&D+j?P6f0s3Sn~Raq*wWCR_@{ zlYC$x+y6`nW=H+|hLhv?19$9I^x}O1Pn-n*kc3FN^fP*RP0%L{V<^cM(dd78CyM<A z3<Eufn!%a)<|h%z{RdDpM*&B6{R)Fb{yj!XDu@4#T$MScq@EuC1rekMnmmb!z3z#; z$$}h~hzo9Vm*n`X*PcLXoQ57NsGe*^6^xe*t|0K3KzcP`0e7Z3T~NFn$gOln%}Jh7 z((#w=U0}RWfdjA?HHYks#+ziV8CD6Zn}c0q{d!1W@^yPe0x!305LrmFoVG&)a>+&| zf-k~aedslC23telg1d1SUfK|Ho19Fg>4@j^OGLFNQT1h~6dEZ|{FN5zR4BaWrBV6O z=EbETCbii&7!%2EB;`#X9?A7aNDW`BC+9?olGrj;ojcc&g;PX3nfmD_AtYJC5$PQ* z_WoJ|^}=WUK3DT5KXlCuuh+}=MR2-jmx)0tJI6KUBOf9mDyJ&9y{^TwbFLlJJCnRP zP`o-|(uVKR=SNZGcZ&;TgWW3t6XAh3vYheoR|w?w`nSPpC*IXJ|NN)#?Te)73sT}2 zzxIIt_71Kbqw9g1!zI*?J0=mU^6oPF0V}QoD~<<8-jCf^^|0jqJrC}2mh1e9fCr*k z%oawBRz||`YjtMaAm)u8(?NnfQjsNcoo<Gevz(F1rkn9{!*7$zl;|Cb=v|1&N(iZ{ z-{GWRO3X!5jSqnH{CoI*oAWr8i^N@!Ljst6`|r?xF%qcje{r}EpMI;9%&@>qijiM_ z+g#z2U#EU=V=%{FhZEk16R%4uVn3sDEHg9$6EMK+=s?myYK{*hTToJZ63}1*?1KsK z(u+0U_Iza8JhY4tGs+os;3@n@(HFr)Sbhujw_50}xGExpGBL#jyPsPHQ+Gu`IKuew zW5s`ha~QEboHI|)ekBnz6ba>_FMIFRXMlznYv16I?s1g%enUX9!(YL`oqwDV;8?4m zaZbL?Xw6ao#3ggqZu}P1>)rLE{u<Ld=y^D(dffdI{Qlni{rHc;i$i{okuqc56!wD| z654C>M(UZSVc3?n(_BfDxfv@4$);06d7&QeB1GKYcPv1o9Pf)iAeR^-^sxN4hC-fg z=ZCVEHL_M1UQhO(VGr*f+aB%1e`@AK#eHP7K47DM@6JLVOxa_yKe-i2eC;|-q>=** zGEPXM93(C%jxYjotjG?66Hctfy!=u@{%ra)a?$_=XkweVvUZyzg=QWo;<|ri3gU04 zNN1ylUPOmp$WBj+hE7jd4gCpc>Mz8zxP`opLhEnSd9148z@3%I^JWZ1&D-1Tnmc~} zultpEtKY|byNXEj#5~?TAU`kygr_%y7NQ_gGmSRi>`ypZe;a|VW))HVfXdQiXp!6R zIE<198e7gAAf~N(k9MWFtI+eWd49hDF|^XnRN{~BG>ts8gJC$%WjsYSc+rl6ib^QN zGw%1I6Ee#rEmdtDBpJ<*Gp^eL5rXhCn$QC%+_IFM8S@IJEj*vP{zyR0$7?QgQQ4Wg z&-%6=5S7AW{Ya)pR9R;nE)Xp-AyrhL$C~aPQkYhcD@MGMPZwMup%x@d{PDyv2WdiE zss$kh(X>Hv)znO?mt0^DmD+o~vu!MM>s9v_CqOoI?LXb(2QC1>E(_F42Kmiu{{<?| z*oRNr2y3kO3RTS{J?2>bk29X}NJ%hLj;NeSx;rA`AkY~XZ2jg>SuEKq<V6~C^%r6V zNiZtBM48Or=!T(LR0zpm$&e1g$T@xUFbyhRLd9>;n=GLEaA9?9m_N1|WxTDd=#q-f z;S=xLNu<1Q2v6G!KLPdKGcc$}N6YD+ik#H6)E(g4F~a^266bAVVmQ@#ig$U=%x|F} zKjM5Kft^WA06J-Lr#;|&a|j@>kboq8XEibqWM^|qkMq%xLGW`O4Op%r<OS=Wgx?(O z0<*oLUk%DHL-1dn?)H~FwaH(O;p9|+#j}hc(_S2X%{j)5@<6&L3rJM<1qoDNe@NXA zXZR(Bv21eHm0ScPk=nmC&gyuj2txYot!ySb8u|tyqN}NF%xc7z*<GSPLN0SO%}w{1 zj>b*Gw?6+QTa5hcOre&s9>&x}T;|GBaT{C|bOAgefHqXC2O5=102RR|LfC1_p;jo_ z^3?i&Z5$nm7ZICG6I*!2)N`tdyFszW(1XY|Y}Mw8D=1niUJ7P1;pjJ*AsDXaLcu{+ zxahuiyd#D{DB)3%AP(e_qqNDECgAIBM@@GE;pIWrlHpI>$Uhg0!4q7l@Q4}np9Qq_ zxY+`5aYWC^16U>dz1Ym(g~?t&7XG2e6L_DSeUS^n0GQwHcpQ|XuT#xz0cvLFxCIp{ z1-Oa1?%!T)M<RcnppS2h_z+n&C8(`lI3~rihdgj|!m_VYU~EY0UkgDv(n<7BdC<+g zhPympKbaOkgg+@0zxZdpI~dQc{}pl54f)P14ta!q@2G?2G8;CT6>m8n_`T2;n;{#k z`)1Bj!#Cb0Bv7SzOE+gGu#g2!D^%ZarT;j@MO#-ez~iVD_+fh43Oi?u+66NITz2Zj z8tTjj`<6*ND+zY3VE{c{ZgJR44)691Lj)cyB$)4E<Ns8%Q#m;N4Yd{x&B-Q|p%yrj zguEbuhqo*}ohUW}%!-7y8iTtB))Y{khiY+Bbi62Z!ngd1{Zn5H9>WQ%u3%5)5Aa=$ z<0cakdro^JsF8<6CwgInv)!GM*7<4o0<o`EX0CI9;_LY-&A`qEBCLi*fM(W4^QNSw zroTTbZ>q`;M3&b7C4m|ShJ`q--H7fO?SH?#M^yh|h=Y)(rFVUViFc55V_RzR!#lUA zs>1tP*koZ}k24pqiVr<>QVG?Hq)AJSSBs^Zos}QJ5-`iT*}C(y)<625*K$0aaDGTE zGQ3NcwHEk{Pp1BxzI&$4kJ#;Zo4ZR_>o3IoxgO|YwssI_Arz6Ml!s-hNRTYZ^7*g$ z1=Ae!N?{52_APq|*dbSBR=PGp7cZ$ZjUDj0DDU&ss}NUX(NH#qjWGlmq34~NWrLqt z*lF*@Jvjz0YT28imzHIsq`u(t>vhpf{VlVUA8x^wV&o|8&D?h8tyLwc<S#_0>vFxQ zPVeZ=Yan5X^JZn`8;aUYJsHFodq_&!5%aiS-rAx$x*=TryS$vMy_{m|y`1m%Ua1~# zwD+j<Xlh&*qsYI3NYB>hAF)yltz)+4nhOK)qqf`k1n4Zjj9@L=a*7Yo`kW);Wmn}4 zo<)RL+|ar{$yHn!0Kd5eyj4yG@%RqKB+-=TJ`eP2af!e?9?ZJu8YEbLhx>+}AFvhj z%g{u^h4b4f9nb$Hv-)5~ksl+k5T4u{Jv=BGWhm_)6>78g3OdqFb7!3Uoc<%cVI+GO zj?4aO_Rr37AUSE58Yqvm`)0uX%fP=*Q!rWXpaWe_SZT|LjGunbG{j0JkA+nW=cbay z0-moJ4F3<zzV?q;y}^yyU(si_pBmtQ&NVDmRORNKniDk19Y#PmD5B;4JPNZz2Jf<} z;Et4Mx-qm<uQM9hGNb1ypGRhrFr!)P)^U^G-I(D5R?Sc7SH@ZZ6l|NI00?ZVWse>D zuu@S0m4OsLut*i$2o2un3+A^HuGCbHxtx(4owqs%AiR73K1u2nxvwqD>3gXp!4&De zuetPCD^+5E@Zcl1mL0>bt(rAHv8=iUZ1(vBu^E9JjB9kQkPTM4I_hI^z%{r3)Pa@Q z#)4cV>rZXYp?@3X;o|~-u)j6z{kvoP!omOo5HBKMQKzIX=g1TeYX?IGHNvE1y}_+Q zT>@9m2Nz$TdcaX+ua+JOG_Nlx63LH|d^<+WS}TqBZKMgvNy$9g*G<3(cx|*k2f<z( zG@#TSlZY2|+pe!j!b8q2b8;TqvWNRea*FO^#{t)3k0=guOMR}F@#y9z!_dZknJ)RT zjN8tgecToyOS&Awo?mOi)VpcbGpQujaOe^sliW-Ua_2HIEZdw<`P>3WY!04~skelV zXe?9}fwvS7>W+Ff`tkNzy(TZ|F1MA%qaQd<PzX1Ek~Fr}ZpUYVhH_SZ?X!Cd6#6$b zPhqTtps;RwLSahUe7Kg&?uoUzG+bTUt}5eWd;4q+)vefHyKZ$NZY~8nPZy>zbWF8R zhLPR=Vw^r76K6GjG`}^xY|!&Txa%KL{q;M`3-3&MS;=OwylV<NA7(}^$=UWX+@GMW zaz@ck(YIdw#DV4KwY)!RboV*okZ-=lLSvyM?!mur$|!8*W`q!+MjIPm3)nc}gKZ~k zBXB&j&-~4Dh>C|^1g$i6-{IqnQ-3k&zR=AyF3&tJyJns%KnP!!xrFg6;YZU|mQS53 z^!0|>TsXTjpk-w*i<S@JcJs&@62%#QjKtR5`NVdT%V(#^QhVy!E)3gun=~zE1leHK z$UeSoIu>8tAJCq`Un{EqQUm*MGH!?dXO%n<^<;K*HFTCf^zH&X0ds!CV+&CFXj5_f zSm1Zn>cg82fZI5LWM&BzVp0GGYPE4k7UIX&$d;C9Q5TtFDmKg5a<QbF{?0YC(ecyl zP?zjAoxj8oo9w3hTf2`LbV@BT8a75P7c6g_Wsma#e4AbLecrmX#0Y!w_7w8agvgK> z!Oxqd$X^<e=`SRI!bXxs>4^N&_k0T@KT45PwfHwg+>L%f=Cfs+rFdG8HMOirJHktu zP1!(C%>aWG?fA+uOu7$)2{vuq>E<v1WNnE)&CB~+Tg;hfN{luCvvE9<RR;(X15rdK zeyjeUJ5o>$lGF8lc=;vT(dEu7IKtV1S})kvDA)np))?RLG#W)xZbel<s6>^>@=-Si z$P&9N);#je&LnS6L2&yG%XFUoU0s0H>@;dsO;zXZE#s>wYBity=kUURj?LOisf04V z;R~Jw8FYQcyx|lST6V^E+R^O-M(2^ryxRJl(9X|KK&uXjl=cXjUrxN@CMQErQT;%^ z5DptcFU{F-B6;Y1sYDu$XTw=*0Ru9jov&0qYa=n(G-_c0?CvMKxd750oN`Hs-zgL> zGTkdCIyBB&w|@W}1~KA^p>zgU0xuC<#C>y4)Ysi<53m@W>-`33^(w*nq}}lZTZ%cy z&l<T0Q(Kqo)3*;pkOUeKu$_LjC^<$dIICNcLq&qT9#gKCI703Qv4<Bw1+#{;=9l%> zpz-Jj<2NvkJC}A}Zjq(u1|U#VHyfeWjK$i8o+{hw@a#}ge^hVNstew6jETcqcJFce z?R^ox#$U1IGjzy6&zL{H?Wpa?HXxwO<zwMVs{%;P7ll%B*y|FjPCTrEOO=*vwBVOd zBrie@A$eCm6oMw0rJ4%Gt8@H*ScH{VAEg;XWU}?-pFuXWv&3I+X>c|~0e^MVxr;0n zgNrE3nFin$*fd4Qz?(nT$k3jlq98p{`O8cGs`rK>i{cGbzZz`K9TIx#OE7eiJ8VV| zyyk{-*pha#HqIm^QyQBsRrfcx4MCo2)afARBS>(hGt}FJG}AA;-HLd1sn;KrW%(7b zAg|qtV5nWnS5R!Mvh9N;YxP9k>%O{upWn$wcKXnn5;hUoSYBhW9^Z+>#N5>$)uRK2 zk1y}VbQWYlq91j`()FWLS!T{2sBNmH$C~GCrQ2@Eld`@?Fs&>L#~qdWqqaCg`1?M^ zBMSzm<G*dQG`^(r55|8d0G!v`S-ZQ(NT&if%Q>UDM6ehh4DAjk5HDXLI7nnOA|uT1 zf^HS#&^>P!gM5qX7p4A;o~qt&#Bi`R<Nk_5C7%+tjJ~d~*gM8RxNr$kahdrQ+RZVt zQWSeJp9vU3>*q5(r#84X3efMwC7AVx=gym4DZ$R#n;CS%wE$*LcFK5o%1y~}suLxt z%KOyVq2al6P1g)k44V!0WhNIScb#%d_Hh>;{c6Yhr_3O!`nqjPdBX{7oDUR;(Uu-G ztM~A3FH9t$*y_dDQqqAT9Z$a=jjOM-XGTz?+}wS<>ut3MwHTt6I&-`zgm@o5KVAyN z{<3^0SshW$4iz_M2}tc61}nxQlXyve?qP6XpyII={NAH>C^0WlZm@X1_)4T1o$%?O ztH*V#$7`v<ZMWc%{knXH@!Q3bm$=DyH(5>*&{<aw3ecUxtgal7osN#-F8rquPxpX@ zpvEZE7C@2c^%L28d5Sz^$oIS_%cfYTM$_H^-ZlfpS$cF$dql&TOR+2cxf3t(?CXDI zZmXR1I;71!F@Tc_3d5%-Udm1M+q6E~lO<Iqlra$44wWC-eS&xDXw!C56A^aB*7w6_ z02Wb=GtR6^mjQSWbs02kIP@fRQOW@mNXX^NiOoZGd%$eN(uCRb1k2;L`FC30R$y5c zMNDqej~8dFq7tckgG->CPY@_`dRKgvJ9%Tn<nWdjMtvtMtMh(;%6oNEhLcL_%YJk9 zRf2H+-UwzRusTL$&6P%P5j~OO^*h%cwYnIn=e8iMN+B-+s2>}>>y@s*RGftRS%=`n z>AMB91oNtl<NipQB_ZmJ0<L6fqdGn}hkaReOhKiaN%7xH0+&lP_4T&w?V^}EHesh^ z201t)PRv<XBgmqb*6@B++g_=!^yK=>eaPAS0bn9<(xV4^t?~#;p|m|5F;)N_(Q9(3 zbYQ#uJlaM^C=2$#tD}g8U=DFx+=fns&UgUvGUzzdi@1prv(SC@X^hbDj!p9RWjY7g z%SWY<r1^wZIe(hEpq|KGUk;7T+`PcN+VqrO!x*rRTF%(n3pMsIGp&zu_Vh2L%)!^B zv=-@m{ZyNBE^R<|i}U}1V?B+!D{?R%0M&1}Rx0hz*&=R{1;L_o<JnuW`4sgB?SreR zLb0D0lmgM61b9C#v)v&lGe)qM(&vb;LEhqoPiGSfS9NUdRTs&PIPK$i&<M!naP6*v zr{2;o0=E%(vB(`3*mNk)cIwN4?cTPij(k*C-p1$rguCxZov1oypRtJz8ENhw`zat^ z<UCCVmmoQ1>_=;_{2WuiPHg%co|pucY<0aFZG*OUesb2tWEoW75Rj=w(tjMVywmq^ z@bnq7#Y}|Xgz9G8$;^$<?0^Wiwv0oU?kTQU>S%&X04BApldvzQ6p<OxXbPG}SI^)C z-?LHfI&jn9t?N8t@CX-T-3}7s;uEGQ7Hzxn7$o~ehQmcf%}|vj>n)-`h?#xNDDPIh z3WH9~fjCk)kb803RR4Zr=-E`=7mt}}53eS4e%57kRqD{c<VS&hls)qBL(<+m^c3%7 zbec>4!)^J<z$awVx9n7<ZeYluj}tge-c?*6yn8>oI2pJ-Tm&DC?`vg=xQ;zRvRUQc z+u_oWf!qDA$q;T_Kj%L8cDR;4<3ONBhqGvc-CZPi!F3C7d<#wh+=B<U`g31TSJjVi z!>H&44BnAS!JvRsZ(YXct%w4ZK^j4|J-}ld#OiZ?mC)2toro9(zc1G{%)jeS%j5)K z!-0nN%mBD|9BkoZpv3PP(xqvZmI}-+=w#REows1jg>FE#h>ar8bV%)XWPj>1QE|I( z_E?;-o&Zl@C{U@72_l;HzAv+g=obyMXT29Y#-M@0&Q)Cv{f~_*6W<9r5}Z()J{g)P z{+RbS9c?7USJ`;%sKM%G!2YkZ<lf*>P!!MJkL9-@18a0v@_?Qi`PA5boj+Ab0lG&a zblI=x0b4~YOq#6udGw?gRHo9m4uzExrwRx~tJrR-vN^P7D7ZRZ#KLw)Wez$<@AuZ= zMoFTgfdMJhAJ{e1yu$xJwrza!LLcxKo}dtB7Fka-?SHwE@t-roN}j6*vxkD=cU8Ua z<?Q5%V|uEM4+Io8U13B~&;%c}@u|8rms^S%6e~PafJYNAkS+N9WLZQ8rASTI=){S_ z5zdvIf)j;M0Qklg+fq(kD4iP+k85rEQS4)pU;dPqmx57Ov{ZDofgo-a5U-21dNwG5 zorLRvrZf6prSiBMqFa_}b7kvzB=67Hm9P{1-yd~&&D<TMq#%vJR9r~!dyERqZHU}% zicvSw&A-k=n*#N6$pC01IltXr5_P<IX*$l<wg$dFq*G3rJ|01zV~_HVaiOZU1)Ek9 z)a~kry|W&ybx9z+B3jL=q7L*?m&8cZsfD5>Gnsh(!VK>$Y^RCNsUWuInEPmhI+sN$ zdjlNYWFtZ4Qt&7pX(1%wkmNQXLx+at28rYb<!R9?y)1n{SIR&d{%MYq`yc*Z>um>R zRXCR&r0U8wh}+K>pt1nTg&P&D#H_REOy>Co4ULZN*4j>70SzfH)6aA3%By+LSzV^* zwCQpT{u>_ZhhE&m%+ys=w77Mi%*>9Qt&a>)Yz@8X@$N0|%(2scMrmm<pB<(2MHFm} zvmZc`H-jMqS2o9PB6g6U4vNR`ai(B`-%R5(21h4$=!e&ZcF&88ODrp_+Y7rIhtD}G zTBd%;^=ul)S2p>ejpjm?O#^suvQRy9))N+g@e~8dUG~N&6hkpBcTL5duHJ@VD0(;g zvD0jOW-U(%JYOy}e#a|W<r05ry%e{`SL~~!4(-~Do>qA4jkf^&Vi*xBBxUh?&fIeN zbvoG2L_vA4^FrlrO<qhapMEhi6_=0Er};<O7gsaVqm)UE+rjZh5@<Cjyx>O!r$H~+ zU)4Eb)#%47$(|S_$(G2sC=e3KZg&h3*u`2<kbBu)+Fn^weh9I>$PhK4>U`;2jge%D z%ISiK?9d(Wnyo{BYU+E%O@4OH{drKdtf?Z?R}CUM!hVOtp@X%8jO6z)A&-v0G(yG; zi@=yu1U)!ATKkmRmItTm^N`RM2jL!*7<Gg@y8Aqd=?+Ym^5-q&uN>aj>5m6Pqr!vm z#Xb=y*W9{rQk?$I09=w-2HJ7RA>7`nR9yBcw$;_FJMCkO=w=u+Nss<LVP5*#Q=E#0 z1IXyy%VKGB)Fkd5iI+#KJ|G)m6kh`-ssZ8e4STKVa+=iX@0LsNwC8&gY~%$^%y_WC z$ST1Vh-HNEAR_E;OK<wixnVq*3WyGm&<=dG*N!w>dR9AD?P)7$*YPYdLT!8|s9ry0 zzp==!>v?T(&=!jDq={n6peLJu{{||Tz^%V5F)mvWRJ``Hnk4R>Ty8$kSP~YEN)Zn3 zk52K%K^IN!Ro_$~RvSIhgE348E|}(15TnILS;JMnB`>>%Ouee+!597I1?s}4UNF`O z{Ca<(;kk3!DKd<*afL4blk*@z(uGCzc9`y=)rtE(#h-8@$hwaz+}Yi;>J^+dtZ~7H zK}0?l-_+twV;BXE$sVkk)WUr|c7m;{>nHwLcO3s4dW&%F3X6_EUZGQjt(d=EzXW+L zpr8@F|LlKB*R)RS@eb{<+S(*}f9HV<>^kAo)wTuRwW;?g%klQ0?b?njj75ThlDjRU zfpEC1rYC=6#QLm(pE@h5?b({`&G+e8_)7KQ!=-AAcxrQIg>4%fBxv{u#PAn<^nEVz zwv0CAoMajo!Dh{xS(iM`8ia2629b1m!-Je4a|>n+pT%iyY+!?KQn-R;E(#S82o+W# zL*dZsYEB4KP@BX!K4ls$=!mQ!&J`j#k)rTo(A2z)tf0c9E0tl(E$4GJciABRGr;=j z0Up&_MvRSn^M3$EK)Sz(i*+`3>WoJX7Cp2gNqCf=<b}zs=zkfAKCW5ELiek0E`L|Z zF5|*L)D<SE=3kyuNJpvGN>e0LS!lD@3q0JT`sJCNICiYkZ@nDeMS}u18&7}Hwf!JS zt}C?RW7g1xlztHb5Y(hMslw(rL6!Dl(SvaKtj^|Ukw%VVz?wSHH!iXcgp^Bo)qQ~r zavG!L@`JJ6?(<v2!;)0q>%|v`Bwz3aWD<zZ^=Kb5hbUYBaG$zTgjSEf`1=Fd6j4IG z;qubvks31bQq$gcgeB7zpUs<<miw`M@1{vB&t~0@CFm*?GCQ72(aBDms||YFdL383 zf~m?F+x9@5Q&Q1bO<l6#HOax#=B|+Yeh4Zsc(*QY3(c+#b|qj#4ZaIcUb4H>Eep)< z*LMamem-|1=L?%a*;vPPgCMf*t4Ie9-XVmH-)D44wwB*rT8UzT=Jb+<vnz{gH(R`X zkdu0aVeKE|pOx+$p1f-M<tdJ)1jd@WDIW0MBza;Ykk9x~aZX5TVxH8^XW=@QZ}2S& zhwAzvQHPA9mHy;+UFTs$b~aX50>XMN4H*~X1B_f=6KOU@$pMAG*1817j<4Ae7KXfT zXH{a&GN69o11LNz5O2j`f`FDnmtPi9SKd%?9nGBJSaREo;<29loD`oWO$*9Af#}Dj z%48e@{m|0INxXO4J%A7LS8^t%&c|nGhpl(m_bIl5Lwy;u<QZiL*yS8=aD3Kdx$CrU zoDMhDe@v$O#x|oO+wA<ltI*xaW{*$`Z8sNEf&$Bel%ldnCj7}Ir!SCjzmxKOf5-D% zYlCOr6Wi{2A3f{~C|3hSo%GQY@O%fxCJs01>E2gk;#b@NI#|Pi7}wz~K`>`EK_kEZ zJ3rVw1>|4-E;OklvsNKoGqF3{mPWled=rtY8lwCewFnM?K)dy#{3fIi!+#&<Ba6## zfR{>k!@~Pk;WM8H+tRs{_UFP!3h@1DKdRrmI=A2?_>muLs<`P+6Y>)9YlgOG%*$C1 z(D2an@Q_5<dR_ad%s9q^?%=Z1UYuvSezjg-EMYrwpj#YKoMnNL|MNI;wU4FKNiRF1 z(66~5df#raD+)G;IGZWUN4#jUPuFoEqQ`B+3w#AY0@08p?$HH#7nU#ZgRE;>AyJ2* ziG>Z_gH7T@@3wtT4=dq>`{3vESo#}({0vYW?oADwg$5)!hr)NR`daoX&_HB%S)r-Z zk1MsS7KPKD82Pn}#_$*Lm+J77BR!TD4$~K2$QM=jvEY2@Rb;r4b{`Tk-*nL@3Y#jo ze%RXmY+b=+9|ZUPbz!@p{p!)?E;Y@omGB+P7t=OZGDrMPZpFpUZM3?gPR?F3ldAP> z4OcWoRlXc~F%BWHynO~dTpr+~DG>+5vXK^-t>_B$Fe18vbF~Jsrq-ejPIgU=)Fn-U zRDrQkPVm#^2kW5)%4W0);|K3KjVFeaUP5V+sizH>zwaJVD!}j6*`H9u!^=vw9+V8) zH-GWjQe;>>aMr$BxH7Sd*TX`za!<Vxk?PJ1X~=UhiR<}Qrjj3&sk5IViNW)bB4X~_ z)6Mu46=t>Ae8FnByeLn8?R1%|UjY`TP5B1(Tt<9rRx#Su)*+2@=bS~?HebR*$!?%C zM$0G$<hKTUe+Yr*#W_8avxnseNAH5-JG$hY$)IAV&gNcyP3dL8n(pB&+=Ly@^uFf> z?~bYKB@Ez!3ae+|phdtHs9L@+{9cB^4=e2D7(VN!tF_eiDkh8u>ON@buEhkD!Fd|1 zJcB!)GJO|9F(*&GEcL$t)@#y>t5~e;-RyIW`4;G!+Q}uMuN5R0)YVz8+peXY-wkpm zl(pcQK3ElX7(CNXNn*e}r6o-6E4h33o4hE&el3;Bl%x(H{=!2>AU8SdWRgVS*@Y!d zZH3+_Zn#Kf_k<Y)(PCT(p4uCL+F@--0G{aZKl$oacAim%snu2$(O@I|%LBN+xVQVq z1V;Yo#Df2R8Qf6Kr78(w=BwMmTKcZ%%{qyZJyRIBxbkV6eSr3-kN0v*$6ZXx_A?zv zdJoS-aq)o?F2H@JJ&q$dX02b}p@Ozh$Z0bAhz`ru)|vd$C2?PHX7l@|z1TrtT7IfV z1LZDV*`oQ>k&*sG>@u{j_5P;L^CmGT0h=BS^t|!CK>F_{^EZCf13`+6MfGbul5)^o znoXOmF!YmZ6$GB+$jni0yL@w721hoNnaYa-vq*q|GBZu8pK7FD13(9<cU5RB21N-n zV)nY)==7dB`eXNv`NVS%*mU0|4`q0tr_0k9`7<)ivozL;Ja!=+9T0LZ{R(|1=`tyK zBv<%NOl3bCS#_l(VtZW0aJswT&=c(Kr7qYct~Nbtd~;CM#DU6v_R+RmG{=-xY|>Gm zuvBv0_BI=uSyf}rPe1Gog)OW(2j|(htKIh_*$im)iK~5cYW<~7-I84LwH7h1P(eA! znj*LpJYVjC!^iRcNz0N@K@*{GGbv)mQij3vk9UX+z-ui(5fm{(POh~M9~U1g=&@MR z!-t2u$%OG`9s?SKTw38)FV+ht50&K~%Bi`J<qV{|dL1vKaU}Qd(Y5rCCHtOoiRR3w z+q8#Xn)^1Hgwv$5_LNvPTUNUVNScl&o-WeatO^RGejnTJNnXwR!L!@GDblATHdD1A zijX8vjll|8OQq0Qvp8*7^V#l&X;MVBV#7WL!Ro$rKCyl>j0r@$n(!qd8%kH=Cf=}> z>yg1Afn6mwT&;-IEnrdrAZiv>gBq%>OCul!vG#QTN4~&0CX-*I;=+bx>oxsb!CN^7 zlL@~+hP8YDcJ9|1<DGMNm`ERef)0NsvO-}-Xxe?X<OOf$**E>_-H<vhIiA_@^Kv<* zO>2&4pGT+9OI&-^5y?B8*ggL+xi4LGY(5pOVEtEM)>4lSW);!6URPa00NU9%UYR}o z>5Azgk+zDL_Zl;#fWC~<gN67VA|o`JQ(yH+B5DY<X(u9q469yx$07Bv%szUzIg~fp z_#slf=VYsir7c~((ZPnwuFkz}zrM+=$B;B3S{}TritwVw6!z22rOW(`hLA{&8)Gie zV*l-?E)bj{6D?WyTeRJnN#C+p$>)laqXbu)*=0{jrMrqv&&$F+!Q3<~IXrPIwExa+ z$o<XZ@HBs4?pyQ^zgoBBSEIH^J4lr_R+;%8e$tA}&L>jtlpFg=is&?pSb+El>!%xx zGXp>9W;{nvOEVj|lAgzgU3!;$@Oh;XXPVX`&EGQwEjZ0N6_WUV3OI)lq5j~j&bNZk z&^l{cT&7#}&+$`TyE+O7tHj7O1mz>-WYScfrlXdfn1yZUezyxJQ}0`m!ZE=E{ertP zAvu-TR94naqCB~iX~4%ic;Tg-y~&`XRsV0^DG!sht1HvD%b_zl(x=VtDn=@lkK58x zm|@-mlbpx9Hnm$#^zg`L^r!TiKsty50}w-w@(NoUI3BIcJU0E>RoOX>yV$+=TU2Ro zlZH3w_kM4%-jtBGxBP2fa95kDp_ISj^OM_1Hy=#IHE_H0vJSIfYR896P}a_0{>Gaw zZq-l9JZC*m1Eq-b7BUUj&&;4y7c%{~soa*m5$$9u#kSku>!TX@p){mw(}3bVs^(l^ z`ufWC{aS^hfj0W@ZdwInU-wPk!ty|s)G}eYn-A(D#JG@HlvdXpc`?RpNqrvQh_YHl z%bms{Aq3>)a4w)*qr*?j>jI<y9826~>$>U`PjJ1@drs0KnT&q;U#5}YuV;QGC~v~W zTnkcE50cv%oNuI_A5WFG5ZH*X-)}aSykAKuuIkn>F2C2q+nFbM<6vl)i=Pa*ezAP} z9*yEOpZZ9SXEatZEFg^xJvQ~i4Eb=nEB$v;&88vlM_j$$>*h=C!>Q9Nt+mdC_r9Dc zDFsUe4+|{U4v?FfHUr0fmeDZ}^YMhocZb*5DGXlGVRU^ByVnhO1wd3?gdZkA0QL$g zd{y+?EEO88Xe2mWwjakLZ2y@)B%!gO=)k=9j}~`FD1)hv)m&H7gwt60{hRJX+l%A^ zB3&@i`kPSLelM!*$MCE4I`17LRpMP5+S%V94mJa6DVl2?Tv;atw!>h0SBYL>S44J= z9`!5^qQwd`Yd=1*57TxavP^!JnbcFz6V0w%dHuYC>G|5%JyDUdXH6h->yP<Tc~w*# zeemd0)Y&%*xWpTzREGXc<6gQ$;?z_3E3WK+`4z7I%ddb+g-H4GN`Y*!xw@mbyRqrZ z*RI}y!n(=s`iAD-w&r6Ueu)fIo#X4({S^~b+a8m>PsLNw5EiPq!wD>6e+?%nU~BoZ z6AI9{S#oLvdN}@9b`n_XmcT_~K2e#OxF7;eDM)QdDwap*;{rzG*H?p`1G%2%b^xxE zV9@tc;*A<1=B$+kxr)o_whot96CibSUzmRrN_MuL>GOJ_`H{?R<=e@tOKBLNo7Odn zLU-isT@;LORRu=q&nUbWm}9qlf$&UN_S#J?lS|5qdN|8Ud<*=F0*o-#^@=WDGT(SP z8@o*u(*m?IqV{m7v<+`eFVTA=kXf64$d7M|Ca%toSqLRAptN|qBK{dvPTcI}Hu6-_ z8>*tmD*b$%xzV@bOw;xx{$;a7?nHN_fljV>ld}9K^>L`=%GufZ5W4=CsY13qeogXN z%~U%*0V%Iy_GDQKV@3Y6;ruQyi-LvEPUQJlh6R+W`}snecfS%OXLToT!swT?>|hU$ zUyS@RXDz$UCJj8p79Ih8aUZZ>U?eZc7zwnw!S_4THj7xI$MV$vQ>WU;GK2UR0j7E` z4KE0FAdWkV56k-#r*hew!y4-B8k#6Bf&{w$=EB<jbRIVLLHe_FVPF?a?fjlxL9FU* zk$T&;89l}0^yqRd4%%i9@WToN<>BlqpnaT_X|ZVIT=NU#u%mNTVRpA0LzQ7F<J)^G zvG-GD6g1yRU=5`vpYIBlop4W*d$xH07Fgq<uT-E_IUu}N433&BsGQlTVxF8o9U>^f z0y!9<xl@GyDY1)ojq)9gQ~YDGO=rO;DYe@pMgB^cf5U<L)mri>kyo*2k8JQBMNyQ! zv#!%O<o;ON`&nfA>wT(Hzi4Ad;eoA|>i(jijGx2>h4p+Y$FNbkogfUG0$<8>7V~tJ z4lpN|6%+Lz_Muf*>DJVpSSb8RedT5@(5IAjil*AHEVXT_y=jzxlXrFM?(y?|3DsC9 z;DVT?{~GqY(WUJ^{E_qIU33ZzYR<?fcfNYJw+~{G5EIqkfF?8_54qgW@PWF#ngpB> z4|1wCLkpR5!Q9O#^&d)GIz<PY(SrgR(WVUB6T=p&#Gs;8DA8wPN?5Ig*mv`;H+V5E znwWATXL{sCbLVcnLa2Qd@9M##`FYcGv0X{ZShaDxdvcjn_Td5Rg&KXMbRjZRu?^AF z{3oIvia~L=Sqhy8?l`NtT#omTIhroCB_hukHr*d}Cp8w|%M%LBBj6cBJinPeusdas zv=6!O!GnVae^OgMyRVe3_R|nPoQb!!dvgkG;r@vp5RiOQoAm18lQ0u$yWDo4W@Uc_ zq{p*XEKzzo#LCDHGY_Ez42{4ub<OQH)cT9lUTJ*QKCdi%FTypP!^d9YOH(E9ruj{b z>|0Nz*1`ev!AJWNYp7!zAz;1nHtL4@1PsSpsriQ5#8t`ktguT1_5Mm@L-UH)Vn4f< z=@HfhMps`}vgN?J*Eywr{hc#o{Q~oP>|+CO6Xx1MQ}mPbfo+ai7yUz0X#edu2S>s> zL}|Zi`-kGe)0i87x93km;eMfc6WChgq!*#rJVSZS;BHCVHZ`o@5yZV@3XpdXm?Q!e zSMS9@Q)Pok;`of58l)Kq#3T3UR&=kOAT3QF34_XQs=6K(!{6tH#tYSRTpuV0FJE!0 zyasq0-~k{dO>8F+NJOOKGHUBEIw*#$H0+B`l%1xoD2<Axs&%=*l-BZnNKA?BCdtye z)5drkLSc(GwRat^rO^nG?2e1TBHQ*(d^H0?KAyV2b5j+Uz`u6;2|iT-1Y=Q(v;gqE zaZ)5Ijnelrz=PI#0cT(oa8y_45KsIg5Wnj5Tau|lSGv?KC&)=c0LR>$na7-~D&DIZ z@4Gc@Ta&;<CL6$^IL@Y~D);GJTKVwJ#mLbE0KXSz(35axY?x7B)c>SmU~z}pw<tx# zp+%_Wy%#!x+YKJB2270EQ;nx@@3h=9br5ASIWk1HR&-ineoI&!b0N}J6j%rl$`2c? zY)+@tsd~oVW6sA*VeJTuTe5r&NW9m!sNe01PI@ulYC9nq6yGwY=%NLxsdoa7s3Fq` zt~Uekuo5`_s*_!+i390=4i1$&V((Vqf$>K})?e7B^E8n4<Ym7OSX%n$#^+ByNs-y7 zy)Vv#gl010#H-@vi}lQc&^8^+3xcDK<wui-jV8IevpZuCT}=3+C2!8r9E%uTr!(Qj ze^a%-`CV(^3|&SHbLh0-ygTjq*&LH+m-8;ChUP4<xMW1w9v&%>p7xo;dV>LY6&qBT zBS|2M2gR5Iqg8h%y+$h0OPAaNMfeG?E9wMZdpm)OGogVBM$ePaT2SEp8;$8z*}^&M z3#2>Sie(R#`)_${ifyM5u`RLRn3#U4+5P*fIFsdf$Xxu1Tw2&Y3qSz`#C4QJVw!&U z#BIk6B#y+>M5(%L<wYO~R$jIB9a7NIgSux{$!VLb-D*;3F7o5m3jCKlkLqp^1obi8 zp-A%UE_^y|`(a#DMQwIH$w%eEr(8N>uGf+PfmLe|DOO`lfxjE%37JHuO*TPP@qjaz z%TL^Te{grUK{wzXA13^HF<JIo7B3X}FAm>BWL!#B@h-e9g$$#T_%&+eBUc<v&4r5B zJ4$x)Wu2oJ&HL|Z9NM17hbN`39q$^{_B|3s2OWk@Yv;wkKBv#69CZ9P(p9f6ejw~& zPlv|bg7xMpO;Tcm*}#~Wz=6sTzC6FFL&ANLCX+0>0J#t3ZJ7#E1OPX&ktc7#c`!QO z$@SQ{GCN{<g7MYOtH=~AKO!v*eRTNO(ct6$${UP#L31F)S$l4PGfp+!rE~nj`i)91 zB@XNgi<?<FgD9aUd@2mWcJ7~#%otecLR+}@a$)ejOFj-QTX2Lr+D3}#uQ}TptmKF? zf#c=M46ToY`<veTp~kr20f)*R3I_*tO!>Q~PO16P7cNgmgxu1+EXwj7FD)BIdK}h} zNK*aZLl3gMPupHrwOPJ@e}kD>wCg=y-b7-OQ5^i7sPUGIvm^__5TD^uN%U5S8?|uq z>>_OP15A(J0Drf(l%&Fyy7ojX^!kGZh^$a%_tISXt3FxgTpr=&g7Xgg^$AEpM;H04 zC{=v=OyB@{|0mQ0>J_Ju_O@slZQbzLWj!x3>lz1}@}`4<8xfHX?0K(~3aFZ0FOpvD zTu{Wv-M4T{5pbFW9P~KkLO<*?Skn?M4Sx-#f6D*ZAv5WEyL9Z~L%xQx*8)2&Dl|XI z)lF2?QibFmt2q8v;8E0>n=Val{}%t5ggvy;TyV6O`|U}e3@v<MokP&n78%BK@P72x zcs8Y9yH}w{2R~U3=GSWHG)OC;{V9TVy?NCsUFMh{ip4}USot9aoaRDhpZ-CM9P+w& z?N*#$$x9wcs08)44*FzQg|<dZdM&3CAf&idU68VFpW{UrtFv{OuC%P;G&O%3&!cjN ztAy#V28F0Taq|)B=<qrHOiUDu9+E3BB3)q~To_%wDah9;M7_4tK#%1vrr=QU1k+Fs z1Jk=_-fjO`bi=6j3aOH`Z!8WB_rjl-Js2He=yrMGvjmTqHGHKagG|pd<8K|30S!7X z_v(|O+$o43sqDa}25M)_G-4ssD0QdhSfG{*6VpfaO4ub3-#^6q!?uD~LYu;*t+_7u zvxv0)^MN=3phO8aJ8{J-w=4N*8N=G{u`Nnx@(amrs|mlt>6+$8UoP7Q`1beNWc!uI z(f9HPwQ1aa^6x4VrFs<Ea4b8o<gZJRb37bW=_6(Itmh{JSP!uDD==3bo|q3^Gh-4s z$$~sgkWoR~mxq=CxnI+kVmoLAe(^8?I<eT~gBmCy5A|`ivvvO`ND?o0BH5ewvI#&J zcZv46<LS{>Bl6%|tI&<p(@~Mwmy&GZy^alCzOtngM@Kh#wtYHH;{4mSp3nOe$mC_G z_1yl|v$N@=_C?NGLFPEly)7;-Ptn@(=7VZv{-blpvB2{uYQY5k9Xe+7h0ThGeKgI- zLeX^@_G_!67xnzLB5lk&I*-ivHj{K8Ne-w**1%;18WL<+yL=Z{F@xu=<d}0_Sb^Gm zHay?xKR}_j`I;u1m>dOdmlvauba?nvlrfnT6u9^kvmRQZJetT0m_)*KLsPuYx1k3R zlU?aONjve<#hZ6%9lp_Mi4Qc>))sa!><=sUo9zaNw+Pll)?as<TmgKnUS>uYCelRl z4??6RsXGxDe4_Voa#wY~kEyf;9QVjFv-G~(Zrl8vk-05DFi_ZR>K#I<En?);sGvND zml%kVmtp9&NZavkb(X6+O=q$0QPZ{wa?0B%7oQ$I@bhNSk4bI>ni=)y+~lSf4s0M= z+k}7pz)R;iBimoeDd3#$=rgQ!*69|zhDIq$;|uUkJjT*@*5!P|VpJM{vb&v-yLxAA z>ff(>8WWfYil7A%6z7RpV#&2coS$Jx268sJ4PDJ&ymv2FeC>8ezqeU);+uEpwed01 z4H-eD75tKmssuNav;x5tmkdI;@dre11a?KbUA`NnJUqqc$K#sAx#Z&y8&aaJLW~}g zXnShBbgj9lBCyMdng{qNcGSQMc0XgJ0~cJ?G!d`_zns*O;KTb3rM-MRe-Nc{Ss%+z zmib4-;Q>UUNvZz`L}Kyh3m49i10cpKdSzC6VLbY?kJA#CG4^dNct-<M-K~6|Sh0>- zWtu&Qmd$TFy|#dZ)1b@m?PZHCfuOKhA(P~s(w0c6Voqj_zWb2tq!#X~fDDm9;tKM9 zfrN|8@<4w=)5Ub%gidG7ao<=hNaTqPA5<MZeHTzfCs%jV?!6zL5{A@y$K>ba0Yex$ z1!#6@vI_c{uXjws?iabTu<O~zN&UV{p+TV>!yQ5aD(xWAnOBPm`WRrq1)0*aObGO0 zPkzu^^WlASTz_mhZx%PO>IQv~G$QB7>$|UF62J6g@17LRks`E61lP(obDc;48*=RJ zd(n|Dq)P0hP5zhWW$Ulh2z-^V&u{CSeIX?eUZhohaM7n!TU?i)y6fm-ZFbi7d&x@& z$W#)dH@(e*eP@7GGj^$C0fhb#L4kq7V>21pb+#NFkfuIogLAz~C!dbVFXvN$>6}vo zgGD_0P$3yr2#RgO-(NZ4={IN_8cz@wyF;<lvW3fHq@|CP!YR$JZy^^xC7k9C7URoy zozFR3D%aN~?PuA1Hb*Ags<7czQ*Wz2C(n-Akc{puHfDxiW*0L!DViXQ2H`9sH!lmY zLX%&hA1GZ)eky*w;IJ1S{KzJFASkW&+;L6G^o-(>|9N+;j3f^_GGFlgn6Yg;iP@Z9 zv!1dmSVM`@?C9G57YeE?(7-4Fhn-?vxxudZb@-n;puvBX5kuR!al`pehTAo`ZtRet zC@K_>f9Z{dm=;XG1&bjY4uDcA;8RV{w$28={YLI}-MFtHI^w1{fx8fKc-~AR{+YGw zsHAF(=4#_r<BlN~K#Jb#n)}UzSb5~T#7jR<wkPH?C|KR^F_?U{H=UJfpYFV~*EV&Z zGB$9a=*g^5AL&j3EvE^0v6-arEoE&4(Dh&~%KU~sfw4K;LFy=Pm+XcU3E)`W$Du6O zUX7lzyuGeXwaff3cgIWEzug_sx6^<Me}0gxr>U%_yR);k?sI4V*QWaBUPK+D?4z!W z2!BWr3*_@J)U2;Fb={UKZ_^NhAxcPdngb?L#_A%@uH`p_7ZB!F&YNZj=|D#At(t6( zW&6iFMlaZ~1D}j$=F8DCK5u%}(3G8ch)Y0&lgs#GDnE(~kWm0;yk9e_gmkN!1K4|V zdrrnWJawXhi6dX3q@ok20SA2SkHylgOxf;9+qVb~Tvc?4hHiM61tem8p}oF0qwTw9 z6(Bv0K9GqwdnKyfd_QAJk||Xw8yf-5i!78-nvEVy7bfmdCH%k^&`ves-zh{Tu~yz| zt>Y8kFZo6Q`~B5vqbL`{8-+jD^TAu<3m=|`55L3%@Iu25x)YJfL$OwiN9TH%Uo@X< zHC*0k5P8-6fjWVqD2{et+uXJ#eG<hnrrKjhjr)rN+l)?oJSS$o-XsplAzw>3I$?E| zZ;7wC>|G7;L>d|2Ob?*j>7kxCe+kT3j@Ky?UViv0`O+LI9zCR^ieAzLi~8x<@H4MA zL@3z?8xW)Ol7Odn<l0ISaM;zF4wQ`UQ|`euH!5LCaQtxVBkb+Z%X*?*53G9`6Lv@# zxR~=mgozN++{qCQjfC)9A$I@l*<FrA-Kixz5h6tQ-s3j=z=`;$7cDXI)}+Qrx{LWO zI&^%j<w&VxtYz9yrPgL;b9G@3_dC-k(d~o?c|J1fHC!+T&vKgMcsHJf?$3$k6%xdo zW94<McnQ6Jvd<%_zT>u|xx6ugO~E9u1jC|uYy7S@6Py0pRelrUodV5Ck)J7KP~O_k z$F-+88e8>J1qPYF@F5C8u+)GjkJQb+;Xrl-B2HkBd_?Ij;^1+sizQ6Fv07ke<5A&h zi-PR2V@w10&MBYRjsnE05}YQg4o?i4*b^TQZDG!<s2zy34UKi0Pna?V`WLgv7eCwS z<0MDsFF!sV(X)Rxm(PMHEN`9hv1|774pvp28^!sCCrCl0tj=<zw#p6e8p|R^>{QfP zjTxTn>uTJkxam!%BY>-K>y}!46EAWEQdcuNJ1W251PQTsQvU|DHO@Zpw#GnW&EdQ< zzlX>Mh!3EX?O92N)2^S<XJ*SE6OTX5w)=Q!Vc6ea%$Fo<CUcx8mQlkA>myes;AzKN zq(!R}H;UTXY2)&#-jsT_Ig$+1C@d6-Mb<wXmEy$LJjNHbERzZG37SYunehopTu#;s zn8Cdvua_ugjV|R`pF!~;<@6jK3vO!q@{Nh0UEcF3TQ*PnirJ_Zgx+E~8esW#O$~Sl z&IO|X+^XlR888p$FEn*clV1zR&bcwEsZ|L|3sKfI{5pUSEfqh0gav)Y6Q6#P*y0V~ zUl}-igURfdJ~bW$xHe6@b1pm-St5bsA3wb)_djYh+M2vzjS$^fKtog@$R?uosPxgS z`6W#Img4)sN;kv8W;8yFqVS|qA3l56Gn(_XCYL332lt;l-||^@`q=6n)ODlXw6@SU z@Wfim5Dq-|Q+|*dIgdA<zhXR8f%zuZd(I4?bz|8?nMZmaW1?Klb2g-z#bq8GxlvGX zs9An6oSwBw!G%3BMiliy2ILuM(0W#tWC(e^M8td!k2eS)hd(^+Mvdq2boZRC;=={a z)=nmj5XX4j@M_KjO|{j;Z(@U~o_jTDyRcVwV#Z!1w+Q+~8~a!HD}A*kzZ)K}s7r>3 zmTr6ew55A}m*3=78cW04^fsAp{(AMeJI}V5W|JjPG%{~LD@kO{>}Rk|hOq-}@79|O zrT&Xf6<@Zpb#qxp{1B|$1pIX19r2GIHOLa66@XZ%DGzwS?kCO$1+)X_Z2YpFTed3; z46px!{C}t~@l4uUTOk+guICYp_d>ZGWL<w$9(zf6pUU-dH2bh?{O5s(Q>+E6UkeSN z7#avas&)uz;UN>;1wRM{<|LbEzW);DJAT?m_-1~TdX3G*eyzL>3;Cw0X_~{&eK51r zOmxRUd~)~LyQ<Lr%X=U1<5w<|GgAwu8-?b1#jvB5#@NC@Sp=3qlhD@YtoNsw@Q=^+ z;QT{Cg98q;g3@c7opt!Hf7p6+YbFH3!>Vz4o3!Hul&5l!<l&zjw0z`8tc*9z@mh3h zGZ5ZReg)=>9!8y@sTv)woe`|Xlz!-a>fAdP_i@!5D{0i^@b#+yDP9$nvH&_R*4~!d z`^5DG#wSZwHtfx*jLr#6mq_|F{DzEv9-kw<_$B7g7@C}pd<S+cB0E#y!!p{Hy)e;% z5njLyd0yd6L&L_7rWpSY*G|(-dwyzsF?0$9TTB-YSTsF{HOHm$6MhhZ^t=f3PXTMG zhulx}i_02v*cq(s|9%0p@{SVGd@H3Wo9i|Ne|>)23zx0~?5Xdsj$YlQ2c7MgQv304 z(|6I!;)iL()<p>S*BqGj%hMTfBFU2UZxebDmeb!`Z7_cpee@F9Qv2E@t!(|N$kwl- z?C+&C^u@;oOOxV{<Ex0cMAi_SLinIReVwO3VD3RDc7aLiYRNKky9J#Q&~s|<V(a7U z+Z$dj(qChoH}$fSw(5mxE9VkN9Z;s3ju;#6){?>nWzGICqP{vRs<!?53@K6ujg(R% zN;A?Rih!iFw3Kvr4F;%$2+}Y^DBVai42pCNNXO6)Js>qS-{E<l_xt_DTC4@@oSFN+ zVqbgj%kBFmSJq<Tm?YDWF{R8^?{d&CwZ+zarnxx5{_*S!8-|+E?cLE`>&@LwD9=&V z&iMvuwCfXp{N^$n8zm4)kgxh+N1jyZv#1(l+q@$m;w66LT<}P1rF-m`I_~R7@=zZD z!_^*9)|(l7=%)~~EMT|8{W7o7J_b3fY6s;^pGG)Mnl5By^oAiDBc65+i-aTD5ATkB zCgmg`IwprCy|ejE%Nzg$Dc7=48R*BnMj*D3C;`2#R@Bc-J;?~@m#BVOf&NREd$#NB z2$rpLO=o{A%!8RgQYO1_P3SK3$;gef)g&t~`#3sze(Z<t&XeZ(2S^ElwLG2X=%G(j z5P(#+%;hXKRb`xdqI|S8Xm4jiB(M{C^Y-dQ$lqHm(RSh3A<_VY`za2*cwMS=ojruc zxck+WjT5!RtgQo-MTi9&`|f;IR)>br$yU<`D$0yvevr)C>*cav!V8Ln=g5JDef-!( zr))??xxV}j5)fRHffB8lj+H!Dj~sCIYga*2x(^Y;B=5Zg?jkN*pEcJqCK&h24Vx*Y zw;*f0<#@hGu4U5=<Ppd|Lv7r(%QE4N%f0X!6cgxbdS+Z*<G#qlVAgQ&yyq7P%V+^^ zMF5}s&)*xW;xu;R!+Htd)N<?ar5s(&A(A$0aylb>xgHn|?)i;o$$M4unJQ*$;+wB- zJZxlb(1@OQs=BBcGp>+6Z!J(E)CJ|XYOOI903pL1G;;s~U{kJN=|GzDL4cVEqzmkQ zuxagq!wW;Pg82zLu-lGf8e7$*CD*8Sy*ycS2-MYqR~r@jw$08Dl`ct7=$;VVm`NIJ z;RKPZ@-$rMgIU7%pEsx}3xf5{VX23t=4QIxJ#vJC7M2Hj;$ht`7PFkIs<<xUvBi4b zrDr#NMay79Gzy7f#WNB!Mum4nQu(k!;(8(kiJCmOY^5oNTd`8DFd_-gvdm1o6(@Cd zUj<Dwilp|?Gqz<@o(g{o03a0vF+>nby8Hqh#`cw#$t>do!tG4=Yp%zw1Yin>%ga^7 zyqMr1-o*36SYV{qGUoFoUoHZEJXW0)_xIb_ly_V5^f;kBUm=}9zDe2L0KZm3&4kwB z3Ii97hFEG^Q2uIhzlOeQT&Rspg)Yfa$Cqb7u}5MF{+Tl^=Jw|*31Y)%rs!w<!f9-0 zLl0h!OXJn3f(h}Z-5R~rgh3=%o6pw-dR@)OoFqd+q$(C|#;ki9mBVR^>cs*11wd9m z1De8)2+5dain!k;_9NU5u`i^&&{Jk?;2oiyFWGuV4bTAcE3aB_-2v;igR)bjRQx>v z;7zJ~n3Rlm3hcXBT5=o;{nVtR8snuAQ6pzhB$I-l*z)&~;h}s8P?T?mTx@!_njcN$ z^$+L*Jtu8QKIYfn#MYy7((F(t8&Op7q_Am>Sk+C9bJxDwJm0>*Vku%Y)w?!t?qXke z>GP1aVT^rcMAmc1Bj+j|B^mQmkAFJ7@dFiR0Pze71{y9jR5rB5M<=<yM}e-yHfc-H z0!xk0zc`?`k1uK1)-2Atpbx~H^I#8K9XBBVveHRr<nw(I7W2h~r{a;m!Sbq)YASiQ zvX2U6#+(#7mzHn6-}Nx}fmp%b&e-eO;N~N2Wk7freGZ>q5KiJYlY`U0yhANmvNIym zw_4waTwg6fbeEj-1~Pdm{J|BL)*n;!Q6h4N;{Ami5pU9>Ee}`wR~r|vUaSWv-Fwim zT3V<o<UD6UCAd?h0D+zQ|HvSp<ATi4$w03TJSYv^%LymWa}k$b%ubpIM9vzD5PDIm z(v+8#sT^7i<`icm#iRfVFxWeis6%<H2ZBmZb3$joyx<{J|4wK3ViMJ0-K}M=-I?v! z_|SCrUPnnwD?uBiB|uh1oxoQFTAoh2lZOzlK#Uo6{Wc;)gjOf@y5h+z{x(VER`Iz8 zcxWt_{umDQp+1>Do#%$|GC16e&oZRnNxuE5Xtlt&3l$$Pt0qq4akNS?Z3h{U9=ZmJ z{qn;Om<cx(50l6HV<IKPX1CLG%%G|_?v)xB)V@n>WybxZZ~Nx`ot6{C^B*p*{%Jk~ z-L$Cq_%t_XCZW&g@brk#ZDU+kmqJ%!tl{_B*Td&`u@>5F`d_8?-h$_DT=+zu4z?;g zz1)zSD_}sYyV<)2(c)U42@wC?BSA)>>WvrmTuE+DPRR{$lifV{<WZ>1TS!f&qCq$9 zow{-1rFSvW>y*mj5SKL3m@eWO$3~qJTX{|SkPeUq5e)fkB-ljOfcT@$Z~L1NY~(uY zqrPiy-j4sI;b37{mVIedH3$bQ{JaeTEJ6=g3{pixJi;%6PRt1a!(TPr)n`42N9NBZ zOWNn(*5>sk^lc>BfTym8F4SBqu<(X3YBM$3L3TIBC3pr$v4@Rqv-fi_*YSEm-M`=k zjUYMD5z{<k(P$5^<Fhk>N_uiBz7g-#L-97`6%H<;3$pyg_vB4g1_|aCt88q0sT6L- z0v^(EA~Qk;fHgt}+Ww<popqQ6Z2aXmz295+d13@6H9+zh3Ib@n9=ho}L{(%3e(<nh z<Iri`(yPZURrk3<H8ZZx0mjuD-I6DL)$1$|1Uu9o@0<KGM|;Zj0pyvMsf@NWFJ*BE zfmf0(F7V=sjEql=l_xh1{;WnqmQ=?3mP*+D;we-Z&;te@=lj}-4jFTUW%Jz3)WXS^ ztZ~6Nv`})fT)dSYTl0#2r7D&)Z$O5~i<xi?lyk6fofVmzXLJ#6ck5uBA)*X)CTJl1 zhnGtOun$p1UIm#bK+9oDEm)zt3Fq9KE-U99{){f!<JM!gl_Hfdb#nR5U4XqGXS!py z;41M9DFvRdaQ7CE;QPrAUhnDTO!u_X8($r7&Y-e=V`V&Nv(iX9SvF}!ajl;IQ2%eh z3NE}?)uT*};E64M>`*75r)As2XSp@Rhda|rw)v_0h5j_?ss{_L1pbFgRQ?|-0d^%o z&C=~Z^r(*R+TxOm=9Z48q9#;xV?%Xye)-QIAy2`P?U&khv+9v6tIr)?Q=*|OJ~^>Y zW9$4S?uN>$ri1qX@qZkdxs^eW3%4C@e-Ac*{V7CZ)UOCm+kEhY(qxP)UNPW|4wl%i zdvl8NZ&N%A>lr%f%``#*%s6(A$^1Lzjangmrf2@B^q_TI_q$*XA=C5LC628hX^y@z z-@6pJ`-W2{9e=;Kqc>6<me;%|LjC^Rbd!;Y{%Fbv0nNXX^s}2&WcyGTTvMi%#!f5a zUA!VOz<))S9_exm##5RzQo}AL)LPYJ1Pv3~2+8m^sDkAjjn3Kr|A#jd25Hp0U8tqM zng*8>&|GZV0_Fm-Nq=Xy;cwc7!#zIOW6`n~cQhTEUdevgV2O!n&11Wert=eAvziW? zn8E9{?ssrz@bGk_D{QMKa7KA;RV}fz#|O`<98+eTY`OQds*VS$?856AJS^7IS7&}H z8ieB0G$xPYhw7h6Z02h6pEsNoY!E6wqTRwg{`t-sZLXHzL<EpOq`kt*gLHZ;pWfg? z>kuJo^!%pCbYuEryJdKrccM}2%FurjHL0omXW-j3>>`_YBUqh*mKP<_;-CHAX+(^1 zRZ9MHjbY<7eqsZPqHsrchb#UbShJMlz3I^7ENz>xwudx;(TI#R9BbVd6-jRI=u;VE z9=x&;-jDl*-+yv&^td!xI%_pGyqBpWtY2jRTYgYlHd@PBr6ufqug)cvG@Oqi&U~y- zlAyiXt}(L^;lgylIq)Y-cXeJPO{okF@yaZ}^9g|SJQ)$#=+=73pg(^=<m|RdAiR}> zyAG%Qlrp}7TjR3J*`D{z3`4#>KF-es8_&6=B)OBRH(wW#a<gpb6wiEwv-O5_;wZ3b z{?Su|kmi+rW686#^IeS|0`ZC{%ZkJTo3*5{NCIu^KY8nDD{SvZFE$umk_XR(F9$!& z=njv3-LKO)u&PpL=Oe<hE8trhk;0u92<sv*%o3r#BM$P2KN7zhmy3oNN_JtsUtRwI z_U#}vEVFaXbh)7;+cN^h<Lwx|Cm#ZVC>)2Lki&|oG?)_1Ny<|g({x5AFS}$Q{frs4 z-dHJpkLZ9RPv$0sv3y;+2E%I-yox><u5VIu-Efyk583M_u}Jy>t1zs!5nQyKh#fH) zB?m4-DK8-X5>nU2<X+QF(C9Tr1}IOb)b1|5`tIF{X*#vmr){hX=YS9`i@P9ssnSc& ztk~nLM3+isSI=A@fRRx)!ZhOMcagG_%oD1t>hQo9-qQ^7vYQQ&IIBGhJjhOmn)SE5 zjEdsIIXJ6>9#X(STP?`gtE7~g|NI>rIH(SDqQ&-w4(%UrDJ~aZn-H3>ev-YjwB<os z4uo{`vmZ)SqYTAAH64iuq94wCeEg#>cpt}!E66tZ_%^AR+wNo{CE=zbUjF$2r4g-( z7?}!nLW>BJqsTjP^?s;&aO~|I744H(W6ymqasVP(rOTR4#v8*oN;dp9eEHVCaJsx^ zBkqZeB2Y4aP6+t<LM*lpqUwx|i$G{fz85`P({$q1V&MNb$K_p>>K`ij<a1;|`F*8i zOA}L{CJp+dR&li&Zw7$h+JMqTL_$XImZZ8j-Pl0KP@_bzx8F90KE2<umyMp;NS~^K z9-;55Wm1;PrUyhiU1+WYkujQ)!6ECC*+4E_$jPiNlF(R`9KusSp(l9YjCuqb`hWyy zirdE%pcupMO5z_zxMNSS6-A7B?Vc|&cz|90;}zLETi@=u0$#@H^Lc!a3j`3hW*=+B z1)r4so!R#&>lD!J%1Mgm(<5t}aN)7FQ?jg|XllOYx|U*`EKIj%IaFz*lJ6LAO+hSm z(Eqiwms5c=rHZug1-({&^4iIEbv#m}%Mq>ib0W_^qx;Nq`g*O*1CE=oPiH(EJna%M zUK7ip%5d^$<|V#TDDju{3=H?eK-LOa+=mz-U6sKCA<(}1{?8@&d`kPY3&o<2iLZC# zBjxx8*YFdtHIbVoW?*1UWMRpQxeoT~o!{in-|e7+*gr&AHZ{H`co{tWx7Z~kT(aKl zrwX)0#q%P-Hz$&eq1ciG@*w%E>PSRh+$~Jis~s&r#I8?JPsZ|0^9NGTcrTU^*`rvD zxAJidO`5a`smHiGrGhQn1F7TooTIKGEgj-RdEdv2?JN7Z;0m}?S#t>8%~K0;D6;0+ zGeWRL7E}@h&gsB-9>#{m4dzX9IH^)r%}<bETqrCNburIHh@Q7P{l|!uRBGh}V`9Vl z8RFv4E(9nhyr%hajA?Q{dazOb(DiRecs5yV(fcuYxpr0Rb9bx=ch|Qv{MHY`xq45* z5NJ~u`oeRpX|CenDc%(8J9^WryJcE8ChZF~o3gCz__9Q>jhF3M?{x8CQ1%3^$C2Wr zSTfz?ph9(?3F?U@jm*`+-D&)4C<Z%&Do5f%Z+vRv>3?V46DvmwcmvH!fSDagD!&dw z<nO)tl_?$lYGi6#AvNw9(hlL}_Kqw6Wu-(RzQTI&r{5aZ7i9*?R7|8T{Ilt_P_wTC z|H@<L_6_Y+@)gKhA3w|=bMjS9IUdwJdiE(fH`$_`-xwfv`%F{py<zYdO2t>dzv1Nd z)TN{W=|f$G2||;_6{j~AKIK1!Fje-edu@u2HQ`m}rf0)hlCxG_;I{0{uTmM`TgZLb z9;YTAjF=bnUv_ey_q7Fmu6W`4EKo=bv@CF-CK^5;Vw)lU`r5h)9t7Dyc`+1_C;V7l z=NOeLp#&bC+b5ca$M;^m?npDDE4yI;fvGw?@x)lN1W<$&NQnQC*KGD%CG_xQ1IXvj zWkw&05;SzBr_BuC4l<_@{%|(Cx5s(&gr&M>JG8JL(5%PXDOTLueV5f*eOCjwgKxfA z<>@3J+oR{rC&#;-%(hUDw3n>)eWD7EF*AJ$zzBiMKIHYQDpP!Z$&1(q%~nt604E|# z+eX}PhvcuR>6d82;h%E)Oru)GTxa8sONTCh|GnCio?l;r|74t*iv-*w)Gs-2bXe|H z%g`}*(rDE_FvK?fViB0iBL)mViS$a1N-x`f*a}!{J$-P9rO`>49y+4Xn!t<2w(3!c zM6&G!;F9BsRqVuijbnL4JV9df*c)ub2m4eNDj7~+iUBQo@4heLW`PX=R`tvpzB)<S z_o0FWaH9a452VFeZ*Mik7~Ln*x(RLdq-<c(V82}&xMbS*I?i!HbQ(-L7dwkMz`uqC zLMiEJ83+1AbtaX`9*<aduvxDC-p9gGF6>T8&%LzLQrifGY2xclWom{yu+rHjq)`wY z{z6vtVf)xa$Y@8<<1>EG(;qWaE&h>;R}j*<I2o#&=Wb>roW>hc>#9s^6f_L}GVSQm z0UE1@(%rnk=Uuk%e1_6j!+UC1`GZ^r)t(T>#}?<2u>gdIx6T9!fe`TVue1B2V)XA2 zsT#-Uffxul(SEhNZWdg0<EMl8WjWtWiuyJJRg1j_R>nsOp{w*4bJHF0x_mpMy(bk> z4ZPN!4v(ej8doNtlgs?%IvSQed?b19Ej<hlO&%C_&?6aPYo(hQOGI9TZSVR1w`a3{ zdt3G^+#g=vR<@lfL?>20gPr1LCOji-S<@wFFOuf1Lz_pecx^p)6y|7pMbnRu*D;OE zBIrtEyA}F)QG)}oonlFlOAo3gph%aunHYD>8%d7GBO=mMnPZkjZ|iVt#_Hs%t3z%V zm-W`;sX_^*%c0b+?<oro^cf|vkHM}}mV2(aEL=Y+J@b4jkeRva;@+gKvrrFL_4+!r zp-BYr-{>Sbloz8=<T@hlDs^}{<oVfjcD=k`s~#&hmOQD`Xz;3Tl~)Oz{vvmKQPi_3 z6sNmolOdHn68jM;p2`=qXVqiFnAx$wog0Q@Bc-`zyBR>eHsSup2<$cmzzLk|si#q> z;OlYUyyVnDhX#bir)Ws_X#;i6i!1$w$Nz<vbO)>N^9<nUKE8Nwi$0hTkiXvfpn!gz z(Iw=RYt**hEYwwpfabIC2eHwK3ge5&=uP4WZFxPD{IF^jY=Zn};0e*K#b~Qeku-EH z)L>ATn(}cG$4~knGvB<~H7PFpp_447guODW<0=)0O1z53SURhZkAB{R!iM<vP1^ne zop2e==OqoF*dA?2wiXdWK^f>wL@?FgJ&+w*=sbJvd_`n>2);}LOo27-pgTVp>-)A( zNr0CvqAA{^mr5fb=TvO#JIkL1nM`H;2@_zH#oJNRYc6eOM{T&;a?xR#*50)<^XJGN zWF=NdsY|QdJg<_AxJRtQ2Nls{tLjFI^N6@K9Jp}$D)t&Yjj)n(DcISnV_A7cQmS5f zE=B_#M9ehjlaQ=c%+5Qulq&w7IC^?I(P1~Zee$8m1NIbWX$4YN&BQ_Ao1?!0m-W5Z z!Zcn)dZ@5NN#%PrD73+F5B^8cPcLMNz6$miElqoLXCUna=-g4pu76GJ{zQjEex9}K z^#Qq*f%Bg4puV$5L1bz@_YfZ|3EvPV>NOoMZ(we{AHlVnt8HDdN*hg_5(ywfe|ZIB z_dPY)BTCidizTFTNvTPaKCLhjZBfMQcvgf4c(5Bkb+Zi*T`+<gudcx*$1sPS5v<4G zG!yuViEl%ieKMd*><9jsH@LFThZOkwHE+e3nhtMz%B^b!M^G@bz%DjvVV(64aBrWM z@PTm=wwr@ENwQ&;E>`1$CJ|?5o4LfNO8@-aY1I_0(?Rx@p{DlO2&Y0o?4@lEx>c1m zd~B#V(>NH*g+edZdUU26HN1ZZh$Fj9`+}f#`$54ou07TAil3k8@T`6)R)f8KXpKpJ z=S+y231RixOlwX)OH#c@41p`jKp)*MEDa>{R(lSn$$ryMmPGEO-l%Mx-IW7I5Qu~! z2%p}yrDFm)+`zs5x{G-PTbfnegD=uE4KsdB`@jUYeE$QSN6b|HU3b-mT6vcO?j-&& zh#mqw^dqr&*t$KuG-5m!bZ({EBubp{SvyRw<T&G*j`VQo`^oNNYv1LF;`k?jtWmoJ zgk?}PvUw_~{@qcd(Y`M<Lr7l3nW|L^F}73fS{-_xeW^?um4*^@y)fx0@V%mHPl>Kx z@wszFWU+y|AVjVEfA(zE*Xcmp4cPJ+wrmSzuR$~xsm%6QN=g=0kaugkj!)^B->LF{ zFRVWn2t;jP@AOv4irOLZ1IRlLc+_@ne>XPb>@|>qGU(-QpW4n1BQr5n)rqu#$^ng@ zi0RT^Q)+WQXaCS=>J0p(*8a|4A?&i;g@C^fF(Re*Atj+}OQlmry(xyr&LgAh=GE9Q zK<!m|^5dIv?7#}ZWDU$<r(KBd*qQKbNz%oAlWO(s^LKeaNH=EcKPFW0j}L;@@*n}j zWNLBA6D{yHT3F3bM4xFmkXx3lOikAt0s2ykHdCpzP=3cq^RkH!HzmC3+Nb9HRZ9rz zixwJ6>O2h=+N~pM?@bRJXHw~Ho=GVQowU1lqs3z0+IyBhth{F~FbA_z&6lM|9q_r0 zBnncWg1BO+IWS{wftEEM{=21gCaFpOF~xM*J|nxW7o+@2UQi*S%+NxC3<$gOKZJvd z;Qu2Wm*eENGgd+Rs-niSn#SDL%Cg4h+Pd}z)Q|5CjV<kFwk6D@DqA7oW$>L7neIqk zZ@2s%wLYxPr98z5{|D^*QsaE(D)=AwCeL(cW<h0C=lcMaEkii})V&1*W{swl_Aa0> zznx1nV5$rMn56Sy=RoIBE0aBplVhGh*+rTCq<QP5OD5<948zq&UVl8(RHk0rWlNWA zDns#tQ_`0{a7%rf+bVfAMb;?15RtAsvP6^K;6UwvGN-el%Dx;c7rSKPA39`5cXt5- z@LvPFQBsKeENE9VbLmhe0b(?F3WiDpwKT~$q0%UDmB8d^_~ljuq2~EKImYr|I$^6b zk8AHoWDI0SoBKicuW)P7m#$OD1>?AG%};ckZ?VmT7ifb(FgYOJ8nTS*e$5$a$)00h znf81{&h9%;T;-batMMvCMR>P#AFB{rNvmt=n^=lW(2W1W*eF!$MZwq96kErO1J(-a zjq9JigwnE)FRXnj3Bj2xs4<>%G{fI`p>YKc+8w9|%s#vkdfJd6NtYe|-<?<}6}i3k zPd2K;XP`_Wz*YI?v`xJV3z^jtc;fkQCF$R4)_~j0W9_oEMGv9nr5B!ZU5^j8EyBcp zMVD0f4qu6q`4oTR7V@M!793*DO-pe^79-8h88&Mt#QJpg=y93{{1GdY(cL98RJ<0B znDfn3S1LS6o|+Zw`IGjtxZ^uhd;DfEDV3&z23_JEu2&$i06IX$zxyv3IoRKXd$KIG zO@XgnafY>Mn&8()zF*nDbT$DGhK{r7C083bm^!RS{Q+HpfZ_le-5#pOot%!~YO@9` z(U;=%i0;T2bc2OWZR{XDf6ECll&93yv!(U?aQgY$dqkvP{06DXFaKACl6F34c4cf1 z&GE891*M&KCY`Jrp1YRc^YREbIxs$6p4}kNA3NN_==<6d&ylS`po&c)N?n?XDr}fM z{S3^|VxS*5%}t&b<*5vVv&@0baL&o~hEHbI?DcdL{}5NYvW$Sn*&Fzn!9r`0MznLf z=Nrmgi@Z~wApCdcCS89UUqA_(Zga4*HLNu5hfQ|U-vBJ1h$ujjd`w8VM8Pu?h4`~& z7ixB8!I#ZO`U6sMPqf-~>dKciB8jQ$qGh3Q`<12}R|^gCaE<U6l*D9>k%e5EP+j%w zJntNi2L|d|7o&{+Xq{ZCvx4>zX~BqSe}Pmlq;pj3v^Pez=X*KGvNQ5*)P4&BbRqg= zlwO5m?*Fi8mz4m~q-FkUN9H*2m<G%SPg6_c4cIk5A1G-*v-I>=D=L)cZ_Os9_ypJF z>&}~(JuZuQ%nU>k&+#drVcR0-&)_$?`g+fCrN4GlOoRK=OV|Edd|Z!+e<Ly!(0I3K z`S*$FyB@UFF2@|xg;%877xl`b@$LXe!rTL~J3iE60O{eW=MCQ6yixYK+P()H2Ov@Z z4Fn{AQ1PsQMjrGsn&hD?;72~}ulQDCy@7ho5X3J2;jy^!aX71kK3IT!^Z9xn0(|;w z(LSFv5&{wR+m5bhfj#e~Gq1%rLbaV`^FD6O)X;a8#nckqvLHP<JbnE`6y;>*D{-}* z<9=f_dR13O>nlQi@K0(jeM6yxZ-GV*o2u#V=K}J@gZpG+#D@|===m~>cIsxI^N=4K z6y*E4u8@B^eyZz-CSx+Mq&W5(#HNQ*lcEVW_SPScM5S8)=RUIb)baIO@FAyXP9t5- zS%8&T+5ugmP-jllJKiH?X~@0B(^Ru-Eqa+eyX{{KiS>NV&+ddaaRbH{Ye^ZE7Yx0l zld163?xp4~W2#}?PH$7N>{F8RS#Q@S7GdSBz#uiJ+z??p#oxiD5xo;jDZ3P=9b<zd z64ss>*mpETfyx&B)LyYE9?;+(j7UY2u7YA)#@4N?<9<pI7!in_%=pMaf9mX-;EnY= zMrB)r?>At8`66>)6>qg~++vsDTj=RBk?7Qm)`HQ|H3smd=e%Z*=h=P+lU@m<*CD?H zXffQ9%LJtmdCg5&M`8aU$m(+KF~TXDvDlJ=CMDjjl}AF2emG6#wIy!V)VdFop+lTT z{!v}?M;BXmde_Mk=jI377{)wm(Q11X;D+fqfL58_5BGz0y;WVgV9VEN8P=s8BHetQ zU>0>b5rs69$Uwud<(c9K9Ktid*tU8)HMrdRAaT|Z*$_Q?**%bhqk;GQd|=1}FzaWt z7u((-o#T(_irz%y@^)k8&dF&)i68^Hp}hZq&bI|DYxv^zh82m^SjgND2ti##haWC< zbzxFJpc60igxj~zhLng-#qKYU9n~hNwZzbFT({pAJ<D)&PZ<kJ_%!Hs(j3vfR)9L# zc2gGujVt@3?}i`6rDzC?fjj|u1;`9H(&>vlyv`+S)ev-oNEvOS<S6vSSlNpa_Wgqh z;T=ci-(acSYX@J{fq`S?z;Dgn9JzD;hfFSSRwG@TeCf{32>l|I?B7h0W~2?dWYY3p zN6m?~;H|x_p&I#ww$haDrk`p?Ei@>+p!>2Y^G<qzeaKGUSRI0<k1<XXcO!Ucn15@p zPj8GQmjUiH-Z%Q~4U(Fn!*y0?ny2v<lhW|#Ea6Fu8oX7Bkce^0WANAtk^zJPd9pRr zP^C0bbXh>RLV+&9)(J%+*Bd&XJCK0mUJy%O7b0aos1%)japgG(jk=wrAzmy6OPO+& z`wU%+;ClwCmt>Qf|H2YF(VQNP<luVnxwnjK>EQ4yq$TiBduMaQI20#XSMaV?L~rca zzzaJxH%(X}CUE@-`B=F{OK{=`wH8`yf7{bs{Sn%$paoO!1Lf2sEsPKFsj`!PSub3* ziVKP??ha3P*-CzCcu`EgW@JD>neHn0_krPE2!olDj5u7;0EJU5wVMNbhxFQcPNs#1 zqM8Q9w_P9=juOxUtVfl;fYUcOILh-Zi8=kAz>8PL8jWt_HjK);nQiKSln`BeEAoh9 zyDeNF+ldN_<~j*rQEXGwOrh5b58~O{u&s=13OpAWGaXb4Op1KXyQ8*s*UTo4ZQo4E zyU=GO>y@zPQrM_JWEAl?x3=ugN%E24z@4-Bc7MmUjIzSqFkC>r3TrnHRLyp`F#_Vy zLI8x&VO*keY)$bTBQ@nJGOaQoHW8kA<V~HEOT7AT%>){t1PsNhfrC+c-^kOyj6gAv zpS82((EsvehG?d@I%QkBY^3{rhqeDj5T-~EI>KM}4imu{)6M3*?G<M0nW=ocT%;8( z(1zJn6f>M&<7yO>$q;O2mFK=6C?_4bQ6*wxfcHO=^G}ecrdBtNI8RQENfVA?X+NJR z2*@v7|Hj;8M}RjETi$HS)e>EO4Jc$}0_TZAPM!Ls^5&ZF7`_~fG_@ypC;>;m*BSI) zf8m?{k0C}^)r@^k0kpXH-$uC2lEP@gk=B>-`|BTTPztuoZ0RZZ1SOK}(ln@kP!6%P zq{3_DO6xMc98sq0G*=)=I2_q;Df<o1Pg%wCK*#X>;6kAHfO|-Y@ySkttK##|%O@7E z-bMtAi?n)M^JcHTu87=KgSLVOe0ZwsEb3J}VG5gSaS!S|)x-|lmSs=#?+!3hERxoN zTR`08ZwJ45O$iX1akD@P=4Hl^bj~6JBGP4vL)?lx24(Bj4mG19m(lRzw^-)TxUl2Y zRaLM!ajV^CmYcoUs0^kK-E{FHsC2TAVv#tajEC}4%Wzps+TxrqkYhg}ur^rR=ueu2 zrEm@@$+n2J?%%}jnu-@?jg?YG-pMXkL8BC&wbxyJ#=7*x)tVZuUFjQDJD8E~?{;zN zy$-`Iu_?2jxZln3PB7JY(5qU;zqKkW%~!ZjW&aB7Q8xhuB$&Yen20lS*qZn<im8FL zFdwnJ=$AXRW2;X)t_XXh|3y`-ofXxegNiYy-S~@vGZJ79#v6^FOuR7J>xmALJU->2 z$omYdN*J~2X``<re%{-0bW-)c4`3zXR2Jz@D=v1}-3UAWUa5K3Ga{AkusdT)>=xQj zLOUNLyJ-T>qdj3*Z9<uS30qf;kr8>w#qLz?lyHHSYOh-CWW%^PUS`b_S5qNEFU8pB z7G7}6r^|vG;3b<%_ytjBXQcya>9P8axHpN6V6b_x*dQd~4Rp%UX6yc^;O>0+y~GL( zkb*9ur|Y$#pN#b{3)(@^edZBMTPrkfx6!|vZ$YE}m*6ksBj#T`jHD+R12fMwAUSo? z+M0_dBAA}Iyn6p^Z@I}n#OTAOTV3sPt5%Rd&{=q<jq?xEt96VAhKAy2^Tp-91xTb% z!xGdX_v30szfX9kMUPT?f4siebC<+IDdV1u%r~iZFe_>K9_YR~iUgY%m?aRRgn=%_ zBF*s%JuI9Kl=$+M1~Q`ay>;2QlXT^&!~c#E-#5m*dJFC%lMm?+JqiMoDXdDTaSV*i zj9;Uy(i}Sa4QMiJerkM7EYA9?x)Oe3S5{`G11X+wtGqIIe$35&aE33B6%95}r`;89 ztV(KTx>^I7-U$4LXg-w-EzEyA;f1rVR8u@jtHX4i@;xv8T6*#~Mn+2C!1WlYrx^~o zXona4?3huqR)NX4fFkaLCRgPf>Scj<#rS!@O>CdOe!zUEyreYnuJ`LN|JZk#9GO$f zTl3(=mDIn1?}>dS2j5^?B~8AMrRg9e=iM0ot`uRv_#VDqe}BYtqPI6q@`(8k4TW9g zGlx|El{^MNyBKd&@7T8!xTVKrUjH68V<Gm)H7SNM7teWz&lj4%s<TjL36<%>dD?0I zNb%0^6^109A(V6gUF5_E*RW)Y_Z2kijZm4XhqJbPZc^-5fLSk24FG-_CD}C^af<nt zae?8>U}?+2e$ap$tOhq1RQ^{VIv5W%fI?%hd$ngf^yW8#SV&#&yZXkmVvUoZZp#|p zE4SD6eq}#b`u)h39*vue>u*GTGQV+Y4bZq#s78|7D+$Fj*1d=xb!rId@H!q|nGw0K zIa&;V&DT#Y$6R@@w6K`}Xxjb!WiD`)oti>S?p&-qHnuU^YJM^}(eY{x9dEeptDdd{ zObV$VIS2zn0%4C$37Wxz;H}lnW&<_Ywdpzf#oRArR?u2#sO}%V@i@urQVat=0ch)} z2uccp(Yho2KTADt?ADajmiDtmL=Vbh=sta|;N#WR{oxpm(vf)Tn@p|xp||W#3xQ%B zk;<>cK35ZH0-sG1gJ@xCo>HFgsf4)?!R;TUDyuRAr0(Wh(Ix8*v$x__Pd(Z_?Y<q% z%9-X3S%tehnr#&xL&*rODfwV)7xJ4K(=;$Xv;<`+IY}dzklalG_5&a`gpZhrlYQQD zXUU0E85WU7rzg!{(J=MBtH*Cxb(vL72s<Z@itd4c`8BzHbGZNs45lyMyFl-oP&2JX zMopoeM<a(T=2Yen)k}0Xs!8D9jF}S9!eX1uiO@OO6TO2^m!(*C82hBOh5oIa!ao?J ztd1VkL**VNUHGl4S!ClgrYAQ$x8=5^QRtyzO?^s5^Pf*K6RGCNgm+2JezO|R@0+|* z-Rbm#)AyjDb<8aiCaOKBKSSd3GvIx@srCD_GRw99VHvjnhh<z&D0(Q@-hdjCwwCtJ z7F26%6|(GCXKy{StF!AD{9u~usoSx4(etTC!`9);qkqT!#NQFIhu-@IXzwuo>&$&U zWSE~9T%z=MCju4d56%RwTlBqpI`(UgeBnQ8%|lM$y6e^w;$NyGyES9ql#iSQrjys+ z$N-+W^E}~B(6w|gy<L?Y;AnC>vG(?CDCw}cqt&JdZcu3zk6G&E=t?%=sOdyP{-`-} z`#)|H_K$aQ+3MBVTa{hvU)l6N<vI*i_{|gV)GuW2>I8R`CiaRKAl7R3`*GQEzk-w# zQ+9)|%P<2LM(p|3V5GuufWcJ)1lC>;(2mJ`O{M!%FLl|r+ydlBM_(v_K2nA@ryaYN z;9te&t97C_5C0^PuH5?FcCSll_-*l$Dk)Z&@aScY;kZ%5X|*~5IUS(Ft)e|0OXKTp z%VUk<)UIFs>3z_wqRhTn`gUpfmyurElBxUiJB2gBbz`{w{T?$78*b*cyqjWjZKqzs z>Rc2O)myz-3a_dne9DVl?5WfElBQS!zsU_MqI`KR3PHdO9IArlfXTAz2>&CQR*^n` zw*CqM6wZpW8q|EB|D$hMTM^9R1+#Omdq_OuPzDLgXsB3&(lQtn&l)dg9)6=|F#1OG z@`dW|Uk-X-=G+H~Y0(ot-AQzYKucAfPvXQuZF~Q@@AP%swO;fXhm|JJ*oZ(`ZdcIF zQgtkT!*%m8EQtMN?iQl2KO`t^8TpP|#G^9uE@jiZqE(}<5Ie_6C&67r@oLCu8$aHj zLeU+fsL^c0k_hm_@>zLrgFf6dBk54qmcQ$)N<(A{_X{pX8hDOhAfOPTRa@}=zcKej zxESaX0CT}5m7SgtgEb!M;f+}qSgnXN%3$?^ciaBSf>vU_ZMG5KAAPi8sr}-x`>bYm zjt&6p_tnNM_Uod-sEuxSkB9qT1-#=4zZT}=y1i#8T`Lgj3jQJZ>7ZaryWFV7=teA4 zh};M=OLfVsLu*7)=$HqVe0#!f=h@aoAba3q=rMxEaqXibv9cuf_a|DFVW&C})?8_E zI9($_U6g~6R=2BPwM<#-wSX~i>eQNd`cM7?_H4Wi@7)Dg#00a-o}c>@f{ZP$)&S?H zqBb&zk2Z<mhpK<1E7h9#*mh+zrcwnAy&kWimznhmwqeXb{=z$d(T&!N-k?EE(CwFm z+u$q;y;1z$@j!Q~dLezuaVpvQAnZtBAYO+@Hmzv;xMvY>=MWH2yZ^;<?(dV2Ia!YJ z^3Y<!-iRT}bcpAgX@&gk-Q<_wAKm8DA8tCLb-KC->R)EOO`v>}#IO-lE@ccO+@{a- z4v=bAn_7L}tMGqPnbEPQT9+8Te{)_aJ^--rq)Rk>eg|ql+$#{M;NMgKw{UZ3*IFX? zOG#Z_Lr9a>Jf)0!WX7jjVpyo3tuMXi&pCe(WI5xI)$xo+OO#u-y}aLrVB5ZOkC1Xp z<0a-|NL^&4apj4wxT^jn%+hZ~!17=<yf%ZV)5Qb!!n2ZGc;AW-Et5iH1Lw%}{)nSI zp#2?GO-M{|6RylzzQa>+12o(<JD7I)0%IIARh7A~g#{gCXgw#bTgvw&m4^PomH+Yb zS!Eb~{s3%=Jy(50=Z!(m8W1De)4KFjG5xe$i6Sd(Ho~FM2F8x1lD2nNAWhtu!)`4< ziy#FAeM~!I?0$A!9WQ=ms4wC5lep0K%RWWpO$`I=!+FdJ-3gWTplIHT6!nFA3GBXs zTz+;Q?6iMle%?>+3H){=>+9jGDS~%qWM~9sM5}0vu0D(xVff9ONpc;q0AP8qB(;E$ z_9k#3sAqzo=wsqY_?|KE4<`4wty?}ARTgqR(8ueadA+mfBXG*Y-j6Xrq3?so>the` zorPut-`VxVP!Hd`R@;g{p4g1N_{<<*rFIp;wv~#QcB<_m0H{R=nAbFasKupmHwF$4 zY08Ckt&i;?;JXEsY4FKV?EsHB6LgA;gDlp?l-3J_e${NBsw*~<D^Awsh2*q(-flFO zo}Sz>JGLybu05ny#4+2KDo@oaO#@_>j8A;pAu!8rqR0~?f{AT0DNK%T8@-VgUwW@M zW;$Fm@Zw)XZCGzZjg1Pp+|^I=y#BHe>co6GhsTeq)UVaYyBw`@oEX{Ia4u9}Yf@7O zO|tzH?=QJN{(GIO1x3m>Wb3<YmIAslSoZ%?+YD;(44yqXc0#IDK|a`zKd3fY5M#zp zAoER+xn3_JBXX11SKeS<7(S|Vxnduzs0yU1O2+%l-1REVy`ii+Fz}?wE?F*Oi!HgN zrv8FPM1L>>d*!J-gf(0m8Y9*N$<I@w&^Tc<)9ZC#1bjxl1xhqxe>44ior?!Q>T-d6 zrVps|F@Z8>;3g>(A#-hOlk2z04SzVT{@Htut1z34(Gz`7J=|lO?haS(hWu6tI*`O? zFg@Y{<&dJbU?94vTe5z!V^OaD<jlzJl%6yEP*ePe{ie$Ui<ZyvrJ>a;{K*m*5)`6o zxcQWRc;Ru$g}5EAwm$Z{dyF7yINT(i+LcAB>a;fMZ`$M3=N}aBlYODJ7L6SzGy}8P z<M$^f_-v&sMPkxZ>3GZc;2V50Qzu`C{tpS)-dDX$`W>1<Wo02Gz{8g8`nwg9M`xmq zGf4-(*b)oEiD~B0>&4iiyW?$LM}b}R1$=IJ1nKM0jond+VW+dgr7F3Rq?sc`@}EAu zH2iz!%I&=0n`@;*+CJw;-cSB+*;3B%cPI(OivsF5Frs8#EP-4#%@)V61UIeJ77@q2 zf)oUMw?D_o=)Zdm0r@smJli1A?a5-rcG9SufFsC-1}&9*wL5MP|AWnHhRPB$Tz58- zdXaOf>k&<S5V_e4toP0yyX#2+nTpPB$9Xg2AwxO`7%z>WenhC|tbG_Hc7O(NO~5HZ z$edXRD+oZRwN0F$CWdhmh@tebzh)t4AD0(xZ-wtkjJPE{L^&ejz0n&JDN>MROLR+1 zm6kUQk*BExC%D0G`@-3-Iwo_M&{|k#Uyb%O1;X(Y0^VBk)Fhyp1WCc3?2U2#E`49O zWS)@}NqrlO0m;#S4D)kF|Lu0_Cc{&Nz|Z@^8GfDl@(5)Y+U?SK4;$uzvK5m=lPioG zF^XbbOgz%QB@51U8RkgMyFg?B>H7S9)XYsqCkBtgT`iG1+uSYvr%$`&1~t+0J{6iV z^{YRc1G_fDBR%wCjddS2CnmV@i3+g$w#gA0zuH<}-xmbr)z|pzWUg=m7Ij1b%~>L( zd0$#Q<}v8(#xW|C(7!EhY!<%gAqEub-+8Nn`ERXCvFCR>QSfnP`A@bRz|8xo?FECF zfIYFc`J3qQP(Ph}*A(OQ@2b+>pX=(~*xfzS`E-kg4&*BDWK&_%zM8M-toDX#_FH@~ zuiS4F^5T59!8|p)Lhdhx-<r6=6o8IfFCew$iLwo;t7O^_$_*-o|E7^pbG5iFDN&6H zHo&4ehn+-;2_MY3-^%BYQ~!SRZQE6V;06Ql_|>;_k)Rm(JYm}9R!ii%?0SJ^*zcO~ z<q?mGhk{a9TP6$N!bF+DYbr<puseb^KR8c=wWI3Tf>STM4y`*2nA_1vVPx_xiS70~ zHl4o;^GiOochSn!KdD5r&+b~uL8zp?G9*&Axc#vc643$5wteR&^(*OHuJ=MdX_%ch zE~WNdaOV|Pjt}>I4?T}3p+eKdXQR(^<KLNb4Sy>@>?1I&k7<L%{4|B%Q@VP5F7`I; zB_irG>L6*s$LfM-ftc&o!$-=rIl_;_NSa5a#Xl<+*Io8*5F4MW`DQQ?bLTz<E#Ub+ z&;BdMcx=EXmIQkGzz#?M+=-?J<$Hj>*|qAjF|RE~kqZ@nUx_l{9XBXgLm!yw%-Z^3 zkAs(&=_o92#m4IHD$-Bb!EpHl$sdS~5&RE=n(u>)ln{t?e&L9{ZN(<vz|$jtTxuYC ziwJ(y`3A!i+Nn|lTcsG!IP$qzbs~p~4qA5pDh}Lxc+av`M1*ylR=Qd<G_y0e3u_Jo z7p~qexH<LLJO@W)MFYUaF)p2h$4$65xq0uRWLwXk`Geol#)712(bS{3(0?em$F7jx z4X*F9g<0TR991+TK4U-0KV07QS$z)kc8?nxOu_5^nfSoN%-1fkPx;%K9I&tqa+(k- zm)khAqhmBT=vZ$e?n~aQ_FaZr#>pI2;XaAFbu$Z1nPl3S*)<NwcYTUbtX#K|P%5iJ z<XU2X3ffsLYagVUw)#rt$rF4$^c>z2nc5vCzeT|gBfi>l4Uqb$^{3{s2e;br?ti~h z4U%p>rHC$@0EZ&0tp6FfP1xLd1crQerJx09lN0!xC6_`$!)m0%={gltLdxezF5uf- z7OvW0hpi=pI1Tv%f0PdLLF6CBVN>{C*;=evb`h_<)L77Q?%`Qbx3$eqB@E|UtH=xe zWp6v&7w)eS4^^qT@sKnGwd2A)>fHYXHIfi)Fxz&*-_pNh$8X2xvw6PR+9DVKhwvr( z1uw746`?Eg#_E0mNK_L4vPsmEBUhdCb!3}Nhm{$9d=D^uA)|O$dbuZ0>D=T25YS&K z&V1bggp5W{*FrauC>=uy!B#3^6H>q$TJLSSl#F)${*Fb!sK%x9=<5vi)|M6MU{C{j z;r0%V2mmOD6`kSKQ+X##0(cyg2RGE0M}YLW@#L}3mI~EjN`YnZY%|*|C9=X&^56?= zvYL`xm7Pd7o7sL!_L^OBgV8C0_^HORmRgltlAQe2N%qExYlF%~?>=Ov5W<LHX3gM! zbpqLM>Ee*j_ffdQoMwd`J3lkVyy)&+GT_<S`nbZR<KZdj5{8MUoT%7}s&NL_I)ZhO zS;udi+4hrqn_ZTBm4r^;j5}`fY$-L_F7e}?qPON<k6fnjgL}|yM=9N8S?t_B->Z*U z9=gtYp@(~daCiGf>yt2K==qlU)a8hX>tjpm!X3#IDd{PZmJHr#>oHDu{F1a0C!d2P zIwE&RD&nig4}Y<!etQcYGO6{=>lnCm^UcuTV*;E+?SK%&L=?LdU<N}HnCVZu@J8MR zRze&e4+en?|L*xab$Z-_g$z@ev@U~p;8R5oVWQI1t7;Cgm|iXloxw-8-|OjE4mcD` zBL&9!l)O*|Ilf<RvZtcNzO6|mnV)}HpcE7&VV$$d@a^~2XtfT+Rp(+0!tn-uNGUVN zy#Db#$N{plDy_ciwAo)f7(|$jPgq1wqPi5ZUL^o0Xx}FJbZEu48|ld-+MtA3t&J*$ z&cpUwRbX$*8r~2()eR~DpC~MDD3?P70pGA!H@X#hNp8TgP0sSq^T0d?Z+ES8<-$h~ zR^Ee+<THLfqd@!%VLRqzU6L~<*p4P^Lsu`oClr_48qv$&@8h2=FR}U^7v@vQ=T`PO z?@0yvqx!>g4A`WLX2OVpmOZb(_mz_nB4OsPT6e$6sHbI&X(Q7MhfIStgNw#$Hc}T) z{9-?Zh4b3s3UhT53>J>GByI+4TvYJqpFF#JwAHwi;z;;MyH6!N_d<S9LeJ)-rQw5q z=<C-(23NB6sv`-3sug|O8~;HY4gUviT#mvl7)DHKTRUo-+kSO+)b;-AZu!}cZu`;Q zUU%8e#bAAaNTV$V_cc4eV6jipx4p{N&7NcEve5tOA4*yuuknG&&hu!5?G_p&fI2~0 zh?k7}Sx5JUF5ZvjRnSyEvJtbSoAu6C?S2XWu#QkB5g?^PP@ftFn&XZ4^sM9ZcH1)O zLE9L*gi{KBlAQIDmvj3PpL)KuPz=e&vcaDOHmc3^F<k@)o4&$Gh#>QhmBy=~i$1b} zEfUgOGM-e1<ZCW@i19y|ousIQL<1m)D<u7+Xv<oR_H8&wU6#)-0hf%eIevz(h)6en z>`_vipoN{6*>`M9{TXul*8*{JP(K08D)Jp?v*#<sfYy7lp3mhm&G*<04?3t`?VWyh zB6tANYFuY>ua?Y9mF1!6Kj#5-A=B2+z1<amw`CCPKHpupZK1FcHWxO@p6XhfrqSC> zSI}ODn+J~5c+x&W!>9^^@*aZUACs9FK&VsLlMxLG4!1?)3ZQE$k)<0#P9ipW^dhz* z{Rz)THu#Gzrl$`EfJej(Dd1+t84@HlPpJ-IHZ1aZL!_xYGl}v&5(=QS(F~LSE$8Uz zoGb)&Me+yWn!_L?&`|nMaq16B?-@JhSE{YOA>TaR-1yegM7eA+*sPSSp!&r~*YCH$ zztbA-0W1zms)Pa+H%^is3fG#rY=(qHn?}WXTdgpuO{&@2+0OP>zwr!u=;Y0_&!&SJ z79U<cf~s%!cRlXfb~(>Tuq860h6nya^%F}ESqr?nft9}0zVCyMjqObocizjC25O_P zHJmczbh_Oaw~Oz>iX6RP4}<7EC9qu`mR($({{mD*3~YWnZ%D~6y3-=ih&x3Z5x4xj zu3IW3>SLauauIQHp41kSjEfxhpN6xvhyY~0y0aOCe3~J@F%JwLX~@bMJZaNZQHka& zrEf^7Ylctl$c5I6R25pv|Ed~hx8ox7i~7X8d={pud4rIX!YF$yL|i1zdi&4ot(@fn z!+>q$VKVmH07Fa2JAfIcChYkZTqSl81g7xBI-J6p;V<~SzxOosYxFa~AVW+M_8q-_ z1adq6PLa2Spln!53hshL!_A<zGE{mh^^vrI`vW!@uWoJ7pV6+JF9-3<KamshVdJ6Z zrBfRu3=Em<d9>>LvPQ(Q^_8U5j7CcWTPfc>_G)YlwtN>ygJC3N)Dvwgea7*qg#vYj ztu-B$(8_#MMRZ_LFq3sdWNnDs_gAJ<lxm~cO}P*6)<f;Otw!ral8imi;>A%{Gudtk zwm%x&6sRuOg@lX-IlW!laK}6=wz7PNny-H+E&iwjlx;UW=XuNN+PZuR0<hzR9K{Mi z-!Y4s=CjQQ5P-OjsGK||^jV?(s{3o%z>+SAs?s}YHCb7=!votyUI(UyeeNJ`NT%*H z+ZhGd_P%7SceX&pS<8it@!$-~l$2<SRUKD7TY4mcmzL|7!w{S2cNHgltlv1>Z7(4- z&Aa;Zs6fm+JmTvN_q{1agAD&07EA<R?|MKi;sH12@ZWx1O;>*nTz_R^uR=o(oL7T5 zz%Niz`GO_>lo77eX1{3Tc@Mx8(EVze4o8Ed@+Bt96;b~*qo<EYz{SeIcr9wl;7;!$ za6Y@cHE+}@{Jmr<qg?i^Q#*Q$*L#;>y7OpOVPUt%$J4WW{O<cI-{<}y$wx}my;XwD z29Bb-X)33)RX%;9xsb8dl^(k9$4xeaa23P4<|4-2wMAd{>x2&pdfOZcWZKe6JX7EJ z+R*%*D|k8SHZFYGS(qU?%<!a%w8f$>6qq2C&Q^_jlt2=93d*oXq@iJNrAqINNWI-> z#u>K-->IB{WCo5>D3o6Mzj1@NxIbTc1l-!hFy?v&T6KY;iB7e@z`Mp}V9<REe#_;+ zG@|+jkZ`}Ub}~(O5zAmU*uRIgltSsTTC}LJ_ekYNeB2VqXUN@ir!_pDm^RnBE!s=w zxn=ApS%tv4q>?|@-^)2asL)A&AG-g5BA!e|e2bGar*$uJ!tVKn#?bDMa<OeXY$AL6 z{Q24P!X3>YELYXO0&z;6Q@=PILlefkA@o4AS243dOdn+L48+Iw8D;hQ?H8}_xQrq5 zZM`nV2rWl$PS(yje4t&)+|CH<aIh+AK2o@wYkh1^ytoD8AyO#u0Uj74jKO~5X&`&% zT8W%NZ$g&+2LvVV*|U&zj_O_vIEXAkaTo`zwd7IS%t#;OF}%dTbAwPv?dQPbT^--8 zZ)+lV2857VwX#R`M(5cd>oH{1c^=9uI=#Q&{dnyOj7t(U_oKn)SQ%h1sjt0sgdzyh zGl6QT=>V~)zB}QmYfgR%Vy>+Z7k+uO4U=UZU+SahTth;VDaUW<%S{$u?m1(Sn+ZKa z`MjWdV)9AyS=Z?2?&`@VCb%(f+3K8acAe@P(&+p;F3kn-OJgNz@L#c<F&lFX-8vHz zp|7jrV#@lm_#yUT(^r8Loue$n%J|j8CG=jrSZm`@f&neHuCJm`kZSJ}$|X3QB=zOB zR49V`rpEH&P#acFN5pZJlb$Y+r;U{XaX|zqDX$91>+qIqdjYq*vMyHwg3uT&cIY2L z)QHG5A~rZ)aAIeDuS(;J29oJtwKTs{t8O%y2o9-3I;dyB4HuoUIYRBuj)N3i9_R*d z2e~`T*2E9<xE)1#s27=He=YYMtiO3i0)eUVdU)Pm!Tx=^O|$l1_~`n6+AWEL-c0xl z;|{Whbxtt^!`F;zQawm{x@9V=p)%rYY1BEr2+GxXo_hIM(sSOf?rfnK?b&H|E4e_< zXLo3ND@vf#)QPa}%U1}Mhdfji7PbeP;=<pVKx1t90Pis}j)K~G9X%8A_Ec_AS?j=| z1>$ALpue>Q8B-KX?MsSTEpo704?5=xopIgM=l*lC`aOjD+e@LxpOp)$V=?W)yPaHV zP7WC-%NHk0c7$`bN3tHteQCYx59UiwA|y+3d=|X~XG|(s(IYQcIisPs<wn>~H7Jy( z=7_$JE88{y_x)BEg9$V|gHCmKAIEE9PW{#CFwU8UvuPn#|BtAv42Wutwr5D`M!FjW zWaw5Dl|~o=N$Kv+!2kpm1W|?<O6d|5X%M7iK)OL<fT3jQe207Qd+#s5=J0*rj<wfb ztGBd@Jd|Z=VVl3%jv%`w7heK?-E#u6mPs~Jlq&{Fz~vW3X`rIhZ@kF=#x)l-0Zrh# zMQmlRnZe-v``Vzf<#ewHfIJ!#Au)h~A5wF6Vc8Zcsd#nlZjDQ?asMC*XZ*F8UsOcF zzS6V!+O-`gl?Zs`PaJ{4P5^&WsOz)>*0U;`G(K*7MLYRh`%2=VEOYfY_E>vZap&{? zee;D8)cAw!d&AJ%@O+v4OI9;ib2DiCNy=6l+=M)ddjcy8<MD`~vC1sP<ga3gi*3_N z&c<Y>;^=2{<cM%T0Bm_P?zCtk;2RU?FNb4V#$mqLpql_2crcG=|B0_><-l&mErqF~ zVvtbKwCB(?o!)urhr`wE*69W>8D!}mz*LVax%RGX|Mpk4BEL|-Y2g|v^>H$%n=kB$ z4-#DD|7^+emR(Kyi`HZ<#6zY6YV5#(t^YKU<;!`YsEl^o05J?IQaF2}FO+;YVNE_C zyKhK-e=BhJw(ZZdFsYEr0iI9x(opgAGtCVpdNoEM@HUED<aOdFj4pQt0E(!yRX4ca zI5Pyw&77n4a%;;LeZI`dkke{HN*;q}u;=h^mB;n8G>QiVaK@W=tHQ65?g9%r^lO-? zpj(vbW$?qywAUY7BbRMn|A7o~f9m-jae8^6gG+FD6D&k|FHreEN-k!a{&u#b&|33P zK-G%Aa(M_^W%D`SVftFhQL;**QkZ}GNhT7ii`f{t8e~Q92i#zorY{JnBXN#Oo4R_` zGCFJZ-0I=k+@{I{MP?CFhDCM`;&m$y_qkt`;oLWXrY|6n^V9$m${=MU>F_9XQ3{qW zZLz8kj0ek9XO&J}pGDT{eL{Q6kK7(E*<ivJ&+NqfmcHD5Hn7#WCZJbQ$>-Jb&XZC3 zy{63j{^Zw?_-36>!g(!{F}}1r37mi0^VM9xuyko>7>r^OBLU9U<q<QLdR6At>xRQx ztRd3}tF-|~W1+00Eh%O065MdV;0NcJ8C;>1jg0-lq}>pvN(@(sw?tvd=JI=oLD~dd zQuk>OE&BTICP)kD^Cte1nuM{nOlWFQs|^PauxK}vhCJJ;+uj&;3ypFx^qvbe_J=I| z-oO(a-#z(vd%85Q=(_G`2shpbwQ>aD&LE>Ol+bMNCwg4`!vOqm3XYi{Qau;C96a{S zLEnD1%cb;78vw@xyoST}45h@G1<2-+y=X6#O4Ge+mWK9^>mS`P%|5%gt;TLQDo0Ee z>R6%F<m{`Nn(`MLwE|X<Vz##t#}2>D!nv5s;Y31_e>}~b#9l~s$SIRf<oo&N=kWgY zdfBQWkfZm=Hn9^FZ3R1VD*AYwV`H`1_b!2cx5vqVba3-zWVlt=^Ezp$o^WT;^jEmL zz(~OQ8;e#J6TJHlmY^Bo!3elE@Jcr<43)|#+Wt-rW{7>Y%Kk2{JNnva1W}lFHOTE~ zh3mGx*es@hIqxiE?^BS@c@|cCjGuwt{G3M+ncBB0*FrNJ)cDxSJ~lLf4c-?%AewYu z49g_Q+7sOpvEQjeMv84Crix9+&2X4Q93zR08*qAsRH@(fa%a=13*hj8RmV#fnaFBQ zpymw|=fVfnZnw}jGnEN-OY!#9ZP1zQAKmD+{I3x2c_#DGB46=qf!3V~BO9S@O6Q2D z(^3#dTJM!sHf-}8w(NoO-23RLgr!br(MJ$Hqq~pw?xRLK8;m9O*896>2jaz=GUkXG zbL2EWS-!1{tMb;3K!iy*PEXa7Srb6#@y;a=P^(9zruz*h?~;~#o->VC2kvmj`D6u+ zF?uvv6AxTK&py^y`K@eKHv;g;o1kytb_y;5Hks<1DLE)q@hV*!S*?kqXW9m4jHH3x zLLpIRD*qdRQ6Zx-StfWCe^F0bTa1NWa`W=8^Tp=Qd3E%k`uO&s&w|oF<<g2jHZvAk zPW#x!Egv-V+4Q#ULYGYhgX3-~i03Ky(~Tm9<;L!r7|stSz#g6Z7@i<?4G8D4OTJ(D zd<c-r7fxAuT6ttOJv;fB%Gr8U>i0(k6NYF5z!g}I+&5C0xl-D{P}8SyF(FZlgipgK zq9ksrCqBzX(f_JwEq{vR%=w5^6$b#31PXM_XnBYp|H};-#m<kPIPYC!o`r7j5m{3I zP9${t)tU1^$hpPj*zyWgvQUj`NLVE)dWy0A7E&JZ73bCOE;+f?TARI!zk4Am$}Djg zZlVAsWx7hFJ*&+?cz@!auJV~$H3#om$ZhTKK=!~@`(aReJ8A0ks%{@TktBuJmZ#QH zYQJGKEQv$kBy^dA@uPa;?j~l1J+a3cQxM^6LD$$Wg$UExrV!txRDl#iPTT)o^1%H+ z^Z=v*04zA}#B}wYprB@Zdwa*v?jJ2}Ev>^X9sQ{Au?C8z0!GjR7wlPOW|9)!k`~X& zfCAQ<YbmCh;CbAN2gV&SPt+2@z;T{_bq8%0RQOT^sx>?i50U$m>@;Ai7q$#EpI*37 zP!#dL>9^A-wgPi!+$OaD^32Ky>k;r_&->nA>;>{0zO?gdm~iwTpY3$l;{Y#;QK*fJ z^VQMhdT`wiLGZ%r=5plc4Nd(#+<U(h9zn!?mhm<kkKx+ejQ+94HH2rC?Kdi<3LZY4 zx*S6g^N`Rsy;78kb)W$@N))=Z#&;PF=AyWrV=>Af>Tdb|{zq9Yye<=BoEyjR40fH* zF_%5R$I@OP=XNzxoNBKidhmB!@6Upxe#@lG{29`csO1jte@$_W(gaj{h9(;&*s)7V zM^tCIL5BxN<-FB#LGR9ZLz>NXBNKB|o3^8ZeKP-SO_aLL9d0A)+|ATjiW>5D^=}H_ zw3V=}3_3g3l6V?7EE#mwE}7z2Q!{Zp;-=x`U9#DWULpED>2rd6*(}crgf6`R<!VJ4 z_%HMEu*aQuL5n=2y&3o+E71FUgYhm1zJa#5kqbA+#?lO_ujMNi3o|ooIY=JHh)R24 zi6r2BrduY{TcZlnK@BIivq5vWN8|T4*Z~oH<Jh=7=?$7nriZbzh=}T?d4zHMe()jX z6W;mRS!`PUKonkzlgT*tOa44dU0~XFQTor}S%doycPQv&1_81QwCtmoT|YSU`Ddg@ z5chx5ChXFRMnkOBI--&!%yUvT&<)7|5-in)(!KyA4sW}p8>&BGz{R<J%#%|4n89nZ zWlQkBCT>DNZ;Z5yfE}1VDlE&dE{2BI+0MBTjlW$I=yF~@ai0&1cJbWhz1nt;4UTm= z2yO-_?6WW#H}}M$$owd>$9~S2ISxf)ZEH`%2U3*ME>-;_(E%igJFXcGSy~_sYMslc zr}vq|P{GD?wL}9o?X8Fv<%lAPmeiT+OXDk8M0<YwS4MH(xfpRWsv=8Ae6lC$9FT`C zWH$h|k2CHuM=O9u?dWUmEzo7djWd4n*o=JP*$B}h|J1dxEQsmcR+qdk&#m5GBwrmt zDj;8|mCRptOtzzvM^ldeYzbAAk$(B30sRwnIIt#v5?PaK#~DKbD56v)ZZrQ4cuqD4 zwWVkGkM8<%5*TCv6a1LUWuWw37kV?`VjWR-mMKH1XfWVa3p>EEHG%3{%+ON3aAtSp zS{rti7lpZR%#YRCSULO(Rru<$5&rAwMY#7_8m&O=J&tNkf?xZ0%imEl;Brs`;7gE> zI`aZtSfy+{H&DC8rpUI%Dh2q>Tl^_1ZJ2*W?uVkHG(ZaDfpB@moCEk5Sw(Z~Sbklm z|FS=K75~H-j9>66gvl)@DY&NA`6J)Qt$9m#YaBQ(`h`b+Ea@zCb0B@FZPgQ79gx_m z_E&ouy~)OUY*Ke>yMoV7c;|rB`Q@GqgMr*8Ns$M9AQSPcbFfDi5y`R&ZOOe&KG(PM zQ>bF$f}Fjmd`s&SWHrBnQrN5Yo4yRd*aO+%h{OdhKcq{OXZ4n!nSlTTs5ofZ<s-{H z3{m{Xbf@P(^lWG-N*%<YDwIQigf|ibtZ-c7<shlEKQT7iwt7B)UP^wXihDvc?%R4* z$<n`Gs2QxHS^5mu2BHQf_0ir>Qq`q1SVqKH!$rlySETn^n;j!|7SGKQD3ZVV-_K~# z^BY>@%eXxC3|X08qywuBhFeN<Kf1%1nmwNaTlemdpV_)-N5nE7eDsq!ti4c^q-3@M zN)@q&763rXAs7kaA|(d9SLqLv_;4dODI55*Ti`1}&~LbDqYhTc%5_MJ@&MpWGnKcw zm^46s-NcScL@R2xBu#{^@@nV)mh-2(1RvsRGiYij-OsGbno@TE68at-?V}qZfWulO z8=Hbxw|$_dPkLi_&jfN(gnhuW*DG^t?>s3&8p}w>-H$Ubu)||NtvHWY@}*YlD)5s` z^6Sll@%lnXzV!#|OtD2wp1%ZR`I1V^O+<Jk$;`+_?JJ&*FDAG@*GfF}O;fU>90Z3i z;BYB<M&{QA9{hpP26=W;^<u4`S@gYGl9t{As@AE0Dv?PF-;|-s*C7u~VW4i^+Q9GV z9-Y0v;cm13AtWs(jH8<S#@IQ{i#W8$G=9O4^UEJ?_kgWpu~7;WQv6)xxy7TzvrX6O zliViKM|frFnWdAdio>v#cN<}Gnbxb4bg)r9_U(p~KE%fm`dFlMsuZVOcMMZHk4*IN z`MHpntgp_^W2dE2Gr1;q_Gz{dPPe*dM=QbYC&UA;sUKQf8xP20BXKOM6{BsY3NgxW zs`KxQ{A5JxcLpsvekB1uJ%+yI>5oEzf($sn8mmf~c)_6tKgxQ^NxhTvC8adkNzDq0 z-dOvxg;4!^?R=+l!$tHi*9`w}2M@PjkgmGz@9+|`tdd7P0r#oijnEMi_AlG_th*;R zcY1y<$XDp$6YjRf`+)i;*&MjF{j6)UNMfWgDSumpX-*9%*}zbH7#8|=W1m6}w@Exj z^Q?PITG$@)Lr%C7@NusgI+wF4f93J`3z$Q%Yg*z8&GL}Z-+_dfdCzjNj-u-aT}XBN zIW*k=#RSFGr^S=O*qVTH+ln^=;H0X8sL-(A%O+}yex5CNoVcC7;}qp&VX^$HAw3+* zKbp!r16|*%+F8J8i5?{kZ#F9=FbL)6IZB`}&&3;Ew{*4H9yBZFWT-(66v`0jvYh0b zazWc{J<lVfi=3SooE}OLbjcl5=BxPL)fY|N-b6*98F&}wT7wlPK2IpMXJ4g@u6?2A zdcUec-c{y(plGAwihCpcvq;+W{1t$$c9c9(xy_+S&O_BI1QfEFwg1Pp6P`9tAg&n` z@+MV?4y3mahB|u1Cs(0AML2Y-Kvb)x8l|||-)kSFNnKcr=i)94hFhp*XCnp#k?wE2 zX6m7d=zHNTC`&QRPM#38JJ`=~q@vNQc|r!<zn_YnupoN2(BZL@iCB1YXsfR3&=ZKE z8xT_zx-z?nI2?QIiF+7=iH+Y{Q105-cuEO!EtgCY8CO7Q0&r=#$t;#;4q1Ep_S*IJ z3&@gtbgEPyqOTk0xzG47dShoJIbsZM-0L{5cSNj$r54<0D96-0+1%r?s`Hz$Dp$IP z7E!KfvbZ<8mA49FE+>4ybp{bi4nkXQ=H+K*D;z1dv&AYu@T=+XR*pElaD5a19rs)z zuNFI_CH2VYWDo_%G;Qx4>fKJ7O+yrkl-br*l8aLqjxQ^Yjp2t4$O58^l_#<WSKH!P z(~S2jPzJ{ZH>=w!yd<EGsWL2GhU+&zTxuYdQ})8`n1>O=*K-I1#0u3vG+Y<rEk>n~ z8x(IurixNQZk8_^9r1^|0O4pi_h@VJ4rFrr&vGinLu*%X9=Co%+F$mPLS@oLc0j)% z4H<rRK4Wdf-R{1zCv<#L2j%ZhQ%dvNQ=M-q<bSB6eZ;@GzP<5y%jjaV_OF&ttVOY> zdr^o5YySu-LdwLW#U|h5ox=GAGuSVn4s>QKZK{;*B@0do;T1D6bn@D#U-@yZxu}hW zfJ@(WY4v<=z|6dmp2xf`U#Qj<FCQQN$wUE<-|f0M%2MFKIBLJO248>*W_T;(NZ%q6 z8fM3<yGaYmwo);#t}CAo9U&8Cg<Nsxmb9Ifr3q!r0J!1_Y8W-GNBiQ4l65bIRb{0@ zWWE-?_dR)Yq+9JrVtiB3!I5E~eQJ<oS|UTeSs^qU*)6ivT!qH9e|g4pm>BHPJcTe{ zQH=ko)nb)u$3h>wTk8K@&+5f5O%v}(l@=m-YEM@jB_KQ*R4TCtL7EZrXXb6fq(Q7v z<J16~#xN)!`sDiebNu{Tv&kR@OTG3#y8Jmm$$F@Pihg6tw~V0%bad{8bc9$K?~R%g zT(qCOw0n5#3=?#$=!pyBJ8MA^5sA};Q3j)DVcJq{5=1MDZzHXiv^{j_Jlx**oe&$6 zLxVj2s@}7JA)M!2X-4m-ZWHizU-l1<5d3KLAk1V*d~#QXEW@8rnw;%?kKHKgA+8Y7 z{v<`&<sZZI?j-_%3s{<mC?|ti8I1wh3`u^5w-p!3dI<EI0&AaUZ>t&JEt>upAn?8S zE&DO}3dSxDF`dDzK$caqHB3@yss5Jj@p|)0rjqs(ji>|TiuWGDfyk@%ZkHOJIl$KI z&K>$kcoiWkbe>%pt=nGpK~s&QZN3-f=;)!NqQa81)3eDPF}6cXM8mRN=@#?l>q+E_ zf}a_hb~J43&oFd<+#$FwlPy@M)!kp`ssOQ3@~Sof-8bD9_42L~Cf;MFR>5Of$(m#6 z^M~=!N7O<dru_F)AL~<Fd@+-`H$ewd{Jvd##QAPAcW$r&%BT9b@Xr355|5R^Zh>2e z;!83Y=HTkGcY<9}Lr{L1Ld4$;-ODJ;WFw$KpW4pZXs}BxLCX^N9V-Dqulj!0<tSNo zb>FjVdU`l&{kzH8$nt8@XYGue839Uvup{i!;nv$X%DNTzef%Ak!py=|Hp>S7^!6_Y z93>(oPvZqYU&?#%-9JD&VGUYJ#>O>)S_iLT2N6+R`WtwF9o)i-TRFi@fGqrrnKaJA zFTdi!id*NPPp2r|bVv6j$e(cdE&w70*GS-eFkwQN$-AMbCt#f+9^Tm;{B%tiujno@ zbs*rS!;C1`8F`Hm$&dVzH}}$$bg8_T^)B()ge`_7@y1g_rE*YJA1~?0j)wnzt%rh^ znXawTzUbQ~p-h8eb#o4vzWoCRC#vtYk~t%iqTQuU$e><!iQ4Hn;okJexN6_?$t~{N zYw@uUAMFm@$Y{hxU*Nzs0f2VxoQxKJgKnK<#6OTy4;N`?Cd0L{4bXpi`sN;3;N`_G zMS1rVSat7ca0+ZeL;orGCS#szCxf4`YJ9riOAK_8%k@qbeJk;gT4M1@_BBw^|6H_~ z_4dis!>hYH9Grduv8WGHR;8Jhrtc9{oo~`de(@dsH2A!&3`O{&W|MryFqMMjef>Mi z`D48!n_;l={d)ba&0)G`Da3wi$Wg}GRFU?a0UJLLxPUu$wGe*CAiDbxfjkvq8$S+q zQX5x=D9e%cp<ov^k3&pMk=QLN&T5S+JX&g?$&f{+BaaUdQD2JTbVE4@vVvz)B?5%{ z2W(}TH!&&y%TUWzYr6|RlVytV)E!aqe=>G=g(g|MXl3xP@4J+cA4lJkX;meiZ6Y27 zr}gqmd_LL!RAR}4xz$@5+_pH-vv;yuKJu7mcGkl~w!p;^C)`bOQ+|!BmPSV5H9<<z zV&>I$TYGY{UwCCAGReJe$+F%cL2)_nQP;-C(csP9PO`Rv)u#Fo%cPr7C=q`DSS~}E z^Hz2t6J^V*3QLCMNJ3Is8(t?AbtU9K5W)KYK?G1=4rtoVprvbVudeTE>hEpqZ2j5M z+tS(D+t<~_26AXQr$#W!r-mMJeIMKcMH$aJzV1O<G>aHtnEls)xSARmfY96D;@%D; z2tZ#6dPmw$yPcj81f4IvEmMdUT1ilavAq|P5xdZ<ELhHNo;w`@B`N|QXKoNbR&{_3 zyT-mI{u2|vVb-U{=TNf_O)VY}=O5*aAjr(_!toer4^2d-f8UT~hl?_)j@tU4rLLO& zy1bC%m#d0CU4qDbUsCi`i?DQMT<;<Tj1!%Fxkng)@FXid0?-ZbGFegPmkR}$8+G1@ zpD<a#+WojoMDaaG&ADG@`t(VMf<W}Rr9Y7K{_Xc6Jy0UKMLyy<;H6Lb4WC=<O-Ijj zzA~hm80mXr(JR|$Li4vxxeY$`dUrM*PqDi|Sg7IcmF)8ZkoDQSDu_V~9XAz`^a72! z)z!Who<6ClS-GNZt%kX!^EAN&y)Z|6A05TisZ^%>Dq>BfWA5h~_@wiZ>Ry-p&o@&5 zML@d0*%#hKYf*xt1xsPEj$Nvt0n>VRJ1&pLLN*oXzcSW9O8ITH?2MM#o#ZOzY1@TR zt;dZsNDJY2HOGHO;SFK8aaDCYQ@_Jt;89FoX*c;yO^UVb`|z(*=*8s7rN+oGmj|96 z<C_oH7FPv`n-BrEvpa=IfA>LE`sZmJ%PU(srvyJda1bjDP<-LEsuL`qTD>eNvuIAM z->50=c^V3TzFnpTqso3w<87R%&$wM8QZSS8?Wn|ScOW}zF%-}F0CI;{Q;jo5pwZ!$ zx~u@$hc}Q$pRobq`U>i;(1yAMwD?nY{9Vq`7|wslU@3vMV1jugZ3y~=0ZWn}FMRF- ze>J5p;z?EK2s|imL4`2tx+*aKJ{fG|IJOM!3XlT09I+0u^{X$Y(R{g!@x89&wKly- z_nLw1DbJiYN-9YP9s&9RL!+`Ac)A1HZbt_=N?Zu!x;Fo&&yx00cp9NU`iJL_<g=SU z*ir5AtPu_(m&(e*rhKYEe2p4y^3N$9+aiM;P*od@#Hz>Oz5iTy%W8brO#bj~+XP6Y z5OIzI{&gR{3MFq*^>yp-1E<A<>?fHS2(>KZ0vRZAma3WSS-bX>w2x%O@yLpK(#A>c z+*$;I6$E%*B(MAUNDmQUz_zi8)C|b~BsbZ>wj8`QXQ<=T&-U=Ra3ErzUD@Ljs%!t` z@MxK;54B(KFy3bSUhYuK?{ox)Ao^hx?o%9iVVUf>Rm4xYTTVhxLXg7ea=L9$2#dK7 zdv4>1B#3OCcN8Dg#^P{+VCM`u*Vu6R+2<ujuJ7Oq0?cbh^=3V8;D|Xl-b0<DDAd1% z!pR#jL9kaE?)5l73L^vrOducc6|Z!K9=Zxv86uOaGze~3%g>5IMxP^`I+pUC$gT7# z0GOW<&xQejKSD;@vi&*t>N0M!HHxf`)5)S+ldnC=p2FnKCmrIV*!0aJGwG<3V&P_o z+J4Ki(+$43RW)AJ0I=&1E}ECYZ|_3-ls9Ig`}4F}ckxFq^|EQ6Q~$w(Lz+H_Fxyl? zAq{o<w^Eeb&_y*AHU~F=_~2BBgogh@@9n7}JusTZ1pLDM&;|pqT!AAhT<S2*CYQHa z+4rMNusm71+Dwo&hS5_U9@ATTuKgO-1R`#Ua;Ay>QHr{|t;ND+9*N~KS#J`P&caCE zP0q{Lm+kANA@V|2El0FriGBfB&r?GjhIdaUxVx3CrK{h*tI5kJVb>*x4HI}5e#SIo zNk^8;w4pqz+xbrKGQWnpU24+prDZ2SdGtW|p4BdIF5x7o@o#4q{n`uIO?%88^_?uU z=uZ>X6Ba-boC^5%{1b&_B3M<$+a#VAkKut)2>T#nAJbgVpT#NWUrMSvCeJh*{<wDo zD}oey#=xJGba>d@Ug8Fsu!k%9IW;$Ho8LS@AOARcf83<ph{?A%>Zb@g4e>ib9#@zf z@f~1)U~130i_U!q?tjJ1%<Ep&AMR|zLkS&ug%Y1(_6zCql=z{Kwk+@4OZxy9%$=zj zbPG}X`hV2nsW))}aRHI3%NK?aoM&)CE)hzcxi2%(YWvrU)#N{sizcuc8LJg)z~X5? zr8B)R*}sL>uU)B84)8lpMpZ&XR3HFjMb_@B@D$5j_^)4`HOKLq$yEutgR5&}7dBVn z3-^+n%dbYPZhq8$n3cG`+(a|yDQs1{r7gQ^lPPm$V%zl5>z;vD2BNOKhx>E=c0a^; z%QoSW^eR##i!V1j#YD5+@TaZAx2hi<?iW+3!=NX(XEB6etVt#B__**bualcP-2>HJ z0)SB@aJ`up?-fKDOl+-N0`Sh9^>>S!zER`)UtJr%y(G8V(tX<^^>2-0G9C2@1VIMR z=rXa_GB>U{(V^Iita<*K-Fp>g8G)}z1x%P--bo~jvJPPzJPyL&h8Y{z<D1RQ@J9I4 z8JOQcFgNrcb4t7nep2?y+QC6r!plcu-hU(dil41|*HwVmaP+OT@80E+WJXOMxmIJB zo~;&r#^-gx*fv%LCF$82BG)<Qh~{LOkVJY~o+uYu6UV6MAIJo2oUM7BaC|$T5(3DM z20Nlvi}8ybB<JsosIx?`IXqcyqJ=LbHzcauu4$^5y#x$wOz-=t?3uuo+my_Rj@%>{ zI!K-j=Or0$+x=Yc@@G@Va=3I?S-u37y~JnAM7s_Uc#Hy0Ah$G}>nwK7^CD4<v&Gc) zzTBCx0oFeu{f$yiyuLjf-*JYj4|!7-!;$h8L6KmQ$6qOji|{XpHCx9I77XcZpP;bP zJOk~Xf)U?>qtdcDAf>|vy*f<~KM<<kpqzT>S{$PRfa=^$-)Ew^m#^<q^^FTKK6x_@ zY<K|_U+h7xvwvUsieqWf^{Uq}e?;RExVQGAN_sWenOcpc>HOHu+z4GzVn|wTy2A8r zaw#d~CN`U=4BJTrhya7l-0}e+mrD*;39JG9&;ohyQl_+$7?CB`Dn{*%&pfQWWlu_i z`jLF-srd~T(oaxKa9%dNNz22-J1{6Sr=77!DIizlIP!$3?~9zs)%uA%0gf5#(1z7E zQ38$=Eyo;jNh}@!-X!uD7!Xs_gRb`bla&iEDVxzg00JFh)_Ohv-6VwHH>T@0YSnoE zz-UJr{HRv-kPb=MRl4_;4GT}&R$&(94#6b019_4S+1yo}W;qg@{Mo{1qwVJIZdQLm zh_Fn|C#H^ieEGD_G^oikN`Y~9P4sZL1Ei9BWKN#Zw;;R8_`5@?`ocKm(9nCdeYMVs z+WgQ#U7h}H8q8K$rH_Nb@WL~XU}NaT`f<Q4&e{vG3o1#7jlvls=*#ZGRW^K+RxoW2 zQQTzG?{Pjh<oxtZb{G;W;CHv+^^^Zr)$DAZj9!ZnI$r)UQfUThYhzASz1lgytj?-F zMeI!0)w%}(<R?9v2CgnK;?zmgr)p<5<bWAY$ZB66*PGCtOWdOaDF>bCXW<!>Vr}%W zr$X5pxwkgrSnMOhoVFP{OcRdC^O49~0t^ws{uw1xcGMfX9^@vW<{sD|T>jOc>QkkS zefsyRM0;J$L?fElm3n+#EE%S1>3S#bzt-aew|dzqc~~GwaEh<`<_n-)$l6MON?I<s z{0)K$0Rr`*c(woLI}YnN(vGnZK=lpt0eGSCIm)w5^6R<cG)hHsw(rN?iHuG0nLSWy zc$dMrWu9)iM|`a!yxr(Cm%pfOPNp*B+HgK~G`HP3b_XXuR5@AFPrmO}gKI<cw5Ir^ zX2z4F$pFzWx{@S8MTBsTuE?H^FY+`@_CTFbRH`%614BQxw)$+shaX?p{~R0OesD@} zh51OOYUvbxBSU~2Clo;1Daw4lpaRLJZ>XlCbU%8rQ~Mc#FT$U6-t{;X7f@sg{IIsB z2LmOyZ;+IhlkKE6vWXA;W~tMQB#m>|uMHM}UbZK`s9*b~XMT3Fi8`qP78tX-iqC=% znwaW@<!beJLflSx*Vi(m&ue~BXFS@|nSF7!d@@vf^*s&E17)vC69lCif+rj_(<zP> z@h1DD@}Om2eLfLwb2eoPJus?iMk}M1*(KCW#Kq$-EiWnQ;PY26xnEnS3gryl4Wwe> z#>G>`L4uvrJ9=%Lz*?7RU@~)bw^pbu==M9@K)+Irgbk_djEAwo=~C!mC>8tyf`hW- z@iHC7lWR)(Xzy_mSwLFwYj*xDXW=LEBcUS}u9UC?_xVX+ba<3ipF(v!!DsGyIj2Nz z{nIx|q4#$C{LPwDQCCq-NW^?R=38K>jAzE>zz9NZ=mnDVi{$X%#p&Wqp>V5yr#h@z z#)~Lz&z`=}7AL>4lH>w^di*~T*7INIn(Nl1b)_6!%4tNO;1I{DSaRMi1dxVWX&^8H zF;nm7*m6F$rHg-7vQ4~@ZAh}1Z}u-#o8b2@m5CQ@X8q5020(fO0DRMjF{*sM_-W4Q z@3`@4Yw$6o#<+^bZZ+d&m{`&hr+uz`C)s)6$O%PdWlav%{<%#-nFzAmUYgHa)HI-> zUrUV=zx<4CC@uc4JWZ0;4_E52(7HT%bHt~0HU9y<XynEhowt&|OfoqMjkPUO5s%FJ z>S(&+>mhx#wi#&lVTvb@_IYu5;M_3*@mr%1D?C-Ia#AbsQ%aa=`V9eg|F@I^K~kY* zu_5oikO1uJZyCm%|7GY@z8iFY2{P||9W25xK?!NA<dSqd8d&5}AmIxKO59o#9RWiQ z`bltVGRMp#f|Y82me`9XT1c8pn>^vHL4^nO{|<4y&11;!pB;gX+9$N;E2y1i34b8t zSb5g78E}%WQC4ef*0^5I{(T<PY3SKEqI<Rf1AFykB|(J^2zFKxw;eh5wwLRbGwZHt zNI%)FD;x*l+1b!Q18Y#0d-jH-Qqv=CAQaaEW)@xbM;0D!!j1Q(BnoBdHKRxG0VFtR zlKd?E&&}6S!C3<|$^=|ab`@0iz)U^@iLrlBmE?;we$YR1K=E8ZQB`uomd|2hHnTj_ zxkp@AvJ67}JGaq;oXFN2S-d1BW8SVu%erESW!DiO9X3@vP)ty1H_Y&grD&LE?)>~? zr!-rRR?cByT<=^m1@8#^7jZ}G)1h8Q(&<29VLZaQYpyE(Q&iO}1^XMBXBHH}+SOgu zN>4vHlRc#iR3rdgIasgbu7E>1&heW4R*Um7E#0uX-B&P~1WY|0j8ggceo=C}yexVQ zvN_F^Et{$!03}?g=-c-Y*Sat3@%GDXa$mZIm_Ox8X16`om1njK8jz^H?D#3}_p|FW zzjXeQgz(ph^I;!`p7zOr<$XJ!^X-8Pj-7^eDQR93K9`8aIx$%6OdVlX_+XQqLot&e z)}r}rc9SqXB1mOTJcx{frQl#`2dn5&J~8I-QE>-ZuQejH^p}H5Wa`_RUh?CDvK9Pw z!vB?RsQ!Oo0Yox^GVCl7U0Zj5YZt1$ZSYqss=2$TXRNKKtBuW9M0aMBeBmYxXB^~_ zl(kLDL3Vq~Snnp5{d;&ZDNX-UlhjXe%Rz+;SBT7qV3)pyEfu`kEOe*fhb8#iy63+J z%>_mR{QNHr`*zg+w8%cR3YMtDT+JIHf8fs_iT(a|dTKVu`f1!2^+6);$l#C%TS0;e zNA;%NFYg;cpe*+XjHBqM)dDinhLCAP8Wl3zIoBT)t2tFNEoqW1B}t+4HV))2Jp{Ec z+Svrz*zdl0|6rR}z2MvPU!V`=_Xbizj4Yhc@9yW2DBZ_H9**8PE!>yiK5(r3*POV5 z{^Qrptwr-C;SR_n;ca^_m79u``t4oa=*zVjpYX`+iPvM3$Q~+eP7;0|H26TVivPte zmkPW)6+wq>%vwF?8tI*Di1oK%y}j?df}%ih>9##%i$zdfDJ{>0P#+@OoZe#0{2KNK zzw7>)aY`{)=~suQCAGI0&V1)j^M+h$QOH0W!)`%Dj4WGdX=GaZNC->_;3O7I27(_3 zBe-}tQ4~#fic!XvkcIcA$q7ao-el#UttVAKf;70}>bI17U^Q_5PiR<F&=QQj=CkhY z2UvhRER?;q_wKiTHQ+l3wWBU2DvQ-yvtQq{$#-q%^@)o)x$H*Q#K5&ZBQT&b%>)nj zbB9mOwuW@O_Fbs<;UV^<(R4I`%IgT}!^{2fXl5-!fBay$si@w#H#GG{-O1D|34R~t ztlKwX(XL&{+A+Mkt?#7EjBEK>F#(*Yx6M20?2w6zD$@L{{eqquEnP~9vC}&SYQ5x5 zAnN<f&I1rFRsT>)R?fRrqyLm22zMHNF0ux_PCD~LfIZ`Fnn_1BW-#ldpD@oKx@jzZ z;6FBxkOkm9-IBbCA&YzKy{HD7O8cwni0!u!tDd_FzH?!{%#xwMcI<KNU-r)bg#<c? zL9un+M!Zr<=95^ix}EeZLA1C@0NXgyoT!K_bMH=l^y-ztvJ3@wFiEbRnUrufBRE}Z zn!cqbf;<9gS6k&eAHznf&aiL?UO_p*ael*IG-2>3Hw0<x%52k51Y~M_5jeSqPq9%s z+r(C-`Gv0%49gd>WPqo#0E5jp`l9RKzjn3etl(TcV4#86r^uV`2GWZ?yJOD%@Auxi z*i_#>)9MOn68Y38S_z2WEO^Pob>uTTt&^yJ|1eUdEPpucDBgvTod$8N4T*VPUY2=M ztJ`cKmC%^B{?fJI{8^iA{!RmGSZVn#%%Zz7i7(C}lXy<J_!(f=md}vIKrkm#u!u^P z>ubH~E8utoGmh`lW>oB6ex;F18w+Uy(@pY9DIk*X6g4O~y=x+LNM<~Y4=)~I;&lCB z@n4@fKJ)|zvKNe1R8AF|ra+gqlEhN)gvKA?(_!~nQ75IEC0YO@UD<<gg{Jq>BdUiA znUfA{8s0t>wykdhFqEhE8ZvFk#cRV%tNc~Y6BFA%)<4}^$_sILZ@xW~RutkbpMyrF z%y<O+rk(tD<>AHJ=jo68s;C(1;7udr2jGgg4Ntyx(GI3~PRtR=>Yg4y>A&%|4|t*1 z1*cD^roB7=vg<@oUo8<A05eWh+-*9LLn?LGb82)~Q0VaOP&H&ht(fY1j{~Ih408#n z8(IE?g^D%rO^3Yew78|XoR}t7pVW&p3AtSqf6Mu1c$Ca}@0Uo%+>6G6HVF3bkO$Ji zu{ra2PBE~<gf=LUK?fE2IUWfQvRiLo#LJgx%`X>8oN6v^G9lCFZK%Ma5X`>XhT4fS zOp?Reu<&~Fg#G(W4x)^tY9*iBv+3YiRK(K|Pbcf=2unPFkwDx}cL-R%^VbLQ2$8LE z&|27ny8}I}K)L%!OlXuY%!`q>-4NtiQ9aMy|L>jGy@_!azy+mpR){E2AO#Mx_c`_N zvxbW(Sv{F`ROlm7LPqZr!J#VCSNSW?h-1n9!exOGvH;#e)teU3^85*wGArZoOlc%! z<?r<OfNyD1!=Ge~mOi`<?5+15S9yC?H#5_)%8DEi5#}qzIE4O@Yx%7=EsQ`s8X2{T zRr-dh*hq%Qk&w^N2FACO0pFPM9`n6<E|hg=x%bxE;yqAR1Ewhb+2#>IQRRO_YRmQ5 zkS_mDZ60n-Iuqyl$bVxiTbqMtMSNh-7+Sjz>P-*yj0u|TWDhrQ&p2l8yfqo{FQt9S zlkSbFu({7~)6wrLc9p7z8=V=peYjb9gl=$sdpZ6t(%K%LfeL_nypNh%Ee|Pjf_tI* zoJQ+|&I;L4X5In1>SDFyzIYe6GI(A{D9i`m^ox&UYpz<?QaV;m(u^+y?T&28Yy$cs zK8>-;T=ZQmj0-(MG=9i=@(s>28zqwU1Q$;ASu=}H*)Bc0%0UP||AFatD@az-rbCn2 z-op0`GK%BW_m=**fxNBW_JJ5IWoG-X8jhZU5^F$ZrFUZf`aIRnH@WP6n%ly-dbP2! zPPt45u~Xgl5o`naz1HFhs(SMSKSD!R2hv|KKeT)DJXFR^K{oV(s(PthW75kY!6Nd^ zH+kBIdiBL!QfC2*XI~sMa3s!BN^#0|UFXF+^5(s?QN0Dh96wE4<UFBCr7oyVT*2HF zoxdw&MNk0lG$h7!1CDnCKOBUBXwS+32AFk0p;4Pdp|Q+|B?_RqfR?)Izjsa#%_#zf zY^}l%w)f&t*BPECrHE#8*GPlFBj9*cWzU#IAVHus>@^p6tE6nz$xSm^(2g=(Aj<=b zIXQ_SPO>z;b7lRfb+PXLN#8q#mqeFdgca!U9GQ9E@Qz6s?flz6CIdm9d9V=~e%rRK zo!;h%xFYe{_@Cdi4<|Fpqz<-Trj&ZYHIGEM1XyD9G&3Vw?h4+Lr49eFPnjyuacP(? zZF@!wSR9OyF6O(oITWNw3r%eU%5R+SOiliKt9~(XONxNl96WlCecKIO-K)eFz^O(z zy0*w%4ow}UnY~oYJ`_J#9-Q@;!cU5AlF@ytL(yED`6whf(<Uo)C%5R(#0w>d);h$? z_$xoXq{$bD&hUV_RpQx_5F#d;t1tEvl~E&~lnYli(GLDMH@kmSV=o9X(iP(NV_yQ! z7IiWrY~&Zp`90)A3f8kJUaU*iM{Y7j%yLlHQAM4bT0M(YO{b&;_zG~8{nBMxJ7@sq z0%|T0k;}H8iV;b}2^<Aw5+eR-y{^&#SIthxdxBsWxu6iSxGuTP|C9ZvJJu~aDLL-x z%nS{)l8@1W%O+o%_0?&*6RxWM3;-mx2zCT`DBbsO)3tY#bPYkvJ+|6t3SF*moW?H! zGG+`PvZ|q!q#MrW!c<XyUdSrTAd2P9mDuRUKkE5UmuSyYBQY%=5{j#ln-F<2{8=M1 z9v16QSyhWa2E$pyUx5pt@7)A|+rXTmD|63xmX`b>2^*&A-8!MN7dg5>iF!Y!*Y)!C zKjp}6CfF@pkc!xZ9V!QXH2{HMY1N7Lr>r{*!V>I(sig@kDSm8U5^<)65K7%jJXaB! z+?mF0H69drzr+p`qT>CU3LXl;=Y9-YvfQqE^V;Mg{3T-Y(UHody;^pOPvQCN2$8V% zk?21jiaJSJ<f0f7wzMiEX;L?E4W|ZEk`zWxx_k2XoUr8Wmef~zSt@y&I|LtP?^}hd z!XF8`iw^>&ePx`$brY=7>kc%0OTDw<2F5D%omxN0!Y7BN8`;(D=KuAN+Vf9FL4;xR zETH)W|9U5MAmHw|y`!fqJ10LIXNJk1VyH(jkGi^pTC3mRJHt?(J-bIAIeqy)fs*jF zc1GpQMJ1H&RHpHuk33OP7Uk*8cqPh4mg%YG<iXos5S%fFFF3aT(jaH5-jL|`p~2{E z^!|u187w8mx-M%Yzc_8OrJ3eXF1n+I?p?t7SK^pSYL=HUnOkv+gpywcMS|!6!cuVn z<i8QD7(*5$ieKp&lt-apUZ~+ZmKMTMYaZAC=781QT!vsOUl5)jzS;njpj?q;*>|U* z7~SE__bPuL92js3b1W{Kr6s7nCeWBt9@o{t1$M<}6S}QZ=5}^=4Axf~Qx)Zs4Um~! z{ADubXap4J9yVH-=AA=sd}m`IG>p?Hl_seXy{VzItqlt!>3ZF{G9GPeb7}A2JlICj zf)0m^1!tOG&;s4AR`7bMJ#Rl;?eL%6b{o^hjRo2LtMx?06mUE+Sdq6)=K^eUFrxPw ze$2|+?M^8I?{JO3YupB%5q3{N0U9b_dYgAesh~*88uHQz)jQj*O2R$gx3aX<g<F{z zGNHIsRJ@(B*88b>K*z@csjRZtF1uqBd{$S$fnE9CyA-F`5nUx!A8(H~8+F<FG4ehj zbeno>`~qd8oq$!}c0Gz0t_pLf6>D#oV^&eF_1Q1@IN68g$6oveZ7MdLdY4WDWc0>8 zR>oW}o14YY7rckI!T<;xX0CBr`H?VrGH0bNfEPz=$OO0HqGsY3y#aEXz$bH#zi{U* z<=4qwCn24-iB#eRH7C)Zb}xTi7md3NGx8lbVDjKaJANxR?-MfF*G?#>u(j8A8Nu#4 zH)))6Gx(<ONO87F^Qu-`-@A?VjRwHc3U14kH}_aH9}j2n96HZ5;L5;zsCMVdo!!5~ z1*$cmch2)`dH=no0u}e*LeDRi@y*M9X`0#vm2j5H2Ln$fzvpI44Z5JuF=erc_6O%% zsS7wiK>0P{MOR22Sq6@w2m`<k>CQ9&UMb^&1!J2X8~$$E6NL&UW&QS`m{LkWG$5JM z>vZ~`Qz7cu&3!AL1eU$!nU_8hp-)zZZ#QOXDaO1e0bu%r7ZfbY=aa=#u+tZ}lB_~@ zSR`syp~-6WYV<@&f4A#RPnvq7_+P)i6#}P_<7qLiy>eeY4MO{8<R@W5QfH)2)@ypu z10~2ZsEZM@o`ybFq(C{EB|?Ds*n?bgS9)KxfH5>36?_=~Q0qO=pe3jLtQwcB`wj;H z>bvCY(BZYTioqil$srKgYtX38u2up5fK3~80`ijz{TS<3vt|xC-z%YhE;0WfD*Tna z*tq}%TWXrZ!}k@z&Pvb(#^-pXU)(-0@t0HHA>ar6yOxNGB^%R^0Ngx>6SFp@om`Le z=D*rZh3+>~nm)S8R7B)q`;w<HzdAoMZtjL4m#Q)v^Vd`$-EZm;PhA&u{T4QT<_toS zz8Td8tLNK_q$-2a=Ta}scAHHO(D*N+<>T5fYgbetnJmqOH_XM~09H}}mV$vt0f$Kb zp&odtSY&7qo&aKBo|1xYktXfDVn;AQxzCyNvHgFst2CGXX)>7KFaPf8gX;)h#1&Yq zJlS^53PGLxd6@=rmk`s7J5}Ys5615MCSJYU?kBVX)NskjU5lF2Ugjsw`09F;O**b# zeqQ?Pr}Z)<NxT0|iYo(3v3pO<Nu4ygE+W`qkRX3PT<j>RPr<h?Jp-SN^Go4my};nE zR8pMJt7&rimhcYQYO-CN6dOvo2PNF;-D?f%SAD4a4N3|B=Z!&(_kX~|H9%+lE1rd} zy}fm?zqh})vAuhssk^<ut7WL81LOv_*?N%x&7Y$f?`GJy@fQcKwpa7OVTJVEcFg~_ z^$fWt1^VC&@r_;P(m&;<_DFY;^{)xBvYF`sO_a@ztZ#ociglhKHECQXcF0F+<4xLJ z5q3oO{>tbx%IGzlqx&~C-dFg@_a9YD?N#UVjKlt}776jmXH+Ft?aKu4A&NFudxRe3 zhGbXuAVP`cIam)V@H`(A?e66KeP?ndpq}q}2wB1#M=9erN!(#{<>m%1ce{wGt&(mm z4adT9<_uY)zgi2z=aW-8C!CKZ>GC<N#eh&Dn010n-~~7o+EyBr!s#u0TT}@CUlf}6 zdf&N(bqAVSlKU-)P!ILE$M-0K9=v>`=;c;_!LB2UcD`ub7EB~!spv$iAZuIuh{xwA zC^=ykFuP3=HNaM1@JCJrmb%`DNzH)Pv%}kbML90Jb(3hkBCxMRNbldl<g_4q*AF-6 z1~5)*8&gCcxb0rJ3Xr3P8M;pnsOC04_+v>903Kf(xvF<prh(=oh`56d7eV_3YYQRS zt(VOp#P|3s>G%N^5I*$SdiUEuEXOOwO-2q5Ye}u^?3te5bdkC=HwTsKno<b?$n}(> z+a;4aH!dHxRVlLt*Sx@*zQC1j;i2^@OhcSJ+MYpU1$~_6!ne8`6>dS3uqyoXWt*1c zJ_AOuZpFsr9J&6_!stuRR|?4A!`}yI@itM%S9#US4N0l<M}o0^X7mz_W#obWr(0He zAKAh(^jMs45<p%hQC<$*Y9TO(|1^LQDTA4&RrwZt)Kx}pf^gC8dV)<J;}&o&Z*`CB z;J+}yoyJ|H4rUrz8I{v>(4|(@q<Eo@U$UL8Lkv4TJZAHqj$A*-c;{84?TI(=oKbe` zUPgxaL@HARA)W*@X!YwO%aHyF(ZKVJZONGrKhGE?6F8fnuj4|xI>*Y9GsvAh_Z3=S zBUr#mq`5;>C?uQ#6Y>O-nRcYPqAnIx8ELDrY!JY-fjwp9@HaPKIzN{`dL914Q-Sa$ zEDRE}+S(k-{S?0LVc1WO(*!f~J~bg<FlsRMkEv7Ja+VHFjrCLY;0H@HgV&th#s5Ng z3@(x`0@u`Qn>Xc`1)0}A-@137d|hQ-Szt?JZT2ww0%+z)4h$sOptTeGma-jcU57@Z zH*{=0$$TZ2d_qg&U!KeunWfKF*ndeqCAG$3YiK_dH1u(jpWNJ>|8<hy<Wc72jb1#r zX`bFU`Vj3FoY{4+#HZ{M#a7Fl_-WZv^<MTJQP~i^d(eK>+tYCo$9<3)0mlFsC8aiV z&Ia+wMwu)e4+)#`v7W|<Qxw|A>@R~PS~`rlz6w~I8FN4M{O5XEy3awxXAa*{QT6aW z!~u5Yo6%C2Zko{K_i{(kFGPfS4Bu`Hpe91|%N<0>ZU(KOlOa}Fr|ZxHFKCiTguPl- z(60Kef|GsZEvbA#6=gA+=^b8ZHo-UfkN}jD(K1430&+GVe%2vX6^>TAtcdG&RcBz| z4sKqJ4arNPIv23X7tP!L8x&9*m^se8qkMSLF_$45{3jqZSR3QYK_nidqE4wqm&FOW ze(u+sonJ=CISU7(bPc|eclpTx>|sUJcc-@hE11>mqYzAB3kkjIx5EMSM2r5Eb*oL? z*u>J*_miBKhq;h;^;Y)746k@CeGa#4D12g2eYTZ*&$>!+Dk;L6PX;wnlD4;@-3_bh zzND%7Q_h`bSn(;-Vba~mm)d7qcl6GyYJoK$`Bd{N^M(`c)&9B6pOZTjRdt{>@Wo2- zo!4ob$l)Ypu#vAFA#?0NdayP%UrNPi7>Q0lVL?mcn>#85j8n~@Ny0&LHdUAqoTC2e zheFr3`~qWX+I~_%tW-VW)qhEc@@w@q%?Ym9?0c=U55mp^-6aMHJ}dWT&39|`Zr;Gd zS0!8i!h7Z+H(_(A3^B4$@<ZLbZ_CX$f)69?kIy>Y1{Ckpr`7cyf{amS1mR8($A;2M zBXsi2NG^>jABhz#au8aL3`VRpuJfUil9Q8J4+N<zePmovfI^zRgSR_;pb_ea#2U<b zjG;(<Y$pQSd#J6l<;GvUo2S;WJvV)xbjeDDG<0n<X~c(X7E$ATHoJcPtG}v+;q!6M zoYWx9O$S){y1gtS1{d(g#!nS!;G~2eT6D_KWXYW``KQw`czCzwZU44o2ySnRT%g6s zwF6|x6t$rHq?=dX#plvhk0xq25ry8mjiD(jqRg`Z6gq3MUOLqzj2?NMl)@uCgcvws zJHA>c5KWBYxx$rhDPOSnWHyq}YU>K6fHZ~Uvjl{9c#bW2h6Y;IYtY^k*6+o2q;Qqs z%8o<>v|yR+vpL5Ks=;W)^dtr|D;u@T2_Kn&Yw1Qri$A2s|Eb6*Bs(0L^EyD1ME|(u zxptINH3={L$ikwN1h+!fEZ1;nZF{D(>+9(nk3-z0vPLVQbdr6(`oV^OHlg_w-Obb< z!GUII{b=Kh3jXh!x<VMk_|2#~ZGC;+1IFW|XfDRQpnEn?F04~;k5I((c17lOeXc3& zGq`Ve`%JSY^eWw9KsX$ev|u(X4vdN~BqlHja*@AGAd7f`C;sppE(lW4U@X|ZCY+WB zvvhY0x-%EC2K&rZ!(~93GK?gr#O->V`Yl#(WRdw9J($lAYb=kau*^Gd6cbTT#B^qG zjB5l~=cW(keOpn!vNX&b!WLX&lS#I-Cd{Y4>{)Sge+poG#hJe}T<ps-KA=2dM`f>$ zE__@8|KHn2t7*`h`1zo+{j#f!{=zoFy0v2Y=sb=f`=;A-eefPZ<=x@7k!?*(eN4Zu z&D&=#p#Z{mOx*F6NDe-rY9<N5;e@1C&sF#HE$`xF0T$O4<qr7*cY~?MLtZ<n(AZcz zHT@%Cw-84BzhlVKHiu`|OX*hI7%@d$D|{fXCOLYeFT$@Zvt{`p9#4qw!;64pgVC|4 zmey;R<mBtC*x}P#0hURz?saM(=htAy`I+cPm3{;|P`qfaObV5*`5~q7q*5eOBu~e( zT@Jn9#>Y0d4i8za3LP*2mp{|z66<sSDi}u#?u(iWUfF6by~lXptY7`aZrW*ymtKOG zb@GVV-4XY*>gtWnJ6&9N=-Y4|?O>7+uvx*aM3OIj8fLg#PztUr2rVgcbd-T?`Zw=E z&>oDv^BK2*3wMlTE|U-lxG*<|QL}M|bTMYK@B@P_txHiw57b5L*VT&@>XSAK210^^ z87w+f1CCleBj+y|=H(2%toX<K5=5*2@RMx^$33@y0L-?D7br{Z>*Zs!$#*2Tvtu8Y zr%{L_Y<@nw{6l!EC*Y}~-WF7qBDjZRzdP25q+8f3nLM|4WD;i(f8vxS)Pr|=u6XyD zhFTRwyUd_}(#aQw%cxp)=dMxI?pO=*g|<R!uKExEMO*nPEm$)6%dyzzeNdYyi=)`F zxc57<y*|G1lFECmJI2qWU5JsuU6^F=qHk6q^;0Qcgj`$2Yo&a?Ly;wytMd<$C09x2 z!!jnr`RL`>8{L-dh;+$9=uLxm+WVHT_6PFNf%3Xb^jEt5W_2jmP;l~L_IABZ!1H5s zM)&6MogW)wWdrCpXDPLq$?@9d#$O%4`{%C`CT1V95D`Tk-4h;q?t3E~rby7Pj1PaH z46}YYId_ev9w`>n0PKb&+5d<gEM%&P0vOjg*Ecu(UVsB`^M;*^R=<3f8$TTeg>?XL z5x!nE;idA%{ZkpodkqMjiHp)NBn&&rY?LiQEJ1IU?Nvfa&!*jLmZvW*gQ${SbGU@J zv6q@@3xR#5Dm&Xt<NjG2@`4-Ljgrun*wut1LnG|Z)0^mU<<|rI(CBrgH#>;8?Z%V~ z`3S#8$e}mnVWq_zxYe5{QVca@fb8-*1VrP&9))nFnzlta9&F#gRV@x1rbj#00=wCx zH=aSix?DeTL!#6&A5rZW*3<y}d~tZbZhO;fx;OBDi2BO7sJ8F#GYlOf(hUYE-QA6} zfQWPmhzLk`D3S^YDhyo`Ln+-LAzhd5X2_u#n&*u7{{GJ^;sqbh?6db?>sw1}=2URP z3BtryZ(QBeURh|$>3%We4)3x`N_Tp0V{ke>;&J4TAK~qB-4}nEW-xi2A~y40So9~> zB|`FGdx$>);rLMQ!aWx?(AAin+U)FnZ)9z)()50{CG9&g{DuXd!S?&>KGlr-j12{s zuV;*PB=iC6$}=e82iq&E#Uu<KN?@PdB%g*Q48Zg@!x+_Z25xlKX$QCN0aBmGsVn+R zmt6IY`CP;yi#_E}!;dRw{)S#%PmN~;Q%_N4!!tpS_4IP#9lhEW>a2OC0-+4Xi7Apc z`IWMlDF*&_efabELxNS{&;24FQg(pETY{`K;dU~yJ6`*G7emP=@JZxO3b(4ci?RUS z*-zNwM~Ya~{mJ?xTYLPCk{q8Hs?$M!1Fd-tO`EhFU%qwa>+qRhK$I)$D7BgWynT!j zgKK=95m(wAob2>=*y)G*<Sx!NxiXa*cLjLvrtn#Q1*h6OzGiM+dV6L}j-s1s0y022 zvg$uTIQe`i1HD7$y}f)uHZeut#gg;50Nl^wOJ+@DxzC`l1U2qdv;8Q`qvj&I{c)c> z_NT3?c`oWW)!R=f*bBicBrU@>PEQ&i@4^_lw7@b-Bwen1`(zP$4x6$N@r(Ja%!lf= zMK0VU7j|9K_szZZJQ~l~pvJvIa^vn{xDN6GFbN_&H}RNXL-m48cSp<>a-I;!>a&5& zE)E{p1!hV$LeBcltim(PxeCFBkZ?UNCu`Yz_69%Ihx+Az5AkVOT?4%_*5}%+oWNg< z`@lmB(>^yRp4Xf>8I<T|pXY!4;qrdjF2U^)e0kHYA2netw=&N<H)^D|lHM#Okv*^e z2qBRIX9@|jN<ZC;+ViOs5?u^tUg?I{iBT9F3=UlXve$}4#1o-B5?y0u2RS_5H>FOw zIcX>Sj7uzL8>tOu4*%G+xbvnJ$jkkXCH`~|U+Lv$>(HA&OfA?UK?;04j!a<li@wbr zlJ6|O8pq9y2k{`i6l}w0@)mCU5bffBcX}3{%!or72@!!ln25c<%<W%WiXxZGZT2k1 z0F*06x9iBYBu|m4-qJ0uWhPeym(WE?#HM4{$c&Z`YR=z2Zke1*)}(V``y!_-;mFkL zma}PYcH4~9V4}U@QrX8B!Q&pEm%E)bZ+$zuE|!7MeZzIdz3s7dyXH^xXHF;O+e1M0 z@cEs&A^x8Mzt^)Py4c{B-AaZ`1+7Xtl=8S{kt`TIpc`XH9u)8I|6?DrsP{LrsLXN> zqeTszuI%}LD*}guAY`oBEfV1i-i6Gau9C?~<p@vjn=5~*e}w;m$n<&FD@N6k-aG9c z{|7elOBBf@y*zbq$V@nF^7IpKXd35>u0i#yl9ic1?kJK1Wc5E}WBm0L#b6jrUtN0O z7Zcv%*|zdocc;W^7gj{~$b@R-`>@PHT(7oC_Zt5}3CqD&ha+S|AR}w6_++ocsy?8C z)1pv1!}&Vxd*fH^#s5JPrvD$30Hpzd{MA!j@}7ad?#}kk-mcEJ-mam+-p1dp1I_3% za<U0Ch&a<G_6FU}U&c;)V(mZCCt!vh{Er~|V`mov{y|<wac)~QhCEYIWvDB<{9c?6 z(YY6Jn-d3_Vv8}}9BZ|wFUxaME<aw9_!$<VrE>Op<xQC2l%nt^pQH7g+jppgf#z~o zu_cW4os@1C(|Ma-=Lz0lPJEdG>p!WR{3{1X%BAL#ci^Gr@xjC$-94j7TdJg2-f6!b zrrfVz$&TY0*usecA<3Yi`d?q~`LqDI*Hn=zV3r0}G$k;v%R##gW}y%ldt<*%o!XCJ z<D&Ku!dpxj@{?;fAT|1L4Lg(c$3B5agW9EG8hDxVNemS0E=?_w#2hCLP~R<se$95S zuFSe@O6O2Op#rspKjkF{uW*lz%wXl*<Z(aXVk{4%+_2e$Ysr6Q7(W!A2z8;*C%krv zoDw%;95L$c>u=)vFoU$3ka(4mcbR``bRu`no*AmpXDM8|H2>Z+I?$2~X~j)YHK|2O zs||=P>UKebg4vEO%42&7JlbtP=rG2V$vr_suHLo982c7__?awbZHNL9qVTt%CGcq_ zmDt$WznqamCy!u3945eoP-_RRHZAvaSJUFBcnNH#i-J>6*Iq|L*(mgf6~DY}Z9Wa% zN>6=PYOC?n2(-UxDVuD3Zo3>E+{z1UEDVGn)iNfDSTmZ5t#DSW9sh&l?l&#i7rJA( zenT@wfBBF|+0Bzh>*iX*(er~%y{E}SCiPwOzzcj+WMH4ztaOyT<jJ1~VM1<=U?RM) zI4T<AU-j-hdFGIyN4$s~=K^5g=#J8EoQeb~H@(4p-o{!m>EiYVvN&RACrfbk-`ohQ zr5SBdM5W?%IZO#+UN5M11pE6Z8ZWyuKFD1yTI4a^VfTHR6#7RmFy6)|;5(ugk85x4 z^q_n<%GvXt>S+xAc6)AhU2{VzdsNm1{rp7$eqYf<4@y_}1KXjS?W;Baa!4x!K$5qi zWT2+{e4fXevXOt{J+_D<tB%&GUVXexyv+-O#H>wqDZvz<ov|B9H&TgGS~}+Dqv9Te z`zobU%-bPlP*CJ1Z>a$^Y!%UC<T!wf@}k^l8?w0ONX6_h<NUuv;yEoGygRuJ*XPig zo!u^qO{hC3PD?vx-+9+<`q{YJL=740vcHVKBIo+UvHY3k%zKye#8?y4Xe#{M*Xy;n zw(*Gl@64Hq-K6riYmbDCr-P70{<*8;?uEe_lT`OLT<qN3C0$$4GvszXIv3n9$2A5( zKL%ZXay<3T2v!YR4Q0qE3tskZ+WFNS+_x>hStPeM=3cZN%`D`v+nVzp&477}z688# zLAu2RG**j*S$@OtdaN&(Q-=R<8L+ZIl?WOBB?SM<hX=HH-_#PLv~KBJOBxSup==hJ zmW3<*r6!G?X6%x9<v7yU#VL7^uKpK|7~L}MSIo)Mw*kYFl2CZc4P63mm}f9j6qb(6 zp3aM3O<IkwJG>?-kIyX>-McAcHPX9O<N2oLm?VcPO_So!LiVNhx4gy{1XMNVoIkn; z5qJ%xUZC>HLbS<LK1M5ReC(UumBV`&B?mFpJ8nB^5)Vok7kaNS18(-{Oo@8v*;)z3 z{fhqtQp0`9oZwD3PnN#wnvwcD3*bq$KdKluVUlSRJhQX)LazJgu;Y1`SChE14c|v@ z*b__eEP<8UyPSFW9u1?8QCqL=k48r3tq<sioHdc}?lv?{_J<;@|D>pCl>a0Nk$fn0 zv4<_Q+cc7<^9n|N$qNnCW3`(~v7vcvW2UX{iMaBA*EF9E38G%aUWCL#w0XNiRe*hM zZpaHFUKvskv|Bu-+>#UP=kbrZ@XXvkH1&nIDhO?{e~w2||M%`(NpK6-a5Pa?z$6E^ z`U~;v!E~deS<{|d|5l+EIngP1_80q#qGJ;$rgOCTB3fFbh60t48-87?Fs!^MRHlrS ztaUIy3lCjyTdF<}ROg#3nHrCROOEVMw5v!~Vk~c+iCM~H;p-;eV8Kr!>(g@r()7ev zQ#&l|zK?RFmR8c}Ju}M#!!0}o6%S5?0|pS&6eKzEGVON~u^gzMk*u&2%-by&yS)bp z=k-!tio!6wCU<RdQ+L6OU-uXBhCeaDX!8w}fd1FHC_m5x>oS>H6QrX7xI~1MZ^qee zs<SA;VT{L7`N<e}6T&+@A9B?#Ll!-oZA(W@x_|c8Tje6k)`Y%%VK+V<JZ|V=vRtk? z-s#HO86LS(tK~^>S=gy_wHK*B%uKAqmhdShlAPnxe#Y5%6R%o$)uwqaA*%lsJ2%jA zur^?3p2%Qd$_d}5xp{x30hap1aSzlc-KPzH*U{$vIc}0D0-RE;?;z@5g0WBHS$WrD z8eLuzNBKVmyj}~+oq_s;zwPkQFbT;Px)Qi-E<&Q;werUB<&sj^t6aqQh7Quwr(JA$ zE^el-4K8A;=79^v3kb4AOeO{<7At9`y@cDSF2CQ8RJssz`m@Pdx6+%b>1XO=P)WRr zb@-d8&-E5F6n~uPSYRata2ou13x)|limxNG_5I6|z!n#kU8oi5EX$D)v7Y-QJMSG= zgju#afXVr~nWu}k#hIvI*#|#ILl-P(ibT(M!H*GySe{vfTthxpSo<WjB~P1ECE#DF zddA6T9<-yc{B~*g4)7cR_B)T_eHlbo4i}D1oW`^t^_IEzJX-BNsbyTGncRJ5BH^4O zqc6{GmJ!CzedX4yEYGUkyIHdH<J~302K6=O9pp8N%Nj{yz4_F|#=hJ%-p_t8y>SVf zX7ULtHxNbk{W9Zlt}9qpy?;iO;}>H0ZcE+eh4_iF04qdY$8Z({&Me?|zOirJ%7ACC zgNcXkzFe1m=vw6SsaunX(({+;$|}iPveg9T+h5!MO&DKm!!{REP^PtK2KV`%@?hh^ zyr>t(SULkgq@|~d&p>B*SUz`mZ6RII6}zUy?Rtmbz204vpFGiF%k}2AfKqXFXk>J7 z{zFs!^_xLoqq$dZ|1|b#&i7DojhTsdixXByi-grC$J33iHU)F16_`sx$>sz^f$rP1 zZjGq&JXl3ydHMLCnq<+&^BcOs4$koV^5<)OIXr?G<{?cf7v|B-*fK32Vjn`JKy=$O z8Glh1e(%ATE&DSGazyNyGY}&R|A;%&Q-yXc=KHGV1%HlSqJ4^kR!F^VmYN^iN<)zP zd-9R3CaRkl*XmVUWYc~}7Ht;!S(-rQqfE^)A41OBu3V-_X=@AlmA%^B#kh~?QBlOl zgVi?15=k_#8jn&mIO)e`JvGkdt)=C6()_Dto0~5B3ZDCVQW&PQ*@bqeNX8QOEg5*W zxeJM;Q4=^){4$d*-}&13Ni>6%urG#p60Np1#?dfh1>_+N`o@Pln;0!&I{XS$kN#H4 z4(~v-UA^8D1-PKe-$lub3Bt7L|6`XAYAyie?HNtyk&Dc!Pwo0lkSkv}Js1D|=9swY z5!TJskAt=8`Sti23xDLlTz@%HY5cU1W@}};brHy2Z54QO^KPQJeeJ5xLu>V>w7*5O ztNYX2dWr-(QO7lBh^I}e<Hatr8^%#)u^@S*>61jHq2mx&-(7U|oaHhgewr<*@}?=# zD!r|BZUEnbMhS`wJcm-Lz7E0_7F%5>t~0>^dl4{<3VJS$1xoHgx}JwtN~`0Yj6*5( zYzY2w|LuQaDOC;%i8SDnG^C;uz_M%nC0yT>Lw_f>sCUsrAcW!(bpP%{@=v110Wl_B zxTbto(Y4z8SgN|B^vU}j5#CRnC|ns|N>ufNfT!(L)m<S%`txlGS<2MS^YxOOJpX8{ z&IfbW?X<_!gik_M6E};tGT*FEZQVvyz3A-wo(I8AONsehyY8C$%QCvY@1*ho%Ow2a z`5S<TdLA%)%B1aP8Scz9yRQsP@{(bJ;T?R3v(T1T0u^`P9onC%lOtp#_|fE?T+TlW z{~1*NbkV?-z+oZCtIPAZ;MaKaaQ8W*J>R@ePFvxN7`e*#u0j(M1-`GEGB@V3FHTKm zCu+jyZWFtZ-GhjcsKbR%v8=3l^XGg?o0w(oH`O@SBe8zVJFYb5rpneapKk_IE-um= zr}jc?UFW4MwI80yTY2!Sb~Mn@G>CJSY&o2Bd09y94ImQ&iC4_UkxlaiG$V9kM7}QC zkILiafadX<kH0}%vK~j9qVyf}Z*VM7-w9(Yfy^XfI*;k`E3jRUp^FqhUK}1HRRts6 zf`?#@a^u)Y&wWJUl`DOEg3B&%Xt)w-`N-_F#|R!wSLU~te3w5}@kDq*A~#HAoJ9r? zOR@a={*C2>a;+0#vqT$BTLw;4MoHU1Kj~n<X#NbA`c1{nXfuCu-6nNtzwXa+90l*h z{LtaB-^YUkp`oxMSU}6C%QpU-DRJFqmabtr+&SpNh(15fxXIn14h8VFl92NNd&vSl zf-gw4+~5fr$U1-%1@3>l`R^*69){b4sZ{1y`IL?1Kv3KY?-qav&0OuT-n;tP`38bd z{f(jOG4F_W_vqz`IAA?C#sn9O@<$<8b;u-#6yeNT(r%_AjuV8<j{JR^uMVMMEUflX zQUZ##qTDHxiYmmby1EV*zJR~;m{4ptL9&urwdcE9o(b0jlix&r%Y&iR2;OZ<58Ehc z0gvLqUS0irvI>&-Gb%yfKT2`jk<#Cxc0B?1H)lpILkb+hBGGHrS@O=}2d+m7J{12l zq%qJSmJKl_Fh>Q1zACSZJVl!1GRAM4PJp1AxG%j=+-5!<%_y-}2R&Cjn<~eNylU3Q zQhKahdQJZzIda#=Wko`Rt6KGaK&7w9Pw(X^7?I!{;go2YVH3BFy6Y`W!?qyoD3gz^ z|6y!H`M3sx(E1<?et}YC4u+0?V9%!6@DJ+vH3B_IA^7o{S`AlWX#&vl<yVz8l)J%v ztPMzkpmv7`SxeqX#fPP_eQ&nYPeqLoFW8tI`g#7n#d-Y%)xlXOMMpO)(g9#&8}v<? zu%Em_s(udY-CI1dc_4&M{WLzt>V-#zO(@2C9f35|df=Jx+>Ui}kfUgWb?tSacOmtK zbAEzSZs(z+gXigwgniA(V%N`_r$1pKX$3xiPCWBbL`i0TH{r9whVfS|j?W|=hj5)^ zIihNfSscFvbfC7$fRSrLb?R#Zb+5ZkD)~TBEs30qvPG2Zw^Wic>_c3V{5|k#isT*4 zFk1HX2%a^DYU#ZrT=Sp|(&u7cR`@rq-tUEsoYVN)bUqvm<q03Tu~6%YT8ofP+Z)6v zi>%F5IGuauBWGLOx2Ez?CKW;S8yH&s;Nt>^nTu&KvVOq|xLGmo^Lf2Z<(@LXvsIOp zUmWmg1adY?UE|E2_&A*o|6u*uuNY6*n8BXBJuBycmU}-B|DtVS&_hWg?TCG#pzxrj zHmj4TMq`^vRdA?<bZAtLl{u*+iH;@SOXGj2MA`pGCD5Ngru7{O@&PbevK1UjG11x6 z+S%OM+SUl-6W}>kzKlM{!2RQb_A@*FDkN)p^_<{K*Z2Q&?T3DS7RmujFrLfO2{1t^ zYoJH(%ZtGP+vs^wyWs)emz%4J90p>YbKf)a{%E`Q<q4K5>*>?jB=2NbV??Bja{C=g zY-l%DiXScVt2K`s{UF8t=hLS3sh_w9$NFT#LaW2Xdm%-Y%dh7pN3A8PQq`i`epa&@ z`WTWpzcCsMBxCi}-u#1WpVYIYg)t(T6!C=Nk`jScNE8>@5q;`k?6LBr&A!@!fKLY? z!(sq?mDNcCFxTQ<&K%lKRI!#P3~<*Me8f$#MPtZr5Dwbxzu^jq!aYV!gakW1lb7ZN z$V}cjNSa^m@=gfU6~l;TZxymDok(W)hyXD_&cEdHxIy`A9cdn2=~e6nHto_3w&YDo z5H(jFa>Z*sYY8{I9ho~P<t~>+4sw$#hCVDeX2lp0;J;0cKAd+G_WYts?oc+7b=nf_ z*2uFvCv>};$!-|+qz0!~F#0w3g2mUO$JyasJatc}^ed8?Equ=ho}hD~_?KrvO8b{m zxL(y?X5!assd&&gHr{7{>z6YGc=;ng4U_1jWBL~h)x?D_s{Hpu1Z~amTe{0;8yq$B z;4_0#R|bv%)4ASbS0{5XNLenQYn}IO{q{V{KPl^+Me*7dv6PV7>l<3Pl4y~&wZkD& z?i#o&jxl+Wa;aG~hZXkOCtmkx<2a*fbAG<z$x7c1U0g_$F+bslWfmiW7OImrvuU;Z z##&r+9-RWRoaBMUmS84rY?4a@_@0<K1SIA;57O~7gbP2aXo2F@^eo!A4mW^1+lJ@S z-`3aomJuK_5}Hn`1LwU2Z7MH?=`oCpxn1i6Me4joaqE91#}kN65G(8%kUQ^cU~^(d zeSKpFcSXad%4bVZD+BlZk#@VmQf{c(c<m%as>Q}&p3=xsH|E;wSFZ?bZ?rtr&eLbl zrRrg}i~a5J2Fa5aYKguyDTQ%Fzvd$9q{cRWHXgv{F+&wH+#$3EJX)i4W$ojCU~pw7 z*fDcEg3CZBe?1FX%&e@S!Yf=N)lb2A=Z@v93N|O*|Mu>^lE6h#1jideJ&?Wrgm^QY zJt9AEp<0~>apoe~v?OmD^?hnPSI)|nlvl9DTI69?K7Y9|xJT5kzIvM3e}8@D>hVA4 z?}qPwJ<57yvwm~Zml)(e7<(>BA4g_;zKLwuOo2-Up6RwFk(7Hp*MgFbIi2w2^FNgx zVYEUdom66&Xe~R!ZE8p*uF7ZWt=R-EIaD6kM`F<Fn>X!`a#Lf^>v3cn`T}Pfa0>an zG@|r^<$K|I1VEJTBPE}Itp5|>I?$7_nXo_r5ky#wDJv+zt!?eenUaqhuh}0<3Pk<_ z%G5I!W9|NFzZu3HNnl1Tmx-2Ko?11D(<>;?M#Ri)?xp(v{uRJ@>n`uD1+V)otcEvc zEh=sxw#P9aviz#|!!`c~HDg)imCIY?tUF2k=rIPMK2>Tc{3J7E?qvY57@65;e6WIQ zV>EtegLS;|3sB=l2JGoF1(h>H2p`@9^+Oo%r12Mpi(iH-fQAhi8w0h^9(GHVJ?}k3 z#X|Ic5V<0jY0IVmtUUn&TOzePOC6yi!Ow1=3o!u0Ay|vE6STLIXN`L%gmccf(@+@$ zwt%qbgZl!5NT;iD?r>YXT%i<}+f<%0=*)tAgR@^MI2~R%;@rP{{G3cT{UW+V!?h}- zq|jXR5wT`KnG3f4VarKP@oyW6*>9syW1yr!%=VgO*veqs`m_c>5JW6PmO|OW*ZTfN zL#!e=FE#*_b!_;6i4l4a&_`+>yk>H_i2$Iiln;51uHv;X#eqr7PrP#S-~}0eT52J{ z?e}5{QO-*r#PQ(iQT)s28<)dhFVk&Z$A<V(s0r!wPNcuH@Ywy8K`ZT>LX+>Y-hCzW z;@u*2y$oNNUs5U{$5gWF=V=cE2Pfv^FRNa`hIXC`7|uzzNpzhu8Z}eru-e+WRH<Os zWMr~!G0?Oi16>$fZq0C3MJOvI$IWO}Ot51Mq8rJ`N)isg|D@;$LSlvIyqCR;KA7aa z2Qc>I*xFSTyT?GoACltI182YRn?3X3FQRlXJ#z$@dZDZ@2-b-~^*^MyD{Hz<%Fkkb zJ0$1c=*oBmHRN)Cr>){)k6);BWsOKnKutyx4qUG8`2jp`C!KVGUq|G}9rCE7w@gPR z)K3uKtlv%MC4QW(57bXCp#FNDdN6yLxnK2RrQXv+KzyOPS^BDH^TN7c%=tzj52dA~ z?XT$<BX^pv);4wNxz0UghT5!=pwPT)n<wNu)GghMi$%;wO55U)R3q~+u<{uR!1N8A zc?@=p7^k2a*usE7$B?fX9C*f72dV8xuNY?+EVbgl7T(G&KNOrT@9ZNfU5kMp$|3Na zzLNFxiSY;_NmF>79bsff_saLtE<zZT-kngo|5%$>&y&23zTY_xnb`ZWA&5qa#{@Yj zrKLI8nOS-%q~H4t?_Bqq|NPwn=XYI=^y$X<3;E~i_4*I-gon5{&!5_9pCnwRMe#;= z?%o+?^!0MG!M|PmVAMwCy9g?-2}H033aB4u5{k&bp0`^dfH3HNl6NqIEb7`h$_|VQ zNt8y0-A8T#0VD7Zm7KKyL8fEEa=l<Je42C#&Q_F>tvXVkoS-Veq1Sih4}7~v1{CX0 zKJR8GhUVv02js0!751jX>No)#u7*Fn8zo29@yR_?{IxQZ{`Cp*gX#<&HXhy^^Lh>A z-~8$2^_zW3+rD&jX)%YTwxwpL%pGTn$`8noW5mV_dOqX9+kNu5Nu-lecL<B8{5f-* z=!oB2mL8%lQXXrp4i6(HF97(^_sXiB2rR*lMQin;AR<rjOd5n!HV$2yX@eGi{Gq6* zH2CY$;?1x+OJdUi=Y*L~n4R4<^PPRq`XE5y2RmS{L(=`r`yl&{Z=iKj5zQgH0rx}7 zdi+?A5rx#SPj5B74(3+%^tY}N=J3?B{maMn@1{JZ%j@&B2fe0JVG6E5C=G1WJo)v8 zhz13v3`+FvJeG?Bum7~pjraSB{fWNhM8m1sZ%v6!_=$s4LTUPpKvR9>O%2DkF|pY7 zjtQVm_(z2aY^jQ<4+PK}=qI_|6vgOD<k^}ieTy0>E+BbSiaxZwF7PsjnT-ax+P;Fy zp+!HpfY;uEd>zEXru=|mw0E~P!gSMTxjx{Ko;FqHdS!oj*HrujC2lm4ulbmEe(L9x z5-Q`mazr;uoO{b6ZtrX!cIVF2k~$ah#ZOe~)kbPUXoBWVoA|^!;cRj86m!gMQ~>F& zrnAN^gD+(4C&a~TYgygK!*)PKBJnW#eIau&$)YHe9yV6^crAg9k<%DPKINSNJr2=x z*que;awU}nusSSUhKJjtwRX?K6{_6+6>s)KCXsI7=q3=p2A10{OBL*-WVG3k)<BoD zcXf|`QNW0GQVy4GYWLg$OcW}xC++|-)NnS=VLx0<H}HDIV_5F%+(AA_w}PtKc@;)2 zR^EQorcqZ*dZhmC?g<hbp7A!2ploXjQGzV*riAn3<TsG|5}U2ZaqtBv^~#vKc1$*> zO6@;6Ss9>^k7~UKoh!>|?q6WJq*x*Z&nwP%LOA=+;2%|f_@M7UhbUWOAVK?y0^9Ci z7ikO<GG{+&<z>cS01Ah~15-Kau;k8euF8djy!!6Vj2Z_CH47ZA-^BTr@3v<K2*|*@ zw-=YAtax}k*Y-P<Ivu9#@>yQT_vZ)1Kzw{G9XH#Wu88Dp^7xK)*0fw~#uh@DRz;jc zR`eQ26C7<&18nfux&8>vWY4RPju&q7Cnd|s6j8*BEog<PpAI=zAEAKGi|PQ=gw^}+ ze!!1X?b+^j5QEW<>d+!#tbN%^rb{>UQ#cNL;<SXl;8#e|2lJCavt>Gt7QL0w*XQ6f zXf|=8e$L-2QuyJ%@^<+J1ybH>y7ZstdCaU-3OUK~HiV?J0U2SY{;w!7Ay<tJGc5v= zk0xOmfm*~Xy}gWsy;2NoaT~dZ$s-f`5tld79K;8fXZJHU!`*H_bCe5?|1+bbA=vJ< zw|uq4Gv}=X&c6G38>Z^I196a)J`#B|;r#sveLUg)4o)WR_iBO*D%bMAT0jpehoN^W z_#PEJ4Zrug8l>S<$j_SzTDX6`4CgtqM+e*lc%}gk!@mY_-Sxq0P~<u)_cLJV|4~f} zXzAvYEj7TY+mKB+hLpuOz`QaZ*KAGs+B_xPk@7dK+Viy&(#4Y?@@G3JnHb&_(1{j) z=r*QV8+rQ+A@+;#!STGc5WRfo@%NNk)P=!6-vTe*(;kU*Ht;jSpY#<J-}awG`!*ku z!w~ezH-+<)N87qUA_;aL4^F1#{YZ?6r!Se8s9GL_mjv|mE&ifsHux`l(@N=fkaU{} z0O=kd?{233=XEEcpy5&kiz@EMJn*p1um*a*;9qwAX7pVNZ_$^OjAbT`eR0RMf|<C* z@pfJtMT(eCjcC{WaDM!5H%7wEhVgFuoWpp*^0Bk!t(a)n)a@=ZGN#weQm|{32WppZ zn#3$64s+5!nDyRHzr89SLZU8T4RjnyI9zKqZ*b)k=>tqC5wky3v{vCe@P}JL`e&<Z zkI5`!vC$grx2K@ucLWq}4D^A{K6uUHjtRIPV28o;rt~lS;gk*?Qm`VFmXp^9!(oba zke7X;P_@FwV}3x}&UjC#zq&8&x$b*M^Iqh+_nEXM&=tQxlx*#?-_&@=ul_-1hI#(g zQZMI?$OHm*d)}~<PSN#&U=kr1ARa(?fRRiW=Tp}q)ho=TWjgWvONy?9?$pY~e20St z_xPH4wA{*8wGx;4^8oz(68r6ga=*7W>LVQN_(nXkareJ)<Nv{3oECnHA*JVFI9(6y z8}$l)7%gAo*O$=u3dP)4a}bt$hz8xj$Kc)rWa2-&+v$HsCwZ)_AK~Ae1ffLFg7yIG zmM0iBw!Peg;+G!GOe{HkkIZv(JJc}d`OFIQn5}!~y|MF?=!%o9Y>^WS4!Ov8>)oZb z_E`@hu=&IK<Ia7<1xA>5VK=6TYl$gbvbj=Bsm9rgWZPqJl~q`@F^@^#!Cu?;NThz; zv*wq}t<*Xrwzkd0H}c{wBL!7RjI@Ic?x%YLjyTNdI!e#`<Zp(U0-HBl1o-H#E!t;! zPhs;vlcE6aXZ6=fAbFnLD*^t@WJ^+wm+X6*hn<`D@;PZju{wuC1w2bsEYO9iaNU&~ zr)$}H4-*baaeC+MZ)^H8x49e>70B0FMjX20n>KqXuWlgw599!qCV#Ji4jXgG87itj zLK`R|j}Q}0BrJ2k+1e4jP5QhUlBg6JSWLTa(|KKfLX{ilUYqXpMnC-_rp`7_OGbt? z2G9=iTGu=LAIyM_^?xt}_|gFE`@C<-+uHwhbanK#cmMv~*4@$C_PY%nW&simP~Kdq zmo{fedSx}Za<lp#LXgErm2Y^T8FcvlH8WnvQ_Gao{CQziObFg3E{3;{qJ8m;7LQzS ziDlG1oO^z+F*b#5EX)pCkIaT$kXr{ODHWN>BX(34>>Zo=KIVo6%SRU#hNm_x4<EV% zABjf**DrnI%U3rAs~T}>t$q7d_sV=S<_QwhBFx1sGH6w}C@8%-i4nx*rEmL7AhV+c zpxU92M=wj2gXkIT4Xqs@qY%s$&gCe{6+-qH<Z@HW)LTs;_anc_eeI%oi>7l6m!+UB zQ8di=3jVE2m}QE#scc9<7=QH8Pn1-jKIBf_-j)EM4LC%lsF-b^f*B*4a^p2D;h6zp z7neT#^lk#0H|twKOXX7Eamn$YFVX3F-tcLGIY-Y~zrzu2KPjyS)PqTz)7@8P@t+H0 zcJtGb%fpn6Q;96WS&U`Ic7rMX!NDsTfK6z&bnW=s3mi2HOXfG=dKiPF%L+ONXxkn^ zFsx!Jj{zxbY;>usf2xDE{~FA_nL$@22Alq>=vD-D|Dn^G`OWFG<@KL{qHNNGT{HK5 z-WV}l&aA?>{m>vf-F_}JueB$xUmcCa^cBWt8+7BH>L5(nB|W*Yx7kOJ<IPa4(&zDE zZ1#`S4_^$mxh{AP2=T^zA8~bIWqj2bwsSO)73fdp@hmK=;5wT%X3!mb9~{s9Atj~T zVYqJ8rOA>pIp!$xX6f*ExzM6HcV|T{?Rb2K&S_f7{bJ0pLDD~N5$fvlD?E1?K*Ft# z4rrc!O(%=AMDHI#_Ox|CDu+#H>p#JUz@O=S0TAVRcjP|LfX+rNP}7<6MBW^}6RR+3 zHZX;hmD6moQ0iL-<*-YY!cu~zq^l*~-s#i4BYt*cnaFzytMwi`vA(O|EeUV8jg7Gp z6BN0>^2|1RC9HpkY|BKgiRc47DuX$-zYW?aV?qh*erb3#<){7}BUb&o|4_XDqDF&- z0&r&|vWA=>f}RDi4&luysQrP;P<iw%0k}bEeh0&Y3$iE-@*ikvKu!M6YcP;Vp#N@! z$0m&wn7V!|iX)T5`{yN*{$J&ZXS&ru*+EF`wZsHw2AKpvziy=3?5`FZ9}8Jscu!^r zcMPSWinEKDu<rh#Tvlhb_~{&)j^cRKVL&JR2$eX&I=m{7?3jT4U}BK%`#_cNfNSGW zQd)^*I(($@yf!O+b`0jud+B^(WHQ$gY%`8}75FEUq2o)%(vRTQaYvobv5)wv`{Wd- zJ*QFO_rVA(F%u<{%!lYwSM(j2RrjFaUc%#-Q)niH^;v)q;Dx8bsX(R3#w_U91OcQV zpVqeCz(I+5%U(FDaP#pS+$;-ElDc=;04Qh*y+9JwY)&@Mi$iKwE{SGi6>s~6Qh`<d z<b^kHW5<`}x$@@NPhX8qFdvU<_LK06#;0IPV_uNI34Q%240~kWS1mkWYEPg%E?#v{ zLe~&acVxI^$68{ro;aW1dAnzNs-^6zf1u_nYLIbH<kKb&A%F`U_sg~d?|(~wtx(1Q zndqJG4KE>Q`$hNU+|ekgdXKLl7}f>Wxn!Gf|3ymv*u6okm|HFgP^F-91`uTtkBjN~ zsBCPGm`Laul*iCcG9F!vd%-UA(04;L2eVt9Q;@&dP1Z@768A)@5p@Dj8j)W&YI2Fx z^avmu+$m1d-QkR%ab19OywE$zPD{$QnCjH6{4tkoSz^e3U}7IPKm(8LDXgmI{=JV< zX;bYlX`eE}k_p&5H@CfR^4>IqIu`(hJkKB0PYFDmw1CMzZ32Qc!0u`1!*LyCzkc#% zR<EB8`k1=!4+_l++>ulf4#U=H7<4p<cN|wY8x32{H(wm~P5wBN=}N4g0ZT7?$HUcf z`6SB8&MH#iC*AyDrb^_6yOyVoN0|JnrsiHh7FE6;pQzxqbuF=ajE8h`1a6Jp-iYYX zv$Ve16IcCt_q;PFDbW~W()G$7?@(mhlBd^xt$S@C)~Uau_l6p`)~mzTmFYbTXWstN zv5F|B^3Ng=$8$m2oapz<(-~HHdO_w;@P_m{e+{~L{^6AmDbO`XKg7{;0mgpTvv85Z zivKmUymDl0;4_?^hcPySEqNFI_sPWMv)7x9sHrI=U9^bIH@I7xeq<aTpn7~m^V4A= zP}+aYP4ftj^0x{~U{O4kS-)xMEL9tjoKge?1%EQ~={8j#D`_euGnK}ariS))8tLn* zKj()1WUfZuMmzR%c_!Sp;^>~&A_V<*e8jBZ|Dery9QR=XZ+T(C0{S8v!*lbn248Sv z0_*leZ?_K_x&_g%1qJ`{_Pqc6Z3CAk^F)Kfzz!tQ?{EJU&j`GD(P^jm3Y-|0cwRp+ zx4ox*{PSfAt~vWx_Z+dz&toE*BikJKG8j_bmKg9z_+U4*{I&CG`^@=+q%O_6vh|<G zaS<sG3Wz61R`t@RN7fqC(&{X|!%sKGcq5YX@y}$&OR2VA=q@zPUPC=n)@ETk^dO7W za5)gcL4yesd@&k0(4_U&BJZ^PBqEZ9>p>#+hahS9=Ggq<F<d6F`8YNdwE=Sw$K=>H zrP1r~#RUcYR1pMePSd|6G%5iQsPd>FfrG)6MVB*D(tbpoGPqNvH>VhPKfI4pE~lj# z<M$0K$fYUUx-l@|&F8Kq4br&wHG>V_pg!asRrpN8sm-Rur<4yDI?03uu1SiK^%6T# z@%A2(@Q@@rD!8AgeNYk~v7(2&E|Fyr2}uD!C8Iv`>9XJ#R@)F3Rom6>l$(t~gS999 zw`W<jVYrdc6m&0WYw$vF=m2eSYghR_hn$(bwr6fVZ4>f?N8)HTKLY$hwbAEO_Fwmi z8;14N{umE9JI}n|Y=3QG{ut6g?B=V0<=n#-bhr8-Fbjso#qxXC>)RW`KUbFqe(Q|9 z39nJFkHhwO!HKvwEq_GAWAYB2z53J`b1?@?k}VDg2o}Y!k?C5jSSp+hkIm-qpV~+( zrYD;gMv7{%M3Q(RpHxZNP<^1Li}1dg%P$Wu!kllU{v>|r7Rc-m0Wy>#%0?3^6k_)O z$fH%i-YiQifK-P)^KzdZt(0L0eFQ&U3meGUaQ@GKXc9fF{df4V#MSQ`T2L^vM&;68 z*?wa`f$L8ZtdqfKEmxo>AXw68Q{ZOM@0u0uZ(hzw1WTSJlQd8z_S1m&ZbeIb7S6;_ zooiG%aQI^m)t{2xYA~DmC&fIgt8G8X7V%el?a0FV>|^?d4^AkI|0{7a3+x~OxjwMV z5vSUcda-0_c_9*=y8FTXz}J8O4o@+LY1WFTVwWsWcK$~aOoD%!^k;*=(t&+PwoUjX zI=POW70C`5+f?42GXCGZ6xvKS5C`S?b2I|}`24wZh3ItCQ6_<{VAl>qG1Qt?w+#NN zv*|ttz}Fx>A#Lb}$c2~X(}qvdMk|#!Zul<@8n~@Xjj|B)Uk7ZTpYX&i>`HR$LE>*U zJoj))L<^3a>#1d*-#MCB)wNY%XanWsGS^+113#~3MuC~~ohF~Hy{bQ5LA<^h0Nryk zCVCwE>4%eIijVn|2Kx4fLcgj!Hr1acKLA}XKPq#nB0#>go2^7eiUD{IHimuw=Nq9R zQNjYhNxZZ;2Fnpk&5l=wifbkhdq}6=;tFeacaSe;I8?t-{0a%O*eiN;BfUr0UXZC- z?rG~2q1dl*oh?<Gfa1;a9^KK<$+L@Fu;gwS9d(2=PM&zU4}?j$dIScNI1m2VQ52x< z@??vmK0R!G=mHlhn2wj$6B;mkviElGL{R#d7CF>Ob{*^EHNXg=^1=e*ev6bET0p=y zN@z|G<ORT?9q2N)=Kkpuun?&Qn?a+R&_Qra4X=`sem5GGx<O)r(lO8Bp7$p`?3~6@ z=W1HraW*a=7q(Gqau@-<Hq>@O5%;F&rU0XZ%ckbK890}K;vTHY$7*H2&KN1GZo2i> zx9KD=uYQ@o$U@2}>gqHwt>1ykl^qqP7VY^ViENHgYoY~EZi)4EIU8;&tKY8GOU}iw zhh6vLB(ICxG#g&d7n`4E@Z&|u<H<hzM~UWr7|mZOTIGNfywt|-fa#hDy?1Myd3XSt zF%#jRM^DCEjDiHscV!hDB!C0yfd>I}Iobq|<@m2T!Kw7!yb0`$=QAE+N@hVpT`D)< z8;Lv5+>4`fwsmh&!k!wNZ}|DaWP&aJj)arX8~PHRmn_~hmrsr1MNT}AiG`ix@9Ll) z64Z~K><kQcloS!+X}lA&ZCX{*a<{+OO_@zreJ9~!%Y^c76A7$;aeDWxc)#{nhCmRn zT?HnuU5$ZuDJ~h9EwIB@UytGSWK2%(HP}4By_PcD%fK4;5B2?q4I5fCtdk1aO{$~; znOETK_q?x}n5hjPB+!`?A7JWjJLG&<?^X3>tw*l|AZ$A<&VB4-SC+XqW!=m<-@GRZ zbsgDc2rb6$@hwSSOGY4U_h1sQ)<p$OQXw-{edj)z4ELJ^*KViIJ$^sb6^C^g?l79t zY+xr@ghy!JA=L1sv^^d2d^73cDG%Kb^ti<l3E`mSA+R|l+Kd)zq2W<s!qos#g_PJU zCE(1hy8rIM5I=aZ^0PMgLL@-#g~fjsdk2N=%pS1jYw+g;@9R^xRb&1ypP$~Ydt1=T zYTVDIBa`5RJ$zH85)@2#^mz7kw2t9)E*|QN!?oJ@HZ=qp$k!9bl~L%J6u<D(;&z^{ zjeoIteP%msz$&`nou<p#RLS&_k6n8}6P{-B97g87)yU8S$@iPYZ$zIO$ji$K2_5x? z(o0f;L#L`ZX<x<LeNu_7%OH22&&y(kK+*4z>H*q@K%*R9Ltc#LSwHR|K*bf<mM50| zi*7=LGTMaYG*m%kEnt7<cqfv<=HPuV&fO1ksFYa&c?1hVXJ1GPG_^kPdtDbMs%2nS zjrg)J$}E5q<#))jK2#|^kP{y8navk9T|IdlhFE>kKE8Rx&SM;w?l(_v-&F`?*loe; z&UvgDJUpL`SsjI~h#P@$n4$H~uJzOHYN`3%ylbaVP@~BfXg?)D9JCk&;Q@X{WNBGl zD5K5wDI(t7IQzXO{0cqjSW~T*fK2e7U}Jt(@E2u13;YG(iqRC;fwDcB_Blrmn;;<0 z_X$vFuET8A72~kk-KeSK4&OSYV=#yN)|?9Higdrf-ncHg?N=X6>6YTZklZ#fm}p!{ zqtQlSYwG)7=1F@aB^(Ab5ip{Dn#5w>Q`j3J{+2J&ieGa}GiCU@IWz=;DZO3$W+HhE zKg&NQ#nt0Dt>-?R4vyUzOa*IBDujRv7MW*#)znk@{|&Nu`Tt=A67)1o5xSS;?d?q+ zb)CQ48$0`cw>CHSwhy$lc7V@|d+mq?diL&RC$SczMZB4ZTEJOKJ&4L}m;F~47Ck7_ zM)yqS$eUjDU(OgXRPG$ggDn#0`AV`e%jaUUC7BcmeZ#W;eIsGJMdG~H6uq70o7=Y0 zKiJnGKc=?lxzI*!Zo^}g?&tz&Yl@f7k8N_KicbWTopm!Ao3=2*ejyfovto>Pu6Jpj zYy-FL;d!c3qw0@l9<BHpA|#{-)>m9ek$x28WTX%`LG1Rn(r|nzGcX^}LId9B5+VnV zAffr==_kEIv|G=hMQRD)0<ln$lfTVU6OMJSyW!vR+(znRtMV2$pM~f){iyqfAc!tY zMI>27ypL4bflrpjx*{s@&L>+_gPcVfj>?rEFt*eav8JqpJu|sZzI)dkyWVl3H&^$m zJx;Vt4zp36buil}I`D0Kr0*bi*d}Z+w^=%th-bq<C(!Pl;Ah${ht<5wsg{x}RdF*b zzhLT<O9_rgVy|heS~!6G@19%)haWMZqRi@`!R-?>dk^G_WfV6KlqTw_!;RMfsSq03 z!~cvd+1Y}EAQ{VJ?_`F)53vC9VA$OBa9F3I9uqs3_8Pu*d$$w`Ceh5{OJcxny>Cv# z=0k63Lb}L~f+7+-*WZPNR->8A$n1<M+5f4$nOJ!Bbf8xHrO9a!LR-BaF5-Wa9!+(x zrnjDi$F45ar1un;v5YXva${ft$GmKQ&wq(Ax_b5Pe54-f`OBXdxO@=cBdL-bL!9HL zEDahC#XI1_*$3H}2jHA{&=QT+lkNeiu?xzlrI!8WG4Xl+*p2Cd5aM04<&&C%Up03z z`ac@}U;y-tMPIqzMlXCDm0pjwiBlhl!3*LeqJMh<j`yOKnvKD8vC+b)WG&@l=7KDM z)2<$%8pGV17rIxY-sB_+UiO9EFWfxXcWS8*+WJ9EqK?S@W23v6Uf^_KTz+s=S}NWg zK`(pWxHzTl+Hm5r!3-bq%AmzEw3Z-j#yLIAiNHuQOeEB^@g`xALZ7}~kTX!KLy{-a zhREB1{tAQERM?{vs?cu9#R>NpA)(;G1?;JDHe2mgE=F+=XNY4gewBL|^l=O|`|fuU z4G?<SpL8Jp5g6drt5yyfUm9$%&!$V_dfWd}Uv+&BL{EfHkA(<#BBDZ-C>ejJS55tT zoZw3-I&?m#H9rO~*@UUO_|b&cpQi=OW31{7+G}3_SU7d6S;`~QMI^$6zx)P-!MwPc zyoYyQ9x8lw)EXWG6}q#k7hFJ5`4}Nd-UT5@XgvL?M&FWEQFXVV2=QNB{EO-;xByr> zRi~%3gT-t_JZF-sCyxe-eWJ+Bi=3cKMu71RJm{1V$aebaxgs2xTFH}isG+U{budFn z4ec4VQSUyPjIXdOFVL4ZaPZG?$Y{*+%-uv@4@5KQMhTRJ&%MUR4s!6nAoO4C!Tuv7 z|Gd$+tT3QY#+F4IMxkMkNC+70?DR$YnjuPB((gwOrqcv{GRE4|k;NczG?I~hgvQcT zPTjH4>=Ldd7;uotac~UaW>{d32uXlRW_4h;nNr9&I9KEa>PWeH)|#=*hWI1X0`g9f zs}M!Cz$uu{#9cM30SJh1A2P1M!qV%UV}{($Pp_mKmy-JRu7_ka13cC}=BsbQzdU)Y z-oK<u#kAs`<$G?%XD)Q^A7~s4Z+ye0yhAQ@Z9O22<0)#A!!xIqCUF@{beE^E5$v$v z7IQLCp2V=55->sV1lN^X0q58Ea4<S&F`!a+1;BNn%e+#6?hnC3aQ~W9NSEnBNLG)4 z#Af`zbI7gYLB%tWWtAd+Ani~7B}JUGqCcM#uqMb$3KNTWmEPHoDO!~oQy)X*)rUdr zi&WXLbE@Ufz=6<vYgRpjnUmVCHFI#!-*t-0SAt>dzovf*emh>vNy`f!nN*c+P1Bv= zT|1lptghT?ORTSlhq}9WQ!sMW#D6X6K5+FyO%yt5xjWy?^joXR@A4ZKKnsnP5q5^& zD8lC=prE!Czyk+6k+bNKqvH)?hyOl=)qyUS^AmTuvnPe<YzC$>-ZE`>bS>TpIy+^e z8XESa3KCA{mL~(J74GRNbKH^ScLedy^}2u?EZ!fd$jdAi0x8!I)iE2*{bEMhvAZ9p ze?8#Esl1*P+3fz#B4#M6<rME$M%3;(n=I95a;2>;Fc+3OP@UZP>)@o^mD$GNi{WUN z27?!5@fO>>)FS|+AvI}Qo4h}Sd*sQ`i-ZhJ3<-;=n(S^R2xxMOJo5oCKj}Rw8Zm9l zD-elOFS7#}Rw}+TjrjkiGm7PLYzW21h1A)=y-<<>n??nd^z(zjW<dsn25~WU*^j=o z<a-(;6|JUPf^+e!xf@p2JCy5*CRZbxX-6CaCPa$#(&sxoIp=4#y(_P_=KQK?$$5^g zqhEWo)#a7;rBuVRm<Ab!M@(i0Wkvg9{UV>@U-duhXCWTkS!n)r@rJT`vM^QHzw$YS zb2j!Qq4Z=gQGTVD;uo%m8V@Fvtxxb(@WA6#m8F0@Nb3i0$bRQ@bU+6GDJAHK`0)}~ z`usnOkfYV89w<D>NWLaU-w3gpDLCgs5#@erP6E2-q*;9TVpD09vdA?cfanc!Q0s>2 zaVV@@eE5zgePlBif1s?`q)R<ZJhB)C-044<ob8OS%fuG`1W$W<CDfeP{b?>N=KbaN zO0M5>cQ?V)G+8g<smnR{4axJ$0<-<b!1KdWhtnZg3zb>D_;1_1scPB<$m5cpaoL=g z5UPD|qB1ZCQe>712OCWKBft2Hxu2nAP78{O@o>BE$OJv(&taeZpQKxi#vatG0qLEd zXj3C#XEk1lthu5?k)6ymbv&aEe{XMMJ--V9F0X5)W26UytMcl9uu5@BnILTz9;)Bb zci_JEn<?`yWOV%;4TEtvy0UVeG-NYfzS*=Tp^ocn^jgd-fsVSK`U`0AJ=7jbee(~Y zN&h3hU?kD;<;D5);fg6U<LIbu6t8*ipYO6sS5Ujv-qu#2UdCR|CnX3Q)I&4H?*L~! z_95ZAC1}^cUGku(#wg~|w@Z2ce>)=uvlc=t7NcSveR8lhS}!d>kqI8mgEy7~Ewzsw zTm#-MGLmW=0U_2d9Ji+fHK)jhy=`0W2IlV#Q<8x+#=OfdL=E2lvqeVhR#tn_VS7@9 zU}TA>mhx4jOuVGGYiMPuiS8#0fFg(gV=tBY0MlR^O(g8$%Cw~Mx3Bn-YJ`6hGj@)A z`)C#@YSd)qhAE#1$K{mkJ*S+C95n;Th{203=t>X=gqY+*N<gN__~#iM`l5jPfdDNU z6)(VSamdXk$wZH)->EH~|FWM;e5QMzf(evNc^CD5p1iFWL!{vViITmDKK}YB$+7OA zwh!apJzB7yx!AaF2zzhoi(14r-Qucg?RH63BTCgD87s#*KT>x&yzTxr+<B6K{m4!7 z=%E`FN_v~Jb}4IgFm?`m|Fj6^r#`h8NGDNmM3?trj-ZgC9keP0m3|H$-+zM1bDPUS z^7AnU`dSD&6M!r-kB5`6l%gTOP`NBzpqFY)F8}YmED=Fkz{ahln2jA|xg;8X<UYsn z%4*ku1gUd2G}^Oj)@jFQCSjx{*nK{YB`bh$YV^mYAvtHRHg-?689Mna${sX1`Y?H& zy)b%5#+8spvoV#TKq`~vHdZUC8}HePWgvT7T`v8B*uAY(5^+r(q^o`Gw?622O?$UR zz$KT;fx-VlZj|lL!u5Ajq4z_Sm+l*zBPvH&SkChIi39W;Bzy}o&YbPBBha6{#N7ap zZnYREBtc;RmD-(ck^mf5(MpwM;6H!5b308hh1vSm`*;JBsdsdG$!?RYQF|d_8Upyl z1oW;QV6)`iV^qOqo($yNGi~y@yb(7-{n!hij7UrCPPyD&!%%CU(<=OOBr}^TdA_&d z*O=Yt*`Mh%vFE*LzI}gWEpvW$u;-S)nMX)c@0D3RW8LexkroD~`0!0buF%xe06Lqw z6-Qh>cBUB&;`|`aoG1!UIi)L(3=<8Ezt=M!*8b4H8-ZUx<=0sP##xRB?*D@O=--BX zL`!eZP7;j3FJz0B-dirO1NeD2i+K_9p>eM$T^T0k%3pUe=v<g>z2B_%IkeU?sC|Vq zFC7)*>-{isOSpATvJaNBSGfSY*+fdK3Mdm*um`>zoV}gbfJ%Hzm3E^LAj08UNJ0IW zgqlSK`Bo(pPiY|ZPO0CoUof)QRQXs{orp64<{R)tvc(BYXv-FlAal;@4;gv=iU|`; zFeF)pO%%W#N>ai-ku!LX#%ko*bb!SKFnMgxTJnEMU54w~G;!$sg4#E?;N1Y^tJoLM z`mW|A88ObtoIV$)*6hG7l(++AbR(;qj|S_@HbVyb@`P1XZpEaC)l9LA`rnMN1qwz4 zL?y`2pV<2CoV@T{kbL)QKy4+gE$k|l-ZOena#MY9$ClN&Uf7q!NxEU};Z(=!JgjX( z>YHuQ5p>45rE_P3ShxOmaH_KCQ3%PY7~V@Zi0bW=pC%Du-Y$wq=IEVqH-417W$(c# zZYISHx_QG|M&K{Hh9)r&CU5-}<fPvLieB~qd8uoF7DG~}&-4;?S!-6X0~y*~Z9chD zGfpUHwXAo5#lec|W>H<}^Dp7pB6Q1lul*V{lYV`Suvm{(a6w4i*_#m0EC|j$Dn@QE zo?%aot{qS5VX@|Y@5_bM)m7)dyk>lAtx=|xx}f)}wa^=|6G4=;4T%g5T>MPGG-o6* z{}BDzk)Y<QVm56CkdcA=3>5y6fd>=pj0&<?_9hfpw-F5&#66SK0i-HJDO%G@{}vmx zZE}KoAc<051zr{+Ud&DgHLAsd^ZZ+4Ww3piDq<v*9^?M|>%Cwj2CN#hl6NP5)&Uj9 zflbFTX}v@mcn$L%xqL@uq)x8fa|*PYuf|tz=v`wfFZV{1eNKjw*DkhFQy^v3_9F6L z_;33rT5mOG27RygM&8_}EZCmXd(DS6VxPM^yhF%>!*QUg@|2nK`&x{1m}Fay%W4oA zu<@CF5`P!6ct9^GfA&tIoCcJ!M5smx0F33}lCb<67UKi~J}oIzyhOKef3)0O5rVGz z8kcO~>t%a1Y*%49=gIgakoXRXb(}1BA@9%wc&Pe9e8`TG^}0KDR@AbAoCb0>Hvh%V zwcmGdi&Jc;pKmWwTEG8aQCAt(<o|x3ks>3cloAmX0qO1%0ZD<0Nav82ZYCfoC@E4B zf;1w6bWJAGp~UFXqq|4^ANc;R>%TX9vlqMe*?m9v=bZbTW7~D)y-p!X&1K18!-c&$ zz-)%wrDGP}zM*G_vkD#^6SlEby)`{iUs`q^!i*Ydm4egBmd5hP&w_G$|1h5$BrSL` zfumz0@`V4x3`+kWGq}9t+%RJLM%&u*tK)Y|OG_uJrR`VC?{3tumX;1vScB!32oX|g zRZx-LjRXxQ*k~zU3_$|&28ESw2luXBnag|x8L?qSP<#e#FAS_%z9+T5v3p7YMw*H) zS|Z<Y2P_$wB|r(>e28Z^a_P&fR2M%t3FErdb(wOS>qqCK8T1Okg`{L{4bPwq*$v}{ z<?sgEqKG>0Anq^u%mNh_;;p;3B6}M%y~`fig)BX>ztiQvjq;1XM^O%aop^*aU!<q< zgF~8)9$O$MgBG{Oe#-JbF=w^scGB4138BApd2;l)>x5g$g|EUJ3Q%Zp4Z2rf^&{bQ zE@<+TXM9D()Dv{uLdQfEVIXd>Ha9x?g7kEZxSJ0sh*d~uit_fUq4^8t|7O_BsBE|i z^>~$9$feml=3-WxW49<Rr|pfWf99iF*RO%4)sw(6L)~NcdrniN13lO0iSQd+JQT=~ z>zzz`i3>~VBZkfOBh60>inu189PDx90!v3F$Guhw4OuW#oCYq`#j|W<C?I@7SMTXz ze$4p4*Gy{!mxk{GpWfp6tQmqUAmFGDBA%)T36N=+Vj^YXE$Py$L<EK`LwEsK4|u$? z#!T=bxZP;{J((W)?i=mC59TFnE1Tl*0Ta(nv!RAQ9J>^K(XDWj#|PEV&S#^!JuTNo zSU5|K=d{Nt2I{d=Sf0di>4>ijH8L4S&E2vQmQinGdfz2G%^opwZRQ`w-?5u=iQli- zG=pA%vCe;LEJm=kqCylX;e9I;lg0G<Mb2s3N9{SXz)qW>mO0TK$YuF|)bRq6OgO_+ z{X_%GBaNQi%Lay1irzGgIR5=lUP88XOX<p#V7MMVWlT(Mrt9|0yXUy|8W4SVrQs?1 zBzMb{SRlnZekdCAHKBBdq3(-t;JaL2?7{~uqpEqYlH$|R{Z~`>J7v#gI;ZOMANNe* ziZXavCVhQuT%zMt-4~8edEE?x9PB4X%>$85qo!898pGNb7)Ze~UR}o&b>X2$rWo<{ zMkqhYyW@@T(Th3|t)J^{y!XoNs9<iwEu*BDxF_Oc0c6_hlRfJo$XKw`N?B3m;cc-B z=iPDO5We~^835fL%;N=b3PEGrY3~g&2WM%Y^E_^V^bt(hAYC%&kYSumerS2s*GoZh z*I1b@l?NVkhIElQ#qvlIi%Q6s>pR_U9e;9@CEmORem5eSRUB(UJ})Y<E28=D6=J|d z{ctcH-O%sijgNf%q_RE$X3-F3<Wlv3R(ZkLO&h|EgepY}&#l)AtpwT|ztgRL^BNDC zC)N0qog`OkhZune(vqqf;)o=Dp11$dU?zpvANI?cYw+47DG4s(NFhN|HSF@zWM;~u zB}ZTB)Gm{|f5>e`0Yom^X$Q6vS&F;f&w^BSO$5*1K=hUxCzN`r&^rw}Ou!a-K`WaH zHJFWefV20Mi#O#<iGia%qx4aN&BxtAvZu4{qSQ%YT0>&_hmsM&SYvNmB@uZTI*qUt zf?&8K0US<F-ln_5r%DbC2JKs6yU+1-Y$2+5vPxSMnTGz{4XqXCH6a9=VA5m>{WOTK z5~{m#V31aPB<;Ikam2l!3>NEG>mMC)0E35**$_YYMEAoLzm&nN&GKop1*LP``7iV7 zG*6aD?a5*%45p|n)<!jL1q)y-k#?hVTR*y+F0>=Ag8`B5AD)JalpM}r3IZa$WzX-% zNimide_>hd$XK83;m5eYPwBoUT7llMD2Q5?_$jN6zt)2p&W&i3TQ%tFyLJ)-pNfwA zV9{GOvm`?Vr3#_fix(LTxejpQ^R<V}UU4vGr^@)Qmva3a2M~Ow_$4cjh|%YIQ=m6m z{$D*1JgoK<9=z0B)lnRhs1PF7&U(eV=zy#qmGn^Q>?q%e(9lrIfmL6jnm%|NLtZG+ z&`Nd2LgTm1uDwP*w#CI;Z*C6l(7mBP9&HejOFKy7p|UnJ^=>s%tT%Hj4@a5Bj-v8^ zf9F6iu$9AohyXW+(m{EA;iHqn)!;K!8l$*vdYk(%!+=J>R0rSuz=ThDcENgqb3|V( zM2Y{hC$WB9f|#fOFd^;f8xfJtkK_n(Ap=(1VTz`X!)x@H=g<rV7)q?7?JnJEeVUrd zolEfwvh$OGSaI`j4->i^hBBwP-9jwsPooCdg<S<So)IzMuZr_-u3nGcU}won&dXRI zxu;75@>+cAc<k0xDq-k}0~ubU^AGKEX;y+;liJ#;of&ISX3eS$)kZ2S{nkFx=SC!G zZucK2(85GxOV_&V>n+g8KWd-(g!hQNo}O$yru8vV;cho8cn%QQe39cpK)^dVz5f7^ z_2TV_5Xh?<K<=?#5iz|>|I=2-+OTzLOoCCKi0!!~5K%)UI5oxhkM!f7`F-BE{Z^87 z{cR^*<U1o3fRZF>r>`%_oDv`D&hFl4l(IN?6JDD4ekKRUv~A#f{$WkUrn;|KS{_YC ze2;JZ)$#ruoNjWewCMr)DSgGS7^ldA_qm&HTT?f;3zIHNmt!iALK_e$8nTK7ygYvV ziweK3q~aie01pU!f6Id)5@1zp%U98$Z_;;suKI+0+G@j|)nsB%<`T?t*xtr-1qJZQ zCqkEilqCKqD<>EX91TZ;HVmjTOc&|;+p(54oItLlJM`ITj*x@*=^!Pr#S+o5@}tI; z!xj$uwdw_IMC@Ryo;H$dw48F>q|qDvA~xyC3Kz$B*{B+Ebvv<ra8%*u9;d#npTH4u zDm}XEZh~h&2%Fc!PYKMde!mrt(njsk7;jHBVprSpj$ar_sqQm88b%_%YB1eO(uJ8R z>#`EahhAC_aN-7lhZTd+9_@dkU`aFo_$~?<JV|Vk>}<Lslp+p+53hNvpIx~MMhu*> zA@Wz=9L(XFzgr~|yC=|Koi8V8w5b8XUDUn=MZCT)3YHA1tt|s+_xQH`#pvzQ^T_7K zW1jqYJv5Dg$*lh>eJT%!k|_mCW?*n~$>Kfl3N?OQY(usjs_)#kI_-G)OS?L|;m4x~ zJ|zR=2K56hBNk)zKTzefr0}=6Lj9(!adm~Wh(jtqxQ<RU$C)bB&-*%vfe7FjL3q4~ zCihZ(xJ`Ma0z6N(XXO)({Mxs5LIl_WtI1?~mvMit2D1re4{yibcOIdFAfVR`7mAj3 z$0??mfvt#v{P0x$pzFV1SNM+{_#V5b9P`~3AJCgF@;zR1+wuyVq-HE1N~`5~8|4^} zTa}=pkkdYIjomn%S3+liQJyL?tJhKMj9xdkf|^X5kfc@9uC@M>iD~nxDJ5+d&SX}` z6+)grF2o>AG7R$PJ92n~Y9aEf#R-s0h6Q@rT1^Y-E)B)LT86G+!Gxb8%CG-{YTxmJ z=h1O*#GaUdaR(>IzU=V!`F}R3?#pO4Z5!KPyWEcGmr69`vW*;~lUf&(f)0P6X$|}~ z$2ntChi!cxIjF%xJc*;X1@k$tacr23`tKLOLI)KX_9?qGLSTytxp4dRjT@6PAe4FA zHgZ-SwTZ)=k*jU~qIfJXC^N2FO2l#g{7C8$$WEw9CaQVha}%<q%}DvF@9i{G0BD{7 z5Q4j=4-%~Lk#pS)3Sg{oUL?1b88t9WQ}kw$W9X{08Y2WG8H#>h`aZN3pN-iPBgK=b zE69K>rX2}}{Z!wBl6Ng+&`;GEvA|}056^OchPSn+)5q=SbE{2!CYzx5VMzE&sRQpT z(PngjXzq&lI6Sf=H5!dj`qS=+BOmY(^dC8tIrh`|Tloy7<8ePwj9+;`$IxRK-`c9X zZ}X_F=Y5Pc*2N;K=A1g8ho>yA@a;IIbQ2d4dRxz&^do``^b|2>Pqd~%eitkvr0==h z_Q=nVFTwZe`B(ZzXU-?*YV2mZUB<MUn(`Qg$@x_-M7CeP<{0?9Ccw!Iw0AC~PNy=m z1lVDgZ$)dte(&t<(q7y$I<>T65@ael4Vq|N?;xTo7#d7rduh@gRqfRiTN~(|=kN7u zy-1YiN6BiHtW|slnCv%B2^+>@)?*oQ%+&oqe9s;?w)II41<6noG|>=_>PVOo$50TB zOy9;u!{b>5Ap~@GZL@eIt)xT~DIZ%|N$*hOU%CtkBxFOTcYkuR#-s&;R;M|ZkR1*V z#Qw)ri}6N}`KyrLCVQY?*pit|@p75V^(NoqyF;KMX}lV^V<b^}jSE{!K0vEV`MGE- zcw*`&#Rwqz{7(a_O(o3<LQ)pBvf*bg=W+I9bMvbWUVN?)1YzE+bV%n?{dGjcfY<d1 zQg`4F`$JnR=JC(4i^+XPn(06&hQs0J{LsV0B+Cu>Bo%r*DPVh@wUC8pK?V9^rdA0V z03mNt#EalOh@rW>ec$pQfJi?nq~BQs6P7r+dI?T%5%y!o`pTN>%I2?Tj_*={5gVi7 zGcp)>r#gzo?YK$*iqK$h0Dx$AK;ky;qF3jv+DeEl?r!r6a~^(E%DTIxdx*rJw&t$y zALd*U_tT1sk|TdT-3^qS^d))i`II>H-N~n^6|9EksaJ5t^ZJXrm+ts_G|0sxng@rQ z`|#G};J(pU$<uY`D}mzWkc_X4b#3P@jz@jaud2E~b*sAGuxDvphp3Y0fEyDJLAfIk z@bej4H|J&AU<UbxJH%YXK5VOEvG3By*oU&L`;%1xA*jJXZ0(}kXG%XZ-RXS)Y55vJ zWBE4ZUrx+O8!wFxVOX#yLyg149^*Z0Z+ODV;isF?(vY)M`iJ4qn{v?A&<Kx?Pejfp zIFr8t<JH*NO`8NqL3e|Y>6A`(`s63JkJlb0KocCvC*60@#wQ;tc!F-7pA!WKrEv!> zp5~O#)Euy=mMMplEjNrQCKact8ojWHW4yC`*_S3n5@@KA42p01PqhLsr99nXk6eJ# z8w~1pRi?DuaaU>{+N>^tA_nmK?dn|2SSlF%<(7TiUn+o7?}_pdRt45AZTl{)XRdE& zonespQ?a|7Z7Mmv>oZx>6vC2yDOsN>n|85<V^<1m56yH5=fVQtDUNET0OpQyc3l74 zKSsITji1yTo1dDza_3EU=w{c<6bKMIhz?Cr_d-`1_muV2dOdtD?Es+!$^ccx9S8hb zJR|}-07wG_R|6CDjDc{A%0A*+PCH1I=FUFM`dxy5#FTG4Vk?E-I=K#%MMppUc`51M zke0&-vJ*x8RQ#)={kuu!_L>Tl@ENtD;;b~35!4znvg+|EAr_1I_K~mOc{sDUu2)wx ztIA7pCocOhwzXjboecu-iVn$2WrlI579XECB`w_zd%KRfc}FO9Ijpm=Scq8<`M1eh zhF|@>xv@~_EQQ^jJmA~6%_!!;;A!#F;CnA>o{xyOD7ss05ts1v-Ox*7{R_m;z8x-C zy8;mi{%rj}h(Ha#W4zz&+-U7+X>IOkX>Q7BtZGI!G{k|&_T=F^qAb$F$~TMNMepp7 z9@3^+Q0<aTr}pL1|7-ytiJ%y~jS#6QT27z$6ND6zO$}laAKT!W+$;$YbE|S=g&Syw z15D#MB`~??{rEOo4jr7neOOC&3Vqq6k|O65rRj}-tGv==R*(gwe)ezPg6*1I58wLA zH=I8WIc{DcL&E#MwNO9m;j(O?dv63r%0FRdnD&j??>~Y)gh1~aK}H4u&tLO89XdF# zPi0`sFh>weU!xM(K9LarnqSe850<|)^phPUqHnk;EN|Emewmk}CZu*u;5wPFJ7OF4 zUm_tDe|g-{rEeH8CwsCf!WowJ*f0ALDC|)A%Z^p2yIt4YF6-}{-1gLSbAF9_h=xr; zNM_19sE$J0okFUzYS@5b`3zgGz3+J;g$W?2PwdF=NqHo(({|9gpm)+6ru0|aEHHPq z1XDBe(@iLiJE4^Bj+axQRP{t(i~cHlZ(IIjBk6OLbLej^<}>Z;%_hi<nf^}}Rvl$- zg)qg$&^-m8OZM3Bx7e_!!xNEjg(7EtTismFB8iT8$nQBOq`nhNy40W?i-^Ah8+?3b zgMVwZ?iq}W1bD!?Gp1U^YGTl(%qrBGW2;X93GZ5by<?On%epOGwr$&Hmu=g&ZQHih z<u2RqvTeJn%l>MuyY}ASJ!7By{>gX7n9nn3jEsm8BQi5$=KS&x;^Hc{IWe%I27@j9 z(bZK?K$>S5)M;I~gBM*B{;8L}ukI;?eYp0i?vrX^d(I5J73puu(jMC9Gi+0pM!);3 zFx#&z;8RGXFbZ~ui`C0&-E<)E%+G0(zJt|bR2`>yJY6?78_tyL1cJdSM5evrRM_tg zv)~PNk^+!33V(T3HtmA7*LGjEF%YaN^4=sv$mm)aWbyz^`dU%jSEAw6ulexe7(}!P zPcWI?ApUmu%LAt+{Vk(xg&0P^sUFdn!EdAX#)Y9i8Qu(U?<l&;&Sm+E#SMg^I$Fu* zwt*LNC)>pv(nGZzB*nVF#Qvy(838g%f;1^g35M~fzd9a!ygmsGr<}>`lpfVlR6~7h zy71@@xoUq%9ACM?K*>zJfqJ2~OD1JpWm?rGw%AW#F)vIBRAw40IR&s(WV!)7Mb?sh zrn_@>7aLu6P^*Osj~se3fE6%3P2WK$Y|%bnOqb;?1Fuz^`-}d%#joV%$%P9j@}mun zlwQsM^TOUE=z^zfqqU$n800D`TkbVo36IO%ZL>w(#!nRbts-XdblqKae*tNqt7T?4 zx+zh^vt&)|v7d7GmE>9!vwSs87O)-PjQ4HbD40}yj=IX3W}TVMhE}d<odT-*X<Qga z!e0}I>tYMI%w+iHt^rlCb9!f)y_B~kU(^?$g6O$2&4W_hu+=C5>e&aH<dSm*{U@|o zP>|s=N$=Ov?DvE6-)2GVokw2W#qev5{Dj+t`5fetoVd)x+80SsKCzLVp+``5gYkGW zM>V&gSbV(0DvJ>j-03V%xo`cyw`_H-4`@Z#a+1qoh`@hyFoH81O7M6XXp{D^F`m-X zQ^dAEGdwmI*bHC5-*KK%OK!@YI9n2*sr5&JK7_BIvfohkdoA^Jb@THpqh1_)hC&Xm z7W049v;pZReFlqr)9kWT@=~hsb7(%PWXnoH4wB33L=57}KH*oGhIvn^Di#COr=mWb zjS1OZG`sVf{!Ad!x;lSye8jc4%bt^`eive!ai!JQj}*BIy1=LESL|w^M;;<^KpkA; zG07OIrKZpalg7VzWDHUv9zsWX*Xvn6K=gRQs<JU<i~Z;oEU9}{9m6gQnFXdep^j{N zB|<%Z{I!}4^^|+H%Q5h=*?^^&syA+;h~rkPM;`JCC<s^KF<c=alnV0!*^G>=(0kA) zA9aucyrMm8021ynJ;o+Gxs-=*tk4lWI{G2qO~#Fo52}SMBX~8{es?PBml;FyuzmZe zC?nHJ4sFrbFa%LbI?q>5f4)+6q>Ia{KP$SKA5If1G6C$f#vtCNp+HUA*O**eMXMm) z*vGkQ6m<@xTygitet3q$*OvNdq9hI})<Zl@x@Ns_)~QLZ)%^48LOzXTa20ql0nDc` zAl|8~gLeg!+jDxa>p)7pT9A8@9AKf@_ox(Pw9X}cvZoL$M{q79;bgFFXR-aaWayi) zI-v#g4kL7SoJqp!(|S_bPN3^jc$UhufxW1bjl;~{#&F3fbd#pvlj5>l7$j#Gwf8d; zzU~O*A61ZC&;h6zk+YCR!4La!H%etg^x);!VB<4XZ0WCp^U>A$upj8Acy$9E@pD~w z91XJ41WXKz8S3C;U(3eP*3($c;?viT45eu7BZXTQt=wL%Kh(68YGmsspjU|51Pw1O zae7hVeJo1d4Y-0Q!P5Ho;82`D2Oye;7UHj=)25yUODk->+pPJy;gQ<q`%)B+F&=my zX+)jod<m>tX0VO&<sqIuBBX!wo%4vGwzw%mN<E#tz0jbtb!6pgJc&cXj_yB+?+StE z&nva{t@Qc{&OLwh8;fmq(x3nv%YWiM-35p1L{6q3X;iRnchCH=Fdi)8DM@Pb`(r&$ zQ=g^+^^r~kG?>j<stK~B83kr6{78x0!2sO04nlt@U+Io%nh5yg6~EW&dm65%R&}Z@ zqhA6YwV?22e4e%><|=FGoon-3vwGdg`;}o$5H{o}lHJ71M1oEx)}cryt2I;Hba6P# zHO|GHake4FHS3D`XEUT>Pt{^os8}Ps%j1{L)#85H2D4kZVxWLL)~RAigm%lub8mdy zM=7dV=?T2xSxnCyHLBp?q%92i(Nk6@*%TZR!-yKJ894~Gl49KuhWlsPeJCx~gd;QQ zAut*bxrjAujPh$>f8G5U%7pAtJ3-x?-vqv%<<88n&Wg78+>`0%-31Ch{`HE_e&J7@ zGDyDd-d^~kn6|~TU90K16iQ=xGa$v;S!@O03@b>BFZXLDZTr4ZbiJbtMgrz27FL&e zeQ6EuU`Y#~fJT4eJ%YC-x7T)Dt7$W5P-m(3btcCmjMU(Ts~u^-lp3AiG@KDN#&68M zbhdZ7C4;oTYTqm;d4W?uQD$g;LxR{Ay&V>MYmSSv(5e-@7o{&12z33vh*NG?=D2$+ z9rps8LYA2QrOr<mdW*fBgytPf*B-#Zafoa9JbhMWZ7cdh@z|ooid#;5KOWgoV_eqZ zqNj1(<cWOngUWVrPOmBiKE=@bR-rRSu;S7N)O5|nU7cQwFTH8^s4i&Qu!n5=yEA53 z4_i`s)=pU0QSuZTl}?5`g&22$;m>|68{6|jU2DgJo={rAhKp#{27RSNrc@u1?tJ(= zOD%>?WI*{?G`p+e_M#KdA^BZ6hu92+huAi0b<@uSJ~RP5@<;7Mh<wJEqyzH1cE=Ok z{<>xy1gHq-zwDvtBc<CnJjh*_?C)psQUoJ{P3z{Z@36pXJY*xJ+kS)4-AZT<h8d+k z$NJi}(F(CE$LikePn5CNGgF9XfI5}=By;UVvi6cr91%FdpIVQK%eMEnlO?R`7PZ7{ zQ(~4bFS4lj<_!fsWYD8Pd~UnYXHQ5yGynXhY4(TcYdu?6{1k@gq7l*e-c3c!E0!<_ z-hJCQASBb5$r}V1c;<>i;RvFsGXx1EvmQF^DNk0?086GxK1e9#^koF_@`v>z$P?mN zki^MEOn6EP%s6BvK--7tS4_<SbkRUYk^d8TI=Z^_;Mr~`es!(@f2F{*9jwgctP4ms z<McM#1}P8J9v5Wzi3~!(<3&QDq1H<Y`A`J=aV&h_x!ICIfOp|+Q65pPnyyekze``6 zuh8i=v@C(VA_!`aqekW8X)6ZAUil1Km&M=%6Iru$mREe&*<NmB<PXs9m%=P}{-+wv zg4I#opUOvR_Z>{<osO|gRs)TFo*55Jk`su&*(*tH^~GJezhjw`m-Pt!s^<gqV>Ujn zH`_$e0zYlbi;BZU=CA-ASr2qDeG3ywDqUQZu#96v#a8Yh+fb&n!wkJNHRE3#V~cGd z_*sUuMEqZ~RaYt%8q1$51h(s_sE%9yK!c$&@2&q*`WhlmcL>G@_8d>A{s|SSz@|Wn z_eB-MH87vJCqXOSW&FJZO+Om9gPBs4*jm~A`tNzZT&dR|2SkT!+A&+|O`*y6=2Se` zk1Th?%p`Tqb!}<xC*^@pRQ#boVM+N-d~qX-C8Qca{S0J;gbfS`k8gb5k4;EoZ+Av^ zo~mpJ-aXW6n-~qqcD?}QrNAMaU}3p|sQ>|z*Z{vVFbE0&6a)mo|NIer7g#eg*wPD& zhzh7kE7Qx^**Tf$DXQoRI6E5{S<zX$804tP*zGYObP?a;mtGh|fXrSMpcmuSC%Y!R z)=5S_s<+)1tHZh)b2}?6esvpxBO$FcYe6Rr=3?^ocrfF|?P^j6A<z@lr<TaY7i*$4 zZ)10mQdZ4@<z@_*P>sbF)wN4k%Oj;9^q#m((qM^e7)Zt3{8Z6M_nj8w7?BpYejibd zX$dv5gP>ML5#+_P!*hU>9FTNKumLDp3?!mY=r?7FqtWRHW?s2Iq%!e9ewwp`GP{|( z28_8Jh*>)dt&XPwQ!8OgwE&dRKzT7`u(WQO@ovoV=xp8g*pRDy@Ur`L-C7ioBsT0A zHY3wxE3*a8s@I_HgOkAi#gg6PFU;vh)ztJQAb0tPlD}4~TsyfwF-0YwE+KjJPZvy9 z>IQ*|W)Wrb0ZFc=QwmkRPH{Q(T}LbfOodKP^57`+X|~4qQ6d!SGo~xEN&wodW(3h= zNfi9X!P3P0Sx4$IsMV4t=Q{>Yjvd0QD{Zrgj1EZ~B5rr52ZG|CM*9?aO97f0P-_8e zdLYiZm&;Xx#66n5eEsTbdi}~SRcvpgEhkSq*#RhRPWI##$K+1PhlVi&JEI93t+}KU z&YW2rJ9m6LLKyu3sS~}xh1R{<{K~V3iEEY=1{iRnHy<qN8|4(!VST&JVazo}7a&6N zgl_ar!QLA}WmJ@Jie;VJ!!1#IV)Jv=5yZXW3#zUARW8uh^+CQDRXUmFFgaC9YGlHz zlGV6D$`W8oBfGtfpQ>~l<vNquog?+wVuL<l&a^uPoJ&o<zlfF#;xn+|OdY(j<@76l zXM2^;=JZwGOLL9#^|JkrE!9GP2=lx3>wY6y*rsJ*SnzbuD6(CXS3+=xT$ux?QLx)t zaFF^4Ta#t_;N;fRo;1vZuE<bmd5GRQbO9;5hu#R?TxhD%{SCT5I<Wb0&UC8rJlA#Q zeH3js5Bs|SvU%u_4SkFs;9q@1Xc-}Y3J3t;6dd6H(Km4Zd*6_-bvCj7t6yBIuG{X3 zBlw8z;Y;d@FeNf3iQfgXz=KG$t@$@-o8l$Zt<PX}V7IMHq%VHHskYcKaI>XB5>HB2 zhU>4DRmkShwa9f`+JZFp!3v!r?+`|t3zwu>?<Pnfi8za-%UzfjZK~!ah+)D+kk1E) z*JxV6hm&-J#DNkZPk%x2n$6vn$fE~BNu)<Nv(8Wqy+z1}oDXOl0|dm92E?KziXyrr z`VgX76U89{)>>Lf)K7$Wd;l<-l#}!avPS%zW^Z56vCyfaY|gtYknW|e^2k*GCFven zNm(R*B1;c71PZo+uA?s1hPWw9F6^_U$SCK&5X-X|-BswALud1wn|L{gD=J_;j}C0g z?0C%QO5YpH$SSuu+eO}6>)g851cw#7eK2{{88|}~A`twb-hz$j$_sJOkhO?0K+gWH zZnZT|v3>>;jhHC7g$O!2HMtrA!83t?$_%n;ydsIn{A>aZ9@*`412;*np#)-~ze5Pi zAZQvA^82Y5**oa)$NYu`w;ow&ik@6{H#ggkojERLw%M7}hF}wgv{8h5QOfoS;eALt zlY~Sa%TPgb<W7L3qs)%O52xIGZP>TDsP-~Vq)~PBq3chhX^x%sq5BVO4zG!*W{&vG z7|={5Sm!-Z7SyAW>nlI9u|#O9mZQzxt|6lH?@vsrug6Vhpc&B#+)m7<g&Pn{X|O{T ztHxOn95^R%$bK~Udi1^2>kn5G;W-Jh@g{akD2t7Pm<_^tAbHKP3{R!)-3DRT`7NYs zy<1$&t(=vwFwm2|l>|SZZHV`Zuc{5}WfWio<`brm4Bsi07Ox4E-T)Arab5Coc+R89 zRbo6E2DLNSFlEw?0v#!tF}WP?2f#5J=0fb<`LB34&7Ev|XZSjpKt}?wmP?`#(3rE` z_goiGH{TcEV^#^iUWC>-D!#!$_iTckk)YgT2W0iGkk(N`kFI}~0i6skqrK{JeSu_9 zKTL2QC+noD`05#n28_psaYUgJaPGV~7akTJS5$a<C>gkWsM%|14eWNj{@z9pi$T4{ z)v*;;kL*og&ZU2~y*_n#Jc(tkj*MxEj^4ZWt03NG0IL-((&bf9sndt~xw6v-T~sJE zkJ|!cH8N0vpGTd74L4nh9{Qpsf%`peDgO%3v1B77;ke9s%y+6%!fpS}DU&T=kiB5C z%AO;x)GPxDxpkcB+5{)9gbPekNwv3(5C0^ZaV9aM972Ox8nhnfYvFfp*wG08@vu3U z;L$ljb6VY(gpaJ-N4;yWYn?)6@<p0Gmm<u&@cfFTW}$JN=-XP}ATuXtfxfeX=)GXN z7@_E@VOH^nE=i?e9J4mXGAbk>t&L{kR!k-ps`^3Qgh=)BS*I+QO~VY8X0__iHs4=k zOZkU091;isKtIy|YiyzZ?_-Ocy@{iNvxS|lyq&dyqmsFWiM8=xLrqimrsFzCCjYfk zid(NI9a(t-YkzHt@}ZzZcB2)y>#$?Ho0%omkhpVIgs*mD_8>E>TphYsgItSTJpiRf zvVAuR_u-YTniL7d9s+^AFwpkCSXkKEd#N@`<*j$=))e`WAZ*RZp>gq6blP~M1A}(7 zo$8q@XReR3-PANV`PpsJz1<II`I?2D(q|?mzPPgeMMd0-@pDIw3W*OF^@)WrMbx66 zO**wh@#-T>cby5|R7)3~iq*?|p*HzD>IVnLo}8G4OB&q9b~@Fwad#$#ajNsm7r~UF z8_nt~+uyD(TdySJ?vEC?O}telrgthSvy=7Jx+O;4X!BVTs})nMw5IGsKeuX!8$8!D zf8oTaF@Ct0OXsL*!5&$9mu%gC?SBk)JlVaP*}c(&pS8{9P_<<IIcF~EU)G?<7O8>8 zylc(ct~lRw%IM{rJkncmd5=21UivvyC>>IMa#lDL3~9C48F{#<!l@m@mzLDw+J2)^ zCoN|48F9?BdgQ9J!Q8aqh&PU}#6E7j_O$x&_OV&T!M!;;_3SLn%(tofgsJ;D{rT}> zQp<bD)}!ubsX(Vj=@HY$+u1Jf^0<g<aea6&zxw_$Jg?SMjJ3LY^I4ChJ3TyLSiiB! ze&W`y^1<4CqPu38sWpdbZFUW$tviy6_(i>>Mwq%@u_7Fq{tka?o8e8h7xwAQrB*p~ zd85>kP*OfM`!dD)Fv-Pq8tIaSzR2zbV`2B?)wEDmYU{=)q|;I~-*DERqm!$Rlh@hx zqvz+^GkjBVq?MO|^xG%XqT7=7kFFfHtD9SE6}r$vna<fvH+RMt#SK~|d<W!pVNNX@ ziKoaz?wlMbi875zwV{J7at$~BMIDXUHI;p>C0tFHPYcAj2tTUQoa7-#ks*5C3BI&T zm$a5PEjqfd221&KrY;=%DEOq6A(<n+J;JCzMs*l6zYptekLr4Fn{|ii8mqr|3hBo3 zQ%NF1Yw_96=x)Uwv3+vqjlmUu_sh^%er-LCP!fAKbkrJV88XiHycmfiyIWaV3~PNT z;~V<Z+0Ehi^tf7iYkj|WRh6D92dDe~esxgBhx^0lox;`p+_@au>zyLyeRJpI*5Sw1 z^SjK2tS(+&an$EU)%%}f*)>J*YcL-bvtPXWO4-L}lc)Ojp1!IjwT_WvPhv@Vk*AH? zID<TP==&CRty1{=+x7!9y0Ky=+^9}ok$v`fUc<+h_TIh@o{#NZ0m*l-KL-YEW^*6J zijqY-H{{sb6zcmb)T?r<o{}4;FK;g_@#t5lSU*)`Xq3R}=F(aQ464p6*T)X%P=99A zjDKj$(a}xO=a#qgF1g8K)z{3;JlVMn*@_ld*p%ihLawQ#HYjY$cCSm*{hlq=q4}LK zLqjL4yVVlOwb-mMctpz*No7*i6SeMMQ8-I8XCFLS_!~M?gcj3la<9yT<W129&V&_b zaJKnbdCLxK(yS*=jo9i3;!(G!68;NuwV96pk;9B9TboI`;(7%77rPagO3ooIdCng( ztk`yG9_6#R&mVay<C3g~wb<1Zs^_A8hWN-)MQC+Dzh|p-Sdwcv+~rZ0Qlws|H(a&H zXZS7}U*5j1ih9R~lLfr)YipZ^^|Wm3d-b%uwgDGHsW%ksbCb>Y^|b8+FXx@_T;MaD z0aJ*Lz4=ZMIZ7uuLdQ6wI}GyhoMB^}(o+T?a7j+-*#ieSWXHdN!X`OsSbk;?9O0<$ z{NnsZ)>8&faOC!_*#n0-a97dU1CTg$$M&3I<DA-4yP$A+PS4o`$2fSl4gud6-s2n2 zuxZY~UPQ;(c&FfO;sYFkv&w(}7Xunmm~u#V!a2kd;~YuobpXk+{Ris=6lFO%JH^^g z%}#Q*1BtO8pY)$3{8f_MJ3G$l$tgyEd~%4x6Ht`qbnh682NT2sCkbo-F4_+V6M~BY z&CP(}T0Hv;c)$RBcmNJ29G4(5%$1<9FGti3YisB>2h1I7*CITOQCBLclg*f#A7sBX zG(cC1xGS_kcR;<?;MX$4nw3TCGQ*aY6cCs&!-18>#4^K)6~+TA%p2CQ4=wCFmZ&eR zP><_DGCxVoCswE*?0ydz;EX<irXm0=T)qGhi@N_~@fZ?fxIY;3Og<2nHop{8ejgai zi9Z<r3;_sN_z}GD4hU8;e-Ns<1T>3#02t$pJ{Z;lzm#o$+{p+GLI9rm4KOWaAehih zJ_HtyKoE)f7!r$l;MLqUGXap&Od^%JJt%B_ejggkNnonCKoEmD1K4I!UiN*K((5eb zlzuNJ3`Y>48ABp7hCLYYKX`U;+MEE$j9~``EW1zqKcstYes2bUIWYh5T-ccbz}r&* z9=!Zx;Cp|7e`wJqVYvJtQ~D(T#QOi0m6-D{fgPCP**k24#O%Jm3;&jiKKM)EZ@hn+ zkSzQi`Ct7&?kTbTH$OWtqK;rr!tihb5Pzo``=>Jh@hzQ}8v=yL5tQ)XWYh6@wn~mW z=74qW!Jwz~`!H!Zf>N^k0-4qS!BuGZ8o=Mtpk}{zU{oFdP5Q=(%<4jNyMO6^)5rdb z{F{`zMHOC)deQ~dtqwrs*+kH-m7fNE?;4;>@BbfK>{bdu!T}80f22tN68Jw@uGWu) z=zsBJjj(MF_`msCA@-C27ydhq<Uf`9|M~8?-$D%U#jN_TvX3V!R9#Xjx}|~49QI(~ zQ#-ww*#|Ii*?j^3;KpZ9jPGb1jv!z&`^0~fzHw4^AExI%?6>YWUE;6E|3lh=k#+nl z6HV73_;+>4Isc0Mn>3pZ;-CmLDVc8p$w3boK9~W?!WwWyHgf>-f6+WLEeR3-rT;(u z1af$R{I7m+XM-`mTg$iF|FQ5dOMm-bF5%?;ZlOCQ|G4>E;a~1*#O71Yw-Q+#AhY{| znBDEc;HP#-&2DyJ@czNIL*?p!MfYL;;0Q|l52+8c^8jXR=7Q;4_nWTk_*dlLByh8v z#J@7xS@h!|1Tedg{T2CL_;*gJe@JdD;0WO){}IZZrI58K=8Rz}PcUWOYZQ$LCu5tN z5Y1eJ_#b}o2QxDNS3jTOWO;wJ{eM~bm!-dbKhsT?fqvf@dd`2l`L6N5-0@@*Njn9X zNc8W(0A>^VGlSTN5^xFum_hst)5>~*5!r_VOd<4Q1|IyI^o>c(AVN(YzkAJJ^u)g+ z|0V%(2*v-MNh)dnyVnqk{}uUN_;*eL$A2;vy*%=h{9i(2|0ea#BLPKxNB-@G|D13T z6tR&gFjaUa6G9V(ur?BaNE2NEn)tu?5o??Q{%$S*w(x)XcDA^L`o1wB{}KAG@xR=i z%sS#|#?4EdQ-8I^gertoy6eyvd#i!Ei%T`Tr3RN4uZQGJ=Pg?~P3u;;nU$qk-ZX!m zXLx%2+1s>2eOer6XOD0j;QgTlUa`3atx%VQr)Etz;zz$6_8E)xL#F{pFKs}M5^T64 zT7YFw@ImI;|IfL5+gcU<)`hpub%!3D=Pz1CZP>Mn?vZDtr#$uoLf7u$&)Smakr8{i zr_=dk8}qP-VSz7(_L+}kbC~t%PkkN6a-gl2E9gu#zOr!a?_H4Uyz8~z%N%?hd|q`p zH2F3s?7F~OJ*u0n%H7cad|rROtHH=5W{!}Zw$l;xTng@d{P^t96~_5KC5@lX;^EpA z(q5<9MLVUZOr<v~^BrgX_@^%VySB^OIh(DDMe{N=_QZ!u6neg7H*`;u!~Qsa@+a@{ zX%$!D6nhO|9ICu;wZ;hM&f|<;MG#i<`T0DD&%5i*$n`c@76x@t2S$%+yLE0cSAJxK zQkg|d<>6AyMrwzGW<^%V8PDStJSx1GE7n^SRrpj=msfieeyC|uJFik_9(5r()b&$x z>lzD&Zd%bgM!{Z$<$0>5SChfTwCeuAr#quIiW>EzUezAfA4i9<s#`KNj`JHvujmIJ z`kSGg>fvMXW6z{L&rS-}%Jld8bf3Moj_C7e!{mTgEdZ<Fy49kN>miWd$<L+F&@d5^ zpBOa9Z}KX_xWSP=x9kO-c9(YUH?Q0|I;ahcd$L_vex0%fN(=Od5AGb4ZAAMRgtJQp zfsg#>w<7t`+*&cyJw72eVC)YblN3c4V4Oe|!{U_ttd179N8q(HeGlGsl42vzdO@FA zcCHnRJGqJy=!Uqn7Vtf;KmlC1bC$jy&vfLWNKp<!z8H+5`LAS#sD)Hw(G|o*XS$Uy zhkb~Cxg&*U{<sM<eql4r1z%tVc1W+=?_1I~zrD*Su?iWOf-DHq!-&IqNd$xKh(U-T zm;}rbg2QZ0{9dGJ_GBS`Jw3=3nPS3cQYy}5bR{0mPB!D}FgL5WTS7&m9NP~UaMyf> zGj`{y3Ur^Hm;9bqh&#g_cjU+`S@Elz@0OjN&X$=SuvJrFRBFU`$|DK*;7geJ{t)|X zT--sxZpfH~Oh}sTf}ss;es@>zt9^DfhQpS-%SGfW%Mh2#Mh|s=$*$FKV|^{6E48V0 z{2>m%e6~Eysu25Z^OxK?{%7qOgk%uc!G?gZoN7Y%YtLgG_@r<g{t&;F1u<(B3d_aK z!7{Xqqxn8$Xv_GSHTxSZNh-t8Skc^wPF-!4-LEPZkBl$)zZL^FH39V-;Q;`!l>c9g z0lfcnF~HQoh)GYt(b+@Bz|l(4#K_1*)6UjJ&y`7!QICmL(Z$TfQO3^L!qmdp#F**t zrN}NTHEfAQhIfruRMxYGkwl$Qaeq6zj_Dx4^&h~^=r{LM`?rq4%KmGDa}^}mt6`s) zcESg=Ow{LOkn22AZe;<#Cq_rLjE%LImw3H@UR~jU)3>+<PG6c<u5MM-MEEV9Jz9Hm zW)4mVeh)ffIZ*~IuxIEWr-v6+tGGHm@B2~<abdH?h+t|(x?i364}lFH_TH<fG2P0Q zc3Zg@JkZVHYDMl?&R{|M&Un)FMLYG(r=YjauD*EMqDd4dBLZ$Lp~LXpT~qE*{8Qvb zmHNjA`cE46oH?=kX7Kp+wjCc5U)Ii#2s63^l8gSIIod$^t=y+^WqoO~IMHMuQJ)B} zIpDV!7ZrRWqc>g1o!n5RMfrReaHc#bzT!F|eXG`y&w!#`zIN_*Sc3}AA*|Dd`OMiu zLzF1}>MWjp$1Qo4DFp7wK9EyIQ_f&R(>DVO_k0bXAg|nH-g`UVEPyLe0wA8e*sf(C zvj}HuaBsILzS=Hid2rkVQz9&g{N2%Hc>tr2#%uU6g=08J792UzV138F<nF7QBbvWN zi*|l7hknWMK7^q!INF(+(Yy0q2u)jA^?-8c?6Pp23?jzdLIXhmqSs8uTnv;r>HU%` zglh&TG0hRMpUcn|R`QP+$2RC&zq`X=>)SPFx|9x-{j&TKsL{9E+aFzIu#q9kvNUGS zcG35%0NfgXfGrcLxeKqR-<S)2${;ZC)EftMb6lYZJ7e$ChwWhh7DCk)sbTMv#GN}f zXuzDKXiB!(fRbwfFWQL->|QszX3AW$xolqc3AuSAtf?d2*&e#{)H}4UYj7*hY`-o9 z<DTY-j*V1IA?!CCd~EE?QyhNfjUB@oP~)BK(`G(%9NEbJRGPuf`??G&FX(iT9s4f; z0Xq~JF(n7_BSZY&M&bI~DdQhL4ld2uLm$wVL_Nr47gj1Zm}_7;pA0o}0|b`6pCcM4 zLe;9z<0zg*$g^Sdj|E?h?w>!x?e*Y;BtW>GF{H^GD8fT|ev*Dt_Y4>gDWLLY<dV%U zo;W$PeR;9e%5j?+05~lZ+$@m3$7q%DUEPyA__JbhsCy7WhP@t}_JoP+OZ5w-fdR4* zpadEC<?}%o56T6|l&uGU*<5G$+C~_-RyOTl#!Nm6&{i#N_2^o44eP<ZS;@i4ea?n% zFE3e=(=Rt`?kz9p(C6*6U;{!tZPC&Ax^ZQSyZ5yK5X6FY`LaO5t!K%JbhzQJFeJ^I z!|1hq`F1|KD|s)ovO`i;UHd%YC(P%x*y&#Nc=|Q^)PFt7)W`CJQ|0Qq)VKuzIfrgS zEZ>Z&df~cFo+HYm{xAiphCXfpLn#kM_C?)IfH>3hrvd~2l@i~K_e4)u1{)YDyi0o_ zRJR0h4qfBNa*++IPrh#nj4Rv^C<TK%uecv*Yb1wN`)qkn>B;?rXKfu8g9ea{3@I=S zdyGpV(toBv6$Ezu`v?sba{g`(_nsCAaZ7T8HGVhIpjqoe`x40F?S0-Ecffopm0t&o zB$1)Yw83|qMM=o-zN>kAK#c=Cm&MGTz1!^lJ45=RJvLx2E0YZvv)uRqC4<Z`El@~3 z&_H1*=EAVpx(f&C><ECbA0zpt4nbeI18dWUtr9=10`wfX!?}JPhBD8iQKDR8&BK|$ zqo1gwrjrJLMB3LBa)ee+2HrxhE$_tsB=lc9KB?cv?S=F6LRmODh|nt!RCf*(enYEq z0V2TO^}(0NeucGbhHeiY1Re1Vv9fnu3xSr&e)p;tlgr(JzCGR_**h*0yKh)rYenCS ztM&r?u-;5!0jZ^HZ7{+(PG~*Rw_tOC8CYG!j0eN;_Qr$-bMPMwvTdhUz^6F-n(&W6 z@ZX8e(&>u5*#Qc#cG+l7+mkD-RfqWjBXfeeVVQ{*8HG_EYTiO8dGmg8y_c&&u5Qoy zv`Z$iM38xL9VyBG){eN?AF6JHUkY)qAORp^h@nDnqjX@i5`g-E25d8r4iUp7+OBx* zoIq>=P(*yy!nm1UtDiFL51q<t&@r>E;j+!&BcJEv0XBJKwYe|?SIaejMVd?UtXaLI zf+9z5FRK3%+SLxs2xGZYy3|_<Wm^Q6laY;PFVy2RkQshnt?1wxcca_X)4W5iZ39H_ zle3PlLqP^87Uma)7)i|{4oZIQsB^M$Y{(hj@LY2)!1D)GLn|nw3qZDIm2e`nX!V|? zJ$K0`2(AT71TCIR!xr=qsQu)OwGk>+d(he55mBbx4Yeg9iIJL^tbLwa*&KY42^v~x z=Yb^9L~T7(Fom>u5Qh|_?xMUxd16NMnSC<lnf^meHnWP<6y{|4O}%sLVBZO*wjP2F zc%v%NA24Hxd=jU28}a6<sK8h)zU&%al!cAtrmw}aq}d76Cl@?!DZYutuc^9+t*VD@ zRZmN`gSK)rb<uX*vc;lly>ZP(^OCLF)uvKs-Ez5kt*P3Two+%@a=Cu3$+&|YJMM6r z{Lit{t&@|^r}bE#&5M)J=iuY$B{8u7J6v6UPgSjw&y&&mlf%H1!~B!O_|t8|^}f;e z2zhs$91p%0i}`Jad*fh!RjtkSGVJxT%=I$u^|IJjZCsaLo_i1PgU?|RFj?6)D4SjJ z?VKKqFq>=BjP=e`S<FG%<Uv{WL7CW?TwGFKF2=&Gi#-R|Ieg*H;W~QX*z9B0zMEZ~ z?8Ri7Lir>b=IV>Kent}lR=2|Pl4}I7guoz%ggg$$@MMXEm6aDo+TJ3miI9RSM4Epq z`p`>}-ujZ2`iws4t(K(E%X#RFN~dq-sBym%@DX}BtwfRQuFD!|@sJErd|wB~0R>~- z{%GHR;Eq_p69B3HyRXq+vRTpY*0DK9wb))}WHCQru~CpNbARE{?dcZZ<5qTd_X;1E zhmD?YQ3Kx%S3sSBkfHN#f1ebXFtv`0MHkN-u>7!<19-47deK<tlqIs?%pQ9N$lAs4 zHGvze88)>P1Hl5VVIZgUs>1Z3V>Gu^MHeW$FxNdaxpMCSWYWwX|0lQe&PFFXI&F^< z?uMdTXO%85Oc%ag3Xt>Q>L;(|nVCcH2{>2}bVzlUDQW$w&?kQ>6XKy{wyY(Jh&U8z zilxw6%b}5>5|>yR3Ek3Fhj;d&G-heyPKGi(2mvHN^ZlW(Lved~0^945CO;yl`VV_> zkwe_RjY{B<z3hZ%NB`PBKiGs_LR&EWn`g@rC`NIGLoaQJqVi#uGi}6ty6!Xuu&SY& zQ8vHGJxz?pgJMKz9GZv+n?kYoe05Pe;3OodZdr90>1`=@G5ENU=gQB?HHwvkVbJX6 z)jwf6R&1QlrVXKazPHwhtl0}OJg3?*r_VnpqsIfe)9~fCfBJQkDj`F!NI|7@#F3r^ z_>j!Y7DF4Vm?^^aawYF6U6l_;DBhVbFyvB_rocvDLX|W>rxMEN+(J#CD1h9_`1$cg zACm2?t8c?luZ<Xzb}z>tgdg}PRsltqPlA!q8x4hHh6dz5QL=lDb$DUc7?>?!-bV<Z zjVBRS%38-e8ry(5B_N;k-{7q%TWUyAAPIcn1c{<ET#4-Wnd3cJj*@XOn}Z+(*wy|< zZ6-w^aX^r!oB=S@&>Kh%m^x<@S_hEDR6`F&{HdM!7{EuC^JjO}+>;)z`6)Jqs6(@4 zTrzGi$3mdf^H8Yzqi_*uk;u~63jc5!N<1bd7a+LPVCc1_*%czFOR&oXKg0-7rNlJH zYVqQ>eH|{-rKW3A7cW;f8t2FCIwVfgsd?o3BUFV<h&xUm>y6Y1THJobIfxmqHWg*# zX{8u&RRqrZ<KiNOi1t>EG&xeafU~S-INW>L^4G?7fnyebq9zR(uF_LtGI=XR(i8@q z|BNiKOZrf22JtOu$Mu5|f`bcjKK^_XFK&+uctkgX*QtT`X@2YnO{Q<354l;~&#@Ec z@(XHq!s^4@M=yk-iyvKDqxcQ+)hX2nyP8&;J<-@vv_>5t=;|X&MSeXggUl~ycPCc0 zU*!$IL2Ya{aVPK_v)A*u=39H#7CVU>_$*oB3r12D*J7&k{3v~l-p02x^bL-6#2Zb; zYs5b#ZD~Bsn%A~(r>wu$X%8wT%38oe?Z7R(FNmU6J=<>#$uc+B3~fJI%Idqgu)I)Z z+S9g5tm)ku@N2(N(^nsRwl%x+oawmqeLY&2d@snGs;h^@FPD-)<&KLwP<76nWA(at zH$iIy3~A&U72ghSHw`~I6un+OuaEPa-NxHC9CI6+n`QgvLA=dXJ$|rjxt+fVE!}PQ zeF4uGEz%zJ(@%DUXqys_y>mRvcVq{#1FYZ#6eO!F?^dD?oxF#2yZv^s5^e5T8P)wG zXodH)^a3D_aCGMWjjjvh2wulWJ8XRw03hQLz{WpmR^=F}a{#VNCtlmqag55dJEz3g zxn+sZvAQw^`*2$NYxFAqqngLE_xRypG2*5%Id8_u^$#46w$b_9XTtG5<EukKQOt)1 z$1ataJd4v{gfL0)K5fk`XF7ua*99s;ZRX_!8FDs^MPe^uV%gc4_`o}g$j%*0j(-_- z;HM)e5Gqrv{=9JkdIbnA4BjYL2!DctFr|KfG!ZDy`}NQH^SEGQ8$x&Fs@h$R{E3BY z3OQQ7&M6jxxEcVS_L&V}b5@T6F<g680P!^=$?x~f2hO6<7}tCmro}HcP-Th<%UimB z68^}XJ%^?>yi7d-=NPltD&gwn;h>4H<Co;VF};GHF%|SwDcUZ{9%<-{ZkezPSKU&v zu>0O!YcOv@k}C$1?#0w~NVbVW&YBG)h=|}iPg{Bsyb&X|XbR*Q*8+9L)|(99#);S7 zY>+?8s{!!RwDD|U(tvv)ei0%44pMK(Qz+9%Ovs)WFE{SY_|rzMB0^G$fI6x4Y_|kN zQw|7rR)8Y;VOFqMZix^+P}K=Hn+h?NA&)c0<U`4RFdKFz-z<8`-X+9AM^#OCp-es{ z>&`svtQeBgQ%x=7tMN*yIc-=7-FQ75|Ew&vDS8pb+QqqpZ|qBAWmi3AP*^Y?;;E>y z{($@(`1+#Aq$9<g4yW_w&&5@j``1~98z(T+Y#kZoXH6fbPLi2&O(|@bnhuN=4{}S; z{fh_O(iM9&OT0ERCt9%w3<)mAb7L2NqTakXEVB{SN$ejvU_m8Nb9B<G^kNg`EoDyd z8%!eMT@n_>{!{O~VF4In!znD?QC(o&EgG0&P`d)10Aq-WveN8c`FD`U>vb|}!6S+| zCnl0C0S3g2Nmh?DTHYaQ9*JMLW49g<3KA%UHig(v!DM-Hh-E#4$ql7!1_78=>+|&Q zRkwdax5q|sdjba7-Vvs*UcB<YCIbb<nL<DFTVWEnxavslMGMD_S!Ut#iy&JSBb7Sb zobMk`G;Z+CqiM>Wiws7x{b>cV)7F3rku_=hs;7()ABC~RB-x$LRgsL<=Yo{<4-F$; z*D~!@QFchpI}`h$RP=n7a)`32l*E4se$KqE@Y|7`>IG;IGQ#56t-&|Bc&;tz;$B{M zm4ohvX-atme3892(0;yuJbaGfN&gO83w^#p(@xgC6hM7$q~t9?SGp9X4G75y!wU~k zeL<?QLMp=laSVX8R9b(uSO!@qJ2$V|Y}~xp9-57#cMwv+G`cvsE|N7sVgatN+d_N6 z>mZG#=7eY@j?Alz`2|oG-%pioo!80d3#K~ug|$?{RUGLQxkG<b3M3jckw{zPFCICG zP*n{pS|kU^p%Z~y+|68-40;pAiRiE-;AGwaf%n+k1q=6j><<49);+9>h(S+GO@0kQ zq+_epJf$v1BdMWyvL9S%;LO?rAL%XKMx%gX%piu8S!#%+`NzU=U#+PCf{I9|a10r) zOvP!7GCP~)?8tu}qh&DX-E27LBH*%FZe|-QVmw(c<}URmpTPIv14_yMNxp<lC3WEn zVs*hRCZbmU@*}IK$K&lSE7J}mf{=qd%8fWQUIRDow(oIv%YoJgz?A&Yeo@aWTs-AH z4&m1`tj25)QC7K~%YeJA3kSV|xj{e7R{5W)bsdN;GOA3<(4L9IJ6n`_NVF&E&0b`J zPuAjJ#5}jsB;psEuMD_D^*L)4F>wLT(Z97R0M|7PNv5QvV?4ye!O6QMA~gDcG6_N` zjc25jDEdB%IMIXgZKvqdv-j|9`S;*o!XBXR<h=Nakwit!-l3051{3B|)QIF0aRC+u zl86iUaN|!n7=Jwpb0L!bAhBdCZAI%f6F6WJYCz>O008R=bZ7s;NcH|^EDA{ey?WeC z45cAU$c7IXWky^!cAva5PUsOIOV)MNr?sO5FKi}!K!Wrj>Qu!EO%n{XK~Rc^;CjF# zuUQswEs9R~36gQmxd0~mryg>4W9s~Qw&n+xZur`bRKOWX(#qkf!-C9`D8dtdHTi3N z^$xon^QucB?n6LPN|!(gE&8ttLP8-_vqJcM{YYipV4nF>u3?U4PgFq|S&=C7bdFV~ zGc?O+kXi!=IrJoT=Em>kSv9c{m$nn|dBiVfD|r5y-?VMei(62i(><Y9eOEQSo0e7L zsXtF{o-=ePLWwDWmwLBUP(zsjo|o;t7%t@q_YRne92#|xduwIR9I@Gs#W}3h;LF=; z-#<kgK8!!c$QHTtmY$VFAomzHNaOwKB4<w|WVX^Nvg~ym8S%Uhs6rn5cv?j=$hyUu z!|qtG^|W#?wM%$&Mfx0{7lC$2@Xv{n=T9u9!Lvnhj76BTQ_F-eap1N5Y$3A8)lM%{ zf6~kUqK0lSq7Ta$=a^7*57j{H=*<N?Nn9Tqp$5fbL7pTh6#&z4iceW%PWYj!f?bg< z*H)k$KG41{agr4t`T#dO;|uF8fQ+1-fOUE7yCKHQtss6(h^Jr7%E6Gs4B;qYCKOr~ z6qV?#<L)XEiJ<g8WNQ{0Siq56K)mP9fDG@hN##r(E!HbP`fP*XbOH?l=}q$)9@uh8 z*g;~OX9pO{%RoKb2^ZA%VFH(U<cdtUUi<h|+b83RzW0X}_h(nx?m0Z0`v+!0hxa9b zD{gDqr;xPGCZ>$})8>s+_4k>QvJ`{Nb)xP7^Xf4y3G7~slr4KG5+S@Fbe9OX+C0-{ zeri`q8F}&_lf09U0V+ztR5Z}|Zdlq9DrZLX%zC*3?kP|i15<vT?N&QEeq^-W<i+V| znbU)eLJ{~8?0KM1nKC^qi8474zRl^^Oz<a#@Mdl?%G}ewGRP%p3E81#d7*ltdw;Bo z!`}l@N8hy*^h(Y&$V-6Qj^|xBiYOX5^1Wbr?uf3+<aUb%1OGr2cp4(l_5R^j35S=m z=}$Iz;QzDTX|@^1fsWzUNxuh_UxDu&iZGz2huG_!5a{fF3!~FBy`ww@so0d>PaxC0 z?^UqK%P$;Ek70p3U~(Pax_k2*`cve3n+A#BZdKF1wP*7^+yHiI0H!!|@A6osHa{JE zKny%Gl+u_`ms%JDU+CK6RYJ_V3Upo4{34BH?v;)lSGUQ&wc<glh_Sp)d~6f^vQ1%I z2a*$VdGFG?XLXgE1Fm^HuTzJ6g?FoxuBMBoxv0xMIQS`@#_A%dDh&zqSDzFiTJ_th zLjt=$F3^UCuh~ro(#oD2G<jc4qlG}TEe8~ajH;wG1o0~1&}`Qrhtmx7kA!dmFQYoH z!^0_)@HEDB1r=vEShpHxlr(5W+0LFfA?S9J6#ehHpyjOcb8tO16x^|NJvx2sW9XQb z=5YLE0dDsEkpHRqC!~UK)$_(umT>5WZ>}llE(2z4e^Cn2l#0BPg-rJfGcpKb2Td%u z($aNLl>C~VOXjL_sC3<tqV%80GDRTRAG;UO6NZ}S8;}dg8mhbU>YMqVb=76bglJvm zNY*v91o}WriReysN}ph|ZOIC?pglnaWJnV+F8t_$zz>G5qs$kzKTk>s=Lm7G>#LYB z-aMt7*_P%tV$RN-Bbt#YEUpyPDO6o_pPt`GGT(k790iU7r9t%%Fgcy@mi)5)o!5F+ zBqvxh9!b&kK4DFpWpW5bN9off8ekS^&0f9*Kr*6_09-XLf9ifvY!S*HvcVv_Op3J) zc-;dmhS!M|<C*`5^KCs4_(o(L$(pO;{ERHB7uZUM(bb$TEAD73(Dt>)+KBLjux*6b zakhfQ7N;tk7=HuEn>0u=nqvl*1(AMWbS{2AuBj8EZsNxjGSwl7NZ+sfR%W7!HO3Ss z*2EHrxj+(FHCbL}YlbR5)R-zFMhWx$MHkwlejRCem41jc@vX9a=*8fa4Tvi5MH%8{ zkQTj#2uA#olX+|H2lbdkngoM&nw&<%jeAP>+=@oDlt-@!s#d#MX#SX&dnXog<ySF~ zkQ*{&#H(bVxmI!~)ERBV4!*oQiK<bm;_`?u@cu=ElA{N|7W^4{y|0c<27^5+Fcu|l zO>^^2qmsnRWoInS-;<Ii4mLU_m_9icUD54yKIVdEW}XoXV52LTi^ikk#dhSxLZ}a% z5U|2Tt*2Og3lKHBdE`|Px<SI>#=>yw7^yV%*0ejtyc&Mu55qnto(?}^3v&mv1A1}2 zdN$*s#s}PLtpr&qS-wu#3D=EvGz<LJOSd=)FRK}}4wRMV!eU9NS?e5qALTb-Mi8sD zo@MBFWKQa)?P}RoU6i7{f@rL&rPi&5js3Fb#1FO%mzW!gQZJ<&PFu1QLL1j?$=0n) z9}zD(?$UwJE%mQC^&vC^J?yP|UHp4gGKP{{6@_DhuVAZ6%b2cJ_EO6514B8h4(w^_ zu@MWE79Z`hlnFecU)W}bJqL^!>B0bQ>2DX9F(y^zStnolY2+K`r1SGEeRHgY4|?`} zm?&@cce}js=?xTdNYr9UK2DMFvwubClMqat9?TOEVLOS*5VusE3i;e<e`upA)A|OH z)7gK0=v=&_wX|&9F*LIysHz4IKK9gyFIK3V{#4k&`g)HS{}qsh)vC%0rFG8tTvx?l zp{!)g_UV?b9Zc9*yh;DT#bXCJ-S6kj`iStAmH>N5v&=c-->r4hk3}vXvB~ULxklPU zHhh6fzBz1AL#CS;Arw;oWkw(ed86QO;CEYY&(>p>C;jsCB{B`UB8xzXbf}5$z5k_7 z%bNPsyI_N3j3NjkN-=NEQyHCde441hJS7*&AMRsmsmJDIo9)3)3*Uz=rkse$rAy#N zIC5n<kgs<W^Kf%BR{KB@8c^R=m|dk-mr%!J&z<6UaesuNqf~F}N}1~CZXIsMT?J<C zUT3C9Bzl==1zZf(QH0TlDMg@Qr!liuxVSPd6*#x3Vv{x{6Bax^e)q?luFR$os6^HA zY+UD*=e#kEHrQM$X&IS7Z2qQAN|&mpj)q_`1)=X^sl{iRV*;e((MX#EWMz9}Jd+Mv ztpkEN5~~~3QN>QB(hX{P)}yUb(uwPGkALw2J)_L|Z*JJxt>t2wW;Rp2Ndrd%!}Z+b zMBIU(Gf`e>P;V`^U5-G&{?3|8Q*#+7VRxJ%79-lKdOzdgowBe;fP7!Z`=>ahQL{NM zY$w5}{mUlU{@Vy1Ur9bmhVvVif~F}Ab7Od8{fNPgH*ivu!5Gn;vg988C$71ayh|g6 zQd*c7_Vv;DG;?ktlWvX^)XiYmN~Wk9Zp6yiDL16RYeEy<8jf8^A4$M6Kdr9t`LA7F zJ(x4RE7UcMLU@EIIWC0Z0LXwL9I4;=W)3;BevS(7U9k5w?YMLAbQ@V+&_1EL!2riT zHaSRl`!bH(!zpUN2Isug#MK6!tzJwjJi*Yl7i@lW%E7wsbUMwe-=Qp$gVvvd{)+jD zE)B+0%>L`iM@z<`L6(%_ia@*okm<!8#XDkDT*Ff4#7242vDQ?{kWKWpiiVw5U)Px+ z*o@L?)|#qqm4^;jJg=|{nwYaD@S4GQ!>q9_XMYM(ER!d<;)X^wTJi`|MqLPkDjC%0 z>nF&?MwF>T-;Crn7JZPL+rx$qkDJ=`=Ax6^!~0<^USq=d$B<Y|t`I-#Btd@+iQD=_ zc6x*&2~mCo4S>%A<!DvLPX@<R=l>x1p(1N1+G)y`JZHB0DS!t&XBk187DT3wy^c=e zW*XFu+U?Hh{=VrxZl%cf3*P5-$J1n3qGuR-0+2%NoQw50sbPY2VhD~wtoGjTQsbby z$L)MO5|8sgKPg96Q$I>3`8~Fcc?hY`@53Cra3fI`Wm4|iUd~P~-`G2T<|dfyK1wz6 z`gVQAHkA;z#|)_@*kb9kBvSbUg}0;%b~XVGYQ?aSx6vFg)!R0Zdb=_IaK>HMy_A|m z-u`}#ke`xX<Z9S28mxg@@q|5YyK9SkZNR<`Ro>jSMtN@NcRH-%sM!tma6|UcglRhd zc@yiilqkp+FV_n>8$bt1ql_X1;m``;{-Aj4q~#`bd&lJfMgNYI*$je!N$4!dQaHFA zh}l(Z)b_C`C{@l+RuCOQy{)Oz{fu0+%HULu6^dIymV#}<Z4EG%3=$NP`c7r+;O5|$ zO1hw#h7U+~i6hP>88bg#c9Q<FIy|=;|ItWv;V2)z$;e9rnf4QI4tHxg0Z}iuEK!$H zau<wjoJA}eV#;fSuGPIUOCN-tS8vvHBN%1>6hL!o_?gGY)0g}^O5i~w>L{l5%XN+1 z<&)ydr|NVVUtt*kxAvBc=!K><6k9l#XDGPS`(3I91o4<^SQf|k{1l&L&ru66%5%iB zZeP?RpOi%}-pb%+Ql8u{-4|2XMJ~u7(K!QM=>QbsAx5*Vg6}i4P-UKc)j0D)_SU=e z{ESHAN!L>NsJh>@7v0V&l9c{1{#;p|olo3X4VEk<`dOK;eujm}Hz{)eIr%9O?#yZ2 z_=}LZ3UD*%D=g60n^I82D&^O~S#rSWq5B-Z%qz-k>Pe&)VVQR(xPGRpEa65tD0Gls zRTj=(<7yqZ$7$HSZ@U+{a!WdEOTj?lAJfQ(q+tGHAGTg3Sb%ChW8%w%E04HYiet;< zLSF1VC9O$J#siW@Mx|7}oIR977KQ0&T}yrlH$xg@f{{juLr8M<lbRPHLo$}_WqfRl zO)sO!-}MWv*pSg13^+5#??v=zVYMb$earF#{<H7V9tQ<%G*m@AoXQ1KZ11&C2mM>7 z_fb`NYL2AF&Z(GAB%HHR+Ek{?RK8=cG_jHF-l|-9RJ>H_eJ=Fpk5fv`53DlqR#g0g zLflM!7(@^`yy5EmqQ2LbPnv^RGGl-2Q)!e4JM9oJwFbGong#gR0qs6t4Bh4YR-EZ0 z+%y__92%if%1}Ibx${=?-bJ6Ej3E_00?$F@;(h5OF{IOxNRa+N0A4_$zkzB<4v7Bt zDzLUDcP4MiXgHXQ%6S*++8PAofZKH3iP4m>KU@)e@)PqKawH%L7<~cDI_ZKYj!Wj1 zuSKO~P4-#P#hSQWIDO6wL#{^bV&Eqp*UQ{7SyLq6)Y-%OPNVu>gDQ>vsxSb%sL@zX z>d&!N5*N*KgZddZ%Ib!+;67Od0T1QCJ7W3+cS$bFevE(E7RbW4RR5_gQ_hv5WRn8f zw7Bjm?-B=z)X43NJejke&DXil<`qAkZ~yuHW1i5r_KeOQsQZ}Cf5$Eoma@>xBTGD5 zqCFR#(jNW!UoaIG@W2{H!RVP*C`1N8n*&VYLySoS0o25blcy;P7y)#E-@a4{(YPT% z7AI}oX<2R!agrrHa`S1}&MS6e4XJq+Wla@oz#D78_f~V#^K2g+?QQS=GdS5kdbM{_ z^O`ML1UupQDJzMG3VyZbB?em@i2euZ3}MeJhbR!ATbT|&C}*gT!Z5Fr8Ryibm~pbV z$S|gs{?DJCN&8;G9=Xx@IDQGHA5om})6R@)m~dNH-~t)bkcGBuvOp;bKj@^Xq?yxz z&1jlNELNdeYC`d~y1BK~=d6;}ZJG+N$P1gl^Y?{SpQ+W?zx@HK=!}2WVzGr|`xc0O zcYxH`86A9k1xk1xhhQ01e4$P0@pNNniS*^gw?>geiT90AvhuH;&WZPXm(sP8=d<{L z&j3nonlvdmEN)X!d`Q})ibOmz1*LdL;2)NfQ`f~Y0+zH-UF!lNq-q4p?;6j?pRCTI zYYs#zQ61--a;#4JaHt1!5yAkVh*|pe5mSj4A7Rnj5R$>dkp-+#aJa3+VbUPNvX?k? zqe$D(nVCgW-K-csciOm7MCF$FOQo7#ghyLoWwJ~a&`he(y0|NoVkd%IE3J}i3X)aV zXYB#LgBZ9QSO+jAoz~fT4-FiJt%^2~Xg1Ag1T&?mh4}eE8quWd_0a-S#WNCr%K&<^ zh78wRO55KK1&JbmPKsqHk!rzmAR|VL@e3z-zbTA$@C82R6rvh32p_2VM;=zI5QwP{ z02{bEZx?VJ^~2Hw$V07#rr<dV&{caHypFgsrn4oAl$_rjVA(ZvBTd^(Xp1_ANf|f4 zuIW3t0pTqk$j{gM^EG~Mh}_u*+@%ORq#$<S8ikfNxQBHIkc5H+n}N_e1d;ih6+O4= zJqTn(BLPK4%g}Wo$4+3ixX+>>C3?o%zj`~i;ox5nHXg0pofao1URokKow*2!W6hc= zy;h}c3Zc|@I<wcMH-Ff>#!%;Uwt-9OPF0LR3bWN8QW%XfxC&@kP^lZGg@U_}f#9HP zLP4BF7|XA69r2c>p{=!or|WC&$0}eNj7ZmkN`w}kXpB~+s-@5EDdwc!A08o(#trpr zU_wq&#g2b}21&Ajtp|=4GEd8y&|$D}H;B+yz~+NfyR>sl+ili%Go*A0^!8SXo{gO_ ztRibkoL8Dun9#MSzNt4ezb0xeJMnK;J@M`P&eU7GMGb2ij90oAW(l0&Ko&)*vnCDI z74}5ul1F5d)H)?poGMOaeoDj@kkbKgRH@PxFTk)S#T{s#*{65#GZ|>qzDC>xfG^<c z#wc`H*+EE-QdSfbUrW?lU{v7-&AvBWpBNRRREd$*5Q&U&g=tr3sOCxps;g1xxnhy$ z7(TwxVUJWmhKdj=q{$RI{ZdkemRLc_N(76@7z}@c4@W0yjUd`Al2(R5B3~j=;Vw2= zLJ207U}6dNuUf>!w}b$~BY`L&f^cLInL>z6Da1qIZ0|#qmj?`0pI`zd6C|3*lT8#C zP88W<ZS|fq?587aNR>h)8QYc0A<8@k%Sa+hiy~Gci%1nltnSTQN*r<P@`!Q*iCdLO zEG3dCyFM!tO4vaV?FJ?YV&K$<n1kv|N-X0N@r*6$fQf|o{5gBt{VW2MQX&*vh*Cz3 zk|jv7Cd>SqkgsULN~LN7nQGaJ@uv_pc~SWaw)IO`@<lB6geVpwMW|xt(%)+8ZDSA8 zP~?1RigGhi`bODA@?F4y*{l~baKl+=aB?x#oLA=cT8_QS;dB<r*p;i>0=8m8PyH(z z7>0w4n!!;Ni=5wJXlcS0f6P*T6=x)}6@93}EUf6u%U@AO^^zO1u!N9~Y&ujmD~Nv4 z_tzfAj{sqscs>FwN*#)^?m+GWvxj<Zby29}&hy<_vHtY~M#iuFs1-;V)AAj{>zg#s zB7<KIShkvs&ga==R(>|cqUB{iGPhZJVjpr8la!|jT#@@N53tM-=S}J(GaTvZwlgi{ z<VDi0By_}{Wz5dc0cLMh*22QVoYMnUgDd3y3CV8ABfJa}7$6)S{wh`b$tU<|99hvb zvl~&EL?T@5l`l6vKJ|sWse2kcY?GK7Spj%aBU&$cj`xS~LV@?8z(<}~ZEWeo#Lewm z`F?aio4{An1LGEm;i~|6q9G@yfdxGEy;M!~DPK#d5C$w}FN@3~g!q0Nk<1B84dI`& zmlhA~p8(v*TpBU1vIiyVdCy5uD>gcmmeNCeI_-2nnb&hhOn##vDiGq^+r0|)owWTc z5be97(OWXkx8Spb<u<gXq7uLS3@ccKI<WxuKLF*v@%F()xC(C>GN^(^f)M%{Qj<o* zSs$JZ$i|{H2wjDQj}Zk90@Ff~Sk=jL4GARSM80gTA42=LWBeZLNIt;<Sj0nn7~I9B z4OLj#WyC`F0Vc~fUwHG@deR6{#|v`J5a0C&BPwxB5M{Uv8S9OLlKCRN`C{<TtPFM; zY0|m5<196$gaiFTJZ(I0of(;5(u>w@i#@1@>87|Q4XKJ1ZgQW<)(w9;(iB|52V(jT z#2X?hQ4CYIGrEF%vlruv9?#BjIn9QbeSm2`^5~983LXlFK>Qa1Cyou?LkOZ4YQ&sA z@Pb~ZA8fC>U~rsX#H(lFPQ*hxqnnBcp8P!(=>y<mg14xWOUyzTc;21KWCZH@xg-kb z=YYe4C`e1!MKHkRenc-Q2!=}UN7G?1SLmpcTr3tw08>iHrDg1R0SrK5nvR4yJjc-h zV+<{_<3!Uyh^Z7m?qFqPbLGY@Z?qN-)Iu{%NRE;#-nv<`-}YktwwLX9W3hfWmhE?Q zv3@s~?RRUjez%tG_t9egK3cZl$BXs*c-elREY|OnW&3@)Siet~?YFhQAmLbFlu+*= z=ZYc#6dKF}<c~f<o*>|Wu|Nt1raAY=6@)D9A5&8g?apvR!W8XM2lTY#QA{c{mR&wT zUw&fUgAuXFHrp}yIvFp-)Sw&&bqWDVq5_gaSv*u4zKZ`gFL#Ukc4T0Uw3tTfU#WGH z4xoSn=-2AC13gR6g8#sEVbYCI&kg4@4vbtTJ?~P+Vj0zwo_}Zq`H938Tq(B**bvh4 zniZ%StR42U*T2}2wu5f((5|%*2e8|}=!;9*8iqbXw9=|$G9(LIQq5KVh-pA19^-iH z^+5#uYtssK^Ba%))R~R;60_0HoDFw69<6pd+6AYhU1~ZumY9x>Qq%EdwbQXta5^?h zO~>XE)3Ny@r(?6=bZi!y4m9{&>^ZD&NhxOcyu8cazGT&7t|YQC5`lPXAwyLRo@{_l zIxz^-zpdhtMt8p%6&Som!J&ZQ>m6!i6<H%O{UU0$E<eKORU9tInCuV0itY-H&R2<3 zYbl%#M-$+O0>SQpkYO;dZx5&awZ05;(O4Ot?WOR9Y|o$PY<U^N!LN`K@)!i;)8G)r zYykPUK#bxL1hbPq7}G5<3eZcK7oC0Ry3}T{pd6|{dHALSha@<8z5V;&)kv^<E!0RZ zDyaazY7l8TfP-qmfrp!mF4ZBj&Potoml6{r;5&-`X9gYjfUA4;?iey9bjBbnra)H3 za3%QJ2!q{d$=x*>1F|nhS7$+eH-eC=5xy5doDCA6u}C@{&xg~_H8`u2LSg%Bu=C>R zKTlv3yEABY22E23A#9TXg}u*Uk?<OjfbAOwJCpJB#nl-JlQim!9uGEv6SVi4qm~^w z`R)YNM5rYI1|FwfDntUvje0eMEmj17&mxEp+n!}G5&;#<|I=d68liFuP(R|kmY6le zgj7_ENzSk(fR{)v`q+JSw72)B7P{z!fqCiTV93fLdCSXujQnOP**{o%Bzq6SQoS!O zs(X91{pQu)(g-XrJ41VvrMq8Tg!cRE{gdVUZ{K+LHf6?KOh<FDeYAJH>dme3DZ058 z8tW^XUo#<LIRx6P+TaUgu(9|RB?*-#r|#@iVwbeNwRpD*b3?|%LjB5i3-b^i)U_b| zl&;63G+nP!cA!UlJ3D*H&d8r>7b5R;rzPZoMU=GZA;`S($CAN{K78;-J=3vu9042Z z@+r&DGZ9n>Rm3Q0v((;=;N!=v^i0}&tCFj_r<uDY<^9n@+WVt2>ieS<{r!<A<QY@m zALVQBX{V)bjibdB_($b#ha<h?(>HO6^K--w5W}g+5h_g`jz||fL7RSXiV_beU$-&V zSwMnc@@^cVMtn_bypetsAHA&)FSs=X+0b&JpOsATNMUu14=m1lBP*q#gNd*chv_GG zeRzt&BZekODhQ}iBbjcH#|EoZ7oj$w#u<*j0Ko#YxjAMLoRexo8lv{tvkGmk;G%nT z!c3){<Bm!c_}?-0jxS1IKs0<Rql5z)S=nJ+b#D}5V|4^}^CP(<F<(|1C^Y^q0jcFl zf@fATa}`Uipa@+j5ldf5;icjUJH{@5?Wf{TSSQU9t4{7G?(ZO5<lQEfT+1$5T~`H5 zzs&Fv)xv=$@@>QwF{-_rjJi=w*1QN(*bdreV_7aG-r(wL)*J_)0^piMF?SVoY%)Vs z6Qix3uM$P%E2h%GabtDvjg7YW5;s-u_QfVw_eS5`QsJB?y(9`xHwYZ1kPB_f^n`1- z2xT#dC}-wCvOE}daxUY%Smkbu(t+6TwOGtykq2qW%nGLcE~aGiJ|t&82$|A6cnfy& z2X)p&rKoF;?S==#3%G*?b24qJD-GLfsHpT&N8fE4bqlq|JCQZMx|qbm+T3k=`0D7m zF2`^%9q~W2h6J=}D>V><u~*kSIMiUcbuU-}L!!;Y<7d(w*cu}m|89d|b2>u}c+HLv zp%Z?k#E;PBZU6~#i5R{XaW@iR0Y6zJZBxMkpG6Il9u>pmaTN6=(mZGdY_|LDMj+e> z4&S}5iKro%%2-4ym2F)A15R7R#J&sDa$3r06j{)463I9o?r3S^Q6hGQUOr#s3K0ke zj!uwvD`^3MzL%Kq62F^#mlM1?mCKo?W*#p=`&!C&H<Zk!?Prxt&ntU&D@unfw>AOa z_^A6fLIBHaG}j3-V-7hmD?euG3B3J#UI_dYsreRssIAv<o}|ny2tU+X;sZ)(@z1vS zQ;D=b)HcKiDPqDZo8k)zHE;L;X-%A@q3^x-vv*u^c1Bs@oG2<WZ$#a3rpKVXs#WWD z(bnY0C~sa~x2**YngQ7OXfC_Jsc!aV#cHT0$a4R4k`}A?j?XKwVPJr3#&9+OhlbAC zh#btC_Yy9u<<C%|qiGm8eWcvlwl~r${Ob4?((!_aDqJwpS={!h9HX0sodx!GRg2X4 zNI5W@&8$H~70Xl4vrQZ288xX$iUp^Jci;+8WxSr?EE6Qp|JL_cwyhtut-k2M=fY#X z-6-gaogG*{u-v4@@5E=-LJ6-_ZLfSxN%}-3aTJuGPql0$QXA!xQUlH-uCrWWJXV%W zeo>R}%dVIVLKoH!(q%^1jcU3F4b33QS{8Dmv7(p*MS#4)#V{ysC`lq2AwH-{mnw5q zkEKxK8($yeOc>nQfoyTnNF;_*L0FXXW(&bvP}-B7!UD28DcKh)^pcu(40dv|D^%_~ zFN7-yDWM;p?9yK++Xtiswa2Km*H{yJ(5`wgWnB8UfU+QXd2o_D2CCUeLyJn&P%0~m z#PKUblEPCfW^~bMGvTC`G=^~vU^p)RBUJDd=OlVj2bdt(2N<uslq2j4Sxs^WR{-f{ zb1eqLFuHl1E~~<W5NLMS%NJ(zyTvY}MQ$#ZBqB9M#tPXmJ6VLC8zL=AgUfB{Nv%3U zvqC%<-<P+{dCf?~Cp_;Zmy$QWLX1`Brd2koC55g<ccPi?oOMdX@hGsgwbr92Pij^a z859)eMDei0?Kll45nQ+32;%5<<a-~EV5lmEipMwk4DxVPO{<l^@D57u9BZD&7(fn) zbQnw;JZ%endKS;l>JaD~s;spLWfY0&68QX})kr0$h8!(KPDiTwlH~M<$pmo!sM|01 z398-wFGh%>*%qrI+GZ`5A=-=319r3HTdx<LcfeGX`Cp|CLIp74TLr_LfEJLo2IOPp zf^gCl?0f3)CBp?ZtSiC2(A;Y?CFD@hu&2edY7jjW{Ek>6pW?Td4h+H$fbUK#Hd!uW z_jFvGEE%R^E36bv-%_;ofAPz;%x1{z6t{+qBjMQ{W;e*~F)Y73OgckrdnArqsoh}^ zyZ0TIm1VaowLn=r)_H(r1l23NwOv*<by3(-sGM=Af7Gd$K`wIzrY0cC0a7))!WoAw z(x7J&Cg}FnX(e~0u+1%$^58FReuG}CSbL%lq+u{+bEoVpZ}<O3!$_C4?RHMtS1!DQ zkkIGnP$)WH6M%SQSw5HL1kB0<XB40U)_n={foywU{PZyt?mj#P+qJlJ5s@QTj53y& zXyVBPXsL2Y1_W!PZJ`HN8jxf3nDIfWVHEArSrm<%ql=4LLuU^>qQMI*elP(69kUDx zL?nP7#R0^IrM!aTuZP0M=c+TO9NuUCpg}syvy&8^i}>ElEb3H|DI!=Ci=*lfV4Frg z)$H31CP0Tn-ho(F9CzM`5+IlijI3WC<jQ;oRr}sG?C`pq-O@&xw*bWHm%44il+xEP z{JV~7mvFGwN#I#+k0-U=kILH0V&>_{*+OsGbH^)F(yB3ov$^~OdW$giI}m|SC=!Z= zgAh&d-x7G(;c2av3f=CC$wu<hHrkzd4yBuK+1^Z3sbl9x3`Xy+u12f{d|Wia+_I8c zrXt>68Zcp+UJQ1o3h+Lu*`3CtL9ZVvo#VHlrkv$!n79~X;!}QUvR|&n$nlC_LB2G` zuwL*RIo;JT`K#V3pQ1TTF}Q`zm@zHy%5uR+eVdg<S>dZ-c&zOf%ckkB2E~ep7(lcX zln$}tS&QxT#mHC>N<&<9MJlPG0qX{e2n7e!)L2BBV14LoXBP2lGKgu##+RNo!mxPh z%cLM#Yb0Xwm0l(~<jIxtq@*oBeyJK2t7F9szo%U*?@?@VZyjTMi#}t(Yh={jnauie zc9oZaJ;1{%>0m~a&(Ty=N~?1K#E=pVUG~RVPtwY?>W2qM#{!za{6+5A$PE#A(kM9Z zUtCT_WhI!RAcJ}nKS!U;!6zWUSEt8EHIYMIm0~gEW}m~;4-Od^N7gi*&p}>UeNlc- zeq>Fo@db8=h9wP+MJ_i1&+f%9E9}Q&?(XQrPeC8jj(W;5zLnEpZK&+6gb{S`>4GoM z`Sg+^grkvlANdz~5u!Bdb9CA74kCB!{X=}VxCHswP4E!jeBA;c-)%_PD;&F{aUU2k zVyt&g4tD(vvx)gwbsSiBUr6Qaw7L5trUcsYi}^k(v4%5odS)!5c*6+PFUWXRm&)`j zs$!M<yFe$LF&3YiUe&r{#Oykj5iWM@7~rZ_7ieJX&KEv`lhnZzQdY-LXQ5=1&O9s# zE*vQp^fnQFJSoPIE^v;@fCuCC1cCpUw8j=TfX#KigO`ESX7dHx3E6oW+qbP>@Mri@ zhGa&vf)VohK8i$67MX6z>ROxdmY*MoS`t!qnOw&7sI$wkPj-44Rsi{Bc&u!{`3~uq z2jp3~!tO#IJr@oxMx;>MY30#D2io4GDmjvVxD)NhcM<79GcJ{yh{1>=s$WbiykYPU z@#Mnbzywz&hvrw!{_cO#E4Shnh!85SJ&*XR&=ikvo$ln-5$4fpNLZN7#Dc`q(?D_R zfcB1#-X5VOoE~Q^6!zNM(um<DrEUBbD9qsI+Uw<^hXf0zU639i%y0SwoqHQ8c|}eF zUC(TuLwimr#*aPkGbJTp2r394xx7Hf-`1^gAP&Wpb@(faS8rJI_dvzsri55RHc~g6 zDojO5P#%_~iYJbC-uK19X#mUZ{s2v-M(3uEoO_+qNk<G%1`(G(<qvbSFhlkkH_ydC z#^l|QH0vkgs47^V7_XCAWZQLFvw7Y88V2T%YsA?!c&!tZ;=BQOc)24}&O(=})mWw- zg8o(gUs<XsA2gj4l&*_0%%DoY374VBk2g9G$ib?8pE8GviIaD+1jI;T5<Q-Vj-;{; z><j&RNMP7C6^Gys5D6<8+N(nZMAL~v#IYp8@)7fosN4SkaQl9S?S}ZlhmESt6WB!B zEq<HpZ*$?|!j$#o?BVf05ooGfga!zd<NnlC1SgM!w{?_&Kfu!tKpHwF5?fu?7I0cq zg9tg$=Cv-kZurtyqU4^EqaAjLv9Xgl>Qb2%(A?x5lEyvfyV!1fJvxuoZtRZYIyFFN z4Xala<~t77bJh@qei;n|Cvl}Wi6a_a>sC#ZWRj)?CK&Ow>&&e>bGz`XRrob{Fc<B$ zR8ZCQ@R2BCme0(q&iLIl#0x((Z!Bi~F9P1^AyIW!+!yz)%CBkt^-27t&D<`AJ$>Eb zB61<5N~b5aKTgrENUP*2Q54B>O$0^oROV;=*15VG;h_L8=L?yG@!O5D0_a{sMC_rg zY^8Go@CwF_^_8VM_3;=Wj(42~V0z7Q1k@x-)s$qIYA@j@hC-Dk8I>tR^HYr48Af%2 zQMRsBO(z%Ke6)`LyxBwX;K6I%B;ZszFcTR#OC;b-&8aE3sFhXIS(~h+nymJ#9hI|D zHxe35r5B~z%mc%M$1_b?X(^v+n{a6_%os0!j!tTibiN~<cx9$M&7hdPfJt<{j0tLf zbT^;`fTr+F7dxHunve{GO|Fx8B}2-Uorhi}8^zg0aR$aAtS6CUlQ4xEsCNN0SbIHm zT=Z??dazoF@n>}**+m2QLmFI{ZPsB0inV2F(NZdf3Ok}j_^Lfof1_DC_|J*oZtO&k z8L7%sItonEl%n`I1!{KQ)^cqV89ObaZl4(|Co8A$3C+5O5n3cmZ$J&VnwLlQHfM{= zXPG;hJ~I{xW7A95Mnu<v2S52X66#Bv@Gv*%<blqa1DsqjW?`VC)fV6Z4=T55AB|;j zBp;g~CK4AwVvbT<bgrod&oRprw-%G5rd5AYq*A&tRp+rSP4k#bQ?WJU<4?={no8m9 zScVx%Ugh&YNWq!}RPT?EPq!z72<GDS#SA1_r~CVznmvKZRww&AZ{O_h9ld>36Y@_Z z$p;pJZML#wt1|pqepcyqSS^={Hk2$#!?-#cEVuNUliZ>&B^HL)(s^oKvkQ|<_O$=8 zp_Ubbd=%Tgi-I$|TOpphO^bKork$(F>{`?LOEMeK8&#07ac7RXMMWIq=Rv7{=twja z&tXCO)4f`q3Lw2{f{`8&e@M_w##q{kHpnAti_e9kX_=Uqlg!dN-wraf;f2UgP4Pr| zx^Ks-M7;|_8@xjtl81~*3+=O<cS^qFM*JDiBdYcmh2p)A#GHTEa~G67cnfU3|J{ew zfBeLmb0Q2Rdn|lwmj=bJa+aeqO$uEGJf7m0mi2?f*}kHwq77PX(lx)!wrq(VSd8Xv z{Dd^`Ht5Uuzt)8T2hHa%R!xWomv<_y1Ah8Ro^Wl>Va}OL!V-09+sn}C%`4$s8#lLi z4^La0t?ioi!Y@VMeggW&3EX$5aFx`Di1*x4oDnX>)M%&#<-oVgV5om6g`%ksdj^$` z;6^MIVB~{+1;$JPigdG1r~&ff^pB5Oqe=zwi#vrjOir*ez-t*~cQ%niU-u1JydNo} zRG@w{qGTPx%o1kXknERMRf+|5bt@EF`ox+Ra)eUdkQjxjXq3B97X&B1+|LEP07w_^ z@mt}NL0Sp0Z<<7F*b{2_FklHECswKB$BZNLhjm1dZZ{}XFiZ2zH2GrFyQW#BNl1&s zD4(s|dWX`Ja}A7F|AJZoTsYm%5n4Lc)Aed9Xpp1c@!P>LWujl<bEo3*<zM$}e3Ur} z*e6Zgcu(4RLY)+4Mw(?eP!pAz#fBukNodkukQoFZb&W|O)6q$Xh}fdg2j&eXE~YrH zkVDDH)`d<3tbwF4kQ~*Uz28MK3FLngZPj8bw$<piGDxY1wxx*Uh^SFvD^O&oysFA0 zF}@95R;n_O=$$PGFQ>~Zsmxnc5pXVSa1_&XJIlAY%CDf#Z<T1b1M79SkS=kNem7XZ zcS_2iOi2krC?FG61X(*LcUsH8h}KfC*q!3?$0;uVN_t4GffO>dw82p-KIT!S<}O9g z;G5jrP+L0vEj)Uzfwjdi>iAsDD6T*(c}Vq-eP#<rv-N5=%vm@CX2Ct8ddJ90d=ucr zv$Ei~=j;JyE#b<h%=|8Qk~z;nB8nbmQbX%@zZN~v4Toof?!oGpo+;w7@na67%@WW9 z76%B}5o#dBkii5DcJ7JM&h0H{uP?l8tTVo79s>kP5lUY@bV|4P0}<wY;u;r#KzXh8 z1Fz#Bd>h{xFQo-0zT*IX1`gnkZvSQJwz<@EH8;W(YjH!Y;z9tXa!m?fxD$fbm|_^e z_KQ|4kj~>tv#)lp5@SK-m?At${q5@P%Mu(dAG+Br#g&$SK~4CgK>xI73r{6w-CA6; zE;Yx;5H8|-snnD9I7t(pAFhNpZ=mn2fL^&J$eoSoPh%sRZvuL^?^m|(@2oycoUk9Z z?@KTK|KcO!vAJAy2PEW~D`U6TT0i8z(YmOW91B~sWv8-O(Gd}krrWYpE^DQBXQcL1 z8mZk`p5<7cL6Ii`7MFNXND*zP^rC|z*|{=R(iTobvHOQ=^Uq`q){6CSZ4KlbNPA#* zVSpExWC|mLmYh=*j5E<eRcqx%<d)&b<hz$_8HjA+TA4m}lq{$tg75Y<@E8@_B*W~) zZf|lR(oD?iR!|*2j8~C3yFyog2|Zwab#+sT*R29eFlY@&IEl8b6k%l9xEbsV<OwSF z6vN@1jl%$jHjx2|p{HiEX~}AFf5>H$03oskSZFz;plP{`2AEX=N<9OT3!&lthLOSa zY4wf(Gf+ojt9N>Hf%zahSMV5yM_56ksd`Yg?7hbSdSJJe-9w5YvEZ!NDgOTyI)fcR z`=y!?f;mzySwjDjr-gN$ep+muUExzBe(9@U4m;OJBoTEYKiJ>zj#|!9!@7!bqAJF> zKpn9DEuTWxk>E-o)INq3g3$MaKCnrkRDHZf5-6)ySISL|(TS1$`VV%0@q>K}N4x0Z zzTM+pWcGtr+nwNwbJQwr{Aa1fts1|X^Xgg>Feto95rY922}l@?S?X^ciEM3dI+fIP z@*7*kP-AtIPBWS7*8&vtjtZ`V3Z^}oz8_)aB+pfMq1T&LS-NWNur^!nzQ3cB#p$GD zcyl+2WhQY+dYRxW9V$7V!D9~Ih3IIavjS?5jc5>EMcRdjn{~(pY#&)=B>yL81Lc;Y zWHI~7HzyT_@`lmDJ@+L+u^S{JZaY@cANEzGPJgWJgjySr4TA)XMs}cnr-8J!OAl^Z zgGkmGT^t_V&Umz=Oah`rE(@%hJb0Q@2lUd<>O`#(D9JH+=YH>+;wz@ulS}B0%($(o zI5=}Ey8CDZ2E<;(Q`-Z?+eYf1sT(W)s#r{sL&e2jv~6TcRygtjVITD}CXfZWEsFV{ zX_%+%lOUQ*VDFomBn1VvH(nq)$D?8er}Z5TCyJ~em;FE)86@FkMR--4IZ0H^UQ+ok z($|lLeFX6xM%zwC-_A&xq1vRIq$#@7G=2r)mIx)A6yquE$+t&x1ZXwGEId3Gh@LJI z%u{AF?G>O>SuzGBw^gv7Q%|{1<WzIqE*M7%o3y9%=48$pldMDj>8_Nl7Z7)5uY_?h z3k@z!nUG5-kDzUX<Sq<EHaJQ}pai4gdUH#llhc>+=z2CDjfL|LQ}9%B#nkSEkVWFJ zxyygI<O?i0TxYZM^L`ikmJYoVZ)NFiLp4tzVVH5C7l>nBNX)Z{R&6^54_C@sNiz(j zS2W@-QLU{8^Kph$gr_O1;Wl-Mm$qkPAWRcpFI{P*no6vMip0QECS6&sr}Y}tN6wp) zA$9{{)mM`c6$4unr8T3;<h`_vm7Vg(hOHs<8TzM%Z&4GQ6&dl&smLD&^(qD-?i~%( z9TL`5nXDz-?g%i%#dwU~@{>=RFLw|Sl}rt~WPRD2yWMCP@=<iBCG&pI#5@umkUso} zogoa@;@yoKGxby=$uiYH7LMz>ZHo6gmA|7f@K#lAf6o&c?)MA^Dv673)kyQjUV*20 zpj^cjx>P4He&Xv=&Za^br|+tl`)_vl-@FQrPu{<LS<|OqEP4P*bOOp(Vj?0K+CZIS zDW#cl6PMhF6sm{>Ivhyl{}y}*&1QjSe#0BS<NAaSi^(9K<xHud(KzW)1p1W(Xr`8L zXHyKHudXOwLg!EH6JChQQ)Ld2=Bf^r)fmLj2l#NUq}fd)_0jCK^n};(h|Jd347WN? zwwnh#Y69!inY*)1tr11g*b`||Xw!)#E3&oDu%iC9)2pbjUxS+@(3cp(-GEg4SAo=j zTOjpU1u|nhW3~{nnZ?5*Ii-qBx~?G3ZR$9JC;=sC_=i2r9@UTgXP7<8o~+OwXu}Qy zsrq`Z?;A>zMN7f_M7W_x@uLPaM*GQ%&sJipd<ik}e&Ky9XM+7*GmCm2KSu+;vHlUk z_x^NVcdEr>!$=CxNo;5tI|wHyQPJe*#d^)_|875^U%vi#yWxteSSpXiE;qS6SWQ%< zBy)GX<GDNDncN+D2T66&9G9Mab87g+Dj~kd_Y)vNritn41Z;-v7+>a?T4xrvhfWHC z!+s#Mggk6F?zf&K8aqe%fk_OJ+Sn|EJy(>H<J6OrL&0xU6AccA7hv0kOM^~ODyJW| z(a^$RBNVn-4R7<PTL=OQSR4RX7nAsys=Lh(UmYFSO}Y^NCmWKx8^EU~*kWF9bbMp* ztLe=K(Mx?<Ve+l`Vt3N{5<-@D1QcreZlyW936ojE)|;({-=_={dYz2S1;oyC=s)r` zNM5pgc>GNAm)3k@={CgRo6dR>WxW?0<9q<KP&YRMfw_7}0K66MZ#3Ia)}L%r#q()R z<Y6Dmq$UZ-Jl~1P$OlC4$@)XN4`mwn;qe&q%}Bg?w?Innw}G(I)9vuxYpg)k(JvDW z#OBX}+)VMIJ`bU}cjXQYDS@PzegEoOtakW~ErM?~A$y!R7%p>@lF5s7Obo?RJ+}z< zgI2Z!R7JiIeEv@@;q2t_SHzF`s(TZ6rGa2voDbGUde<4Jhdn{?1mWW$#N&MvdeZ8_ z?rCJbH;i3m@~so2*(p+pPm%N1>2uEX6xfLa<E88AhcVOG6{O%ELvN9KS3tqwB?O*2 z6oIEG_+|Z@k=KTsq3Yv?$ukqMTGirL(JvZnBigh90@=i=`*I1|OSdm6eI&l#Jbzex zF|EqA8$KY_x9VBQm=il6%k+Rh2>VvCli5sDC+u(4FzapI7h^r4C%Kf0=g&hRC!#{> z@>K2Lm?_387F8=V6Trm7LkovI`}7K7|9t!Od+t(hIbiQE3Y4Vx67b)9Xa-O>EW2l9 zd{FD*I^T>pjT}jxyxU#jh<vWOQV}k+P{R34fy&0mYNgD(yugbvpRadWdM`I$h>_Q- zoeUP<Mk|}GOz>dUCAiCF7|UDcDO06|lR1f^!Bhq|U4Tp=@l>F<A`V2nGVWN#AH*uI zgi91GOe#y%`O@jeO$Q_qcd?+7syMn7v9!MK1U!&!Z2!K!a~y-d;|T51J}CP0ajn@F z(nC=bn53?tLDYb8q(VYXMAA;C>$^wF36mv3E_Ia<jLnboOxXRf7$Mpl#F8-!uO|Xv zMUh0YZjp;sUhllFf~T!)SYUu7y5!iUpbZL7>Hd@21@}%!7g(#|G^}p+hsxZNN07x5 zDZaZg^4P1h(J{nMohCn%j&EXppN_dGnccxotiMz}o`{jD#uI{;gTlB1p&L&|UC?d? zJaMz~A1Ms(4P+e!^4F8hU<lDZF`0HC^NGtG+XF;cI6rlUGZg&7X{gyjqK#*Y<^7h< zgq$Y05Mm;o^{^r;v!+@?5Soq9Ft(r^h$Cy0$(iMK%PKmQfk}!%BCkyBP**^wnfW59 z!ost@Km1ISE~mFgZ#d-P<m^u(oM4jHLnw?0Z?Oq#UW+V;S`YnLNKU)jdx1{*tft$x zW=UzLqdJ)hwvAv`yqOo@&ISVCq!r73GiB^Qb`T~YGYQGj`%r|`c_<t|t=z`b+_4Hx zN!eZRZ0<2d7G;Omt}WF?F!V8tXAaK_^@Rkq(=p}>UV8u+4t!VXa_xF^QSWP_-dAzx zOiir;Y^~cMB6<~JJejw{s8(^?i8x{ZNj{1#yJc39WbV`i61V2BvPXNOXJUM_IwE(4 zytvwro@}nSAFsCq7e_G!fe5<_Q>!JrG%F(aBCZLkUdiDXIL3Qnpf#-;<V}@Dc=T+N z9Di#62wG`nNwh0ojFC^;7W*w7YyGNnakouQX7MH2oUo2)3(JAmQyd*U^MNKuYoN46 zz2$m-0v^v{7lcZY4rMOso-<GEV=gWV>Wu#g-C-Fs!VF>JpaXwh5(^rB%bGq8KEXCW z2sXFWR4PLZq+~(`N=$)pYQ-{}l@iOmqsGA(`I`d4Mu`~!GFKT0#@jIsuN9)MpxBl$ zI5mpHUk^9h?N+<JwfR`QP`pNn7APm;GX<9`)FKhu*u+n<HiTnu8~DMQD2atSuU3lH zgC!g42aBfy3q<`3-?^@#+)Xt{fy8ZMliN1sZHJrmzGh5~!9`|IWI>F$<(v);*VAo# z-Ric0?Ve(CT~oc<OU7cr<^j7sF!8_`m`FY{u6H-&M%|8;SA^X06%#;&BofW5!0a8a zl^VIW1D!Ay*XsI0A&IQskp^8!c!Hs+$BkxiqylLc5JLolHcIxV+^8IBGM%MCG`yHz z)=$uP!8OJSh&ew+K5X3SPhzNrPFe{|7wPLDaS{d#c2_%-@$|*j8Q668FP@Etd!Jz$ z>qe3W(9COc{6z%JNF*?UO@%_Bgjez(Mv@KEH+p~qi6H9He#9)Tg=nsckuK^{a|+uK zcGAv^qyIdqQM?^*`N^&*Coq{=8IUZ&*6rXr`ofz=O>rNBnFWYc0(BSbz$4bMg#ztD zNO<0LhQOfK_4O^}->@nY;|q{=buSIh|8e}F)=)<Mw#Ee<-}rTzIUtS^x;sepo6QIe z4&*U4W67If+akH!nT&C8<Gt&si#*o1s0p?YA$AmU__dwwqj!5J!Hc(tFKRb}l#9s` zLNMA&ui>?Zl!<RM?|Xz<q2U&}*0$J-V0N;7uzO1=Wtq=e%ksxZ-G;e&K$I60OITaV z^6}s+<-((Nn}QTdBw%ri^#s6+SVcN^ygI}WbbeAC5>uc!!a+ING(SU-#wgJsGgn5j z>ygJU)Od%O>`kc>F#^(1n(0ojm$gdfOycY6T_=vASr09Bx6!;h*P%qn+yxixUXYqA z9)A(?_apYk3{`2P>Z+TL_I7smenJ9Dc>UWFNZdv=!jc3bl^&R7Y*Y&ngJQ?X0R3@C z$QszsbAXcb#8y(NA=E)Q8_XiA)9E7KLCvUNd-UB?KxV8%pSm~ZnqDKer!-~TFJyi> zW;ouaE=bU${;6UrVd8?D6x9h6?8m^`b*BoXzd$-$C%(h>mJ;sJ?m=^c+BD}~e=wr5 zxRDcbu_g@W#nYbwrPE%utYWu!a#b`Hiisua{+W>I%96B{VA}bTMysBAtON3SY!yg0 zoHr;d(HX<aO>?G-k`@cx=H}R1Q{G=jO_fhDYd!-fQ&|eAF$q?)044Go7&y{5!k7%y zlhB*jYx+cieeQp^;d$Y!_LWup+R#?Rg_cR-VwMQkh#kP+47!%=p;B@W2+L~tuL7t3 zW}Pu4D)xzWMxCsq*44M%$=YJ+l2a*bTJ%TZTPV&t?r(;;<Eko2OLx*APmfRV3aYt| zMc?2?xL3P}^TGkapYRo??56Rrp?g+ElV+1OkY8$O=ePc^VF9@VEd`xTXcj7vf}sge zU5yXd(G{qxrjd|2I0)9{lUEvLT!Lo}{yLhR^@T-)0EjR4T5>MhYBIjlz!J!te3>E( zpLB8bV4ixe^k6j0rreCq=6{dob!T`XLjiZad##zkDkLYBCIcWPP38%(ou|}4xSP&K zlVKz!?IACNb1{wF1}a5o>?z>g>3`^x@2v_&wQE|W*db{l=y*`0wg1kx*zb?GhZlqB z!RgD__m%DaX5&8Sdrn|eh5jz)zAnD9F6P{>f1xhWpM`p<oyg5i6up*GU2KUm4F*%+ zAm%C6V>Ifa2Eo?mrnl1C8eokXWQ9|qug*=FyR@FgZs#sGyRL3wo!Kq-vn=sT$ea2W zGXEA^<2G`!%Ps8Q$u?DT-vRh{d;eV+_@P5HFx%^Xl3fTpt+YM>-BUFuDKn<Fm#?_u z-6GhmFM6+Om5+bIu&SVF>3yViB9Y5#nc5Tw4+Jgs)G(5lR+<VL@QQ@qQ!JlLkKG+J zn~ri;%9+#OC!O&aMBZX^X0;g3(4IhS$gFy~OOQEU`=F#(%YeW}cT87n#;}SaoZTS+ z0o4SU*obb;g`UyoCX`W)&@jUwQ7zg)%~Ewm9oW@dY4sea^3YV5#=ryDU(<KQKrnE} zPyB5B1m`BIm1RkLp>vvgMhj5)EE?QeoR}4--X+L4o4B|1PRgvx2zM*9Vj)79O?Z`A zQ}MmTddE<Ca?kGcC!j~qA>3vYZnig@PoF$$$$tf!?e+T8V#`vNP!}YmiZT8<w^dQL zpfF#sqU}|LHORZFOE3q8xr6LJ7vT@eGYF+QgeA9jyC5%-%_NjVq9~gHFV)1?n`-)> z>W>>+hHeaYY;ty?QZRCh9<p$^8lmYI8H;flO-en>1g((8k5q|-uEY<7QbN$?$e6j@ z$Y<dL=9<A-1R_U_>4myJ41qQhY7+nnDjy1YgRyXwcc&G=GEGM1Nfl$M3v=XK6<55+ z%IQuEnC)?)x+>*M*?C5LYe-rwCIlmffy4{sfBgZDMoo)~Q@XY$>cLcgfe1Qag+He6 zMsuZ=p5(RwLN_qzkLwZ8Q&R*w#D<Q`+Bw^iRzno-Spt#@BeY16K$<*umaO(cHvZT! z27x;8LO}n&K!iB7@T6~v5OLWxGwjSjz4@gN2Bu)kCDS(^oxG63)z0Kf8-rP69Sl%y zTTc#_h3<6Ano7%J1;z}NF{(7=QVN1^63U0#XA$7WxlpMH$&t_uxK}ex@Q0ezt5VtP ze{7RdgJ$KJc1e%SzQDXuL%i(wdeP9=7X=gNvO4;DPWhyVUGXBR)l7-_63j>EvH2+8 zM!~i95e+gEfFX(Y1jIXiS+s5sI#HeE#Ekc+k3vXnu2T5;O~*pzOtvWy4b|gh@{Y5S zqW7G45mi#sul3M@dTN><ZSU^CwVT1FgZCNiXG*;bE}RjcReNIfyxLQH?S6J7YMgfy z^Q?JVbhxzfWp6sTJ0cs6<YS9IXFRaPnk3m9Hv0^=!va~A^!ix>F#OoIWr21p>xvdz zFO8QJ6QKCm1jlO)^(EY?qc62&g-oV7Z8kh;%gUJ2>i6+<ADrs1Uk*AKJC|rH+B+mq ztHC^t<EFNp5KQ)aVK#K}#tHLL$m|o|U`aMMF*LrZNjd@EL%q>eeLVy*bR+cCy;eeM zU*T7OA(Xj%-^gM5s7f{cZ%@|iAe-^@bZRr3eh9UX$rG9;6;D7=?>|NGZmQ-d{qRLZ zNSIG*V<c&?5@A%e_bfc*Dm_%kljw7QG>cCtS6TtrRmTm-`cBk10ZEs@=1mlEuQ2B; zFe6t2SV|!;n2z_}{DXfu)y8^4EXT|GW4u4!C4F@})15*8>df;U8#pe!wpr1q^odip zUBXvRyESV(vtqxhKpTcJ6>4K?8AWbs+h2JclO9Y_ce;IYvc2<n?LVdcv)g2-BW;Y8 z&!+h<jJHMXJ&eSU74X`ut6G$EyC$pzo%X*48;{mAvmeTuTJ<egV@Ly-j>Lsvx)RS0 zQU0fKG8G?w#oo*#gUy5_WW74pBZknK5<0_6ybWsG)L9?{ECiTwJeHgwn#BWG+ZV39 zVXzyWchGxEMxh`?<g!WEOe7u&2YSnhTZa(w`ap{;ot~Y7W-@YgC0lODr%hFOO)~;i z%tKf_P?GI(U4*leGcM|2TLxyTqc8wb4&FH)!lgD+!7-GA>G2cJ_YM|=6A`4vp5Z&E zgnO__f@ESaq_xu7UqvJIfTe(-bhF54u-2g<b76Dl$=>o4y^w#=J(`?I>24Z4$?WMT znTcpB-=-$Nu*z(NaFg{2BjL3ht29P&b9?vjw6)pVwxdznL&LkG;&IQ*%k=yc<a)M( z9(@0d&y~s<2nIgcp*ER)U4>n-#Ec2Xi*q2x-<&A|d9)lA2}DKrY~0@xaim>9+992( z`xXKuL+?6|T2DnW$Hl4+rnW<RwXn~9L6>{iIbNRkdppF>-V3ZMg2_D~*SSC@pQ2;M zPKHcHb)UTUeNOw^g8@11n=)~q;+!B%#RACn829~k6Tao?ZvLi(t_XSW>xSIpp84<N z8>qGUc=O5Dqo<oeCLNPrKWSi|Y(07UbYpYtX*&o~qYkuGob#-J1DfYiu3H5#4^|iG zKndE41TrWV#{ea4_6r_oRo<NK%$NpNvZ}KGzAe=n|9z<Gttg(9$t@bLpcB295BgXA zDSy1K5Vle@FAq|zv=HjxL0<`)YCF36-xV(59+NYzY<?NFSt-_*#y)v$S32hj`P=fa z=MLWURRA^Q&w*|VR?*G11O0kApqa9*8^QS`L^3j%2HnMZv0m2J7(Fc>A|}Dxh^}=V zM8)FEv^1yr8FI08hC;rH7m=@ymeT853(TFrbMRzCTDH+zf4mtaSw|y{(y?b0F5bz& z(i;uN5wlU~OXWaxG?G%klt>&xUzZuz#gdn)M1uJ(SnX6so=}}ZoGA!ph!8=9_@&N= z(_o$q8J${9s&2Z3^hctVK%rPR1SK2$bWF9ek=B}Ky(dv`s2Xi4PF-*=(o8^D?Ll$9 zeP2`sSE`5gR;&3$SocBpgnD~RTl!&aN-_b^4cn4g%VY^z{YRTm+UuHu@<=M>TZlLl zzcqPSEoUm|D$8DMAHB7TjoPZ+UT;2q+*bd1rKI^cQ$6I^0;cF@xb7mw$j?%5Bu)8j z?MI$vRkkse8N+ro8J%Gwlep$qNjJw!H#TxqG#_eUOBBt(fgnES`rc}$Ns`x$F=4mF z^uM*8gME-ShSf4gQAtCn4-mz$KRwnvq*}ms>O+k})lmHnpT%#DsIyRv`3z8<%aCD^ zg5NghgUX`V&Ox#5b>Q&eXt400d5k*v{i~~}2mb$q`9hd(<zU*%MKghg2h*cy3{gSV zW1tw0kShB0bE=gpZux6fzFvM1)+FQ)k`2H!y!UZ*d^P&C*k0MpK|X(@nC?Bek!|^6 z)4r86?@#mQebWyCEP2Kmo6k(mquim((Rs%GvOnw$mO8|b^LEvGkyGs8QC-N|G24dN zf#JCeswKP3=#T5%+3)7p8;1#zT#9owXI-mVmul{nnr<|bc1_s~L4m8(VG&yS*R#1o zPu?HBac|I!`!jK8*WS!e!KSNL?CQ=sO4fZ8W^Op$X|?Q4nTb<78z;}{Dsw{?x*s#~ z+seeRm4jT~y_kJ%WFoeiiCEsOrCt|+^ZxE$X>6V@g^lR4T8c%?L}w!toySkNnwwAc zzXBV~&n5y(@b=)KG;)tKk$aRkS)$M6vhD4hyge$7%#%!Hp60Hc?6q2o+w)+Q#p&hn zdD&cECXZK?!z*$_XWh@1ks7}-^>0gw4FQVwTTE&#mBPy?7^U3ce#<oc>d{hWH<V^X z*yCDVYkID=2c;3Q^yYS*ud2>hQ%5>L^8AwZ-u$5m!IvI>X8+yxn^y;W6gvuZ!pe`b zp%R!t!o_uwlcW}^L~%mGqdNSR8NOqQ#zXxEkyq~<MWG|=>9sM_v=w}ZO$DxmjJ3lC zkJH@XA}9dz4o$8Zke+JSn_E@MH(zu~T|e9eq0%F}7>(EnrY;mC7P$T@x?@8wuyyQ} zXN|J9jorwZIB;||)*G-v)H2{168ohE)MpKXo6E>ku+elKs6=~%yf<KlRkci;GLP64 zgSEUAfo6|?e+GMmZ6Tck$G3$jQG}>xHVWS<I1KH_D+1`#fY+^{`b(g@w=}w1{Y`3n zAF^vLJEEyfd;rVyn^`SdtX2Rku=doqR%WTzM6G34>P^X&ViR9_)kqD_H=7#dGWajQ zbbzLR#acT3GPib-w1I5B4lSG9O0J06ZN;_c+)lu)XDO9<HW7i${yUNRStoi>ABYTP zIpHh94g+r7Co0#r+J80ezxq7v{q12A4E61yrl2<mx(nM_$=KC|co9v-Kqn4$^9sl# zWil(n*4T|O-<kIg6DYEJkTO6SwjwACg85@jnA-AfV1*1T8uLn-4cc+9ibe`22QIjk z_J?N_&<zdpWTbJi?SzA(&|{~C_v()Y&a_?n;~2Bb2|hASkl+^~WcxGwBnQc-x#V9x zzQ>BQP4y`Dz4J9YoZ}Llt<24E^v!5^lj@k@bE>e+5V_ip7DTdYX?2)Bs*wfDA|+Up z3J+ZsbE#wx<sz-6RF$MaQ0QipQ37Ef3IAn8KvaVtnwsfanm#E|?8tKZUy*v@oXmr6 z04ESiLd@KEfel!u@&jix8Lm-<c~UrQ!|ui+ouWGru;X^0p&Y6O+D*|?&52D{&5BHy z5tuF|E}aQWCoIU64Z_-*rF^a~5TMSm{<jcH#=Ic@l0jsAW<+^mWQ6Ygdq$?KCi@A} zgVixtH$x0oxAe^G&d`<BEq)<i*+heK8^ChaEw%+5m)DF<VEOTuiDKvTx=oFPBHgre zBH1O}o{Pn#NONFZ*}g1m!hT=mbj{h0W$oGXpnlI?XpE9GR-5g=LPkd!pxCA;yaCkO z7T5^p_R&Nqtft>0iuLf<DYFixqgR$E1i7b<FH}06U~9lxNq^N8dIGy$QWV(6L3NqH zn4a}c4_4>7UouvgT@x!_-$M0EEpK5WUx4=Jow95vac?Xj_7@KXw0M5NN|pP3f4^jU z6`pL?n^8~t^GV-}WfSXFbEn8eHrfgwZEbBlZB)xm>pO0hS}KoUCEs1JFzUhvxS?d8 zmh-T9jj%BHc~DLMz(byVQD;yp)ZU-FQHh%i5A5-iN1Gd4Kl#8|mdM32EsCA+eKReV z?$9I@UNk?WKKDhFG#0O0B2i<@o1Jm>2_Z8a27~**q~z}lY~<XVKZNv74Ch-)DM{2x zOUb`?Hpz0n<15M^iRmL3Trm_X3s1lX=8J^zU<0r<Baangaf4Zm+{*UJ-vjXUgf|#= zMGunm!DuwmI!Z2MmtMua=wcE@aR5Wp;q3w)gQ4n8wl)~xlt=<69A|V6B%J`t&M4$2 zHB!aFb5o+5%7v0K8Q^~qPzaQ{A5_(kR!kQ$F}e?UO6X#p?cS3=iDjq~MUOt-1(zuo zT*e=`#frj$?_^zV>m%mK!uSEKOi+G|?Pq;d!C2&#P$pP~ia^qfAjKTs7d<Q7$a>KE zs=Vh*B%gMoU;t+bbP2BYF8JPq;8lc<2nM)szx2VM`-*~Kfm)*gX+W00Gc>)aa2XYA zcGh*wL<-)}m*EZdIgs%Uk(1-OuI(gG0k*ext_*0hGn-6+T<K(O^5oemxtt8nrZwJI z_31c-MGDP%k`nI6A7yAkH~hz+&z%S+Wg}+rhze}l7~`&rODy5Oh(Dv&sz-@~aD&LD zoJ6=<q_Ddh0nP7<nJcum8q0t^FRGQiz$lfKM|LT*q1})ufM_3Y)A_^v;3zCQ3STUj z1241Yq**7bqPMZ9MsC~+bG8yeCMvnHDhfAFjZaZ28l9q&8=InNaEhYQDT;)r$cRs| z<wjIUMxn6c6j*^Md_q&e(b$?5ib|0YmSROg84AW@C>W3-FIa}XqZe^WPM(Pr?_!<V zH_yNLwj7N49|c^EIlfCd8xx>qe2pumJ&h~b_0>`}G85gFa5AnGcQLNG|4Ulxl+;*z zHPzou9i687@e%UWG*W4ro{~VmkH9%wrNe~7u2otAIdNb#ZH2TkOX%MGlemQ1Ed$_B zrEx2<LMmKpdBOdna(hO2zn{>a#X?HT>#K^LUS3#VPI|tmjJ~usU;&}<qC#MLs@=8} z_%|*DPTrm+#JOc8x!*~Ody4{5xz87g7Wus;s6_;*l196E5pGAG+EP-~)yPWmqOqi< zuCP?RhMx(0Ve7fd(4@C=K?!PGi%?4nP;)Yz{~(#F6d%13AIyb)Cu99y0lY1Np(A%H zAv7x{cluF+RLvSJCpo<(xv2pg>gMJE-N{Z1$WBX#*<LKh_74@q`lD-`g_E9W|J&rq zK7)=QAWkk6y|}WPAjtpgMa-@B+m$hUo8C#8@1)HChEirLn&o#FGcOd%vS2LBis`_L zK8dZ1#hxSx8KD5OskIdzK)a`urTG?=BJm~i0!++VrOXHumi+%`k5E82jC8WgaURcf zcVBrdf@Kin(fApk^E1U8SoOT$USxqKFwKhpknO{7dB)45%s<bq&kK6ox2!LU2TAv_ z|9A5>O*s1`Jq$CQ{v1Cbp9^75`=3Llw;Bhn@8w!@=dO3>u9v5tFUT5|QPwX7@@F{b zC0zg)U;O3F27F}UPD%ZPl++8Tn-|q<2X}hvJ3aNCp86-zQ~Pea<u%sWs2Ln#9O!sD znmiN1bEHlSRAEUCbDENyQD3duR?22WV@z7xBm}X+g(6J?fd4B1MJiQ0U2Kc1xJ%k9 z(v@0W*yYba68sq!xQ?1RAU{9}$Q9+wXfo(EBP?njpYHu*@6E~S@$0uI>d9twxFqLe z8hN2AL5c#Kssr=cFvrWp!|cc7L1)f%{j34j-v!lLz2SA>)SZ6hxqwqExrEQ-l$fmi zJRjbgc&HXQY;Fcj4XfcEKWAE+@^6|V+S-?$7;nxi2w0AqCn56gplUMiUkp2#c6cf^ z%o5Fsuxfz&snaKx4USaa*uwRu_6^RTD$D&faV7ZYR*Iy=W&jEZbVkzC?8#yjNAHjo zuK`0RIsYW%7CXN4xzitzS`qcXlZY53n&7a#&i!&>60^_74y@b7XaamIY|<9(=1Aro zbBgs`S1Y-zb1`*P{^HJ-HWnAtcf)D+HoxGS!+^Iw#T>4?#<B)i1OCGNuyyAg%jTi% zQ8Er0_aP{J1|z(E;t-fcY6OvXlA$^@4iDRpgonNnbXM|Kn{$4nF_BY=S%KZVF2}IS zO;>o=y9sjHhLi|uV+9D;H<}|4m%me;1iC^fn@e^}P}B9Y2f^Oy88#c=b+$1H`*E=S z`}RNo_P4*m^sP7BTMaiBD`u)Mc4sX%8$Zir;9Z0)9=}@@<AjXjE6D+8k5amOH<W3F z+<4^yI9ulX-pdgE^h+ODKR9&2G2_}EoxHG;#><BT8We56p!cr?Pli(<b_Ro@xHw80 zE*|O5*$%PS!VpaLL3UtTbRhzS%Z{3Sd&&AAB$SWtOlBno{N8)cJI|7=b-;`eSRvYj z);I?PWRB{|ftqyUdVvHO6b<SJviYVHp9d+*1yjMNUBIk@srm)%$E#sLV2kM(P{^95 zWncnnp9cw(ET<N0>0wYifR%vre*{<g_N129fC&%_HxV+#R2-OK&|y4^$^}I?{Yh^! zx{CG%EVg_0cRkxCZ9;%Ik>g3tS5_$0U=caBPfYE4&RBo52Ijj%A^!S@JmZX0P6L4O zNe@?YJ<hK=x3X7kNQgC(f!Xmt$w$87aqE`(yXMLryLYPJi{2^oYJjW12uluXXp{|L zci0<U)z=`mTZ^n%SpBc2{#So}tNPqjN834Phv<>iO_MOdDHp>QVuVhwM?!|z&<##p zLJHAvodqr<Frw2^jz-cF{Pd5?EjbOqM<vqWQZlg{8l|lM3ku?>W#SoH+rdddt}0<! zIzyI6MXd3-7L+vR_BtWtnRK^wLu|*~EDYCMt+22ux*Kr7=!x23d{8aM&8E*1Nv{WF zO6kb1<;fQ|@-XH<&>(jVls<MV3Qnnio(0U7n<u4Tr+sCIoq{SdRfTCM5xs(<kbb;P z2FL|kdE@~JH<Q9to0$|l_UG(*C>f({i)1iHF`I&A$f={UbIq81VVax=^!3_&#Vk4v z>k-Rj^olKZUljR+j1`Oh^E~rC!n|iiq<I2@BnAPFUrM;m452KZJ~3IlS`#VkPMD@I zN8G@G-nE-&{uO7l{-77cz>%?HqI$xgV&~*w_iukw6fo<mb==NM`kO7|7FO8TD_HcV zD&cqrQ#iYNmvGRUj@57Rcr*oW3p-GsuHp-nwh<>wS_l!xDpN0FduTAAWXrxE9E&et zrZ2aVT_p>)j2BgPgL`sPv&=0h5waJ~g!(d_^L76<*i?gE#wAL{%Jjo{LAQPZC}w`j zdJrw-K!lCVRQ!o1j$Afvm#wkF)jRI2!1YLpK$Q@g?kwpyDttW-JD+eF%;CbD%bYB2 zQ=KS~X3}VhhXASMb=1GOoF=NOY-_%|hpIuIVf+L4M4dGZx7ODSUs$)T{pC{WJ}nut zu^fGMlWBpWo@7!h5Rj|j9Ny$qg;9y*Wt8J3mbnxEvL0mojVX4laH_O;EQkGU6+OA% zH)8I0GeW7{MmXAaDM@j5AwM7>C<o`HN&gIeVeTDICn$OCcLTA?@x6vioYNb>&`p?b z#Ouv1B$T->PPY{8R_T?PPVQFvd9<!OlFa{VtZiC;D;vfTK0tGmr0y);wqI;<fG04S z2rCakFy+QS8_YCMi!v$gu^glv*g(gcU-<lFn-ea$ENX6yU@b$3P-JG{n>91Gn?hMH z*?>28Ll<N}Ru!kN9YC?wHHpdR^k2BZ*M%usqAKwL>vmpU=P_$1)OFs!2IcXa(PVn5 z5x}Lu4?ClY^zMX5a>JS-<}KoLkCJHtM02QuQj;#c0(*F0NANo6bffCOmD?1r`rMwM zpT&VH1I2$YSE`b0@l!ZerQ@9IUX{!UYIVHwtf1v*=3m3!KgsqI_K*1Uzr>%{@=u(8 z;@!nU&_{4Kph~_;l+7Y(BEZrIw%Y5G{5Ukq`cu#{LxENxFEo%Y;UTuGsp46TE#{`h zyiv_$@9g&vhVgE{XtgjR2=MGC&2Cj~nzzQ)O?!q|>wmw#2FBs*4>WEM;o@sxI$IaU zS3Lp!VHp_ym(zFSS#7ymOK((9ScYU!22V_eWJCrYLICz<e-=wImVNJEB~m3D+3^tx zSv|tzl!OI2yTqQ8H>js%Ga|)tVA8hDyB3Py#Ak*P0eUqX=3!Q`hGat&Nny3|607;E zB?9#?pQ+CMM}O4TGI64!iS`ai0cPrtJM+P)(<6<Wo_6OWhsmw`X{@|1n!AJb9f<B` z{T|vxvUvZw^&aONz13Yz4E13KM=5Q8;TT|bt^fB$ANkK2%p8epi*P~NqZ5=qt*5uc zsK)Nf+mA)E*mJpDCaMKJfl3nR!-Jz^acH~*pbj3_fBFTwtcn+=IaaxGTTHN&5^-CE zjk8psY^*<SuLr41gQCf8@eoU09;Ti84hXlmo@}jeY;10}+E123n>pUA|1pa+U9~OZ z-dQnZ+Rbz&kbc275{;54Jke!hBqF{JLHCZNeIxU2rAZbGr;K|Vwi#{4Hm0J7nsX?* z*_#kulrDtdY`B^3kicL_hX}h-y0d19v97a_cs@C`knyZsZpkn4Ldmh1`U%7_(pL&| z*c;jWjgyDajJf$~IQk+qE`B1lkua_b?G2nOS$Cj<;T|Y7w!e~!oT;_V(}SLXqCVD9 zZ;EhZy-_kw;3B;|QoSt0akBV035TkT=ZbNiu{YgwTRFlM!0c+iHT_bMYh`WJO4`3r z&KVWE))DAp*ihQ1np9wkEsu*Lt1D~5lJ0?AaUIH;68m&HX==!@^g6z@*ENfvpOq;} z$l^N4G!^6`8pt2FK?<uKmtS*kc~VI;K2evAvN|c}3X1z+dmk-Z>nz7yXFA`V$q7ie zo~zSbkT2~%DlO3rCfGhY`Daa7XNvn||KwsyB;QzsboyB93O!g)E|f@|Z0JI(YulI( zP~D}#f>;zcR0!G>+&COMxaYVk5;GOXPMW1aw!j&9f<==FT{dGJNL@`6%!?KJPKtC8 z_K{^xLbQ)}>oi0%C|bEOQi~4)F{24Lv+Ty{v+Z_{JUkmAA#?h=tr1DxlzV3^f?->2 z1QGSfS#(4TgVn;Jh5M@0uYcpfZfH9iOS`^Qt-=ZgDjKl^()LBcYo`lWJ&<W>j45_v zXt(+RQHzbX3U4QJ9Oas0J35~QE64(-gG8Nss`=a|7oKSJLKoI{>FBVfkgT3-wr0&g z(4KIum7J^_4MQtK&2Q=#{Aq`a{P2P95_h{r!_P3S=c79K5yD_(q{@2j<@QdnyZ7S# zt7l}9N5|zq;#z2#Q#Aqzu5Lp!-NNte{J|2`hY&YJ9CbP8E+TaPT}<|fD1dP}X{=i7 zNa$$FrIpz;!b{K&m}A;JjjD?gO$=_xDVQ8u-tEAOf^#Tb3j4eN#Xfe1a1TtT{NreN zHtI}JZMn<bo0aJ?Z(`^s_6HMuf`$F*3HGHZXND4)fl820#!gCv1XT1k^K^z$!HaiB zlM##XyuO~%d^%abI6d_>_VpuX^^ee69W$#woXK#sp=nSC3I?JXC|LIptI+qOlb~gI zZHvorL{8*!n1E{$7JKg~nFGeyG`=eQ@X9`|W{H&DMM(N-|BjG<e?krfVOjE>bTLv! zP!>a%@enbrWr)Yq_srN(0ZytQ7CM$dAk2mY69@IlY#4Os-9aD62uiYQR)@VFuwgG- z>xa>BCPW``YS&vRY{@d>LHRO(JC@90DwxeoFa;)It5N;`0Z>Z^2vVlo5-f250M?!Y z08mQ<1QY-Y2nYZG0000000000000000000R0001NF)(f~L`6nHRZLVbZE16KW^Zya zG%zk~bz$s%`FA5Xa`4acd;TAK<=scprZ^(UGxknAPISz*JJ*vmcD(u&y%yP`+9KHu zo0LR3lfV6|14jXkZnlnbyvgiKJYoYV6o5jZP^e>L<M41}<I6AJyxKpA-lTb+W|L^Y zKTD_cbTW(%vTT%hzWm~=ucF-~=g-;X3Dyr*jhYCk6{UF;NBwLxO8VF!%1)!#i#R%6 zOz3z1<rnc}5Dnsad=lqL9?j3<IW|fs^JFqe2GKl=P7;8TFQ(H`GEOFQ{4_sHqI?cb z<JsWLFC2)_v_D#4({#f1((z&x&$C&S8yu6#Fr6eY9yMUw+C^tN%P!JE63vo$u-q8O z@MoTl7F-qZ7{`+(3~xNnCSQJG!O!FToI&-^Vi@~mnB;BfG(H(o?{S_c5*@6W#~1MD zmtTz4+;eF%gMQL+(uodWD1g=|iJ->3b2^HL&jITkx}VJB6j6`zWDYazPe_v{HJ;H_ zq@#F-nD39q*}zt6@yrjhXp+sp{9=~;=OTp$g9Jd2U@j5j`6Ro9zlRC7U*tS}FSE<! zBAK;ms>kuK*({weahYje2N_JF24>qsF;+*Qqj)l0#KWXbl+cdS(`cD32-{&sa|wOT z(@}bzV4FO_>7Hg2AcS0Z1FeW?CP_cZ^LV!W@(UUb0>YJ}&h`x%SW<mPWDpG(xW*Zi zOLlsi_S1M2J=={g)AN)@31t5|ot)=S@COt;&t{7;ED1t?68&&CpHH7WcyNke^G*^E zM@eV4c#xlEmvgGqnVwDmb^i3P-#_j?{*eK`NatsZ69TvkGdRkoMBD@`2Vg@g@4#pu zjA#4j*=*iFd!RO^83FAz0{Bj&y_bv<qTO3SdN7|Q$%Ap61KknSe`6}7S%zQnVt$4b zI8Bm){rO@B1e)95qs93wn|}Gl(GgMeJbD`a_7S0NYyd$_8gtwglc8EquG1mX`3cA! zY5!^Tt^S-&<mX4~^T{F|4dC~BxA*<V?k{imU%xxp-`MP~t8QQ=E`c=w{q}+0W6gR- z*)W1dnE`c7U;v}64-*C-^`C>2*Z3oX|LITI-F`C1DavsmUw*Nc%x2l_eKuW8;lpV> z%9C~kebQ%S8OXZ^(aDn9BKRR}_RDlMiuync^CX&5TR?DvL<m$0K=GFg6F#Ps)2#3j z0KP_ofo~0L)o3%uguMJna}GNiaO2IHB3H?#2?4>u^|M(9n`@HfW{p(IJQ+{-r}5<^ z8GM+eb1p|nCn?Nc1pVXwiwDSO&yraZYWM<xPc>w}m<xBZ1x(fq>TE(4Qwt|<3t_)I z`4tWh+dD1(U^#)pXaRT;s}7-IAP6LU07EP)18@m^ED4QZ1iRw{HcJkG>=|=YNbr)a zQF@Wkw7KJxbq-(x&-N2w-h<HSUrb-&_wP30e@+2{Eh*ZiVZDN5^9oTuY(#N7iyB7= zza7EPGawrAa|m6FpC=>dCmgTywC{X5o2s9ZQu6*;GFSj#KcGX;U2XXEYT%4M9lQn3 zsb`IrW0G9WX{M=aSAI65?P7J_mv*A`=>;c!I^W&Sn=P}%@XOHpn)$-WMe2Y0Gw`0- z`D@FlY=e$EjCYYpbRnEj$>c&8;nteaSi;RZFpsmjA{Eh&zaQh-Ufvd9$H0=kmg;MH zvkSv7Wi$1)yxA$7^kxBRob%;0X-XKgB+nMJexm5Q6+H!hLsCgYO$0Pt1MVB05*@aq zQ<^*AJX0V>kVPt?4KfB$f#2a*6}W#Bb%8#)H3|)RXOJY*oou>nGCnPapCI=a{{q#( zXfG3F1kpH~p^y=eQlhPVn)FjRTbb41AfuDT2zc=_!Lwumy9NZ*K5XeB$UfK1`MEg^ z5hVo>sV*brp}#JG#*h^o05o-$B3-H!!!r%c>IAFxaUy4_SVbD4?I1w>gIRnD$I$lj zZ9GoOc8ID(bC?XgTJ|q@Yv@)i35N<gqj*UYE|HF$1tg&q_kBD1s;VVYOyvDf@oA6z zy_SdRQL$z53*zys!ei9Q)NvH*)%FZ*X9-P0RA@jP{(963!`Rq>1O5q~;Y|e8s_JQw zf!K#azY-6^brB4Y8tRQYlNeb}6<Amf;&;>#BsI8mz%*=zo9N2pcz)KI#e*h&C_x(t zgn)vOG=}YUksJVrK_;^PJ{v8E*<?LH3)L%B0L_5jWCH@+n89>6RzS5wKWj&qdgNzG zIy{@V`Nw5Cn4eWcP~E4Kxqs5EsC|fBEBXyj?Xw5Hc7)V(`Ji_L06ha><CYK}1|V$Q z48*s^QPhASXm~zbB;}P8An=k!Uhk)~{wP_mvCQ5gUFpRh$J2jjob}INKHdtKMs^X8 z8aKz}V;%CGEXMD3i{7_&TG000pC@>QXwn{?reF734-BMxS{=<SFPK?cM9X+(5mlOt zEn+uM0nXPJ_qq_wYR<aQoJQNv@}>pcit2(glrZaQP<cAJA*j_gNC4=7_9mIln}Q<R zzg<1OYA>HIKeq1L4T%7^*;FxHXfNyRsrp1xg-h9)q?kLOGye@Y2Ue_!-9tJ%g99T` z1MTWkaSk^!0!=ETpW@LX$s4WJJ7KEC28n6?&5-FCB{AY6>33!s+{lujl73GT%Hi~= z9aSB<W!!p-+*<W=2LdWeEcQ^Vz^D{v_^U&v1=#^qbHMuzRrE($jzVf3LMYvTLGjHS zUdi}M$7VO0AzOz!evG;+$QJ2paSOVVh%b&hSFU&pckjudS*Y`kJQ;hf8}+cP(Zf>o z@Jn?MHzk*f6$oE^4hazyjgM9=fuZ&FT?T;nJ-pOmV^lI8Mt|-`M^QYYM}sK2f)4Rj zBHG=C>maMsL8*;bO?*KJqSIMdVkZJ^mG6n0OiKB!PY#|>y&F!evx`bDjXa>hSPD?x zUrw?8%lo{hR6_B|UUG`!)WT>j+o%S^=N$S)w_>_o;%mbNYNV8IqIsFkMuW~UnQw7@ z&?gy{gu2<q$dT6-ymhT6QT4GYK8`g3YOA9(0!!G{n?g6DKoENCjuL`UKZNq5L(m*7 z#wW=PAw2=8uXX_ylCCFwNmt)-@tQ5x#%VbG!z{uizIZQXOi^T~2tRLZY?D%*HKZr1 z6nRt;mYzdUa~vZ^$K&+6O}_?G+v6yEj7FtZ;8yzD%)p2QEnK%M%yteMj>)hyf`_MB zQ`Tf{)FfHVXK)!V6Tw9{x^AO_;vD>*O-OfXh5{ntAURYB!2_j0sCDEh(e&JuXw2L- zIn+RoN-hS)FLbnU7gkwB%Bt{=t<*BD?EeN3I#+5v9n?BkcLTZ%0$r9cmo--L@uLwC zaimVo-ED974S^SCV2#((^a(YO6%?A~jScuRHJgJv<eik9EQTF=O(0EZQ=E#xF5$%v zbcXHU8gF&ijdq|DU}CmLXMQzrC`~49L##*a4F7O<U;q~HKh@k2sBT(9pettSP@!;C zqW3b;ZO8TCb<|eX0D!H+VyDB&{(OdOO2uSk06TIHH^&or6e107o{Ua6lB+2^FypK5 zvU9_ZX|ibbu^;{g9W8R!@b2$FYm-p|ye5Kj_g2tpZ<vu?-3r7~y{_E6<+bd5sX>?x zWB)RL$PK`%=B1|oIX<3gYY$bzx@|+Hef)Zyq98zjl@O|G?oz4dz*M9Z)$Tc9Kvs!N znp4`!=|J5Z2r{*WDU;<#wNyFfh*dydCGf75zl9i0|DovnNF1Go*51kDx6@3nW(&Pc z^f>2?s>oVwae=wO)}lv|aeR)FbiSA+f<qwHfWG_~WFkVLZGL&QBRY^&Lnuf9bX$a1 z&=f>bcyL;eybh>5KTD_K667UGxacA|OGyJ6gh)@R>w2%)SEG0Wuh<i1v;tNUN&j48 zZ>3I_B%eB<otiMvW|L-HPLZ7N77@BE?a%`_eJ(cT!Xkj?R{;<p;<j3PL5USKkP}eh zpBy~vQP-g!@{zSmF#kiUAjrocjkVREE<uC_V%`?z)FLfR<H4&zpbQ`lX4yFL3Y{M? z?Y4is<<1kDCI6$m@|Tq1BY<<>mUUq3cPxs5rfZ_~X;cr42LTpS-t6dx(owgc!&(53 z<O1<hyc)FJZj^GT0-jl>&@gRb^(ez@T{1|f&N|R)jd0?2>i>2|?-Pl=h|wnXOF}$V zu+u0Wg53{V0HIYS?n<~jrm6#XW8HXj9-3|Fo*;4;Q5AJC3e@EhW#%AYtpKd$yTbFa zF8d+s{xw7qvQKOWH)T@W?xy|u_VVw^vT16pSg1S9NT)FJw}mm^6*|#;k^1hf6LIqB zKkpB=v9ORrOLW8k-3J0J!|?6?9*4(L@KY%q-Z%7+^mR`?NV6qDVV>2}ee{GzVs0n+ z<=()brC{7QaXa8|_s9JlRocA)1!Iad+owk$c@U|u_lP@Mkk8OY-(x4T<leeFMRV|E z(qFoLna}su5!kn*!8dal(Ubk|uNA$nKtC*4(qFDzSv-3^sZyVMRC+u=8EJjU9mopK za}qm}nf82OYGY>r#F@_a;DNqo5INKX3mw(>dH9C9q=8f($Y!$j^?l8k5O3Ix3($w> zAM-(Ib9!GCknlr|cKJElddr6N1=f*_z~SCENk_DBd@;;xz+7lUSPPUt)o8o&6c4w$ zm-89_R|(xcd~XB3)>u{^##QZB9kao<V5B=hAzUt*`c|X$l<f6(;>qp|Ub-D1Zcz<b z@o4S<fZz369T#?h{#a)hpp%HZ3)pRBWlOZ4CrzQ#+I%gtE-^Qxrd79~H_xK}Vm1Rq z`_Ym;k-)bpf>*wCP!^vj#5UXTDuDW1;L>302R=aH^As=Z@EWZj_By{M=d#-7+O<i0 zY<s_|-*D+PT;7T~R(Bq1QRuZ6>tb!c(^P+~(LS4;WZ(yM%<py<g!o=(D??S9x#L;f zCm#o~rQNbRTRTr(vdL4gRguD71xQq9sU5XQ=uO5{Xssjwz@S>y6y_jO{}jT&RtTa{ zV=imlvCG?)-k$I4kOODWbM#>G_!xhzVq@UO^B!F2z^<S_i%;jZXWVc1v>axQ3CEWb zBRYVNiKUfBZESSoefA`Bw{TDn2_Gb9@ifs-_Tn@#pKrHd>McmDKdy{2B3%9Cb2HF) z)(lq{TS}{V^1nxFu7k?mkXU7Nc)KAOqe^iS(5L+No!tdfpZpyr0B*Q>aIXb-3Dth; zHTPSFcDdVWKc4Kwvtd@hW7Fbk089{pwW`C;N5}G?^_O^H!E<}Q9>xw@qJSqA`2KC_ zDBN<bx{bBFa&MIdS*_0aid6!u0-xZa@b3BuhEwBt!Jih3z+Io(3<`gU_eqPG!Rrt9 zKx{CyOK_VvaBq;S9^$RdhwAe-)*4Qax3Uy*TI=Zn7p_4g66S{V@dWfo4f`xsX<#RY zr9gzN6-z7?i#C&vuVk_C)u6O!C!Px}aiFwgiO<*`fu%4i5(dd>ynw5`b~R1%G8jaL zRXB8zgsUrPnXSBvqUeh8u%~ySl=fulB<j-8ES@bO;7VyrU20l7rQr0>?)(%Mzyt)) zDmic<9@(f3U;xWL{?RF1P$Fm>k5jyNF2Ns|f*UY1beACRqg%pDLL-DiY~li#we`9O zT2$8L>wYMKbsMb#tEr$F>7?UzGE2tUMKaiO`-(nEU+_F&yyh!hjHy}&&G0yah7^Hf zGN>L+&*JsATXKRWC$sn>^GlE}*CB?;Y?LN`8ASydB%^r&9#YJD(myMJLwoV{)9eaf zI_7>E>hIQv+33_SIKzUoY@Uq#61?57gPmPkzyKYI*MD6A*7HI~_yo2NYT^QRs7YQQ zrQ-rL+*|8oP-OW9s4ZEa01==GxnGD&u%6}pxKM%&VSO4;3myF@7Qo}oNz(U=kV&oM z6~2HrlHEFnIhqyVkpVmeZyFXFEtF|IaO$yNhK_~n7w}+^6);DS-Stb*=A9=?zYO(M z>sPb5P=M;F^<_LcPYM%=mXYh%i_yX_u)oySMhjFFIs0hCmEwDhHVqx4SsNIO>NpxB zj4$zI<3Vx%7=4zGFSE9G*m%2j@Qz|_@CW!ZgBTmR`~=^K2fapjC@T1Cn@c{nb)&7H zw|4fuM(;q6I?84P`rK`s?{DHE-0tyX&wl(ly^dAYhxY69tiK>!)}n9i*Ifvsf$zgy z@JJxz-+K-l2U~Cd{%p^~>>#;{`<ai|)=Yg9Xzjx>IdZTn>1J>1?f(0Bdk4Cw&@Jq+ z@iK`omSzgWbq;26e#W?MmR6!m4_E4zR@#EVB)nkVo>{5C9c=A*)3J4xz)9jy2hQ>Y zmDPo%0)NdkgV|qm*6KaK9nxp9SkIQpNv!7ZksyK$RHI2ertgmha1a<qdIG)^lmL=R zLMtA9FZxU;q!4hZ5^DoHNal7D&1yopH9Kn>2)uKgWJ`CV;QPyXJXT$H#W?>KLmV;n zSrR40N;xxB*%d?Gnp~tj{_bNrpjmP{TGDiNzmvOTGEaH`b;U@x<AEN3x48XcrEK#S z_Sxh#O-6+cxR0TuhPFtI`NMVUuj@`WVz_d!8DK*LeIz%l+Q4FzJ7<X^`0pg8z!2lU zvzRy*JsM!la0>WD+TC=%&;nf!-Id3Q%JkxFim&g}p||eH1{V3bx9UOuhhIU_@F7pO z<UFI(XIoT>A#flF%Lkd)c&)Lu(cRoR?ls!06*yeC(e_$zi7y|`pC3yAezbFa+I?Kb zlIVXwrBk{E{Iv?dpOQ&7u3}2`zt`DGR>hR)e>>SF>^D8{rPbaqA<ElC@4nJ%dolWB z0RFTa%b~%(I-_CI-Yl*6Gss|itCm;7$ag3((atTe#=+xgAD32on@)a>^|mgp^|xez z@?NiU_K9>?EH<4C<<wl=u0Y}|$@%$4_wmm0qs>~hPn97)Sm#l1aKi@mJJ^cey#7$X z_Ntm6tIC<Ht=yvD7dTrsn<VoBZ`+6XmV+X5+XI1WQe<y?nK{)f_u2lO%?GNt+20nZ z9j)GDf6G8HUb(~e;_=E22CV&j<@SPbmg#8a{@Ourhn4$le-fW3dV_tsqhK}Ftv?5T z|NYMK8Ii!cJP4jYprRWe1>wDX()Fos8>|uvG>2kfk>q}Y2(_~!$$f&eb9<w^eP1Jf z)GG{mae7)D@?tzK4*BoN<Psx#{!XKQ)O&eP!#?dkO8jx}Lg3=UxDU=20q*hwJcpJ6 z;c1qf*I_ObC0tZ<mwmDct>!M<3F&~Unakhe>+6-=1sG<slDizlXIbJ%;h$!y;gosw ztj>9~vB7osw*Ilb_2$OJQ7rLm%isF%j{!Xby@;b~R45YGUxS8xjPX&9NROm{wN>%+ zt-bfr&iiN^o^1y({ao#Qdb}8#I{S+g@N-YmMGagV7yUW9mF#d$a9oR*8+}uE8!n+_ zBhyomV$dIq<DLaJhFfO@9&n%<=_w$CY}~UT-axSDId>MHo^lO{jSZJi(CV972cXG| zFpMySv)<xL{p9QzJ{-rU(mObZfFaJ({yA5fB&Tz@`Q&Hku?q=;BcGUAI;S7;+*El1 zqXg32=Hem!I<~j~g<+`Y;~j{XG~hb)XV=tt=^#o!1e$vZK0uIV8o-%yr8%Hgy#%{* z2?p+xZb3-$2pJ|w^)U((To>%d&*Q(p53WXc2cvGsVo5fj&`uMm%Jix#7ch7UhPBGm zV^HRuA8*>>Zf6kXWVXR@xAdffu5=PFV=?fb)rfT+7_%s4<iLqGQ3$H>cKvn9siIt+ zvkm&TaZ(EGTLtV}Tf<EK7<{I#(@FL0Z_C*~acBSe0&XF@$rSX-RO!Y3n`m#5n@X@I zNOPzx;tH2B1m4;h&KB3E&NB>|50ne8=YVx|l3l4enjN1k29kbpVIEd3OixhS;P^R2 zj_2AhH!zC)@t(koLdipS@Z_dpp2NokKOV!!hyL7eIeQ}ZDSlg0yq%@(5ip74gXJvI zn9Skt<86yce5#7_c{YNOdP})ofHN#+aB<Wm0fA&eEgVm})l0S|mn;s98g$6>#2+<( zG$b1<3R1AnNAbW}3jTf)pIdw(=Fepe{=Ksdl*Ay@t4V<aI7zMt$3&{tm_L`8pITxA z-l|7+ngE}z*ga}B^M_(6>{Ec`rGQ*!gX|n=^ISsG_>(3ZLUi(!A75nW$N9jcX^4=E z<cN>6lCt|LhLoSg$5dd4Iz^;s=U|hg5C9z$pp(br<G27B6p(Xz84!T=w>ZobwgNms z?3|x?^qTpMfT_bVBRU?Bb2UM4yh_L8FcaM}{4+i8#_mdO%ayX5;Y9*uhA}GCDvRHC zI{>Rt#2%k)^t!!c<{sgl+Y9X6UNwb1lN6Q|=N_zyFpb5`nSA&d*wV*8KX-REekiat zaFof$89tbDWtiA=c!9gjt_4SicRbxCBo$cB(<Dr9OLz`|ScM^qQ$?klam(F|C#e;D zI&g~OQ#Lw53@kU_$34GOy3y3+=XSz>2H7glv<&icL;pVB``I6>rV%w-K_zsi%ngH? zXCSy<WE+yvy!NIPB4>`A3GE<7qshchGBFbi-_%cC?LEp3&TgN?c@|viJ%6e9o`+7k z2qLjh{G)Coo1f3BsZuemv+SBS)I;}}#Tfcr;e8Bz;5@eH$Ir;LiwDfl)!n_2n_yV7 zxw?VP)eSR)ZC9cKj&QQElGk_LF?R!KoWMSr_-OFQFdhyH)!p~p?kyFA!iH=hc*m)2 zbC!;Q9iB^>P6_ot@02je!kom;obbv?AqD>yD`%wbOv~#)!PDb@HYq&h0;w)W=Mmc{ z?xW4itBV+3#`PIJ8zvjw)s23M&lfqon8;?mVzYOP`83OcBA>3GjBvXbYV2i@j3)D{ zZDf;K#zKT!+pc#%9xFld<np+$Kiea~ZATZHm*rO@f3WZbKGRe;D4IZ+Dm_yrFnAPw zpw6?=WEsOXe^WE{$uiLA^9{PIMkn}Wsrk?;5K`%wUb3?SWbwh+yQ)Dvn+9M5XRzgY zpuz&JLo^>fRlmwQei3Vla2U@61hzFBW9kqq5uSlHL^m|ieAQMA_&reo-?caRuI<(a z;S5&sfQ2*cgKKAJvkiNH_2@4Z<I2*?VZ8_SPtHP;I{)wki=x$S@PHI8;AdHVynVYe z8~nOB0gXV2W+4#YG#luHi+`0;_zWmA2N6QwYv=Ug7(c9NBZjORRgYQAJz&5w(UiJ` z6fm>ogr$nI`ru%sR`~i71dGWsJV7%(ov>iXX0`%kn0s?MjPr{6mUr|vPZb`PanQGl zHs1!?d>d@Dn~^cx6bzSii+B)U6zz_1YCtn|w$R&Y8qbuh?Nb?mik^2LMScS;I0mih z@zfNQw5HT>M(M!~xxa-{>U`u-nf(7?#iKGa8I4*t5*Bo-4x6~bA1ad#%1p2^Q)qZh zrhUf?$F}bznO`Pg^U49MH#?6YCLQE!1JDi}lf?$2wj{?;DuHoI8?+FDS;j<bO9QA) z4RTIe=C*>!hIp3+29m0*BQa;Cfbg`kn$EU|Ai+4Vi*N;gV24{eNNrjx67IN@R^szj z2C$`oDf4*jy?lN{fCE;R8YYITn00ibqUUP9o1yt`qi=RwwE#DDjDP`a@C{CpgQ6aL zaLtMpIkqaGXK9Y|bv;3YM2<Psa#XrxW(vlv+d6QqZdk*LSs39O!)$BQtr}KXbz5t0 zYNdQIbVL2KhW)uQJeO@sBTQOv0}5st@;2}Q2}c9nm2KtpbBCBp6sEh-R!8;4b$++A z8zFlcq{A_$j2zCuM9J~<4%$8+`o4!c7GH?G#keZKz8V}B9U5;0()gUv8r<CHWMv8* z1F}_U#a_B!h0Msmp}b)Fe-y8JaKiTGt`D#HGi0>ydG}P!xC&QY3J&Hv<SJAFssb1o z)E^ezo{kFPL&|Hyy0Mw}=>qR@8$gHIDJ2)h0AO$gOp;6CJJ9KL1UlgW-qk&phsbZq zY151ja~U=p+y$cb=We4N6<4EG7pu4EkyM3&8y(RL#=*Wq{zvr1*@5>!P%A`wA9%&@ zDf+^CtKcyebW*qjxrO{1Zc1=6$Q{f99*TIVF>cMk<QGP@u@QD}xWT}J8~#RsRmcnF z^|5*s7#jV(Y0~uibsg~BUk;&ExV&@93p%?)^;;!%-2jTAmPbxg<<S@v3Jz-ka}pYa zqAJ}IpdY8g^Jxt4+uQZEibqtepN)Wkn?3B}X~Q_ys>I=_{rRl1Oe;X%aE(?%yRQXW z)zM8>$8o)sUXC?FPpf}TiUTn{*P!<+bqUjjjw6~E><V5ZFhg%KOQ9}cD0YQVM8Z!j zBGF&vX%Ac=R#?*Vs%c&(7PDxC)k^rQg<vAjn;a!rra$A~HKLjqYE!5e(}@Z7A}XM$ zhn6MCm0wcQyykCSBTlVmKTuvPAI`N~C2TXp^&yf4$`MIb>NJ>Q3r)0Goni+ozrw}E zKkT}OptV-!-T^eQdglTop7EU{;}GFZ`@Mykt=89T2A=Td;E>>ejVEq=(bp$T8&+0W zm3fD-zCe`wdKoA;^$Zmh7={VT($i&C>K)t)Dw}fE`svJ}UXQC*N+s3gOu%BR0a^EU zcj0%_5^LKV4&)PUt)v42{bMw%xy-YY9gkpIpJMe4ZQ)&ZfqQFq<FrfqL?k#)ToN~! z|AG_s1TSe$+anQAo*KC!kivvz4;wF?nmiX*kV^QtWJvAkw<<b8Jj>~%9ogV;)SUPx zec_}HE84?tm?|hJA6wz0m07D9Isah~UMDh{TlHpRqrY!6C~oMFriN(XXNeXvz@cT* zS`@-BWi1wCkx*Jl3!F*1^t^4s>3MjFpGeb@XRJy^RV<y<aAXj$;}ce!G26GL#Rw#F zA-EY}0jfWEECsf43N|BfD~(k4;7$h!bkcxeb}@&$8{_lDc{1o69jy|aHZ~wnyi!D( zk-vFXOSNh>wSG$@fUR!NRZF0h#tJKHUrHcwh=n>Jpk~=vNM5Wpl*QPG;e|J-gd*#f z!C5^ewr0x@dH{Rsol06A6qM`-C(+qhhN)PyFBJ36@iFL;QcUUAgl!Bm2PIKc97yq6 z5P89Tc67{MC-~nDc;trI3CM5<3ou+kB@(zrO;FDsz1qz?vOP3F(Ha>ue}<=wk$9UC zgE}Ok$1rQHYvQb(#hxIfWQNihIH<sbEk=b*;(^*!*zFV6O2J>6rScGrz$S;*ieMWy zqOThGuc@Js7wy$p^j}7kDL9!-ODKXwILX)S_d}R)l}8*xksdpD$BhkF-=@ZPiuo6j zD~V?clS0aZqYPEGpI3Z5TF#9HY#aa-uM?gH@ZwFDR88BeWu*nIEzfOR={>=L^3K%1 z9g13<3$)H`iP&>$9XS0&MF0(F9SX(4<)8<wIdJX)vT4cz=}mu|^S$^_cQx11Yjw-D zTsf9M(vq%3Hn_4dli-M&jHh#a;T$CRrbuB;PIY7k1;OaUOQs$*JnlA9akw!+6TIz- zPmTMWHip5t9y0<@qtjSOZzh|i8c@kopbYHeKb<w3v>I^L-%wEW-M{r8Jz!a?_}VXC zLUHRq@cH-$cp>fTI~_cxL#UiK?f{$Y=sKBY&Z~nv%@A>BmViA2C?bd}JFA0hH&xTt z5aMou+__b#LXqe~)TV=6+A7}6bAoGKcmg9muNGLfcF=+2Tv4iVETTwx4B@P4R9^wH zA*z^^9AfG3Kz$6*pA@tOg%xoC%b5w7el$vR#X;^@xJwje1bga1@fgxp)8(oeI^5xT zhY>Sv23e%+4QQji+9l(O+-T)6Tv<BUt#}V7AxSFXxVnz7{v)%SNpdy+z+c2l`9&oL z4iaE1DyGm=6?6z%(d7&EDb(i+6S20UQ=NS%D!&BKMCu9k3{d<qP|X&Z#+Xo0x}v2! zp=#7Yq+XjKQZ1X7cNDPS@Pr*>4+HTx@UjCDbx2-3jnR-Bj?kpP;LZ)u0yry_i(2NE z7Mwa!Q3W^E!Fko!P&}>jGs!mO=@@+QGJ^mCd^K`S2!!0t0XC;-RJ_0t3u6dg(&;DZ zsHqw~=xw%iVp+HH578q*I6k09-sY344~34{6#NBL4K@Jhe|rId*(?c#8{jB9kpYAl zo1b|PbkUQha~dvqmPg(*p6$|qM^GarDGdL3lIG7)o@%zd6z^-H<C`)qQ<~5L=H(`W z`x9i>4)ljZf;W)yc<G+Ke122c^7L-GwcuLB`92K6*)g@mS>T`VYuvCiE%JVGh^R^n z8%^4dSCv6t9uqPj<spNf*n5Y%5S1I;PFIuk>QoaaUN9wS`WKJbo*KFiyUSXZvBX$6 zc<F)#N%bTde$%01J<lF9L(a4{QaeU(wsyoD5@=<KQRUDRA`+%<=%hi1v8s=0(cpqd zIu<y0{$#cWTfis-7<-n;sdP>e0n<+4aq7mKEwU0@%~{jJim57KnpUCRDPih5l3^39 z2T}8u;St`ZOZp2Z3z{pA>1OImOpOIY2iiHH{4-jks;>SgzbXlVy1@cnQ)ZM}+f=NO zp1>Hk3NenCXv<-6YLSPa-Qq+`>VjVaa26IcPoyCUwxVF$RWL08$8cqyS-uo<=yEGM z)qz^shO66Y(xG2<lIpdQHI)IXRUFsir1d0P#{n!Y<-8U#4+pO!D&V?8Av(bHKuQkB znjni$GY(hRiS|*gXt;cu!+Q7hdbjm@DzqVX*J3simyeQ6>Cj3Eon~Hawt8x4h(g6x zcBoN>$Tgw-O=TOkf1ZJQ6rvk8oeo~@He0PgleaZGv4_*UNdoF<O;Bd3f&uVteK}Y| z6O4n*A`?b@hiho;WmB0Zr>wE66KHNT|2P*LOG)7YAlMJql$E6xQT0b<(`-NK81=NF zozH=H?a;AMJzEY$f5ujT3(jBwpq#~OkakuLJiFa@RH<F05I|mm@FS$&+j<dT!=-5c z4R>I*1A(o>#{ZWHt%~OnivGB5J9gh{TuX-HZsf9OJpC_Q9MgPbSMA6ykuV+RG}ozn zyYg3+Xhh}5hTQ2kKlZM+fN%=^=B>!0g6sJ-L^k5Y4HA|4yQES{2Jc;AVWDiW^=!oM zOejL?fNxzQ6)harn(?-^EHPUWG$^(TqM}FDMPy@%XbqbhZR4#56VK&fNJ!Td?X0Zi zi^OEvP})CIi;TD><aaSRPBy}mQwNCLY3?kA_NhBZJlIxYV))DtaeN$F$+>>35#9jS zJr6WY11eW<QN5^iiwPL;6x|Fck~Rm`c4&jH$BfAvbYp9p=UB^`#1KQ*xM4uwW}2#u zp?<DVQ|@GbEaZH2>w4KQ%ko~D`XVW3C>^J%XVQ*32}j*JGRJB-yQ(+KhqM&sR{<@w z=-E>%=?bdBaSMfVaR{Ek=So;I^=T<<un6ee)hl(ma+P)VSQd;^-@<LaH9GO=E)L(! zMchT{P-O4;SXskQ8>yjdd9}Lnm8(~p;mkL+^1Qm~vb^c_il&8paaHvQ$1?Qmv|pCD zUskv0+=C^9T&@_TP9aFmFOojQpdU8n3jLG-ZKQJ+1FK<`8mAb5ZQ?a60g0T58V#dR zZ>^@Yq8O^7sN0K6^Z~LAShh=@3N?8W!OgG%S`{bBxxM4q>si%)2te0GrUPGFCo6}I zL=KHzzX7tUqEH1kc}nm==D)~pl5@W}M%X2w!Y8Oo@UV~0qfdSBKkp%@%rB#mU8t&J z+1#7PJddoxj45LUK|v$kRIAL?8$+;7pmWtKP|_-YwkmgPDNg6ws>*j6^@OO-jN7#| zuN?VX+cH?zs<tvK*(6f4P!wuvv?Wg9>o%&}$!kpUZnLVbya<Qx$2HprTi3!nfVIP! zLa*Da1yJ=`=-srcWKgT|4?Q5P1)q9LMkaIBmZYgIJKR*3XzO3Ls)fkN8&1YsHv2Y- zYB+yt+1XEtN((tk{fQ3<r9LAm6-PZSfn>w374M2k)Lwff)~%~rzXYF!_0ThZjip%M z-r9S&Ucx|EwT9+<Tf48`ts9LuyqlwTcFtSv&Hih!@x<ir@yQ8rL*pXNd5g(o2Nl3u zFJ8CN3Kjf5l@YH<Fj^^^H7iOtf?geEf+V|ml!=KSTh(mV++&bH$ao4fglTh*I=VR5 zbi=(gIGRo8*5KjWmG^~0S;v)~f~xI6t5PJ3RcqWPij8XABZ`gu8$?Ns(A}YHt_@|4 zmcd5LvPQLT3B_jRGQC+GBh-f>s6Fhgr7z8gsi4*~M4)X@Y?v5{p`<~DtPmi#8d5@O ztI{(%)S{k5QPHwOmH_rysZ>Yi`IyCi=QRZ5_<)}Rx(xFw7M<x-uGAInv<ikRE5+I{ zUz{}YQyWZwLEqkJtgd%HbSf67Lp3$jgulyc7t$(o)}g#n(ZZx?4XM*iJtxz0L&lkG z6ik-U%mU0Ml6VGDX2>Fo<#pwuKqnQLEzM#jw!s7Ll+3Yps>fSNc6F7D1%@3K^;S%Q zmuH%SD*)2U*rgoEYN0T|0%fvv&lS47m7<(N!rw|72xjQ5L1#|*hkeJ;vXry3j+TVf zGCRf4{FzMCUdr@UiIi8!re)2g8RrV$W5>lnJhNd5XO2ux7Q@cv45ApK#-=GwHSixx zfyZ4Z?cW;X9Jzu9@KJ;u+B(Tq)S*tN!A~KhMa=BOs=%R!PGlKq36x3>7r<fB>&VM} z$^LB7b9@4)<U7XX4ur^rQr6Apkyb-H;~GF{P`E$q5Jxp8MH-br^<8CG!sAg7k-CYn zVnP2Zh+@S?HSk<ENWgYDdcL={^Y>2l3R>s~(bE`H0)p_%W+L!jh13B5cK`ziXIKC` zMiJRKXaV}BIVA4GGY&&_p^+i&ZpbTX_!wy&@=o*?>SH9}h}Ja%D<0LO$*2q_OEZ*_ zwFMGQY=<#<rSdP+v9G<YN#KV&3*;N)QbLM40RxR$f<4WdRb3M5V7;EPfgPHgv(Hat z!hHcG4D0f*fGcGH=*Kjy2$;fR%!554<`+S5<wPMy^GtzZ_$EQG$LyET;WGXLarOt8 z%Ly`v&e2nz0+G$nQ1$`|EmO!miO|k|pYx->(CJap!xs%uj6o6&ochRVEucLT9lFQj zWS+rwr;maC>FtI5**uFTYOA_=hWO=glS`&ZG%3<JFb4Ft3aC5AmPlOEN;7|-%=UbP z%fet3D8~fTY3`X|dZ3L7rt;BKm^jgK<{0={?F~90`CJ>iuOtP`><Nim@}fh~Cal^j z+TV%2Iu!4Nj@hc!!i1fq;et9E(IaQRx+<O&FRW%P;24dXM#7~-i>tRsm}3`)e@LF5 zrl~sUQ9Q{IIA@&3YcyyQAsYnB9dpixi?*wf!x(pbr_3A!$8e073`THBCRT+f>hNT% z;f2G0$-p1w$wgq(&2qIV6{8rz{u@Qs|6j#Q!zVQ(=C>muPnScN)c0I_w*aQvJIT=a zpwU|8m_IntCV>^>t%;0+RnaFtbM9*CqF|m}?Hb{Z`>pZLXjFRDuXOJRD#4@Rcvxbh z9IbZwclQ-b>#N!*62;`X(6zD}YIa*?InI2n7aR;rO}V*n{<pZ1FkHIWBK03H92+dG zs$1L3r>JL4tK6D!?Wb#Et7bfe;?l9nBXLKdxiQ`c8m)SOETgM8%jFhZg&iBY)D^wC z0cw@88S3L9{b0dV?1?fCMJDJbEJh);oOj(h7)WVuHFq6ZCLAbZW3@Ep{M4+S)F?-{ z<rR?%5sH!sb3NsWS-HsG8uR?>m2Ru_b|17m;2)E7h%5L)*)JO*!?Kbbcm1l^DZz;$ z*fsZ~JSLr&TVKn1bOUY?pfmuj98>5T#J;(CU9MsI?V@nlRbyQrK8h^HK)_QgBJnQl zb(z`hBBZ<&HHqqPIBVgVyB({&Ez1pD(d$-U$wqHfaWzw}<d5b_122EE>)Bc-BGIfo zQqBsQN|Dn{Ma`+hMI2!rBLG2YmSMT@e)FU0ri`j`Zf|ocRbp8eJEf;6nQ#Y+;^Q1~ z)Sg`Q5wCdC%AzPRw^rT|9DxWfG_>jKi0jH{+PVmd+a@uMwoeb$^0<O%`~dj3;{Z_S zG&7Jw(H2Poqpp2li67ta%iVy7#O=YUEdOA5j+*+9C2zz+Vp`V|A}sHx*%U2ES>uCp zN(2`7fb5?kCrwnGx1nQ&y>`#R)PR{_>O2erl&E)KR63QI^4GjSmnlh06e>^43N}=L z6D|GmUs|=dX7o9{9wa9bIC_Yb6^z1%m8siA*E#AJpOG_w=i|Fm!^c;+t!XeFT+o85 z(otgC_P8Aqjz4ECq+DMnL#>jYo*OcPM-tNHq1!uz+5DF%hfKF=AC+tab+qOj9T~_f za<C}4Ux}bjMkZF%dFUW@bVIC=yumXJQcO*uJm%Xme(kNd-Ql(?yDdRmZ#&Q7FgZmZ zbNDA-j8vCO5mq@gwHP&^brm?hh*e-~g6uU~-b(mdG(%>F71>%ysyilTNlAbD!DZQK zNvFwz1w_$-lExtW@cjddFq~)$bdCkRahxt+?7jQ&cK7(h+gAtW{WdNV$VUMufB;=U zqQ7fAE-WMb$xz-Hbuid^wfFw@*4t+l-NUo)<kNKi^4aTGJMZ2fJlm`29^>YMOE|E{ zPlCh#%UAC!de0$=)eZV}-*n^!JyN14lcL^7U7eN!prhgu{`pX_>~~-JjKbPyy4n_1 zz$nMH2*GL&yr^1^%q(DA+f?#r^rSNqRw9a>PLAMoSHwuU2@IDdI(!A<mk`vg7(aCJ zPK0kR37J;l9L3QP9)l;52}{8FSzw;}z<E`495b_>u2$<876ZGaD;Xb)4M&R)Lc54z zS8D<|pMrRrSJ5Ft*#P7+92H;Zt7^-L3(A47fQuK;K@OdGX+)apcC<&2WH=GptAu;B z5rXQVqeC`OAQgd*0aE!oEY_+QS}Udqib>M2&a`TMbfmB(&X+(xOD~KaLr`^DPf=sg zfoLd)3}e+$DP9&@b`Z_NJLsSkDfLnn**+T5IkJp+a3Do9T@TrtQpk--L}DABuNqY0 z#(t{uvozNXODYe8+Zwtcj(}1nFa&reZj)$6N?XVoJ8D?7GBYJQ4N7&|l+_!d#zt2` zQLE-9G?`_Xt$?NHkL_q35^%hH-AO!wr-w!fGT?t9E%rQ+t(y1<q^hiz!@dyZ7D}sT zwtN~Qf8z^(lQQGQm8`&X5WT@cS_Rl<_ad7BQipM{I5<ov*%CJ@7&D0bb|-p~%|Vb* z3EI$Bfm8{(J~GKtSY4ZnatoisF7~eU(i2xXx87mVH1Wt4vR2g9#<gnHy2pn%>haJw z$Gi~^heaQHVc~qc_B9Mly%B$V#}Rvc=#Jy}pp~rBBj;W{DB2H}$Yg-d2N49a{4~5J zy1t+F9pT|=D{PWOzD#a>+0{pFi6nAs{CtigR3gqP>>KQb^$c*J;xYk?LE|I2RQH1J z{Va0mbhN|vDD|<qt`{QZlo0D1$XXcLsL}rTMK(Df;%cnip2o5#B&LQN=GxVF`<k7S zo(c;}$}4T-==I>*K8p46j3TS2+>2F;CPRFwYbXt&*8i-~RVf!KU&2QXnPU;D?6i%_ z)P~?j^nt1L(fsou+ud%82%c#6sh)9jFMz6c9O~$Vr<ju4=(*8`FJbe@xwg=@dMb`< zXI=?Jhp3H$LNAKpjMB2WT3e`QZsm9k%$!6GqkvM92B}q(uwcrCQwA*cO>=ovPRDF9 z$;O{-_FB|LdjT*F&O*bCEL=V}@PaF)Fyy-pSrDcVx|@2IWF5y$&~5xk3<pE&`DTm7 zo25opnNCO?TUK1fQwSY-(l#DM8(lOd4M@*do)V$BjPm*A>PTK_IZQUSDO%e5^qzwT z^$A$0ji;l;sCnJT9WTs<eXFUc<O!{S*VSK~34SW4)5VH|5w0s#!a)cHU_V3bkKikp z&v}PXNDo2WZb8_;+__y8tfp0Sq3NlN`A0ilJ@JUZbCkn)GPl;xgMl(2&bcmywq`cK zHsBe(8%HXcmA279?lOXu_1qvuB@|}I*15H?zfMXL(`7ar4LbZ~|M=NY&)yy!Z@=0* zc*&21avnBe5`PHUvhzghc@OvmsSW`RNEMvTNF~~h<kd*Hhd16C1{u@o?<&sF&eH@i zB_b<;H#E;SJ6^FLp+V(!S`nTg0K_$R@uLG)qiEZ^p&y3oO@HY7ENZS?d>R}U-TXy} zhXy(Q9Aw3YiXROf2m4a+AcHH15fw28T22wskA<c+Um<P6SSP-dnGVRvh?c<GgwQpL z!*~Na@~2|~uYxHO@$ByGgA=ZicBQ(fKAk?qgSlqi#||x6ispl!=77xMHAbS23_j_9 zcFE2f5Si*u`XjM~Bs;eYsJ28LefXdG1x^%~hDD()yaYWuJVbS(P=jhLUE&UJ?|m6N zGeCNN3@#g`Qw+u-O=UFr(SvwHiZt|S_<eQ!)@)xTE+6R3<ps&4%U&XwB_)l107*sX zIv*TBc&uXLGxJDLaUkii^$sMwEzXjuF`MMTqwpo6J2IH0;}$X;ve<Zz=;@9Nj+rX3 zSD{%TIJj!Zw8`cVO}Cv0Da>tQ!?*E2;Ch9TmQhx0Vvn6u3<)uf`{(@gBA(?WCo%AG zd^NEJt(M0!0ic(!!LXKR>}xQw12W61!|D<?g-CR?=@7BzP4MFLT?z5|c^iMQDjAe# zW8`9Kfe|A0q+U)Mr$%rUbB@LxEb!KMji1lZ>J8pM@hiTQL1d?XdYa-(na+%b<!pwV zT=hXfF`?I1EHU|c6xy1>bKLl(dNO_|QiY`ogcpL@ry|%zu!0(3ghBr?anV072^Xi- z&~vdUgmJi5k<v?Oc{P=X!e;~MXO7bw`lpdFOe$#79i4H!@MG=ltnbVo>jvRy*QB!$ zXK)Q6dH31YE{X=L>h0`p?Z32(XCdnoEF`01WcSkV_QomYV)A7URHr;g^kD>fyvY9u zoD<o9&-z}GykygHQTGrHJsxldE+_jJWD3DEH`C#?y-q2`JuU#g1n{$ZItk_m>$oE@ zsk>+>>0s?fImrO!x+%#pR=dbZW<`@5<|9kBJ49;YbESh|GBOOh8_Gq-NZZD02<nf* zcCZVO4(>lM+30^XCz+MVwS$F7e&c2oy>Zf}U{;69q&^}_&>d5l=^NSMp|e)Ne=d@j z^bB~YuZn)kAOBLPGF4M!h)WFWj{`V@P+LO|%@=8m<T*cssC`IfWnkOdJ=S>vsELsu zL+a>A%u_lj%SQ3X%-}ZqqhxQZLHvI>>c2_0w|W$En@n({`^W<KyYrsaDdX;(Gwy#Z zX`Hhtx5^o}I%(XhtZ{YH##QHy^Ag87A?M`ZD|5%)Ji(pF9w#f^I8&UH?M{-`%4BgK z11R6LBFPZf^An?mM6ah<x0alLcxbgKQfB8^g84zVMTeGDp4E`t!4mnGXM4x+C;S(U zqU(t9tP^+N!wQN!=v<$iLc?6p6gpQ`PhDKm&efHm;m!@RIlD)CL5U`US$*hC4Gt>V z+6u({1uqvRLdrYr(kfL-L>$s$hvXU`VmmU@ji>LeNfxi4ZT<9&$s%w86KhvboGXqv zv_)<>V@3kQn^vVzI3TG|1(Lt*{5i=98EIG#x`V&uD|oZGDO)NwjMZkE9Sk<t>FE+4 z##_NWh2V)WJ6%Tb94KAnR7Q`t<kM0kqlfE_Wn!)<5Ur59bvVr<FYyN}h?~@(*GAe6 zVat&JHNHVjN$KRI-q?o-Q%x>tiR*m1C!l^7G7xC(6ogVA$8x_#=gp|v!Pv~4CL8c_ z9<sdm>yf(EzLhc;SO+eXd8679vBpzYeZOa74y#<9Z~n4Hv-`0o)SEmp+>e`K;bTdz zuYB$kwR~4uP212uMA`~C31=`*LE3j7aI|Qhw^ow7itd-oN6<PnUhuoFCM7QfM}UeU zklC)vx5mzN{*x4JhP+iydDc5<luS4Tk=gI$Bzltc;{}??PT1a7zvH9R3b>9!+^q?} z_S2N0VxG;9P|2ynCBb!Rse4hTxF_h82HNe#s1x0ESLE_(JNUHrd+mq&+z$3H^O^rE zev-(^%2IPysUT}?+l)39c-E55e{TE?o%d(1kKCSuc!RM~$`SrJNE9j+70iEgEyhyL zE?N92iC-I0v8gp<V{GZ*rxplbQ^^w$t(xm^UhN;K!1|B{2i4;_R(*{js_3MrZ4hYL zz?Qq)4X-U#7hbofDgH@sD?_{<&gM8H3So?Qjr$DA7RxC<RvW8b;wMz|s+y`6D}?BY zBj*wn4*(3I-CS4I)?3=lOWO!3Rd;%gaJ9Rv%5;onDm0?%4ee{Z0D9UCk1cL;GrPXT zBQ1DZrL~*~hE|9kt=RJl2@eTGX_dWKD2p}O&;<yKboucq?yHpS_tfi5ju!aI=(J<d z#Kt;8Bq9LsL%iH5n-K#7|6<5j_veSoj7SjyH2gK2{ls<jr*z_fq8n^*v>Y2&;iX^8 zn_3`jgQ0gj@cPyjhL_F-aU;SQk~9_Gjzwd#?&c-|%cChqgG@jS9;o79vW3!Npze?+ z)QN%EDQrbMWsF~85T;hyC^kErU3?g`3!~Of`$@n{!|O%NRL_ge7K8^tP-pvuzHy3{ z-_$#SF@<;Pga3rEs0#tyRL?LKQ5)B!!GW>7g9F#Ga1>XY@;Xm#`wsK5rdz|$LT{_1 zRU*t~DeRUtLbHwV+*;%njmSS2brg-7`0MMJcQ1mKU1%2rp=7knXf>twSS%~?mo(7! zsWeh8?_twUN^tRn4!&aePIC2<1+;Z;zJyNO`im%<)muhq9HE7jCvB-=57fky4*$tc zEqgFbX^%Kn&K3e}rluLszs+?-UGj1(RB@ROiegaV19^ls?J+YkANAoYzF6AvOMZ+V z|8;ZIzO{&=AEJkwo12@S=Z@14RS@RSY9OT=DBHN@F>Pml__VE_AXz6kLoe9*!JDEN zCNh8FQ(%&GQD~NQS@|^CzHT#5s&&~!(J3~M$5W&?v{p8vjp7gf<gIKFn#k8sZ+F`o zLN}$qgKH!0;Yp`PA#xV#_fbL_(%pqrZW_&Opd&R8vkcw_vVN|MrtvHutI%(`zHX`C zsK|nire!;_lU7Mrup`win}JZ80(XqyPy#*~e1~gJO2jdnwY)^VIuU}Cj;9T^Th_$~ zeyOaBHv551Um{YcE6+&0cY^ou+;{?z*+iQxEo6KK3C7Rj3uT81dmq|P^_Tx9ox6@@ z<(9eGctyb~J-vMB5mR7Q_I;bK0x=iKD(o}`vI2*jNw-BOT+oh5i_vKC*>Ng!5Sxg* z9NXJZhs<|!HI+JaOP^C22g9`(^yuFwltyCxFZnlc#acgJw+{iv#zS;p%%7}!a@W9) zNVE;=w0&%uXEt0dwUdsSvA=nL&cfRzG)-~#rI(SmPg~bD%)6}e66%`>Q6*uMJUSVn zI>aI1q7NNzr5BdrzYvUm&1++8_z`s~I`lo;5rlILyC?9P+e}swom$?bs!wG4BL2mp zTQn>;&fjXZ-LO}P#4a(yR~Y>Bu%VfD<4B=cR_YB);n@^qK-ys40Do10D}*u<7}Hy^ z!B~EL>XAvYt<E{*Hy62x&;bn60yotklR-9aK772{Y6WSWrqxZg;lmaIaDok7r!iH9 zQiD`Ll38PdNKxVw*Z)_R9J_>MY6sxi*%K|D-K-oLY$>(@ySUuCGsp)qIH>WWue&5K zTLg~`>&VS^T)?*;kP^03$S?Ah|3&+e29Ng8Nq!|y@umDhx=|BMQCD|av0uEbF2=u0 zPM)yDv1V2Kv6gL=J*z(BQt}d3d-SLsnbwl~@<%b7f`_|t=v*0ZupsAD9TtzQR><lD z%0PZtfIsKIBg=0`zn~_)9ih#^6BU(F&6xRX*_Kl)#ZSHKgHor8@1d^=lQOw;pAysN zkuzoXT@r+Y{rzVho%#YnOkt0r?FtH;HVp=fZDjAD;Qq{+3ML$J$AtPf{`qZ_P@7^{ z=@2<YV#<!bAo{{Qu;Y^>`I2^lrZtzsFX<{t@nC(3L!xhUGOU(*xyzExF$}-g>SlMz zu|ohrYu3<zzk_FOn^mVEPx3=(L85d%m&lY}9p@xbudP_)z$Bhi4TLdUiR?+rS)vOa zhV-*E`pKoy-$NF4*F2t^^`^Cr=gKG{o=c+ydN1EGQ2@O~H8fVXu+E~z^YDTRDBdIz zlB!+#VtH7E7mS7l#dcfN@5`tF8ITTP;)bN8xXWeZ!rDJQd--bTHAIi3+-~Ld7;2;C z3K(j^WS4RxBw993C3#O(bmfP$6df5L0TD&HCM~Tbrf3(NmWJvSrhkoS2$(fQ_({<^ z5N6Y93Upc4G#Dh)X$%oE%Nl#pEuCih*|e<L_J>!mcVE4IQP%Wiq(>@6XT^@adycY< z3Ec?g{X@eKU3F}kzUZvDPr7{uZj>&{He3&1=lH8DYKQAPR3@4|4OEt-UD8Q86qDvO z%wgr!I|loHkQfW?sIW!?7uTdm_JNwpx8aH^yfzqm#jM<%qu2L7WCnpSo#X5pL?V<1 zK^W>|Uiw76mb=ygsJ#zHnfIs0@L>0rYd&kDX@zdPhN4<Ud$d8x6_$HHOX0>caqe|a zLG?A5t6rq+DqjSmOG=;^iLOI#b;tC!EH5g4A;nP8r$?)>;sQ#L(5c*W;tVwoBp@!r zXnF3jVL+P!D%S@($?7WSN+?P$gL9+gx*lwAy=^5jZBw>O8zob6f<i5`8%r7AqBQ2> zD%I3lHF5!Ul^5>u&LeZBj2aMKsiO*VovC*mlWJpnm!2nOa%_$DEo0ziSV*=d_!;Tv zur?{@OtV%|SaW*M&(qPUR`*;Jn86-t)fxf7A#sI?rBW8DCK5<gc5JjUHL4-M+TPlG z*C;Tn@;0@oz|_V$*xG&du2FQAaOZZKB#z(2N|CO50SFveZa&)7-Wv5}y;@KoZ&ta0 zIOCeeOEev-H*31G%@hBgzceLFZLR1MlhohaL~_Rao_fl?-J<{g3&mJJ`qW5Q(19m^ zR$pvrjnWa;u!KX7COh$DcZNnZV%%j_q;rxJrAx-fy^~TnJRS16zyQ>lZ@dq6I%xTl zHX5&lMBri_9lgr^%<g=7i4a|Yq93QLOtT?J!g7zgTrpV$vBWakL!RTiuCAzu^VDKd z*AAFTQoXu^AlFAbNi}PcnnF-u55e>e#CQye8At!QNWpiQ6#<JWI1X_=NanNk3go^d z2eZ+=gY76CL;7a$o=Mn<bxq%7Zg<QD=cZU-=c2Owuq%QIyVnlUqHk1g_Ld_bCSlrC zns1y9w$_9{!R#EYN-4mH$i-MfoTY>r1s*qwRYML6?PyveoI5S0p~RFkKw)SY#LE8c zknTMXf2F^<?5ncEYBwITP*Il(??zDqusWe5D)7`XYtWV-lslMl9bc8ru-H_2%B??p z|9WqKy=HQ{5FGW(s!4p!$?BAK)fke$8K!VZVt6H4$6Z#VHYgO;u%bJS%iNZ{W5NV- zUzs~E`eYtK6%G-`gy&ArHU90Qp`UD4KNCT~RW#MV7V&HYnlEFd>D`Y4-^CNWUu4-E zmN;d+d6`AtMFCLb{%Q~_7@9ioksL6x?CsWhRXF6+<j5|BdepUVy7ZMkIxnZjGa&X2 z=ig)liu)DqkH%n`N32rYtApoDz5r!-no-cDupzwrm}y=iPwk)hkg6JmUOq8|R20u< z@lx9Rp@}}#!mtpzewbA+y{Eyxl?ADCj=&IEWbzJH{<CasU9Bi|l)%Y>2n8Jn>LCP4 zJJO&j(jEdoN#>Ucuo4WkH>ah{b!gTgZVr^Z7KR`-Kun|lSpcYt#=t?=GSqomAA>Tx z+G4n{pnYw@&Ed2iaU`&L8%K-rDb$Wua)EyQ$GZhtzvD__TuM|Pp7QI7?gO|<1E8g} z?qDL2TtV2mxxfh?(Lt)^ph?`m<%6V%V={v!5GRq)Q`&H{ho0zxX$>VZth2J0x${CM zfj$&Kx!4CcFM@-abD!KYCZ;0J-xk1^AdMgk{p9mPH~Bo!%cHuz<Z3YL?oAVIgjb$+ zH(LWT5IP^#A4&n~ge>)A2L6WGbQPhI87k2m!f5j>Y04w-(>BLGWB4DP813|_U{j5b z@no!A*aDp(14*4d;%%psEQ46{91k8vDVq}$qbM#YVl6mgLg+B%k>6Gs(KGbcx=cBx zn7iq?rrB~Tyx7g6iIzo%WHHDI)v+=}r!Q!@A@H4GlujJKkYh!KJ<nb;#O!S|_G@*b z`mR1ys3sm1)G*BRIGP)!d-HrY-TC*u_)al~B{T*HF$|H3!Eyg&S46uGYQj$kobQSM zRdb;SqGH>rL~i;k(L0GB&TzmHGvkQCGRz3M@|}t=YMR;7$;Vv*lH0=KQnEE%mq?1w z&pGjgmxjMX+&0zQ1kW_y8HLSIvKO2osr`VW+Ia#dW2RFrqlxeys!c8pFvMEmy-6;O zw=)8O4xvjY2uEQvICtz2xvMFM>DdN~pJ0^zamF5ua9|Ri()r`fi@klQlg+?<mAsIV zv9M`^yBPeD>-&v@%LehZX*a;Xi&@-X;_iS;)ETC`Lrb#<6LjOX9qrJA>XT@b;()?w z3TGdjPp}S;icCyDK_Dhg{7)PE(T4|i?FRc-Glexf9}eF91I2uLub{(+KI4CO)8Q<h zo;mqrZq`&3scB^Ii)Q05oAecN!#c+6RlYb9v}bC5n%&L+Xg=D&aY5u1Wk9@kcldAB zyoWm|hDn0*C-5i6EqL<;9Mk*hn4*+{{)0W#CZG?Yc$u%T%6_1Zl031Fj>#3VFEIyG z<?4!kj*vhi)R)0s0iM}03g0lDBM$o+{`cEn=V1@Ris4Y9O|PS(!IaR*>(@<q$8Up< zaY9tmMkHI(@Cu4wCgYT<;2(;N;Io^7L)Am2_S=R-B%)-$;Xio;R1Xe!gSDS|aBRuX zE}RkB|Bz96e3Ijc)VV!zK4%kuWV?wmOFtdKo)t}1jW;R6!0#}r+@kgM<4p%nHYvi% zCM~Cih65;Vs1_Cu%mYljiLE$DhO;Ee+nRjXdR5SgdG;O+UTYK?S3TkU%^etgYl+72 z1w4^MZ~ILPcSFHNTs0f<5YS`eLF$z%B0%391hPpL0t{nA!7U)bG)MsOS;R>yq6W5U ze#<Fxg(L$@A>+f+IBuHXa<l<hDm+Wle?A*Sz?WHM!$#2kkvI}r6RT50`_SndD7>-s zjr9R;;~zA)UZb$`mV;nLofg;j2ixN>o4rB96A&4%%X9!T1twSc24N$_O~|>~-HbLU z6Ho)ibFKv3<8hm?ORi$fMpM!iaaL}EytU(S+Ef1_TAdgL{@g>JtoB#cIic$zNl?B2 z7p!TKY%4P1+UrzTb0qw-#+Ght<(=_nU5ymeX<ej<upFc`f7MLSVFh~8#fc&}y1#?C z#2)-&OBSk9NnmeL{o>wYFm`V-?^A!2?X4gzjgsA43KsuSwzpskZo0SBtle&JiT*zI z-txQp9ru>)+TUOIzh#`hoNW`>2?d!8ZnE$~IK!}nF-A}Yhq5%Du*|Ou2I$+n5wXq^ zi}dvo+Kg-oSU)GEf>f6w(!8KDVF_VMAR$x(qvuSh1_g_nw>mB`05b#s7Y?+;sl7N~ z93g<mHg*S8em-WyO==JBTm6(YjF)J&6OSO5bdK7?2_(-;&}W>sJ+*lI2GKencPgZ~ z?Y(Av-KIX<*kN1Y#agNB(5@FB=GiWF2QWy~H8P1BoY}E7rT{Gb4hh{hH@UUg8D%ZR z2VRJS?Cl$Z(=sqz`+tsi<`LUNBsRdB2@SUs(GS8ggK%t90)tv3$P6K#Tjxm!Uz*cR z-@?&r=_H85X33!D*q<lK9Q&Y2G&3MNP~dD%IR)O4oJIY0fU{oZNUT|f*jmN#4tN*Z zVWl!^!-nti%7TG(ppd<^`li&02!Q*5Zm@R!__`A|T~L69c9WwaUu%#3pOSv>U+_%= zG~Kir;RELh*A<_tCQI>ksgD-N1wdbS$e00c>7Cc_<{4arrUnP)aDw<B(~ZnleGOIL z(PiKpyohTlUk93?o5nnz^qQhIMR`_uwk24K4z0sNm&Bi7vp#kCV^t77YlZa>=D~}? znkcJBtfp660$YT_p25Q6JJ&u|Y-(^V8Lz{S_Ggn@%T1<3R&pf^$vORLH3-$Gr43}= zfe8FwiiX)D1DSeT+d0wS$W^J7jj*0F5^jbsTS-4NqiLr~kZ$Tj5W<$I>RW4Sy0C>+ zTT-}7eW3MoqarGgDQ9LXRk}<-pg1bN=&?r;$RivpL#rKfCaX0_X{-KP`%V43rtDcT zQ)ch4fBp91qfV~}8YtXj8{O`=j~_qmbsm5B-NTP<)1qfuK<UHYx1Gn29zWzJ51}!9 z=ytokkE*`<*Hx7Lm!fQCuz-qA9g&6(Yfa*7HvS5|suYH7hG;Zx3}>8RH=%t%@3+L5 z@}}+HyrIKE4L~3no;I)GvmTPRIbZC9dW>n=rwfitrNiFR`;3LI^TrwvG49iGRMQ4$ zh8kr>=b*Fs6x|TCroQwCABu22)s3w6h$jOZ^0j#b4gHqDRYdL0Z@~#hg&;nj=orMu z1IIJ~L*=SBTboQ;DxQ^xq-y9qT6#W`T*Fu{r~^pk>M<qSctS;vAy-DoH=~>yJq&%o zGGhR?2A}R@Fr-i;)W19!2CkED0MM4L$<_v3#!@iV1L=aSath`7Svn1uz{O{hgo`c` zcm*FN>*l^hNrK=9NXGQ$3<`ZP3T5LjFC7BSzZ{la17@MJlxd9p6AMkbun3^}RRF|~ zsJqn|(=yUEj0*oGvJRN=lgF^F6h(UTAHqTAec;TewxQYoqJ?tk)UI-zv5C`W(g{yE zUm^p;D5KfAy2Q#(++KvGpZ`(Y`jPcqS)nIEuDQuJJWEG8SyafA#j>55r;@Jx$y)QI zJ%&=mMTv9yq3My%6-wHyq$fU9wAAMz>!x6+04dNwQ&POI!?B@Vxm5DsH_uceFUtI* ztYEZoi*hQCDArHf4jLkPMfig{!u$;ssA?i|${K9{T26oyE&TZ3p6UqP_)8}0;Bb5Q zur(OaAB7XhJROYI@614h5GlCFx`Uvd|689A7Q}52C^Jd7IvkzWhT1?!LnblK#}f#y zA>y)Bp4MVm6>>qDOdthib>-Otz2ST@;HyVV8%uD&4;{KTzHCQZ*;YG(j0@wFt;rA= z1E`-c%}&b90Hi`t)yedh&~EqLv;FApyMyRp>+jE^S8osAMO!;N;FWO@{ru|fuDQ#x z<f`z{A5SsIx_&l(sUj)C09ok;is2dM69lPt6A|crJxy5xckr?|@=g%&`*aS{Y!K|m zG=0#cghB9cu<>3t8r4K89iBmaWU8;P9f05<RZ4^~axm|us4-#=_$5}a4;>b?CUnKu zvCKF!r~`m|W{U#2zoa?YFLJxn5fvIVK+k7yBo|2-D?wp(R>hB6d1eWT&@HMCC~^*1 zS)8Ly2znG?S(}VWbaa2bI;wGc`Ubk6F3f)}&$3)}nCe*hMH5J-@qhbG*Zml}dAVEB zUYGDE=l|08Z<GB?t0;68k)@N{zI0=dv64pB?p&c_#{Rg{&mgvu{_C4k<(O_h6>liI z)enx06@uFPn$Vi2I9qT@jLzgv_ji-yVug9ZO?4!{5hxWqoGn~T0Pk=;e25q&Mz12U z5Tq&93&EiWl1ox<;|_kJK91w%2?r%ZsyjjLHE6Rbk6acZNu9uOkVt^mOyW^s-57wo ztv!A&U>51ACZ_!4VCg)C@umI6C?<pFrHS7}7_((me+JSSCe|J-`g1YVzKNp*U_1S( z9ci1@5t}S8f&vc}hnpW;1}hj~o7MLeWQ`!>)RWE(5Oca@EHv<Ifx*DRU;swtQ%hji zPIuHBJyFGA)1fyk@f2i}&BEuHn1VKYo?m8a^5_l$ei%6fb?<kv<KBb+!ax5D|J(a7 z`SMO2ThjtI8B8BE4ZhGNAl&-e`CzecdDBIgKK1H>hAD_B;@;6zbFyUB?S$=$VabtH z#aW<Pp>7ZW)~5Ft9RHGt6AX>mddA?@S$mGAyasC9shMKbu3@YguHK-w@zQ1o!AuIt zsRjbvd&<xA3LCvNyqVQZZtUqV&bFk{nY|P_n~CO5GvK8WE&9m#+28|gR$y&m#nSmw zEFK((;uka$zwEJLH!V&jvFQLT{0^T5OZ`bzYPz8XB^hA)3iRVP^EHO}A4~?5Y_frQ z2~A&rk_z0dD{yG}iMspkBSvkPSb>ZJM;yNGBm<5lXT1flK(}Dd&s--j#-wGciG^a8 z9Mx^&(3OWa!c(_1jZ){z+p&UY=rMaOmL)Bgr7f;YT3pK(dThV27*pKxmJ90q@ch@c zo`f{XH4w;@f_XfxU=-)>Zd=1{Bqxyg5wq+vv)t6oQt?nbaZb4%>&MmuhjQw+5>tTe z5#Lp{V}n`ECq`i>=GN0>@W3|oZV}JqxG6~L%WKZ;vM{sQ{61#Q5|cTLYRp=o)h%aj z>CYMuY(sMuIcq{B^~Hz_1oa@uC>({Z)^Pk56@;L+kx=O0wmzfwhzs*#>I)c7fp-mi zDt>(QtOjKiI!-&HSz^P!eXIu!JgrErB`n}0rO$9dvDip*MX8uu&EiWn2VvWJ(X)QH zYa6+cn@Hg>7^z=%(B#Ip$Gb?^x0bD~;?E+oLO!k|b-Q6*eizwWEtFlp3IeiJgH(q! zUW0g88n3ueDH`E=4sC|WfVS41uT^W_gLmjMQF9)&oVaQpw8~(`G*Gpbvw$q+J|^Mw zh3NBz=<|iB?uAJ0RQ<gsg8-Se4u4QOzZL8OYZcD#0($@{<DR&~=bP8(n^*bG%iQMw z58c1SE2l0f$v|Ji4|qY4q#)gD|Gb(vD7J|=26XE$;R+teu(4fHNu6!o2bcKF4F2HE z;I5hiqow;lq%RP=To>GImy;5dr@Yn<7xk-lx~#TZ4zLP^f4+?#yr0$8(iA-|P;I^T zK^qnGD<00-8+<r?Luu4>nnvxM!Ig3?ky1l=z~n$GXx(%UbT?twS%LuP;|FEi$_YO^ zm|`|ZuO70hgs2e^CL<-^I`*5zRL6Zbs5}AM%`VaW9K*Lz03F@jR72~`<RaD1LU3n+ zUdCh(iWxik0)MuE`~C><@i0f39o^MgGmi$1ICM-Nivcpu5*=g${{}FVghS-eb1IJ1 zq!Q1i9w(2SRKnzR^e38i#vSKL*Hv$)>olGX7|=SouLC;y6Ke7v%nnjusl0914>uM^ zKbQghxQ;$5ixXhg7$F9)Zk+p)bE+sbtl7r;;qd4Owwp1{F=Y$2<nQX~TejIKHgfyq zLRuuhZU5*8Z9T$`*F=x1L|ZKD?h0)R9eNEZ2q7#SPOLj-bf5;s)nFs0FjpxWqhdIw zneGgz=Sa^2hD34@(S@dSQv+gpW3-k8P=pH`#3MmU;;hgu)f(+y9MJf|g>R}j9Te(; zS&ah-e%q8gE<|0`0f_ZgEvUDHXE@sLzOs|?#H`k#HIXV=xmY_JIO|}WiDj$+=Hplg zA^;>atQ#RlEhJ7s5UbH~-~bpj6}u54*g)bD0<anl2?c;C+p`-XqS{DYO2Di}$HEf( zNiI9USktHkXe3bG?XuX0n(!iuO|j;#vscLh>C~i(v=nlOIcw!saX`s>R83E$1m@3o zp`rt_Fr&mI%BGZfh2;f-84fiM@S7?a45BdQenWQ!{6<w>IxV?jVM)9u&I)-=s=AWx zxLIh)yhi>C78_P|Sy)kI(q#+k^7g=b1{xQ+eH8=(P+Uy6nY)%=lZx(~cGRq}kZuEK z9o+^M-N;tdD71)f6Mqd0%__QcR&YnK$Xta7T;z1Ej({bTB#BHlG9sNiUJn*Ch;>AN z!h;t)9`IKXR^BFPY&$}skG?@7J{5AK%f9j-{!ahwCX;bIJLgaPd<A=vWV2x!tG{O` zz|!B_$!M5zRID|KGZYWF%5%8XD_{9n`7BOYoBQE>20ilUy#-j;a^-!n^FNE;LHxV9 z`m%L$eimP=AFt-I3emg;SC<*gR&0N%zX6SSw%}oHFGj;y7wlXoaAnv_ri+siC-hv~ zfe<~aaF)fo%jf9?XNCs|{>%#dmx~Di<L)6cs77hVF5~#ef6^a+i>K<--{b4}{0t1T zCwdKFaDUGr&;b2@5Bhpj_&zgz?qx8idP3sGAdR+W@rnMB%;3*9+)c6zXfLPDLf(ff zjJhxG!&}NVFE#&O>iK~6d>(BL!DBnmvl)}xZbk;i_#_ZVjl;!J!?+=En!=PWy(HT~ z${z8HL}6pFjD3-ApAtC2t5u9{=>P#dwf0l6V_LEk8%oaUOi{Lpiltt&`0irwEZj$e zw$zvo2+1FuX)#(OsZ7Ar9s(Jmlx#PadAq}#LaeSnj0irRp*{v9ymzAKHiW_x#WsIy zFu%rFk+{7S-8VSSEIHh3Tqv<7iz^;0POkdN6o;ARdZOUE3do-<)fG<)K!a#q^|Jmi z(HUGsLEabW2qX|E#;zJ2=Z5Iw1`miyKi025Fb}DUM~b>NbL}wLdIQTa;utcmt>+N` zoF8)3v}^qwJ<xbi6#h|DUEurkMU0^pb=!oT63@uHlo(?hX^wUvy9Zq2e;~kybM57I zy*%TDOD-Y`&lc0v8(ev{(7C_T>csIEoPG|EUdEThsH^7tnVRZc&oxaCA4Y9=)$Q%d zS^CK4zVw#f=mMQF+WRn6MO?b;9i8+DM=(4BpMhnUu;ssdjQN5Kj<<H@@1FX-e+K+L z>UJAZU|>dPpt{wS!PRm)T978hMU;IqxjFz_r=EF0^mlLFof~?W#$ByCp!)w0P?K%w zH!q)ZZg3PlDlnPvuk5B>)o$&~YC55)#q$$X3H|2+@2IF9VpddQc<x|Ov_8kzcdSCi zO@K@^F@o1-<@mdm=Zi5#|9HZ&J5EfhT8%lXrWl8|z>Axkgw6mum=D&^46AxqIZ<V{ z2GC@v!f>7n@}bel7hPyVaq>xBY@KR#+p=)@0=L7fBa;kdRn=vA)nW>XV5&F?P5m8) z>BakA@!3`I=Eo;XofuokC|5BHj>o)l{8$9Ez!d#MpQkjfr!mG>1*{Vg@t9SU2W857 z|F4jMoor?*CIWnixUuqS{t0H8?Y6(=^+cA?&^qDb*=d`Zp&S|@k6K6OasLr%Dz)Oi zq5;L;gh8^Z(@`07t^k4KLxtneqR8?#^BQWb+_%_s3unR5o}Oasg(i~unpD2Wyx|-l zHr!a&`%MRxr+hnY`={HR15P?F>TTq-EAbw8e2CMD&O+_><N=Z{l8)bhp&#qE2_-U2 z|5H2Z-?n`3S<JeEvGAjBoh5dshHzzNu<OB#J$b9JwiYIljtv9C`w+T@)plJ;9d}Ua zgDKn{%d#7l(wW%{lF-Cv_)Kk|h}s^NQ`@6^rM4gw>jdJ?)Fe-g@a6EZppW&ZqF2oq z`vtxza;j^)J)2pBvtH}(ih?*j!PDs5!Wr>xyZcCWBs4%y`f>r=R#DF1eh1yhGP#)S zWmEN{B=C|BsI&}rw*>ZI6=+iPltISAGQgW<NcR+Et<)(4uFA{cKP<{BZbvXSJqB{_ zE*}LIH;R%@q0gRUQ}^jvn#~(8QlP_gEX18L19gzp!8VYt;rW@YobQ7<*5Hoh`ERF{ zlF`dfDet{W3$NqoNMX`c^|{KOc<l;i>+`QWu*zGV%)b-kGY54)d{Ez>{XHtMzenxv z<NIWP-vv1d^wPaM`|Fj#-n=XS>y|-&ct8B_+iLy?nN19*y*K{%@H7AWefZx$DFeK* zuvkM{TnkByen_6*hlvtbThl6JM}Tzoyp?QJ!u;;`e9}knyPGn@G5|F>URm?{Y^{oY zedn{ToA9pNFer|ZBO>7lTD=|f`pk3wuM1t8h&McjVdSn`a*glrk86B?SFZ8>-MGg0 z_sTWCzoEc$OJU|SulOvU`~k%it#d+?8CN=S%w%e_naB6XW**;_%{;yvn|XY%Z07Mz zg_FDU84B6=nazBbNbcbVgA$3$BaA?DJ4W&O7IR;>n9q#jvpn*@P98x+dhfZ7&Fnz! z3>igY4BV;dpb687rRoDXa<)FpEB7w1d>StF2Yt5xbd2T`+5mW4|9^?Oh!H<rmf$-t z-7{bKES~%iizlBM!yl0`d;-g!wcpdS2RX;D=!+l2wPi@5xs2^)5!E8Ea~<ua=_#(1 ziq63{Rmniu5|b~DnRgC;59Z(Q+M3Swtix<$B{Qj}r^Byor;yg{NJS^0#%n@evKHgM z>$fuy?L0v14qo<{ZJsjW&C@X?d&e|eDW=%sdC<Q2s@CZ!MmKzAwQb;-)a}7^Wspn= zVusIB2&@K44Cff(kTO+Jx_WC%-G9dKxW<f{Kd3Zd82*L-L`JXvCaX8`n-flnw&rn| zsu&vvr-pXD&~?n^R@CCuVO&FH3X?D_D<lx=C)bffgkeJ+96e&)l@;)Y=JbV!%>q1@ ze2Z`oqu&}32m|O2oetiQ;w2nRYWj>BH7<;p=Ch=Ko(z79M`Ef4af`1+!*7Xx7rTDu zhC-4z*AiXjg2g9xqOMI_MBJXi_J5N5f`?YLXx9u6YuB`u&l!I1!l(9S_VSqigob(8 zXO2Z7{Nx8TF(44oL5-?1rCwC_KRZMEuWvMAtTeyBflYq#3v%~WL!jj;A3#mqizvzu z&JT>QqCoxll(tLIc_LNmnTmZ8Js#3HRBFHy*Mq_=mBNyOaGi08eP=hqY(DWe7M}~p z-l^b{Cr5HgCpk#FO#soRRxPg|#f_m{_glt|U#Q$}pV{&MAUjsc1=*#`rHLVPtzikX zm8tpu7jWCYHd=4c>~Y2+^9^xmlx=f&+@m)!$EMyauSsXwt3lx;8yZ%Tmm_=2BVy=R z9p37Q&|}r3RDYD76Y_s2;JbWYT`hR5)GEZ>@r;WJMjBQ36+AIQ6>ou2X#uX<>ZQ2v zRlC8#zG9*7a_-+?n}s{Cx5MtdyKb<vR_~S@@01n0<W?kigPn25T~Uud6k02(`=3wd z<74rVX^noQwWU7U{?>wCZ4r-q`m{3ME=0S36Hnir{0d<r^XCwufwCkwr)|npwg9*1 z({zM!WLie6F^;FlkhCx_+z3y1@U{q_RTJbLUJWWJG{i659X6SE?BCtZO<6IJcpkmH zF@t<_+A8+6pI#@H50U@wE7WYAI<g1j?M}4QUi@(Am%kr6mgLw$t4J8Zs>q?-s@_8C zY>}Ag5&jKGc>`ELwR*mgH+*s#&nB2-QwOqyKRX#!CLeT_o>P7zBeX?28c=#_rBTN| zaMdHOSlDdMrb^uk@pLS__ZU*O^&dT$GF5(ED8GjC)_-hv9z{O@1%w$1bRZW4LucZ_ zi-62E0!I>>VOgnl)T&}sOw)&78R}NrGeK&DB$@7H)1{iyT1?E*r`b@R+((^#nZKI+ z1A-Xl&1?AYv5LGY_9W=^Y{?TFwg5kJpaq>ll43H58s4%(bVIG31hxt>H2bKWEZz3% zD|TZ(Nk@2#lvP<8s-;#c8@a6r4)Q`zOmz;w;tu3uR0Hs)T<;=@Rvx$wF+X0#78$4X zsEz7rxeQXY`Bim=AblyOoX(*3;jc$!2gj{x2SOSxhZ&I&VgEbR&Pvu__ssZb=Hw+C z=oZZVUb(o4P)z*U5KGfx(rqFKezA(00ajebco_o8S;&Kd|B6ST+c4Z<RO6C;K~VCu z*o0bfw+WS?90jpq_wny0eSvLD|Mq~e79$<iB|YV@T`idCmu3t*3_D_pPs|VqeUvzI zDnpWOyfZ^%ZV_TAuO>V6Zxv4B0hUV-yGJ+c0~dQ`53Y7ncG%S&(vv%Vq2xApN~TOr zH<}ZLuEZC?+~bUt_Hd*5@I~#@m@W%JmK<E#K6KJAkQu%R;}<ir5PloDBSc7|a7gqT z<KBhrW&zIM+ueoV0Gl^7_P~F&P`>J~o_CkimEB#SIb7SHdY!ApS#(f>KCfqR=xQ89 zZd-~4XNGNtZ2NYW$sZu|tXak!3J+#6WW7t<jAyHC7A#2@dcAX}nB|P~kge*zl8&k= zi3pZ|v}v;`YBEoFFthmCW?{!)1)BwiAX2r{?~-bog2WfTlew!`AZ3@@q(DX(hLk;} z)GfN@af3j{bL*g3F6;-1{T8|i${D8aq$!48!_!0u{9|DYqs7y%)xpYfD??>p{G`{7 zqAI>}lH_I-TMJ|0$Dm76k@X3^yr>|-^<}u>iK?^7)#SJ7-|kVXj{fAvaMN#!ko`5H zw27xU;?NXL-%GWDyM-NMatKIo<qb?zMtk`|_xsIOE7U`Fryjm3^x*VSSi6wO#$)9D zKzkRdyKE2Oot^e3ZsVW;7=lI$Z)aQIVtduoJy!3)aGbr{uu^gIPhp=;-2*weHJxqQ zbv9-3WcC-SOLxa<FQk{&{qVoe?ZnrBHuWm7RL(7IGM8H%>^d|8bA@jBFt$KExv;hn z<j8V-Wa$IUleBKn7C+6o5tdSFu3t4ryvGyCUB)nTFQ<qbE+(bQfysO~*-wV!1hvLI zw|N2?fYThlIvZ&kRNVHsl~XhCmQ)4E_MB05dlhwix^D3~zYhU2`}pcVCB0?d#RN-J zNQy*%FJ;vMlnk(H-V=4<N3b%~YYwiy9$Wzp43=LHmWHa$RvYl$*;yN%O&N1OaR*EO zYZ*2PSYSVW)lZ-Ld0;m)&Aumkp$(5nq3am0xO+@n_5x4omelUnxD=VO0EUaN2VzM4 z0Y_%obC||*rmR<()F+2C6<4)O6xMU8AQ@urs^3Zo0WYf{iI<iFoqY7bZC8NnRf6jY zaFI(#T_hwVZp0U=F*)Ji-6NtY^?4~id!*Py5IqL5EkJBr5ZeO8b^ydf1o2Q~(G7v% zo{J!SN{1nRjp%IPxL}EUo>@!<r7H##x?gsA5B0uAG!ZoXb@fovH&pq7wNLPuPo=9n z=y3;K(?Pe;LC<v1yGaKmi}IBKgzr?-ZJPOwk^id1aCRBKf#G~jWU>_Bm+Jen`>|A> z@g)s=%3)60t9V5B?^(QrG*@%HCa7!6M5}2!(M~qtjBC-^d_H~h;6a|9&hy0#!ry{r z)%d~ItbYbs)*i$obeWi+jgL3Gn-9I8owNB^B^pz6t!?aKJE7`MKjHnRE|(wM{B^V} zd}O@oGbepRJ1J1StKyHs(i)P&xA8yYeCQqr*gYwQn~lIc0YHr(tVLkbFnjVEhJ=Ra zR?$aG#k*dse2`S<nnH1kORXNt?8j^K@!EXsPnaF6pOfTLO;1QQN+LSVgt~OAS;IFn z2E0TWN7I1T!0PwZ(K2Vv_*beMEL49U>Tg;#tG{<S)c2bGT`~o>g33{d(%U&pZ>DeM zN1*GTf3p(YIbR7`f!(y9kKl<B#yY)bx!9>sNll@I&34>2KbAIOXi{;_6L*1&-kjo# zri9dr9uz=$HH?dG6A0o5S%%yHV*a(;{>p8C<>0bLlmh=DX*1;5px%zOlDt3pOAk3R z)@EVU6e(uLO@dM%XxQPIW05q$^8n<#$(wXS|HN=)K<*3riT}n|TH;Zlu|c%KEn3mn z@ODeJ@HLp4(X0_5Tk9KDw!&G!ay;YZkTYrhgY+*z_Qy!~u1kiE0xoY87J?#4HtA)D z3cUreSL~hN9!0NonE+_}<lV%tHl-B{o+2r|(0vfdY1A}k8YyLB^?}2RGm7bve{mY^ z#8_<6*im+^O={V4t_<|)Nt!>q!h4d{9?*tpGANiL`mO73^)dNzleZI9fuxq*R;fmT z+d0`aJJZlgS@ITha`=^;Ahi?(vgmrFh)y(ENkja=E-6Spw$tDAg2l6Degh8nZ<vNg ze>uWuQ1bRmPh~~WrS{2|&ih6U=(#jdx?}ybWS>qqJoZ9oc>r8KJxj{E+Aryf+9VAz zz3MOwjRP<$={3QVJDmU@0K+U({v>Kdoenr4@zbG&sWRFYcWl7uz!5iv(Sgxt+i$GX z=FWU8M$r=B+F$bWB~Py+xA3>13jANrFwW~TjPoOziI$BW!#mdX2lH6hBD7t+Q5CE< z?1a}azc^>}3$+l{rX0U1bqntyqY=H*AC#oTlCb!q(jJR1km?yy^vn$?{E_xkTD!1c zUOG7@tQS7NWgj&lWwFR1YY~_InpQ_48aU?c!a)Xjd$xV5Hk!oN+P18%1y}-aM2=|6 z?s}Mz3f>JUtv#lk;S?8KQ7s{~mU0iv<JgY1_Sls3RP!1el#b-mIp428S{Vqz32~-S zm%K7Y^MGtq(D|9Eu5)TRDs6Fk>1S7!mdfro{6%fC0hgkz?d9hv;Lmhfp)@Q}6zjpX zOF*u&Yjy}64^K(&?(tb_BYXq(WmG)u%z?nmVMas(ZIM=#ouH|89jfJ63l>V5gM8wd zS!I0BinH*>yWLDIL$#LwTjs0O7`@Wg$H8KyboVB^fCIlo#*-iP86*Wh==8I^_eYTT zjsrKhQd#VuNdha%UpE?#*J8z(0<~{CFv$*zydXTpa<S_Z310ODsk(w1>#i*Rp4@dT z@91kHn2eoq1}~=11$GqbbIq4*TyVF!p<8+D7N_>H{Ze)W*($DezjNGh$dLMH3)NQ# z$(oI1bF+iC0{La3%JP49eD`_=zJ9mQ4&%uj=oJKNHkRpfh!^;)C%*RdLC6;3Cd=Xa zpP~Mrq4dx2e)MNZi1X)1>juCL!J50D_4FYNn6t$&aSnoG?7Hio2IhOu@(_^OVXz#3 zL~S9?jEVVa;T{7?`#{^2#}~j;P3}GlV$zWu2$1)g5PT|d;coa;!McYM&XKEU<EH9S z)-Z^2Rz>xNp4;8$RJuYFr|Xn5^EErkd{(Im*O&B<Rke;f3(JkW)iq&N)>OqHpDPl& zyDq)ry7UU`(koq;-l2r!9C|%F8+8_>XBH&5BE1?b(yO;3Ju!p5(iL%PIV;kuu4z}K zSARu#hJc?O4`MRoBYemZ5)2))F{G1D;7HBI;`uvDQJBAW$CLybT{P4~gaObC0q6-m zhvp_vEfb+f9^!!)NgrM=hV}=BDic&{P^1}Y3+{4gI;SF7&L12uPl^Jz`P3%8R#8G1 zdSYCp(kksxt4Yc$;Om>@t=E;cuRj*B=oPW>$5z0iP{F~X=V4K(t+Bwz1=JO#`A=z{ zo{-TO&P!Wi<{p=)4k0K?Z~})pgu)g~T%alP@GC=`-i8U)akfiwKCNyi-1s8RS9Sn( z>`%Y34A51WN71`}s{6E^lm$l%y{_mk$_0<Di=lEQCYxUS0vBHl|Gka>{e}Mf4|syl z=5Hyu%4S>tpZ7G!Fr51UOD5#u%BB3S=8E-`_p9FL^>ZA(p1)Uas)pncS5!gbKi}x` zD_!&p7yV+3mb&O4T=WlHbWKHOsOk^(a4Y3IG(O?N|F)(x=9!jst%%P9uEhHmu`nO5 zRp08vNAFR0W8+0K&pF>bC==tM6`43%CMP-1R6M_^38~VRlX-ZNS*!AvURdt5$_7l~ za8L^rINRTvw^!%p9To)MiuYH2g{Zjvm&2~p$gb;+uGgAz=W5TE-3qaWK82Rq0*nM; zF{5)lhu?KnWJZ^KiO-t?LA=D@O@Sa?V&z;=Lb#y|%BLpa5EW9aDkMdd-?pVNF|jW> z4vTyN#O0udVhKgn>f(wu6ghS)0GRm-sJ+ClFb$9p(C@OTT|u2#5Y*hOjXR*3w(w8t zyVWW(^1x2cNgHRl#o-~m4S{1W;-qW8d9k;@PqX;s%P+8$qqe{e*?0&O!Lt&p`S#sG zr1!=FR={+6%M+Y2IH2;gY%u~W_Op00Oj;cUFz)xs8U#ddpzD)lewhHVZ_=tfLc0@) zo0_K>8x$WM3p8OdY$CX#0f@!g@+|0572uyR-ba$3z0Y#tBJNEXy=HM8kKn0+)_EdY z5M(x+4LYx1&olY+-8_5!y2&tFU|k9*v<j>{v>2~n^FV)>m1sw7iid#tFSuu)qG$IY z>8E34U8A_4sHVGb_Oa=yvUUWM9=IUjoqUiCX9?=u$LR#F3^^K|_Or<#@2tIp`I}v) zd1d`h$+GLYxXYqHG-ZgsDuX}oLJR6<8H0J@h{Dx{7QKvUpoVTqWYI>%LbM?%;2sHJ zmYhZ#YjAgZ7~!AFOp=>Hbl%x01J81#NT||_;yk)cMx%e#)B{hv8_`LYjglDc#Q+_M z4XZZr01Y)p^K=e>;WFovkjDx9>dVH%6!kX)n45Ugrv~R^yn@ZqwH*ff_DvaGZ13Ha zE^wq_xlzvv2rwA;Hez)gk|~7J#TsOQZ{LVVpw=5KJC=Ot4P8%;4G+M>RVDlYO+d20 z>-Hq)%E7QOc(kaa_r21I!Wi_$PkmjguS;_XzgL=1{CfS-hdW4T1y{b^bk>Ca+SsI3 zY>>|jEtG=}_vW{AtOVpUAy1=5yu=|Uw4Jv1nt*qka3KX{Tg`oOOGSGe`GTZnT3Xt- z=>#-Fx%Tu7NzwQn_*ox(7iO{k$ka9lG>~+$iuTzAeAr05Q_AGEgJfRg#8ovk^bHGN z?`YPTY$z7)*574bD>q(#nPSYX+#n2;u2^yzBR2Tf-*OtbDpWu1j?_wHF$AXk5cZn$ zTA<P@Jllh>@uV4O*$Rg7hJhTMj6#8KipH7c7Z7>dEV~gncMa~A6?X~+ai0&}4ZPSl zJVCO(_7g<bg{tv!HdFuMk(`19*#Nl}Ryc)tBy)@zGZ~nW;nfsurvWTFnP+VX-M-$K zc3JdaUq>5Vyv)opxLkpPhYgbA=`_K;00f7p&6GA7k^AKtC{{0H)aOs3>tx{f4B=bW zC~-5Pu|epbE@to#qi;|KQicISmvGZn*!+uy5k1w)NV(!_GXFn&@7mqQaU=|XX3oif zn5E+bzy=`_vJ~5EI!j%xXLWle+Iq4K!vhjS5)lX>7*G_Yhx^;#x^;JTPxs7#q%Lvf zoKTpV?&|7Wbyam;L<uPilrcv?AhX<1;mEJaJ1FKcq^5a<UPXd|)BB52KXM3sQ9}Ls zNjC@NT!&VXarX-7Z`7-76txszTLTfYOSdV0ocO^U7Y6eQ6s^D4b0f}VSXQ>@NV%dW z<yY>itX}D~MQK+R26%5tad1w5-=)+CbrZ9a@&<L-bTfYj+-06tJt9JU+>ke$u3^R& z%g9-JUMh3$%E-z3u2e=u?WC+7YUWlfSHS9BL@t!7&qJyDosz1ZV$niMPE6=ZU}wC6 zfWj+!DWUP>9$`w(VQ^g}lGE%~uljgPN|`f{S&JNoN`s?zQB(lEoFF+{R*GaCjR19} zDeC%@@?ocn!jX-Rh(!5<DCvG7CCdblj!Awrz-zgV7EM=do20;jNkLWG*#PRn_nOI1 z$ePzR^*7zek{ntiPtLAGm`pAaBTIeWOQbA4S~Ua+pfSNQA+B;A5m&9W>dD3^U){Vx z(l0!N4GK!9Y@A-bgc4%u<(3djtOhH!v_g5aQs8vomC!gVON_I!xHt=BMFXgTl<114 z<-?g14$H>l+)1m+mJ{-d;@{2=GT6YpKF%jci(__<efaX1l4v;Q??y|BuMAJ=h2a4w zTcAd8tvR)Bz{k0D#f1Qh0OAl?agrZT@w$~*T!`m00{uRqHPahy2B-<-E-PPH2?L}< zDqA9Hl_pFh&mf`KF>ab-F`Yr;gFpTO{+(uS>2sV7(qo8H$k^9l!K3+Lc04i@hH!Df zc6X!dc{hL<R+tg%5*W{gf9zrqh#TxFh5n!j<fn^ghlgG;3GBKt|0%@<@ooy~K4LbF zs1Q62Izo*3^xu341Qi*>AkN%nK$QU{@_=}~!L9}!8d1>ipEl)dB*vERbtLM}xU|b| z$}R(V9HoYSpr<XgHEt5xX`I}-jbK(rH91}IZ4y~Hf((l<(!ov8Kea)CigBPleIcwZ zY+B3-==Lq`l+np-JUXP1DzI5mG0l^n-9dp8wVEhZg4X9BW(U9_bxg7|Zh>c$7oaEQ zd|PJcpMZ5WI+d90b?|MFjgbaI)Bo2JjjC-g?2W(sF)q61k0gu+fy&=vZbW~hpFtd| zV=T%6o<<83@|CdU8kT~fSx&(k7S<1Buby)jv4Jbq%h<cDf+jpNabpUk3zSucTJop@ z2rKF+)TE?S%2RcZ4-cqv1E6_O;1=*#PF&W)k!tx_u4IydoUkkV4F0+BNzq(@uQ#AJ zYIDZoJXu)ry}}#C?h+|p+S~@r&#LcnSB?_$0VJN@v>S-nR)WAMCzU?t7H89BEvAON ztR+eyCz(r>pX4w@tmpy8^b{1QIVc(Aq5+iXuvd=siHVbdPpm0ojXMnnobrEZh81J< zmt}mNd`d67km&j)Vx4&}qT!fAnq}hoB_n~DuuNNvd$JdwO>p1fCS#rlm>-BXZTFAZ z_qIsMXZG)p*`GFAT*2FDa}F?^5v^#=k)pL?5&GZ1B~8saD{PQET)#-1-wJrX;7Hg6 zTsCTyLqG-?_bMI-u*={Ez8|b$X@Jbn0utP&PIL(ZMSY?mEBJ3;o-uw-Cl(-7pw1$3 z`mc6ePx7}5W2|IP$=~ydj)(X#PPB|DaES8EFh=}FWKnDFUywXuahANw-4IY?5<o+6 zr9GJzTKp)LQT~p{rIX<P>|jNsNRnh#>gzl;;Ub6`XWYABb_<M%gk<v;y26E&xNVL% zc>oe6bQ42z;0WOi3jVMQHlPowip6M>s(20+8^r+?>_0MUHB(<6{G9B&nHD9^NNw08 zy*j@@(m9XjOI9FnE&)=gXdH5NKbjyIi}ft#m8}POFfd_P93Gw!y#F0*_@{o$95N=D zW20!CUc^+fFJLen!`aKjm!BCzX-<#Pp^2g7kEbcxdly@2cD-;Lv|@?{nY~F^ft#H& zsB|1A`WibmQgs`laqiHtQ)2<XO#;LX6bJa00eZ7z0NM#sVfj!vT4Ou5%*<Lr_te>c zNoX@kiuA`n45vhn{jymBInZ-)(^<<n;R6dZBsAId*4Y6td2$PmH+TQFfN05s6DdnY zC}9{s1N%nIo-HhWF>;O3=o*7o5tNGA;0*OLU_3^5%V@xXS6T$LD>mm-V}nHAK|Xth zz{qlj!-`q7I&x*I7rYI~NvX<hYDp?*d|TjREl1FTj|t;t;o3Zy(>ce<@;{pNmC>(~ z;n^t3f>2LJOBO*IE7DjaVw461OA+xvrdy&y7!Qp{k}Nz(=jNl)Q63wJrKtdmSa4tQ zUZ2NbleeF`m<#*lTcje^Xc&7Aa|~MIvz&#D5h{-7xgQJF!jeaG<F%%geY}*0ZWV%X zjaEtgA+lQFTt1xxTf*5?u?OuVYyWAKp8NL(E+)3gysFEZtSGWRN=Bts7OS=9sxHhN zZ}QC)48O3(IiQ8yp^gdbM)NjddsqhLeW9UyL>?VeR#~(SE@<HJ=pGxcx(X^~t1f8W zv^r(*Pm`@5kHDP-Z%`O%d3IjBcFC3+cQVIH9631RK}k9$cY14Y9)okU22OE2nzeN7 z6IIT$8&=a}Vu|SyqId01iOc!QmEVlUhxPe^$fC}UK}*fs2Xg>Ttu4u11WCJuVv!yU z9ie;bG9ig{!4eaH9CifCu3`?#eD<lV2Gf!=kd8$?(Rr&>0&|n<*;w!xK--dTj5k_U zRVHONU|OOO(^uNGW_Rf3Xm?ma=n-TG0#!ZHCr*<n_GVLBcp1Cw#Izd8VT|qX3Vb`u zs8ZsM+Adf0cqw=i+#)_pOF=S;o3(fKOMKTpjV$jFm`iBw<w}y*L?L%Hl6Uz-yR*9- zmY95tRAqjj@5<{X`)sU*5!zFmqdT^Zz1vH#X=kKXwP}0is&QsaY7*tnZMk=4Y!Y>x zVv31kw0#ziQmtMzZcG^+A~OypCK%@&E>Tge;2&?R$HHA`&a`!F-2$EEoNiUSzUrCy zEr&@OEzV<mC^%u9Y;cdrMxD!)=0d8ABw|g<2^=u35|P^gOnYCIxfEK7wq|4@>J~Wy zv%dht@7}_Td=DlqQlja~&@;d=v=NqdkPn&7kaGl0FE~+XW|Pc2wVQRw&@m&SPd%MU zeuv?zJdM??U?q@_oc@fF;lk|-#GDKKt>g=AWk&9#lMTyB^mN0Wl3k!!Q{h?J)&QNm zSm2&t(_dd4OtGQnx0DG-pgtCe3gJ9BNB;|Bdl_RdTi}v2$thM-^z(5(9)XCyz`!rI zqXup$mOSV8?NYx2hetbe{`i4;X~=l<)UFvv6bwwr68SWP`ID_s&mu-7&1&YblKfg8 z#0sALhAX*VBu*JyYsPAonnTYo-r)2LDx5bsN^BJyP%&M6FJPJMyUL2@@UgY%MP-$+ zo%%L}19NTQi`uCSIDY%CvZABaww|?QTgx~Mfmx&#U|{#1=W{Upxi?2mfu217O9^Ph zLw`I%4F}{A)v)c$#$dLF!{_tqYzwmC%)v@X0}DPa3-ULXgCh{-ODs>6rPJ3&($X`; zG>xv_nCjVYQn9-Jbh1Ak%!hjuvf8$NRIjV+M;Lbd&O^X*+Noh-W~WJ?O*Lkw{Fe2X zYA9&HqU+*wUAvRJgZa_aZ;{_s*QAUvdy`-%ySH&0c@@D*;Fk3t#3Lot9tIgM6C8#w z@TFz7D57lb%}kQB7RL4HN60ZTowr+m+Td(!bdbVH_vF#bZIa;k2Su(`Di&fSf>PP= zhL3MP&2mmq!5ZL0Fats5E|@xj%MF+Zf;)`S%^`aZ3lf40=r@k185C?1Rrp>|_5`J- zgfk$QeAj--B_BKON&ZsK1%_9=>681O4#Je)4FW1X8tU-XsY?2ccQIGol&n(pL2pvx zFj46x!O_ehr>^)eJl>84tjGwh@_4M;5h^$QXjtxlsK9I9k4M9rPN)t<SGzV!uEKWL z51vjpq=&IPZw7cYOU$JMXf(=^DA7k|>B^#r?|Ec452gd6DqZ?D^tjD@@}@^OHgHu1 zU&ka;cA{BKO~yV0j#m3TAJWm~z1#;QrdCJgVU=dROsqA*dJiqKR@o$~!3EuSP*7|8 zC2fr54FndZB<1|eABwQO^eBXIG4(kdH8RNNDS&QUYz9{bL4&5v<Jf`KENGg(qk=vD zh4_s4C(-V&DsM_oxL0u8bhu*z*WhRZ)*AfVZCU|(O!O+~n4ItSE3bGCd|9f>AIkvR zUqwKGcc|!-S7gz&3Uh_}AI&>qCYkE(k!>gc^yfE*X482NceVp>k0u3|Rp_++tM^b{ zkBD%fsebaxlUuctC~Q6+S~BpzT*E4Wq>@FkN0oGJng4{GJK2O8h06nt#`gYT6_>8G zRE5Tc8x^cAR9PVTF&#`jp|FoJoljAOXKsvyE8;qO*~95VF7g82M6;j5%m{RQU$}Y~ z{YNIP1-p?OVasf$2%F&ptX6g!hE{gD0pKwU?we*oRgG#MR2NJzp}uz0me*`(nQ=)~ za{Nnz4=srX381ZR<_$|T9#pAc6}=Q4+$Gr}ky+~)8xsd|c`jx}6secvS5{p0%djO< zedTjyJysNgpD%A=v0S+V=iq>>T!JZ3wFC9K7wFSrd1Y=u16=X6PXu<?Qx}>eS=X^D zA@iT{6Hxa8slxuF_oN@xZ}&49F7(oeiXv54J5>mf94o=GP&!wX%U$$%Axpn@iHd$X zV4?@ims8}+De~nMDW4)ov#RT29zMU`(M($a>ZvQ2vt~tZMfFDUQ{ia#uYVqd=F6!g zfemyk4+Ka3>kfn8FqP2@nEvSrdnrgL23JMFDG4i!e4Njw^Tqa5Rpu*ijH4xAU903u zi{Y0rl$?CMG0(|%T^ZKn9TBVV?HDMu%1(I{=)vAdo26;)K}{eve&g2ikuh6PUzM_& z-`bmiR5fk#5L**Z*a9A=E+6Zg1)M(q1tSHZMr{1gp4W6b%bGE<F~a<S=-T}hY#-l9 z7%{kF?UGR>&^qybp3q2Q%(2lx634nxc8~^>^KHO(FjA@(4v7Ei`9}DPu7;Fa8<@E5 zLGikXxqI&J>bEW=46Owl6^4T!d9gBPm|fnKu+Pw`z`6%QIf2{W%*OhVM=01|Usn-C zA`$kmkSa2oO!D~)ubg`2p=Yex1s8p@>)9Pyn<dLG@RgEqNpAVD^M~S(JTpojAUQ;2 z&ybeAvQ*1Ay><r8n~e<k%_c~;A)B^AGjaGUb{MU3P+gM;5ZWide1p1lk6@t*Iz$)B z=eKXSs*sWp;%3?M_+DXXg99W6IDqS~6-x}tJI>H8Q(uv;;PTgvg|^@-RSqt}f*Y-` zJV2*aruNRv9(ZuHs<+1UBk{9h;+L|iH#flv4|DHA94+}XKGYzv_%NfxspW;^A;(#= znKj<r7vAQ*i*cub!<~<g=w}uiZHXs@N2m}`1loGM_4FPl3ViWwi~fE2%huz^&tC1l z+S<PV0$<o4FMfUcYU{79i}D0Inj9HRIAB5I1|o7yzEy!ECe`<lDnkfxE>)=t2@~#7 ze`5)ACz2sLcqEkgrD5}jDYN5r5p_3hih}V~X^Mq6c^7q#-$L5Oi4-Wi94<fW3;`=@ zos`cF8zkZkDojry@o*7-grH@R+alZg?V%Tp*NGl*@R^pa&#H-BV&hwMo%<h!3bW@b zyM0Z`-JG%`gXiAB`XQDk-_|RSXcGtN8bcBoirw8RsNqxfGr&Uua6AlyYHqBruPAd$ z-sFygBlURB$&2rTb(qQU<C3W=?!e`J4!5oeGB+yZ4YAv8M_=^v>ttHaa+D`7VHp@k zzS1Pkex%@LWg1N;;T@)XuIzcT?0Lti2+bO9WYNnbLKVtMj}(i{ZqLQ(4B`-Rupyrx zc3G(znu}H4%YJij3d=C7G3CZ;oGHa~)2AXLeR_UOp5iHfi0*n?nbKjdq}oeCt;5>L z)|WurR88RRr1s0fEpaXCz^1*`(XO{OE^`s1Xa!CHbe17qe$LeJ%-2qHB4k*D7J0$P z4a@v3Yl|c4Vm9>F_Nfpa<>^~dhfEc1vc#fm(CbuM)5M69Z7HNmzO8%J{jQSNTcqaa zSPG9oy_cieRlk>QZNtAeTU|HFqps^@ry71m#%(!EQlFN%S+>@UxTI8uGO~@Yp9(xc zdvaFL@3}rBqAiLA1jR;nOQq3jNFNG~`YJ6m$V51nlDv?x^Opl>c>w1gfb)vP>2@-j z;3Gcx-x9O0Tn}pT5HEeHcpjc;67frC8*V2kWoXZxD5H$JJ1gnQSJ6NQCU6Ph`Lje1 zbk8Po&M)~0xXJeW%F*gp&&>r!n%P+QG{99AjHj6L-ta}U!@(RT6!}~ZJ9<RHJzAYe zN<i~38--U7u&1Hc?SaY)v}9Z3MayZT>pO7mLr7k6a}r70H`hVt{9%24-D0GB{i(6* zBX&1E?CO=_N*3~316gDa9yTMbKrI*89+C1PQM0}Qs!w{g_$M1-)982Nks`3Mdn4qc z@z<Qv(d-up0USEl+)I43-nNMhOtqg=&BrxXUf0*F2we3T(T6pIh41TX!`=8C&LTgV z1$tah1ChLHow?WmR)v{xG61Q|i>yHHwSt4mBC?bNg4T1yTZhI~>r{pub8FiV&QsS! zC$4$Yy|lpmEI+P|GHJ)NgW6EKb&7WC-hm3<zOl;oPKANDiPz`aO<104+((_XiFb$~ zMQv%1Tz+UD+xX`I^)$!pt((&s=q7Txd1zH|hqkj6Ney?f|H5$rjUb$d5Hvdw<s{XT zv|Xj%kAN<0)bP%lZytgUc#*$)-n6$!6Gr2!SWcE+cr?cN2SsQ`LI)k(+-YdyltWu> znD3t+_0Hyy_J&mCYX4!FVh};z<=ywK;EJ*3A7>Emt>vLRJ{`17Aoa#t%Fwy23VSd1 z`tW=L4u9-WRxTO|*3K2eqDf;=xn+4oS9g{iqFB+jvaA*PKyK^ULy~WrRdP_VB%zCb zn@Ljwx|HuW!y=&*PbFkf8C3$;+{RbxX2c$Uwxo$|ukTMZD?qs5aQKEuw#j#V%VW<o zd^U#}{@yJeDgi{*H$3o^K-avH9o=7~%mjXS*SqRx1@YY3<LN7F9pFh_nr7-A&VDj? z;!X~=pX@cL>W2NOZe7h!`^{am%CFSblT(Vksd4Y2lZp)t-_Z4|D0tq)9VHNrosqE| zgc>ChmQ`F0dFc{jCJV_8NcV)xY(HQ4P}MC}O6{NKoAApXS#FQ;#qr19A^u7LC7-># z?|inK<|<poly1ITY)nm8(wN5BAcSPILb=Dg*=u0SA57;bY~m>KFhA^h_wTsXuD02% z4a286jebYlNe*^m6P+LoVnyfr7zSKm0MU&Y!AEt8y~nW2N=e(5vU&?)v^piit-^3t zjz$Wp%@|S^^oyksTj3B%aJ@Y|9p?{Z+*txSno_lHX0>Wv+W<%#o)V~yx-&Z`{*;^A z)vU#}Pp>=czD({XoLn;i*FL|NiTE<bpLmLij5;GTnQ6z)SX*e5{)H4CsYu5*+E_f; zvHe^h@A#;~9@2|xwsPc|?a8rYIz+Xep><?ims9r0rhe6;a>HS#&rP5xLyiKCNjhS6 za6%eX;Ua_GnJj8{UD10L7mYvUZz<^^T~XT&XiS9>Xjn~DdrqAx5EQSW-p0i`#clY` z8h%w{lcaIn!3w*cS!y(9-WW3+AH#)u0i)t!-orNz7kb)sUqVLK?<^_M9*<5Wuea;3 z`;gq<XR%2BVdcPf9_wsWqXf1>ag^ML1WL!FBu1*PhY?jN4U<XGH60z~j*N4xGu-ZG ziBQ@zM3S-q<Tec&<@ttkb{PlhxM`03(DI;F2g5=fAl58H;+^A>5oaRHW)xd923T0q z-BNj(prnIfr_m|jQPDo(X5v}5Wzka_H02@2Fgt#l@lpg&dH>elk3n`v@_g}PXPOQ3 z)+b?Y9KVjqqQmb@<~X`|9#h5~=gS1shVB&FwoPr>J>|%!22QzEVfr2>D3FcByN|Yz zUC(^Gx$?a#<pGsy<xrj8)V<yH?eWS%Hy!juJ#Tr~X`OIL$+uqC0Zb?8CnvX5)=s7i zOJ>%GK3`eVbf@gLxG2^Td37GmAQ)Rd{53d^V5Sd8N2lNc2}h6JUDD+)?U({(G-K^b z#<1iL<Hz<YC|sUx!P)q_cVQ@BT}>5;kPAZ;{6k0Ha&mMVr#5=xY@68XrBesL#7`dA zXjs0Q$SSm=Eux8CRfF80pho)G`f~cDPoJ;C1y#9tYCZT%iA!v0eZbh4D|FD<X#7wf zGk^j#*qukYCZc5;j?lj{EAZ!RJv4+=tFbEtG^Df=Ux3ZgIkO|ZA1VW(QqW@$t`~>3 zqdO9UQfs#yt>BRt+aMC%xYATcq5-?11~q0rA}R#rh&BO-DLe+No*!MvRLw|ubUcn@ zRZwLm#J%_ZU5K)lgaFG~zjrjmH7-1gS)CUhcjhm#`hv5B5m8?8<{hyaY94}EpwusB zMPim5Z1#l7ESV!HtQ#sM+N8wpL-DNg!I?<DDVT0mMe2HK6;hR{P^`9!?^_ALluN-d zVoog(;b<smCYaS7NG@DH-RRh)#J>afRk0C`W42(;#c1KyDB&)zsT@)b59w?{;dx4q z0pvvt3uTxej81^Ic!vj7!%ZW{i!itrkS4!W2nm$5XNW$(-3ZTuNMQ%VHc(QQK&sxs z*uVpHOr4*zTkEB?Raze(^d^Ws&Y|`9i?)HcCf!FH%}(}{fiAR-v7jun1rnQaUf_&E zzOY-&Pa8A|?#Xm`*uJ%Xqq-6C?tYyEj|(=dm`!?~|MPS-cPVc7rx09$Tkr-Y6qVG* zXGECFgFOgl$aP>{x@T106qab<nhwS*0HG85s-sE}+4;&~^etsaek*~hvmDaWg94v? zI52Uw3!>pKanTqo(11QPYp@~?z&t}LFo8pLh|p9q>=Ur5aE%2bA<Ugr3I=Cm-H^lj zrcBQV*&*&x950R(FgiLK=S6vcnz3NeyLI7X_=LR+%RUG3uw8b^R}60J>os(w`?^hk zJM?#t{_fD<UHaRjzhBYcjQ+l-zZdlPPxSX|`ui99`z`(byLQdvvFf6|Pn37??`aB` zr{<_Q-ES9E5rDQ5Hhw0YSWy)TL9-qOO7HzH-B5PeXVzU078~WDIsBm?yEXJM-!N1> zoQ5y~XwgrV?02*d05MeOC^g_&O%Y`J)GvMNcTxeVTX&}?km3-^q5}wZkuqrVz*r2h zxlP2?VGty)Q`&~43s)rO!hPYYY$A8`mM3EEJj>27Rt|fW$%t14<1mv>V@esQUUHa^ z&C>MaHrxl{63FAp33R>4&ZhI%K#L9rrxe5h`5P2biL(F-@JO=pftM#`l>G6Je|Qfs zYyvdM6@JlO5zaBgP$`(Eas^`b*ssJL!!v!PZ|E#G%8Q@`yPla+celLH<LMM^7XNVy z<24=ufd_y+!DE}E=0M?WPMHwiLk*1UD?bOs<>0Rurx5Lev#oSthhDI#LfyiA>?boI zLO<fG_pX0g>zBdV(FVHi@h`|o3!oS~4j+7x5v2E-*Rj^ad^$fG4O$n>Wm+r^YOSrc zjrF?-7k_NEE-ow>!m$O2x8$AQ%>V*bM8$=y1N15V6*wtKI27g%z27_P0sIMMDJUqI zi8+M0zxm=I$T8~JGLvW2zA+g_S6msVl%|}c)DAMUlcO<362W`)!KC2(hNF4TYX#fm zoTFSYEG|W4?c1*cp+xMMiCj$Y(f2l$*I~%$#Wx$@3o|hr1z9J{XiH114<(c;(RPSk z2JIKrLJDm``39h$Li+?PbUEnCWB@=Z5(#J~1DvIlb;!nWWAw^LTYvY#B|5-Bwx>^@ zwE3s*1HS>}Z}sc3Kg{#Rm2pNOHJCntB57RLdpFm=`#y!OKO~4XSM%|noK%lv0(aZD z81_$}Y)_w1f%fD?<2^a~rfPg~KvH<px5(&S20yH7F~kRrBR+pqJ+d;_pmj2bBOv`6 zj>K>s&mh$?rNBXqZUn<=zfjH8LYToS_-`!GhM(RVm=)jLyuH5OWW@%Uj>c2<0YWFt zFNgQZjpItRPiDtatb4ap_|j0gC7=-ZG30Wk5sYEU_{Wf>TCfggMVo$VJn023)*Cp; zNqoyg*#vtSn9?vVi93K0)Zv$hIXvG`L%foLkdNPtCfn1yzz2c>S=-wL3y@v=f4<q< zxK#({!QdDI_8fyc&Vf4ApxTE3>t-Lbj<;{!_@Pq=@PL5;?X!^E2O8kPH|-y8-0FOL zvtK83F~H;e?e_G=!#nL`RH}_h+A};Q3P1(SAaG}cV#@OFa6SM55cvCof_*?OjtHi* zMuSRVezZRTo$Ok+5ejl_x7WXQ%d@T<hhhmA+ek=GsQQ40t&DSw`lV_i$Hq#Dq`EyO zJ(d>UXfRsqZ(D)<7R0H^C${PDQ~pQL<PPZpZ1~dE^|z}%9QYrxsf}(Qv>!JzvSEx> z?pIX4+5N7%^396Mx4O5hD}Pr}`On?&)0LB<vt!nc<vFh20Zd&0p#^Gq`ebD38Nn|$ z5_YnSk{r6&2vlJVpq~Ozl2#Y}006Eqb$K&Rm`#xyO$L@qIa!t0sP{Dzc$OnL{)S38 z%BVhZ(M-6a#Ba3K4S`sXXq@Dp)8?N;>_~`i!HE=L-KY0RM_Xk98*%?8WBTemd!z~; z8sxIBUZi2D!@HF4XCsD#Ysp7i!M$-c%n$@HKeulF@WZV?SKvjp5!!|Zzw9V(^la}v zY~#I?N`T$Qckther$dqXy(cVS8D(VaG|GpID87@E#JJvG|MTtMMhx56u_|pINaP|r zHy~EYdaRrArX2H`7<~^%2hR1dU+$rXzhqaiN^+)B<!hGpa$}!ry-AN(a3(}j>U^{0 zOt|8)ZY<l2cqd*b%g1qTI?XrA%gF4KZSY7%Z8w;FL^g`IODqo-?dyR?L>RZkW+*X% zrE&1c6EUYLP~T?X-TI+-`_BQm*c=_`-jp#^!|IJ`tlN5FC=T>;{orm`7CW_3JR%#y zT6!LM8g!%n%4$3W?Y13+&YH}H?uD$g=io9?L>JjicMObwfO9RsiBHt=Y@qQ3%ZA0& zKuGPQ*p@#zK1v=;>%H~$Ki^tkzrAtm_QuWio00mXNlpFr{tvfqrl;0+W22%QuDO}+ zvmUU1V!#42_6bIyy8l7z*U(dH`9>4Wmt8`{s@%MJv)^B87;f}$^}b7wKv40T=KAK% z?{D{R{;<@1f8!9n>NwrJ+57&sX+Cn##7zAIx?7_Ab+~2B3yjcCcSCF^f%ZBSpwMvs z!s+|6j04BFM>ai0FZ*@EF%YM6pFmOMQIMO$bs7OexvIk=n3cuYxyT4#zTJm?ofg}` zHs=3(aNk6`98C_6e>t+3m}1?~&1M`pcU^>#!2$x0&oE~JxmLJ?c?-g$3Hemg8P{)8 zNk@f1tApS2gPRW@OT559qMPZ^!`340xEwF346|<_3cJC#Wi(bsPi|H>k4WS&(fK{j zz|tE!*8ArKt^>0+XtFT3gP|w=AAb1$=K7yEzKdUR)&UAvWmbopzarYOGrO{HVIn$l zB%*b2C%G!Vg&9Bkw>ue57u!(aARG1Jg7t^=@lAd}>Z+Uf@F(Qy^>v8+&ddedm>{T> z!q!YD)HA9E_z4lyLZcgslZv0-au`%9b>VIFijwCSD`aeuok1XLaLzh~i$sXIIR^dP z@El7}UxT~j^4Rq4*xW3SP2Y}9KNuS>a-KoRIOspy@4@2${DQJJL<k!#$nb#(Q!jf2 zX;;9g6bBEupaRxl_2Ava!Go@Llqpp(hBB%cjLf(qtFWOfW|ZK&CdaX2o?Ma|@pJGE zw*%jJid?04-fYPvVNbhu?v|Y{(5a#Zm4nxT0neL!oDpyye3{K{m^{A-1r9|0&B5pp zvXirW^oUfnLk%EnpReJ3b{G&Uc(Ec*G%tl-_Dp6U7oJ2&f^-iPG{F-1`Ecn~wF7Hv z*Fckh#H>rA^HNx8zgzy6MI7~Ru3Bn9%4xB2OUiX?F#HFmhY>s|Q$u<=CRRZ^Ap1xY zKw1INon;qP2r5oJ%Fy3k#MjjeYKF}#55Url&D#bNeY=QJ1lDH$KMssQ<>1B95!9rI zi4L4#YD#Zt!MbL!QLK}g8~n6AB|^Zl8;-`lPo4Hrh{q?;gu;3L`*H9nN|*bn0(4UJ zE%oKxeR=19d8f$>z300I`g!htzDva4;?BhEVyR0p+5}a?SV;8&A7rNRR6oE~L;*5f z6N3B)8y|I0tGf|ygW_Y1<0&Gjq1ei&s=V^4)r%U-IUY2Xzb3(W{sNR429O+z3ueiH z#if7Y`d|V^z{hm&RgAz70A1)Hco>plxXvojq^jqKBcclCy2oWc-0<hz9(&wgJR7`^ z=e^OKnMmB@c*&9k*9T%S+u%P{ITfy<nTjp}?-`jO$FUi5bj;(wMrL%tbU_l61LPZq zqd6NZnR5-y^VWEDBZb(#PEsO3ID#X?#bGz%EMVlAGQmRB$x@4+YPpvdZ*W-Y)NxVA zO;(V(v8@GT_X%;4y?0$E^c^qNgWalJ2mgL+9iX4$$lPW0&@bJ!<AfEg@spNTG@w3+ z3Sx$Y{hysK=!0>%!KJ^B2XX%!GOY?sdZB3IxG9^KI1}l!sU*aU@C^Tt=7|@RSXAoi ziI?mfTMe(Mp$Kf#Z4okP@C}(mBr%2kdw4|>P>4>j`4<M`iexmaF}PW_0e?ml9Cw!P z@yc#AUhQP*dv4oa{}S!>DH~;ddyq<%yHrELq+GwMT)z_rsKIr9GB{!y&#)+g1Q$0H zf1TMI`Tov*r(@vq>kdBx-w0t94)Pe8Xt4Y)vGOL-r5ECoScW(MZI|Kl%SJw&yAS8h z7t&pFokub3Y;evLm`MG=NJA+~gu;$anPY?~114A;uMG5oS4u=664JmeegyK_49Ihm zLP4wB(^t=}7Q(X5ubx}xnVx!9j&QH602|j|a3PKZZi@v~-+3~PuF*h_IlqWULwWVQ z@uZ-svlW415!o>Ug)b>HaR}$yyNoOvl++B^?iu@d;_hq{@LPn^)jL}+o~;H`kM7sm zjQ-M}v*T%zyCpzg;AEFZPB}8Ez0@+$iy$@GWH^qqO|5o(XYz!2;ffj|0t+XE2q=QZ zRX7+f?8F6WDOM_;?FK*9N0KRtM`m49b!h0h3~Rg76Qv-E13bQ)K5;Nre#-$in9a94 zu7aKHO_@`PNDzozPG8P$9;;q5XLJq}9ej@60{yrf<-n;UzKU^n(5LO3WpT(&3$#U+ z#;*md_*l}QFC2xCV`Xrmmw8Sr{72pg$BV`6#~U{wBJmn5G7OPDKe}-?dOf;<YhYUm z>b!IXto%b-|Jk|E0UPYNOkzRWRmP<{+E;S=8q)GERCF8bxNQLK9RyYF5|wvoC$&l- zR?Dhpi<lLWb(=f<dAD3IR>~8<?TQSrUx~usbS1;sJ94tAOv%(Kl?qH?@jy_m4npK- zsvgx00969sW<ZtO7EBkNjoo``E<$0$ao20~<p>>TGE%uwE?Jo@S$7YrR~y%Uft9&D z+JjE=BM4dzj+&$4jMR%3_yEN$Tx8;Fn~^JUS7_*)JScsLS|zWjPmqP*!uT)p6MZ}! zGP3vqjl^>15DAp(8Vae^d~!-h+Q$0d+t>-z5_&8x3Q&izJmy##B`PfcEm~foJtRJb z>?*dzj^T`IVNQF0pPR1nN?h!ZO`5U^95*Al!!tcJV3z6W_WrmHAYEr^?GA$wl~6*5 zZ*WG8(WnzEP<&@J+>OVcP;JG1xS@71Qup8H2d4}14`;?%tSz~#`yl*++2xQ4;ma}j z7RR)i;EO3gfG1c$vMK!e_}49X9OmJnEb(6Xq(a-?(*tl^Ee=nSF6WF83=;<hvY8H3 zG}1(J)$zg(yBVA;<W)Qvdf%bB!;-!k5rOuCV6pnBA$W<K1&n234-mMPp~Uo2rs=>d zDkZbQ5sX(s?u&ApKnE18mZO}lTKzRE{wI=Yy}XK{!X8g_=^OY=s!ylI;D`cQRJY5e z4Opbt^oGM^fMcCW_G(t^MOS|}T#)}#iq^k;Z|k=}fC*r~w^cI!>ON-to1E~@32%-_ zvH|1*#(LjU0;D#^fcHOb9WD&2O5;=dpYjTCni8eIQ=jD3t*(g+GSJ!NM`Kr);(t-$ z+p4hfl&8Wn@!InZCWF>p+e}NByV>!%470<yrxf={t}3u{X^W*8W7iz5x^CuLl@(>; zHaW*(T0hiG%Mw4T_BuZo06rZQkSYsc01a!B-Gr(9Bl{wkp_<r)Yis74xlbFoc+>+R zIx|!{!si0^0NjRgn1I6(GNGi!A1sWGH)ZB<`Go}R9y+Q6oo=aba1lu@ZrV~b&2&A9 zZJCHWGIErv6UpCzTQ^=Hc&d$%SAf&H7$MGB*El^Fy_HA65_4`1y2+EaymQ37j9lrc zuxKXBjKS86gH}p;xDxc;d+hbH){RyeH>a+O4aRLgm^foL6)O(Zj{3TbXu*{D!P!a! z4<-4|6;E*3RMW{CR-%9qU5<TWDq&Cu5(!}W^r`~?$T1xBDC|MU&)#GLJk95OCk48i zx9*eX8{G!Yerw@S(Eg%f1U3x`H|p53Rr*#MX%LL^w=>e5|Cs3|$N|pwILeX@;Z$B4 zdQ^Ag_kR91ln#K)cn(V^mo%;Nw&T{+KlGaNTA|hD=Jp>tPoe}~vV&xPnZA2~cK)#& zNi-L&Og3Y!S}=C9G$Y1KPgV(!Q51;Rg<$+uSgCS&!1(wQGaegW*V&~frs2R|3aw>F zOb=IbwA_riUq&&i>o{2P=?BRTs@Mfk#<3ii!gjBMm-Zvtl5}UX9XWPdB|x59CLqdN z7mBxLo(-yc)on7RfS(r5!WOmV$i{=e{_zj7gMEJh7qAv<92n7gGug$tb5u6C;avS2 z{BKn*AiZl)Of}XvBkc(?m{F{Jc^{M&@t|2@)2n8snYuM9ilR40%7W6Jilkp=F_;6u z4Plu3!9q@ZOwy2>H3It>1mAY+>wi)v?0Nh;8$P5igjIwKJH@Otp|BN^)t9yH(%GXI z9S(3I@;?b2dU>M$h5!1i)0GjcqS)HA<=Yd9vOPvAjA}3&duM=ZdZ=~(UaQCyYNQ51 z%fUe76)fker<a}5=&$lhTrJChW(KFF6j@SJ)@7rr#PWgND;(w{(Jz{P7+7XTH{!HY zmNkRE+TqxqqM{)_hAuokG7Uz2GbTT5$+j7AQt~##y{$FP{2o<?tJ)GnO4Gl+9(+@^ zyzs*c3BeEvvf+1DvBe<i8EfdgSrZ{bf8ueCek#vc8lw^^Bq+V!%4+v-lhx9iP_2X- z)N~uG0IAnAL-n5FTD9iu?i(FSoZxd989Ub*-mri<;CNW*Se=INw<GsDvDQ~sm_hbQ z%<9h9#V#<DuMMN%7^+0^e|p6YE0gYcbla22_NHr>&dO@16GSl9i*$8071+AGvH;oz z4je`a22l?N9oHGWRYR_r`Fdd8T4?DQR(A&z4q|8~alj0eT1OErvcjW81QsH8G@$`d z$&e}PCg|rNXJVT`bgB*s6RnYydglim6sP{&IODQcJ~@iP8}y8>JUL#0Bz>2f^ZQP9 z`3wQagas(IptA$KC#7&*Fo)0Q(<5l*gn}nbvd5=`f6LRvEF?M-Xw-03(Z4{D-d~_1 zjr3cjYB0>hie~T(88mDSCyfn1D*mth(Q#$vZ<ZN!x1`>7r5<!k$H>P!L<E8K@u5!- zC&bVo?@%!ohDhY%Eny7Xsmxy@G)mg^U|{D>Q;N2EWj1M?XiD)tkJ=$+w12zEOor}w zW2^5kEclA!ibY3)9-dWZf8nbMN5c&cmahvriFh{$WBR&dltMB5YUqP)m5v-H5S<25 zZ=*!hj;|4gR?W_el2fB}WC?IY!Og}aP%v6)P@VAuW8h+HQFP;pUlUDeDJmhTvI^8> z4GFpg`^~1~AzoJUz2%;WhlZ}Dh&U79#D$oq(h~J9kUq=TKUxgsdxRJ<2Sw{+=#iUd z(I#6()&97onSupuK}{z>-Z3sChezd`mH*J8vH^l3b3{S-&CXZm6U4*C-O+lFYBZhg zB6d|*$&nefp>m1`OSZn#sxDwp1_WLMi~i_n<?h-;9UYg)C4Jf~hn!aIxHF~V&`2H& z4aUtyW=W#fRijqAjx8DVTw-{xiUZzr+0f8uQ?inIgQ32_ttX#!vpKRkf2nB!fK)b8 z(gHW=XK5oh>nWZ_k5KhKdCdxVjAey==w^>Ngeiy5A1zWLd0Ni9wg^~Qx`e{GwF|jp zqYI<-<k(T@bp72H=<|(yo9fp^D|v))$xcjfX8gu0@MGGjkDBOx9k%%LczX77imsMe zt&pU~UcS0F%;nkF@YkgIz@PAuPBs%p3<3`?%y)V6i!kwpc2R06Owr)2-z2Lfybsqv z{DnoZjqbpoT`~taxZKGg-9>FOi0v)ki@KmuPMKltpD%Kbq6|Ts7xN7YQZ1pArT+0$ z9K2POGc4-jD@%!=gA#pB{*rKl@Xk6jmDDg-evHq)3fhI(3)+%4$`tCC3-zUtRYm}$ zpRlA-K!kCj4FQ6pKgWxz3?w>kOlY+g#CdiJtCl{)?RtM1J#@`yir_n<#35L=E1~Y- z?}ZOWGL2yR6j>^M_LOA86@5J`HTC7JURjKRMV3or-Uy;zvD8y5lH&?ms7z$F66KOz zlB|SMhB4?GV?B7=sZzVR;zg$vBFN^fvNWHIcft%-{vg>2z?G^8M1AEsb6+W3p6T=z zm^mgG)n$;zB1QRdeBZ~z@psD)3bp^V3}Gb_*TxZ6wo+mVjaiX9WTC8gv72nnYB+{D z7~7Eb0$t8Vz|sA!K}>6=V};dnWs?cq`(!DxYm8FBB&f-%V6%Z%O-CwNE;7b^&kR)s zR$a$dDHa2nK~xZj?3DlFqEk1{YT%RwOKEED9jZUOl;xJ})94raBcM5eo?$t;4kn_{ ziR>&(g`wuA4~Yk9_2p_uCtf_9_9*2a(%ZYMzUfh-qc~W1Eyra$?OBE(JrQ;V9dN0g z0>UGsK{Om49Dj6Yr*~s_x8pUMY&CXI>jtxH7B})9ZJPJ2wI=fqZI2;S461TWDV+C? z`^>1}I#jdh_h>1^u83C|5kEazd3&bT<iO5Te0A2)sncp%kNVL>zT<sn<-(R{hh~qg zF!x#m@t}$5=R!Pr8bcdP!q}h>Ac0YFj<KMJY}mm%Hc<0HP$g(^Ag%*wp6eMJi_zi< z9EqH5%hxWNXwz_+0RI#O0Q?+q+F6hSPf8RExM50;(bIP`zFrXMk$2^fGL|xu7bZj1 z_NW+tF@E8vkY}Z)zo;8!L-h)+q9w;{fe$ztN*j_@3`4MQ3=IPFhpyE~46?n4{vg8S z)zD`aXaT&W3$~W0T#Q9vIkSu$9i9gE{bw%_*NR+UIO;DP^%su%!*J9Q-t_~s*ekGp ztIt~6;s|@UwLJEh;k=2RTyfj09zDjcTg!TXVYDkaOM?_!+B!D8)d^PCCt$~Y+)9iu zGrR$_`{{V}4}$F%&i(p1_wcI!9&KQoJ}#0Kj<%zh6^=K(mllp+8Q!ZLU5oeh!7)Y- zdI=o5@oH3d*PMSca=vKOVG;<Qk}X8>o95Jta*j<8?r-5KZOmod7vEzwW-*P|8Jr9m zii1M8sx1D8U6<Y#J5-bQ&u?K~ldw(?mBrx7{TL157{ho4A=M74;r`<fgVu1rF-|%d zOgh-uWsoU>jwXarF~#nkV*V|1Xc$lT%{3ngMB2x7m@33pFNY(NXvLKjO5MBr@^3K8 zg@pW?&d;MBvywWv$j+yylnHTEuw-~JAI-p~a)6d;Rv;r&wd_v-d+)`wXWM^!Nu`Rv zJ>eL<{74sLrvt)^{EoBnVZm;gQ-(1f?av38nlkQj8{3rF{k@0AJrWJnjS-py9tPz& z<UnCipoih_a(HYLb=%p&k@?&1uJs7hwUB5{dq6fOZG-@-owHcJBtRjtf*H<HBB06M z!^o06!hnY;mXaG}`72w2CO@k<$km15ZYPJFWd-H#Oq7${r*P@GHyXZeRL-PJO_VLa zIsB1kq+OxlJ?aGGRNkGJf(zr{iR@3j4gB$73?XpZ9cy6B-dV5aQ_wE(;X%3GF{(Hk z7~}Hj7)MwMTsh!y6JQ3r4K{ymFi|GQu8s9h$$WV*#)~-!FI}7-f^+x?&q=#A$lUBS zvIn}fRms}OY*q@Ct9Ggh-vnC%cLwed2NyPQ?}lvL8?lYsTCz)}sMfD=3WD)M`t<n| zpo2;H{M#UiNl`_lXzksD9=D-p*HrIvosUhgXhHLC07M|F5JYHu-L^PwhztfHhu%)i zYY2bYx$0K1p19(O8yg=8M@n!60(<6iFh<}cm)%Kzd*t~0W7c?AS)@Mv#tL>m<J?)M z)1}}Tyw~XPz|llSYw?-yx76`|?@rOS1_$@<@JWB~j^m!GJd`RaJMZ1`7;>Adj)A1~ zUeS#kvvP)eMu!e~s?d_&14Q;{;qo_<a1{CUjGcp|m8kThdBf1)Goxlt$s<(sA(m_( zu~30C?TaP!fjVvmsYkF24sf<}#4KwhpQFTc1#z#$;_&v2vN%|N(?)S6<Y@S)o!WCd z0fFLt#X*EDHDi}X4kPv~DD;&?sSKKWfuGHAqTx>GqNc@C`-%pTW+{ozGV9DuFsw74 zR9shVXl_<l{otzM$>IV{g5F$?deV@7aPpb`ZSv6V7urD!yri0<tb@X+5rT>ZC}u$? z!&EcYduQ4TwyU_zY3WJ06E_E)Wkkf(h&toh(w;{}f#{9hT>lN+aX;TlNR4W>&>Kj- zyq}^Jk(@CktRDq$8c|ORzK5+Ok=t0leHf4rrf+8p!-|k9>6I-n=d#*3hnAGm8N%?q zBZMMjih2>$TU?}TsDFeCQ0r7G5sj9Sge8LkWr1jMq)${-bu*T&Mmaw#GIdCiy$5@E z`s|&I-gW7Th_*d4b%GrDI;I$uWhIn3NDY7*{gzZQrHv$LZgeo(QO=jT_KQ2>N+KI} z0}Jh8=r;c4cOq;ju0-?4Qi?wH+@LtWt!tt;DIYaqA6?<mkY?V9y;!%{@xJfYsI>6E zD#R)vS6~@cWtsnYP4(;|+EMNAM)F2SSB1r-v@U?TBNqY)^+O&>l>4u$`#9UMzxP1v zyT>e*c?#xSwOKXW3Rex5?p%)Z@d(tv3vo#-eJ_qjv-lVA@|xuFPj7OFTR2X9EYO1D zVAX5{xZgSjPcd`~nm{1giHSl*QB~^uq*gPSHylk#!J^x220|jbRIY>_(?XLatpAfR zHhh?JfLIA%V<2{#18a(6^|EceH-bTuyL-JJefL@1{rW4j*z~$wl|PmNw7-gg0CROQ z16UFA*+S|`AOEBI_~GWFI(rlYlz;mBDu!Z{{S}Or0!?XA>|>9QE_-~2Ut$zQ5f6^l zxTeg4;7V#F4J?PH84zQ-UczzNZb!S%u)wf=$$b;w=cj;c1ol<Ijz@0*@G0DFf{_KD zvlOojt}zD?1Fv;?=ssm(Y)>he;jXpr5Zf$@yIsKrT$$W(yPYdRkM{(q4bdS^=-|dM zV8@pIuQ6$g{dZk+R!3^R>AdclGrW*HE4mzR{rYFLaX%@~-Y1z-3_&p*axn8#v~l}* zU0${ZT<u>OJ#UZo%m%CadZkvcv|*5bn(U2H1T9hU+3OFoX}B%3cMP-Tn*9JIFx9{2 zeAu<`mdnq|4!qv2QjImAoYLGprWR#Rpq-C57u>5)N4;b|u3=a&(dnhDT#1xib(~In zv%xvWO{djspL#R+hZ9|1jc8P{WxczPUp~5b4Q(W6iW|5ZWvFaGhUw}pTxlM!cBUBF zWOn|Dy?5#M#7Sx4qUc;&SXpXa><}9Kd-s|aN##268@v+ry0%$e3gM<DuS9UJXT8;} z0A6W3vLvr@`kOU(Jrv_QW`CJc`anD85^aAro99xvFJI@%JL(h3-<NLoQWcl3v{Z%0 zg&P&DEmT<``7v(k+ssC{eAOS>;>+Cc$F3kjRN&<gmwji8%G}4-dTUROe~erE%r$p~ zyL%^WMLQxw7ms93l5H*&Tu3MHm0#t98PFk<B+zaDz^W$(;AAj=-6jjJ1IVs5RCu{x zR2&Q9#14mTHdz6pNL9c*1!G5o{Yr6k;oWPS;czWc@)r1ygK&kdhE5fbwe>g7HeKad zK`Ez|TLq>G^_(j3g>`2|xB?WqGE$k>!aUX{JuPP?jhC_6Y5hVni&P2|FY;Hg3WwZf z(?bS6;9C8%!5OAm#9_u_l(5>%?rYL~VqVs78G=jri8)#2rDSBKm+#EWcNc+mo(u&z zU}1dRgO58LT*EYNLQxXN(Lq5svHC$-iw(+JY*5x}1_f>=1~v^3<i@HP9g`Lv=!KL& zkEYI}yme*3bz^1AQnFJ>)vj{25wQ4p(WfU+m2;#ckl3j8-hP9hRN7d1erIyf(z70> zpp8Ar-xp~*9MvJ_?wC)9r#2tw^{+IO7uq%DLI!Y!B06A@c`&iScx`>dD~op%EGvFK zH_z|*`CWWD9n2w((+BT*X_I-)Hl#iWv(!Gz>_(H$%Pz8=KUdrCof)q+Z~We=P59Of z;hG2aZDLD8_E|XNPKSBrE{v}RTUQ1F;nCR<834?3YZ5*Sls0XYzxR2vd*}AoyTA84 ze}_br0mhWExN06_6L;z=36@dxz(^FqLzN&cHQ*g4>kYbLXR!D727Fd~o*(U&$H(lV zlvQ(qTI6J+ZeE|1GIKG7l2IB6v}-Z&v(!=DIRPIk=;fYs87z(+>vtJgw1a&lYnV6m zU<wf^sF*zl_ydGfmJfCqY$f;29;hL-i?ZEx8Q}@K_i{`EnBbDxA5U0m#%}t?(^v}9 zZmh?&*J1W{MUV*+Fsi+E%#k`c>NLm`^I$wseykkx1(SG_0spH1bu|NLE%(UT^6(Y7 zo{jK?gM~o(LIeJd$_*i}*#V}!JVM(fBxowDca9$pv9UAkF;xi4f$asPMk53blIPSo zu%^%-&U|DNz3-oAGsxYFNYe2MW`+w+{0LFBF@qY23Sj(X69E9cnad9Vamc~yktzbZ zQ|QlYNESEFhex>)JwQk>R-hTU#qjzqv8vdk2LMb!v%fGD9=~c{`b?{R>v68&;aQlG zp>;76ThxNOKFooYnx4DN_Jiyl1m%^D`V4zmiV_5ZR~N$oQ4V!551TK@Dslqi(JA=h zVLn#$(WadVV}cf9#)orYYPsn$=_WO1ZOHBlBUfbm^AQYLfx|f(W5(gaIfPEn0F8Wc z&;w2KD9_qcjI{wF<lzB=NKhmse|)KDR1TYmX~5^Aqg_e}If{qFVLRaWLH?igmnMye zQF72z0$6-2oy47Cy{{-ws!iB=|LuTsI8zK=l^|7O>Pm7{MhKs?Rs6XDQSIqRe>LN5 zBAAg9bBs$+ZVv8lV{;=2!f+E)j$(W!$q0IAk(W}%VmgzO-%&|0DTIL<jDspzPS*oZ z8??isyvu$)SoNb5_%b-5i|wgDp%cgn&-)8zhr52E5|o;yTL3kiL7if62qN<y4F@Jy zDLRS7v_|+=5#((K#E4^#X{V|gXlG}KKqJxx(}W-Y_y;pLHUTUTJLHy?f#i{cXEnH9 zN>=#f#?SkLyLId7Jxh6P%!EJwLDFdKad|AbyDNE9RnlIaV$|i^U0K<A-y*y*m>d3R zU65AVrQa3%Z%UC1UP_F$PLb;u*um7g+&lg_ogslYU`y3Zj$K<@1^_?6PyAJ?>MC65 zFjL?*)^#p%(L}SYx=C&YS!j8}F)bjwu9*fDe`KbeqEhq2bnc#1>}DQ2`XW2Vglcx{ zfxg;j1IP>`zF6CE72Rr~V&>6Q;{n7+RmWd1F7kG`ikznzQ^B}HnI%Z{<HC!MAy*1P zgSKi3k*|!m(mj}uCxh8Dn43qF|DnytIE3Kcz-_{~xOh`WWe5P7vxWJ?@oSq39Y3xF zS#H+W!7A&W<y$d9ua;<r!ZoW9HE5|@KRnr5FxZ{!=S{mvDqD9Q)IqX*&1(^q7bh~E z=Q0S}LKqid`8_-x=MRKtwd*z^sEps6btNxkcW|p}yO^I{wH4%7x4hE*7Z-41Vs@H2 z4#YP6Xd_>~k@94`G`lpLj?a&*mgircWAc0Rx$s0Pe|)y%VtJuUC|$3KM`-KmeHhjG z1ok}Kw4uhiYisq>wO*!c-K?nfDp~8h3Jk+q(#wl4?AvA8H(9cc7&ybf{Y!9d$P8iU z9OGvAw%<FmCR2Jzc1?3@mRT|b`LE5eT?51QoW~X!3*sxja9s_?=wF}pk}YMJFX6pD zW7Z3gO$;tKDsHfjF3N93j+FmmS7SSi7zE}*b0D0@Wx*|NY~TSwEERB1#T504=<9W! z?Nh!{c8x47*P?JCHiz4QfYt+uN63yrnDF(`9KmOUa}L*FA;<^zk^_rLU@12uhbi+7 zd!vb&I?DoCPwLhV;<&pbNbWKv#v(GsUVMn>ghsn1O}09wu*~?zhCA64=Wd8n?U`#( zHHYry&tM4YGoTB@@B=Du=fFL$EOBlxrbnna+suTD*bj&=#Z9=EA8K6>eO&Sgr@rGE zi9aIe_vdoT^T^_R{HNlCUok_SF0m}ruwrN8y`|`WfnY|I>gw89k8o9Ag6%NtoX&23 zFo!-qeJ=conn2+)<k@FQ>|Ucn@?>BS#*3>lJa)=C(HlRRJ*Ed#O}iaQ^UmXlXux|S zaiW}J&e;G;EOa4z@P<54I|NB?4Z*vgEPZ_pQFQO!`E>>!t~sA~9lj}w<A$dITCX_= zQckLt9h@#~Mo<rT$2pjlCKgt&^IuK5wyqHmX#0ES?$$eD>^VRcceQM}^)Qd!SI%YH zMZ%^j*`%v@Y>LJ9wsBgfp1h=h2+v3~j+L<?x(Sw9I6sbx`)^^++R?mf-1uyYGfSlb z?(=Cu_m=HWZ{|X9)4UT$VHun@)awd6$D7rUe(jHge)^X8rGVC7uEgCg$>0V_<icRn zi9~WjI4J&r#{4IPc&7>GKQG6Yvk2j#0(*IgR-{vmalm0PP?dH7QS01hI~zFt7^(_9 z4WSiAet#RWk(?5qzbK;^GDrV*vn53qb<UZeQ8~sQbo`_1&L;lR4bLI{7?*NPdr<;> z32{fpT;Iz7*J27QZa6(SJ>kS5b=-Qh3(l30Szqz4Jn==yudh@v>{NS?!nB*1K<Z<H zHSbb7n>a&{$#YVC`^qxBx#_3JXPdr$WairrlDVO!-%|Zr^l}Zj_Roq5zwAYAnFX)9 z#QmUbwqE(RNq(X4j?IhK!TA_d3d~zq)g(6J?muh(o0F)1;lTgp^{ZYoUE0)p-oS}L zs=eY?2fh5WC!tbo9%LWR$I`z_riY;QpZvyo6MbPMKd8QbIcCz@8bnyhrA!YrHMhSL zYVio$`7u~Z4&AY{6Ei8cBXdSRUnPD}#bw!_g3sL<`_!O4!E}TH%x3dZk@vD!$LP%l zM3b&*bBX{v#1v<6T@2Y}hGV*m0&@jgxtvOnn<S4q;a^p2cLDwZ#nj|tE+U|<DSTtm z%St|K#PBV_N1sgJAl_GDqZ!1Nxaqyp+xcKPIxRe=`ghD_8;;lN#_@?CE_PRf!ggpZ z*ZPGiUy><bdH3r_WZm@!`2ZaJo>xG<(M)wv&#ob6o9XEb?|)U^-*)!bNKx<Q2iDUg zRJRafphFa6upNYdql<ucblk9e(GQLKn4F469rdTm^|UNJ_}%sD`8@R(*{fRidO{St zB!TV8Z>E=D#IY~p*p<aG%^M`7GP_92OAw_jS&N^Qz}77tf!_1=Ul9~+v5hHP(U7RX zq|zvJ<O4AOrloo*>E`jXm(6T>^2LUdUf|9IOr7MVl~<%-KUT1>3oc`V>x)Sr$o%Ir z7Cz8<W8_n8#Lax%Fo~6oDd)*G4q)E`?AHM73&4I1;Adta+(72BvwR&g(MD1z(xv(z zR49Udby-1(H<gox@LAgw6^gC*_Mx%TF>jRN&PJ(?e$YnWZ=)Y+qhD&HuiNN<4i-!? zu`i=&5a5r0e0r3BWD};1m>jhcFWZlm?Uw~9nA<v8YNJY+g8ET;%B+Ms;Qeag{e&## zqiw}0|8;YTsyqry3soDTRK@$KMzGpQOIDE)RQ>E<vY-8{_OoB^XTQFm{a8Q$UBxLJ z7@+BtBqR`~kcBd<r>iJ(*Uq1M+c%7@7N|7vk1bB=w!a8dpS3Ur(_{rGrc|+I2d`sm z(3SR<qb}WV<P;K$W!EBIZ3N=gMz?e_de6(sS5?v#`(t2!9*nZSq!h&oZm4Eij{4&t z=riZaV?KyG@1z%&eIC#^BZj2q4g!bVD*eE$S@hsuVN)Uz7}ot`NCa2E)VLzkt)^iK zw%fI62hXrz?uFq8d70QJ_w%8di_d}otz=ODEj|5cdX%}gomn;$PJfOVZexY7Dry*( zpdH#5quKIumekAGQClNv>m}&Sq?ZAy&hOCh+GBHnpKGPbL9FNu9>tn$*x#47Qw~nZ z24`FY-Jw0*&>8enhZ|OOXWN&<>5_*N4&#@z>C4&Vd7)p^;Uu837c~$Yo?btJ)3(t< zR6zW4!2LcCIHXmd&G}Y!x{Wc?5Evg$Bw{l}=RC+cjLmh4b$i&x9=7p84?%<ZN50GX zoFq3l(x3M^>86SuxcTwRIr{sM@w_vw`m}tBv6?$KstY~h2q|0^4pvz%H#XM2<8b){ zbU9aB=TU3V(D)&`+$kFI)b-BjkH8arIlt@3=?6c`yNV{tuj@G7Pat5;hd$l0jW4JB z$2i^XNPjuqznt#B&(r<q&+~L|c9Fbs-CRJ1B>f+ljZJQRL(%;bczqG^ua!lxH2GhG zMTkZ@#Q2R8562uzm4Ohe;QWuci24Pdlw#YKV4NzC=2Cs%Gc{FLS>&f7Xk+RWpwwW5 z(N^O1!N?#{6TXzH&@$P=rBte<mRY<S4tSy#j&wy^Phiz<BU`xHgt4mt^cXngT0oYK z#x<zY-#mf$7*sOIfWxoR9kV!x1du0@+%CY|cxhdbpE4O;BoG_JevFxPII9Z>1*dzQ z!x63#3?&KCYryK_5W+ehgFVK=rkIiHVCMW5qmLisa#=teZwlsZjJp};(G-XX;5lbT zn@w*poA*3F7*P%t*rL>%1*GH5+Gh}P@)+VapN@x^i-f%J&L(ycI$;;?jf&ZLaQ*_Z z1G3oL2n$ex^>zDp$mO>H8Z9cKaN$>+qenxoXTKc`UXG{aM&Q>u7(99Ta51HG+<kO; zl_2CNTi+!<zJ$Qo!`QbmjGHV1q+S$F$Xc1Ar|ltlEWhbVE*e@>li^*6cs-wvtsx(s zkDPu8T(0xKAl0K-Wt>YLqr>MemwFOj$AmL8$sMR7pDS$RtWHsc4|Q^;@A&IC;!mX! zscPb*adFA*KKDvW)#{Ay2BSHZ43AR+=q}5vQs%k|M%Jggti%<oOt8z0P8A0e8BFhx z=GiIpmLaBoq_e1Dl87Z*V3o!G+pTsiRqCo&1hb{CmX1@Bp!_Ui5H5Bw|7`?W{~U5? z2dF7dd^%i`R^BcqORe2ML5^F1s<xJl5$000Tgn@^aEfIA5goWY#w@^vO>h;K#T9x$ zWgfx31^>d##crkAp!~<DCxZz@<$p9xuUf!7hy&<A(qZU?j|SzEQb=lXdVSteAn8<k zG(^!qe9Jaw%cYDizlM$n^jFAU1;!!4j_=JV7HezG(@jIT+5*)ZYMlc6*iw&}pt;pa zEhMN-)`Q!efEd?NbwNY+(<Kj1=R)^`Z5LmlCqP0i{=w>Wy-2T0yZ;o3PI3XOLOq$H zZOrHKlSR9F5xU(z&w=aATb*=S)z*((y4^wE0y5u0js#>LkSXCWHzbpaC3U^TvMuEc zukT<!d@!9iI7pIJH|^l8d4(Xwaz5NzTq0q+mmE93j0#+6bi6V{Q(YR^J+m@F#{mB| z9wbcj$W_S@ApWV@Nvyb{`lDEJGevaS`zTa16RK|ntcP1K`)M;hr<5d;Uh_Lg)7%#Z z;>Ol6XTWI>8F#~3Pmp{RT!@%923n6W=ijt*=h|&n)mtQlQKNeGg{oF=vjR934!i%| zY_x*HZD^-|$HCgQGuB|0Ric?V?(_-;amTQ@`9Z}pEskJO;TpyD0VfuTT_`KfMgt1= zUo%t&I`Wb)?%!)=+_rsp=kc%i>7~yFNReIV00b$Fb7U)uMw><VVS#Jdz`=)ROHjPT z^g&uiixVM;R}x?jL7i}Po3}y>Bicm#C|(K%cYQfPjpwY{qHl&H=elaG@qc%xC;K4t z53?<}7BPAU`L>q*ZPIGqZ0&Ath~HNg;|sy1DGye#<gVJT<ziUWj`268gIk{j&Ds~m zbp}U1<p)s<8PAKskOX#tON<|F49b)Bxi6{)lh*nhZe#zyEV}-FTyo)6@^c@lBOh+7 z&^m!DJ-Wk8W7jS1iq2AtrhaGqbcvmDZL93#Y|+atClEFp;JmT^0TxK3f{hAYn%B~E z#(b7KSL+$E!_heZ7`)`=BrLB3r$(167v_zDHC9?MEt!A{P1a6Sky6%u5s#D<*sab` z`5O7E>v~;Ggi7?_Y-zAYf_v5J=>jXmmb^O!{R`b99++P}jI4=pyF&ILiz9^aY=_M< zee0Ic(Oa(T6q21P7QJ%%!!F~|`9b=OfU7!<-=n>z56NyX-RTN>MoHU%K_JK|l$z=6 z36ih0H=O>6Oto0~D7gwRHQ2Pc+k$d9wC<R+-MQ{zY`W=b!w*h}qiJ-zd&IS7)0M}9 zYSr$xQX8Fy=$G)T*&&xekhey;l}=Lm9M_V{Lcjy3yl`t2MAy4&(}UnGS;Vw+)%E4S zfg<XQ|1EJ_8PUu|zS6amu@E9PJ1b?arHFUG%2qU~3)$xPSKqajS!Mh}hc6i~d4<Eb zo*(1J2Ji7Me>)SgM8Ze`4bOgshJe6m0oI@?ae>EUQ+cVg5}9OsZRz58e2A+W8(t-H zJ5&0mFJx>=FJnZ|_-4gq(@Kd#KPSZ&WrcRt3y-p;UX5tB5;hy&TO>by8!^NPue?p# zG#Gq+x8QvYZz<xaFL}qXV(kl-z93k!*~_l~9>5L6B`yL4u@ya<TH9~F$29sYVIDO7 zGb#J6lvhV1b$T@Enzs44E|s{&|3fIh-9o6*aj&?NSJY!0NGnx}>gqyT6TPA^TShCm z(x8c@70DK+T6xtiTuK#O1NiESB-@QE>2p8m)O-ka?27L92gc)*td|e11YP-PE3@Gg z1^UU<i0cRayYAFjxw2NU>d;bA1IxKQqnb3svM#F*i>wVLg~xmcKBA6GTs8b*SgBB3 zT@v4G)K8^6EnPC*#!99YWtO^}XkI-GSJND&T}f90ZI3@yp@Jul;^h@OezM!7+UAnY zR;X!$?YfLI=GtetO4Aba?73E*MoFuI{knq@E5#Lbr}bpC_WhIX7CT|`!*3LlTYj6L z;zfxS9<KE_?u-gs=Lnv?&l|V)z0VuB?B@rs);4}vzxRWD<wyJV&f(g|`VarT_MLp@ zXa0O4zO_3$zAr2|PTk$2(FKy)7IzzE?i?69n>82M(o+CKh~AwqPUjONRq&k1I~iH4 zt>76l{s}am<or1#jg^@)>l9j2D-}mCXM>XmqcMmXZ8)q@um`ab-ra$sub)ji&cuBL zN&)oxRQBpzK}nFv>ygLPrUv32k!x!!Xbd@;98TL1avcPNA$n3|0<2||SxcAYeafyJ z;3;s-l?I@^%jAkqMjCW9n$yDBA*8teR^DLWQWim4zvScbG<!9jkB2Sy)#p3<>+TB+ zd<YDP3$3_$K7{3lULn9(k8%#={_E@c0N7OA3J>$?{Ae`5G8D!W78#e>f|Yu=b#dV~ zuPhBTxirgwK8pIH@cdhFmIq@riUj7s5IUB`0nh9?{{ZQHJe`nB4ve*+#jc}_SC>Tr z07Uo{IJ@j#Gn3YN@oF`y)tQ{RQH2LHsBVCP?rj4splzql>BScJN4YfcQ27_oDIxmV z8Jh3v-VbIoxctCD2*DYx&^iJ*HUM<p;{gr}kY!r~*hJW^fj-<raXc=YIs?ZZB5jeG zC~s~2y@J?)yAMnP(C0a65ecd381i6Q)Y`Bo!D)%*`%VUgcLXC1j!W=zo<l1T3LEqK zNpVU&h<;JFBWI(<F-;7Pf6t;LM!a?A+E`RONf7$(1quo!V?^H4Y%cv23R#(q93;%L zP$8drA9>0${}syZjtC(HS9&uj8-(2m3(Mkkl)<#m+AHI>j;AX*e_9pDbON)4{$1mt zXu60IV7E5()11;MyS88@f(I01p|pn9Q{EzLQScfSis{uc1p*rC^>ODb@9|p_A>S`} zOM%CkFff~pO=L9u`hk9uPLggm^q5?)f;vuyTEFPniWm=V>BkdGPA_oS$Ed&uB_om} zVwDQJ)Q5%!nk|pG!T&`|2fut)Tv2O>Bi0$yfr5Yi3IZYU{kr_M3<EGqP7YDg8&A*R z>^AQ^N<B!-hrx<D5D9DH%d8gh0H&=P*PgZ=E&v(M3wGjaJ8%I!b&X?B7xL@YHGm}; zw>V~h*npgd+)NrW7CWczy1tj7ajwitNba7?110;}j-Fm}K0jr@bhGlkRtFa+oDrOi zXb5hH*-=h9)~vuCZ0YeCC3gi0etI$+1NL)pMF)Znp<F16i^XGY&Es=QjT>g&`QnuZ z1Q$#ZEDloB!h2k=_^-cO-LR-j1jA+e7pE%<pc{_+I9YmpJcmg4+Hb(FZm(X&5*O)@ zGc+s?j$cxtHgDWA5aU}%#KSDg5=29k85kafGCp1*QvI`Q=xlpmb<T)EM%7Q6(?Ryn z(-8#q=g|IeBosN#KCX+?0*`f2t5WK!6ObhE%H$*mCu3+Hm-5k6R?rNt3l2vI8K=jT z>X_f+Y!0l8haVw06Pm~I3M`6<a4_<ED0!%#;DEMe6a+-4JXm-X*^!#NLnxu~jJyb+ zQ5R<*dY8o1>oNj|o{x?Ga-}^CXkljNLtw*@6{E}yR>E>K$kjQ<5(_<er<1=i*PGxf zHOB&mWA`y!Vt2>J%765qh!TVjq<H-bSx~?&ebQR68#`ReA>lZK{y~}P^e?&r=Z@P% znVQgSI{Gjj;5efQG<Y;r^uW`;=#@z^d}8OJJDdP+Rgpok!7&_W@+4#Y;)hqT@|vwJ z0oXwO8)tun?UI&!mW#M6gMurB(nD69q0ECv5MJT|k9tTK?gG_u!M^?>&}|v^lOz<1 zw!&%;d6lBe#0sJkzU!M?Xl;Uezcbq97WDWgifk%5$)69cE@0bMkuF-DMqZAlnL05p zRa}w1co8dXrpi?aUhxVdLmRm%RZK4tc}Nyj@{q^7*ZMhHW2<@>G%W?1;2=C>LnR5? zuotfTvQ|T!O~I!7sv2`QC=_wS{r*-il|1Bh39C?A-UJ9>qUjIsVPo|p@N{>*?If3g zP{|XOPUyZo+uLJ1j7?8p#8Mq-HG#Vr(8+_;3N+nX>b|@g)Jhn5BpqnUTD?I?rD%Yo zvOP{W@~#umOMi`+NrCTO{>4gftwb&I@gZ3yJp~2OAj3zbF(VwD|D+Qf<#l!T<52}y z;E)gua*NF{5tFBp;}%f9>$wYp*ac9v$(1Z`I-(FIec?qMgBVn);t*jfLF=N++*3%y zt|WlS_nsbL7PZ6Eas1jx9~o?A!u9Z=adnxuC=TYM*#gSKy3arXH69)2{}G!J94|d9 zqan@7woY+{Jl4}^+c18dGA^8}5piM8qztEKGz<*Nt~MQd=WinL-{rKZ>kw9mlL?`O zV0!ZK1q8TqDKOy@pRGlvoK24|3W}_aGi5|=x(HiC8D~Ei42TB>acD3($~!#)I5;=} za2VPQ?zw<5U7Vrrb)9&RTNps?U<_;wM#@r(W71#ZL@LFt6!2{gXu0HX;mu^Qn9k3o zkerWeCbkr1m-4THq}yTaQ<IO`4Td)0J+OH|4-Qn^%0Th$zEtbDT{(N6E9`X$P@Tpc zv1U;!OeoFx!QTs46OMvyK?y}uV;g491!0xZ$gj;_dabX&E?ONcSd6FB*R)o?E-Z&C zrmChcsXnE4L0g<99~PCS)A?{T!Js*;H}z)J<6Es<4a$ACEyS|$vlq5Z-RSkQB6<_5 zFm%S+r7ISWZ0q<ftkTt2q%vvx=9~|2B_Rmkb>Ri`jqR|<kFR@wW$nM_MSPcaZSv<s z`2`f=5CfeJL5w}YNUwO6AXV=@d5KjIi8ysLxPqRY(%u{9NAnyrmqQS=(*^#3P;OI@ zpnEINP;x#S6_w?CpI}Qreq6tyDV|(@a6IA5l`e=@pwnyN6$@RqpamSRzTuR{y_@Z0 z{~(rJJ_e06>H`M*BV-tQ^`rp@SKh<VPen2wKdvDdT|pH7exV&9?f3}PBcLCeR$Svz z3_)13wUsyd!A*?ElFg<ts9mXs*OKGufNrufDALd1n)D2=$Nyp|%osPZm_>AvUVx5s zC<piu)!gI7XaT=)kMs1Jotwkcfv$|&aJsf!3?>Iu;Wgf>!Q~nt03Ch$Bt|>@2#;mj zu@s@W^WxJG3LJQwcKZ;SIvng9G%0k=y^lB4li@fgU7Fd!cV4`dAyv7_RZ?<A7kIP{ zU7)8=MRyF=A>H9YfWKYo2K?<h%=yO`LiDK#QMPXk5W3u{;&gwFE}n2Nx}DU+UJP(c zA5O=wSzJ4t&R<iuf_$-XUO_^1dLM(%@yw!u3~bEtY5qH<W2a+SGUqA<uetHTi)jg% zN*5vfQgX*rkDCGOD5DEIh?|##q)eK8LK~*N_`oZ`LP3!53NAx%nrI3BUQe|xZy^L8 zpLU93?x6N#l@F*|8p-PL?)kJ}8{AHBW~ekOE$o;(9gBSxalLG|h9c4yj5ywQf~5Ro zz1$@wj=2()8II<;Bw*)WapLba5vKg|_gL!D3!wlrEYOb@nE{DBf)r~{XRL7Sc#<1K z?&4k0G`sb|*NGaSPs0Y8k&$-fQL#xT*Sea3Qf)KzJ`j2Pxv6c`kjI%KHze{al5xJ& zasR~^70{>Vo|=-T$B(Z>n7TeG`e+0S@f(hg$eY1eDB+o!wGSYU{yusL9}VyxsiRd) zE4Fz$QefqsPfxQmw2Xo8y>i1Jn)-bzUD4-2`#uxBl$nT+K@n?oTwloJr_^$NJ_K;3 zM2E_pzEzfkuux|5BP6sWWpH(oGOUmhsY;Rz>WFUMAgx>=#(XSJ@l&bGJ|?ZK)|{pE zZP%vI`y`|{rJ=hP(i<rBJY}C%0e+#ypM(~3Ln^1!J+LhZ6FT|1n}$%L@Ul128=JpL zy|ST-e0oA3do!4b#e?za=$MQ#+qmS6!UBIQ{ezwSz!{Q2*vef@+4SbOe9S-Y^FKHO z9qo|=8lrKo_rTVI$*#kIaFBA!420|dV)q1>=>6iTkuCHb4;EL19=!rDreuXE-|@-& z{MW&m`w9=<$F1p>`v?!-M+g~nvcEOq%yUx4z0+ZfP!nT1qYW-y2U}0KOn?g=s=*cT zcT?-@jef6xh=H$EX4EMYg0|G^bRxla1REYTjf)w_1SaP5GI&s(DlBMfG!imb2^{3> zGALk`C<b<ZXJ8G(Ye2OM_~F!}(hk3A6um0Tpwfn#fA51)9#s8%zw`I?-mR*!3EM5< zs7GdbY@kL}>)89C*Xh>z<1(#7jjGnw&eBMD8!my1S7sTMT*Xc&5wr}c*7K=3w0*T} zsUT2CRS=%02f%3s1uN3}s8WOdf}vIR2N)pm-#Kba;~i)Hs?pja=}ZkCe|lKN-VWY^ zjcxqXVh#>?;U}0rIT&c`m_xyvM6Ujp@i55t-U3@JReNtcH`*>YPH?gq0OtXKa|PhM z34nJ2fOiVOyA%Ke!i{93DS3}BiP+_Cb`HPJ>DN2>g-Bf3^|nIed0B`+S$^n!zo7x& zz!w&}o6XuLhO=fZbj_Z?N%I<W>!VSB?8Ct&TK1bRQ~CSkn|te<=r$pejP<`U0B61P z06;#;=SSy>zF^dW`<<Z1@cwWS-5dAQJ45QE+GyXGwRk_iI%EBh$FpgNO|12A6&O1~ z7>6G-;P8QeHrxmNY#C`C0&x**oq&Mnt*K7O^%8Z7T`-k3AGfly1Qa;f3=BLKm#7Jc zlBtO&+Hy5BWC}9XxZ)F*fJCQIM#qo<vSXl5wq;P;FQ#KK4$RC6Wbl(ig+QI$XbcAS zUOvXKi?E&yC_@c<Jp%RjzK+&b1r!NV_Ao;;D7EYiog&nZY7pB-Is>Lupcg6uGBl_W zAlt(dn5Gc!6O}Nvgl169|8wJYUFG5Z8^eXEOOyad^Z(pvzdrh==s*ce-^4~;=oiqQ zu3;mp-T$pDcQ^-C-vjh)nKzT>D#S#^$joavo`5-M+v6T1#Yug5;C#S*j_WVy`pY~0 z<sG}QTbfGHLthw0DA5D3*T3bv;iiTFQ;07o`zp3E?zyAJAN+QzVMe`r)_d#gw^)+` zZixfb_#I6po$`RAEu4VMl+}?yfL(%8kh{l$_)pJKAAn(md(m~HRt^kw<=i&mWo?=0 zVazQAXK`rPfX6aApOls_*QS5nX6RV2C9MayokO*XxijQ+({yP#n7@Wgw%K3;G6gAx z=mkXx>QG!yd67M*`#0A77Ai3}dC!1f^9TYGj1JFXBB$sz!k(W~Ok_XLDc%MGl7=$! zTI^*Ur5h}`CKT7U$k4r)B_eTJ&nboq8XSRB;Rr$=5ST(j$g(C3bw%J;RmdlH88*R^ zz?+B4l2bh6fCcgaCfa5vZ1UeWcH<H;Lg3<UqeQC>5U_Df37o_dp*V`BX@eW|)u3i$ zq>`6Cs8EfoKDph9q6ez{S^(xSqNDME+>}otz7dY1jaCBjm+p*?KofT;x_X+15qit! z1#S;YMoztjHW@o!^^Xqm&DI!J55=yaGLn{jOEg6zDueN-%vXL?A8kwl(dMdx)EX7F ze@s+U{QYwK*9Q->?Pu9t+?3&0K#xGt0zqgJ(hhXohqRE)r2PYyBa9J*vBYMJa~K0& z4NtK8$zYh<#Kj=o<LqL{%WSKcao}Tk2UjI;P>C!r?g&gY!;+$}F#Hi+CgkVnxlc~+ zeyFM^19$B(I9*InaIMH5==FNKaQW9=vMieee=#W7+6?CPlsxPwN3a_}WFV4d;17p4 z*bL1K$8bv7<EKHM*EPGKWa04|TLS?24tt0;YeoLgQ@ZFet44xeK~rd4*~@h23{}qr z2+#N-JK^#==Fq>rEJWs!xu2oHCgag-8=1-mHYpb8W88c)ZD+?L*q^eiOe7Ses?MJ0 z^Wy=0kg-@u+!Qk1<2}e*)-eFMMa4{%BI*2U%ZJ!*X7}IVYWRgNROTGLjL#3GyoP29 z3CrG$2F5QAzEDgKy68jS`SIvr0Tit$P0j<bZp83@qaksXNL0l;k#e5%W*oRZRzPoa za-;82$_k2@=2nvEI-vd&!b~UfmTQ}P`C-8U0d2l_jxOh;wnM?@D8ds&bsFEDjyZNx z?|ZZxga3E4-Ytqnm-sM-;BOd!4ujg^U`-Y;!DAV{`fp>zM87RGnT<5IE+7%M-&*O* zQq5sBhDg^y#_nxo_@~slAK=Xo`00nsv^U95fgfMCO@Q0$<EQ>|ZJOV~%;SnQldop? zqN|4=pX})1gNHf=5VYYsPae4p2H_GU16qzfIF{gq2ctQJcWZT9c&m;t2J`v!41eG~ z6aM?p)4>q`Jp|bfg@o3H2l6ohV(ix`R`z6?32ceJ4noWb0qpeYaX2V|PPMu_H~De8 zSmgBiJM)}jkyh5-xkYa%dLO-lLbvJF;%v%qJXB!EFd}Q*Fpd~h5wv8)EL!tiAw@%d zQ64b3r?f-1)0$1k=QQMhhKe+T9I<o*AMxW6+;!9UECS0CyWxCr)-IIuunL`^Uz?~& z1xMr{#-tU?qb3tCix94Tfy&^61TH|}a3??YfZIrp$hvV&XoI*v9rQy$1HhMf#b?3u z6Ksi980FP?&LvmL#B^z#bBTH|b#Z*TQ4DHTNG3^8icQfSkv>pR7QB2P44(mC70bHB zF|>S~==fS1D~`&0Ef_7)DzJW4ZB{iDM#nH?VP~E8YbrrsfDKVQ!3O5k^p}wWWMFrh zUw!&TloNkg3X2bhXlmRE7PAnY8jOW%HN=@qH^ADMHGCkfiNrR<8Owh9apuFIA<9(v z)8kC%R$@~J7-P`}2*=ShCw+)!B(H4=M><m*4l9;jYE<#pP5bM+>l^8ikf1q^iz0<e z0n6j=@Q2-0AIk+dZNDm7m4Vd9q93R#5s@f7`P6mmaLN$8GPY6s!v^nWeT=nk2}5+_ z0n;Exw@La|AEmoCMz<GHI~kxm6)oHTQx}-KSy=8;GYq{vP?9N$b#Wj~qTU8L*Pn=U z#s5lq4#hExSIr5gnv3soW`OZ8#dfMcb4_p|wI=d>c6T~EZ=X=0zVveBp%VZV5LVPW zig1J?YUZ>tB_4gq1=_ImX+BUzX!|ajCXyn*jWPa^QZ$baS4;!&#m`;9p_!@1&)J5j zo|e~}^8H5t)-4q`IeYQ&jun>Y)01p{4GX}cT3_49K&>%)15*yhtC?0&$9W{bIS?+b zo?mwND#yh7(*_FaEU7_5YP+Jg6x<Aoj9eJel5v<H4nSYXniBxI%He#Xm?SCCn|KgY zT^B?3Z0dz^oWI?k!r%n693eewX;P+vfE-1Z5otkCm~6k{2&Qmc#Knx(T~icevt@t6 z><!U6R<fc<qvchJrAyf^O8XWivmN-8+Oh`zrYqTS3T*p&3W9CnK~D^{{Y4g}GD=d> z-;73J-;uAov`I>Dciud;=bw*`xh+f7DD{(cLwNH0EtX%`Hkqsv3`%sZ1!m#AuRv$_ z6xf|dLmfw6T2mB0xpdhoT252175?($bVAy`b}$KNn69Ch<EP%sz5Bo2f4aT*Wb4I$ z?`_??cb|fI!BNGL<?+Yc@|d`zgbE;Kp&wo$lPu4AKtlxz876h&t686<=5AtuOvAl9 z5($y2mqoQ?J1(GmPI(mJHja$Gau)w2zAe3w-(9N?5ShMfjLUNo9huiM-R`Ok68OqK zT|`fjoXq{xl5?sjT#ed<A0rIzgLi7=J=|%WjoJ>cUW#MaiVrDB7cRRhy@c-mvi0=g z{U&QD^Ze|atc~Qjc#~64`_kCIxc}tYZyy<Zv_>C|>-Z#})K;Hl7~_oACq@kPc77R$ z(XfK#je@Z&GfXEE)BGe6*x$6%NpVyo3dKy-Sr{U=-o3No1Y^1$OPMLpTtxhdYjC22 ztN%t{27}Bo4RM@#lsy?>^@X{h!U9OQkVP7nSOW$U$+&GZVhtOytq`G*m?b*_Bb7)& zn(|X^8SZP9Ag>x;RYp<ss_YLlw&NRE=;CL$;3OMViY3KVm?@z)s>ZQnJWqs+EU)N! zbVs=*V@5n4l(%}dc&uh=L&!jT10ri<MfW^n$rtq08k;0~#xkkjlW@#qtgzIHu5u=d z!0QvwAQyyf<|H~5Tnq%xy~px^@o@9U0|I*9<(tgdDkuMLFN}6+!I#(j7-Y2ZMmb?g zlFD#)kPVj`BnduXUM!zE-q@`uEj*Dc>Ugq7r?S7YO5KH<v2j00MzP^CMKr-^XH0iB z3?^MgPgXi=b%nUuU}PBeWc1gX_NzB&_42pS)dpB8J8e1}A?vcKr9b|T=3lMwTj1h} ze5Ss8C$~cO^f#%K=&4YTMYw;6xe0-=pXxkowZh_Zf8rOHmx;1)Q&cX?FAZLJpN`U< z@viM=5~%<s0TYUV-1#UT0V)v0I!9gf1CSeo@i@c+j`;E@ja+sqIg<3FW=!<`T>yk% z>Wbcrg*>d6CHAo$K?{suhDF`Yw<_vhhQ;l5w=Qm9LWO>rMPSXcSHr$6r4%!sxNLXg zkA}P~b-`S^dtERu!_vg0g<~_J3?~8N?C$Cpl$U_^t@ZWTwzVn~sIj&YzQ@%@Vpp^- zi*+$QB7Es+F@_n>2qU8TuK%r6%uv2JR*Z~>aTPsb8VK?!GUkcBs9t(>_-IJxxgzzB z0$nNx08lTUP)sin5GA750)^*{_Yq$+6fWZunPA;OZ5}8PNYfZt3V9EYtObumF~Q_I z=$d_6ND@7PeF#Sr8U-;~z+;_?4Z#F#k>B8i21tdCkx@~A-6>i+a^gJ#MflaC<UQ=} zroWku$CF`4qk%AIL?e~GJj<Tm2Mx(qcIW=~_Wc*xtF6DHt>4zmm(T7#+S<OKZU1r~ z(-i);g-MaKyT8uolYD`uVK@RP50E-{;Y_)3s>x{WkbBQVHIy{-oXAk@#c<H4tn{r) zA2Hwz1cv_Zo5=6O#6r?5IXVbRE-O_GrJ%^YozoSKhE0?{(&y2{)vUl=A>cI>$HiW^ zxw4al)~`8Q6JN_&i5az4cQaT=JNyydH03G2J*eg}Ln&@X+C%iwUQ}uB)@6%{!!{R- z482bCYc7}`k?g*nfSl?T1^|cv<nueKdm$=K-|H?Bg1eos#3m`lIIFG1CGlD(DI=6p zgPrh=u&Y`lH5f(XC|yL-O*Lo46DBL+km+kGM&oBYI*H3cL3X{Vwn_~qH>_f9D61$k zHuFCL2g(MoCJCvxFz}?;aV_{Fzro~V#nj9r5V|B&90aPKe}hOQZT{Fq%i849RPaqU zRYxJz&9e#fVP$Btpg`tD;<wsy5-sV%T-l4MML-(-4d`Tnid|?6rIKH%Ww45@9h$UL zq18@YT%YpV^gvgrjhJ1e+pk#F-Gu5$uRyf0TSlg}YPSPFiy$IVEtSWp#sS|RhTW~s z8O6OG)g_{8(9MR_rc!-z2~rfS8;>5jh4=F&+<6D@e%j2wB7@cBjVSIdTRyo8xyjfn ztQoaZ$Bft=UXwb@N&Kp5mL7xhEij(uavSB+?ilWjJqIv7(2f9L+P7l-)HL#Jry2N! zm8T(c5o}O!`72{c;MXP5SaG9O4X)=6K`r)LOO9?+#;3{l!sMAhS2uPTRY_E;9>NT) zv~)~^F0Efh7G;Ya$NVwQCUZ(-`kGz*z)^~+H{_EaOh)g>X#%`d!L)mT+&j1_p)U*| zfMLNvzjDrrHYe7-#5gd?T_)UVa&CKT9<p5CX5HITTIA0tCv#0Q$|!?T&fh7EDU#q> zO|8kA*>P*jxY{8lfq(99+0k}v42Q@o@k_C@WJ0TxO>xZJWED9;t8;cvVrglYJP68^ zjj(H0$(~J3E4aZjzf5kycvjUaSVV9ch_kzD(#>GGR2A1bOCuSkRRZt&=53bfrSqiM zbqW{uCruu{)Dklce_#fxzeY0?*EdqTWNM}}NEmJjfaed&G3`XU#SBsBnazI|WCLG% zqF1hvp<L5*Q%5IIuFPO=$c!VhUP^Ok>f!{D*jJzW6E|1lfg{!U!0I&0Z*IEQ4YOlM z@^h!MW9NR~*-4tbBRSReYjCfhNL~f<Vg%oaIRtXPQu=9K`HDLs$kF|QQgr)$x|SUG zmq~KJ5++E$?v(e<a^8RbN$)R__5RXn?`!hjmlNNY-;`cd;!?la)7$;pH{A3C?Kmby zo)dvis4izpr+OTN=io6)nvnkSbrSl|lehvB2~x>3=p_24Pygbz;jz{=)KCYuS}F;= zqSH|(UkaIAKE`ioJxjZP4q5zoZ|yo+TW#$=+3J%o7>(DEZrlFuDt_6zGTNJGWl$<N zF3k5YqJdT}%9m8O$^Wf0V!@Nkn9qVbzg(b!fg%qA>M3!2IM{~?LUZp<grjPr`-E<M z<?Xtkqt^woI~d`uQrYXx6??I$u)pD}U*mF>xCLo=$y>=<YPGZ1-zvu4#&NE?|7oy% z2|{x9j+R)xgtM(txr(h-!e-|D;TkRN>SaisF{?0L(Ibz1^beWUP1hlBaw(N6v*f&s zt<jh~xSCln`L9wqMNM>v!j5=OlJOnYXl;owaF;x9!aanqcfP{E-}3DR`^i@o@wB0_ z0^#*y@&X^?s%*U&j3%JZU6f4;y&J<#3?h)YFA$#Y0Cj3n%}mqlA|xc>arc$Gi>ltE z?99~Wn<VHv$4I5!2r)0eaqr)O>O<bY>r|{ut<MHGB-R~q$3}QJ-A9{avJ0*NVg`c$ z{nj~4HNOgpK;d4-``ECD&F&LIPgQI`ey7B!nVpewur=hxCX3P90Xkt~I_6$>@03FB z+`Ib{(kmR1?+Jxvb0rdoPq04I)|1*;1ET26QpZ{KvGNr;ufQUO+mVVBCERX2>{q(N zi8wL`otNF2+Ja4YSX0~^p(vJT?y?)O?5A#wgN997j3w@U#eP`)DHFF;92Lho9=7OJ zD|91FZ$AUVcY&q1byvt`LOs?7qU9b%`{yhj6C<et1F3%6*Gu$OgYx@pzbxBlTd}66 zcEQ}T#Di07Of%1(H5?pcLs@Y=sE9{;eB`YR59%s5ZZ{-{rA`X0hP*i<ZVgh?h^x3w z3UBjP;oZN?ehvFz;6~S=Wjo{8Dz3CllWSWxwQJWz{X|5Z(@K+255*=^sqBU?7FhcT z<+x}BTq_ksC09$MIOs)`!#8%t7PqdqS5?dmwP;-M3?){G)f5fwZYW%Y*>gPEMr|V( zS)`HZQ782_B@KVZ#qJ(AYWU9#U9ZZaicV)7tYkGNwCHn_IP?ZKY_xo;EZ9ivYD(!_ zbh&Bpzex(Nx?3%Z6OWOPm3`B6l4G>9m-!sRLBssipjOFmx&{Quk}{g%-Dwmn42!&` zAk5pcd{g<ggVt%q>95g9WJzb58UxKrv`XRAs#G_L>Ir$dh9r3cYjE!-|F3q)VS`%n zs7tuEDSymrU_cH^-m%NN$0o`rY$2WdL=lMACh8`V<6#p&T2|K%t<NknweD$iGfR5S z`YL3^#VSdHm^NBn$4LLY8NE!G!H|4|{=}L&(7uD-G~jyrAD|3vCh~6*?#l0=h_MYy z8Ek7Con*bJwu5{SfvH527pgpTj=E@snx;*a1(N)bJ&>#*qJ+{6<5qEkKlHIM(Idg@ z3LmM^guE_5Mm@?S`&{`yZDzL<-`N$7vdHx??#u|TBZ?+`q6fX7`0h?@03Q>fqIgJh z`6WcHC{xJk)JI1XkouVuVGrlvrCfG&tU@^O--_>|pb#S-5uj=iFFOvV0xOkW602fu zC0%uKx4pz@yEWSl%VBQA$_*D~IIFkOv~Ckc8V(PdwY6|W-kaq^iDstoY4(3Pvkd+I z>xJbN5#U89ISJF?)6jTlA|&Ui`M!KFGsT>I5ThR)Zwv#t`kX_Wt|r#d(C(i<H&y>| zLk#u_#*)TnFx25{1v@sZq5`5dE<@#@kImrrQw8kkc@uN)CMH$UQjTeoZlo-WV>5v{ za_&su*3ZPP*vCusVrU|gOs%8tFcO=Diz?AYJwTOdFCn^zU58`i=`(abdzQVt|M)>K zd+_MtuP^Rr&wky`Uj6du?l0NPU$&m#f62~kQ0fkRd+^}p{q0`%3|!T+zute@tD&h= zNAKi<-%!k9Ex8<ev@#aXs|3A4@Wd%o+?U$Rq1^I8Wvd6(E!K_++=w5%o?t$Rgwqov zq2%86#H!^8@tZc{a}!t_wXh%_bR$UpdPo#ix&f%0P56h(ZY+7)$96mlnjF*QE4zVz zPV0Le1=vUl?DNGWajC4Oa@$yiQr_~MiNi2u&j>XXExM>H#QsGFp`?hcD)jvdpl(V8 zY4KuNE+*X=kJ4!xkjjW}i%CNTrJ1ZclL0!?Q-hgcu7;ft7C*@OYe!i#K5*NHBP&5e z7iao`UdWV}hhs$+lmMbC>+pgyNvWj6q!#mX4vV6U9PP-96bFa03o&uUCGIlToM4Xe z0eB}fWXf88oD)tUx|j$N{DG516=>FE%$uk&O5{D3--WbDj;dTq{LJx4A)5)bI5CAK zNG7ENr%06qrzGfO@t&03p1#ZvD2Ei8Gjw!PZ+!b`0^gZBvniq}sod&p<w(Rv^sZB2 zY*}?PUk_6BZZ_Q&C-5MTb@zDeKc4uHMaOqBQc%jR_J)bBl={NIzxB}i=KI^<t*?7} z1HZ}RSd+(BX!7`*o3|@lJc+e<a)lO8zPVl1UJ+}rShhV?)z9<h$H%o*T=J{ff(O0U zy<eWZY}?`;wWPU84{0tFM_KmAKAD10)D6g4&;Ok8KjhqUp+|<B_&KB1p?c3jipwRe z<ta4NBO6Wn*ExU0hi#3kM~wqRRB+W)VnPKxM2-cK;|7Re?M8UquEyeafWwL4aMA#W z+X)P?exb|KTeG6}$DS=EWx9YU^z-)Wy%8CFvVCf<+$3#nw?N~I5hI|D#>O<CkB3eT z(Un6aN>WoKT|u@TDb-^RYmVlvE|DN4h~x_)NV(I|spSMk+(ur*v8|;ys11c4q=a1W zW3CjeisUbnGm;9>_mfViYDDj%5sE*iup_6Z^M8erU20qjZS0wMp79u>Q&(SYC3(AP zKCi)NFKm1BnQ8sls+*vdCdCSdmOXzW5#*g?$tTBY%i<K+Qh!3sI%RUA_)uj2C~^>H zcC#EQK;dHhU~!Lf%m@$BkOAe0L~lrk&(I{&5ZFb7cI6m#=!Vbb8hwt0nNcJa%7o}* zDuMC)*&JNKa?Yl>1q*(JfzZ$?m(?Hae}ON0=>r<=E@iW+oqNDGmp4I>>_ZAL{P*U1 z@Nene1+w)H1`U%7nZXGVKuMEN-t;JZJKQr<8FSz8bjm5~#^hCej4ATK`S?X%3^>0Y z*P+~hoC}YFgK#QDzH)=%VOItG*c%$M!;dGdcQlWvHS4c$Y?yVI`4vMfd-n$CKCDuS zCpd|I1En&5g{*%iGE^+k?|Rem5oPk(fWjG4Wdip*CpekjdSO9I1|dDttQ2z&jQ&rm zpkW^PW)KGyG#=2U9Ui<OYe8m)6tyC9e@K%6&)?hC@yoNvf6eYbdzGE#6!0$}!d^Jf z@xBZb&5Dycr(UFG@gK@RTPEadNT)#BG205h!yLBdxBq{8*WTR5jpYB<R_%A7<*g#= zNQ@rqyIWoCU9V-|ITyz+*=JXs%d4Wu5k;Hi@HnJpIjj5Z*H55<0fv++$tHJ6RV)r3 zjaQ@502;r>hW-zR;)$ux?(Lc7v54ab`C;D*M{F2AE!o|5(FcFhM<(XcUjyM9-P+@n zuv_;JZJizAeH(D4C0+TF95q*<{BS9hb@}gCRuxXTCh_;~Mf27H9Ch~T6s>%Pgo)eT z?m_np8HP5S6j*-)i<`YpcLQY+Wuj;{a1<n#K`WH5fM&pMp3RCtBJ8Y>AamtR&mm+6 z1CH&Gob-L$pRM4S0=@4&EzVX8`3)ulgA4Ky4(Emw4xxx|SM1d9+tq}=AFW34U=M%2 zD(1_AS_~gA2Fp@@eh=bLgO7^=|89{;ZWqge5$(>GvZ`cdsF3*trF#B$Z0X}R6-a@g z<NaG=0Sf#o<ApT$d!TXg5Ew>|l?3eVceG7;&*}xO^}LA-zpvJ5LUE=%>8rE?vq^n< zM}_2iQB8Zdsj1I2%@DD3k^kM@ef#WXdJ4i>7P!bmJpZX~o_2Ixa019$fhtRI3I~35 zuhc6`pf>f-O1Mv0E#>r#AO;Ed9(orQnsNYa0G@zRCsM^pfaAuV(nWa*1}Zaj5)3sM zic=b*h(2S`{q+)Y9*I2FC&l`ka<8CgKv#rY8GX;EJ>wT!7gT>{u9yYI%%*~s@sII2 z$Hjucu>?L!@>Q!dI~1szb*%&R>3DsnL&*`fDENe9r|B3^oAB4g!k={MyPma;wx@?K zicb&y=SBEA4L|MaVXd;sO`@+uVgpUfQ_6+BtO%;HUR5v7&jCf;NJpQwrv3!!Yb@n5 zer=8?X<2r;LS>?9Q11C$wYjW%pK$lXFlW9SgE4mtw^#gXLb!>-uJ5S&f^Sp$l~-;N z_#T0ral#3E^)Y*efRUA6AB<f3D!f1#E#!qYZ9FLGeEhi>zU7zTKJ=oPjDr9$bBn(- zSuw_BcecCL#dz*L%F*=*RZuEh!d`I#kR>28Az(?O3De*n1_qYJq;7M#D`Y1(0$pgv zWF*rg5P_Eq+#|txI(HZBNfDZdGR*rRMLXmGyqHm8ayx?c=`s{9KA-+v3?ObOME|k` z1gQR024iIY#h12_HA=@9B2*U4#U(ttaa&ip9;BTs$qL`(NZ~3^Frq`{>=3a)^j6q~ z>_8jm4~}g6IrmX}hr*~Xl}oZk1^Le{cT<^!W5)8B&ek>m<v-U}-K5H8ARxGd9&o3j zTw#+T$rDZ~>C8~tQ{ZFr*F!(ikq&$=7r-na$(`VE>6#E?)#wm=O&;NEz9Zl<4345z zqX;}V#4}i-Sj>?~B|y$lTWb1C?q;+T)WsSu>I8e44@roxQKa<A7c?Dzd@2S9<d+?@ zU#IkOqHdVv*$|Y59pXm;y+@-rm;~%Dt}0NgZk=5@cS=}+K21Cu;*i*|5#!l>#qc;X zChUgEm*=!PwGVs#B!G$YDedl7$ZU`)fS2>?o<9h0!@Ej;$%Eo;Jj)Sn@0eP5!)qJ? z2|JysgSgYs#@8NK7`z;B=c}&TC||;Th3q^vg#tV2CVojs4P;d6V)SlO;af2D6uoKk zudsqKVG9?6xy!Q;r-S}d8mM0p4M#Ts8^Mi`$xXH!DC1#mf#=EFt%y3sqr6YY0OS&y zeWap36=12O25rc^r92qISBePi#E>g2wE~Q_4#Bu|Y_sebu;r+YWu}sA+&F8`2sKNf zb2mW(G?i{wYfQt~#!;lmI}rj81)hQ)Dx4Vgf2s~O03MUk%~g|wp`CGdZMj!)xQdQ> z4dpt+K~bO33d@gjP8*~27_z)*L}l@kCF=*7@Z=(E$3h0QC$N;M<MmK9cNbfax}M4u zmcYmn!yrr~=!JZpL#!}N6Q!@-YumPM+qP}nwr$(CZQHhO%=d36lj&veI-PXqRMmNo z_cbQ#nyg*Rnmc%1$atGNA*^@%FGWQ45hNm&-y}@pC(P|?>=>{*&|eY18kqb}u6|+| zKNmy0N@V$5FKnq;Tq+0Ho1s$=AJ=EzQ$($HVHMVjUW~tti~eeK8okNBgBFV^RU+>Y z8INCJBm8Thvp-EZspJ6+ZR|WF=%Mx&OfRHyK^=?!4}DgunuUzC-bV9JgdO^~t)$x| z9i+D*<oFpnU1)s@UG7Kad%iVo^8C~9ys;y}2Dd;@<`pwMUnI;=com^#`OJ5#F^TGA za9oQKMXQ}G=RA~rNgBTzWRS2;6k39?gy@idOCAY9#uB1`A0-ws;{9^YfVj#O{2XwR z2lVGL-I>e+J6vXQmzNN77?1q6?zd$ayDa{%U$9FU#E)XC29)T?%4bGP60r!faL`SD zVDFz@jkgD4+sdyt*^cBBv?G@-Fc@kyy#?@`et^|hRST%fI&+o4+3dxZX&K5*__=?P zTPvnqD4oIE=0$6J@oL^d-*O75nST!LHMs{K3I~#rIF;;tD=79zGMlb!fqieB;y_Uc zIo>mQL|>rJb2p&RhDq&B(HSfWGv`W><$F&-he7FKkhq>Sx^`8i)_T%~<v-9iEMj&& z+Ww8xdhmTIn-)|9mvt41%0jKyCnT){e63H!LFgp9Eo^Ro#z)E9yJr8peTtu{#>Sl6 zadb9>RIt6?Yx07eR0*mn6Litd5Oh0{of0tkTW9$y2+xH>5X2rto{-H!NvO`8q%P2- zW+PhE=kNTxmg;-K>+kR4Yq-2dUttPs`AmI|s*?<p#`6t}b#{@00-j*Jb^W#akMwcF zyU&+eEc5m>9X`?09xj8k$9@o8OKlw?v|4o9pMymF&_tC4Z%LdE{0j2S+j)HS46t6g z8_On%hF8dKSnW__`qmq?CRE?nt75_XOW_OZwRs#mM1a=yP3ACDbDPYAWJhNvo+B;g zr+6!+k6YFl7@nul=>!JS-9{qpWAO9Gu^IPO*MZoh4xBlqg%8w^y@Cn7A@DpeGoc~J ze^<{Me)kKkLplhcjBK1VtCCo0P$2##8~d`e1^PBS-93__nO3~n<ShoG$)TgI4fC&C z>7F*)!~@|>z3M8MV4ik*oB&?X+0PWz4d`(9;ve*j-~b1ABo-*N+ab@->AF>jqns}O ze(GnB`l0;)v3jUXB;#70Hf6c;${>)3RZ1(SYYAc%BdX617(tZxV8cW|l@B?OX!ee{ z3lqk*E!!EEwP0pHE$h+e(h|#Zp)6Hp%X~WFjyA8`a}HfzSAqZJ8X~O?TTr%X7jT0z z5OlAnF(7w}@6n(<?4f;^Lr%JB4J@^1XCnH@mD8Sd+h0}z%>TM>9_+Ei%)cBsc&HL! z_2GNBPH_v<@!ntIIi5Z@&7B5{7zs9xyq~)sSti!uHBg;z@|s8%I3(!#Jb<^scnG8| zrcYIQa*-ftI9Y7Aqh-j)GlxXPlC|3@)nw}`FXZ9MV`wGg(xyH8Otlov;C8`$^jhzC z!EudVz<}$6D$iT#*M4*#FpgXjYNah&#@4N8a;gIx;ASCAjNiYc`dxp^@1^ns!4%Y5 zXo3tv!@K)9g=FDW^tJ3y?`J<rHjPo(k}aj$ZK6pT9iNVzeIGi#dFwdA7LNX{p>xJW zZwYoEQo>`aQ~tFllB}A>NF8=DNFi2U6`Nw+@_nq6mtu6mW_Et9I;mg<bjanznhJ@m zFv(e1C+OE2Bum^)8DW|`5X@{~CN_aaM*UtJiNor#=Dh-f<5+`PA=GFG2b)#e2bK^| z;pwBDS>As3rP{FH27P$-&Ws`EO@CL6qkWW)C#(B&0tX&DD`tz$q@}B}nkLfRK#;xH zc8L3Hbd4ux#A#MjJs0EXV6AoalEi69x$gIK?$BFE1xw}XTlIlrL{D7U_Th9hbY?G^ zdH!=YWokh7{c@D3!k<8Jc55y68zwlLqYeo{+_h*&;&~sB67T(q_kxqkA%cC4hDag9 z#Z<81C-(3rv;OztZU{GKlEqW;G5=dW`X4C1#OLw+eIv>r&1Sdhmr$VIlJI>^j7-vw zRl1o^!O@4HeDH;;&3)yOCWzLUv{L6_xJn>JhdQZh&By2z-Ar5+W-7k2cs09b^O~Vq z2MLIDUw#ZY6P)wK+c6{xFGd4>donoB(OuErx+PC=6fM4gS>|InUc(W%JnM*%xON5E zgEApQa`}slY*3McElo3EdQzOaTl&L~r26)cw92=q@p7L{<E3e`a&@%P@`@}$rC>-k z`nJesoPhP8jqq=FV-|>vkGOH(3@%eKRCWRNeA5|ps{)V?_l=)#a5+bl*eSE%j9en^ zKo>(S`7=5WGWIrb&0`@O-jm*XEcBE`S?abC17hlXuFoU*3p;^XPHkwqsLVq{tu0oB z3TqvD39RB{y-`*D*o^f}Yha{HkQ$8S)_hIJWN5k_y9wxGa|LR84%K4KiZN1mf$5<y z`Wgb<wAW6&`(QQ{EPIi{u@{Z_1y05x4Xz1~zu<w|p*p%?UY$G4AuacUF0a7a#vpX; z_HC^({~s}8ht)^Hf7kXs32MPZoORqe_EPtY1^ZBcC->{>52wlgYNu`hdu=JXrdLy^ zl}U-*=z#IYD3c3=mv*l|?S`>R)_%1_40$4kg5HmV2gBHsAo(fD0wMZwgc@VkVXRj> z^eI{b(j15#P}5f7_Zo8y;gTwjCO9K9zi~I>WUt$Mo{?M%8w2<#yFlN=QrrsPCVAy! zGinGerFqQpx3X_HROm2rBaALn*&$ZGV}43%9_pB39=Rydhoa8Amoh`HZ_)Kr(?WEi zNj^$ozBVyRz&=U?;?EtJ7Sgk-BY_;N__s8^t;P4rOxT!1UgJ>?fYBLHy`NIhO9+3a zS1l@H-*(*orCGD}vYYunvQ?860!`^^?+v}D&hEx0Fv(XvQAnef_p)JBp92H=9lB+@ z=jWhgr>su@x|##0h_uE1opJle`jlFH^qL8n;r}-wr5{OoegwBY_Jvz94lR;9Q2|j3 zz9!=|=jH#ksbILR>osx1!<m`;%MZ5=tX{IEVm8%P@3{%44ZPUe58!A%{ofGn-{xl< z!-2xRCqcq9qzeEYEj-1owzWH%+Sbl@5@t=w>@2oE<1()7VyIt;8IAmP(Z;<DgM_&O z+tP;U-oTPpcgjDhegf2oyMMTRu8&v3;d9hoO4@@V$~xJWm}wxl(r=gu|Jfuvvr|{F zXI`35x^e1Q4x+h)Lx8sxW?(txmD+QF!Soy~ZEMsZ@L?!G;sa7Y#8sglaHiFO`K5Q+ z1KOa8Bzr<~JdRGLXU>h>-iiVKx}pr#)w*GjIn0GyjAiLH?44ASIU-aFNOX!BKd{JU z>}yY@Z|ik)iGlzT-<V03<Q!4-k;}Ynf#s(>wW9%8dn3uk%RNf7n(rs~SVTts-B}bz zK;4EMLeR>P(b54O!yCAurcc>tGwwwwad|wTYpsexI|IG<LMWQ6dUyZQHaVhCJ<MN~ zVUPt<U_5z?Vp%1H6nGIm#q1YVF0IV0ju(s@Pj~qfr{kS#DWqd%r!D8oa%!)%HWqk; z!tU~0_V$84s%nHBMoLj7U!+ngDK{lws!S`@Vku!iy1JO}u{1V9-oAHvC!EsQ*+`A- zJ*bFyAtOM*8Fm}b4+<haffRQ7ZeDJ^T26GW`pgV;S*z;Cy=V}UZkhCZ=%RoCJ9hVi zG`~W!-lDrcyJ0YJx3LlYh@G}h@wVld|Mq`fcI=5XSL{@O($`HpQfRKWQMR^0;wq9} zkt0x|*XWkn^iYzV%-R`=|5~&QrLo*dZA+}|{|o2FLYX=QhMe?!n3Y|Yg1E2$Qg`oO z#J;^r_?$4yr<L3H0<_#`NryaZh_1BuxVmD!F>INUbRKfG+Z>u`?6uaNl{1jCYdgm9 zymH;UGfF~|n^LDaNVIlsV|n!Wyt_WXdaeEX_1TV{PVi9-xObw{q>G_Q%@mAyMAZ=F z_-}ODG2skCsyvgC7?4AWqNTmk>Q(*lD$)7N+(~E60~bU(`Sge1Y{x$XkRM<-8gO?A z>)97#PG6jyh69?;f^u+tu<b_=Z}Mw#W!cDl2sJ{c9bF;o>EX&O%rI=Ku7lyopGvTz zsGPGC+1T$IpyO)P+2F-c6b(4yVbMP(h~c_kIa%P5<^uY7V7)}MFpc`t0h{}xfM=y@ z1&AI3l9h|q-+h22QodkQcyzC|w!xyE%1KAms>G%SGpKfRVbnQkyvJ2{t!uv91JW~I zthE3*0rw*$tk2*rB*c7er+3M2{z@?|>!p3lIB&#ecgN+vSH7V?G%0Dr>|Dhw%ukHR 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%0D;ZtZ`#b9BvPq8OU*U~!9;^UvAL#F> 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 K=|+1%B_jY@{LSV7 literal 0 HcmV?d00001 diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_CaptureZones.lua b/DCS_Kola/Operation_Polar_Shield/Moose_CaptureZones.lua index fe64c8a..38049bc 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_CaptureZones.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_CaptureZones.lua @@ -893,20 +893,30 @@ local ZoneColorVerificationScheduler = SCHEDULER:New( nil, function() end end -end, {}, 60, 120 ) -- Start after 60 seconds, repeat every 120 seconds (2 minutes) +end, {}, 60, 240 ) -- Start after 60 seconds, repeat every 240 seconds (4 minutes) --- Periodic tactical marker update system (every 1 minute) +-- Periodic tactical marker update system with change detection (every 3 minutes) +local __lastForceCountsByZone = {} local TacticalMarkerUpdateScheduler = SCHEDULER:New( nil, function() - log("[TACTICAL] Running periodic tactical marker update...") - - -- Update tactical markers for all zones + log("[TACTICAL] Running periodic tactical marker update (change-detected)...") + for i, zoneCapture in ipairs(zoneCaptureObjects) do if zoneCapture then - CreateTacticalInfoMarker(zoneCapture) + local zoneName = zoneNames and zoneNames[i] or (zoneCapture.GetZoneName and zoneCapture:GetZoneName()) or ("Zone " .. i) + local counts = GetZoneForceStrengths(zoneCapture) + local last = __lastForceCountsByZone[zoneName] + local changed = (not last) or (last.red ~= counts.red) or (last.blue ~= counts.blue) or (last.neutral ~= counts.neutral) + + if changed then + __lastForceCountsByZone[zoneName] = { red = counts.red, blue = counts.blue, neutral = counts.neutral } + CreateTacticalInfoMarker(zoneCapture) + else + -- unchanged: skip marker churn + end end end - -end, {}, 30, 60 ) -- Start after 30 seconds, repeat every 60 seconds (1 minute) + +end, {}, 30, 180 ) -- Start after 30 seconds, repeat every 180 seconds (3 minutes) -- Function to refresh all zone colors based on current ownership local function RefreshAllZoneColors() diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_FAC2MarkRecceZone.lua b/DCS_Kola/Operation_Polar_Shield/Moose_FAC2MarkRecceZone.lua index e86bc49..4ad1ef4 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_FAC2MarkRecceZone.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_FAC2MarkRecceZone.lua @@ -1,4 +1,4 @@ ---[[ +.--[[ Simple AFAC System v1.0 ======================== @@ -86,8 +86,8 @@ AFAC.Config = { mapMarkerDuration = 120, smokeInterval = 300, - -- Target update intervals - autoUpdateInterval = 1.0, + -- Target update intervals (throttled to reduce per-second scanning) + autoUpdateInterval = 2.5, manualScanRange = 18520, -- Debug mode @@ -962,10 +962,10 @@ timer.scheduleFunction( trigger.action.outText("Simple AFAC System v1.0 loaded successfully!", 10) AFAC.log("AFAC Script fully loaded and initialized") --- Test message every 30 seconds to verify script is running -function AFAC.heartbeat() - AFAC.log("AFAC System heartbeat - script is running") - timer.scheduleFunction(AFAC.heartbeat, nil, timer.getTime() + 30) -end - -timer.scheduleFunction(AFAC.heartbeat, nil, timer.getTime() + 30) \ No newline at end of file +-- Heartbeat disabled in production to avoid periodic UI/network churn +-- To re-enable for debugging, uncomment lines below: +-- function AFAC.heartbeat() +-- AFAC.log("AFAC System heartbeat - script is running") +-- timer.scheduleFunction(AFAC.heartbeat, nil, timer.getTime() + 30) +-- end +-- timer.scheduleFunction(AFAC.heartbeat, nil, timer.getTime() + 30) \ No newline at end of file diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_NavalGroup.lua b/DCS_Kola/Operation_Polar_Shield/Moose_NavalGroup.lua index b88171a..8a80d1a 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_NavalGroup.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_NavalGroup.lua @@ -31,6 +31,19 @@ local CVN_TACAN_Name = "CVN" -- put the 3-letter TACAN identifier you want to local CVN_RecoveryWindowTime = 20 -- time in minutes for how long recovery will be open, feel free to change the number +-- Simple per-event cooldown to limit chat/sound spam (reduces network/UI churn) +local __cvnLastMsg = {} +local function sendThrottled(key, cooldownSec, sendFn) + local now = timer.getTime() + local last = __cvnLastMsg[key] or 0 + if (now - last) >= (cooldownSec or 30) then + __cvnLastMsg[key] = now + local ok, err = pcall(sendFn) + if not ok then env.info("[CVN] sendThrottled error for key "..tostring(key)..": "..tostring(err)) end + end +end + + -- Functions to move ship to designated waypoint/zones local msgCVNPatrol = "Sending Carrier Group to Patrol Zone: " @@ -38,8 +51,10 @@ local msgCVNPatrol = "Sending Carrier Group to Patrol Zone: " function SetCVNPatrolZone(zoneNumber) if PatrolZones[zoneNumber] then SetCVNActivePatrolZone = zoneNumber - MESSAGE:New(msgCVNPatrol .. SetCVNActivePatrolZone .. " (Waypoints " .. PatrolZones[zoneNumber].startWP .. "-" .. PatrolZones[zoneNumber].endWP .. ")", msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_SetPatrolZone", 30, function() + MESSAGE:New(msgCVNPatrol .. SetCVNActivePatrolZone .. " (Waypoints " .. PatrolZones[zoneNumber].startWP .. "-" .. PatrolZones[zoneNumber].endWP .. ")", msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) BlueCVNGroup:GotoWaypoint(PatrolZones[zoneNumber].startWP) else MESSAGE:New("Invalid patrol zone: " .. zoneNumber, msgTime):ToBlue() @@ -93,8 +108,10 @@ function start_recovery() if BlueCVNGroup:IsSteamingIntoWind() == true then local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" - MESSAGE:New(unitName .. " is currently launching/recovering aircraft, currently active recovery window closes at time " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_RecoveryActive", 60, function() + MESSAGE:New(unitName .. " is currently launching/recovering aircraft, currently active recovery window closes at time " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) else local timenow=timer.getAbsTime( ) local timeend=timenow+CVN_RecoveryWindowTime*60 -- this sets the recovery window to 45 minutes, you can change the numbers as you wish @@ -102,8 +119,10 @@ function start_recovery() timerecovery_end = UTILS.SecondsToClock(timeend,true) BlueCVNGroup:AddTurnIntoWind(timerecovery_start,timerecovery_end,25,true,-9) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" - MESSAGE:New(unitName.." is turning into the wind to begin " .. CVN_RecoveryWindowTime .. " mins of aircraft operations.\nLaunch/Recovery Window will be open from time " .. timerecovery_start .. " until " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_RecoveryStart", 60, function() + MESSAGE:New(unitName.." is turning into the wind to begin " .. CVN_RecoveryWindowTime .. " mins of aircraft operations.\nLaunch/Recovery Window will be open from time " .. timerecovery_start .. " until " .. timerecovery_end, msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) end end @@ -135,8 +154,10 @@ end function ResetAwacs() if BlueAwacs then BlueAwacs:Destroy() - MESSAGE:New("Resetting AWACS...", msgTime, "CVNNAVINFO",false):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_ResetAWACS", 30, function() + MESSAGE:New("Resetting AWACS...", msgTime, "CVNNAVINFO",false):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) else MESSAGE:New("No AWACS to reset - AWACS functionality not available", msgTime):ToBlue() end @@ -193,8 +214,10 @@ function BlueCVNGroup:OnAfterPassingWaypoint(From, Event, To, Waypoint) -- Debug info. local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=string.format(unitName.." passed waypoint ID=%d (Index=%d) %d times", waypoint.uid, BlueCVNGroup:GetWaypointIndex(waypoint.uid), waypoint.npassed) - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_PassingWaypoint", 20, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) -- Dynamic patrol logic based on current patrol zone @@ -206,13 +229,13 @@ function BlueCVNGroup:OnAfterPassingWaypoint(From, Event, To, Waypoint) if currentWaypointID == currentZone.endWP then BlueCVNGroup:GotoWaypoint(currentZone.startWP) local patrolText = string.format("Patrolling: Going to waypoint %d (Zone %d)", currentZone.startWP, SetCVNActivePatrolZone) - MESSAGE:New(patrolText, msgTime):ToBlue() + sendThrottled("CVN_PatrolGoto", 10, function() MESSAGE:New(patrolText, msgTime):ToBlue() end) env.info(patrolText) -- If we reached the start waypoint of current patrol zone, go to end waypoint elseif currentWaypointID == currentZone.startWP then BlueCVNGroup:GotoWaypoint(currentZone.endWP) local patrolText = string.format("Patrolling: Going to waypoint %d (Zone %d)", currentZone.endWP, SetCVNActivePatrolZone) - MESSAGE:New(patrolText, msgTime):ToBlue() + sendThrottled("CVN_PatrolGoto", 10, function() MESSAGE:New(patrolText, msgTime):ToBlue() end) env.info(patrolText) end end @@ -223,8 +246,10 @@ end function BlueCVNGroup:OnAfterCruise(From, Event, To) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=unitName.." is cruising straight and steady." - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_Cruise", 30, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) end @@ -232,8 +257,10 @@ end function BlueCVNGroup:OnAfterTurningStarted(From, Event, To) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=unitName.." has started turning!" - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_TurningStarted", 30, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) end @@ -241,8 +268,10 @@ end function BlueCVNGroup:OnAfterTurningStopped(From, Event, To) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=unitName.." has stopped turning..proceeding to next waypoint." - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_TurningStopped", 30, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) end @@ -262,8 +291,10 @@ BlueCVNGroup:SetCheckZones(ZoneSet) function BlueCVNGroup:OnAfterEnterZone(From, Event, To, Zone) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=string.format(unitName.." has entered patrol zone %s.", Zone:GetName()) - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_EnterZone", 20, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) end @@ -271,7 +302,9 @@ end function BlueCVNGroup:OnAfterLeaveZone(From, Event, To, Zone) local unitName = CVN_beacon_unit and CVN_beacon_unit:GetName() or "CVN-72 Abraham Lincoln" local text=string.format(unitName.." left patrol zone %s.", Zone:GetName()) - MESSAGE:New(text, msgTime):ToBlue() - USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + sendThrottled("CVN_LeaveZone", 20, function() + MESSAGE:New(text, msgTime):ToBlue() + USERSOUND:New("ping.ogg"):ToCoalition(coalition.side.BLUE) + end) env.info(text) end \ No newline at end of file diff --git a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua index 64f2d33..eae8de1 100644 --- a/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua +++ b/DCS_Kola/Operation_Polar_Shield/Moose_TADC_CargoDispatcher.lua @@ -19,6 +19,13 @@ REQUIRES: ═══════════════════════════════════════════════════════════════════════════════ ]] +-- Single-run guard to prevent duplicate dispatcher loops if script is reloaded +if _G.__TDAC_DISPATCHER_RUNNING then + env.info("[TDAC] CargoDispatcher already running; aborting duplicate load") + return +end +_G.__TDAC_DISPATCHER_RUNNING = true + --[[ GLOBAL STATE AND CONFIGURATION -------------------------------------------------------------------------- diff --git a/DCS_Kola/Operation_Polar_Shield/OnBirthMessage.lua b/DCS_Kola/Operation_Polar_Shield/OnBirthMessage.lua index b5f0b75..b296f00 100644 --- a/DCS_Kola/Operation_Polar_Shield/OnBirthMessage.lua +++ b/DCS_Kola/Operation_Polar_Shield/OnBirthMessage.lua @@ -5,6 +5,7 @@ trigger.action.outText("OnBirthMessage script is loading...", 10) -- Player preferences storage local playerWelcomeSettings = {} local processedPlayers = {} -- Track players to prevent double processing +local DUP_TTL_SECONDS = 10 -- window to ignore duplicate events for the same player -- F10 Menu Functions local function enableWelcomeMessage(playerUnitID, playerName) @@ -77,19 +78,20 @@ function onPlayerJoin:onEvent(event) if (event.id == world.event.S_EVENT_BIRTH or event.id == world.event.S_EVENT_ENGINE_STARTUP) then env.info("OnBirthMessage: Correct event type detected") - if event.initiator then + if event.initiator then env.info("OnBirthMessage: Initiator exists") local playerName = event.initiator:getPlayerName() if playerName then env.info("OnBirthMessage: Player name found: " .. playerName) - -- Check if we've already processed this player to prevent doubles - local playerKey = playerName .. "_" .. event.id - if processedPlayers[playerKey] then - env.info("OnBirthMessage: Already processed " .. playerName .. " for event " .. event.id .. " - skipping") + -- Check if we've already processed this player to prevent doubles (within TTL) + local now = (event.time or timer.getTime()) + local last = processedPlayers[playerName] + if last and (now - last) < DUP_TTL_SECONDS then + env.info("OnBirthMessage: Duplicate event for " .. playerName .. " within TTL - skipping") return end - processedPlayers[playerKey] = true + processedPlayers[playerName] = now -- Add error handling to prevent script crashes local success, errorMsg = pcall(function() diff --git a/Moose_.lua b/Moose_.lua index 8bbc66d..6063473 100644 --- a/Moose_.lua +++ b/Moose_.lua @@ -1,4 +1,4 @@ -env.info('*** MOOSE GITHUB Commit Hash ID: 2025-10-26T07:31:50+01:00-1965e24860936512d2670eb7d41c8440707a12ff ***') +env.info('*** MOOSE GITHUB Commit Hash ID: 2025-11-03T06:30:00+01:00-4ade4c78bab6bc82e93a604b4a1838872cd5daa9 ***') if not MOOSE_DEVELOPMENT_FOLDER then MOOSE_DEVELOPMENT_FOLDER='Scripts' end @@ -3986,7 +3986,7 @@ for id,gridpoint in ipairs(Grid)do local UnitTemplate=UTILS.DeepCopy(unitData) UnitTemplate.x=gridpoint.x UnitTemplate.y=gridpoint.y -UnitTemplate.name=Name.."-"..id +if id>1 then UnitTemplate.name=Name.."-"..id end table.insert(groupData.units,UnitTemplate) if id==1 then groupData.x=gridpoint.x @@ -14784,8 +14784,7 @@ end return self end function SET_CLIENT:HandleCASlots() -self:HandleEvent(EVENTS.PlayerEnterUnit,SET_CLIENT._EventPlayerEnterUnit) -self:HandleEvent(EVENTS.PlayerLeaveUnit,SET_CLIENT._EventPlayerLeaveUnit) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventPlayerEnterUnit) self:FilterFunction(function(client)if client and client:IsAlive()and client:IsGround()then return true else return false end end) return self end @@ -17752,6 +17751,7 @@ local AirbaseCategory=airbase:GetAirbaseCategory() if AirbaseCategory==Airbase.Category.SHIP or AirbaseCategory==Airbase.Category.HELIPAD then RoutePoint.linkUnit=AirbaseID RoutePoint.helipadId=AirbaseID +RoutePoint.airdromeId=airbase:IsAirdrome()and AirbaseID or nil elseif AirbaseCategory==Airbase.Category.AIRDROME then RoutePoint.airdromeId=AirbaseID else @@ -24080,6 +24080,7 @@ POSITIONABLE.CargoBayCapacityValues={ ["HL_DSHK"]=6*POSITIONABLE.DefaultInfantryWeight, ["CCKW_353"]=16*POSITIONABLE.DefaultInfantryWeight, ["MaxxPro_MRAP"]=7*POSITIONABLE.DefaultInfantryWeight, +["Sd_Kfz_251"]=10*POSITIONABLE.DefaultInfantryWeight, } } function POSITIONABLE:SetCargoBayWeightLimit(WeightLimit) @@ -35460,8 +35461,8 @@ self:SetScoringMenu(PlayerUnit:GetGroup()) end end) self.AutoSavePath=SavePath -self.AutoSave=AutoSave or true -if self.AutoSave==true then +self.AutoSave=(AutoSave==nil or AutoSave==true)and true or false +if self.AutoSavePath and self.AutoSave==true then self:OpenCSV(GameName) end return self @@ -62991,13 +62992,13 @@ aoa.OnSpeedMin=self:_AoAUnit2Deg(playerData,14.0) aoa.Fast=self:_AoAUnit2Deg(playerData,13.5) aoa.FAST=self:_AoAUnit2Deg(playerData,12.5) elseif goshawk then -aoa.SLOW=8.00 -aoa.Slow=7.75 -aoa.OnSpeedMax=7.25 -aoa.OnSpeed=7.00 -aoa.OnSpeedMin=6.75 -aoa.Fast=6.25 -aoa.FAST=6.00 +aoa.SLOW=9.5 +aoa.Slow=9.25 +aoa.OnSpeedMax=9.0 +aoa.OnSpeed=8.5 +aoa.OnSpeedMin=8.25 +aoa.Fast=7.75 +aoa.FAST=5.5 elseif skyhawk then aoa.SLOW=10.50 aoa.Slow=9.50 @@ -64300,7 +64301,12 @@ if playerData then local unit=playerData.unit if unit and unit:IsAlive()then if unit:IsInZone(self.zoneCCA)then -if playerData.step==AIRBOSS.PatternStep.WAKE then +local hornet=playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER +local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B +if playerData.step==AIRBOSS.PatternStep.WAKE and hornet then if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then playerData.wrappedUpAtWakeLittle=true elseif math.abs(playerData.unit:GetRoll())>40 and math.abs(playerData.unit:GetRoll())<=45 then @@ -64322,6 +64328,28 @@ playerData.AFU=true else end end +if playerData.step==AIRBOSS.PatternStep.WAKE and tomcat then +if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then +playerData.wrappedUpAtWakeLittle=true +elseif math.abs(playerData.unit:GetRoll())>40 and math.abs(playerData.unit:GetRoll())<=45 then +playerData.wrappedUpAtWakeFull=true +elseif math.abs(playerData.unit:GetRoll())>45 then +playerData.wrappedUpAtWakeUnderline=true +elseif math.abs(playerData.unit:GetRoll())<12 and math.abs(playerData.unit:GetRoll())>=5 then +playerData.AAatWakeLittle=true +elseif math.abs(playerData.unit:GetRoll())<5 and math.abs(playerData.unit:GetRoll())>=2 then +playerData.AAatWakeFull=true +elseif math.abs(playerData.unit:GetRoll())<2 then +playerData.AAatWakeUnderline=true +else +end +if math.abs(playerData.unit:GetAoA())>=15 then +playerData.AFU=true +elseif math.abs(playerData.unit:GetAoA())<=5 then +playerData.AFU=true +else +end +end if playerData.attitudemonitor then self:_AttitudeMonitor(playerData) end @@ -73462,6 +73490,7 @@ self.usesubcats=false self.subcats={} self.subcatsTroop={} self.showstockinmenuitems=false +self.maxCrateMenuQuantity=5 self.onestepmenu=false self.nobuildinloadzones=true self.movecratesbeforebuild=true @@ -73614,6 +73643,7 @@ self.Loaded_Cargo[unitname]=loaded local Group=client:GetGroup() self:_SendMessage(string.format("Crate %s loaded by ground crew!",event.IniDynamicCargoName),10,false,Group) self:__CratesPickedUp(1,Group,client,dcargo) +self:_RefreshCrateQuantityMenus(Group,client,nil) end elseif event.id==EVENTS.DynamicCargoUnloaded then self:T(self.lid.."GC Unload Event "..event.IniDynamicCargoName) @@ -73650,6 +73680,7 @@ end local Group=client:GetGroup() self:_SendMessage(string.format("Crate %s unloaded by ground crew!",event.IniDynamicCargoName),10,false,Group) self:__CratesDropped(1,Group,client,{dcargo}) +self:_RefreshCrateQuantityMenus(Group,client,nil) end elseif event.id==EVENTS.DynamicCargoRemoved then self:T(self.lid.."GC Remove Event "..event.IniDynamicCargoName) @@ -73833,6 +73864,7 @@ self:_RefreshDropTroopsMenu(Group,Unit) self:__TroopsPickedUp(1,Group,Unit,Cargotype) self:_UpdateUnitCargoMass(Unit) Cargotype:RemoveStock() +self:_RefreshTroopQuantityMenus(Group,Unit,Cargotype) end return self end @@ -74057,14 +74089,189 @@ end self:CleanDroppedTroops() return self end -function CTLD:_GetCrates(Group,Unit,Cargo,number,drop,pack) +function CTLD:_LoadTroopsQuantity(Group,Unit,Cargo,quantity) +local n=math.max(1,tonumber(quantity)or 1) +local prevSuppress=self.suppressmessages +self.suppressmessages=true +for i=1,n do +timer.scheduleFunction(function()self:_LoadTroops(Group,Unit,Cargo,true)end,{},timer.getTime()+0.2*i) +end +timer.scheduleFunction(function() +self.suppressmessages=prevSuppress +local dname=Cargo:GetName() +self:_SendMessage(string.format("Loaded %d %s.",n,dname),10,false,Group) +end,{},timer.getTime()+0.2*n+0.05) +return self +end +function CTLD:_AddTroopQuantityMenus(Group,Unit,parentMenu,cargoObj) +local stock=cargoObj:GetStock() +local maxQuantity=self.maxCrateMenuQuantity or 1 +if type(stock)=="number"and stock>=0 and stock<maxQuantity then maxQuantity=stock end +maxQuantity=math.floor(maxQuantity) +if maxQuantity<1 then maxQuantity=1 end +local caps=self:_GetUnitCapabilities(Unit) +local trooplimit=caps and caps.trooplimit or 0 +local troopsize=cargoObj:GetCratesNeeded()or 1 +if troopsize<1 then troopsize=1 end +local ld=self.Loaded_Cargo and self.Loaded_Cargo[Unit:GetName()]or nil +local onboard=(ld and type(ld.Troopsloaded)=="number")and ld.Troopsloaded or 0 +if trooplimit>0 then +local space=trooplimit-onboard +if space<troopsize then +local msg="Troop limit reached" +if type(stock)=="number"and stock==0 then msg="Out of stock"end +MENU_GROUP_COMMAND:New(Group,msg,parentMenu,function()end) +return self +end +local capacitySets=math.floor(space/troopsize) +if capacitySets<maxQuantity then maxQuantity=capacitySets end +end +for quantity=1,maxQuantity do +local m=MENU_GROUP:New(Group,tostring(quantity),parentMenu) +if quantity==1 then +MENU_GROUP_COMMAND:New(Group,"Load",m,self._LoadTroops,self,Group,Unit,cargoObj) +else +MENU_GROUP_COMMAND:New(Group,"Load",m,self._LoadTroopsQuantity,self,Group,Unit,cargoObj,quantity) +end +end +return self +end +function CTLD:_GetCrateQuantity(Group,Unit,cargoObj,quantity) +local needed=cargoObj and cargoObj:GetCratesNeeded()or 1 +local count=math.max(1,tonumber(quantity)or 1) +local total=needed*count +self:_GetCrates(Group,Unit,cargoObj,total,false,false,true) +return self +end +function CTLD:_AddCrateQuantityMenus(Group,Unit,parentMenu,cargoObj,stockSummary) +local needed=cargoObj:GetCratesNeeded()or 1 +local stockEntry=self:_GetCrateStockEntry(cargoObj,stockSummary) +local stock=nil +if stockEntry and type(stockEntry.Stock)=="number"then +stock=stockEntry.Stock +else +stock=cargoObj:GetStock() +end +local maxQuantity=self.maxCrateMenuQuantity or 1 +local availableSets=nil +if type(stock)=="number"and stock>=0 then +availableSets=math.floor(stock) +if availableSets<=0 then +MENU_GROUP_COMMAND:New(Group,"Out of stock",parentMenu,function()end) +return self +end +if availableSets<maxQuantity then +maxQuantity=availableSets +end +end +maxQuantity=math.floor(maxQuantity) +if maxQuantity<1 then +return self +end +local capacitySets=nil +if Unit then +local capabilities=self:_GetUnitCapabilities(Unit) +local capacity=capabilities and capabilities.cratelimit or 0 +if capacity>0 then +local loadedData=nil +if self.Loaded_Cargo then +loadedData=self.Loaded_Cargo[Unit:GetName()] +end +local loadedCount=0 +if loadedData and type(loadedData.Cratesloaded)=="number"then +loadedCount=loadedData.Cratesloaded +end +local space=capacity-loadedCount +if space<0 then +space=0 +end +local perSet=needed>0 and needed or 1 +capacitySets=math.floor(space/perSet) +end +end +local allowLoad=true +if type(capacitySets)=="number"then +if capacitySets>=1 then +if capacitySets<maxQuantity then +maxQuantity=capacitySets +end +else +allowLoad=false +maxQuantity=1 +end +end +local maxMassSets=nil +if Unit then +local maxload=self:_GetMaxLoadableMass(Unit) +local perCrateMass=(cargoObj.GetMass and cargoObj:GetMass())or cargoObj.PerCrateMass or 0 +local setMass=perCrateMass*(needed>0 and needed or 1) +if type(maxload)=="number"and maxload>0 and setMass>0 then +maxMassSets=math.floor(maxload/setMass) +if maxMassSets<1 then +maxQuantity=1 +allowLoad=false +elseif maxMassSets<maxQuantity then +maxQuantity=maxMassSets +end +end +end +if maxQuantity<1 then +return self +end +if maxQuantity==1 then +MENU_GROUP_COMMAND:New(Group,"Get",parentMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,1) +local canLoad=(allowLoad and(not capacitySets or capacitySets>=1)and(not maxMassSets or maxMassSets>=1)) +if canLoad then +MENU_GROUP_COMMAND:New(Group,"Get and Load",parentMenu,self._GetAndLoad,self,Group,Unit,cargoObj,1) +else +local msg +if maxMassSets and(not capacitySets or capacitySets>=1)and maxMassSets<1 then +msg="Weight limit reached" +else +msg="Crate limit reached" +end +MENU_GROUP_COMMAND:New(Group,msg,parentMenu,self._SendMessage,self,msg,10,false,Group) +end +return self +end +for quantity=1,maxQuantity do +local label=tostring(quantity) +local qMenu=MENU_GROUP:New(Group,label,parentMenu) +MENU_GROUP_COMMAND:New(Group,"Get",qMenu,self._GetCrateQuantity,self,Group,Unit,cargoObj,quantity) +local canLoad=(allowLoad and(not capacitySets or capacitySets>=quantity)and(not maxMassSets or maxMassSets>=quantity)) +if canLoad then +MENU_GROUP_COMMAND:New(Group,"Get and Load",qMenu,self._GetAndLoad,self,Group,Unit,cargoObj,quantity) +else +local msg +if maxMassSets and(not capacitySets or capacitySets>=quantity)and maxMassSets<quantity then +msg="Weight limit reached" +else +msg="Crate limit reached" +end +MENU_GROUP_COMMAND:New(Group,msg,qMenu,self._SendMessage,self,msg,10,false,Group) +end +end +return self +end +function CTLD:_GetCrates(Group,Unit,Cargo,number,drop,pack,quiet) self:T(self.lid.." _GetCrates") +local perSet=Cargo:GetCratesNeeded()or 1 +if perSet<1 then perSet=1 end +local requestNumber=tonumber(number) +if requestNumber then +requestNumber=math.floor(requestNumber) +if requestNumber<1 then requestNumber=perSet end +else +requestNumber=perSet +end +local requestedSets=math.floor((requestNumber+perSet-1)/perSet) +if requestedSets<1 then requestedSets=1 end if not drop and not pack then local cgoname=Cargo:GetName() local instock=Cargo:GetStock() if type(instock)=="number"and tonumber(instock)<=0 and tonumber(instock)~=-1 then self:_SendMessage(string.format("Sorry, we ran out of %s",cgoname),10,false,Group) -return self +return false end end local inzone=false @@ -74107,13 +74314,13 @@ local loaddist=self.CrateDistance or 35 local nearcrates,numbernearby=self:_FindCratesNearby(Group,Unit,loaddist,true,true) if numbernearby>=canloadcratesno and not drop then self:_SendMessage("There are enough crates nearby already! Take care of those first!",10,false,Group) -return self +return false end local IsHerc=self:IsFixedWing(Unit) local IsHook=self:IsHook(Unit) local IsTruck=Unit:IsGround() local cargotype=Cargo -local number=number or cargotype:GetCratesNeeded() +local number=requestNumber local cratesneeded=cargotype:GetCratesNeeded() local cratename=cargotype:GetName() local cratetemplate="Container" @@ -74217,8 +74424,8 @@ if drop then realcargo=CTLD_CARGO:New(self.CargoCounter,cratename,templ,sorte,true,false,cratesneeded,self.Spawned_Crates[self.CrateCounter],true,cargotype.PerCrateMass,nil,subcat) local map=cargotype:GetStaticResourceMap() realcargo:SetStaticResourceMap(map) -local CCat,CType,CShape=cargotype:GetStaticTypeAndShape() -realcargo:SetStaticTypeAndShape(CCat,CType,CShape) +local CCat3,CType3,CShape3=cargotype:GetStaticTypeAndShape() +realcargo:SetStaticTypeAndShape(CCat3,CType3,CShape3) if cargotype.TypeNames then realcargo.TypeNames=UTILS.DeepCopy(cargotype.TypeNames) end @@ -74231,22 +74438,25 @@ if cargotype.TypeNames then realcargo.TypeNames=UTILS.DeepCopy(cargotype.TypeNames) end end -local CCat,CType,CShape=cargotype:GetStaticTypeAndShape() -realcargo:SetStaticTypeAndShape(CCat,CType,CShape) +local CCat4,CType4,CShape4=cargotype:GetStaticTypeAndShape() +realcargo:SetStaticTypeAndShape(CCat4,CType4,CShape4) table.insert(self.Spawned_Cargo,realcargo) end if not(drop or pack)then -Cargo:RemoveStock() +Cargo:RemoveStock(requestedSets) +self:_RefreshCrateQuantityMenus(Group,Unit,Cargo) end local text=string.format("Crates for %s have been positioned near you!",cratename) if drop then text=string.format("Crates for %s have been dropped!",cratename) self:__CratesDropped(1,Group,Unit,droppedcargo) else +if not quiet then self:_SendMessage(text,10,false,Group) end +end self:_RefreshLoadCratesMenu(Group,Unit) -return self +return true end function CTLD:InjectStatics(Zone,Cargo,RandomCoord,FromLoad) self:T(self.lid.." InjectStatics") @@ -74367,7 +74577,15 @@ text:Add(" N O N E") end text:Add("------------------------------------------------------------") self:_SendMessage(text:Text(),30,true,_group) -self:_CleanupTrackedCrates(removedIDs) +local done={} +for _,e in pairs(crates)do +local n=e:GetName()or"none" +if not done[n]then +local object=self:_FindCratesCargoObject(n) +if object then self:_RefreshCrateQuantityMenus(_group,_unit,object)end +done[n]=true +end +end self:_RefreshLoadCratesMenu(_group,_unit) else self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) @@ -74540,6 +74758,7 @@ self:_RefreshDropCratesMenu(Group,Unit) self:_RefreshLoadCratesMenu(Group,Unit) self:_CleanupTrackedCrates(crateidsloaded) self:__CratesPickedUp(1,Group,Unit,loaded.Cargo) +self:_RefreshCrateQuantityMenus(Group,Unit,nil) end end return self @@ -74903,7 +75122,10 @@ local gentroops=self.Cargo_Troops for _id,_troop in pairs(gentroops)do if _troop.Name==name then local stock=_troop:GetStock() -if stock and tonumber(stock)>=0 then _troop:AddStock()end +if stock and tonumber(stock)>=0 then +_troop:AddStock() +self:_RefreshTroopQuantityMenus(Group,Unit,_troop) +end end end end @@ -74913,6 +75135,7 @@ self.Loaded_Cargo[unitname]=nil self.Loaded_Cargo[unitname]=loaded self:_RefreshDropTroopsMenu(Group,Unit) self:_UpdateUnitCargoMass(Unit) +self:_RefreshTroopQuantityMenus(Group,Unit,nil) else if IsHerc then self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) @@ -75001,6 +75224,7 @@ self.Loaded_Cargo[unitname]=nil self.Loaded_Cargo[unitname]=loaded self:_UpdateUnitCargoMass(Unit) self:_RefreshDropCratesMenu(Group,Unit) +self:_RefreshCrateQuantityMenus(Group,Unit,nil) else if IsHerc then self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) @@ -75347,13 +75571,40 @@ end timer.scheduleFunction(function()self:_RemoveCratesNearby(Group,Unit)end,{},timer.getTime()+1) return self end -function CTLD:_GetAndLoad(Group,Unit,cargoObj) +function CTLD:_GetAndLoad(Group,Unit,cargoObj,quantity) if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) return self end -self:_GetCrates(Group,Unit,cargoObj) -timer.scheduleFunction(function()self:_LoadSingleCrateSet(Group,Unit,cargoObj.Name)end,{},timer.getTime()+1) +local needed=cargoObj and cargoObj:GetCratesNeeded()or 1 +local count=math.max(1,tonumber(quantity)or 1) +local capacitySets=nil +local cap=self:_GetUnitCapabilities(Unit) +local limit=cap and cap.cratelimit or 0 +if limit>0 then +local ld=self.Loaded_Cargo and self.Loaded_Cargo[Unit:GetName()]or nil +local loaded=(ld and type(ld.Cratesloaded)=="number")and ld.Cratesloaded or 0 +local space=limit-loaded +if space<0 then space=0 end +local perSet=needed>0 and needed or 1 +capacitySets=math.floor(space/perSet) +if capacitySets<1 then +self:_SendMessage("No capacity to load more now!",10,false,Group) +return self +end +if count>capacitySets then count=capacitySets end +end +local total=needed*count +local ok=self:_GetCrates(Group,Unit,cargoObj,total,false,false,true) +if ok then +local uname=Unit:GetName() +self._batchCrateLoad=self._batchCrateLoad or{} +self._batchCrateLoad[uname]={remaining=count,group=Group,cname=cargoObj.Name,loaded=0,partials=0} +for i=1,count do +timer.scheduleFunction(function()self:_LoadSingleCrateSet(Group,Unit,cargoObj.Name)end,{},timer.getTime()+0.2*i) +end +end +return self end function CTLD:_GetAllAndLoad(Group,Unit) if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then @@ -75362,6 +75613,236 @@ return self end timer.scheduleFunction(function()self:_LoadCratesNearby(Group,Unit)end,{},timer.getTime()+1) end +function CTLD:_GetCrateStockEntry(cargoObj,stockSummary) +if not cargoObj or not stockSummary then +return nil +end +local name=cargoObj:GetName() +if not name then +return nil +end +return stockSummary[name] +end +function CTLD:_FormatCrateStockSuffix(cargoObj,stockSummary) +if not cargoObj then +return nil +end +local stockEntry=self:_GetCrateStockEntry(cargoObj,stockSummary) +local available=nil +if stockEntry and type(stockEntry.Stock)=="number"then +available=stockEntry.Stock +end +if type(available)~="number"then +local direct=cargoObj:GetStock() +if type(direct)=="number"then +available=direct +end +end +if type(available)~="number"or available<0 then +return nil +end +local rounded=math.floor(available+0.5) +local total=nil +if stockEntry and type(stockEntry.Stock0)=="number"and stockEntry.Stock0>=0 then +total=math.floor(stockEntry.Stock0+0.5) +elseif stockEntry and type(stockEntry.Sum)=="number"and stockEntry.Sum>=0 then +total=math.floor(stockEntry.Sum+0.5) +end +if type(total)~="number"then +local baseTotal=cargoObj.GetStock0 and cargoObj:GetStock0()or nil +if type(baseTotal)=="number"and baseTotal>=0 then +total=math.floor(baseTotal+0.5) +end +end +if type(total)=="number"and total>0 and total~=rounded then +return string.format("[%d/%d]",rounded,total) +else +return string.format("[%d]",rounded) +end +end +function CTLD:_RefreshCrateQuantityMenus(Group,Unit,CargoObj) +if not Group and Unit then Group=Unit:GetGroup()end +if Group and Unit then +local uname=Unit:GetName()or"none" +self._qtySnap=self._qtySnap or{} +self._qtySnap[uname]=self._qtySnap[uname]or{} +if Group.CTLD_CrateMenus then +local present={} +for item,_ in pairs(Group.CTLD_CrateMenus)do present["C:"..tostring(item)]=true end +for key,_ in pairs(self._qtySnap[uname])do +if string.sub(key,1,2)=="C:"and not present[key]then +self._qtySnap[uname][key]=nil +end +end +local stockSummary=self.showstockinmenuitems and self:_CountStockPlusInHeloPlusAliveGroups(false)or nil +for item,menu in pairs(Group.CTLD_CrateMenus)do +menu:RemoveSubMenus() +local obj=self:_FindCratesCargoObject(item) +if obj then self:_AddCrateQuantityMenus(Group,Unit,menu,obj,stockSummary)end +end +end +end +if CargoObj and Group and Unit then +local uname=Unit:GetName()or"none" +local cap=(self:_GetUnitCapabilities(Unit).cratelimit or 0) +local loaded=(self.Loaded_Cargo[uname]and self.Loaded_Cargo[uname].Cratesloaded)or 0 +local avail=math.max(0,cap-loaded) +local per=CargoObj:GetCratesNeeded()or 1 +if per<1 then per=1 end +local unitAvail=math.max(0,math.min(self.maxCrateMenuQuantity or 1,math.floor(avail/per))) +local s=CargoObj:GetStock() +self._qtySnap=self._qtySnap or{} +self._qtySnap[uname]=self._qtySnap[uname]or{} +local k="C:"..(CargoObj:GetName()or"none") +local snap=tostring(type(s)=="number"and s or-1)..":"..tostring(unitAvail) +if self._qtySnap[uname][k]~=snap then +self._qtySnap[uname][k]=snap +if type(s)=="number"and s>=0 and s<unitAvail then +self:_RefreshQuantityMenusForGroup(Group,Unit) +end +end +end +return self +end +function CTLD:_RefreshTroopQuantityMenus(Group,Unit,CargoObj) +if not Group and Unit then Group=Unit:GetGroup()end +if Group and Unit then +local uname=Unit:GetName()or"none" +self._qtySnap=self._qtySnap or{} +self._qtySnap[uname]=self._qtySnap[uname]or{} +if Group.CTLD_TroopMenus then +local present={} +for item,_ in pairs(Group.CTLD_TroopMenus)do present["T:"..tostring(item)]=true end +for key,_ in pairs(self._qtySnap[uname])do +if string.sub(key,1,2)=="T:"and not present[key]then +self._qtySnap[uname][key]=nil +end +end +for item,menu in pairs(Group.CTLD_TroopMenus)do +menu:RemoveSubMenus() +local obj=self:_FindTroopsCargoObject(item) +if obj then self:_AddTroopQuantityMenus(Group,Unit,menu,obj)end +end +end +end +if CargoObj and Group and Unit then +local uname=Unit:GetName()or"none" +local cap=(self:_GetUnitCapabilities(Unit).trooplimit or 0) +local loaded=(self.Loaded_Cargo[uname]and self.Loaded_Cargo[uname].Troopsloaded)or 0 +local avail=math.max(0,cap-loaded) +local per=CargoObj:GetCratesNeeded()or 1 +if per<1 then per=1 end +local unitAvail=math.max(0,math.min(self.maxCrateMenuQuantity or 1,math.floor(avail/per))) +local s=CargoObj:GetStock() +self._qtySnap=self._qtySnap or{} +self._qtySnap[uname]=self._qtySnap[uname]or{} +local k="T:"..(CargoObj:GetName()or"none") +local snap=tostring(type(s)=="number"and s or-1)..":"..tostring(unitAvail) +if self._qtySnap[uname][k]~=snap then +self._qtySnap[uname][k]=snap +if type(s)=="number"and s>=0 and s<unitAvail then +self:_RefreshQuantityMenusForGroup(Group,Unit) +end +end +end +return self +end +function CTLD:_RefreshQuantityMenusForGroup(_group,_unit) +if _group and _unit then +local stockSummary=self.showstockinmenuitems and self:_CountStockPlusInHeloPlusAliveGroups(false)or nil +if _group.CTLD_CrateMenus then +for item,menu in pairs(_group.CTLD_CrateMenus)do +if menu and menu.RemoveSubMenus then +menu:RemoveSubMenus() +local obj=self:_FindCratesCargoObject(item) +if obj then self:_AddCrateQuantityMenus(_group,_unit,menu,obj,stockSummary)end +end +end +end +if _group.CTLD_TroopMenus then +for item,menu in pairs(_group.CTLD_TroopMenus)do +if menu and menu.RemoveSubMenus then +menu:RemoveSubMenus() +local obj=self:_FindTroopsCargoObject(item) +if obj then self:_AddTroopQuantityMenus(_group,_unit,menu,obj)end +end +end +end +return self +end +self._qtySnap=self._qtySnap or{} +for uname,_ in pairs(self._qtySnap)do +if not(self.CtldUnits and self.CtldUnits[uname])then +self._qtySnap[uname]=nil +end +end +for name,_ in pairs(self.CtldUnits or{})do +local u=UNIT:FindByName(name)or CLIENT:FindByName(name) +if u and u:IsAlive()then +local g=u:GetGroup() +if g then +local caps=self:_GetUnitCapabilities(u) +local needCrate,needTroop=false,false +if g.CTLD_CrateMenus then +local cap=caps.cratelimit or 0 +for item,_ in pairs(g.CTLD_CrateMenus)do +local obj=self:_FindCratesCargoObject(item) +if obj then +local per=obj:GetCratesNeeded()or 1 +if per<1 then per=1 end +local uname=u:GetName()or"none" +local cap=caps.cratelimit or 0 +local loaded=(self.Loaded_Cargo[uname]and self.Loaded_Cargo[uname].Cratesloaded)or 0 +local avail=math.max(0,cap-loaded) +local unitAvail=math.max(0,math.min(self.maxCrateMenuQuantity or 1,math.floor(avail/per))) +local s=obj:GetStock() +if type(s)=="number"and s>=0 and s<unitAvail then needCrate=true break end +end +end +end +if g.CTLD_TroopMenus then +local cap=caps.trooplimit or 0 +for item,_ in pairs(g.CTLD_TroopMenus)do +local obj=self:_FindTroopsCargoObject(item) +if obj then +local per=obj:GetCratesNeeded()or 1 +if per<1 then per=1 end +local uname=u:GetName()or"none" +local cap=caps.trooplimit or 0 +local loaded=(self.Loaded_Cargo[uname]and self.Loaded_Cargo[uname].Troopsloaded)or 0 +local avail=math.max(0,cap-loaded) +local unitAvail=math.max(0,math.min(self.maxCrateMenuQuantity or 1,math.floor(avail/per))) +local s=obj:GetStock() +if type(s)=="number"and s>=0 and s<unitAvail then needTroop=true break end +end +end +end +if needCrate or needTroop then +local stockSummary=self.showstockinmenuitems and self:_CountStockPlusInHeloPlusAliveGroups(false)or nil +if needCrate and g.CTLD_CrateMenus then +for item,menu in pairs(g.CTLD_CrateMenus)do +if menu and menu.RemoveSubMenus then +menu:RemoveSubMenus() +local obj=self:_FindCratesCargoObject(item) +if obj then self:_AddCrateQuantityMenus(g,u,menu,obj,stockSummary)end +end +end +end +if needTroop and g.CTLD_TroopMenus then +for item,menu in pairs(g.CTLD_TroopMenus)do +if menu and menu.RemoveSubMenus then +menu:RemoveSubMenus() +local obj=self:_FindTroopsCargoObject(item) +if obj then self:_AddTroopQuantityMenus(g,u,menu,obj)end +end +end +end +end +end +end +end +return self +end function CTLD:_RefreshF10Menus() self:T(self.lid.." _RefreshF10Menus") self.onestepmenu=self.onestepmenu or false @@ -75415,6 +75896,7 @@ local menus={} for _,_unitName in pairs(self.CtldUnits)do if(not self.MenusDone[_unitName])or(self.showstockinmenuitems==true)then self:T(self.lid.."Menu not done yet for ".._unitName) +local firstBuild=not self.MenusDone[_unitName] local _unit=UNIT:FindByName(_unitName) if not _unit and self.allowCATransport then _unit=CLIENT:FindByName(_unitName) @@ -75441,6 +75923,7 @@ if cantroops then local toptroops=MENU_GROUP:New(_group,"Manage Troops",topmenu) local troopsmenu=MENU_GROUP:New(_group,"Load troops",toptroops) _group.MyTopTroopsMenu=toptroops +_group.CTLD_TroopMenus={} if self.usesubcats then local subcatmenus={} for catName,_ in pairs(self.subcatsTroop)do @@ -75448,19 +75931,20 @@ subcatmenus[catName]=MENU_GROUP:New(_group,catName,troopsmenu) end for _,cargoObj in pairs(self.Cargo_Troops)do if not cargoObj.DontShowInMenu then -local stock=cargoObj:GetStock() local menutext=cargoObj.Name -if(stock>=0)and(self.showstockinmenuitems==true)then menutext=menutext.." ["..stock.."]"end -MENU_GROUP_COMMAND:New(_group,menutext,subcatmenus[cargoObj.Subcategory],self._LoadTroops,self,_group,_unit,cargoObj) +local parent=subcatmenus[cargoObj.Subcategory]or troopsmenu +local mSet=MENU_GROUP:New(_group,menutext,parent) +_group.CTLD_TroopMenus[cargoObj.Name]=mSet +self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj) end end else for _,cargoObj in pairs(self.Cargo_Troops)do if not cargoObj.DontShowInMenu then -local stock=cargoObj:GetStock() local menutext=cargoObj.Name -if(stock>=0)and(self.showstockinmenuitems==true)then menutext=menutext.." ["..stock.."]"end -MENU_GROUP_COMMAND:New(_group,menutext,troopsmenu,self._LoadTroops,self,_group,_unit,cargoObj) +local mSet=MENU_GROUP:New(_group,menutext,troopsmenu) +_group.CTLD_TroopMenus[cargoObj.Name]=mSet +self:_AddTroopQuantityMenus(_group,_unit,mSet,cargoObj) end end end @@ -75486,59 +75970,43 @@ local topcrates=MENU_GROUP:New(_group,"Manage Crates",topmenu) _group.MyTopCratesMenu=topcrates local cratesmenu=MENU_GROUP:New(_group,"Get Crates",topcrates) if self.onestepmenu then +_group.CTLD_CrateMenus={} +local crateStockSummary=nil +if self.showstockinmenuitems then +crateStockSummary=self:_CountStockPlusInHeloPlusAliveGroups(false) +end +local function addCrateMenuEntry(cargoObj,parentMenu) +if cargoObj.DontShowInMenu then +return +end +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +if self.showstockinmenuitems then +local suffix=self:_FormatCrateStockSuffix(cargoObj,crateStockSummary) +if suffix then txt=txt..suffix end +end +local mSet=MENU_GROUP:New(_group,txt,parentMenu) +_group.CTLD_CrateMenus[cargoObj.Name]=mSet +self:_AddCrateQuantityMenus(_group,_unit,mSet,cargoObj,crateStockSummary) +end if self.usesubcats then local subcatmenus={} for catName,_ in pairs(self.subcats)do subcatmenus[catName]=MENU_GROUP:New(_group,catName,cratesmenu) end for _,cargoObj in pairs(self.Cargo_Crates)do -if not cargoObj.DontShowInMenu then -local needed=cargoObj:GetCratesNeeded()or 1 -local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) -if cargoObj.Location then txt=txt.."[R]"end -local stock=cargoObj:GetStock() -if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end -local mSet=MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) -MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) -MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) -end +addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory]or cratesmenu) end for _,cargoObj in pairs(self.Cargo_Statics)do -if not cargoObj.DontShowInMenu then -local needed=cargoObj:GetCratesNeeded()or 1 -local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) -if cargoObj.Location then txt=txt.."[R]"end -local stock=cargoObj:GetStock() -if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end -local mSet=MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) -MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) -MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) -end +addCrateMenuEntry(cargoObj,subcatmenus[cargoObj.Subcategory]or cratesmenu) end else for _,cargoObj in pairs(self.Cargo_Crates)do -if not cargoObj.DontShowInMenu then -local needed=cargoObj:GetCratesNeeded()or 1 -local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) -if cargoObj.Location then txt=txt.."[R]"end -local stock=cargoObj:GetStock() -if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end -local mSet=MENU_GROUP:New(_group,txt,cratesmenu) -MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) -MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) -end +addCrateMenuEntry(cargoObj,cratesmenu) end for _,cargoObj in pairs(self.Cargo_Statics)do -if not cargoObj.DontShowInMenu then -local needed=cargoObj:GetCratesNeeded()or 1 -local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) -if cargoObj.Location then txt=txt.."[R]"end -local stock=cargoObj:GetStock() -if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end -local mSet=MENU_GROUP:New(_group,txt,cratesmenu) -MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) -MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) -end +addCrateMenuEntry(cargoObj,cratesmenu) end end else @@ -75652,6 +76120,8 @@ end self.MenusDone[_unitName]=true self:_RefreshLoadCratesMenu(_group,_unit) self:_RefreshDropCratesMenu(_group,_unit) +if firstBuild then menucount=menucount+1 end +if firstBuild and not self.showstockinmenuitems then self:_RefreshQuantityMenusForGroup(_group,_unit)end end end else @@ -75727,6 +76197,9 @@ self:_SendMessage(string.format("No \"%s\" crates found in range!",cargoName),10 return self end local found=#matchingCrates +local batch=self._batchCrateLoad and self._batchCrateLoad[Unit:GetName()]or nil +local prevSuppress=self.suppressmessages +if batch and batch.cname==cargoName then self.suppressmessages=true end local unitName=Unit:GetName() local loadedData=self.Loaded_Cargo[unitName]or{Troopsloaded=0,Cratesloaded=0,Cargo={}} local capabilities=self:_GetUnitCapabilities(Unit) @@ -75771,6 +76244,7 @@ end end self.Spawned_Cargo=newSpawned local loadedHere=toLoad +if not batch then if loadedHere<needed and loadedData.Cratesloaded>=capacity then self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!",loadedHere,needed,cargoName),10,false,Group) else @@ -75788,8 +76262,27 @@ else self:_SendMessage(string.format("Loaded %d %s(s).",loadedHere,cargoName),10,false,Group) end end +end self:_RefreshLoadCratesMenu(Group,Unit) self:_RefreshDropCratesMenu(Group,Unit) +self:_RefreshCrateQuantityMenus(Group,Unit,self:_FindCratesCargoObject(cargoName)) +if batch and batch.cname==cargoName then +local setsLoaded=math.floor((loadedHere or 0)/(needed or 1)) +batch.loaded=(batch.loaded or 0)+(setsLoaded or 0) +if loadedHere<(needed or 1)then batch.partials=(batch.partials or 0)+1 end +batch.remaining=(batch.remaining or 1)-1 +if batch.remaining<=0 then +self.suppressmessages=prevSuppress +local txt=string.format("Loaded %d %s.",batch.loaded,cargoName) +if batch.partials and batch.partials>0 then +txt=txt.." Some sets could not be fully loaded." +end +self:_SendMessage(txt,10,false,batch.group) +self._batchCrateLoad[Unit:GetName()]=nil +else +self.suppressmessages=prevSuppress +end +end return self end function CTLD:_UnloadSingleCrateSet(Group,Unit,setIndex) @@ -75883,6 +76376,7 @@ end self:_UpdateUnitCargoMass(Unit) self:_RefreshDropCratesMenu(Group,Unit) self:_RefreshLoadCratesMenu(Group,Unit) +self:_RefreshCrateQuantityMenus(Group,Unit,nil) return self end function CTLD:_RefreshDropCratesMenu(Group,Unit) @@ -76113,6 +76607,7 @@ if _troop.Name==cName then local st=_troop:GetStock() if st and tonumber(st)>=0 then _troop:AddStock() +self:_RefreshTroopQuantityMenus(Group,Unit,_troop) end end end @@ -76143,6 +76638,7 @@ end self.Loaded_Cargo[unitName].Troopsloaded=troopsLoaded self.Loaded_Cargo[unitName].Cratesloaded=cratesLoaded self:_RefreshDropTroopsMenu(Group,Unit) +self:_RefreshTroopQuantityMenus(Group,Unit,nil) else local isHerc=self:IsFixedWing(Unit) if isHerc then @@ -77113,6 +77609,7 @@ local gentroops=self.Cargo_Troops for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:AddStock(number) +self:_RefreshTroopQuantityMenus(nil,nil,_troop) break end end @@ -77125,6 +77622,7 @@ local gentroops=self.Cargo_Crates for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:AddStock(number) +self:_RefreshCrateQuantityMenus(nil,nil,_troop) break end end @@ -77137,6 +77635,7 @@ local gentroops=self.Cargo_Statics for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:AddStock(number) +self:_RefreshQuantityMenusForGroup() break end end @@ -77149,6 +77648,7 @@ local gentroops=self.Cargo_Crates for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:SetStock(number) +self:_RefreshCrateQuantityMenus(nil,nil,_troop) break end end @@ -77161,6 +77661,7 @@ local gentroops=self.Cargo_Troops for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:SetStock(number) +self:_RefreshTroopQuantityMenus(nil,nil,_troop) break end end @@ -77173,6 +77674,7 @@ local gentroops=self.Cargo_Statics for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:SetStock(number) +self:_RefreshQuantityMenusForGroup() break end end @@ -77223,6 +77725,7 @@ local gentroops=self.Cargo_Troops for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:RemoveStock(number) +self:_RefreshTroopQuantityMenus(nil,nil,_troop) end end return self @@ -77234,6 +77737,7 @@ local gentroops=self.Cargo_Crates for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:RemoveStock(number) +self:_RefreshQuantityMenusForGroup() end end return self @@ -77245,6 +77749,7 @@ local gentroops=self.Cargo_Statics for _id,_troop in pairs(gentroops)do if _troop.Name==name then _troop:RemoveStock(number) +self:_RefreshQuantityMenusForGroup() end end return self @@ -77694,6 +78199,7 @@ function CTLD:onafterTroopsDeployed(From,Event,To,Group,Unit,Troops,Type) self:T({From,Event,To}) if self.movetroopstowpzone and Type~=CTLD_CARGO.Enum.ENGINEERS then self:_MoveGroupToZone(Troops) +if not Group or not Unit then self:_RefreshQuantityMenusForGroup()end end return self end @@ -77732,6 +78238,7 @@ if not(cg and(cg.NoMoveToZone or(self.nomovetozone_names and self.nomovetozone_n self:_MoveGroupToZone(Vehicle) end end +if not Group or not Unit then self:_RefreshQuantityMenusForGroup()end return self end function CTLD:onbeforeTroopsRTB(From,Event,To,Group,Unit,ZoneName,ZoneObject) @@ -110282,8 +110789,10 @@ NextTaskSuccess={}, NextTaskFailure={}, FinalState="none", PreviousCount=0, +CanSmoke=true, +ShowThreatDetails=true, } -PLAYERTASK.version="0.1.28" +PLAYERTASK.version="0.1.29" function PLAYERTASK:New(Type,Target,Repeat,Times,TTSType) local self=BASE:Inherit(self,FSM:New()) self.Type=Type @@ -110448,6 +110957,16 @@ self:T(self.lid.."AddSubType") self.TaskSubType=Type return self end +function PLAYERTASK:SetCanSmoke(OnOff) +self:T(self.lid.."AddSSetCanSmokeubType") +self.CanSmoke=OnOff +return self +end +function PLAYERTASK:SetShowThreatDetails(OnOff) +self:T(self.lid.."SetShowThreatDetails") +self.ShowThreatDetails=OnOff +return self +end function PLAYERTASK:GetSubType() self:T(self.lid.."GetSubType") return self.TaskSubType @@ -110845,10 +111364,10 @@ self.timestamp=timer.getAbsTime() self:__Stop(-1) return self end -function PLAYERTASK:onafterCancel(From,Event,To) +function PLAYERTASK:onafterCancel(From,Event,To,Silent) self:T({From,Event,To}) if self.TaskController then -self.TaskController:__TaskCancelled(-1,self) +self.TaskController:__TaskCancelled(-1,self,Silent) end self.timestamp=timer.getAbsTime() self.FinalState="Cancelled" @@ -111010,12 +111529,15 @@ THREATHIGH="high", THREATMEDIUM="medium", THREATLOW="low", THREATTEXT="%s\nThreat: %s\nTargets left: %d\nCoord: %s", +NOTHREATTEXT="%s\nNo target information available.", ELEVATION="\nTarget Elevation: %s %s", METER="meter", FEET="feet", THREATTEXTTTS="%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.", +NOTHREATTEXTTTS="%s, %s. No target information available.", MARKTASK="%s, %s, copy, task %03d location marked on map!", SMOKETASK="%s, %s, copy, task %03d location smoked!", +NOSMOKETASK="%s, %s, negative, task %03d location cannot be smoked!", FLARETASK="%s, %s, copy, task %03d location illuminated!", ABORTTASK="All stations, %s, %s has aborted %s task %03d!", UNKNOWN="Unknown", @@ -111094,12 +111616,15 @@ THREATHIGH="hoch", THREATMEDIUM="mittel", THREATLOW="niedrig", THREATTEXT="%s\nGefahrstufe: %s\nZiele: %d\nKoord: %s", +NOTHREATTEXT="%s\nKeine Zielinformation verfügbar.", ELEVATION="\nZiel Höhe: %s %s", METER="Meter", FEET="Fuss", THREATTEXTTTS="%s, %s. Zielinformation zu %s. Gefahrstufe %s. Ziele %d. Zielposition %s.", +NOTHREATTEXTTTS="%s, %s. Keine Zielinformation verfügbar.", MARKTASK="%s, %s, verstanden, Zielposition %03d auf der Karte markiert!", SMOKETASK="%s, %s, verstanden, Zielposition %03d mit Rauch markiert!", +NOSMOKETASK="%s, %s, negativ, Zielposition %03d kann nicht markiert werden!", FLARETASK="%s, %s, verstanden, Zielposition %03d beleuchtet!", ABORTTASK="%s, an alle, %s hat Auftrag %s %03d abgebrochen!", UNKNOWN="Unbekannt", @@ -111157,7 +111682,7 @@ CARRIER="Flugzeugträger", RADIOS="Frequenzen", }, } -PLAYERTASKCONTROLLER.version="0.1.70" +PLAYERTASKCONTROLLER.version="0.1.71" function PLAYERTASKCONTROLLER:New(Name,Coalition,Type,ClientFilter) local self=BASE:Inherit(self,FSM:New()) self.Name=Name or"CentCom" @@ -111583,9 +112108,9 @@ self.ClusterRadius=Radius or 0.5 self.usecluster=true return self end -function PLAYERTASKCONTROLLER:CancelTask(Task) +function PLAYERTASKCONTROLLER:CancelTask(Task,Silent) self:T(self.lid.."CancelTask") -Task:__Cancel(-1) +Task:__Cancel(-1,Silent) return self end function PLAYERTASKCONTROLLER:SwitchUseGroupNames(OnOff) @@ -112282,6 +112807,7 @@ local Coordinate=task.Target:GetCoordinate()or COORDINATE:New(0,0,0) local Elevation=Coordinate:GetLandHeight()or 0 local CoordText="" local CoordTextLLDM=nil +local ShowThreatInfo=task.ShowThreatDetails local LasingDrone=self:_FindLasingDroneForTaskID(task.PlayerTaskNr) if self.Type~=PLAYERTASKCONTROLLER.Type.A2A then CoordText=Coordinate:ToStringA2G(Client,nil,self.ShowMagnetic) @@ -112299,7 +112825,12 @@ local targets=task.Target:CountTargets()or 0 local clientlist,clientcount=task:GetClients() local ThreatGraph="["..string.rep("■",ThreatLevel)..string.rep("□",10-ThreatLevel).."]: "..ThreatLevel local ThreatLocaleText=self.gettext:GetEntry("THREATTEXT",self.locale) +if ShowThreatInfo==true then text=string.format(ThreatLocaleText,taskname,ThreatGraph,targets,CoordText) +else +ThreatLocaleText=self.gettext:GetEntry("NOTHREATTEXT",self.locale) +text=string.format(ThreatLocaleText,taskname) +end local settings=_DATABASE:GetPlayerSettings(playername)or _SETTINGS local elevationmeasure=self.gettext:GetEntry("FEET",self.locale) if settings:IsMetric()then @@ -112401,8 +112932,14 @@ CoordText="MGRS;"..Text if self.PathToGoogleKey then end end +local ttstext local ThreatLocaleTextTTS=self.gettext:GetEntry("THREATTEXTTTS",self.locale) -local ttstext=string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText,targets,CoordText) +if ShowThreatInfo==true then +ttstext=string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText,targets,CoordText) +else +ThreatLocaleTextTTS=self.gettext:GetEntry("NOTHREATTEXTTTS",self.locale) +ttstext=string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name) +end if task.Type==AUFTRAG.Type.PRECISIONBOMBING and self.precisionbombing then if LasingDrone and LasingDrone.playertask.inreach and LasingDrone:IsLasing()then local lasingtext=self.gettext:GetEntry("POINTERTARGETLASINGTTS",self.locale) @@ -112455,6 +112992,7 @@ local playername,ttsplayername=self:_GetPlayerName(Client) local text="" if self.TasksPerPlayer:HasUniqueID(playername)then local task=self.TasksPerPlayer:ReadByID(playername) +if task.CanSmoke==true then task:SmokeTarget() local textmark=self.gettext:GetEntry("SMOKETASK",self.locale) text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) @@ -112464,6 +113002,14 @@ self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) end self:__TaskTargetSmoked(5,task) else +local textmark=self.gettext:GetEntry("NOSMOKETASK",self.locale) +text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +end +else text=self.gettext:GetEntry("NOACTIVETASK",self.locale) end if not self.NoScreenOutput then @@ -113051,19 +113597,21 @@ self:T({From,Event,To}) self:T(self.lid.."TaskDone") return self end -function PLAYERTASKCONTROLLER:onafterTaskCancelled(From,Event,To,Task) +function PLAYERTASKCONTROLLER:onafterTaskCancelled(From,Event,To,Task,Silent) self:T({From,Event,To}) self:T(self.lid.."TaskCancelled") +if Silent~=true then local canceltxt=self.gettext:GetEntry("TASKCANCELLED",self.locale) local canceltxttts=self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale) local taskname=string.format(canceltxt,Task.PlayerTaskNr,tostring(Task.Type)) -if not self.NoScreenOutput then +if self.NoScreenOutput~=true then self:_SendMessageToClients(taskname,15) end if self.UseSRS then taskname=string.format(canceltxttts,self.MenuName or self.Name,Task.PlayerTaskNr,tostring(Task.TTSType)) self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) end +end local clients=Task:GetClientObjects() for _,client in pairs(clients)do self:_RemoveMenuEntriesForTask(Task,client) diff --git a/Moose_.lua.backup b/Moose_.lua.backup new file mode 100644 index 0000000..8bbc66d --- /dev/null +++ b/Moose_.lua.backup @@ -0,0 +1,132469 @@ +env.info('*** MOOSE GITHUB Commit Hash ID: 2025-10-26T07:31:50+01:00-1965e24860936512d2670eb7d41c8440707a12ff ***') +if not MOOSE_DEVELOPMENT_FOLDER then +MOOSE_DEVELOPMENT_FOLDER='Scripts' +end +ModuleLoader=MOOSE_DEVELOPMENT_FOLDER..'/Moose/Modules.lua' +if io then +local f=io.open(ModuleLoader,"r") +if f~=nil then +io.close(f) +env.info('*** MOOSE DYNAMIC INCLUDE START *** ') +local base=_G +__Moose={} +__Moose.Include=function(IncludeFile) +if not __Moose.Includes[IncludeFile]then +__Moose.Includes[IncludeFile]=IncludeFile +local f=assert(base.loadfile(IncludeFile)) +if f==nil then +error("Moose: Could not load Moose file "..IncludeFile) +else +env.info("Moose: "..IncludeFile.." dynamically loaded.") +return f() +end +end +end +__Moose.Includes={} +__Moose.Include(MOOSE_DEVELOPMENT_FOLDER..'/Moose/Modules.lua') +BASE:TraceOnOff(true) +env.info('*** MOOSE INCLUDE END *** ') +do return end +end +else +env.info('*** MOOSE DYNAMIC INCLUDE NOT POSSIBLE (Desanitize io to use it) *** ') +end +env.info('*** MOOSE STATIC INCLUDE START *** ') +ENUMS={} +env.setErrorMessageBoxEnabled(false) +ENUMS.ROE={ +WeaponFree=0, +OpenFireWeaponFree=1, +OpenFire=2, +ReturnFire=3, +WeaponHold=4, +} +ENUMS.ROT={ +NoReaction=0, +PassiveDefense=1, +EvadeFire=2, +BypassAndEscape=3, +AllowAbortMission=4, +} +ENUMS.AlarmState={ +Auto=0, +Green=1, +Red=2, +} +ENUMS.WeaponFlag={ +LGB=2, +TvGB=4, +SNSGB=8, +HEBomb=16, +Penetrator=32, +NapalmBomb=64, +FAEBomb=128, +ClusterBomb=256, +Dispencer=512, +CandleBomb=1024, +ParachuteBomb=2147483648, +LightRocket=2048, +MarkerRocket=4096, +CandleRocket=8192, +HeavyRocket=16384, +AntiRadarMissile=32768, +AntiShipMissile=65536, +AntiTankMissile=131072, +FireAndForgetASM=262144, +LaserASM=524288, +TeleASM=1048576, +CruiseMissile=2097152, +AntiRadarMissile2=1073741824, +SRAM=4194304, +MRAAM=8388608, +LRAAM=16777216, +IR_AAM=33554432, +SAR_AAM=67108864, +AR_AAM=134217728, +GunPod=268435456, +BuiltInCannon=536870912, +GuidedBomb=14, +AnyUnguidedBomb=2147485680, +AnyBomb=2147485694, +AnyRocket=30720, +GuidedASM=1572864, +TacticalASM=1835008, +AnyASM=4161536, +AnyASM2=1077903360, +AnyAAM=264241152, +AnyAutonomousMissile=36012032, +AnyMissile=268402688, +Cannons=805306368, +Torpedo=4294967296, +Auto=3221225470, +AutoDCS=1073741822, +AnyAG=2956984318, +AnyAA=264241152, +AnyUnguided=2952822768, +AnyGuided=268402702, +} +ENUMS.WeaponType={} +ENUMS.WeaponType.Bomb={ +LGB=2, +TvGB=4, +SNSGB=8, +HEBomb=16, +Penetrator=32, +NapalmBomb=64, +FAEBomb=128, +ClusterBomb=256, +Dispencer=512, +CandleBomb=1024, +ParachuteBomb=2147483648, +GuidedBomb=14, +AnyUnguidedBomb=2147485680, +AnyBomb=2147485694, +} +ENUMS.WeaponType.Rocket={ +LightRocket=2048, +MarkerRocket=4096, +CandleRocket=8192, +HeavyRocket=16384, +AnyRocket=30720, +} +ENUMS.WeaponType.Gun={ +GunPod=268435456, +BuiltInCannon=536870912, +Cannons=805306368, +} +ENUMS.WeaponType.Missile={ +AntiRadarMissile=32768, +AntiShipMissile=65536, +AntiTankMissile=131072, +FireAndForgetASM=262144, +LaserASM=524288, +TeleASM=1048576, +CruiseMissile=2097152, +AntiRadarMissile2=1073741824, +GuidedASM=1572864, +TacticalASM=1835008, +AnyASM=4161536, +AnyASM2=1077903360, +AnyAutonomousMissile=36012032, +AnyMissile=268402688, +} +ENUMS.WeaponType.AAM={ +SRAM=4194304, +MRAAM=8388608, +LRAAM=16777216, +IR_AAM=33554432, +SAR_AAM=67108864, +AR_AAM=134217728, +AnyAAM=264241152, +} +ENUMS.WeaponType.Torpedo={ +Torpedo=4294967296, +} +ENUMS.WeaponType.Any={ +Weapon=3221225470, +AG=2956984318, +AA=264241152, +Unguided=2952822768, +Guided=268402702, +} +ENUMS.MissionTask={ +NOTHING="Nothing", +AFAC="AFAC", +ANTISHIPSTRIKE="Antiship Strike", +AWACS="AWACS", +CAP="CAP", +CAS="CAS", +ESCORT="Escort", +GROUNDESCORT="Ground escort", +FIGHTERSWEEP="Fighter Sweep", +GROUNDATTACK="Ground Attack", +INTERCEPT="Intercept", +PINPOINTSTRIKE="Pinpoint Strike", +RECONNAISSANCE="Reconnaissance", +REFUELING="Refueling", +RUNWAYATTACK="Runway Attack", +SEAD="SEAD", +TRANSPORT="Transport", +} +ENUMS.Formation={} +ENUMS.Formation.FixedWing={} +ENUMS.Formation.FixedWing.LineAbreast={} +ENUMS.Formation.FixedWing.LineAbreast.Close=65537 +ENUMS.Formation.FixedWing.LineAbreast.Open=65538 +ENUMS.Formation.FixedWing.LineAbreast.Group=65539 +ENUMS.Formation.FixedWing.Trail={} +ENUMS.Formation.FixedWing.Trail.Close=131073 +ENUMS.Formation.FixedWing.Trail.Open=131074 +ENUMS.Formation.FixedWing.Trail.Group=131075 +ENUMS.Formation.FixedWing.Wedge={} +ENUMS.Formation.FixedWing.Wedge.Close=196609 +ENUMS.Formation.FixedWing.Wedge.Open=196610 +ENUMS.Formation.FixedWing.Wedge.Group=196611 +ENUMS.Formation.FixedWing.EchelonRight={} +ENUMS.Formation.FixedWing.EchelonRight.Close=262145 +ENUMS.Formation.FixedWing.EchelonRight.Open=262146 +ENUMS.Formation.FixedWing.EchelonRight.Group=262147 +ENUMS.Formation.FixedWing.EchelonLeft={} +ENUMS.Formation.FixedWing.EchelonLeft.Close=327681 +ENUMS.Formation.FixedWing.EchelonLeft.Open=327682 +ENUMS.Formation.FixedWing.EchelonLeft.Group=327683 +ENUMS.Formation.FixedWing.FingerFour={} +ENUMS.Formation.FixedWing.FingerFour.Close=393217 +ENUMS.Formation.FixedWing.FingerFour.Open=393218 +ENUMS.Formation.FixedWing.FingerFour.Group=393219 +ENUMS.Formation.FixedWing.Spread={} +ENUMS.Formation.FixedWing.Spread.Close=458753 +ENUMS.Formation.FixedWing.Spread.Open=458754 +ENUMS.Formation.FixedWing.Spread.Group=458755 +ENUMS.Formation.FixedWing.BomberElement={} +ENUMS.Formation.FixedWing.BomberElement.Close=786433 +ENUMS.Formation.FixedWing.BomberElement.Open=786434 +ENUMS.Formation.FixedWing.BomberElement.Group=786435 +ENUMS.Formation.FixedWing.BomberElementHeight={} +ENUMS.Formation.FixedWing.BomberElementHeight.Close=851968 +ENUMS.Formation.FixedWing.FighterVic={} +ENUMS.Formation.FixedWing.FighterVic.Close=917505 +ENUMS.Formation.FixedWing.FighterVic.Open=917506 +ENUMS.Formation.RotaryWing={} +ENUMS.Formation.RotaryWing.Column={} +ENUMS.Formation.RotaryWing.Column.D70=720896 +ENUMS.Formation.RotaryWing.Wedge={} +ENUMS.Formation.RotaryWing.Wedge.D70=8 +ENUMS.Formation.RotaryWing.FrontRight={} +ENUMS.Formation.RotaryWing.FrontRight.D300=655361 +ENUMS.Formation.RotaryWing.FrontRight.D600=655362 +ENUMS.Formation.RotaryWing.FrontLeft={} +ENUMS.Formation.RotaryWing.FrontLeft.D300=655617 +ENUMS.Formation.RotaryWing.FrontLeft.D600=655618 +ENUMS.Formation.RotaryWing.EchelonRight={} +ENUMS.Formation.RotaryWing.EchelonRight.D70=589825 +ENUMS.Formation.RotaryWing.EchelonRight.D300=589826 +ENUMS.Formation.RotaryWing.EchelonRight.D600=589827 +ENUMS.Formation.RotaryWing.EchelonLeft={} +ENUMS.Formation.RotaryWing.EchelonLeft.D70=590081 +ENUMS.Formation.RotaryWing.EchelonLeft.D300=590082 +ENUMS.Formation.RotaryWing.EchelonLeft.D600=590083 +ENUMS.Formation.Vehicle={} +ENUMS.Formation.Vehicle.Vee="Vee" +ENUMS.Formation.Vehicle.EchelonRight="EchelonR" +ENUMS.Formation.Vehicle.OffRoad="Off Road" +ENUMS.Formation.Vehicle.Rank="Rank" +ENUMS.Formation.Vehicle.EchelonLeft="EchelonL" +ENUMS.Formation.Vehicle.OnRoad="On Road" +ENUMS.Formation.Vehicle.Cone="Cone" +ENUMS.Formation.Vehicle.Diamond="Diamond" +ENUMS.FormationOld={} +ENUMS.FormationOld.FixedWing={} +ENUMS.FormationOld.FixedWing.LineAbreast=1 +ENUMS.FormationOld.FixedWing.Trail=2 +ENUMS.FormationOld.FixedWing.Wedge=3 +ENUMS.FormationOld.FixedWing.EchelonRight=4 +ENUMS.FormationOld.FixedWing.EchelonLeft=5 +ENUMS.FormationOld.FixedWing.FingerFour=6 +ENUMS.FormationOld.FixedWing.SpreadFour=7 +ENUMS.FormationOld.FixedWing.BomberElement=12 +ENUMS.FormationOld.FixedWing.BomberElementHeight=13 +ENUMS.FormationOld.FixedWing.FighterVic=14 +ENUMS.FormationOld.RotaryWing={} +ENUMS.FormationOld.RotaryWing.Wedge=8 +ENUMS.FormationOld.RotaryWing.Echelon=9 +ENUMS.FormationOld.RotaryWing.Front=10 +ENUMS.FormationOld.RotaryWing.Column=11 +ENUMS.Morse={} +ENUMS.Morse.A="* -" +ENUMS.Morse.B="- * * *" +ENUMS.Morse.C="- * - *" +ENUMS.Morse.D="- * *" +ENUMS.Morse.E="*" +ENUMS.Morse.F="* * - *" +ENUMS.Morse.G="- - *" +ENUMS.Morse.H="* * * *" +ENUMS.Morse.I="* *" +ENUMS.Morse.J="* - - -" +ENUMS.Morse.K="- * -" +ENUMS.Morse.L="* - * *" +ENUMS.Morse.M="- -" +ENUMS.Morse.N="- *" +ENUMS.Morse.O="- - -" +ENUMS.Morse.P="* - - *" +ENUMS.Morse.Q="- - * -" +ENUMS.Morse.R="* - *" +ENUMS.Morse.S="* * *" +ENUMS.Morse.T="-" +ENUMS.Morse.U="* * -" +ENUMS.Morse.V="* * * -" +ENUMS.Morse.W="* - -" +ENUMS.Morse.X="- * * -" +ENUMS.Morse.Y="- * - -" +ENUMS.Morse.Z="- - * *" +ENUMS.Morse.N1="* - - - -" +ENUMS.Morse.N2="* * - - -" +ENUMS.Morse.N3="* * * - -" +ENUMS.Morse.N4="* * * * -" +ENUMS.Morse.N5="* * * * *" +ENUMS.Morse.N6="- * * * *" +ENUMS.Morse.N7="- - * * *" +ENUMS.Morse.N8="- - - * *" +ENUMS.Morse.N9="- - - - *" +ENUMS.Morse.N0="- - - - -" +ENUMS.Morse[" "]=" " +ENUMS.ISOLang= +{ +Arabic='AR', +Chinese='ZH', +English='EN', +French='FR', +German='DE', +Russian='RU', +Spanish='ES', +Japanese='JA', +Italian='IT', +} +ENUMS.Phonetic= +{ +A='Alpha', +B='Bravo', +C='Charlie', +D='Delta', +E='Echo', +F='Foxtrot', +G='Golf', +H='Hotel', +I='India', +J='Juliett', +K='Kilo', +L='Lima', +M='Mike', +N='November', +O='Oscar', +P='Papa', +Q='Quebec', +R='Romeo', +S='Sierra', +T='Tango', +U='Uniform', +V='Victor', +W='Whiskey', +X='Xray', +Y='Yankee', +Z='Zulu', +} +ENUMS.ReportingName= +{ +NATO={ +Dragon="JF-17", +Fagot="MiG-15", +Farmer="MiG-19", +Felon="Su-57", +Fencer="Su-24", +Fishbed="MiG-21", +Fitter="Su-17", +Flogger="MiG-23", +Flogger_D="MiG-27", +Flagon="Su-15", +Foxbat="MiG-25", +Fulcrum="MiG-29", +Foxhound="MiG-31", +Flanker="Su-27", +Flanker_C="Su-30", +Flanker_E="Su-35", +Flanker_F="Su-37", +Flanker_L="J-11A", +Firebird="J-10", +Sea_Flanker="Su-33", +Fullback="Su-34", +Frogfoot="Su-25", +Tomcat="F-14", +Mirage="Mirage", +Codling="Yak-40", +Maya="L-39", +Warthog="A-10", +Skyhawk="A-4E", +Viggen="AJS37", +Harrier_B="AV8BNA", +Harrier="AV-8B", +Spirit="B-2", +Aviojet="C-101", +Nighthawk="F-117A", +Eagle="F-15C", +Mudhen="F-15E", +Viper="F-16", +Phantom="F-4E", +Tiger="F-5", +Sabre="F-86", +Hornet="A-18", +Hawk="Hawk", +Albatros="L-39", +Goshawk="T-45", +Starfighter="F-104", +Tornado="Tornado", +Atlas="A400", +Lancer="B1-B", +Stratofortress="B-52H", +Hercules="C-130", +Super_Hercules="Hercules", +Globemaster="C-17", +Greyhound="C-2A", +Galaxy="C-5", +Hawkeye="E-2D", +Sentry="E-3A", +Stratotanker="KC-135", +Gasstation="KC-135MPRS", +Extender="KC-10", +Orion="P-3C", +Viking="S-3B", +Osprey="V-22", +Badger="H6-J", +Bear_J="Tu-142", +Bear="Tu-95", +Blinder="Tu-22", +Blackjack="Tu-160", +Clank="An-30", +Curl="An-26", +Candid="IL-76", +Midas="IL-78", +Mainstay="A-50", +Mainring="KJ-2000", +Yak="Yak-52", +Helix="Ka-27", +Shark="Ka-50", +Hind="Mi-24", +Halo="Mi-26", +Hip="Mi-8", +Havoc="Mi-28", +Gazelle="SA342", +Huey="UH-1H", +Cobra="AH-1", +Apache="AH-64", +Chinook="CH-47", +Sea_Stallion="CH-53", +Kiowa="OH-58", +Seahawk="SH-60", +Blackhawk="UH-60", +Sea_King="S-61", +UCAV="WingLoong", +Reaper="MQ-9", +Predator="MQ-1A", +} +} +ENUMS.Link16Power={ +none=0, +low=1, +medium=2, +high=3, +} +ENUMS.Storage={ +weapons={ +missiles={}, +bombs={}, +nurs={}, +containers={}, +droptanks={}, +adapters={}, +torpedoes={}, +Gazelle={}, +CH47={}, +OH58={}, +UH1H={}, +AH64D={}, +UH60L={}, +} +} +ENUMS.Storage.weapons.nurs.SNEB_TYPE253_F1B="weapons.nurs.SNEB_TYPE253_F1B" +ENUMS.Storage.weapons.missiles.P_24T="weapons.missiles.P_24T" +ENUMS.Storage.weapons.bombs.BLU_3B_OLD="weapons.bombs.BLU-3B_OLD" +ENUMS.Storage.weapons.missiles.AGM_154="weapons.missiles.AGM_154" +ENUMS.Storage.weapons.nurs.HYDRA_70_M151_M433="weapons.nurs.HYDRA_70_M151_M433" +ENUMS.Storage.weapons.bombs.SAM_Avenger_M1097_Skid_7090lb="weapons.bombs.SAM Avenger M1097 Skid [7090lb]" +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk5="weapons.bombs.British_GP_250LB_Bomb_Mk5" +ENUMS.Storage.weapons.containers.OV10_SMOKE="weapons.containers.{OV10_SMOKE}" +ENUMS.Storage.weapons.bombs.BLU_4B_OLD="weapons.bombs.BLU-4B_OLD" +ENUMS.Storage.weapons.bombs.FAB_500M54="weapons.bombs.FAB-500M54" +ENUMS.Storage.weapons.bombs.GBU_38="weapons.bombs.GBU_38" +ENUMS.Storage.weapons.containers.F_15E_AXQ_14_DATALINK="weapons.containers.F-15E_AXQ-14_DATALINK" +ENUMS.Storage.weapons.bombs.BEER_BOMB="weapons.bombs.BEER_BOMB" +ENUMS.Storage.weapons.bombs.P_50T="weapons.bombs.P-50T" +ENUMS.Storage.weapons.nurs.C_8CM_GN="weapons.nurs.C_8CM_GN" +ENUMS.Storage.weapons.bombs.FAB_500SL="weapons.bombs.FAB-500SL" +ENUMS.Storage.weapons.bombs.KAB_1500Kr="weapons.bombs.KAB_1500Kr" +ENUMS.Storage.weapons.bombs.two50_2="weapons.bombs.250-2" +ENUMS.Storage.weapons.droptanks.Spitfire_tank_1="weapons.droptanks.Spitfire_tank_1" +ENUMS.Storage.weapons.missiles.AGM_65G="weapons.missiles.AGM_65G" +ENUMS.Storage.weapons.missiles.AGM_65A="weapons.missiles.AGM_65A" +ENUMS.Storage.weapons.containers.Hercules_JATO="weapons.containers.Hercules_JATO" +ENUMS.Storage.weapons.nurs.HYDRA_70_M259="weapons.nurs.HYDRA_70_M259" +ENUMS.Storage.weapons.missiles.AGM_84E="weapons.missiles.AGM_84E" +ENUMS.Storage.weapons.bombs.AN_M30A1="weapons.bombs.AN_M30A1" +ENUMS.Storage.weapons.nurs.C_25="weapons.nurs.C_25" +ENUMS.Storage.weapons.containers.AV8BNA_ALQ164="weapons.containers.AV8BNA_ALQ164" +ENUMS.Storage.weapons.containers.lav_25="weapons.containers.lav-25" +ENUMS.Storage.weapons.missiles.P_60="weapons.missiles.P_60" +ENUMS.Storage.weapons.bombs.FAB_1500="weapons.bombs.FAB_1500" +ENUMS.Storage.weapons.droptanks.FuelTank_350L="weapons.droptanks.FuelTank_350L" +ENUMS.Storage.weapons.bombs.AAA_Vulcan_M163_Skid_21577lb="weapons.bombs.AAA Vulcan M163 Skid [21577lb]" +ENUMS.Storage.weapons.missiles.Kormoran="weapons.missiles.Kormoran" +ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY="weapons.droptanks.HB_F14_EXT_DROPTANK_EMPTY" +ENUMS.Storage.weapons.droptanks.FuelTank_150L="weapons.droptanks.FuelTank_150L" +ENUMS.Storage.weapons.missiles.Rb_15F_for_A_I="weapons.missiles.Rb 15F (for A.I.)" +ENUMS.Storage.weapons.missiles.RB75T="weapons.missiles.RB75T" +ENUMS.Storage.weapons.missiles.Vikhr_M="weapons.missiles.Vikhr_M" +ENUMS.Storage.weapons.nurs.FFAR_M156_WP="weapons.nurs.FFAR M156 WP" +ENUMS.Storage.weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1="weapons.nurs.British_HE_60LBSAPNo2_3INCHNo1" +ENUMS.Storage.weapons.missiles.DWS39_MJ2="weapons.missiles.DWS39_MJ2" +ENUMS.Storage.weapons.bombs.HEBOMBD="weapons.bombs.HEBOMBD" +ENUMS.Storage.weapons.missiles.CATM_9M="weapons.missiles.CATM_9M" +ENUMS.Storage.weapons.bombs.Mk_81="weapons.bombs.Mk_81" +ENUMS.Storage.weapons.droptanks.Drop_Tank_300_Liter="weapons.droptanks.Drop_Tank_300_Liter" +ENUMS.Storage.weapons.containers.HMMWV_M1025="weapons.containers.HMMWV_M1025" +ENUMS.Storage.weapons.bombs.SAM_CHAPARRAL_Air_21624lb="weapons.bombs.SAM CHAPARRAL Air [21624lb]" +ENUMS.Storage.weapons.missiles.AGM_154A="weapons.missiles.AGM_154A" +ENUMS.Storage.weapons.bombs.Mk_84AIR_TP="weapons.bombs.Mk_84AIR_TP" +ENUMS.Storage.weapons.bombs.GBU_31_V_3B="weapons.bombs.GBU_31_V_3B" +ENUMS.Storage.weapons.nurs.C_8CM_WH="weapons.nurs.C_8CM_WH" +ENUMS.Storage.weapons.missiles.Matra_Super_530D="weapons.missiles.Matra Super 530D" +ENUMS.Storage.weapons.nurs.ARF8M3TPSM="weapons.nurs.ARF8M3TPSM" +ENUMS.Storage.weapons.missiles.TGM_65H="weapons.missiles.TGM_65H" +ENUMS.Storage.weapons.nurs.M8rocket="weapons.nurs.M8rocket" +ENUMS.Storage.weapons.bombs.GBU_27="weapons.bombs.GBU_27" +ENUMS.Storage.weapons.missiles.AGR_20A="weapons.missiles.AGR_20A" +ENUMS.Storage.weapons.missiles.LS_6_250="weapons.missiles.LS-6-250" +ENUMS.Storage.weapons.droptanks.M2KC_RPL_522_EMPTY="weapons.droptanks.M2KC_RPL_522_EMPTY" +ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541="weapons.droptanks.M2KC_02_RPL541" +ENUMS.Storage.weapons.missiles.AGM_45="weapons.missiles.AGM_45" +ENUMS.Storage.weapons.missiles.AGM_84A="weapons.missiles.AGM_84A" +ENUMS.Storage.weapons.bombs.APC_BTR_80_Air_23936lb="weapons.bombs.APC BTR-80 Air [23936lb]" +ENUMS.Storage.weapons.missiles.P_33E="weapons.missiles.P_33E" +ENUMS.Storage.weapons.missiles.Ataka_9M120="weapons.missiles.Ataka_9M120" +ENUMS.Storage.weapons.bombs.MK76="weapons.bombs.MK76" +ENUMS.Storage.weapons.bombs.AB_250_2_SD_2="weapons.bombs.AB_250_2_SD_2" +ENUMS.Storage.weapons.missiles.Rb_05A="weapons.missiles.Rb 05A" +ENUMS.Storage.weapons.bombs.ART_GVOZDIKA_34720lb="weapons.bombs.ART GVOZDIKA [34720lb]" +ENUMS.Storage.weapons.bombs.Generic_Crate_20000lb="weapons.bombs.Generic Crate [20000lb]" +ENUMS.Storage.weapons.bombs.FAB_100SV="weapons.bombs.FAB_100SV" +ENUMS.Storage.weapons.bombs.BetAB_500="weapons.bombs.BetAB_500" +ENUMS.Storage.weapons.droptanks.M2KC_02_RPL541_EMPTY="weapons.droptanks.M2KC_02_RPL541_EMPTY" +ENUMS.Storage.weapons.droptanks.PTB600_MIG15="weapons.droptanks.PTB600_MIG15" +ENUMS.Storage.weapons.missiles.Rb_24J="weapons.missiles.Rb 24J" +ENUMS.Storage.weapons.nurs.C_8CM_BU="weapons.nurs.C_8CM_BU" +ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_F1B="weapons.nurs.SNEB_TYPE259E_F1B" +ENUMS.Storage.weapons.nurs.WGr21="weapons.nurs.WGr21" +ENUMS.Storage.weapons.bombs.SAMP250HD="weapons.bombs.SAMP250HD" +ENUMS.Storage.weapons.containers.alq_184long="weapons.containers.alq-184long" +ENUMS.Storage.weapons.nurs.SNEB_TYPE259E_H1="weapons.nurs.SNEB_TYPE259E_H1" +ENUMS.Storage.weapons.bombs.British_SAP_250LB_Bomb_Mk5="weapons.bombs.British_SAP_250LB_Bomb_Mk5" +ENUMS.Storage.weapons.bombs.Transport_UAZ_469_Air_3747lb="weapons.bombs.Transport UAZ-469 Air [3747lb]" +ENUMS.Storage.weapons.bombs.Mk_83CT="weapons.bombs.Mk_83CT" +ENUMS.Storage.weapons.missiles.AIM_7P="weapons.missiles.AIM-7P" +ENUMS.Storage.weapons.missiles.AT_6="weapons.missiles.AT_6" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_GREEN="weapons.nurs.SNEB_TYPE254_H1_GREEN" +ENUMS.Storage.weapons.nurs.SNEB_TYPE250_F1B="weapons.nurs.SNEB_TYPE250_F1B" +ENUMS.Storage.weapons.containers.U22A="weapons.containers.U22A" +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk1="weapons.bombs.British_GP_250LB_Bomb_Mk1" +ENUMS.Storage.weapons.bombs.CBU_105="weapons.bombs.CBU_105" +ENUMS.Storage.weapons.droptanks.FW_190_Fuel_Tank="weapons.droptanks.FW-190_Fuel-Tank" +ENUMS.Storage.weapons.missiles.X_58="weapons.missiles.X_58" +ENUMS.Storage.weapons.missiles.BK90_MJ1_MJ2="weapons.missiles.BK90_MJ1_MJ2" +ENUMS.Storage.weapons.missiles.TGM_65D="weapons.missiles.TGM_65D" +ENUMS.Storage.weapons.containers.BRD_4_250="weapons.containers.BRD-4-250" +ENUMS.Storage.weapons.missiles.P_73="weapons.missiles.P_73" +ENUMS.Storage.weapons.bombs.AN_M66="weapons.bombs.AN_M66" +ENUMS.Storage.weapons.bombs.APC_LAV_25_Air_22520lb="weapons.bombs.APC LAV-25 Air [22520lb]" +ENUMS.Storage.weapons.missiles.AIM_7MH="weapons.missiles.AIM-7MH" +ENUMS.Storage.weapons.containers.MB339_TravelPod="weapons.containers.MB339_TravelPod" +ENUMS.Storage.weapons.bombs.GBU_12="weapons.bombs.GBU_12" +ENUMS.Storage.weapons.bombs.SC_250_T3_J="weapons.bombs.SC_250_T3_J" +ENUMS.Storage.weapons.missiles.KD_20="weapons.missiles.KD-20" +ENUMS.Storage.weapons.missiles.AGM_86C="weapons.missiles.AGM_86C" +ENUMS.Storage.weapons.missiles.X_35="weapons.missiles.X_35" +ENUMS.Storage.weapons.bombs.MK106="weapons.bombs.MK106" +ENUMS.Storage.weapons.bombs.BETAB_500S="weapons.bombs.BETAB-500S" +ENUMS.Storage.weapons.nurs.C_5="weapons.nurs.C_5" +ENUMS.Storage.weapons.nurs.S_24B="weapons.nurs.S-24B" +ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk2="weapons.bombs.British_MC_500LB_Bomb_Mk2" +ENUMS.Storage.weapons.containers.ANAWW_13="weapons.containers.ANAWW_13" +ENUMS.Storage.weapons.droptanks.droptank_108_gal="weapons.droptanks.droptank_108_gal" +ENUMS.Storage.weapons.droptanks.DFT_300_GAL_A4E_LR="weapons.droptanks.DFT_300_GAL_A4E_LR" +ENUMS.Storage.weapons.bombs.CBU_87="weapons.bombs.CBU_87" +ENUMS.Storage.weapons.missiles.GAR_8="weapons.missiles.GAR-8" +ENUMS.Storage.weapons.bombs.BELOUGA="weapons.bombs.BELOUGA" +ENUMS.Storage.weapons.containers.EclairM_33="weapons.containers.{EclairM_33}" +ENUMS.Storage.weapons.bombs.ART_2S9_NONA_Air_19140lb="weapons.bombs.ART 2S9 NONA Air [19140lb]" +ENUMS.Storage.weapons.bombs.BR_250="weapons.bombs.BR_250" +ENUMS.Storage.weapons.bombs.IAB_500="weapons.bombs.IAB-500" +ENUMS.Storage.weapons.containers.AN_ASQ_228="weapons.containers.AN_ASQ_228" +ENUMS.Storage.weapons.missiles.P_27P="weapons.missiles.P_27P" +ENUMS.Storage.weapons.bombs.SD_250_Stg="weapons.bombs.SD_250_Stg" +ENUMS.Storage.weapons.missiles.R_530F_IR="weapons.missiles.R_530F_IR" +ENUMS.Storage.weapons.bombs.British_SAP_500LB_Bomb_Mk5="weapons.bombs.British_SAP_500LB_Bomb_Mk5" +ENUMS.Storage.weapons.bombs.FAB_250M54="weapons.bombs.FAB-250M54" +ENUMS.Storage.weapons.containers.M2KC_AAF="weapons.containers.{M2KC_AAF}" +ENUMS.Storage.weapons.missiles.CM_802AKG_AI="weapons.missiles.CM-802AKG_AI" +ENUMS.Storage.weapons.bombs.CBU_103="weapons.bombs.CBU_103" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_RED="weapons.containers.{US_M10_SMOKE_TANK_RED}" +ENUMS.Storage.weapons.missiles.X_29T="weapons.missiles.X_29T" +ENUMS.Storage.weapons.bombs.HEMTT_TFFT_34400lb="weapons.bombs.HEMTT TFFT [34400lb]" +ENUMS.Storage.weapons.missiles.C_701IR="weapons.missiles.C-701IR" +ENUMS.Storage.weapons.containers.fullCargoSeats="weapons.containers.fullCargoSeats" +ENUMS.Storage.weapons.bombs.GBU_15_V_31_B="weapons.bombs.GBU_15_V_31_B" +ENUMS.Storage.weapons.bombs.APC_M1043_HMMWV_Armament_Air_7023lb="weapons.bombs.APC M1043 HMMWV Armament Air [7023lb]" +ENUMS.Storage.weapons.missiles.PL_5EII="weapons.missiles.PL-5EII" +ENUMS.Storage.weapons.bombs.SC_250_T1_L2="weapons.bombs.SC_250_T1_L2" +ENUMS.Storage.weapons.torpedoes.mk46torp_name="weapons.torpedoes.mk46torp_name" +ENUMS.Storage.weapons.containers.F_15E_AAQ_33_XR_ATP_SE="weapons.containers.F-15E_AAQ-33_XR_ATP-SE" +ENUMS.Storage.weapons.missiles.AIM_7="weapons.missiles.AIM_7" +ENUMS.Storage.weapons.missiles.AGM_122="weapons.missiles.AGM_122" +ENUMS.Storage.weapons.bombs.HEBOMB="weapons.bombs.HEBOMB" +ENUMS.Storage.weapons.bombs.CBU_97="weapons.bombs.CBU_97" +ENUMS.Storage.weapons.bombs.MK_81SE="weapons.bombs.MK-81SE" +ENUMS.Storage.weapons.nurs.Zuni_127="weapons.nurs.Zuni_127" +ENUMS.Storage.weapons.containers.M2KC_AGF="weapons.containers.{M2KC_AGF}" +ENUMS.Storage.weapons.droptanks.Hercules_ExtFuelTank="weapons.droptanks.Hercules_ExtFuelTank" +ENUMS.Storage.weapons.containers.SMOKE_WHITE="weapons.containers.{SMOKE_WHITE}" +ENUMS.Storage.weapons.droptanks.droptank_150_gal="weapons.droptanks.droptank_150_gal" +ENUMS.Storage.weapons.nurs.HYDRA_70_WTU1B="weapons.nurs.HYDRA_70_WTU1B" +ENUMS.Storage.weapons.missiles.GB_6_SFW="weapons.missiles.GB-6-SFW" +ENUMS.Storage.weapons.missiles.KD_63="weapons.missiles.KD-63" +ENUMS.Storage.weapons.bombs.GBU_28="weapons.bombs.GBU_28" +ENUMS.Storage.weapons.nurs.C_8CM_YE="weapons.nurs.C_8CM_YE" +ENUMS.Storage.weapons.droptanks.HB_F14_EXT_DROPTANK="weapons.droptanks.HB_F14_EXT_DROPTANK" +ENUMS.Storage.weapons.missiles.Super_530F="weapons.missiles.Super_530F" +ENUMS.Storage.weapons.missiles.Ataka_9M220="weapons.missiles.Ataka_9M220" +ENUMS.Storage.weapons.bombs.BDU_33="weapons.bombs.BDU_33" +ENUMS.Storage.weapons.bombs.British_GP_250LB_Bomb_Mk4="weapons.bombs.British_GP_250LB_Bomb_Mk4" +ENUMS.Storage.weapons.missiles.TOW="weapons.missiles.TOW" +ENUMS.Storage.weapons.bombs.ATGM_M1045_HMMWV_TOW_Air_7183lb="weapons.bombs.ATGM M1045 HMMWV TOW Air [7183lb]" +ENUMS.Storage.weapons.missiles.X_25MR="weapons.missiles.X_25MR" +ENUMS.Storage.weapons.droptanks.fueltank230="weapons.droptanks.fueltank230" +ENUMS.Storage.weapons.droptanks.PTB_490C_MIG21="weapons.droptanks.PTB-490C-MIG21" +ENUMS.Storage.weapons.bombs.M1025_HMMWV_Air_6160lb="weapons.bombs.M1025 HMMWV Air [6160lb]" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_GREEN="weapons.nurs.SNEB_TYPE254_F1B_GREEN" +ENUMS.Storage.weapons.missiles.R_550="weapons.missiles.R_550" +ENUMS.Storage.weapons.bombs.KAB_1500LG="weapons.bombs.KAB_1500LG" +ENUMS.Storage.weapons.missiles.AGM_84D="weapons.missiles.AGM_84D" +ENUMS.Storage.weapons.missiles.YJ_83K="weapons.missiles.YJ-83K" +ENUMS.Storage.weapons.missiles.AIM_54C_Mk47="weapons.missiles.AIM_54C_Mk47" +ENUMS.Storage.weapons.missiles.BRM_1_90MM="weapons.missiles.BRM-1_90MM" +ENUMS.Storage.weapons.missiles.Ataka_9M120F="weapons.missiles.Ataka_9M120F" +ENUMS.Storage.weapons.droptanks.Eleven00L_Tank="weapons.droptanks.1100L Tank" +ENUMS.Storage.weapons.bombs.BAP_100="weapons.bombs.BAP_100" +ENUMS.Storage.weapons.adapters.lau_88="weapons.adapters.lau-88" +ENUMS.Storage.weapons.missiles.P_40T="weapons.missiles.P_40T" +ENUMS.Storage.weapons.missiles.GB_6="weapons.missiles.GB-6" +ENUMS.Storage.weapons.bombs.FAB_250M54TU="weapons.bombs.FAB-250M54TU" +ENUMS.Storage.weapons.missiles.DWS39_MJ1="weapons.missiles.DWS39_MJ1" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM-802AKG" +ENUMS.Storage.weapons.bombs.FAB_250="weapons.bombs.FAB_250" +ENUMS.Storage.weapons.missiles.C_802AK="weapons.missiles.C_802AK" +ENUMS.Storage.weapons.bombs.SD_500_A="weapons.bombs.SD_500_A" +ENUMS.Storage.weapons.bombs.GBU_32_V_2B="weapons.bombs.GBU_32_V_2B" +ENUMS.Storage.weapons.containers.marder="weapons.containers.marder" +ENUMS.Storage.weapons.missiles.ADM_141B="weapons.missiles.ADM_141B" +ENUMS.Storage.weapons.bombs.ROCKEYE="weapons.bombs.ROCKEYE" +ENUMS.Storage.weapons.missiles.BK90_MJ1="weapons.missiles.BK90_MJ1" +ENUMS.Storage.weapons.containers.BTR_80="weapons.containers.BTR-80" +ENUMS.Storage.weapons.bombs.SAM_ROLAND_ADS_34720lb="weapons.bombs.SAM ROLAND ADS [34720lb]" +ENUMS.Storage.weapons.containers.wmd7="weapons.containers.wmd7" +ENUMS.Storage.weapons.missiles.C_701T="weapons.missiles.C-701T" +ENUMS.Storage.weapons.missiles.AIM_7E_2="weapons.missiles.AIM-7E-2" +ENUMS.Storage.weapons.nurs.HVAR="weapons.nurs.HVAR" +ENUMS.Storage.weapons.containers.HMMWV_M1043="weapons.containers.HMMWV_M1043" +ENUMS.Storage.weapons.droptanks.PTB_800_MIG21="weapons.droptanks.PTB-800-MIG21" +ENUMS.Storage.weapons.missiles.AGM_114="weapons.missiles.AGM_114" +ENUMS.Storage.weapons.bombs.APC_M1126_Stryker_ICV_29542lb="weapons.bombs.APC M1126 Stryker ICV [29542lb]" +ENUMS.Storage.weapons.bombs.APC_M113_Air_21624lb="weapons.bombs.APC M113 Air [21624lb]" +ENUMS.Storage.weapons.bombs.M_117="weapons.bombs.M_117" +ENUMS.Storage.weapons.missiles.AGM_65D="weapons.missiles.AGM_65D" +ENUMS.Storage.weapons.droptanks.MB339_TT320_L="weapons.droptanks.MB339_TT320_L" +ENUMS.Storage.weapons.missiles.AGM_86="weapons.missiles.AGM_86" +ENUMS.Storage.weapons.bombs.BDU_45LGB="weapons.bombs.BDU_45LGB" +ENUMS.Storage.weapons.missiles.AGM_65H="weapons.missiles.AGM_65H" +ENUMS.Storage.weapons.nurs.RS_82="weapons.nurs.RS-82" +ENUMS.Storage.weapons.nurs.SNEB_TYPE252_F1B="weapons.nurs.SNEB_TYPE252_F1B" +ENUMS.Storage.weapons.bombs.BL_755="weapons.bombs.BL_755" +ENUMS.Storage.weapons.containers.F_15E_AAQ_28_LITENING="weapons.containers.F-15E_AAQ-28_LITENING" +ENUMS.Storage.weapons.nurs.SNEB_TYPE256_F1B="weapons.nurs.SNEB_TYPE256_F1B" +ENUMS.Storage.weapons.missiles.AGM_84H="weapons.missiles.AGM_84H" +ENUMS.Storage.weapons.missiles.AIM_54="weapons.missiles.AIM_54" +ENUMS.Storage.weapons.missiles.X_31A="weapons.missiles.X_31A" +ENUMS.Storage.weapons.bombs.KAB_500Kr="weapons.bombs.KAB_500Kr" +ENUMS.Storage.weapons.containers.SPS_141_100="weapons.containers.SPS-141-100" +ENUMS.Storage.weapons.missiles.BK90_MJ2="weapons.missiles.BK90_MJ2" +ENUMS.Storage.weapons.missiles.Super_530D="weapons.missiles.Super_530D" +ENUMS.Storage.weapons.bombs.CBU_52B="weapons.bombs.CBU_52B" +ENUMS.Storage.weapons.droptanks.PTB_450="weapons.droptanks.PTB-450" +ENUMS.Storage.weapons.bombs.IFV_MCV_80_34720lb="weapons.bombs.IFV MCV-80 [34720lb]" +ENUMS.Storage.weapons.containers.Two_c9="weapons.containers.2-c9" +ENUMS.Storage.weapons.missiles.AIM_9JULI="weapons.missiles.AIM-9JULI" +ENUMS.Storage.weapons.droptanks.MB339_TT500_R="weapons.droptanks.MB339_TT500_R" +ENUMS.Storage.weapons.nurs.C_8CM="weapons.nurs.C_8CM" +ENUMS.Storage.weapons.containers.BARAX="weapons.containers.BARAX" +ENUMS.Storage.weapons.missiles.P_40R="weapons.missiles.P_40R" +ENUMS.Storage.weapons.missiles.YJ_12="weapons.missiles.YJ-12" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM_802AKG" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_YELLOW="weapons.nurs.SNEB_TYPE254_H1_YELLOW" +ENUMS.Storage.weapons.bombs.Durandal="weapons.bombs.Durandal" +ENUMS.Storage.weapons.droptanks.i16_eft="weapons.droptanks.i16_eft" +ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D_EMPTY="weapons.droptanks.AV8BNA_AERO1D_EMPTY" +ENUMS.Storage.weapons.containers.Hercules_Battle_Station_TGP="weapons.containers.Hercules_Battle_Station_TGP" +ENUMS.Storage.weapons.nurs.C_8CM_VT="weapons.nurs.C_8CM_VT" +ENUMS.Storage.weapons.missiles.PL_12="weapons.missiles.PL-12" +ENUMS.Storage.weapons.missiles.R_3R="weapons.missiles.R-3R" +ENUMS.Storage.weapons.bombs.GBU_54_V_1B="weapons.bombs.GBU_54_V_1B" +ENUMS.Storage.weapons.droptanks.MB339_TT320_R="weapons.droptanks.MB339_TT320_R" +ENUMS.Storage.weapons.bombs.RN_24="weapons.bombs.RN-24" +ENUMS.Storage.weapons.containers.Twoc6m="weapons.containers.2c6m" +ENUMS.Storage.weapons.bombs.ARV_BRDM_2_Air_12320lb="weapons.bombs.ARV BRDM-2 Air [12320lb]" +ENUMS.Storage.weapons.bombs.ARV_BRDM_2_Skid_12210lb="weapons.bombs.ARV BRDM-2 Skid [12210lb]" +ENUMS.Storage.weapons.nurs.SNEB_TYPE251_F1B="weapons.nurs.SNEB_TYPE251_F1B" +ENUMS.Storage.weapons.missiles.X_41="weapons.missiles.X_41" +ENUMS.Storage.weapons.containers.MIG21_SMOKE_WHITE="weapons.containers.{MIG21_SMOKE_WHITE}" +ENUMS.Storage.weapons.bombs.MK_82AIR="weapons.bombs.MK_82AIR" +ENUMS.Storage.weapons.missiles.R_530F_EM="weapons.missiles.R_530F_EM" +ENUMS.Storage.weapons.bombs.SAMP400LD="weapons.bombs.SAMP400LD" +ENUMS.Storage.weapons.bombs.FAB_50="weapons.bombs.FAB_50" +ENUMS.Storage.weapons.bombs.AB_250_2_SD_10A="weapons.bombs.AB_250_2_SD_10A" +ENUMS.Storage.weapons.missiles.ADM_141A="weapons.missiles.ADM_141A" +ENUMS.Storage.weapons.containers.KBpod="weapons.containers.KBpod" +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4="weapons.bombs.British_GP_500LB_Bomb_Mk4" +ENUMS.Storage.weapons.missiles.AGM_65E="weapons.missiles.AGM_65E" +ENUMS.Storage.weapons.containers.sa342_dipole_antenna="weapons.containers.sa342_dipole_antenna" +ENUMS.Storage.weapons.bombs.OFAB_100_Jupiter="weapons.bombs.OFAB-100 Jupiter" +ENUMS.Storage.weapons.nurs.SNEB_TYPE257_F1B="weapons.nurs.SNEB_TYPE257_F1B" +ENUMS.Storage.weapons.missiles.Rb_04E_for_A_I="weapons.missiles.Rb 04E (for A.I.)" +ENUMS.Storage.weapons.bombs.AN_M66A2="weapons.bombs.AN-M66A2" +ENUMS.Storage.weapons.missiles.P_27T="weapons.missiles.P_27T" +ENUMS.Storage.weapons.droptanks.LNS_VIG_XTANK="weapons.droptanks.LNS_VIG_XTANK" +ENUMS.Storage.weapons.missiles.R_55="weapons.missiles.R-55" +ENUMS.Storage.weapons.torpedoes.YU_6="weapons.torpedoes.YU-6" +ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk2="weapons.bombs.British_MC_250LB_Bomb_Mk2" +ENUMS.Storage.weapons.droptanks.PTB_120_F86F35="weapons.droptanks.PTB_120_F86F35" +ENUMS.Storage.weapons.missiles.PL_8B="weapons.missiles.PL-8B" +ENUMS.Storage.weapons.droptanks.F_15E_Drop_Tank_Empty="weapons.droptanks.F-15E_Drop_Tank_Empty" +ENUMS.Storage.weapons.nurs.British_HE_60LBFNo1_3INCHNo1="weapons.nurs.British_HE_60LBFNo1_3INCHNo1" +ENUMS.Storage.weapons.missiles.P_77="weapons.missiles.P_77" +ENUMS.Storage.weapons.torpedoes.LTF_5B="weapons.torpedoes.LTF_5B" +ENUMS.Storage.weapons.missiles.R_3S="weapons.missiles.R-3S" +ENUMS.Storage.weapons.nurs.SNEB_TYPE253_H1="weapons.nurs.SNEB_TYPE253_H1" +ENUMS.Storage.weapons.missiles.PL_8A="weapons.missiles.PL-8A" +ENUMS.Storage.weapons.bombs.APC_BTR_82A_Skid_24888lb="weapons.bombs.APC BTR-82A Skid [24888lb]" +ENUMS.Storage.weapons.containers.Sborka="weapons.containers.Sborka" +ENUMS.Storage.weapons.missiles.AGM_65L="weapons.missiles.AGM_65L" +ENUMS.Storage.weapons.missiles.X_28="weapons.missiles.X_28" +ENUMS.Storage.weapons.missiles.TGM_65G="weapons.missiles.TGM_65G" +ENUMS.Storage.weapons.nurs.SNEB_TYPE257_H1="weapons.nurs.SNEB_TYPE257_H1" +ENUMS.Storage.weapons.missiles.RB75B="weapons.missiles.RB75B" +ENUMS.Storage.weapons.missiles.X_25ML="weapons.missiles.X_25ML" +ENUMS.Storage.weapons.droptanks.FPU_8A="weapons.droptanks.FPU_8A" +ENUMS.Storage.weapons.bombs.BLG66="weapons.bombs.BLG66" +ENUMS.Storage.weapons.nurs.C_8CM_RD="weapons.nurs.C_8CM_RD" +ENUMS.Storage.weapons.containers.EclairM_06="weapons.containers.{EclairM_06}" +ENUMS.Storage.weapons.bombs.RBK_500AO="weapons.bombs.RBK_500AO" +ENUMS.Storage.weapons.missiles.AIM_9P="weapons.missiles.AIM-9P" +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk4_Short="weapons.bombs.British_GP_500LB_Bomb_Mk4_Short" +ENUMS.Storage.weapons.containers.MB339_Vinten="weapons.containers.MB339_Vinten" +ENUMS.Storage.weapons.missiles.Rb_15F="weapons.missiles.Rb 15F" +ENUMS.Storage.weapons.nurs.ARAKM70BHE="weapons.nurs.ARAKM70BHE" +ENUMS.Storage.weapons.bombs.AAA_Vulcan_M163_Air_21666lb="weapons.bombs.AAA Vulcan M163 Air [21666lb]" +ENUMS.Storage.weapons.missiles.X_29L="weapons.missiles.X_29L" +ENUMS.Storage.weapons.containers.F14_LANTIRN_TP="weapons.containers.{F14-LANTIRN-TP}" +ENUMS.Storage.weapons.bombs.FAB_250_M62="weapons.bombs.FAB-250-M62" +ENUMS.Storage.weapons.missiles.AIM_120C="weapons.missiles.AIM_120C" +ENUMS.Storage.weapons.bombs.EWR_SBORKA_Air_21624lb="weapons.bombs.EWR SBORKA Air [21624lb]" +ENUMS.Storage.weapons.bombs.SAMP250LD="weapons.bombs.SAMP250LD" +ENUMS.Storage.weapons.droptanks.Spitfire_slipper_tank="weapons.droptanks.Spitfire_slipper_tank" +ENUMS.Storage.weapons.missiles.LS_6_500="weapons.missiles.LS-6-500" +ENUMS.Storage.weapons.bombs.GBU_31_V_4B="weapons.bombs.GBU_31_V_4B" +ENUMS.Storage.weapons.droptanks.PTB400_MIG15="weapons.droptanks.PTB400_MIG15" +ENUMS.Storage.weapons.containers.m_113="weapons.containers.m-113" +ENUMS.Storage.weapons.bombs.SPG_M1128_Stryker_MGS_33036lb="weapons.bombs.SPG M1128 Stryker MGS [33036lb]" +ENUMS.Storage.weapons.missiles.AIM_9L="weapons.missiles.AIM-9L" +ENUMS.Storage.weapons.missiles.AIM_9X="weapons.missiles.AIM_9X" +ENUMS.Storage.weapons.nurs.C_8="weapons.nurs.C_8" +ENUMS.Storage.weapons.bombs.SAM_CHAPARRAL_Skid_21516lb="weapons.bombs.SAM CHAPARRAL Skid [21516lb]" +ENUMS.Storage.weapons.missiles.P_27TE="weapons.missiles.P_27TE" +ENUMS.Storage.weapons.bombs.ODAB_500PM="weapons.bombs.ODAB-500PM" +ENUMS.Storage.weapons.bombs.MK77mod1_WPN="weapons.bombs.MK77mod1-WPN" +ENUMS.Storage.weapons.droptanks.PTB400_MIG19="weapons.droptanks.PTB400_MIG19" +ENUMS.Storage.weapons.torpedoes.Mark_46="weapons.torpedoes.Mark_46" +ENUMS.Storage.weapons.containers.rightSeat="weapons.containers.rightSeat" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_ORANGE="weapons.containers.{US_M10_SMOKE_TANK_ORANGE}" +ENUMS.Storage.weapons.bombs.SAB_100MN="weapons.bombs.SAB_100MN" +ENUMS.Storage.weapons.nurs.FFAR_Mk5_HEAT="weapons.nurs.FFAR Mk5 HEAT" +ENUMS.Storage.weapons.bombs.IFV_TPZ_FUCH_33440lb="weapons.bombs.IFV TPZ FUCH [33440lb]" +ENUMS.Storage.weapons.bombs.IFV_M2A2_Bradley_34720lb="weapons.bombs.IFV M2A2 Bradley [34720lb]" +ENUMS.Storage.weapons.bombs.MK77mod0_WPN="weapons.bombs.MK77mod0-WPN" +ENUMS.Storage.weapons.containers.ASO_2="weapons.containers.ASO-2" +ENUMS.Storage.weapons.bombs.Mk_84AIR_GP="weapons.bombs.Mk_84AIR_GP" +ENUMS.Storage.weapons.nurs.S_24A="weapons.nurs.S-24A" +ENUMS.Storage.weapons.bombs.RBK_250_275_AO_1SCH="weapons.bombs.RBK_250_275_AO_1SCH" +ENUMS.Storage.weapons.bombs.Transport_Tigr_Skid_15730lb="weapons.bombs.Transport Tigr Skid [15730lb]" +ENUMS.Storage.weapons.missiles.AIM_7F="weapons.missiles.AIM-7F" +ENUMS.Storage.weapons.bombs.CBU_99="weapons.bombs.CBU_99" +ENUMS.Storage.weapons.bombs.LUU_2B="weapons.bombs.LUU_2B" +ENUMS.Storage.weapons.bombs.FAB_500TA="weapons.bombs.FAB-500TA" +ENUMS.Storage.weapons.missiles.AGR_20_M282="weapons.missiles.AGR_20_M282" +ENUMS.Storage.weapons.droptanks.MB339_FT330="weapons.droptanks.MB339_FT330" +ENUMS.Storage.weapons.bombs.SAMP125LD="weapons.bombs.SAMP125LD" +ENUMS.Storage.weapons.missiles.X_25MP="weapons.missiles.X_25MP" +ENUMS.Storage.weapons.nurs.SNEB_TYPE252_H1="weapons.nurs.SNEB_TYPE252_H1" +ENUMS.Storage.weapons.missiles.AGM_65F="weapons.missiles.AGM_65F" +ENUMS.Storage.weapons.missiles.AIM_9P5="weapons.missiles.AIM-9P5" +ENUMS.Storage.weapons.bombs.Transport_Tigr_Air_15900lb="weapons.bombs.Transport Tigr Air [15900lb]" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_H1_RED="weapons.nurs.SNEB_TYPE254_H1_RED" +ENUMS.Storage.weapons.nurs.FFAR_Mk1_HE="weapons.nurs.FFAR Mk1 HE" +ENUMS.Storage.weapons.nurs.SPRD_99="weapons.nurs.SPRD-99" +ENUMS.Storage.weapons.bombs.BIN_200="weapons.bombs.BIN_200" +ENUMS.Storage.weapons.bombs.BLU_4B_GROUP="weapons.bombs.BLU_4B_GROUP" +ENUMS.Storage.weapons.bombs.GBU_24="weapons.bombs.GBU_24" +ENUMS.Storage.weapons.missiles.Rb_04E="weapons.missiles.Rb 04E" +ENUMS.Storage.weapons.missiles.Rb_74="weapons.missiles.Rb 74" +ENUMS.Storage.weapons.containers.leftSeat="weapons.containers.leftSeat" +ENUMS.Storage.weapons.bombs.LS_6_100="weapons.bombs.LS-6-100" +ENUMS.Storage.weapons.bombs.Transport_URAL_375_14815lb="weapons.bombs.Transport URAL-375 [14815lb]" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_GREEN="weapons.containers.{US_M10_SMOKE_TANK_GREEN}" +ENUMS.Storage.weapons.missiles.X_22="weapons.missiles.X_22" +ENUMS.Storage.weapons.containers.FAS="weapons.containers.FAS" +ENUMS.Storage.weapons.nurs.S_25_O="weapons.nurs.S-25-O" +ENUMS.Storage.weapons.droptanks.para="weapons.droptanks.para" +ENUMS.Storage.weapons.droptanks.F_15E_Drop_Tank="weapons.droptanks.F-15E_Drop_Tank" +ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541_EMPTY="weapons.droptanks.M2KC_08_RPL541_EMPTY" +ENUMS.Storage.weapons.missiles.X_31P="weapons.missiles.X_31P" +ENUMS.Storage.weapons.bombs.RBK_500U="weapons.bombs.RBK_500U" +ENUMS.Storage.weapons.missiles.AIM_54A_Mk47="weapons.missiles.AIM_54A_Mk47" +ENUMS.Storage.weapons.droptanks.oiltank="weapons.droptanks.oiltank" +ENUMS.Storage.weapons.missiles.AGM_154B="weapons.missiles.AGM_154B" +ENUMS.Storage.weapons.containers.MB339_SMOKE_POD="weapons.containers.MB339_SMOKE-POD" +ENUMS.Storage.weapons.containers.ECM_POD_L_175V="weapons.containers.{ECM_POD_L_175V}" +ENUMS.Storage.weapons.droptanks.PTB_580G_F1="weapons.droptanks.PTB_580G_F1" +ENUMS.Storage.weapons.containers.EclairM_15="weapons.containers.{EclairM_15}" +ENUMS.Storage.weapons.containers.F_15E_AAQ_13_LANTIRN="weapons.containers.F-15E_AAQ-13_LANTIRN" +ENUMS.Storage.weapons.droptanks.Eight00L_Tank_Empty="weapons.droptanks.800L Tank Empty" +ENUMS.Storage.weapons.containers.One6c_hts_pod="weapons.containers.16c_hts_pod" +ENUMS.Storage.weapons.bombs.AN_M81="weapons.bombs.AN-M81" +ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_100gal="weapons.droptanks.Mosquito_Drop_Tank_100gal" +ENUMS.Storage.weapons.droptanks.Mosquito_Drop_Tank_50gal="weapons.droptanks.Mosquito_Drop_Tank_50gal" +ENUMS.Storage.weapons.droptanks.DFT_150_GAL_A4E="weapons.droptanks.DFT_150_GAL_A4E" +ENUMS.Storage.weapons.missiles.AIM_9="weapons.missiles.AIM_9" +ENUMS.Storage.weapons.bombs.IFV_BTR_D_Air_18040lb="weapons.bombs.IFV BTR-D Air [18040lb]" +ENUMS.Storage.weapons.containers.EclairM_42="weapons.containers.{EclairM_42}" +ENUMS.Storage.weapons.bombs.KAB_1500T="weapons.bombs.KAB_1500T" +ENUMS.Storage.weapons.droptanks.PTB_490_MIG21="weapons.droptanks.PTB-490-MIG21" +ENUMS.Storage.weapons.droptanks.PTB_200_F86F35="weapons.droptanks.PTB_200_F86F35" +ENUMS.Storage.weapons.droptanks.PTB760_MIG19="weapons.droptanks.PTB760_MIG19" +ENUMS.Storage.weapons.bombs.GBU_43_B_MOAB="weapons.bombs.GBU-43/B(MOAB)" +ENUMS.Storage.weapons.torpedoes.G7A_T1="weapons.torpedoes.G7A_T1" +ENUMS.Storage.weapons.bombs.IFV_BMD_1_Air_18040lb="weapons.bombs.IFV BMD-1 Air [18040lb]" +ENUMS.Storage.weapons.bombs.SAM_LINEBACKER_34720lb="weapons.bombs.SAM LINEBACKER [34720lb]" +ENUMS.Storage.weapons.containers.ais_pod_t50_r="weapons.containers.ais-pod-t50_r" +ENUMS.Storage.weapons.containers.CE2_SMOKE_WHITE="weapons.containers.{CE2_SMOKE_WHITE}" +ENUMS.Storage.weapons.droptanks.fuel_tank_230="weapons.droptanks.fuel_tank_230" +ENUMS.Storage.weapons.droptanks.M2KC_RPL_522="weapons.droptanks.M2KC_RPL_522" +ENUMS.Storage.weapons.missiles.AGM_130="weapons.missiles.AGM_130" +ENUMS.Storage.weapons.droptanks.Eight00L_Tank="weapons.droptanks.800L Tank" +ENUMS.Storage.weapons.bombs.IFV_BTR_D_Skid_17930lb="weapons.bombs.IFV BTR-D Skid [17930lb]" +ENUMS.Storage.weapons.containers.bmp_1="weapons.containers.bmp-1" +ENUMS.Storage.weapons.bombs.GBU_31="weapons.bombs.GBU_31" +ENUMS.Storage.weapons.containers.aaq_28LEFT_litening="weapons.containers.aaq-28LEFT litening" +ENUMS.Storage.weapons.missiles.Kh_66_Grom="weapons.missiles.Kh-66_Grom" +ENUMS.Storage.weapons.containers.MIG21_SMOKE_RED="weapons.containers.{MIG21_SMOKE_RED}" +ENUMS.Storage.weapons.containers.U22="weapons.containers.U22" +ENUMS.Storage.weapons.bombs.IFV_BMD_1_Skid_17930lb="weapons.bombs.IFV BMD-1 Skid [17930lb]" +ENUMS.Storage.weapons.droptanks.Bidon="weapons.droptanks.Bidon" +ENUMS.Storage.weapons.bombs.GBU_31_V_2B="weapons.bombs.GBU_31_V_2B" +ENUMS.Storage.weapons.bombs.Mk_82Y="weapons.bombs.Mk_82Y" +ENUMS.Storage.weapons.containers.pl5eii="weapons.containers.pl5eii" +ENUMS.Storage.weapons.bombs.RBK_500U_OAB_2_5RT="weapons.bombs.RBK_500U_OAB_2_5RT" +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk5="weapons.bombs.British_GP_500LB_Bomb_Mk5" +ENUMS.Storage.weapons.containers.Eclair="weapons.containers.{Eclair}" +ENUMS.Storage.weapons.nurs.S5MO_HEFRAG_FFAR="weapons.nurs.S5MO_HEFRAG_FFAR" +ENUMS.Storage.weapons.bombs.BETAB_500M="weapons.bombs.BETAB-500M" +ENUMS.Storage.weapons.bombs.Transport_M818_16000lb="weapons.bombs.Transport M818 [16000lb]" +ENUMS.Storage.weapons.bombs.British_MC_250LB_Bomb_Mk1="weapons.bombs.British_MC_250LB_Bomb_Mk1" +ENUMS.Storage.weapons.nurs.SNEB_TYPE251_H1="weapons.nurs.SNEB_TYPE251_H1" +ENUMS.Storage.weapons.bombs.TYPE_200A="weapons.bombs.TYPE-200A" +ENUMS.Storage.weapons.nurs.HYDRA_70_M151="weapons.nurs.HYDRA_70_M151" +ENUMS.Storage.weapons.bombs.IFV_BMP_3_32912lb="weapons.bombs.IFV BMP-3 [32912lb]" +ENUMS.Storage.weapons.bombs.APC_MTLB_Air_26400lb="weapons.bombs.APC MTLB Air [26400lb]" +ENUMS.Storage.weapons.nurs.HYDRA_70_M229="weapons.nurs.HYDRA_70_M229" +ENUMS.Storage.weapons.bombs.BDU_45="weapons.bombs.BDU_45" +ENUMS.Storage.weapons.bombs.OFAB_100_120TU="weapons.bombs.OFAB-100-120TU" +ENUMS.Storage.weapons.missiles.AIM_9J="weapons.missiles.AIM-9J" +ENUMS.Storage.weapons.nurs.ARF8M3API="weapons.nurs.ARF8M3API" +ENUMS.Storage.weapons.bombs.BetAB_500ShP="weapons.bombs.BetAB_500ShP" +ENUMS.Storage.weapons.nurs.C_8OFP2="weapons.nurs.C_8OFP2" +ENUMS.Storage.weapons.bombs.GBU_10="weapons.bombs.GBU_10" +ENUMS.Storage.weapons.bombs.APC_MTLB_Skid_26290lb="weapons.bombs.APC MTLB Skid [26290lb]" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_RED="weapons.nurs.SNEB_TYPE254_F1B_RED" +ENUMS.Storage.weapons.missiles.X_65="weapons.missiles.X_65" +ENUMS.Storage.weapons.missiles.R_550_M1="weapons.missiles.R_550_M1" +ENUMS.Storage.weapons.missiles.AGM_65K="weapons.missiles.AGM_65K" +ENUMS.Storage.weapons.nurs.SNEB_TYPE254_F1B_YELLOW="weapons.nurs.SNEB_TYPE254_F1B_YELLOW" +ENUMS.Storage.weapons.missiles.AGM_88="weapons.missiles.AGM_88" +ENUMS.Storage.weapons.nurs.C_8OM="weapons.nurs.C_8OM" +ENUMS.Storage.weapons.bombs.SAM_ROLAND_LN_34720b="weapons.bombs.SAM ROLAND LN [34720b]" +ENUMS.Storage.weapons.missiles.AIM_120="weapons.missiles.AIM_120" +ENUMS.Storage.weapons.missiles.HOT3_MBDA="weapons.missiles.HOT3_MBDA" +ENUMS.Storage.weapons.missiles.R_13M="weapons.missiles.R-13M" +ENUMS.Storage.weapons.missiles.AIM_54C_Mk60="weapons.missiles.AIM_54C_Mk60" +ENUMS.Storage.weapons.bombs.AAA_GEPARD_34720lb="weapons.bombs.AAA GEPARD [34720lb]" +ENUMS.Storage.weapons.missiles.R_13M1="weapons.missiles.R-13M1" +ENUMS.Storage.weapons.bombs.APC_Cobra_Air_10912lb="weapons.bombs.APC Cobra Air [10912lb]" +ENUMS.Storage.weapons.bombs.RBK_250="weapons.bombs.RBK_250" +ENUMS.Storage.weapons.bombs.SC_500_J="weapons.bombs.SC_500_J" +ENUMS.Storage.weapons.missiles.AGM_114K="weapons.missiles.AGM_114K" +ENUMS.Storage.weapons.missiles.ALARM="weapons.missiles.ALARM" +ENUMS.Storage.weapons.bombs.Mk_83="weapons.bombs.Mk_83" +ENUMS.Storage.weapons.missiles.AGM_65B="weapons.missiles.AGM_65B" +ENUMS.Storage.weapons.bombs.MK_82SNAKEYE="weapons.bombs.MK_82SNAKEYE" +ENUMS.Storage.weapons.nurs.HYDRA_70_MK1="weapons.nurs.HYDRA_70_MK1" +ENUMS.Storage.weapons.bombs.BLG66_BELOUGA="weapons.bombs.BLG66_BELOUGA" +ENUMS.Storage.weapons.containers.EclairM_51="weapons.containers.{EclairM_51}" +ENUMS.Storage.weapons.missiles.AIM_54A_Mk60="weapons.missiles.AIM_54A_Mk60" +ENUMS.Storage.weapons.droptanks.DFT_300_GAL_A4E="weapons.droptanks.DFT_300_GAL_A4E" +ENUMS.Storage.weapons.bombs.ATGM_M1134_Stryker_30337lb="weapons.bombs.ATGM M1134 Stryker [30337lb]" +ENUMS.Storage.weapons.bombs.BAT_120="weapons.bombs.BAT-120" +ENUMS.Storage.weapons.missiles.DWS39_MJ1_MJ2="weapons.missiles.DWS39_MJ1_MJ2" +ENUMS.Storage.weapons.containers.SPRD="weapons.containers.SPRD" +ENUMS.Storage.weapons.bombs.BR_500="weapons.bombs.BR_500" +ENUMS.Storage.weapons.bombs.British_GP_500LB_Bomb_Mk1="weapons.bombs.British_GP_500LB_Bomb_Mk1" +ENUMS.Storage.weapons.bombs.BDU_50HD="weapons.bombs.BDU_50HD" +ENUMS.Storage.weapons.missiles.RS2US="weapons.missiles.RS2US" +ENUMS.Storage.weapons.bombs.IFV_BMP_2_25168lb="weapons.bombs.IFV BMP-2 [25168lb]" +ENUMS.Storage.weapons.bombs.SAMP400HD="weapons.bombs.SAMP400HD" +ENUMS.Storage.weapons.containers.Hercules_Battle_Station="weapons.containers.Hercules_Battle_Station" +ENUMS.Storage.weapons.bombs.AN_M64="weapons.bombs.AN_M64" +ENUMS.Storage.weapons.containers.rearCargoSeats="weapons.containers.rearCargoSeats" +ENUMS.Storage.weapons.bombs.Mk_82="weapons.bombs.Mk_82" +ENUMS.Storage.weapons.missiles.AKD_10="weapons.missiles.AKD-10" +ENUMS.Storage.weapons.bombs.BDU_50LGB="weapons.bombs.BDU_50LGB" +ENUMS.Storage.weapons.missiles.SD_10="weapons.missiles.SD-10" +ENUMS.Storage.weapons.containers.IRDeflector="weapons.containers.IRDeflector" +ENUMS.Storage.weapons.bombs.FAB_500="weapons.bombs.FAB_500" +ENUMS.Storage.weapons.bombs.KAB_500="weapons.bombs.KAB_500" +ENUMS.Storage.weapons.nurs.S_5M="weapons.nurs.S-5M" +ENUMS.Storage.weapons.missiles.MICA_R="weapons.missiles.MICA_R" +ENUMS.Storage.weapons.missiles.X_59M="weapons.missiles.X_59M" +ENUMS.Storage.weapons.nurs.UG_90MM="weapons.nurs.UG_90MM" +ENUMS.Storage.weapons.bombs.LYSBOMB="weapons.bombs.LYSBOMB" +ENUMS.Storage.weapons.nurs.R4M="weapons.nurs.R4M" +ENUMS.Storage.weapons.containers.dlpod_akg="weapons.containers.dlpod_akg" +ENUMS.Storage.weapons.missiles.LD_10="weapons.missiles.LD-10" +ENUMS.Storage.weapons.bombs.SC_50="weapons.bombs.SC_50" +ENUMS.Storage.weapons.nurs.HYDRA_70_MK5="weapons.nurs.HYDRA_70_MK5" +ENUMS.Storage.weapons.bombs.FAB_100M="weapons.bombs.FAB_100M" +ENUMS.Storage.weapons.missiles.Rb_24="weapons.missiles.Rb 24" +ENUMS.Storage.weapons.bombs.BDU_45B="weapons.bombs.BDU_45B" +ENUMS.Storage.weapons.missiles.GB_6_HE="weapons.missiles.GB-6-HE" +ENUMS.Storage.weapons.missiles.KD_63B="weapons.missiles.KD-63B" +ENUMS.Storage.weapons.missiles.P_27PE="weapons.missiles.P_27PE" +ENUMS.Storage.weapons.droptanks.PTB300_MIG15="weapons.droptanks.PTB300_MIG15" +ENUMS.Storage.weapons.bombs.Two50_3="weapons.bombs.250-3" +ENUMS.Storage.weapons.bombs.SC_500_L2="weapons.bombs.SC_500_L2" +ENUMS.Storage.weapons.containers.HMMWV_M1045="weapons.containers.HMMWV_M1045" +ENUMS.Storage.weapons.bombs.FAB_500M54TU="weapons.bombs.FAB-500M54TU" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_YELLOW="weapons.containers.{US_M10_SMOKE_TANK_YELLOW}" +ENUMS.Storage.weapons.containers.EclairM_60="weapons.containers.{EclairM_60}" +ENUMS.Storage.weapons.bombs.SAB_250_200="weapons.bombs.SAB_250_200" +ENUMS.Storage.weapons.bombs.FAB_100="weapons.bombs.FAB_100" +ENUMS.Storage.weapons.bombs.KAB_500S="weapons.bombs.KAB_500S" +ENUMS.Storage.weapons.missiles.AGM_45A="weapons.missiles.AGM_45A" +ENUMS.Storage.weapons.missiles.Kh25MP_PRGS1VP="weapons.missiles.Kh25MP_PRGS1VP" +ENUMS.Storage.weapons.nurs.S5M1_HEFRAG_FFAR="weapons.nurs.S5M1_HEFRAG_FFAR" +ENUMS.Storage.weapons.containers.kg600="weapons.containers.kg600" +ENUMS.Storage.weapons.bombs.AN_M65="weapons.bombs.AN_M65" +ENUMS.Storage.weapons.bombs.AN_M57="weapons.bombs.AN_M57" +ENUMS.Storage.weapons.bombs.BLU_3B_GROUP="weapons.bombs.BLU_3B_GROUP" +ENUMS.Storage.weapons.bombs.BAP_100="weapons.bombs.BAP-100" +ENUMS.Storage.weapons.containers.HEMTT="weapons.containers.HEMTT" +ENUMS.Storage.weapons.bombs.British_MC_500LB_Bomb_Mk1_Short="weapons.bombs.British_MC_500LB_Bomb_Mk1_Short" +ENUMS.Storage.weapons.nurs.ARAKM70BAP="weapons.nurs.ARAKM70BAP" +ENUMS.Storage.weapons.missiles.AGM_119="weapons.missiles.AGM_119" +ENUMS.Storage.weapons.missiles.MMagicII="weapons.missiles.MMagicII" +ENUMS.Storage.weapons.bombs.AB_500_1_SD_10A="weapons.bombs.AB_500_1_SD_10A" +ENUMS.Storage.weapons.nurs.HYDRA_70_M282="weapons.nurs.HYDRA_70_M282" +ENUMS.Storage.weapons.droptanks.DFT_400_GAL_A4E="weapons.droptanks.DFT_400_GAL_A4E" +ENUMS.Storage.weapons.nurs.HYDRA_70_M257="weapons.nurs.HYDRA_70_M257" +ENUMS.Storage.weapons.droptanks.AV8BNA_AERO1D="weapons.droptanks.AV8BNA_AERO1D" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_BLUE="weapons.containers.{US_M10_SMOKE_TANK_BLUE}" +ENUMS.Storage.weapons.nurs.ARF8M3HEI="weapons.nurs.ARF8M3HEI" +ENUMS.Storage.weapons.bombs.RN_28="weapons.bombs.RN-28" +ENUMS.Storage.weapons.bombs.Squad_30_x_Soldier_7950lb="weapons.bombs.Squad 30 x Soldier [7950lb]" +ENUMS.Storage.weapons.containers.uaz_469="weapons.containers.uaz-469" +ENUMS.Storage.weapons.containers.Otokar_Cobra="weapons.containers.Otokar_Cobra" +ENUMS.Storage.weapons.bombs.APC_BTR_82A_Air_24998lb="weapons.bombs.APC BTR-82A Air [24998lb]" +ENUMS.Storage.weapons.nurs.HYDRA_70_M274="weapons.nurs.HYDRA_70_M274" +ENUMS.Storage.weapons.missiles.P_24R="weapons.missiles.P_24R" +ENUMS.Storage.weapons.nurs.HYDRA_70_MK61="weapons.nurs.HYDRA_70_MK61" +ENUMS.Storage.weapons.missiles.Igla_1E="weapons.missiles.Igla_1E" +ENUMS.Storage.weapons.missiles.C_802AK="weapons.missiles.C-802AK" +ENUMS.Storage.weapons.nurs.C_24="weapons.nurs.C_24" +ENUMS.Storage.weapons.droptanks.M2KC_08_RPL541="weapons.droptanks.M2KC_08_RPL541" +ENUMS.Storage.weapons.nurs.C_13="weapons.nurs.C_13" +ENUMS.Storage.weapons.droptanks.droptank_110_gal="weapons.droptanks.droptank_110_gal" +ENUMS.Storage.weapons.bombs.Mk_84="weapons.bombs.Mk_84" +ENUMS.Storage.weapons.missiles.Sea_Eagle="weapons.missiles.Sea_Eagle" +ENUMS.Storage.weapons.droptanks.PTB_1200_F1="weapons.droptanks.PTB_1200_F1" +ENUMS.Storage.weapons.nurs.SNEB_TYPE256_H1="weapons.nurs.SNEB_TYPE256_H1" +ENUMS.Storage.weapons.containers.MATRA_PHIMAT="weapons.containers.MATRA-PHIMAT" +ENUMS.Storage.weapons.containers.smoke_pod="weapons.containers.smoke_pod" +ENUMS.Storage.weapons.containers.F_15E_AAQ_14_LANTIRN="weapons.containers.F-15E_AAQ-14_LANTIRN" +ENUMS.Storage.weapons.containers.EclairM_24="weapons.containers.{EclairM_24}" +ENUMS.Storage.weapons.bombs.GBU_16="weapons.bombs.GBU_16" +ENUMS.Storage.weapons.nurs.HYDRA_70_M156="weapons.nurs.HYDRA_70_M156" +ENUMS.Storage.weapons.missiles.R_60="weapons.missiles.R-60" +ENUMS.Storage.weapons.containers.zsu_23_4="weapons.containers.zsu-23-4" +ENUMS.Storage.weapons.missiles.RB75="weapons.missiles.RB75" +ENUMS.Storage.weapons.missiles.Mistral="weapons.missiles.Mistral" +ENUMS.Storage.weapons.droptanks.MB339_TT500_L="weapons.droptanks.MB339_TT500_L" +ENUMS.Storage.weapons.bombs.SAM_SA_13_STRELA_21624lb="weapons.bombs.SAM SA-13 STRELA [21624lb]" +ENUMS.Storage.weapons.bombs.SAM_Avenger_M1097_Air_7200lb="weapons.bombs.SAM Avenger M1097 Air [7200lb]" +ENUMS.Storage.weapons.droptanks.Eleven00L_Tank_Empty="weapons.droptanks.1100L Tank Empty" +ENUMS.Storage.weapons.bombs.AN_M88="weapons.bombs.AN-M88" +ENUMS.Storage.weapons.missiles.S_25L="weapons.missiles.S_25L" +ENUMS.Storage.weapons.nurs.British_AP_25LBNo1_3INCHNo1="weapons.nurs.British_AP_25LBNo1_3INCHNo1" +ENUMS.Storage.weapons.bombs.BDU_50LD="weapons.bombs.BDU_50LD" +ENUMS.Storage.weapons.bombs.AGM_62="weapons.bombs.AGM_62" +ENUMS.Storage.weapons.containers.US_M10_SMOKE_TANK_WHITE="weapons.containers.{US_M10_SMOKE_TANK_WHITE}" +ENUMS.Storage.weapons.missiles.MICA_T="weapons.missiles.MICA_T" +ENUMS.Storage.weapons.containers.HVAR_rocket="weapons.containers.HVAR_rocket" +ENUMS.Storage.weapons.containers.LANTIRN="weapons.containers.LANTIRN" +ENUMS.Storage.weapons.missiles.AGM_78B="weapons.missiles.AGM_78B" +ENUMS.Storage.weapons.containers.uh_60l_pilot="weapons.containers.uh-60l_pilot" +ENUMS.Storage.weapons.missiles.AIM_92E="weapons.missiles.AIM-92E" +ENUMS.Storage.weapons.missiles.KD_63B="weapons.missiles.KD_63B" +ENUMS.Storage.weapons.bombs.Type_200A="weapons.bombs.Type_200A" +ENUMS.Storage.weapons.missiles.HB_AIM_7E_2="weapons.missiles.HB-AIM-7E-2" +ENUMS.Storage.weapons.containers.Spear="weapons.containers.Spear" +ENUMS.Storage.weapons.missiles.LS_6="weapons.missiles.LS_6" +ENUMS.Storage.weapons.containers.HB_ALE_40_0_120="weapons.containers.HB_ALE_40_0_120" +ENUMS.Storage.weapons.containers.Fantasm="weapons.containers.Fantasm" +ENUMS.Storage.weapons.nurs.FFAR_Mk61="weapons.nurs.FFAR_Mk61" +ENUMS.Storage.weapons.bombs.HB_F4E_GBU15V1="weapons.bombs.HB_F4E_GBU15V1" +ENUMS.Storage.weapons.containers.HB_F14_EXT_AN_APQ_167="weapons.containers.HB_F14_EXT_AN_APQ-167" +ENUMS.Storage.weapons.nurs.LWL_RP="weapons.nurs.LWL_RP" +ENUMS.Storage.weapons.bombs.AGM_62_I="weapons.bombs.AGM_62_I" +ENUMS.Storage.weapons.containers.ETHER="weapons.containers.ETHER" +ENUMS.Storage.weapons.containers.TANGAZH="weapons.containers.TANGAZH" +ENUMS.Storage.weapons.bombs.LYSBOMB_11086="weapons.bombs.LYSBOMB 11086" +ENUMS.Storage.weapons.containers.Stub_Wing="weapons.containers.Stub_Wing" +ENUMS.Storage.weapons.missiles.AIM_9E="weapons.missiles.AIM-9E" +ENUMS.Storage.weapons.missiles.C_701T="weapons.missiles.C_701T" +ENUMS.Storage.weapons.bombs.BAP_100="weapons.bombs.BAP_100" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM-802AKG" +ENUMS.Storage.weapons.missiles.CM_400AKG="weapons.missiles.CM-400AKG" +ENUMS.Storage.weapons.missiles.C_802AK="weapons.missiles.C_802AK" +ENUMS.Storage.weapons.missiles.KD_63="weapons.missiles.KD_63" +ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike_Fast="weapons.containers.HB_ORD_Pave_Spike_Fast" +ENUMS.Storage.weapons.missiles.SPIKE_ER2="weapons.missiles.SPIKE_ER2" +ENUMS.Storage.weapons.containers.KINGAL="weapons.containers.KINGAL" +ENUMS.Storage.weapons.containers.LANTIRN_F14_TARGET="weapons.containers.LANTIRN-F14-TARGET" +ENUMS.Storage.weapons.containers.SPS_141="weapons.containers.SPS-141" +ENUMS.Storage.weapons.bombs.BLU_3B_GROUP="weapons.bombs.BLU-3B_GROUP" +ENUMS.Storage.weapons.containers.HB_ALE_40_30_0="weapons.containers.HB_ALE_40_30_0" +ENUMS.Storage.weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL="weapons.droptanks.HB_HIGH_PERFORMANCE_CENTERLINE_600_GAL" +ENUMS.Storage.weapons.containers.ALQ_184="weapons.containers.ALQ-184" +ENUMS.Storage.weapons.missiles.AGM_45B="weapons.missiles.AGM_45B" +ENUMS.Storage.weapons.bombs.BLU_3_GROUP="weapons.bombs.BLU-3_GROUP" +ENUMS.Storage.weapons.missiles.SPIKE_ER="weapons.missiles.SPIKE_ER" +ENUMS.Storage.weapons.nurs.ARAKM70BAPPX="weapons.nurs.ARAKM70BAPPX" +ENUMS.Storage.weapons.bombs.LYSBOMB_11088="weapons.bombs.LYSBOMB 11088" +ENUMS.Storage.weapons.bombs.LYSBOMB_11087="weapons.bombs.LYSBOMB 11087" +ENUMS.Storage.weapons.missiles.KD_20="weapons.missiles.KD_20" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank="weapons.droptanks.HB_F-4E_EXT_WingTank" +ENUMS.Storage.weapons.missiles.Rb_04="weapons.missiles.Rb_04" +ENUMS.Storage.weapons.containers.AAQ_33="weapons.containers.AAQ-33" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_Center_Fuel_Tank_EMPTY="weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank_EMPTY" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_R_EMPTY="weapons.droptanks.HB_F-4E_EXT_WingTank_R_EMPTY" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_EMPTY="weapons.droptanks.HB_F-4E_EXT_WingTank_EMPTY" +ENUMS.Storage.weapons.containers.uh_60l_copilot="weapons.containers.uh-60l_copilot" +ENUMS.Storage.weapons.droptanks.JAYHAWK_80gal_Fuel_Tankv2="weapons.droptanks.JAYHAWK_80gal_Fuel_Tankv2" +ENUMS.Storage.weapons.containers.supply_m134="weapons.containers.supply_m134" +ENUMS.Storage.weapons.containers.Seahawk_Pylon="weapons.containers.Seahawk_Pylon" +ENUMS.Storage.weapons.nurs.LWL_MPP="weapons.nurs.LWL_MPP" +ENUMS.Storage.weapons.nurs.S_5KP="weapons.nurs.S_5KP" +ENUMS.Storage.weapons.missiles.AIM_92J="weapons.missiles.AIM-92J" +ENUMS.Storage.weapons.missiles.HB_AIM_7E="weapons.missiles.HB-AIM-7E" +ENUMS.Storage.weapons.containers.ALQ_131="weapons.containers.ALQ-131" +ENUMS.Storage.weapons.containers.HB_F14_EXT_TARPS="weapons.containers.HB_F14_EXT_TARPS" +ENUMS.Storage.weapons.containers.MH60_SOAR="weapons.containers.MH60_SOAR" +ENUMS.Storage.weapons.missiles.YJ_83="weapons.missiles.YJ-83" +ENUMS.Storage.weapons.bombs.GBU_8_B="weapons.bombs.GBU_8_B" +ENUMS.Storage.weapons.containers.HB_F14_EXT_ECA="weapons.containers.HB_F14_EXT_ECA" +ENUMS.Storage.weapons.bombs.BAP_100="weapons.bombs.BAP-100" +ENUMS.Storage.weapons.nurs.M261_MPSM_Rocket="weapons.nurs.M261_MPSM_Rocket" +ENUMS.Storage.weapons.droptanks.SEAHAWK_120_Fuel_Tank="weapons.droptanks.SEAHAWK_120_Fuel_Tank" +ENUMS.Storage.weapons.containers.SHPIL="weapons.containers.SHPIL" +ENUMS.Storage.weapons.bombs.GBU_39="weapons.bombs.GBU_39" +ENUMS.Storage.weapons.nurs.S_5M="weapons.nurs.S_5M" +ENUMS.Storage.weapons.containers.HB_ALE_40_15_90="weapons.containers.HB_ALE_40_15_90" +ENUMS.Storage.weapons.missiles.AIM_7E="weapons.missiles.AIM-7E" +ENUMS.Storage.weapons.missiles.AIM_9P3="weapons.missiles.AIM-9P3" +ENUMS.Storage.weapons.missiles.AGM_12B="weapons.missiles.AGM_12B" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM_802AKG" +ENUMS.Storage.weapons.droptanks.JAYHAWK_120_Fuel_Dual_Tank="weapons.droptanks.JAYHAWK_120_Fuel_Dual_Tank" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_Center_Fuel_Tank="weapons.droptanks.HB_F-4E_EXT_Center_Fuel_Tank" +ENUMS.Storage.weapons.containers.PAVETACK="weapons.containers.PAVETACK" +ENUMS.Storage.weapons.missiles.LS_6_500="weapons.missiles.LS_6_500" +ENUMS.Storage.weapons.bombs.LYSBOMB_11089="weapons.bombs.LYSBOMB 11089" +ENUMS.Storage.weapons.bombs.BLU_4B_GROUP="weapons.bombs.BLU-4B_GROUP" +ENUMS.Storage.weapons.containers.ah_64d_radar="weapons.containers.ah-64d_radar" +ENUMS.Storage.weapons.containers.F_18_LDT_POD="weapons.containers.F-18-LDT-POD" +ENUMS.Storage.weapons.containers.HB_ALE_40_30_60="weapons.containers.HB_ALE_40_30_60" +ENUMS.Storage.weapons.bombs.LS_6_100="weapons.bombs.LS_6_100" +ENUMS.Storage.weapons.droptanks.HB_F_4E_EXT_WingTank_R="weapons.droptanks.HB_F-4E_EXT_WingTank_R" +ENUMS.Storage.weapons.containers.SORBCIJA_R="weapons.containers.SORBCIJA_R" +ENUMS.Storage.weapons.missiles.CATM_65K="weapons.missiles.CATM_65K" +ENUMS.Storage.weapons.containers.HB_ORD_Pave_Spike="weapons.containers.HB_ORD_Pave_Spike" +ENUMS.Storage.weapons.containers.RobbieTank1="weapons.containers.RobbieTank1" +ENUMS.Storage.weapons.containers.SKY_SHADOW="weapons.containers.SKY_SHADOW" +ENUMS.Storage.weapons.containers.SORBCIJA_L="weapons.containers.SORBCIJA_L" +ENUMS.Storage.weapons.containers.Pavehawk="weapons.containers.Pavehawk" +ENUMS.Storage.weapons.bombs.BLG66_EG="weapons.bombs.BLG66_EG" +ENUMS.Storage.weapons.missiles.AGM_12C_ED="weapons.missiles.AGM_12C_ED" +ENUMS.Storage.weapons.missiles.AIM_92C="weapons.missiles.AIM-92C" +ENUMS.Storage.weapons.containers.MPS_410="weapons.containers.MPS-410" +ENUMS.Storage.weapons.missiles.HJ_12="weapons.missiles.HJ-12" +ENUMS.Storage.weapons.containers.AAQ_28_LITENING="weapons.containers.AAQ-28_LITENING" +ENUMS.Storage.weapons.containers.F_18_FLIR_POD="weapons.containers.F-18-FLIR-POD" +ENUMS.Storage.weapons.bombs.BLU_3B_GROUP="weapons.bombs.BLU_3B_GROUP" +ENUMS.Storage.weapons.containers.UH60L_Jayhawk="weapons.containers.UH60L_Jayhawk" +ENUMS.Storage.weapons.containers.BOZ_100="weapons.containers.BOZ-100" +ENUMS.Storage.weapons.missiles.AGM_78A="weapons.missiles.AGM_78A" +ENUMS.Storage.weapons.missiles.LAU_61_APKWS_M282="weapons.missiles.LAU_61_APKWS_M282" +ENUMS.Storage.weapons.bombs.BAP_100="weapons.bombs.BAP-100" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM-802AKG" +ENUMS.Storage.weapons.bombs.BLU_3B_GROUP="weapons.bombs.BLU_3B_GROUP" +ENUMS.Storage.weapons.bombs.BLU_4B_GROUP="weapons.bombs.BLU-4B_GROUP" +ENUMS.Storage.weapons.nurs.S_5M="weapons.nurs.S_5M" +ENUMS.Storage.weapons.missiles.AGM_12A="weapons.missiles.AGM_12A" +ENUMS.Storage.weapons.droptanks.JAYHAWK_120_Fuel_Tank="weapons.droptanks.JAYHAWK_120_Fuel_Tank" +ENUMS.Storage.weapons.bombs.GBU_15_V_1_B="weapons.bombs.GBU_15_V_1_B" +ENUMS.Storage.weapons.missiles.HYDRA_70_M151_APKWS={4,4,8,292} +ENUMS.Storage.weapons.missiles.HYDRA_70_M282_APKWS={4,4,8,293} +ENUMS.Storage.weapons.bombs.BAP100="weapons.bombs.BAP_100" +ENUMS.Storage.weapons.bombs.BLU3B_GROUP="weapons.bombs.BLU-3B_GROUP" +ENUMS.Storage.weapons.missiles.CM_802AKG="weapons.missiles.CM_802AKG" +ENUMS.Storage.weapons.bombs.BLU_4B_GROUP="weapons.bombs.BLU_4B_GROUP" +ENUMS.Storage.weapons.nurs.S5M="weapons.nurs.S-5M" +ENUMS.Storage.weapons.Gazelle.HMP400_100RDS={4,15,46,1771} +ENUMS.Storage.weapons.Gazelle.HMP400_200RDS={4,15,46,1770} +ENUMS.Storage.weapons.Gazelle.HMP400_400RDS={4,15,46,1769} +ENUMS.Storage.weapons.Gazelle.GIAT_M261_AP={4,15,46,1768} +ENUMS.Storage.weapons.Gazelle.GIAT_M261_SAPHEI={4,15,46,1767} +ENUMS.Storage.weapons.Gazelle.GIAT_M261_HE={4,15,46,1766} +ENUMS.Storage.weapons.Gazelle.GIAT_M261_HEAP={4,15,46,1765} +ENUMS.Storage.weapons.Gazelle.GIAT_M261_APHE={4,15,46,1764} +ENUMS.Storage.weapons.Gazelle.GAZELLE_IR_DEFLECTOR={4,15,47,680} +ENUMS.Storage.weapons.Gazelle.GAZELLE_FAS_SANDFILTER={4,15,47,679} +ENUMS.Storage.weapons.CH47.CH47_PORT_M60D={4,15,46,2489} +ENUMS.Storage.weapons.CH47.CH47_STBD_M60D={4,15,46,2488} +ENUMS.Storage.weapons.CH47.CH47_AFT_M60D={4,15,46,2490} +ENUMS.Storage.weapons.CH47.CH47_PORT_M134D={4,15,46,2494} +ENUMS.Storage.weapons.CH47.CH47_STBD_M134D={4,15,46,2495} +ENUMS.Storage.weapons.CH47.CH47_AFT_M3M={4,15,46,2496} +ENUMS.Storage.weapons.CH47.CH47_PORT_M240H={4,15,46,2492} +ENUMS.Storage.weapons.CH47.CH47_STBD_M240H={4,15,46,2491} +ENUMS.Storage.weapons.CH47.CH47_AFT_M240H={4,15,46,2493} +ENUMS.Storage.weapons.UH1H.M134_MiniGun_Right={4,15,46,161} +ENUMS.Storage.weapons.UH1H.M134_MiniGun_Left={4,15,46,160} +ENUMS.Storage.weapons.UH1H.M134_MiniGun_Right_Door={4,15,46,175} +ENUMS.Storage.weapons.UH1H.M60_MG_Right_Door={4,15,46,177} +ENUMS.Storage.weapons.UH1H.M134_MiniGun_Left_Door={4,15,46,174} +ENUMS.Storage.weapons.UH1H.M60_MG_Left_Door={4,15,46,176} +ENUMS.Storage.weapons.UH60L.M151_HYDRA={4,7,33,147} +ENUMS.Storage.weapons.UH60L.M156_HYDRA={4,7,33,148} +ENUMS.Storage.weapons.UH60L.M229_HYDRA={4,7,33,148} +ENUMS.Storage.weapons.UH60L.M257_HYDRA={4,7,33,151} +ENUMS.Storage.weapons.UH60L.M259_HYDRA={4,7,33,151} +ENUMS.Storage.weapons.UH60L.M274_HYDRA={4,7,33,150} +ENUMS.Storage.weapons.UH60L.M134_DOOR_GUN={4,15,46,3031} +ENUMS.Storage.weapons.UH60L.M3M={4,15,46,2496} +ENUMS.Storage.weapons.UH60L.M3M_DOOR_GUN={4,15,46,3032} +ENUMS.Storage.weapons.UH60L.M60_DOOR_GUN={4,15,46,3033} +ENUMS.Storage.weapons.UH60L.FUEL_TANK_200={1,3,43,3023} +ENUMS.Storage.weapons.UH60L.FUEL_TANK_230={1,3,43,3024} +ENUMS.Storage.weapons.UH60L.FUEL_TANK_450={1,3,43,3025} +ENUMS.Storage.weapons.UH60L.FUEL_TANK_DUAL_AUX={1,3,43,3026} +ENUMS.Storage.weapons.UH60L.CARGO_SEAT_REAR_ROW={1,3,43,3030} +ENUMS.Storage.weapons.UH60L.CARGO_SEAT_THREE_ROWS={1,3,43,3029} +ENUMS.Storage.weapons.UH60L.EMPTY_GUNNER_SEAT_1={1,3,43,3027} +ENUMS.Storage.weapons.UH60L.EMPTY_GUNNER_SEAT_2={1,3,43,3028} +ENUMS.Storage.weapons.OH58.FIM92={4,4,7,449} +ENUMS.Storage.weapons.OH58.MG_M3P100={4,15,46,2611} +ENUMS.Storage.weapons.OH58.MG_M3P200={4,15,46,2610} +ENUMS.Storage.weapons.OH58.MG_M3P300={4,15,46,2609} +ENUMS.Storage.weapons.OH58.MG_M3P400={4,15,46,2608} +ENUMS.Storage.weapons.OH58.MG_M3P500={4,15,46,2607} +ENUMS.Storage.weapons.OH58.Smk_Grenade_Blue={4,5,9,488} +ENUMS.Storage.weapons.OH58.Smk_Grenade_Green={4,5,9,489} +ENUMS.Storage.weapons.OH58.Smk_Grenade_Red={4,5,9,487} +ENUMS.Storage.weapons.OH58.Smk_Grenade_Violet={4,5,9,490} +ENUMS.Storage.weapons.OH58.Smk_Grenade_White={4,5,9,492} +ENUMS.Storage.weapons.OH58.Smk_Grenade_Yellow={4,5,9,491} +ENUMS.Storage.weapons.AH64D.AN_APG78={4,15,44,2114} +ENUMS.Storage.weapons.AH64D.Internal_Aux_FuelTank={1,3,43,1700} +ENUMS.Storage.weapons.droptanks.FuelTank_610gal={1,3,43,10} +ENUMS.Storage.weapons.droptanks.FuelTank_370gal={1,3,43,11} +ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_AP_M79={4,15,46,824} +ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_HE_M792={4,15,46,825} +ENUMS.Storage.weapons.containers.AV8BNA_GAU_12_SAPHEI_T={4,15,46,300} +ENUMS.FARPType={ +FARP="FARP", +INVISIBLE="INVISIBLE", +HELIPADSINGLE="HELIPADSINGLE", +PADSINGLE="PADSINGLE", +} +ENUMS.FARPObjectTypeNamesAndShape={ +[ENUMS.FARPType.FARP]={TypeName="FARP",ShapeName="FARPS"}, +[ENUMS.FARPType.INVISIBLE]={TypeName="Invisible FARP",ShapeName="invisiblefarp"}, +[ENUMS.FARPType.HELIPADSINGLE]={TypeName="SINGLE_HELIPAD",ShapeName="FARP"}, +[ENUMS.FARPType.PADSINGLE]={TypeName="FARP_SINGLE_01",ShapeName="FARP_SINGLE_01"}, +} +SMOKECOLOR=trigger.smokeColor +FLARECOLOR=trigger.flareColor +BIGSMOKEPRESET={ +SmallSmokeAndFire=1, +MediumSmokeAndFire=2, +LargeSmokeAndFire=3, +HugeSmokeAndFire=4, +SmallSmoke=5, +MediumSmoke=6, +LargeSmoke=7, +HugeSmoke=8, +} +DCSMAP={ +Caucasus="Caucasus", +NTTR="Nevada", +Normandy="Normandy", +PersianGulf="PersianGulf", +TheChannel="TheChannel", +Syria="Syria", +MarianaIslands="MarianaIslands", +Falklands="Falklands", +Sinai="SinaiMap", +Kola="Kola", +Afghanistan="Afghanistan", +Iraq="Iraq", +GermanyCW="GermanyCW", +} +CALLSIGN={ +Aircraft={ +Enfield=1, +Springfield=2, +Uzi=3, +Colt=4, +Dodge=5, +Ford=6, +Chevy=7, +Pontiac=8, +Hawg=9, +Boar=10, +Pig=11, +Tusk=12, +}, +AWACS={ +Overlord=1, +Magic=2, +Wizard=3, +Focus=4, +Darkstar=5, +}, +Tanker={ +Texaco=1, +Arco=2, +Shell=3, +Navy_One=4, +Mauler=5, +Bloodhound=6, +}, +JTAC={ +Axeman=1, +Darknight=2, +Warrior=3, +Pointer=4, +Eyeball=5, +Moonbeam=6, +Whiplash=7, +Finger=8, +Pinpoint=9, +Ferret=10, +Shaba=11, +Playboy=12, +Hammer=13, +Jaguar=14, +Deathstar=15, +Anvil=16, +Firefly=17, +Mantis=18, +Badger=19, +}, +FARP={ +London=1, +Dallas=2, +Paris=3, +Moscow=4, +Berlin=5, +Rome=6, +Madrid=7, +Warsaw=8, +Dublin=9, +Perth=10, +}, +F16={ +Viper=9, +Venom=10, +Lobo=11, +Cowboy=12, +Python=13, +Rattler=14, +Panther=15, +Wolf=16, +Weasel=17, +Wild=18, +Ninja=19, +Jedi=20, +}, +F18={ +Hornet=9, +Squid=10, +Ragin=11, +Roman=12, +Sting=13, +Jury=14, +Jokey=15, +Ram=16, +Hawk=17, +Devil=18, +Check=19, +Snake=20, +}, +F15E={ +Dude=9, +Thud=10, +Gunny=11, +Trek=12, +Sniper=13, +Sled=14, +Best=15, +Jazz=16, +Rage=17, +Tahoe=18, +}, +B1B={ +Bone=9, +Dark=10, +Vader=11 +}, +B52={ +Buff=9, +Dump=10, +Kenworth=11, +}, +TransportAircraft={ +Heavy=9, +Trash=10, +Cargo=11, +Ascot=12, +}, +AH64={ +Army_Air=9, +Apache=10, +Crow=11, +Sioux=12, +Gatling=13, +Gunslinger=14, +Hammerhead=15, +Bootleg=16, +Palehorse=17, +Carnivor=18, +Saber=19, +}, +Kiowa={ +Anvil=1, +Azrael=2, +BamBam=3, +Blackjack=4, +Bootleg=5, +BurninStogie=6, +Chaos=7, +CrazyHorse=8, +Crusader=9, +Darkhorse=10, +Eagle=11, +Lighthorse=12, +Mustang=13, +Outcast=14, +Palehorse=15, +Pegasus=16, +Pistol=17, +Roughneck=18, +Saber=19, +Shamus=20, +Spur=21, +Stetson=22, +Wrath=23, +}, +} +UTILS={ +_MarkID=1 +} +UTILS.IsInstanceOf=function(object,className) +if type(className)~='string'then +if type(className)=='table'and className.IsInstanceOf~=nil then +className=className.ClassName +else +local err_str='className parameter should be a string; parameter received: '..type(className) +return false +end +end +if type(object)=='table'and object.IsInstanceOf~=nil then +return object:IsInstanceOf(className) +else +local basicDataTypes={'string','number','function','boolean','nil','table'} +for _,basicDataType in ipairs(basicDataTypes)do +if className==basicDataType then +return type(object)==basicDataType +end +end +end +return false +end +UTILS.DeepCopy=function(object) +local lookup_table={} +local function _copy(object) +if type(object)~="table"then +return object +elseif lookup_table[object]then +return lookup_table[object] +end +local new_table={} +lookup_table[object]=new_table +for index,value in pairs(object)do +new_table[_copy(index)]=_copy(value) +end +return setmetatable(new_table,getmetatable(object)) +end +local objectreturn=_copy(object) +return objectreturn +end +UTILS.OneLineSerialize=function(tbl) +local lookup_table={} +local function _Serialize(tbl) +if type(tbl)=='table'then +if lookup_table[tbl]then +return lookup_table[object] +end +local tbl_str={} +lookup_table[tbl]=tbl_str +tbl_str[#tbl_str+1]='{' +for ind,val in pairs(tbl)do +local ind_str={} +if type(ind)=="number"then +ind_str[#ind_str+1]='[' +ind_str[#ind_str+1]=tostring(ind) +ind_str[#ind_str+1]=']=' +else +ind_str[#ind_str+1]='[' +ind_str[#ind_str+1]=UTILS.BasicSerialize(ind) +ind_str[#ind_str+1]=']=' +end +local val_str={} +if((type(val)=='number')or(type(val)=='boolean'))then +val_str[#val_str+1]=tostring(val) +val_str[#val_str+1]=',' +tbl_str[#tbl_str+1]=table.concat(ind_str) +tbl_str[#tbl_str+1]=table.concat(val_str) +elseif type(val)=='string'then +val_str[#val_str+1]=UTILS.BasicSerialize(val) +val_str[#val_str+1]=',' +tbl_str[#tbl_str+1]=table.concat(ind_str) +tbl_str[#tbl_str+1]=table.concat(val_str) +elseif type(val)=='nil'then +val_str[#val_str+1]='nil,' +tbl_str[#tbl_str+1]=table.concat(ind_str) +tbl_str[#tbl_str+1]=table.concat(val_str) +elseif type(val)=='table'then +if ind=="__index"then +else +val_str[#val_str+1]=_Serialize(val) +val_str[#val_str+1]=',' +tbl_str[#tbl_str+1]=table.concat(ind_str) +tbl_str[#tbl_str+1]=table.concat(val_str) +end +elseif type(val)=='function'then +tbl_str[#tbl_str+1]="f() "..tostring(ind) +tbl_str[#tbl_str+1]=',' +else +env.info('unable to serialize value type '..UTILS.BasicSerialize(type(val))..' at index '..tostring(ind)) +env.info(debug.traceback()) +end +end +tbl_str[#tbl_str+1]='}' +return table.concat(tbl_str) +else +return tostring(tbl) +end +end +local objectreturn=_Serialize(tbl) +return objectreturn +end +function UTILS._OneLineSerialize(tbl) +if type(tbl)=='table'then +local tbl_str={} +tbl_str[#tbl_str+1]='{ ' +for ind,val in pairs(tbl)do +if type(ind)=="number"then +tbl_str[#tbl_str+1]='[' +tbl_str[#tbl_str+1]=tostring(ind) +tbl_str[#tbl_str+1]='] = ' +else +tbl_str[#tbl_str+1]='[' +tbl_str[#tbl_str+1]=UTILS.BasicSerialize(ind) +tbl_str[#tbl_str+1]='] = ' +end +if((type(val)=='number')or(type(val)=='boolean'))then +tbl_str[#tbl_str+1]=tostring(val) +tbl_str[#tbl_str+1]=', ' +elseif type(val)=='string'then +tbl_str[#tbl_str+1]=UTILS.BasicSerialize(val) +tbl_str[#tbl_str+1]=', ' +elseif type(val)=='nil'then +tbl_str[#tbl_str+1]='nil, ' +elseif type(val)=='table'then +else +end +end +tbl_str[#tbl_str+1]='}' +return table.concat(tbl_str) +else +return UTILS.BasicSerialize(tbl) +end +end +UTILS.BasicSerialize=function(s) +if s==nil then +return"\"\"" +else +if((type(s)=='number')or(type(s)=='boolean')or(type(s)=='function')or(type(s)=='userdata'))then +return tostring(s) +elseif type(s)=="table"then +return UTILS._OneLineSerialize(s) +elseif type(s)=='string'then +s=string.format('(%s)',s) +return s +end +end +end +function UTILS.TableLength(T) +local count=0 +for _ in pairs(T or{})do count=count+1 end +return count +end +function UTILS.PrintTableToLog(table,indent,noprint) +local text="\n" +if not table or type(table)~="table"then +env.warning("No table passed!") +return nil +end +if not indent then indent=0 end +for k,v in pairs(table)do +if string.find(k," ")then k='"'..k..'"'end +if type(v)=="table"and UTILS.TableLength(v)>0 then +if not noprint then +env.info(string.rep(" ",indent)..tostring(k).." = {") +end +text=text..string.rep(" ",indent)..tostring(k).." = {\n" +text=text..tostring(UTILS.PrintTableToLog(v,indent+1),noprint).."\n" +if not noprint then +env.info(string.rep(" ",indent).."},") +end +text=text..string.rep(" ",indent).."},\n" +elseif type(v)=="function"then +else +local value +if tostring(v)=="true"or tostring(v)=="false"or tonumber(v)~=nil then +value=v +else +value='"'..tostring(v)..'"' +end +if not noprint then +env.info(string.rep(" ",indent)..tostring(k).." = "..tostring(value)..",\n") +end +text=text..string.rep(" ",indent)..tostring(k).." = "..tostring(value)..",\n" +end +end +return text +end +function UTILS.TableShow(tbl,loc,indent,tableshow_tbls) +tableshow_tbls=tableshow_tbls or{} +loc=loc or"" +indent=indent or"" +if type(tbl)=='table'then +tableshow_tbls[tbl]=loc +local tbl_str={} +tbl_str[#tbl_str+1]=indent..'{\n' +for ind,val in pairs(tbl)do +if type(ind)=="number"then +tbl_str[#tbl_str+1]=indent +tbl_str[#tbl_str+1]=loc..'[' +tbl_str[#tbl_str+1]=tostring(ind) +tbl_str[#tbl_str+1]='] = ' +else +tbl_str[#tbl_str+1]=indent +tbl_str[#tbl_str+1]=loc..'[' +tbl_str[#tbl_str+1]=UTILS.BasicSerialize(ind) +tbl_str[#tbl_str+1]='] = ' +end +if((type(val)=='number')or(type(val)=='boolean'))then +tbl_str[#tbl_str+1]=tostring(val) +tbl_str[#tbl_str+1]=',\n' +elseif type(val)=='string'then +tbl_str[#tbl_str+1]=UTILS.BasicSerialize(val) +tbl_str[#tbl_str+1]=',\n' +elseif type(val)=='nil'then +tbl_str[#tbl_str+1]='nil,\n' +elseif type(val)=='table'then +if tableshow_tbls[val]then +tbl_str[#tbl_str+1]=tostring(val)..' already defined: '..tableshow_tbls[val]..',\n' +else +tableshow_tbls[val]=loc..'['..UTILS.BasicSerialize(ind)..']' +tbl_str[#tbl_str+1]=tostring(val)..' ' +tbl_str[#tbl_str+1]=UTILS.TableShow(val,loc..'['..UTILS.BasicSerialize(ind)..']',indent..' ',tableshow_tbls) +tbl_str[#tbl_str+1]=',\n' +end +elseif type(val)=='function'then +if debug and debug.getinfo then +local fcnname=tostring(val) +local info=debug.getinfo(val,"S") +if info.what=="C"then +tbl_str[#tbl_str+1]=string.format('%q',fcnname..', C function')..',\n' +else +if(string.sub(info.source,1,2)==[[./]])then +tbl_str[#tbl_str+1]=string.format('%q',fcnname..', defined in ('..info.linedefined..'-'..info.lastlinedefined..')'..info.source)..',\n' +else +tbl_str[#tbl_str+1]=string.format('%q',fcnname..', defined in ('..info.linedefined..'-'..info.lastlinedefined..')')..',\n' +end +end +else +tbl_str[#tbl_str+1]='a function,\n' +end +else +tbl_str[#tbl_str+1]='unable to serialize value type '..UTILS.BasicSerialize(type(val))..' at index '..tostring(ind) +end +end +tbl_str[#tbl_str+1]=indent..'}' +return table.concat(tbl_str) +end +end +function UTILS.Gdump(fname) +if lfs and io then +local fdir=lfs.writedir()..[[Logs\]]..fname +local f=io.open(fdir,'w') +f:write(UTILS.TableShow(_G)) +f:close() +env.info(string.format('Wrote debug data to $1',fdir)) +else +env.error("WARNING: lfs and/or io not de-sanitized - cannot dump _G!") +end +end +function UTILS.DoString(s) +local f,err=loadstring(s) +if f then +return true,f() +else +return false,err +end +end +UTILS.ToDegree=function(angle) +return angle*180/math.pi +end +UTILS.ToRadian=function(angle) +return angle*math.pi/180 +end +UTILS.MetersToNM=function(meters) +return meters/1852 +end +UTILS.KiloMetersToNM=function(kilometers) +return kilometers/1852*1000 +end +UTILS.MetersToSM=function(meters) +return meters/1609.34 +end +UTILS.KiloMetersToSM=function(kilometers) +return kilometers/1609.34*1000 +end +UTILS.MetersToFeet=function(meters) +return meters/0.3048 +end +UTILS.KiloMetersToFeet=function(kilometers) +return kilometers/0.3048*1000 +end +UTILS.NMToMeters=function(NM) +return NM*1852 +end +UTILS.NMToKiloMeters=function(NM) +return NM*1852/1000 +end +UTILS.FeetToMeters=function(feet) +return feet*0.3048 +end +UTILS.KnotsToKmph=function(knots) +return knots*1.852 +end +UTILS.KmphToKnots=function(knots) +return knots/1.852 +end +UTILS.KmphToMps=function(kmph) +return kmph/3.6 +end +UTILS.MpsToKmph=function(mps) +return mps*3.6 +end +UTILS.MiphToMps=function(miph) +return miph*0.44704 +end +UTILS.MpsToMiph=function(mps) +return mps/0.44704 +end +UTILS.MpsToKnots=function(mps) +return mps*1.94384 +end +UTILS.KnotsToMps=function(knots) +if type(knots)=="number"then +return knots/1.94384 +else +return 0 +end +end +UTILS.CelsiusToFahrenheit=function(Celcius) +return Celcius*9/5+32 +end +UTILS.hPa2inHg=function(hPa) +return hPa*0.0295299830714 +end +UTILS.IasToTas=function(ias,altitude,oatcorr) +oatcorr=oatcorr or 0.017 +local tas=ias+(ias*oatcorr*UTILS.MetersToFeet(altitude)/1000) +return tas +end +UTILS.TasToIas=function(tas,altitude,oatcorr) +oatcorr=oatcorr or 0.017 +local ias=tas/(1+oatcorr*UTILS.MetersToFeet(altitude)/1000) +return ias +end +UTILS.KnotsToAltKIAS=function(knots,altitude) +return(knots*0.018*(altitude/1000))+knots +end +UTILS.hPa2mmHg=function(hPa) +return hPa*0.7500615613030 +end +UTILS.kg2lbs=function(kg) +return kg*2.20462 +end +UTILS.tostringLL=function(lat,lon,acc,DMS) +local latHemi,lonHemi +if lat>0 then +latHemi='N' +else +latHemi='S' +end +if lon>0 then +lonHemi='E' +else +lonHemi='W' +end +lat=math.abs(lat) +lon=math.abs(lon) +local latDeg=math.floor(lat) +local latMin=(lat-latDeg)*60 +local lonDeg=math.floor(lon) +local lonMin=(lon-lonDeg)*60 +if DMS then +local oldLatMin=latMin +latMin=math.floor(latMin) +local latSec=UTILS.Round((oldLatMin-latMin)*60,acc) +local oldLonMin=lonMin +lonMin=math.floor(lonMin) +local lonSec=UTILS.Round((oldLonMin-lonMin)*60,acc) +if latSec==60 then +latSec=0 +latMin=latMin+1 +end +if lonSec==60 then +lonSec=0 +lonMin=lonMin+1 +end +local secFrmtStr +secFrmtStr='%02d' +if acc<=0 then +secFrmtStr='%02d' +else +local width=3+acc +secFrmtStr='%0'..width..'.'..acc..'f' +end +return string.format('%03d°',latDeg)..string.format('%02d',latMin)..'\''..string.format(secFrmtStr,latSec)..'"'..latHemi..' ' +..string.format('%03d°',lonDeg)..string.format('%02d',lonMin)..'\''..string.format(secFrmtStr,lonSec)..'"'..lonHemi +else +latMin=UTILS.Round(latMin,acc) +lonMin=UTILS.Round(lonMin,acc) +if latMin==60 then +latMin=0 +latDeg=latDeg+1 +end +if lonMin==60 then +lonMin=0 +lonDeg=lonDeg+1 +end +local minFrmtStr +if acc<=0 then +minFrmtStr='%02d' +else +local width=3+acc +minFrmtStr='%0'..width..'.'..acc..'f' +end +return string.format('%03d°',latDeg)..' '..string.format(minFrmtStr,latMin)..'\''..latHemi..' ' +..string.format('%03d°',lonDeg)..' '..string.format(minFrmtStr,lonMin)..'\''..lonHemi +end +end +UTILS.tostringLLM2KData=function(lat,lon,acc) +local latHemi,lonHemi +if lat>0 then +latHemi='N' +else +latHemi='S' +end +if lon>0 then +lonHemi='E' +else +lonHemi='W' +end +lat=math.abs(lat) +lon=math.abs(lon) +local latDeg=math.floor(lat) +local latMin=(lat-latDeg)*60 +local lonDeg=math.floor(lon) +local lonMin=(lon-lonDeg)*60 +latMin=UTILS.Round(latMin,acc) +lonMin=UTILS.Round(lonMin,acc) +if latMin==60 then +latMin=0 +latDeg=latDeg+1 +end +if lonMin==60 then +lonMin=0 +lonDeg=lonDeg+1 +end +local minFrmtStr +if acc<=0 then +minFrmtStr='%02d' +else +local width=3+acc +minFrmtStr='%0'..width..'.'..acc..'f' +end +return latHemi..string.format('%02d:',latDeg)..string.format(minFrmtStr,latMin),lonHemi..string.format('%02d:',lonDeg)..string.format(minFrmtStr,lonMin) +end +UTILS.tostringMGRS=function(MGRS,acc) +if acc<=0 then +return MGRS.UTMZone..' '..MGRS.MGRSDigraph +else +if acc>5 then acc=5 end +local Easting=tostring(MGRS.Easting) +local Northing=tostring(MGRS.Northing) +local nE=5-string.len(Easting) +local nN=5-string.len(Northing) +for i=1,nE do Easting="0"..Easting end +for i=1,nN do Northing="0"..Northing end +return string.format("%s %s %s %s",MGRS.UTMZone,MGRS.MGRSDigraph,string.sub(Easting,1,acc),string.sub(Northing,1,acc)) +end +end +function UTILS.Round(num,idp) +local mult=10^(idp or 0) +return math.floor(num*mult+0.5)/mult +end +function UTILS.DoString(s) +local f,err=loadstring(s) +if f then +return true,f() +else +return false,err +end +end +function UTILS.spairs(t,order) +local keys={} +for k in pairs(t)do keys[#keys+1]=k end +if order then +table.sort(keys,function(a,b)return order(t,a,b)end) +else +table.sort(keys) +end +local i=0 +return function() +i=i+1 +if keys[i]then +return keys[i],t[keys[i]] +end +end +end +function UTILS.kpairs(t,getkey,order) +local keys={} +local keyso={} +for k,o in pairs(t)do keys[#keys+1]=k keyso[#keyso+1]=getkey(o)end +if order then +table.sort(keys,function(a,b)return order(t,a,b)end) +else +table.sort(keys) +end +local i=0 +return function() +i=i+1 +if keys[i]then +return keyso[i],t[keys[i]] +end +end +end +function UTILS.rpairs(t) +local keys={} +for k in pairs(t)do keys[#keys+1]=k end +local random={} +local j=#keys +for i=1,j do +local k=math.random(1,#keys) +random[i]=keys[k] +table.remove(keys,k) +end +local i=0 +return function() +i=i+1 +if random[i]then +return random[i],t[random[i]] +end +end +end +function UTILS.GetMarkID() +UTILS._MarkID=UTILS._MarkID+1 +return UTILS._MarkID +end +function UTILS.RemoveMark(MarkID,Delay) +if Delay and Delay>0 then +TIMER:New(UTILS.RemoveMark,MarkID):Start(Delay) +else +if MarkID then +trigger.action.removeMark(MarkID) +end +end +end +function UTILS.IsInRadius(InVec2,Vec2,Radius) +local InRadius=((InVec2.x-Vec2.x)^2+(InVec2.y-Vec2.y)^2)^0.5<=Radius +return InRadius +end +function UTILS.IsInSphere(InVec3,Vec3,Radius) +local InSphere=((InVec3.x-Vec3.x)^2+(InVec3.y-Vec3.y)^2+(InVec3.z-Vec3.z)^2)^0.5<=Radius +return InSphere +end +function UTILS.BeaufortScale(speed) +local bn=nil +local bd=nil +if speed<0.51 then +bn=0 +bd="Calm" +elseif speed<2.06 then +bn=1 +bd="Light Air" +elseif speed<3.60 then +bn=2 +bd="Light Breeze" +elseif speed<5.66 then +bn=3 +bd="Gentle Breeze" +elseif speed<8.23 then +bn=4 +bd="Moderate Breeze" +elseif speed<11.32 then +bn=5 +bd="Fresh Breeze" +elseif speed<14.40 then +bn=6 +bd="Strong Breeze" +elseif speed<17.49 then +bn=7 +bd="Moderate Gale" +elseif speed<21.09 then +bn=8 +bd="Fresh Gale" +elseif speed<24.69 then +bn=9 +bd="Strong Gale" +elseif speed<28.81 then +bn=10 +bd="Storm" +elseif speed<32.92 then +bn=11 +bd="Violent Storm" +else +bn=12 +bd="Hurricane" +end +return bn,bd +end +function UTILS.Split(str,sep) +local result={} +local regex=("([^%s]+)"):format(sep) +for each in str:gmatch(regex)do +table.insert(result,each) +end +return result +end +function UTILS.GetCharacters(str) +local chars={} +for i=1,#str do +local c=str:sub(i,i) +table.insert(chars,c) +end +return chars +end +function UTILS.SecondsToClock(seconds,short) +if seconds==nil then +return nil +end +local seconds=tonumber(seconds)or 0 +local _seconds=seconds%(60*60*24) +if seconds<0 then +return nil +else +local hours=string.format("%02.f",math.floor(_seconds/3600)) +local mins=string.format("%02.f",math.floor(_seconds/60-(hours*60))) +local secs=string.format("%02.f",math.floor(_seconds-hours*3600-mins*60)) +local days=string.format("%d",seconds/(60*60*24)) +local clock=hours..":"..mins..":"..secs.."+"..days +if short then +if hours=="00"then +clock=hours..":"..mins..":"..secs +else +clock=hours..":"..mins..":"..secs +end +end +return clock +end +end +function UTILS.SecondsOfToday() +local time=timer.getAbsTime() +local clock=UTILS.SecondsToClock(time,true) +return UTILS.ClockToSeconds(clock) +end +function UTILS.SecondsToMidnight() +return 24*60*60-UTILS.SecondsOfToday() +end +function UTILS.ClockToSeconds(clock) +if clock==nil then +return nil +end +local seconds=0 +local dsplit=UTILS.Split(clock,"+") +if#dsplit>1 then +seconds=seconds+tonumber(dsplit[2])*60*60*24 +end +local tsplit=UTILS.Split(dsplit[1],":") +local i=1 +for _,time in ipairs(tsplit)do +if i==1 then +seconds=seconds+tonumber(time)*60*60 +elseif i==2 then +seconds=seconds+tonumber(time)*60 +elseif i==3 then +seconds=seconds+tonumber(time) +end +i=i+1 +end +return seconds +end +function UTILS.DisplayMissionTime(duration) +duration=duration or 5 +local Tnow=timer.getAbsTime() +local mission_time=Tnow-timer.getTime0() +local mission_time_minutes=mission_time/60 +local mission_time_seconds=mission_time%60 +local local_time=UTILS.SecondsToClock(Tnow) +local text=string.format("Time: %s - %02d:%02d",local_time,mission_time_minutes,mission_time_seconds) +MESSAGE:New(text,duration):ToAll() +end +function UTILS.ReplaceIllegalCharacters(Text,ReplaceBy) +ReplaceBy=ReplaceBy or"_" +local text=Text:gsub("[<>|/?*:\\]",ReplaceBy) +return text +end +function UTILS.RandomGaussian(x0,sigma,xmin,xmax,imax) +sigma=sigma or 10 +imax=imax or 100 +local r +local gotit=false +local i=0 +while not gotit do +local x1=math.random() +local x2=math.random() +r=math.sqrt(-2*sigma*sigma*math.log(x1))*math.cos(2*math.pi*x2)+x0 +i=i+1 +if(r>=xmin and r<=xmax)or i>imax then +gotit=true +end +end +return r +end +function UTILS.Randomize(value,fac,lower,upper) +local min +if lower then +min=math.max(value-value*fac,lower) +else +min=value-value*fac +end +local max +if upper then +max=math.min(value+value*fac,upper) +else +max=value+value*fac +end +local r=math.random(min,max) +return r +end +function UTILS.VecDot(a,b) +return a.x*b.x+a.y*b.y+a.z*b.z +end +function UTILS.Vec2Dot(a,b) +return a.x*b.x+a.y*b.y +end +function UTILS.VecNorm(a) +return math.sqrt(UTILS.VecDot(a,a)) +end +function UTILS.Vec2Norm(a) +return math.sqrt(UTILS.Vec2Dot(a,a)) +end +function UTILS.VecDist2D(a,b) +local d=math.huge +if(not a)or(not b)then return d end +local c={x=b.x-a.x,y=b.y-a.y} +d=math.sqrt(c.x*c.x+c.y*c.y) +return d +end +function UTILS.VecDist3D(a,b) +local d=math.huge +if(not a)or(not b)then return d end +local c={x=b.x-a.x,y=b.y-a.y,z=b.z-a.z} +d=math.sqrt(UTILS.VecDot(c,c)) +return d +end +function UTILS.VecCross(a,b) +return{x=a.y*b.z-a.z*b.y,y=a.z*b.x-a.x*b.z,z=a.x*b.y-a.y*b.x} +end +function UTILS.VecSubstract(a,b) +return{x=a.x-b.x,y=a.y-b.y,z=a.z-b.z} +end +function UTILS.VecSubtract(a,b) +return UTILS.VecSubstract(a,b) +end +function UTILS.Vec2Substract(a,b) +return{x=a.x-b.x,y=a.y-b.y} +end +function UTILS.Vec2Subtract(a,b) +return UTILS.Vec2Substract(a,b) +end +function UTILS.VecAdd(a,b) +return{x=a.x+b.x,y=a.y+b.y,z=a.z+b.z} +end +function UTILS.Vec2Add(a,b) +return{x=a.x+b.x,y=a.y+b.y} +end +function UTILS.VecAngle(a,b) +local cosalpha=UTILS.VecDot(a,b)/(UTILS.VecNorm(a)*UTILS.VecNorm(b)) +local alpha=0 +if cosalpha>=0.9999999999 then +alpha=0 +elseif cosalpha<=-0.999999999 then +alpha=math.pi +else +alpha=math.acos(cosalpha) +end +return math.deg(alpha) +end +function UTILS.VecHdg(a) +local h=math.deg(math.atan2(a.z,a.x)) +if h<0 then +h=h+360 +end +return h +end +function UTILS.Vec2Hdg(a) +local h=math.deg(math.atan2(a.y,a.x)) +if h<0 then +h=h+360 +end +return h +end +function UTILS.HdgDiff(h1,h2) +local alpha=math.rad(tonumber(h1)) +local beta=math.rad(tonumber(h2)) +local v1={x=math.cos(alpha),y=0,z=math.sin(alpha)} +local v2={x=math.cos(beta),y=0,z=math.sin(beta)} +local delta=UTILS.VecAngle(v1,v2) +return math.abs(delta) +end +function UTILS.HdgTo(a,b) +local dz=(b.z or b.y)-(a.z or a.y) +local dx=b.x-a.x +local heading=math.deg(math.atan2(dz,dx)) +if heading<0 then +heading=360+heading +end +return heading +end +function UTILS.VecTranslate(a,distance,angle) +local SX=a.x +local SY=a.z +local Radians=math.rad(angle or 0) +local TX=distance*math.cos(Radians)+SX +local TY=distance*math.sin(Radians)+SY +return{x=TX,y=a.y,z=TY} +end +function UTILS.Vec2Translate(a,distance,angle) +local SX=a.x +local SY=a.y +local Radians=math.rad(angle or 0) +local TX=distance*math.cos(Radians)+SX +local TY=distance*math.sin(Radians)+SY +return{x=TX,y=TY} +end +function UTILS.Rotate2D(a,angle) +local phi=math.rad(angle) +local x=a.z +local y=a.x +local Z=x*math.cos(phi)-y*math.sin(phi) +local X=x*math.sin(phi)+y*math.cos(phi) +local Y=a.y +local A={x=X,y=Y,z=Z} +return A +end +function UTILS.Vec2Rotate2D(a,angle) +local phi=math.rad(angle) +local x=a.x +local y=a.y +local X=x*math.cos(phi)-y*math.sin(phi) +local Y=x*math.sin(phi)+y*math.cos(phi) +local A={x=X,y=Y} +return A +end +function UTILS.TACANToFrequency(TACANChannel,TACANMode) +if type(TACANChannel)~="number"then +return nil +end +if TACANMode~="X"and TACANMode~="Y"then +return nil +end +local A=1151 +local B=64 +if TACANChannel<64 then +B=1 +end +if TACANMode=='Y'then +A=1025 +if TACANChannel<64 then +A=1088 +end +else +if TACANChannel<64 then +A=962 +end +end +return(A+TACANChannel-B)*1000000 +end +function UTILS.GetDCSMap() +return env.mission.theatre +end +function UTILS.GetDCSMissionDate() +local year=tostring(env.mission.date.Year) +local month=tostring(env.mission.date.Month) +local day=tostring(env.mission.date.Day) +return string.format("%s/%s/%s",year,month,day),tonumber(year),tonumber(month),tonumber(day) +end +function UTILS.GetMissionDay(Time) +Time=Time or timer.getAbsTime() +local clock=UTILS.SecondsToClock(Time,false) +local x=tonumber(UTILS.Split(clock,"+")[2]) +return x +end +function UTILS.GetMissionDayOfYear(Time) +local Date,Year,Month,Day=UTILS.GetDCSMissionDate() +local d=UTILS.GetMissionDay(Time) +return UTILS.GetDayOfYear(Year,Month,Day)+d +end +function UTILS.GetMagneticDeclination(map) +map=map or UTILS.GetDCSMap() +local declination=0 +if map==DCSMAP.Caucasus then +declination=6 +elseif map==DCSMAP.NTTR then +declination=12 +elseif map==DCSMAP.Normandy then +declination=-10 +elseif map==DCSMAP.PersianGulf then +declination=2 +elseif map==DCSMAP.TheChannel then +declination=-10 +elseif map==DCSMAP.Syria then +declination=5 +elseif map==DCSMAP.MarianaIslands then +declination=2 +elseif map==DCSMAP.Falklands then +declination=12 +elseif map==DCSMAP.Sinai then +declination=4.8 +elseif map==DCSMAP.Kola then +declination=15 +elseif map==DCSMAP.Afghanistan then +declination=3 +elseif map==DCSMAP.Iraq then +declination=4.4 +elseif map==DCSMAP.GermanyCW then +declination=0.1 +else +declination=0 +end +return declination +end +function UTILS.FileExists(file) +if io then +local f=io.open(file,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +else +return nil +end +end +function UTILS.CheckMemory(output) +local time=timer.getTime() +local clock=UTILS.SecondsToClock(time) +local mem=collectgarbage("count") +if output then +env.info(string.format("T=%s Memory usage %d kByte = %.2f MByte",clock,mem,mem/1024)) +end +return mem +end +function UTILS.GetCoalitionName(Coalition) +if Coalition then +if Coalition==coalition.side.BLUE then +return"Blue" +elseif Coalition==coalition.side.RED then +return"Red" +elseif Coalition==coalition.side.NEUTRAL then +return"Neutral" +else +return"Unknown" +end +else +return"Unknown" +end +end +function UTILS.GetCoalitionEnemy(Coalition,Neutral) +local Coalitions={} +if Coalition then +if Coalition==coalition.side.RED then +Coalitions={coalition.side.BLUE} +elseif Coalition==coalition.side.BLUE then +Coalitions={coalition.side.RED} +elseif Coalition==coalition.side.NEUTRAL then +Coalitions={coalition.side.RED,coalition.side.BLUE} +end +end +if Neutral then +table.insert(Coalitions,coalition.side.NEUTRAL) +end +return Coalitions +end +function UTILS.GetModulationName(Modulation) +if Modulation then +if Modulation==0 then +return"AM" +elseif Modulation==1 then +return"FM" +else +return"Unknown" +end +else +return"Unknown" +end +end +function UTILS.GetReportingName(Typename) +local typename=string.lower(Typename) +if string.find(typename,"ka-50",1,true)then +return"Shark" +elseif string.find(typename,"a-50",1,true)then +return"Mainstay" +end +for name,value in pairs(ENUMS.ReportingName.NATO)do +local svalue=string.lower(value) +if string.find(typename,svalue,1,true)then +return name +end +end +return"Bogey" +end +function UTILS.GetCallsignName(Callsign) +for name,value in pairs(CALLSIGN.Aircraft)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.AWACS)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.JTAC)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.Tanker)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.B1B)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.B52)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.F15E)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.F16)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.F18)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.FARP)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.TransportAircraft)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.AH64)do +if value==Callsign then +return name +end +end +for name,value in pairs(CALLSIGN.Kiowa)do +if value==Callsign then +return name +end +end +return"Ghostrider" +end +function UTILS.GMTToLocalTimeDifference() +local theatre=UTILS.GetDCSMap() +if theatre==DCSMAP.Caucasus then +return 4 +elseif theatre==DCSMAP.PersianGulf then +return 4 +elseif theatre==DCSMAP.NTTR then +return-8 +elseif theatre==DCSMAP.Normandy then +return 0 +elseif theatre==DCSMAP.TheChannel then +return 2 +elseif theatre==DCSMAP.Syria then +return 3 +elseif theatre==DCSMAP.MarianaIslands then +return 10 +elseif theatre==DCSMAP.Falklands then +return-3 +elseif theatre==DCSMAP.Sinai then +return 2 +elseif theatre==DCSMAP.Kola then +return 3 +elseif theatre==DCSMAP.Afghanistan then +return 4.5 +elseif theatre==DCSMAP.Iraq then +return 3.0 +elseif theatre==DCSMAP.GermanyCW then +return 1.0 +else +BASE:E(string.format("ERROR: Unknown Map %s in UTILS.GMTToLocal function. Returning 0",tostring(theatre))) +return 0 +end +end +function UTILS.GetDayOfYear(Year,Month,Day) +local floor=math.floor +local n1=floor(275*Month/9) +local n2=floor((Month+9)/12) +local n3=(1+floor((Year-4*floor(Year/4)+2)/3)) +return n1-(n2*n3)+Day-30 +end +function UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,Rising,Tlocal) +local zenith=90.83 +local latitude=Latitude +local longitude=Longitude +local rising=Rising +local n=DayOfYear +Tlocal=Tlocal or 0 +local rad=math.rad +local deg=math.deg +local floor=math.floor +local frac=function(n)return n-floor(n)end +local cos=function(d)return math.cos(rad(d))end +local acos=function(d)return deg(math.acos(d))end +local sin=function(d)return math.sin(rad(d))end +local asin=function(d)return deg(math.asin(d))end +local tan=function(d)return math.tan(rad(d))end +local atan=function(d)return deg(math.atan(d))end +local function fit_into_range(val,min,max) +local range=max-min +local count +if val<min then +count=floor((min-val)/range)+1 +return val+count*range +elseif val>=max then +count=floor((val-max)/range)+1 +return val-count*range +else +return val +end +end +local lng_hour=longitude/15 +local t +if rising then +t=n+((6-lng_hour)/24) +else +t=n+((18-lng_hour)/24) +end +local M=(0.9856*t)-3.289 +local L=fit_into_range(M+(1.916*sin(M))+(0.020*sin(2*M))+282.634,0,360) +local RA=fit_into_range(atan(0.91764*tan(L)),0,360) +local Lquadrant=floor(L/90)*90 +local RAquadrant=floor(RA/90)*90 +RA=RA+Lquadrant-RAquadrant +RA=RA/15 +local sinDec=0.39782*sin(L) +local cosDec=cos(asin(sinDec)) +local cosH=(cos(zenith)-(sinDec*sin(latitude)))/(cosDec*cos(latitude)) +if rising and cosH>1 then +return"N/R" +elseif cosH<-1 then +return"N/S" +end +local H +if rising then +H=360-acos(cosH) +else +H=acos(cosH) +end +H=H/15 +local T=H+RA-(0.06571*t)-6.622 +local UT=fit_into_range(T-lng_hour+Tlocal,0,24) +return floor(UT)*60*60+frac(UT)*60*60 +end +function UTILS.GetSunrise(Day,Month,Year,Latitude,Longitude,Tlocal) +local DayOfYear=UTILS.GetDayOfYear(Year,Month,Day) +return UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tlocal) +end +function UTILS.GetSunset(Day,Month,Year,Latitude,Longitude,Tlocal) +local DayOfYear=UTILS.GetDayOfYear(Year,Month,Day) +return UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,false,Tlocal) +end +function UTILS.GetOSTime() +if os then +local ts=0 +local t=os.date("*t") +local s=t.sec +local m=t.min*60 +local h=t.hour*3600 +ts=s+m+h +return ts +else +return nil +end +end +function UTILS.ShuffleTable(t) +if t==nil or type(t)~="table"then +BASE:I("Error in ShuffleTable: Missing or wrong type of Argument") +return +end +math.random() +math.random() +math.random() +local TempTable={} +for i=1,#t do +local r=math.random(1,#t) +TempTable[i]=t[r] +table.remove(t,r) +end +return TempTable +end +function UTILS.GetRandomTableElement(t,replace) +if t==nil or type(t)~="table"then +BASE:I("Error in ShuffleTable: Missing or wrong type of Argument") +return +end +math.random() +math.random() +math.random() +local r=math.random(#t) +local element=t[r] +if not replace then +table.remove(t,r) +end +return element +end +function UTILS.IsLoadingDoorOpen(unit_name) +local unit=Unit.getByName(unit_name) +if unit~=nil then +local type_name=unit:getTypeName() +BASE:T("TypeName = "..type_name) +if type_name=="Mi-8MT"and(unit:getDrawArgumentValue(38)==1 or unit:getDrawArgumentValue(86)==1 or unit:getDrawArgumentValue(250)<0)then +BASE:T(unit_name.." Cargo doors are open or cargo door not present") +return true +end +if type_name=="Mi-24P"and(unit:getDrawArgumentValue(38)==1 or unit:getDrawArgumentValue(86)==1)then +BASE:T(unit_name.." a side door is open") +return true +end +if type_name=="UH-1H"and(unit:getDrawArgumentValue(43)==1 or unit:getDrawArgumentValue(44)==1)then +BASE:T(unit_name.." a side door is open ") +return true +end +if string.find(type_name,"SA342")and(unit:getDrawArgumentValue(34)==1)then +BASE:T(unit_name.." front door(s) are open or doors removed") +return true +end +if string.find(type_name,"Hercules")and(unit:getDrawArgumentValue(1215)==1 and unit:getDrawArgumentValue(1216)==1)then +BASE:T(unit_name.." rear doors are open") +return true +end +if string.find(type_name,"Hercules")and(unit:getDrawArgumentValue(1220)==1 or unit:getDrawArgumentValue(1221)==1)then +BASE:T(unit_name.." para doors are open") +return true +end +if string.find(type_name,"Hercules")and(unit:getDrawArgumentValue(1217)==1)then +BASE:T(unit_name.." side door is open") +return true +end +if type_name=="Bell-47"then +BASE:T(unit_name.." door is open") +return true +end +if type_name=="UH-60L"and(unit:getDrawArgumentValue(401)==1 or unit:getDrawArgumentValue(402)==1)then +BASE:T(unit_name.." cargo door is open") +return true +end +if type_name=="UH-60L"and(unit:getDrawArgumentValue(38)>0 or unit:getDrawArgumentValue(400)==1)then +BASE:T(unit_name.." front door(s) are open") +return true +end +if type_name=="UH-60L_DAP"and(unit:getDrawArgumentValue(401)==1 or unit:getDrawArgumentValue(402)==1)then +BASE:T(unit_name.." cargo door is open") +return true +end +if type_name=="UH-60L_DAP"and(unit:getDrawArgumentValue(38)>0 or unit:getDrawArgumentValue(400)==1)then +BASE:T(unit_name.." front door(s) are open") +return true +end +if type_name=="AH-64D_BLK_II"then +BASE:T(unit_name.." front door(s) are open") +return true +end +if type_name=="Bronco-OV-10A"then +BASE:T(unit_name.." front door(s) are open") +return true +end +if type_name=="MH-60R"and(unit:getDrawArgumentValue(403)>0 or unit:getDrawArgumentValue(403)==-1)then +BASE:T(unit_name.." cargo door is open") +return true +end +if type_name=="OH58D"then +BASE:T(unit_name.." front door(s) are open") +return true +end +if type_name=="CH-47Fbl1"and(unit:getDrawArgumentValue(86)>0.5)then +BASE:T(unit_name.." rear cargo door is open") +return true +end +local UnitDescriptor=unit:getDesc() +local IsGroundResult=(UnitDescriptor.category==Unit.Category.GROUND_UNIT) +return IsGroundResult +end +return nil +end +function UTILS.GenerateFMFrequencies() +local FreeFMFrequencies={} +for _first=3,7 do +for _second=0,5 do +for _third=0,9 do +local _frequency=((100*_first)+(10*_second)+_third)*100000 +table.insert(FreeFMFrequencies,_frequency) +end +end +end +return FreeFMFrequencies +end +function UTILS.GenerateVHFrequencies() +local _skipFrequencies={ +214,243,264,273,274,288,291.5,295,297.5, +300.5,304,305,307,309.5,310,311,312,312.5,316,317, +320,323,324,325,326,328,329,330,332,335,336,337, +340,342,343,346,348,351,352,353,358, +360,363,364,365,368,372.5,373,374, +380,381,384,385,387,389,391,395,396,399, +403,404,410,412,414,418,420,423, +430,432,435,440,445, +450,455,462,470,485,490, +507,515,520,525,528,540,550,560,563,570,577,580,595, +602,625,641,662,670,680,682,690, +705,720,722,730,735,740,745,750,770,795, +822,830,862,866, +905,907,920,935,942,950,995, +1000,1025,1030,1050,1065,1116,1175,1182,1210,1215 +} +local FreeVHFFrequencies={} +local _start=200000 +while _start<400000 do +local _found=false +for _,value in pairs(_skipFrequencies)do +if value*1000==_start then +_found=true +break +end +end +if _found==false then +table.insert(FreeVHFFrequencies,_start) +end +_start=_start+10000 +end +_start=400000 +while _start<850000 do +local _found=false +for _,value in pairs(_skipFrequencies)do +if value*1000==_start then +_found=true +break +end +end +if _found==false then +table.insert(FreeVHFFrequencies,_start) +end +_start=_start+10000 +end +_start=850000 +while _start<=999000 do +local _found=false +for _,value in pairs(_skipFrequencies)do +if value*1000==_start then +_found=true +break +end +end +if _found==false then +table.insert(FreeVHFFrequencies,_start) +end +_start=_start+50000 +end +return FreeVHFFrequencies +end +function UTILS.GenerateUHFrequencies(Start,End) +local FreeUHFFrequencies={} +local _start=220000000 +if not Start then +while _start<399000000 do +if _start~=243000000 then +table.insert(FreeUHFFrequencies,_start) +end +_start=_start+500000 +end +else +local myend=End*1000000 or 399000000 +local mystart=Start*1000000 or 220000000 +while _start<399000000 do +if _start~=243000000 and(_start<mystart or _start>myend)then +print(_start) +table.insert(FreeUHFFrequencies,_start) +end +_start=_start+500000 +end +end +return FreeUHFFrequencies +end +function UTILS.GenerateLaserCodes() +local jtacGeneratedLaserCodes={} +local function ContainsDigit(_number,_numberToFind) +local _thisNumber=_number +local _thisDigit=0 +while _thisNumber~=0 do +_thisDigit=_thisNumber%10 +_thisNumber=math.floor(_thisNumber/10) +if _thisDigit==_numberToFind then +return true +end +end +return false +end +local _code=1111 +local _count=1 +while _code<1777 and _count<30 do +while true do +_code=_code+1 +if not ContainsDigit(_code,8) +and not ContainsDigit(_code,9) +and not ContainsDigit(_code,0)then +table.insert(jtacGeneratedLaserCodes,_code) +break +end +end +_count=_count+1 +end +return jtacGeneratedLaserCodes +end +function UTILS.EnsureTable(Object,ReturnNil) +if Object then +if type(Object)~="table"then +Object={Object} +end +else +if ReturnNil then +return nil +else +Object={} +end +end +return Object +end +function UTILS.SaveToFile(Path,Filename,Data) +if not io then +BASE:E("ERROR: io not desanitized. Can't save current file.") +return false +end +if Path==nil and not lfs then +BASE:E("WARNING: lfs not desanitized. File will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +local path=nil +if lfs then +path=Path or lfs.writedir() +end +local filename=Filename +if path~=nil then +filename=path.."\\"..filename +end +local f=assert(io.open(filename,"wb")) +f:write(Data) +f:close() +return true +end +function UTILS.LoadFromFile(Path,Filename) +if not io then +BASE:E("ERROR: io not desanitized. Can't save current state.") +return false +end +if Path==nil and not lfs then +BASE:E("WARNING: lfs not desanitized. Loading will look into your DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +local path=nil +if lfs then +path=Path or lfs.writedir() +end +local filename=Filename +if path~=nil then +filename=path.."\\"..filename +end +local exists=UTILS.CheckFileExists(Path,Filename) +if not exists then +BASE:I(string.format("ERROR: File %s does not exist!",filename)) +return false +end +local file=assert(io.open(filename,"rb")) +local loadeddata={} +for line in file:lines()do +loadeddata[#loadeddata+1]=line +end +file:close() +return true,loadeddata +end +function UTILS.CheckFileExists(Path,Filename) +local function _fileexists(name) +local f=io.open(name,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +end +if not io then +BASE:E("ERROR: io not desanitized.") +return false +end +if Path==nil and not lfs then +BASE:E("WARNING: lfs not desanitized. Loading will look into your DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +local path=nil +if lfs then +path=Path or lfs.writedir() +end +local filename=Filename +if path~=nil then +filename=path.."\\"..filename +end +local exists=_fileexists(filename) +if not exists then +BASE:E(string.format("ERROR: File %s does not exist!",filename)) +return false +else +return true +end +end +function UTILS.GetCountPerTypeName(Group) +local units=Group:GetUnits() +local TypeNameTable={} +for _,_unt in pairs(units)do +local unit=_unt +local typen=unit:GetTypeName() +if not TypeNameTable[typen]then +TypeNameTable[typen]=1 +else +TypeNameTable[typen]=TypeNameTable[typen]+1 +end +end +return TypeNameTable +end +function UTILS.SaveStationaryListOfGroups(List,Path,Filename,Structured) +local filename=Filename or"StateListofGroups" +local data="--Save Stationary List of Groups: "..Filename.."\n" +for _,_group in pairs(List)do +local group=GROUP:FindByName(_group) +if group and group:IsAlive()then +local units=group:CountAliveUnits() +local position=group:GetVec3() +if Structured then +local structure=UTILS.GetCountPerTypeName(group) +local strucdata="" +for typen,anzahl in pairs(structure)do +strucdata=strucdata..typen.."=="..anzahl..";" +end +data=string.format("%s%s,%d,%d,%d,%d,%s\n",data,_group,units,position.x,position.y,position.z,strucdata) +else +data=string.format("%s%s,%d,%d,%d,%d\n",data,_group,units,position.x,position.y,position.z) +end +else +data=string.format("%s%s,0,0,0,0\n",data,_group) +end +end +local outcome=UTILS.SaveToFile(Path,Filename,data) +return outcome +end +function UTILS.SaveSetOfGroups(Set,Path,Filename,Structured) +local filename=Filename or"SetOfGroups" +local data="--Save SET of groups: "..Filename.."\n" +local List=Set:GetSetObjects() +for _,_group in pairs(List)do +local group=_group +if group and group:IsAlive()then +local name=group:GetName() +local template=string.gsub(name,"-(.+)$","") +if string.find(name,"AID")then +template=string.gsub(name,"(.AID.%d+$","") +end +if string.find(template,"#")then +template=string.gsub(name,"#(%d+)$","") +end +local units=group:CountAliveUnits() +local position=group:GetVec3() +if Structured then +local structure=UTILS.GetCountPerTypeName(group) +local strucdata="" +for typen,anzahl in pairs(structure)do +strucdata=strucdata..typen.."=="..anzahl..";" +end +data=string.format("%s%s,%s,%d,%d,%d,%d,%s\n",data,name,template,units,position.x,position.y,position.z,strucdata) +else +data=string.format("%s%s,%s,%d,%d,%d,%d\n",data,name,template,units,position.x,position.y,position.z) +end +end +end +local outcome=UTILS.SaveToFile(Path,Filename,data) +return outcome +end +function UTILS.SaveSetOfStatics(Set,Path,Filename) +local filename=Filename or"SetOfStatics" +local data="--Save SET of statics: "..Filename.."\n" +local List=Set:GetSetObjects() +for _,_group in pairs(List)do +local group=_group +if group and group:IsAlive()then +local name=group:GetName() +local position=group:GetVec3() +data=string.format("%s%s,%d,%d,%d\n",data,name,position.x,position.y,position.z) +end +end +local outcome=UTILS.SaveToFile(Path,Filename,data) +return outcome +end +function UTILS.SaveStationaryListOfStatics(List,Path,Filename) +local filename=Filename or"StateListofStatics" +local data="--Save Stationary List of Statics: "..Filename.."\n" +for _,_group in pairs(List)do +local group=STATIC:FindByName(_group,false) +if group and group:IsAlive()then +local position=group:GetVec3() +data=string.format("%s%s,1,%d,%d,%d\n",data,_group,position.x,position.y,position.z) +else +data=string.format("%s%s,0,0,0,0\n",data,_group) +end +end +local outcome=UTILS.SaveToFile(Path,Filename,data) +return outcome +end +function UTILS.LoadStationaryListOfGroups(Path,Filename,Reduce,Structured,Cinematic,Effect,Density) +local fires={} +local function Smokers(name,coord,effect,density) +local eff=math.random(8) +if type(effect)=="number"then eff=effect end +coord:BigSmokeAndFire(eff,density,name) +table.insert(fires,name) +end +local function Cruncher(group,typename,anzahl) +local units=group:GetUnits() +local reduced=0 +for _,_unit in pairs(units)do +local typo=_unit:GetTypeName() +if typename==typo then +if Cinematic then +local coordinate=_unit:GetCoordinate() +local name=_unit:GetName() +Smokers(name,coordinate,Effect,Density) +end +_unit:Destroy(false) +reduced=reduced+1 +if reduced==anzahl then break end +end +end +end +local reduce=true +if Reduce==false then reduce=false end +local filename=Filename or"StateListofGroups" +local datatable={} +if UTILS.CheckFileExists(Path,filename)then +local outcome,loadeddata=UTILS.LoadFromFile(Path,Filename) +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local groupname=dataset[1] +local size=tonumber(dataset[2]) +local posx=tonumber(dataset[3]) +local posy=tonumber(dataset[4]) +local posz=tonumber(dataset[5]) +local structure=dataset[6] +local coordinate=COORDINATE:NewFromVec3({x=posx,y=posy,z=posz}) +local data={groupname=groupname,size=size,coordinate=coordinate,group=GROUP:FindByName(groupname)} +if reduce then +local actualgroup=GROUP:FindByName(groupname) +if actualgroup and actualgroup:IsAlive()and actualgroup:CountAliveUnits()>size then +if Structured and structure then +local loadedstructure={} +local strcset=UTILS.Split(structure,";") +for _,_data in pairs(strcset)do +local datasplit=UTILS.Split(_data,"==") +loadedstructure[datasplit[1]]=tonumber(datasplit[2]) +end +local originalstructure=UTILS.GetCountPerTypeName(actualgroup) +for _name,_number in pairs(originalstructure)do +local loadednumber=0 +if loadedstructure[_name]then +loadednumber=loadedstructure[_name] +end +local reduce=false +if loadednumber<_number then reduce=true end +if reduce then +Cruncher(actualgroup,_name,_number-loadednumber) +end +end +else +local reduction=actualgroup:CountAliveUnits()-size +local units=actualgroup:GetUnits() +local units2=UTILS.ShuffleTable(units) +for i=1,reduction do +units2[i]:Destroy(false) +end +end +end +end +table.insert(datatable,data) +end +else +return nil +end +return datatable,fires +end +function UTILS.LoadSetOfGroups(Path,Filename,Spawn,Structured,Cinematic,Effect,Density) +local fires={} +local usedtemplates={} +local spawn=true +if Spawn==false then spawn=false end +local filename=Filename or"SetOfGroups" +local setdata=SET_GROUP:New() +local datatable={} +local function Smokers(name,coord,effect,density) +local eff=math.random(8) +if type(effect)=="number"then eff=effect end +coord:BigSmokeAndFire(eff,density,name) +table.insert(fires,name) +end +local function Cruncher(group,typename,anzahl) +local units=group:GetUnits() +local reduced=0 +for _,_unit in pairs(units)do +local typo=_unit:GetTypeName() +if typename==typo then +if Cinematic then +local coordinate=_unit:GetCoordinate() +local name=_unit:GetName() +Smokers(name,coordinate,Effect,Density) +end +_unit:Destroy(false) +reduced=reduced+1 +if reduced==anzahl then break end +end +end +end +local function PostSpawn(args) +local spwndgrp=args[1] +local size=args[2] +local structure=args[3] +setdata:AddObject(spwndgrp) +local actualsize=spwndgrp:CountAliveUnits() +if actualsize>size then +if Structured and structure then +local loadedstructure={} +local strcset=UTILS.Split(structure,";") +for _,_data in pairs(strcset)do +local datasplit=UTILS.Split(_data,"==") +loadedstructure[datasplit[1]]=tonumber(datasplit[2]) +end +local originalstructure=UTILS.GetCountPerTypeName(spwndgrp) +for _name,_number in pairs(originalstructure)do +local loadednumber=0 +if loadedstructure[_name]then +loadednumber=loadedstructure[_name] +end +local reduce=false +if loadednumber<_number then reduce=true end +if reduce then +Cruncher(spwndgrp,_name,_number-loadednumber) +end +end +else +local reduction=actualsize-size +local units=spwndgrp:GetUnits() +local units2=UTILS.ShuffleTable(units) +for i=1,reduction do +units2[i]:Destroy(false) +end +end +end +end +local function MultiUse(Data) +local template=Data.template +if template and usedtemplates[template]and usedtemplates[template].used and usedtemplates[template].used>1 then +if not usedtemplates[template].done then +local spwnd=0 +local spawngrp=SPAWN:New(template) +spawngrp:InitLimit(0,usedtemplates[template].used) +for _,_entry in pairs(usedtemplates[template].data)do +spwnd=spwnd+1 +local sgrp=spawngrp:SpawnFromCoordinate(_entry.coordinate,spwnd) +BASE:ScheduleOnce(0.5,PostSpawn,{sgrp,_entry.size,_entry.structure}) +end +usedtemplates[template].done=true +end +return true +else +return false +end +end +if UTILS.CheckFileExists(Path,filename)then +local outcome,loadeddata=UTILS.LoadFromFile(Path,Filename) +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local groupname=dataset[1] +local template=dataset[2] +local size=tonumber(dataset[3]) +local posx=tonumber(dataset[4]) +local posy=tonumber(dataset[5]) +local posz=tonumber(dataset[6]) +local structure=dataset[7] +local coordinate=COORDINATE:NewFromVec3({x=posx,y=posy,z=posz}) +local group=nil +if size>0 then +local data={groupname=groupname,size=size,coordinate=coordinate,template=template,structure=structure} +table.insert(datatable,data) +if usedtemplates[template]then +usedtemplates[template].used=usedtemplates[template].used+1 +table.insert(usedtemplates[template].data,data) +else +usedtemplates[template]={ +data={}, +used=1, +done=false, +} +table.insert(usedtemplates[template].data,data) +end +end +end +for _id,_entry in pairs(datatable)do +if spawn and not MultiUse(_entry)and _entry.size>0 then +local group=SPAWN:New(_entry.template) +local sgrp=group:SpawnFromCoordinate(_entry.coordinate) +BASE:ScheduleOnce(0.5,PostSpawn,{sgrp,_entry.size,_entry.structure}) +end +end +else +return nil +end +if spawn then +return setdata,fires +else +return datatable +end +end +function UTILS.LoadSetOfStatics(Path,Filename) +local filename=Filename or"SetOfStatics" +local datatable=SET_STATIC:New() +if UTILS.CheckFileExists(Path,filename)then +local outcome,loadeddata=UTILS.LoadFromFile(Path,Filename) +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local staticname=dataset[1] +local StaticObject=STATIC:FindByName(staticname,false) +if StaticObject then +datatable:AddObject(StaticObject) +end +end +else +return nil +end +return datatable +end +function UTILS.LoadStationaryListOfStatics(Path,Filename,Reduce,Dead,Cinematic,Effect,Density) +local fires={} +local reduce=true +if Reduce==false then reduce=false end +local filename=Filename or"StateListofStatics" +local datatable={} +if UTILS.CheckFileExists(Path,filename)then +local outcome,loadeddata=UTILS.LoadFromFile(Path,Filename) +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local staticname=dataset[1] +local size=tonumber(dataset[2]) +local posx=tonumber(dataset[3]) +local posy=tonumber(dataset[4]) +local posz=tonumber(dataset[5]) +local coordinate=COORDINATE:NewFromVec3({x=posx,y=posy,z=posz}) +local data={staticname=staticname,size=size,coordinate=coordinate,static=STATIC:FindByName(staticname,false)} +table.insert(datatable,data) +if size==0 and reduce then +local static=STATIC:FindByName(staticname,false) +if static then +if Dead then +local deadobject=SPAWNSTATIC:NewFromStatic(staticname,static:GetCountry()) +deadobject:InitDead(true) +local heading=static:GetHeading() +local coord=static:GetCoordinate() +static:Destroy(false) +deadobject:SpawnFromCoordinate(coord,heading,staticname) +if Cinematic then +local effect=math.random(8) +if type(Effect)=="number"then +effect=Effect +end +coord:BigSmokeAndFire(effect,Density,staticname) +table.insert(fires,staticname) +end +else +static:Destroy(false) +end +end +end +end +else +return nil +end +return datatable,fires +end +function UTILS.BearingToCardinal(Heading) +if Heading>=0 and Heading<=22 then return"North" +elseif Heading>=23 and Heading<=66 then return"North-East" +elseif Heading>=67 and Heading<=101 then return"East" +elseif Heading>=102 and Heading<=146 then return"South-East" +elseif Heading>=147 and Heading<=201 then return"South" +elseif Heading>=202 and Heading<=246 then return"South-West" +elseif Heading>=247 and Heading<=291 then return"West" +elseif Heading>=292 and Heading<=338 then return"North-West" +elseif Heading>=339 then return"North" +end +end +function UTILS.ToStringBRAANATO(FromGrp,ToGrp) +local BRAANATO="Merged." +local GroupNumber=ToGrp:GetSize() +local GroupWords="Singleton" +if GroupNumber==2 then GroupWords="Two-Ship" +elseif GroupNumber>=3 then GroupWords="Heavy" +end +local grpLeadUnit=ToGrp:GetUnit(1) +local tgtCoord=grpLeadUnit:GetCoordinate() +local currentCoord=FromGrp:GetCoordinate() +local hdg=UTILS.Round(ToGrp:GetHeading()/100,1)*100 +local bearing=UTILS.Round(currentCoord:HeadingTo(tgtCoord),0) +local rangeMetres=tgtCoord:Get2DDistance(currentCoord) +local rangeNM=UTILS.Round(UTILS.MetersToNM(rangeMetres),0) +local aspect=tgtCoord:ToStringAspect(currentCoord) +local alt=UTILS.Round(UTILS.MetersToFeet(grpLeadUnit:GetAltitude())/1000,0) +local track=UTILS.BearingToCardinal(hdg) +if rangeNM>3 then +if aspect==""then +BRAANATO=string.format("%s, BRA, %03d, %d miles, Angels %d, Track %s",GroupWords,bearing,rangeNM,alt,track) +else +BRAANATO=string.format("%s, BRAA, %03d, %d miles, Angels %d, %s, Track %s",GroupWords,bearing,rangeNM,alt,aspect,track) +end +end +return BRAANATO +end +function UTILS.IsInTable(Table,Object,Key) +for key,object in pairs(Table)do +if Key then +if Object[Key]==object[Key]then +return true +end +else +if object==Object then +return true +end +end +end +return false +end +function UTILS.IsAnyInTable(Table,Objects,Key) +for _,Object in pairs(UTILS.EnsureTable(Objects))do +for key,object in pairs(Table)do +if Key then +if Object[Key]==object[Key]then +return true +end +else +if object==Object then +return true +end +end +end +end +return false +end +function UTILS.PlotRacetrack(Coordinate,Altitude,Speed,Heading,Leg,Coalition,Color,Alpha,LineType,ReadOnly) +local fix_coordinate=Coordinate +local altitude=Altitude +local speed=Speed or 350 +local heading=Heading or 270 +local leg_distance=Leg or 10 +local coalition=Coalition or-1 +local color=Color or{1,0,0} +local alpha=Alpha or 1 +local lineType=LineType or 1 +speed=UTILS.IasToTas(speed,UTILS.FeetToMeters(altitude),oatcorr) +local turn_radius=0.0211*speed-3.01 +local point_two=fix_coordinate:Translate(UTILS.NMToMeters(leg_distance),heading,true,false) +local point_three=point_two:Translate(UTILS.NMToMeters(turn_radius)*2,heading-90,true,false) +local point_four=fix_coordinate:Translate(UTILS.NMToMeters(turn_radius)*2,heading-90,true,false) +local circle_center_fix_four=point_two:Translate(UTILS.NMToMeters(turn_radius),heading-90,true,false) +local circle_center_two_three=fix_coordinate:Translate(UTILS.NMToMeters(turn_radius),heading-90,true,false) +fix_coordinate:LineToAll(point_two,coalition,color,alpha,lineType) +point_four:LineToAll(point_three,coalition,color,alpha,lineType) +circle_center_fix_four:CircleToAll(UTILS.NMToMeters(turn_radius),coalition,color,alpha,nil,0,lineType) +circle_center_two_three:CircleToAll(UTILS.NMToMeters(turn_radius),coalition,color,alpha,nil,0,lineType) +end +function UTILS.TimeNow() +return UTILS.SecondsToClock(timer.getAbsTime(),false,false) +end +function UTILS.TimeDifferenceInSeconds(start_time,end_time) +return UTILS.ClockToSeconds(end_time)-UTILS.ClockToSeconds(start_time) +end +function UTILS.TimeLaterThan(time_string) +if timer.getAbsTime()>UTILS.ClockToSeconds(time_string)then +return true +end +return false +end +function UTILS.TimeBefore(time_string) +if timer.getAbsTime()<UTILS.ClockToSeconds(time_string)then +return true +end +return false +end +function UTILS.CombineTimeStrings(time_string_01,time_string_02) +local hours1,minutes1,seconds1=time_string_01:match("(%d+):(%d+):(%d+)") +local hours2,minutes2,seconds2=time_string_02:match("(%d+):(%d+):(%d+)") +local total_seconds=tonumber(seconds1)+tonumber(seconds2)+tonumber(minutes1)*60+tonumber(minutes2)*60+tonumber(hours1)*3600+tonumber(hours2)*3600 +total_seconds=total_seconds%(24*3600) +if total_seconds<0 then +total_seconds=total_seconds+24*3600 +end +local hours=math.floor(total_seconds/3600) +total_seconds=total_seconds-hours*3600 +local minutes=math.floor(total_seconds/60) +local seconds=total_seconds%60 +return string.format("%02d:%02d:%02d",hours,minutes,seconds) +end +function UTILS.SubtractTimeStrings(time_string_01,time_string_02) +local hours1,minutes1,seconds1=time_string_01:match("(%d+):(%d+):(%d+)") +local hours2,minutes2,seconds2=time_string_02:match("(%d+):(%d+):(%d+)") +local total_seconds=tonumber(seconds1)-tonumber(seconds2)+tonumber(minutes1)*60-tonumber(minutes2)*60+tonumber(hours1)*3600-tonumber(hours2)*3600 +total_seconds=total_seconds%(24*3600) +if total_seconds<0 then +total_seconds=total_seconds+24*3600 +end +local hours=math.floor(total_seconds/3600) +total_seconds=total_seconds-hours*3600 +local minutes=math.floor(total_seconds/60) +local seconds=total_seconds%60 +return string.format("%02d:%02d:%02d",hours,minutes,seconds) +end +function UTILS.TimeBetween(start_time,end_time) +return UTILS.TimeLaterThan(start_time)and UTILS.TimeBefore(end_time) +end +function UTILS.PercentageChance(chance) +chance=chance or math.random(0,100) +chance=UTILS.Clamp(chance,0,100) +local percentage=math.random(0,100) +if percentage<chance then +return true +end +return false +end +function UTILS.Clamp(value,min,max) +if value<min then value=min end +if value>max then value=max end +return value +end +function UTILS.ClampAngle(value) +if value>360 then return value-360 end +if value<0 then return value+360 end +return value +end +function UTILS.RemapValue(value,old_min,old_max,new_min,new_max) +new_min=new_min or 0 +new_max=new_max or 100 +local old_range=old_max-old_min +local new_range=new_max-new_min +local percentage=(value-old_min)/old_range +return(new_range*percentage)+new_min +end +function UTILS.RandomPointInTriangle(pt1,pt2,pt3) +local pt={math.random(),math.random()} +table.sort(pt) +local s=pt[1] +local t=pt[2]-pt[1] +local u=1-pt[2] +return{x=s*pt1.x+t*pt2.x+u*pt3.x, +y=s*pt1.y+t*pt2.y+u*pt3.y} +end +function UTILS.AngleBetween(angle,min,max) +angle=(360+(angle%360))%360 +min=(360+min%360)%360 +max=(360+max%360)%360 +if min<max then return min<=angle and angle<=max end +return min<=angle or angle<=max +end +function UTILS.WriteJSON(data,file_path) +package.path=package.path..";.\\Scripts\\?.lua" +local JSON=require("json") +local pretty_json_text=JSON:encode_pretty(data) +local write_file=io.open(file_path,"w") +write_file:write(pretty_json_text) +write_file:close() +end +function UTILS.ReadJSON(file_path) +package.path=package.path..";.\\Scripts\\?.lua" +local JSON=require("json") +local read_file=io.open(file_path,"r") +local contents=read_file:read("*a") +io.close(read_file) +return JSON:decode(contents) +end +function UTILS.GetZoneProperties(zone_name) +local return_table={} +for _,zone in pairs(env.mission.triggers.zones)do +if zone["name"]==zone_name then +if table.length(zone["properties"])>0 then +for _,property in pairs(zone["properties"])do +return_table[property["key"]]=property["value"] +end +return return_table +else +BASE:I(string.format("%s doesn't have any properties",zone_name)) +return{} +end +end +end +end +function UTILS.RotatePointAroundPivot(point,pivot,angle) +local radians=math.rad(angle) +local x=point.x-pivot.x +local y=point.y-pivot.y +local rotated_x=x*math.cos(radians)-y*math.sin(radians) +local rotatex_y=x*math.sin(radians)+y*math.cos(radians) +local original_x=rotated_x+pivot.x +local original_y=rotatex_y+pivot.y +return{x=original_x,y=original_y} +end +function UTILS.UniqueName(base) +base=base or"" +local ran=tostring(math.random(0,1000000)) +if base==""then +return ran +end +return base.."_"..ran +end +function string.startswith(str,value) +return string.sub(str,1,string.len(value))==value +end +function string.endswith(str,value) +return value==""or str:sub(-#value)==value +end +function string.split(input,separator) +local parts={} +for part in input:gmatch("[^"..separator.."]+")do +table.insert(parts,part) +end +return parts +end +function string.contains(str,value) +return string.match(str,value) +end +function table.move_object(obj,from_table,to_table) +local index +for i,v in pairs(from_table)do +if v==obj then +index=i +end +end +if index then +local moved=table.remove(from_table,index) +table.insert_unique(to_table,moved) +end +end +function table.contains(tbl,element) +if element==nil or tbl==nil then return false end +local index=1 +while tbl[index]do +if tbl[index]==element then +return true +end +index=index+1 +end +return false +end +function table.contains_key(tbl,key) +if tbl[key]~=nil then return true else return false end +end +function table.insert_unique(tbl,element) +if element==nil or tbl==nil then return end +if not table.contains(tbl,element)then +table.insert(tbl,element) +end +end +function table.remove_by_value(tbl,element) +local indices_to_remove={} +local index=1 +for _,value in pairs(tbl)do +if value==element then +table.insert(indices_to_remove,index) +end +index=index+1 +end +for _,idx in pairs(indices_to_remove)do +table.remove(tbl,idx) +end +end +function table.remove_key(table,key) +local element=table[key] +table[key]=nil +return element +end +function table.index_of(table,element) +for i,v in ipairs(table)do +if v==element then +return i +end +end +return nil +end +function table.length(T) +local count=0 +for _ in pairs(T)do count=count+1 end +return count +end +function table.slice(tbl,first,last) +local sliced={} +local start=first or 1 +local stop=last or table.length(tbl) +local count=1 +for key,value in pairs(tbl)do +if count>=start and count<=stop then +sliced[key]=value +end +count=count+1 +end +return sliced +end +function table.count_value(tbl,value) +local count=0 +for _,item in pairs(tbl)do +if item==value then count=count+1 end +end +return count +end +function table.combine(t1,t2) +if t1==nil and t2==nil then +BASE:E("Both tables were empty!") +end +if t1==nil then return t2 end +if t2==nil then return t1 end +for i=1,#t2 do +t1[#t1+1]=t2[i] +end +return t1 +end +function table.merge(t1,t2) +for k,v in pairs(t2)do +if(type(v)=="table")and(type(t1[k]or false)=="table")then +table.merge(t1[k],t2[k]) +else +t1[k]=v +end +end +return t1 +end +function table.add(tbl,item) +tbl[#tbl+1]=item +end +function table.shuffle(tbl) +local new_table={} +for _,value in ipairs(tbl)do +local pos=math.random(1,#new_table+1) +table.insert(new_table,pos,value) +end +return new_table +end +function table.find_key_value_pair(tbl,key,value) +for k,v in pairs(tbl)do +if type(v)=="table"then +local result=table.find_key_value_pair(v,key,value) +if result~=nil then +return result +end +elseif k==key and v==value then +return tbl +end +end +return nil +end +function UTILS.DecimalToOctal(Number) +if Number<8 then return Number end +local number=tonumber(Number) +local octal="" +local n=1 +while number>7 do +local number1=number%8 +octal=string.format("%d",number1)..octal +local number2=math.abs(number/8) +if number2<8 then +octal=string.format("%d",number2)..octal +end +number=number2 +n=n+1 +end +return tonumber(octal) +end +function UTILS.OctalToDecimal(Number) +return tonumber(Number,8) +end +function UTILS.HexToRGBA(hex_string) +local hexNumber=tonumber(string.sub(hex_string,3),16) +local alpha=hexNumber%256 +hexNumber=(hexNumber-alpha)/256 +local blue=hexNumber%256 +hexNumber=(hexNumber-blue)/256 +local green=hexNumber%256 +hexNumber=(hexNumber-green)/256 +local red=hexNumber%256 +return{R=red,G=green,B=blue,A=alpha} +end +function UTILS.SaveSetOfOpsGroups(Set,Path,Filename,Structured) +local filename=Filename or"SetOfGroups" +local data="--Save SET of groups: (name,legion,template,alttemplate,units,position.x,position.y,position.z,strucdata) "..Filename.."\n" +local List=Set:GetSetObjects() +for _,_group in pairs(List)do +local group=_group:GetGroup() +if group and group:IsAlive()then +local name=group:GetName() +local template=string.gsub(name,"(.AID.%d+$","") +if string.find(template,"#")then +template=string.gsub(name,"#(%d+)$","") +end +local alttemplate=_group.templatename or"none" +local legiono=_group.legion +local legion="none" +if legiono and type(legiono)=="table"and legiono.ClassName then +legion=legiono:GetName() +local asset=legiono:GetAssetByName(name) +alttemplate=asset.templatename +end +local units=group:CountAliveUnits() +local position=group:GetVec3() +if Structured then +local structure=UTILS.GetCountPerTypeName(group) +local strucdata="" +for typen,anzahl in pairs(structure)do +strucdata=strucdata..typen.."=="..anzahl..";" +end +data=string.format("%s%s,%s,%s,%s,%d,%d,%d,%d,%s\n",data,name,legion,template,alttemplate,units,position.x,position.y,position.z,strucdata) +else +data=string.format("%s%s,%s,%s,%s,%d,%d,%d,%d\n",data,name,legion,template,alttemplate,units,position.x,position.y,position.z) +end +end +end +local outcome=UTILS.SaveToFile(Path,Filename,data) +return outcome +end +function UTILS.LoadSetOfOpsGroups(Path,Filename) +local filename=Filename or"SetOfGroups" +local datatable={} +if UTILS.CheckFileExists(Path,filename)then +local outcome,loadeddata=UTILS.LoadFromFile(Path,Filename) +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local groupname=dataset[1] +local legion=dataset[2] +local template=dataset[3] +local alttemplate=dataset[4] +local size=tonumber(dataset[5]) +local posx=tonumber(dataset[6]) +local posy=tonumber(dataset[7]) +local posz=tonumber(dataset[8]) +local structure=dataset[9] +local coordinate=COORDINATE:NewFromVec3({x=posx,y=posy,z=posz}) +if size>0 then +local data={groupname=groupname,size=size,coordinate=coordinate,template=template,structure=structure,legion=legion,alttemplate=alttemplate} +table.insert(datatable,data) +end +end +else +return nil +end +return datatable +end +function UTILS.ClockHeadingString(refHdg,tgtHdg) +local relativeAngle=tgtHdg-refHdg +if relativeAngle<0 then +relativeAngle=relativeAngle+360 +end +local clockPos=math.ceil((relativeAngle%360)/30) +return clockPos.." o'clock" +end +function UTILS.MGRSStringToSRSFriendly(Text,Slow) +local Text=string.gsub(Text,"MGRS ","") +Text=string.gsub(Text,"%s+","") +Text=string.gsub(Text,"([%a%d])","%1;") +Text=string.gsub(Text,"A","Alpha") +Text=string.gsub(Text,"B","Bravo") +Text=string.gsub(Text,"C","Charlie") +Text=string.gsub(Text,"D","Delta") +Text=string.gsub(Text,"E","Echo") +Text=string.gsub(Text,"F","Foxtrot") +Text=string.gsub(Text,"G","Golf") +Text=string.gsub(Text,"H","Hotel") +Text=string.gsub(Text,"I","India") +Text=string.gsub(Text,"J","Juliett") +Text=string.gsub(Text,"K","Kilo") +Text=string.gsub(Text,"L","Lima") +Text=string.gsub(Text,"M","Mike") +Text=string.gsub(Text,"N","November") +Text=string.gsub(Text,"O","Oscar") +Text=string.gsub(Text,"P","Papa") +Text=string.gsub(Text,"Q","Quebec") +Text=string.gsub(Text,"R","Romeo") +Text=string.gsub(Text,"S","Sierra") +Text=string.gsub(Text,"T","Tango") +Text=string.gsub(Text,"U","Uniform") +Text=string.gsub(Text,"V","Victor") +Text=string.gsub(Text,"W","Whiskey") +Text=string.gsub(Text,"X","Xray") +Text=string.gsub(Text,"Y","Yankee") +Text=string.gsub(Text,"Z","Zulu") +Text=string.gsub(Text,"0","zero") +Text=string.gsub(Text,"9","niner") +if Slow then +Text='<prosody rate="slow">'..Text..'</prosody>' +end +Text="MGRS;"..Text +return Text +end +function UTILS.ReadCSV(filename) +if not UTILS.FileExists(filename)then +env.error("File does not exist") +return nil +end +local function _loadfile(filename) +local f=io.open(filename,"rb") +if f then +local data=f:read("*all") +f:close() +return data +else +BASE:E(string.format("WARNING: Could read data from file %s!",tostring(filename))) +return nil +end +end +local data=_loadfile(filename) +local lines=UTILS.Split(data,"\n") +for _,line in pairs(lines)do +line=string.gsub(line,"[\n\r]","") +end +local sep=";" +local columns=UTILS.Split(lines[1],sep) +table.remove(lines,1) +local csvdata={} +for i,line in pairs(lines)do +line=string.gsub(line,"[\n\r]","") +local row={} +for j,value in pairs(UTILS.Split(line,sep))do +local key=string.gsub(columns[j],"[\n\r]","") +row[key]=value +end +table.insert(csvdata,row) +end +return csvdata +end +function UTILS.LCGRandomSeed(seed) +UTILS.lcg={ +seed=seed or math.random(1,2^32-1), +a=1664525, +c=1013904223, +m=2^32 +} +end +function UTILS.LCGRandom() +if UTILS.lcg==nil then +UTILS.LCGRandomSeed() +end +UTILS.lcg.seed=(UTILS.lcg.a*UTILS.lcg.seed+UTILS.lcg.c)%UTILS.lcg.m +return UTILS.lcg.seed/UTILS.lcg.m +end +function UTILS.GenerateGridPoints(startVec2,n,spacingX,spacingY) +local points={} +local gridSize=math.ceil(math.sqrt(n)) +local count=0 +local n=n or 1 +local spacingX=spacingX or 100 +local spacingY=spacingY or 100 +local startX=startVec2.x or 100 +local startY=startVec2.y or 100 +for row=0,gridSize-1 do +for col=0,gridSize-1 do +if count>=n then +break +end +local point={ +x=startX+(col*spacingX), +y=startY+(row*spacingY) +} +table.insert(points,point) +count=count+1 +end +if count>=n then +break +end +end +return points +end +function UTILS.SpawnFARPAndFunctionalStatics(Name,Coordinate,FARPType,Coalition,Country,CallSign,Frequency,Modulation,ADF,SpawnRadius,VehicleTemplate,Liquids,Equipment,Airframes,F10Text,DynamicSpawns,HotStart,NumberPads,SpacingX,SpacingY) +local function PopulateStorage(Name,liquids,equip,airframes) +local newWH=STORAGE:New(Name) +if liquids and liquids>0 then +newWH:SetLiquid(STORAGE.Liquid.DIESEL,liquids) +newWH:SetLiquid(STORAGE.Liquid.GASOLINE,liquids) +newWH:SetLiquid(STORAGE.Liquid.JETFUEL,liquids) +newWH:SetLiquid(STORAGE.Liquid.MW50,liquids) +end +if equip and equip>0 then +for cat,nitem in pairs(ENUMS.Storage.weapons)do +for name,item in pairs(nitem)do +newWH:SetItem(item,equip) +end +end +end +if airframes and airframes>0 then +for typename in pairs(CSAR.AircraftType)do +newWH:SetItem(typename,airframes) +end +end +end +local farplocation=Coordinate +local farptype=FARPType or ENUMS.FARPType.FARP +local Coalition=Coalition or coalition.side.BLUE +local callsign=CallSign or CALLSIGN.FARP.Berlin +local freq=Frequency or 127.5 +local mod=Modulation or radio.modulation.AM +local radius=SpawnRadius or 100 +if radius<0 or radius>150 then radius=100 end +local liquids=Liquids or 10 +liquids=liquids*1000 +local equip=Equipment or 10 +local airframes=Airframes or 10 +local statictypes=ENUMS.FARPObjectTypeNamesAndShape[farptype]or{TypeName="FARP",ShapeName="FARPS"} +local STypeName=statictypes.TypeName +local SShapeName=statictypes.ShapeName +local Country=Country or(Coalition==coalition.side.BLUE and country.id.USA or country.id.RUSSIA) +local ReturnObjects={} +local NumberPads=NumberPads or 1 +local SpacingX=SpacingX or 100 +local SpacingY=SpacingY or 100 +local FarpVec2=Coordinate:GetVec2() +if NumberPads>1 then +local Grid=UTILS.GenerateGridPoints(FarpVec2,NumberPads,SpacingX,SpacingY) +local groupData={ +["visible"]=true, +["hidden"]=false, +["units"]={}, +["y"]=0, +["x"]=0, +["name"]=Name, +} +local unitData={ +["category"]="Heliports", +["type"]=STypeName, +["y"]=0, +["x"]=0, +["name"]=Name, +["heading"]=0, +["heliport_modulation"]=mod, +["heliport_frequency"]=freq, +["heliport_callsign_id"]=callsign, +["dead"]=false, +["shape_name"]=SShapeName, +["dynamicSpawn"]=DynamicSpawns, +["allowHotStart"]=HotStart, +} +for id,gridpoint in ipairs(Grid)do +local UnitTemplate=UTILS.DeepCopy(unitData) +UnitTemplate.x=gridpoint.x +UnitTemplate.y=gridpoint.y +UnitTemplate.name=Name.."-"..id +table.insert(groupData.units,UnitTemplate) +if id==1 then +groupData.x=gridpoint.x +groupData.y=gridpoint.y +end +end +local Static=coalition.addGroup(Country,-1,groupData) +local Event={ +id=EVENTS.Birth, +time=timer.getTime(), +initiator=Static +} +world.onEvent(Event) +PopulateStorage(Name.."-1",liquids,equip,airframes) +else +local newfarp=SPAWNSTATIC:NewFromType(STypeName,"Heliports",Country) +newfarp:InitShape(SShapeName) +newfarp:InitFARP(callsign,freq,mod,DynamicSpawns,HotStart) +local spawnedfarp=newfarp:SpawnFromCoordinate(farplocation,0,Name) +table.insert(ReturnObjects,spawnedfarp) +PopulateStorage(Name,liquids,equip,airframes) +end +local FARPStaticObjectsNato={ +["FUEL"]={TypeName="FARP Fuel Depot",ShapeName="GSM Rus",Category="Fortifications"}, +["AMMO"]={TypeName="FARP Ammo Dump Coating",ShapeName="SetkaKP",Category="Fortifications"}, +["TENT"]={TypeName="FARP Tent",ShapeName="PalatkaB",Category="Fortifications"}, +["WINDSOCK"]={TypeName="Windsock",ShapeName="H-Windsock_RW",Category="Fortifications"}, +} +local farpobcount=0 +for _name,_object in pairs(FARPStaticObjectsNato)do +local objloc=farplocation:Translate(radius,farpobcount*30) +local heading=objloc:HeadingTo(farplocation) +local newobject=SPAWNSTATIC:NewFromType(_object.TypeName,_object.Category,Country) +newobject:InitShape(_object.ShapeName) +newobject:InitHeading(heading) +newobject:SpawnFromCoordinate(objloc,farpobcount*30,_name.." - "..Name) +table.insert(ReturnObjects,newobject) +farpobcount=farpobcount+1 +end +if VehicleTemplate and type(VehicleTemplate)=="string"then +local vcoordinate=farplocation:Translate(radius,farpobcount*30) +local heading=vcoordinate:HeadingTo(farplocation) +local vehicles=SPAWN:NewWithAlias(VehicleTemplate,"FARP Vehicles - "..Name) +vehicles:InitGroupHeading(heading) +vehicles:InitCountry(Country) +vehicles:InitCoalition(Coalition) +vehicles:InitDelayOff() +local spawnedvehicle=vehicles:SpawnFromCoordinate(vcoordinate) +table.insert(ReturnObjects,spawnedvehicle) +end +local ADFName +if ADF and type(ADF)=="number"then +local ADFFreq=ADF*1000 +local Sound="l10n/DEFAULT/beacon.ogg" +local vec3=farplocation:GetVec3() +ADFName=Name.." ADF "..tostring(ADF).."KHz" +trigger.action.radioTransmission(Sound,vec3,0,true,ADFFreq,250,ADFName) +end +local MarkerID=nil +if F10Text then +local Color={0,0,1} +if Coalition==coalition.side.RED then +Color={1,0,0} +elseif Coalition==coalition.side.NEUTRAL then +Color={0,1,0} +end +local Alpha=0.75 +local coordinate=Coordinate:Translate(600,0) +MarkerID=coordinate:TextToAll(F10Text,Coalition,Color,1,{1,1,1},Alpha,14,true) +end +return ReturnObjects,ADFName,MarkerID +end +function UTILS.SpawnMASHStatics(Name,Coordinate,Country,ADF,Livery,DeployHelo,MASHRadio,MASHRadioModulation,MASHCallsign,Templates) +local MASHTemplates={ +[1]={category='Infantry',type='Soldier M4',shape_name='none',heading=0,x=0.000000,y=0.000000,}, +[2]={category='Infantry',type='Soldier M4',shape_name='none',heading=0,x=0.313533,y=8.778935,}, +[3]={category='Infantry',type='Soldier M4',shape_name='none',heading=0,x=16.303737,y=20.379671,}, +[4]={category='Helicopters',type='CH-47Fbl1',shape_name='none',heading=0,x=-20.047735,y=-63.166179,livery_id="us army dark green",}, +[5]={category='Infantry',type='Soldier M4',shape_name='none',heading=0,x=26.650339,y=20.066138,}, +[6]={category='Heliports',type='FARP_SINGLE_01',shape_name='FARP_SINGLE_01',heading=0,x=-25.432292,y=9.077099,}, +[7]={category='Heliports',type='FARP_SINGLE_01',shape_name='FARP_SINGLE_01',heading=0,x=-12.717421,y=-3.216114,}, +[8]={category='Heliports',type='FARP_SINGLE_01',shape_name='FARP_SINGLE_01',heading=0,x=-25.439281,y=-3.216114,}, +[9]={category='Heliports',type='FARP_SINGLE_01',shape_name='FARP_SINGLE_01',heading=0,x=-12.717421,y=9.155603,}, +[10]={category='Fortifications',type='TACAN_beacon',shape_name='none',heading=0,x=-2.329847,y=-16.579903,}, +[11]={category='Fortifications',type='FARP Fuel Depot',shape_name='GSM Rus',heading=0,x=2.222011,y=4.487030,}, +[12]={category='Fortifications',type='APFC fuel',shape_name='M92_APFCfuel',heading=0,x=3.614927,y=0.367838,}, +[13]={category='Fortifications',type='Camouflage03',shape_name='M92_Camouflage03',heading=0,x=21.544148,y=21.998879,}, +[14]={category='Fortifications',type='Container_generator',shape_name='M92_Container_generator',heading=0,x=20.989192,y=37.314334,}, +[15]={category='Fortifications',type='FireExtinguisher02',shape_name='M92_FireExtinguisher02',heading=0,x=3.988003,y=8.362333,}, +[16]={category='Fortifications',type='FireExtinguisher02',shape_name='M92_FireExtinguisher02',heading=0,x=-3.953195,y=12.945844,}, +[17]={category='Fortifications',type='Windsock',shape_name='H-Windsock_RW',heading=0,x=-18.944173,y=-33.042196,}, +[18]={category='Fortifications',type='Tent04',shape_name='M92_Tent04',heading=0,x=21.220671,y=30.247529,}, +} +if Templates then MASHTemplates=Templates end +local name=Name or"Florence Nightingale" +local positionVec2 +local positionVec3 +local ReturnStatics={} +local CountryID=Country or country.id.USA +local livery="us army dark green" +local MASHRadio=MASHRadio or 127.5 +local MASHRadioModulation=MASHRadioModulation or radio.modulation.AM +local MASHCallsign=MASHCallsign or CALLSIGN.FARP.Berlin +if type(Coordinate)=="table"then +if Coordinate:IsInstanceOf("COORDINATE")or Coordinate:IsInstanceOf("ZONE_BASE")then +positionVec2=Coordinate:GetVec2() +positionVec3=Coordinate:GetVec3() +end +else +BASE:E("Spawn MASH - no ZONE or COORDINATE handed!") +return +end +local BaseX=positionVec2.x +local BaseY=positionVec2.y +for id,object in pairs(MASHTemplates)do +local NewName=string.format("%s#%3d",name,id) +local vec2={x=BaseX+object.x,y=BaseY+object.y} +local Coordinate=COORDINATE:NewFromVec2(vec2) +local static=SPAWNSTATIC:NewFromType(object.type,object.category,CountryID) +if object.shape_name and object.shape_name~="none"then +static:InitShape(object.shape_name) +end +if object.category=="Helicopters"and DeployHelo==true then +if object.livery_id~=nil then +livery=object.livery_id +end +static:InitLivery(livery) +local newstatic=static:SpawnFromCoordinate(Coordinate,object.heading,NewName) +table.insert(ReturnStatics,newstatic) +elseif object.category=="Heliports"then +static:InitFARP(MASHCallsign,MASHRadio,MASHRadioModulation,false,false) +local newstatic=static:SpawnFromCoordinate(Coordinate,object.heading,NewName) +table.insert(ReturnStatics,newstatic) +elseif object.category~="Helicopters"and object.category~="Heliports"then +local newstatic=static:SpawnFromCoordinate(Coordinate,object.heading,NewName) +table.insert(ReturnStatics,newstatic) +end +end +local ADFName +if ADF and type(ADF)=="number"then +local ADFFreq=ADF*1000 +local Sound="l10n/DEFAULT/beacon.ogg" +ADFName=Name.." ADF "..tostring(ADF).."KHz" +trigger.action.radioTransmission(Sound,positionVec3,0,true,ADFFreq,250,ADFName) +end +return ReturnStatics,ADFName +end +function UTILS.Vec2toVec3(vec,y) +if not vec.z then +if vec.alt and not y then +y=vec.alt +elseif not y then +y=0 +end +return{x=vec.x,y=y,z=vec.y} +else +return{x=vec.x,y=vec.y,z=vec.z} +end +end +function UTILS.GetNorthCorrection(gPoint) +local point=UTILS.DeepCopy(gPoint) +if not point.z then +point.z=point.y +point.y=0 +end +local lat,lon=coord.LOtoLL(point) +local north_posit=coord.LLtoLO(lat+1,lon) +return math.atan2(north_posit.z-point.z,north_posit.x-point.x) +end +function UTILS.GetDHMS(timeInSec) +if timeInSec and type(timeInSec)=='number'then +local tbl={d=0,h=0,m=0,s=0} +if timeInSec>86400 then +while timeInSec>86400 do +tbl.d=tbl.d+1 +timeInSec=timeInSec-86400 +end +end +if timeInSec>3600 then +while timeInSec>3600 do +tbl.h=tbl.h+1 +timeInSec=timeInSec-3600 +end +end +if timeInSec>60 then +while timeInSec>60 do +tbl.m=tbl.m+1 +timeInSec=timeInSec-60 +end +end +tbl.s=timeInSec +return tbl +else +BASE:E("No number handed!") +return +end +end +function UTILS.GetDirectionRadians(vec,point) +local dir=math.atan2(vec.z,vec.x) +if point then +dir=dir+UTILS.GetNorthCorrection(point) +end +if dir<0 then +dir=dir+2*math.pi +end +return dir +end +function UTILS.IsPointInPolygon(point,poly,maxalt) +point=UTILS.Vec2toVec3(point) +local px=point.x +local pz=point.z +local cn=0 +local newpoly=UTILS.DeepCopy(poly) +if not maxalt or(point.y<=maxalt)then +local polysize=#newpoly +newpoly[#newpoly+1]=newpoly[1] +newpoly[1]=UTILS.Vec2toVec3(newpoly[1]) +for k=1,polysize do +newpoly[k+1]=UTILS.Vec2toVec3(newpoly[k+1]) +if((newpoly[k].z<=pz)and(newpoly[k+1].z>pz))or((newpoly[k].z>pz)and(newpoly[k+1].z<=pz))then +local vt=(pz-newpoly[k].z)/(newpoly[k+1].z-newpoly[k].z) +if(px<newpoly[k].x+vt*(newpoly[k+1].x-newpoly[k].x))then +cn=cn+1 +end +end +end +return cn%2==1 +else +return false +end +end +function UTILS.ScalarMult(vec,mult) +return{x=vec.x*mult,y=vec.y*mult,z=vec.z*mult} +end +UTILS.Weather={} +function UTILS.Weather.GetFogThickness() +return world.weather.getFogThickness() +end +function UTILS.Weather.SetFogThickness(Thickness) +local value=Thickness +if value<100 then value=100 +elseif value>5000 then value=5000 end +return world.weather.setFogThickness(value) +end +function UTILS.Weather.RemoveFog() +return world.weather.setFogThickness(0) +end +function UTILS.Weather.GetFogVisibilityDistanceMax() +return world.weather.getFogVisibilityDistance() +end +function UTILS.Weather.SetFogVisibilityDistance(Thickness) +local value=Thickness +if value<100 then value=100 +elseif value>100000 then value=100000 end +return world.weather.setFogVisibilityDistance(value) +end +function UTILS.Weather.SetFogAnimation(AnimationKeys) +return world.weather.setFogAnimation(AnimationKeys) +end +function UTILS.Weather.StopFogAnimation() +return world.weather.setFogAnimation({}) +end +function UTILS.GetEnvZone(name) +for _,v in ipairs(env.mission.triggers.zones)do +if v.name==name then +return v +end +end +end +function UTILS.DoStringIn(State,DoString) +return net.dostring_in(State,DoString) +end +function UTILS.ShowPictureToAll(FilePath,Duration,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits) +ClearView=ClearView or false +StartDelay=StartDelay or 0 +HorizontalAlign=HorizontalAlign or 1 +VerticalAlign=VerticalAlign or 1 +Size=Size or 100 +SizeUnits=SizeUnits or 0 +if ClearView then ClearView="true"else ClearView="false"end +net.dostring_in("mission",string.format("a_out_picture(\"%s\", %d, %s, %d, \"%d\", \"%d\", %d, \"%d\")",FilePath,Duration or 10,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits)) +end +function UTILS.ShowPictureToCoalition(Coalition,FilePath,Duration,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits) +ClearView=ClearView or false +StartDelay=StartDelay or 0 +HorizontalAlign=HorizontalAlign or 1 +VerticalAlign=VerticalAlign or 1 +Size=Size or 100 +SizeUnits=SizeUnits or 0 +if ClearView then ClearView="true"else ClearView="false"end +local coalName=string.lower(UTILS.GetCoalitionName(Coalition)) +net.dostring_in("mission",string.format("a_out_picture_s(\"%s\", \"%s\", %d, %s, %d, \"%d\", \"%d\", %d, \"%d\")",coalName,FilePath,Duration or 10,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits)) +end +function UTILS.ShowPictureToCountry(Country,FilePath,Duration,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits) +ClearView=ClearView or false +StartDelay=StartDelay or 0 +HorizontalAlign=HorizontalAlign or 1 +VerticalAlign=VerticalAlign or 1 +Size=Size or 100 +SizeUnits=SizeUnits or 0 +if ClearView then ClearView="true"else ClearView="false"end +net.dostring_in("mission",string.format("a_out_picture_c(%d, \"%s\", %d, %s, %d, \"%d\", \"%d\", %d, \"%d\")",Country,FilePath,Duration or 10,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits)) +end +function UTILS.ShowPictureToGroup(Group,FilePath,Duration,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits) +ClearView=ClearView or false +StartDelay=StartDelay or 0 +HorizontalAlign=HorizontalAlign or 1 +VerticalAlign=VerticalAlign or 1 +Size=Size or 100 +SizeUnits=SizeUnits or 0 +if ClearView then ClearView="true"else ClearView="false"end +net.dostring_in("mission",string.format("a_out_picture_g(%d, \"%s\", %d, %s, %d, \"%d\", \"%d\", %d, \"%d\")",Group:GetID(),FilePath,Duration or 10,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits)) +end +function UTILS.ShowPictureToUnit(Unit,FilePath,Duration,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits) +ClearView=ClearView or false +StartDelay=StartDelay or 0 +HorizontalAlign=HorizontalAlign or 1 +VerticalAlign=VerticalAlign or 1 +Size=Size or 100 +SizeUnits=SizeUnits or 0 +if ClearView then ClearView="true"else ClearView="false"end +net.dostring_in("mission",string.format("a_out_picture_u(%d, \"%s\", %d, %s, %d, \"%d\", \"%d\", %d, \"%d\")",Unit:GetID(),FilePath,Duration or 10,ClearView,StartDelay,HorizontalAlign,VerticalAlign,Size,SizeUnits)) +end +function UTILS.LoadMission(FileName) +net.dostring_in("mission",string.format("a_load_mission(\"%s\")",FileName)) +end +function UTILS.SetMissionBriefing(Coalition,Text,Picture) +Text=Text or"" +Text=Text:gsub("\n","\\n") +Picture=Picture or"" +local coalName=string.lower(UTILS.GetCoalitionName(Coalition)) +net.dostring_in("mission",string.format("a_set_briefing(\"%s\", \"%s\", \"%s\")",coalName,Picture,Text)) +end +function UTILS.ShowHelperGate(pos,heading) +net.dostring_in("mission",string.format("a_show_helper_gate(%s, %s, %s, %f)",pos.x,pos.y,pos.z,math.rad(heading))) +end +function UTILS.ShowHelperGateForUnit(Unit,Flag) +net.dostring_in("mission",string.format("a_show_route_gates_for_unit(%d, \"%d\")",Unit:GetID(),Flag)) +end +function UTILS.SetCarrierIlluminationMode(UnitID,Mode) +net.dostring_in("mission",string.format("a_set_carrier_illumination_mode(%d, %d)",UnitID,Mode)) +end +function UTILS.ShellZone(name,power,count) +local z=UTILS.GetEnvZone(name) +if z then +net.dostring_in("mission",string.format("a_shelling_zone(%d, %d, %d)",z.zoneId,power,count)) +end +end +function UTILS.RemoveObjects(name,type) +local z=UTILS.GetEnvZone(name) +if z then +net.dostring_in("mission",string.format("a_remove_scene_objects(%d, %d)",z.zoneId,type)) +end +end +function UTILS.DestroyScenery(name,level) +local z=UTILS.GetEnvZone(name) +if z then +net.dostring_in("mission",string.format("a_scenery_destruction_zone(%d, %d)",z.zoneId,level)) +end +end +function UTILS.GetSimpleZones(Vec3,SearchRadius,PosRadius,NumPositions) +return Disposition.getSimpleZones(Vec3,SearchRadius,PosRadius,NumPositions) +end +function UTILS.GetClearZonePositions(Zone,PosRadius,NumPositions) +local radius=PosRadius or math.min(Zone:GetRadius()/10,200) +local clearPositions=UTILS.GetSimpleZones(Zone:GetVec3(),Zone:GetRadius(),radius,NumPositions or 50) +if clearPositions and#clearPositions>0 then +local validZones={} +for _,vec2 in pairs(clearPositions)do +if Zone:IsVec2InZone(vec2)then +table.insert(validZones,vec2) +end +end +if#validZones>0 then +return validZones,radius +end +end +return nil +end +function UTILS.GetRandomClearZoneCoordinate(Zone,PosRadius,NumPositions) +local clearPositions=UTILS.GetClearZonePositions(Zone,PosRadius,NumPositions) +if clearPositions and#clearPositions>0 then +local randomPosition,radius=clearPositions[math.random(1,#clearPositions)] +return COORDINATE:NewFromVec2(randomPosition),radius +end +return nil +end +function UTILS.FindNearestPointOnCircle(Vec1,Radius,Vec2) +local r=Radius +local cx=Vec1.x or 1 +local cy=Vec1.y or 1 +local px=Vec2.x or 1 +local py=Vec2.y or 1 +local dx=px-cx +local dy=py-cy +local dist=math.sqrt(dx*dx+dy*dy) +if dist==0 then +return{x=cx+r,y=cy} +end +local norm_dx=dx/dist +local norm_dy=dy/dist +local qx=cx+r*norm_dx +local qy=cy+r*norm_dy +local shift_factor=1 +qx=qx+shift_factor*norm_dx +qy=qy+shift_factor*norm_dy +return{x=qx,y=qy} +end +function UTILS.ValidateAndRepositionGroundUnits(Positions,Anchor,MaxRadius,Spacing) +local units=Positions +Anchor=Anchor or UTILS.GetCenterPoint(units) +local gPos={x=Anchor.x,y=Anchor.z or Anchor.y} +local maxRadius=0 +local unitCount=0 +for _,unit in pairs(units)do +local pos={x=unit.x,y=unit.z or unit.y} +local dist=UTILS.VecDist2D(pos,gPos) +if dist>maxRadius then +maxRadius=dist +end +unitCount=unitCount+1 +end +maxRadius=MaxRadius or math.max(maxRadius*2,10) +local spacing=Spacing or math.max(maxRadius*0.05,5) +if unitCount>0 and maxRadius>5 then +local spots=UTILS.GetSimpleZones(UTILS.Vec2toVec3(gPos),maxRadius,spacing,1000) +if spots and#spots>0 then +local validSpots={} +for _,spot in pairs(spots)do +if land.getSurfaceType(spot)==land.SurfaceType.LAND then +table.insert(validSpots,spot) +end +end +spots=validSpots +end +local step=spacing +for _,unit in pairs(units)do +local pos={x=unit.x,y=unit.z or unit.y} +local isOnLand=land.getSurfaceType(pos)==land.SurfaceType.LAND +local isValid=false +if spots and#spots>0 then +local si=1 +local sid=0 +local closestDist=100000000 +local closestSpot +for _,spot in pairs(spots)do +local dist=UTILS.VecDist2D(pos,spot) +if dist<closestDist then +closestDist=dist +closestSpot=spot +sid=si +end +si=si+1 +end +if closestSpot then +if closestDist>=spacing then +pos=closestSpot +end +isValid=true +table.remove(spots,sid) +end +end +if not isValid and not isOnLand then +local h=UTILS.HdgTo(pos,gPos) +local retries=0 +while not isValid and retries<500 do +local dist=UTILS.VecDist2D(pos,gPos) +pos=UTILS.Vec2Translate(pos,step,h) +local skip=false +for _,unit2 in pairs(units)do +if unit~=unit2 then +local pos2={x=unit2.x,y=unit2.z or unit2.y} +local dist2=UTILS.VecDist2D(pos,pos2) +if dist2<12 then +isValid=false +skip=true +break +end +end +end +if not skip and dist>step and land.getSurfaceType(pos)==land.SurfaceType.LAND then +isValid=true +break +elseif dist<=step then +break +end +retries=retries+1 +end +end +if isValid then +unit.x=pos.x +if unit.z then +unit.z=pos.y +else +unit.y=pos.y +end +end +end +end +end +function UTILS.ValidateAndRepositionStatic(Country,Category,Type,Position,ShapeName,MaxRadius) +local coord=COORDINATE:NewFromVec2(Position) +local st=SPAWNSTATIC:NewFromType(Type,Category,Country) +if ShapeName then +st:InitShape(ShapeName) +end +local sName="s-"..timer.getTime().."-"..math.random(1,10000) +local tempStatic=st:SpawnFromCoordinate(coord,0,sName) +if tempStatic then +local sRadius=tempStatic:GetBoundingRadius(2)or 3 +tempStatic:Destroy() +sRadius=sRadius*0.5 +MaxRadius=MaxRadius or math.max(sRadius*10,100) +local positions=UTILS.GetSimpleZones(coord:GetVec3(),MaxRadius,sRadius,20) +if positions and#positions>0 then +local closestSpot +local closestDist=math.huge +for _,spot in pairs(positions)do +if land.getSurfaceType(spot)==land.SurfaceType.LAND then +local dist=UTILS.VecDist2D(Position,spot) +if dist<closestDist then +closestDist=dist +closestSpot=spot +end +end +end +if closestSpot then +if closestDist>=sRadius then +return closestSpot +else +return Position +end +end +end +end +return nil +end +PROFILER={ +ClassName="PROFILER", +Counters={}, +dInfo={}, +fTime={}, +fTimeTotal={}, +eventHandler={}, +logUnknown=false, +ThreshCPS=0.0, +ThreshTtot=0.005, +fileNamePrefix="MooseProfiler", +fileNameSuffix="txt" +} +function PROFILER.Start(Delay,Duration) +local go=true +if not os then +env.error("ERROR: Profiler needs os to be de-sanitized!") +go=false +end +if not io then +env.error("ERROR: Profiler needs io to be desanitized!") +go=false +end +if not lfs then +env.error("ERROR: Profiler needs lfs to be desanitized!") +go=false +end +if not go then +return +end +if Delay and Delay>0 then +BASE:ScheduleOnce(Delay,PROFILER.Start,0,Duration) +else +PROFILER.TstartGame=timer.getTime() +PROFILER.TstartOS=os.clock() +world.addEventHandler(PROFILER.eventHandler) +env.info('############################ Profiler Started ############################') +if Duration then +env.info(string.format("- Will be running for %d seconds",Duration)) +else +env.info(string.format("- Will be stopped when mission ends")) +end +env.info(string.format("- Calls per second threshold %.3f/sec",PROFILER.ThreshCPS)) +env.info(string.format("- Total function time threshold %.3f sec",PROFILER.ThreshTtot)) +env.info(string.format("- Output file \"%s\" in your DCS log file folder",PROFILER.getfilename(PROFILER.fileNameSuffix))) +env.info(string.format("- Output file \"%s\" in CSV format",PROFILER.getfilename("csv"))) +env.info('###############################################################################') +local duration=Duration or 600 +trigger.action.outText("### Profiler running ###",duration) +debug.sethook(PROFILER.hook,"cr") +if Duration then +PROFILER.Stop(Duration) +end +end +end +function PROFILER.Stop(Delay) +if Delay and Delay>0 then +BASE:ScheduleOnce(Delay,PROFILER.Stop) +end +end +function PROFILER.Stop(Delay) +if Delay and Delay>0 then +BASE:ScheduleOnce(Delay,PROFILER.Stop) +else +debug.sethook() +local runTimeGame=timer.getTime()-PROFILER.TstartGame +local runTimeOS=os.clock()-PROFILER.TstartOS +PROFILER.showInfo(runTimeGame,runTimeOS) +end +end +function PROFILER.eventHandler:onEvent(event) +if event.id==world.event.S_EVENT_MISSION_END then +PROFILER.Stop() +end +end +function PROFILER.hook(event) +local f=debug.getinfo(2,"f").func +if event=='call'then +if PROFILER.Counters[f]==nil then +PROFILER.Counters[f]=1 +PROFILER.dInfo[f]=debug.getinfo(2,"Sn") +if PROFILER.fTimeTotal[f]==nil then +PROFILER.fTimeTotal[f]=0 +end +else +PROFILER.Counters[f]=PROFILER.Counters[f]+1 +end +if PROFILER.fTime[f]==nil then +PROFILER.fTime[f]=os.clock() +end +elseif(event=='return')then +if PROFILER.fTime[f]~=nil then +PROFILER.fTimeTotal[f]=PROFILER.fTimeTotal[f]+(os.clock()-PROFILER.fTime[f]) +PROFILER.fTime[f]=nil +end +end +end +function PROFILER.getData(func) +local n=PROFILER.dInfo[func] +if n.what=="C"then +return n.name,"?","?",PROFILER.fTimeTotal[func] +end +return n.name,n.short_src,n.linedefined,PROFILER.fTimeTotal[func] +end +function PROFILER._flog(f,txt) +f:write(txt.."\r\n") +end +function PROFILER.showTable(data,f,runTimeGame) +for i=1,#data do +local t=data[i] +local cps=t.count/runTimeGame +local threshCPS=cps>=PROFILER.ThreshCPS +local threshTot=t.tm>=PROFILER.ThreshTtot +if threshCPS and threshTot then +local text=string.format("%30s: %8d calls %8.1f/sec - Time Total %8.3f sec (%.3f %%) %5.3f sec/call %s line %s",t.func,t.count,cps,t.tm,t.tm/runTimeGame*100,t.tm/t.count,tostring(t.src),tostring(t.line)) +PROFILER._flog(f,text) +end +end +end +function PROFILER.printCSV(data,runTimeGame) +local file=PROFILER.getfilename("csv") +local g=io.open(file,'w') +local text="Function,Total Calls,Calls per Sec,Total Time,Total in %,Sec per Call,Source File;Line Number," +g:write(text.."\r\n") +for i=1,#data do +local t=data[i] +local cps=t.count/runTimeGame +local txt=string.format("%s,%d,%.1f,%.3f,%.3f,%.3f,%s,%s,",t.func,t.count,cps,t.tm,t.tm/runTimeGame*100,t.tm/t.count,tostring(t.src),tostring(t.line)) +g:write(txt.."\r\n") +end +g:close() +end +function PROFILER.getfilename(ext) +local dir=lfs.writedir()..[[Logs\]] +ext=ext or PROFILER.fileNameSuffix +local file=dir..PROFILER.fileNamePrefix.."."..ext +if not UTILS.FileExists(file)then +return file +end +for i=1,999 do +local file=string.format("%s%s-%03d.%s",dir,PROFILER.fileNamePrefix,i,ext) +if not UTILS.FileExists(file)then +return file +end +end +end +function PROFILER.showInfo(runTimeGame,runTimeOS) +local file=PROFILER.getfilename(PROFILER.fileNameSuffix) +local f=io.open(file,'w') +local Ttot=0 +local Calls=0 +local t={} +local tcopy=nil +local tserialize=nil +local tforgen=nil +local tpairs=nil +for func,count in pairs(PROFILER.Counters)do +local s,src,line,tm=PROFILER.getData(func) +if PROFILER.logUnknown==true then +if s==nil then s="<Unknown>"end +end +if s~=nil then +local T= +{func=s, +src=src, +line=line, +count=count, +tm=tm, +} +if s=="_copy"then +if tcopy==nil then +tcopy=T +else +tcopy.count=tcopy.count+T.count +tcopy.tm=tcopy.tm+T.tm +end +elseif s=="_Serialize"then +if tserialize==nil then +tserialize=T +else +tserialize.count=tserialize.count+T.count +tserialize.tm=tserialize.tm+T.tm +end +elseif s=="(for generator)"then +if tforgen==nil then +tforgen=T +else +tforgen.count=tforgen.count+T.count +tforgen.tm=tforgen.tm+T.tm +end +elseif s=="pairs"then +if tpairs==nil then +tpairs=T +else +tpairs.count=tpairs.count+T.count +tpairs.tm=tpairs.tm+T.tm +end +else +table.insert(t,T) +end +Ttot=Ttot+tm +Calls=Calls+count +end +end +if tcopy then +table.insert(t,tcopy) +end +if tserialize then +table.insert(t,tserialize) +end +if tforgen then +table.insert(t,tforgen) +end +if tpairs then +table.insert(t,tpairs) +end +env.info('############################ Profiler Stopped ############################') +env.info(string.format("* Runtime Game : %s = %d sec",UTILS.SecondsToClock(runTimeGame,true),runTimeGame)) +env.info(string.format("* Runtime Real : %s = %d sec",UTILS.SecondsToClock(runTimeOS,true),runTimeOS)) +env.info(string.format("* Function time : %s = %.1f sec (%.1f percent of runtime game)",UTILS.SecondsToClock(Ttot,true),Ttot,Ttot/runTimeGame*100)) +env.info(string.format("* Total functions : %d",#t)) +env.info(string.format("* Total func calls : %d",Calls)) +env.info(string.format("* Writing to file : \"%s\"",file)) +env.info(string.format("* Writing to file : \"%s\"",PROFILER.getfilename("csv"))) +env.info("##############################################################################") +table.sort(t,function(a,b)return a.tm>b.tm end) +PROFILER._flog(f,"") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"") +PROFILER._flog(f,"-------------------------") +PROFILER._flog(f,"---- Profiler Report ----") +PROFILER._flog(f,"-------------------------") +PROFILER._flog(f,"") +PROFILER._flog(f,string.format("* Runtime Game : %s = %.1f sec",UTILS.SecondsToClock(runTimeGame,true),runTimeGame)) +PROFILER._flog(f,string.format("* Runtime Real : %s = %.1f sec",UTILS.SecondsToClock(runTimeOS,true),runTimeOS)) +PROFILER._flog(f,string.format("* Function time : %s = %.1f sec (%.1f %% of runtime game)",UTILS.SecondsToClock(Ttot,true),Ttot,Ttot/runTimeGame*100)) +PROFILER._flog(f,"") +PROFILER._flog(f,string.format("* Total functions = %d",#t)) +PROFILER._flog(f,string.format("* Total func calls = %d",Calls)) +PROFILER._flog(f,"") +PROFILER._flog(f,string.format("* Calls per second threshold = %.3f/sec",PROFILER.ThreshCPS)) +PROFILER._flog(f,string.format("* Total func time threshold = %.3f sec",PROFILER.ThreshTtot)) +PROFILER._flog(f,"") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"") +PROFILER.showTable(t,f,runTimeGame) +table.sort(t,function(a,b)return a.tm/a.count>b.tm/b.count end) +PROFILER._flog(f,"") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"") +PROFILER._flog(f,"--------------------------------------") +PROFILER._flog(f,"---- Data Sorted by Time per Call ----") +PROFILER._flog(f,"--------------------------------------") +PROFILER._flog(f,"") +PROFILER.showTable(t,f,runTimeGame) +table.sort(t,function(a,b)return a.count>b.count end) +PROFILER._flog(f,"") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"") +PROFILER._flog(f,"------------------------------------") +PROFILER._flog(f,"---- Data Sorted by Total Calls ----") +PROFILER._flog(f,"------------------------------------") +PROFILER._flog(f,"") +PROFILER.showTable(t,f,runTimeGame) +PROFILER._flog(f,"") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"************************************************************************************************************************") +PROFILER._flog(f,"************************************************************************************************************************") +f:close() +PROFILER.printCSV(t,runTimeGame) +end +do +FIFO={ +ClassName="FIFO", +lid="", +version="0.0.5", +counter=0, +pointer=0, +stackbypointer={}, +stackbyid={} +} +function FIFO:New() +local self=BASE:Inherit(self,BASE:New()) +self.pointer=0 +self.counter=0 +self.stackbypointer={} +self.stackbyid={} +self.uniquecounter=0 +self.lid=string.format("%s (%s) | ","FiFo",self.version) +self:T(self.lid.."Created.") +return self +end +function FIFO:Clear() +self:T(self.lid.."Clear") +self.pointer=0 +self.counter=0 +self.stackbypointer=nil +self.stackbyid=nil +self.stackbypointer={} +self.stackbyid={} +self.uniquecounter=0 +return self +end +function FIFO:Push(Object,UniqueID) +self:T(self.lid.."Push") +self:T({Object,UniqueID}) +self.pointer=self.pointer+1 +self.counter=self.counter+1 +local uniID=UniqueID +if not UniqueID then +self.uniquecounter=self.uniquecounter+1 +uniID=self.uniquecounter +end +self.stackbyid[uniID]={pointer=self.pointer,data=Object,uniqueID=uniID} +self.stackbypointer[self.pointer]={pointer=self.pointer,data=Object,uniqueID=uniID} +return self +end +function FIFO:Pull() +self:T(self.lid.."Pull") +if self.counter==0 then return nil end +local object=self.stackbypointer[1].data +self.stackbypointer[1]=nil +self.counter=self.counter-1 +self:Flatten() +return object +end +function FIFO:PullByPointer(Pointer) +self:T(self.lid.."PullByPointer "..tostring(Pointer)) +if self.counter==0 then return nil end +local object=self.stackbypointer[Pointer] +self.stackbypointer[Pointer]=nil +if object then self.stackbyid[object.uniqueID]=nil end +self.counter=self.counter-1 +self:Flatten() +if object then +return object.data +else +return nil +end +end +function FIFO:ReadByPointer(Pointer) +self:T(self.lid.."ReadByPointer "..tostring(Pointer)) +if self.counter==0 or not Pointer or not self.stackbypointer[Pointer]then return nil end +local object=self.stackbypointer[Pointer] +if object then +return object.data +else +return nil +end +end +function FIFO:ReadByID(UniqueID) +self:T(self.lid.."ReadByID "..tostring(UniqueID)) +if self.counter==0 or not UniqueID or not self.stackbyid[UniqueID]then return nil end +local object=self.stackbyid[UniqueID] +if object then +return object.data +else +return nil +end +end +function FIFO:PullByID(UniqueID) +self:T(self.lid.."PullByID "..tostring(UniqueID)) +if self.counter==0 then return nil end +local object=self.stackbyid[UniqueID] +if object then +return self:PullByPointer(object.pointer) +else +return nil +end +end +function FIFO:Flatten() +self:T(self.lid.."Flatten") +local pointerstack={} +local idstack={} +local counter=0 +for _ID,_entry in pairs(self.stackbypointer)do +counter=counter+1 +pointerstack[counter]={pointer=counter,data=_entry.data,uniqueID=_entry.uniqueID} +end +for _ID,_entry in pairs(pointerstack)do +idstack[_entry.uniqueID]={pointer=_entry.pointer,data=_entry.data,uniqueID=_entry.uniqueID} +end +self.stackbypointer=nil +self.stackbypointer=pointerstack +self.stackbyid=nil +self.stackbyid=idstack +self.counter=counter +self.pointer=counter +return self +end +function FIFO:IsEmpty() +self:T(self.lid.."IsEmpty") +return self.counter==0 and true or false +end +function FIFO:GetSize() +self:T(self.lid.."GetSize") +return self.counter +end +function FIFO:Count() +self:T(self.lid.."Count") +return self.counter +end +function FIFO:IsNotEmpty() +self:T(self.lid.."IsNotEmpty") +return not self:IsEmpty() +end +function FIFO:GetPointerStack() +self:T(self.lid.."GetPointerStack") +return self.stackbypointer +end +function FIFO:HasUniqueID(UniqueID) +self:T(self.lid.."HasUniqueID") +if self.stackbyid[UniqueID]~=nil then +return true +else +return false +end +end +function FIFO:GetIDStack() +self:T(self.lid.."GetIDStack") +return self.stackbyid +end +function FIFO:GetIDStackSorted() +self:T(self.lid.."GetIDStackSorted") +local stack=self:GetIDStack() +local idstack={} +for _id,_entry in pairs(stack)do +idstack[#idstack+1]=_id +self:T({"pre",_id}) +end +local function sortID(a,b) +return a<b +end +table.sort(idstack) +return idstack +end +function FIFO:GetDataTable() +self:T(self.lid.."GetDataTable") +local datatable={} +for _,_entry in pairs(self.stackbypointer)do +datatable[#datatable+1]=_entry.data +end +return datatable +end +function FIFO:GetSortedDataTable() +self:T(self.lid.."GetSortedDataTable") +local datatable={} +local idtablesorted=self:GetIDStackSorted() +for _,_entry in pairs(idtablesorted)do +datatable[#datatable+1]=self:ReadByID(_entry) +end +return datatable +end +function FIFO:ForEach(IteratorFunction,Arg,Function,FunctionArguments) +self:T(self.lid.."ForEach") +local Set=self:GetPointerStack()or{} +Arg=Arg or{} +local function CoRoutine() +local Count=0 +for ObjectID,ObjectData in pairs(Set)do +local Object=ObjectData.data +self:T({Object}) +if Function then +if Function(unpack(FunctionArguments or{}),Object)==true then +IteratorFunction(Object,unpack(Arg)) +end +else +IteratorFunction(Object,unpack(Arg)) +end +Count=Count+1 +end +return true +end +local co=CoRoutine +local function Schedule() +local status,res=co() +self:T({status,res}) +if status==false then +error(res) +end +if res==false then +return true +end +return false +end +Schedule() +return self +end +function FIFO:Flush() +self:T(self.lid.."FiFo Flush") +self:I("FIFO Flushing Stack by Pointer") +for _id,_data in pairs(self.stackbypointer)do +local data=_data +self:I(string.format("Pointer: %s | Entry: Number = %s Data = %s UniqueID = %s",tostring(_id),tostring(data.pointer),tostring(data.data),tostring(data.uniqueID))) +end +self:I("FIFO Flushing Stack by ID") +for _id,_data in pairs(self.stackbyid)do +local data=_data +self:I(string.format("ID: %s | Entry: Number = %s Data = %s UniqueID = %s",tostring(_id),tostring(data.pointer),tostring(data.data),tostring(data.uniqueID))) +end +self:I("Counter = "..self.counter) +self:I("Pointer = "..self.pointer) +return self +end +end +do +LIFO={ +ClassName="LIFO", +lid="", +version="0.0.5", +counter=0, +pointer=0, +stackbypointer={}, +stackbyid={} +} +function LIFO:New() +local self=BASE:Inherit(self,BASE:New()) +self.pointer=0 +self.counter=0 +self.uniquecounter=0 +self.stackbypointer={} +self.stackbyid={} +self.lid=string.format("%s (%s) | ","LiFo",self.version) +self:T(self.lid.."Created.") +return self +end +function LIFO:Clear() +self:T(self.lid.."Clear") +self.pointer=0 +self.counter=0 +self.stackbypointer=nil +self.stackbyid=nil +self.stackbypointer={} +self.stackbyid={} +self.uniquecounter=0 +return self +end +function LIFO:Push(Object,UniqueID) +self:T(self.lid.."Push") +self:T({Object,UniqueID}) +self.pointer=self.pointer+1 +self.counter=self.counter+1 +local uniID=UniqueID +if not UniqueID then +self.uniquecounter=self.uniquecounter+1 +uniID=self.uniquecounter +end +self.stackbyid[uniID]={pointer=self.pointer,data=Object,uniqueID=uniID} +self.stackbypointer[self.pointer]={pointer=self.pointer,data=Object,uniqueID=uniID} +return self +end +function LIFO:Pull() +self:T(self.lid.."Pull") +if self.counter==0 then return nil end +local object=self.stackbypointer[self.pointer].data +self.stackbypointer[self.pointer]=nil +self.counter=self.counter-1 +self.pointer=self.pointer-1 +self:Flatten() +return object +end +function LIFO:PullByPointer(Pointer) +self:T(self.lid.."PullByPointer "..tostring(Pointer)) +if self.counter==0 then return nil end +local object=self.stackbypointer[Pointer] +self.stackbypointer[Pointer]=nil +if object then self.stackbyid[object.uniqueID]=nil end +self.counter=self.counter-1 +self:Flatten() +if object then +return object.data +else +return nil +end +end +function LIFO:ReadByPointer(Pointer) +self:T(self.lid.."ReadByPointer "..tostring(Pointer)) +if self.counter==0 or not Pointer or not self.stackbypointer[Pointer]then return nil end +local object=self.stackbypointer[Pointer] +if object then +return object.data +else +return nil +end +end +function LIFO:ReadByID(UniqueID) +self:T(self.lid.."ReadByID "..tostring(UniqueID)) +if self.counter==0 or not UniqueID or not self.stackbyid[UniqueID]then return nil end +local object=self.stackbyid[UniqueID] +if object then +return object.data +else +return nil +end +end +function LIFO:PullByID(UniqueID) +self:T(self.lid.."PullByID "..tostring(UniqueID)) +if self.counter==0 then return nil end +local object=self.stackbyid[UniqueID] +if object then +return self:PullByPointer(object.pointer) +else +return nil +end +end +function LIFO:Flatten() +self:T(self.lid.."Flatten") +local pointerstack={} +local idstack={} +local counter=0 +for _ID,_entry in pairs(self.stackbypointer)do +counter=counter+1 +pointerstack[counter]={pointer=counter,data=_entry.data,uniqueID=_entry.uniqueID} +end +for _ID,_entry in pairs(pointerstack)do +idstack[_entry.uniqueID]={pointer=_entry.pointer,data=_entry.data,uniqueID=_entry.uniqueID} +end +self.stackbypointer=nil +self.stackbypointer=pointerstack +self.stackbyid=nil +self.stackbyid=idstack +self.counter=counter +self.pointer=counter +return self +end +function LIFO:IsEmpty() +self:T(self.lid.."IsEmpty") +return self.counter==0 and true or false +end +function LIFO:GetSize() +self:T(self.lid.."GetSize") +return self.counter +end +function LIFO:Count() +self:T(self.lid.."Count") +return self.counter +end +function LIFO:IsNotEmpty() +self:T(self.lid.."IsNotEmpty") +return not self:IsEmpty() +end +function LIFO:GetPointerStack() +self:T(self.lid.."GetPointerStack") +return self.stackbypointer +end +function LIFO:GetIDStack() +self:T(self.lid.."GetIDStack") +return self.stackbyid +end +function LIFO:GetIDStackSorted() +self:T(self.lid.."GetIDStackSorted") +local stack=self:GetIDStack() +local idstack={} +for _id,_entry in pairs(stack)do +idstack[#idstack+1]=_id +self:T({"pre",_id}) +end +local function sortID(a,b) +return a<b +end +table.sort(idstack) +return idstack +end +function LIFO:HasUniqueID(UniqueID) +self:T(self.lid.."HasUniqueID") +return self.stackbyid[UniqueID]and true or false +end +function LIFO:Flush() +self:T(self.lid.."FiFo Flush") +self:I("LIFO Flushing Stack by Pointer") +for _id,_data in pairs(self.stackbypointer)do +local data=_data +self:I(string.format("Pointer: %s | Entry: Number = %s Data = %s UniqueID = %s",tostring(_id),tostring(data.pointer),tostring(data.data),tostring(data.uniqueID))) +end +self:I("LIFO Flushing Stack by ID") +for _id,_data in pairs(self.stackbyid)do +local data=_data +self:I(string.format("ID: %s | Entry: Number = %s Data = %s UniqueID = %s",tostring(_id),tostring(data.pointer),tostring(data.data),tostring(data.uniqueID))) +end +self:I("Counter = "..self.counter) +self:I("Pointer = "..self.pointer) +return self +end +function LIFO:GetDataTable() +self:T(self.lid.."GetDataTable") +local datatable={} +for _,_entry in pairs(self.stackbypointer)do +datatable[#datatable+1]=_entry.data +end +return datatable +end +function LIFO:GetSortedDataTable() +self:T(self.lid.."GetSortedDataTable") +local datatable={} +local idtablesorted=self:GetIDStackSorted() +for _,_entry in pairs(idtablesorted)do +datatable[#datatable+1]=self:ReadByID(_entry) +end +return datatable +end +function LIFO:ForEach(IteratorFunction,Arg,Function,FunctionArguments) +self:T(self.lid.."ForEach") +local Set=self:GetPointerStack()or{} +Arg=Arg or{} +local function CoRoutine() +local Count=0 +for ObjectID,ObjectData in pairs(Set)do +local Object=ObjectData.data +self:T({Object}) +if Function then +if Function(unpack(FunctionArguments or{}),Object)==true then +IteratorFunction(Object,unpack(Arg)) +end +else +IteratorFunction(Object,unpack(Arg)) +end +Count=Count+1 +end +return true +end +local co=CoRoutine +local function Schedule() +local status,res=co() +self:T({status,res}) +if status==false then +error(res) +end +if res==false then +return true +end +return false +end +Schedule() +return self +end +end +SOCKET={ +ClassName="SOCKET", +verbose=0, +lid=nil, +} +SOCKET.DataType={ +TEXT="moose_text", +BOMBRESULT="moose_bomb_result", +STRAFERESULT="moose_strafe_result", +LSOGRADE="moose_lso_grade", +TTS="moose_text2speech" +} +SOCKET.version="0.3.0" +function SOCKET:New(Port,Host) +local self=BASE:Inherit(self,FSM:New()) +package.path=package.path..";.\\LuaSocket\\?.lua;" +package.cpath=package.cpath..";.\\LuaSocket\\?.dll;" +self.socket=require("socket") +self.port=Port or 10042 +self.host=Host or"127.0.0.1" +self.json=loadfile("Scripts\\JSON.lua")() +self.UDPSendSocket=self.socket.udp() +self.UDPSendSocket:settimeout(0) +return self +end +function SOCKET:SetPort(Port) +self.port=Port or 10042 +end +function SOCKET:SetHost(Host) +self.host=Host or"127.0.0.1" +end +function SOCKET:SendTable(Table) +Table.server_name=BASE.ServerName or"Unknown" +local json=self.json:encode(Table) +self:T("Json table:") +self:T(json) +self.socket.try(self.UDPSendSocket:sendto(json,self.host,self.port)) +return self +end +function SOCKET:SendText(Text) +local message={} +message.command=SOCKET.DataType.TEXT +message.text=Text +self:SendTable(message) +return self +end +function SOCKET:SendTextToSpeech(Text,Provider,Voice,Culture,Gender,Volume) +Text=Text or"Hello World!" +local message={} +message.command=SOCKET.DataType.TTS +message.text=Text +message.provider=Provider +message.voice=Voice +message.culture=Culture +message.gender=Gender +message.volume=Volume +self:SendTable(message) +return self +end +local _TraceOnOff=false +local _TraceLevel=1 +local _TraceAll=false +local _TraceClass={} +local _TraceClassMethod={} +local _ClassID=0 +BASE={ +ClassName="BASE", +ClassID=0, +Events={}, +States={}, +Debug=debug, +Scheduler=nil, +Properties={}, +} +BASE.__={} +BASE._={ +Schedules={}, +} +function BASE:New() +local self=UTILS.DeepCopy(self) +_ClassID=_ClassID+1 +self.ClassID=_ClassID +return self +end +function BASE:Inherit(Child,Parent) +local Child=UTILS.DeepCopy(Child) +if Child~=nil then +if rawget(Child,"__")then +setmetatable(Child,{__index=Child.__}) +setmetatable(Child.__,{__index=Parent}) +else +setmetatable(Child,{__index=Parent}) +end +end +return Child +end +local function getParent(Child) +local Parent=nil +if Child.ClassName=='BASE'then +Parent=nil +else +if rawget(Child,"__")then +Parent=getmetatable(Child.__).__index +else +Parent=getmetatable(Child).__index +end +end +return Parent +end +function BASE:GetParent(Child,FromClass) +local Parent +if Child.ClassName=='BASE'then +Parent=nil +else +if FromClass then +while(Child.ClassName~="BASE"and Child.ClassName~=FromClass.ClassName)do +Child=getParent(Child) +end +end +if Child.ClassName=='BASE'then +Parent=nil +else +Parent=getParent(Child) +end +end +return Parent +end +function BASE:IsInstanceOf(ClassName) +if type(ClassName)~='string'then +if type(ClassName)=='table'and ClassName.ClassName~=nil then +ClassName=ClassName.ClassName +else +local err_str='className parameter should be a string; parameter received: '..type(ClassName) +self:E(err_str) +return false +end +end +ClassName=string.upper(ClassName) +if string.upper(self.ClassName)==ClassName then +return true +end +local Parent=getParent(self) +while Parent do +if string.upper(Parent.ClassName)==ClassName then +return true +end +Parent=getParent(Parent) +end +return false +end +function BASE:GetClassNameAndID() +return string.format('%s#%09d',self.ClassName,self.ClassID) +end +function BASE:GetClassName() +return self.ClassName +end +function BASE:GetClassID() +return self.ClassID +end +do +function BASE:EventDispatcher() +return _EVENTDISPATCHER +end +function BASE:GetEventPriority() +return self._.EventPriority or 5 +end +function BASE:SetEventPriority(EventPriority) +self._.EventPriority=EventPriority +end +function BASE:EventRemoveAll() +self:EventDispatcher():RemoveAll(self) +return self +end +function BASE:HandleEvent(EventID,EventFunction) +self:EventDispatcher():OnEventGeneric(EventFunction,self,EventID) +return self +end +function BASE:UnHandleEvent(EventID) +self:EventDispatcher():RemoveEvent(self,EventID) +return self +end +end +function BASE:CreateEventBirth(EventTime,Initiator,IniUnitName,place,subplace) +self:F({EventTime,Initiator,IniUnitName,place,subplace}) +local Event={ +id=world.event.S_EVENT_BIRTH, +time=EventTime, +initiator=Initiator, +IniUnitName=IniUnitName, +place=place, +subplace=subplace, +} +world.onEvent(Event) +end +function BASE:CreateEventCrash(EventTime,Initiator,IniObjectCategory) +self:F({EventTime,Initiator}) +local Event={ +id=world.event.S_EVENT_CRASH, +time=EventTime, +initiator=Initiator, +IniObjectCategory=IniObjectCategory, +} +world.onEvent(Event) +end +function BASE:CreateEventUnitLost(EventTime,Initiator) +self:F({EventTime,Initiator}) +local Event={ +id=world.event.S_EVENT_UNIT_LOST, +time=EventTime, +initiator=Initiator, +} +world.onEvent(Event) +end +function BASE:CreateEventDead(EventTime,Initiator,IniObjectCategory) +self:F({EventTime,Initiator,IniObjectCategory}) +local Event={ +id=world.event.S_EVENT_DEAD, +time=EventTime, +initiator=Initiator, +IniObjectCategory=IniObjectCategory, +} +world.onEvent(Event) +end +function BASE:CreateEventRemoveUnit(EventTime,Initiator) +self:F({EventTime,Initiator}) +local Event={ +id=EVENTS.RemoveUnit, +time=EventTime, +initiator=Initiator, +} +world.onEvent(Event) +end +function BASE:CreateEventTakeoff(EventTime,Initiator) +self:F({EventTime,Initiator}) +local Event={ +id=world.event.S_EVENT_TAKEOFF, +time=EventTime, +initiator=Initiator, +} +world.onEvent(Event) +end +function BASE:CreateEventPlayerEnterAircraft(PlayerUnit) +self:F({PlayerUnit}) +local Event={ +id=EVENTS.PlayerEnterAircraft, +time=timer.getTime(), +initiator=PlayerUnit:GetDCSObject() +} +world.onEvent(Event) +end +function BASE:CreateEventNewDynamicCargo(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.NewDynamicCargo, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function BASE:CreateEventDynamicCargoLoaded(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoLoaded, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function BASE:CreateEventDynamicCargoUnloaded(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoUnloaded, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function BASE:CreateEventDynamicCargoRemoved(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoRemoved, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function BASE:onEvent(event) +if self then +for EventID,EventObject in pairs(self.Events)do +if EventObject.EventEnabled then +if event.id==EventObject.Event then +if self==EventObject.Self then +if event.initiator and event.initiator:isExist()then +event.IniUnitName=event.initiator:getName() +end +if event.target and event.target:isExist()then +event.TgtUnitName=event.target:getName() +end +end +end +end +end +end +end +do +function BASE:ScheduleOnce(Start,SchedulerFunction,...) +local ObjectName="-" +ObjectName=self.ClassName..self.ClassID +self:F3({"ScheduleOnce: ",ObjectName,Start}) +if not self.Scheduler then +self.Scheduler=SCHEDULER:New(self) +end +local ScheduleID=self.Scheduler:Schedule(nil,SchedulerFunction,{...},Start) +self._.Schedules[#self._.Schedules+1]=ScheduleID +return self._.Schedules[#self._.Schedules] +end +function BASE:ScheduleRepeat(Start,Repeat,RandomizeFactor,Stop,SchedulerFunction,...) +self:F2({Start}) +self:T3({...}) +local ObjectName="-" +ObjectName=self.ClassName..self.ClassID +self:F3({"ScheduleRepeat: ",ObjectName,Start,Repeat,RandomizeFactor,Stop}) +if not self.Scheduler then +self.Scheduler=SCHEDULER:New(self) +end +local ScheduleID=self.Scheduler:Schedule( +nil, +SchedulerFunction, +{...}, +Start, +Repeat, +RandomizeFactor, +Stop, +4 +) +self._.Schedules[#self._.Schedules+1]=ScheduleID +return self._.Schedules[#self._.Schedules] +end +function BASE:ScheduleStop(SchedulerID) +self:F3({"ScheduleStop:"}) +if self.Scheduler then +_SCHEDULEDISPATCHER:Stop(self.Scheduler,SchedulerID) +end +end +end +function BASE:SetState(Object,Key,Value) +local ClassNameAndID=Object:GetClassNameAndID() +self.States[ClassNameAndID]=self.States[ClassNameAndID]or{} +self.States[ClassNameAndID][Key]=Value +return self.States[ClassNameAndID][Key] +end +function BASE:GetState(Object,Key) +local ClassNameAndID=Object:GetClassNameAndID() +if self.States[ClassNameAndID]then +local Value=self.States[ClassNameAndID][Key]or false +return Value +end +return nil +end +function BASE:ClearState(Object,StateName) +local ClassNameAndID=Object:GetClassNameAndID() +if self.States[ClassNameAndID]then +self.States[ClassNameAndID][StateName]=nil +end +end +function BASE:SetProperty(Key,Value) +self.Properties=self.Properties or{} +self.Properties[Key]=Value +end +function BASE:GetProperty(Key) +self.Properties=self.Properties or{} +return self.Properties[Key] +end +function BASE:GetProperties() +return self.Properties +end +function BASE:TraceOn() +self:TraceOnOff(true) +end +function BASE:TraceOff() +self:TraceOnOff(false) +end +function BASE:TraceOnOff(TraceOnOff) +if TraceOnOff==false then +self:I("Tracing in MOOSE is OFF") +_TraceOnOff=false +else +self:I("Tracing in MOOSE is ON") +_TraceOnOff=true +end +end +function BASE:IsTrace() +if BASE.Debug and(_TraceAll==true)or(_TraceClass[self.ClassName]or _TraceClassMethod[self.ClassName])then +return true +else +return false +end +end +function BASE:TraceLevel(Level) +_TraceLevel=Level or 1 +self:I("Tracing level ".._TraceLevel) +end +function BASE:TraceAll(TraceAll) +if TraceAll==false then +_TraceAll=false +else +_TraceAll=true +end +if _TraceAll then +self:I("Tracing all methods in MOOSE ") +else +self:I("Switched off tracing all methods in MOOSE") +end +end +function BASE:TraceClass(Class) +_TraceClass[Class]=true +_TraceClassMethod[Class]={} +self:I("Tracing class "..Class) +end +function BASE:TraceClassMethod(Class,Method) +if not _TraceClassMethod[Class]then +_TraceClassMethod[Class]={} +_TraceClassMethod[Class].Method={} +end +_TraceClassMethod[Class].Method[Method]=true +self:I("Tracing method "..Method.." of class "..Class) +end +function BASE:_Serialize(Arguments) +local text=UTILS.PrintTableToLog({Arguments},0,true) +text=string.gsub(text,"(\n+)","") +text=string.gsub(text,"%(%(","%(") +text=string.gsub(text,"%)%)","%)") +text=string.gsub(text,"(%s+)"," ") +return text +end +function BASE:_F(Arguments,DebugInfoCurrentParam,DebugInfoFromParam) +if BASE.Debug and(_TraceAll==true)or(_TraceClass[self.ClassName]or _TraceClassMethod[self.ClassName])then +local DebugInfoCurrent=DebugInfoCurrentParam and DebugInfoCurrentParam or BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=DebugInfoFromParam and DebugInfoFromParam or BASE.Debug.getinfo(3,"l") +local Function="function" +if DebugInfoCurrent.name then +Function=DebugInfoCurrent.name +end +if _TraceAll==true or _TraceClass[self.ClassName]or _TraceClassMethod[self.ClassName].Method[Function]then +local LineCurrent=0 +if DebugInfoCurrent.currentline then +LineCurrent=DebugInfoCurrent.currentline +end +local LineFrom=0 +if DebugInfoFrom then +LineFrom=DebugInfoFrom.currentline +end +env.info(string.format("%6d(%6d)/%1s:%30s%05d.%s(%s)",LineCurrent,LineFrom,"F",self.ClassName,self.ClassID,Function,BASE:_Serialize(Arguments))) +end +end +end +function BASE:F(Arguments) +if BASE.Debug and _TraceOnOff==true then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=1 then +self:_F(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:F2(Arguments) +if BASE.Debug and _TraceOnOff==true and _TraceLevel>=2 then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=2 then +self:_F(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:F3(Arguments) +if BASE.Debug and _TraceOnOff==true and _TraceLevel>=3 then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=3 then +self:_F(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:_T(Arguments,DebugInfoCurrentParam,DebugInfoFromParam) +if BASE.Debug and(_TraceAll==true)or(_TraceClass[self.ClassName]or _TraceClassMethod[self.ClassName])then +local DebugInfoCurrent=DebugInfoCurrentParam and DebugInfoCurrentParam or BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=DebugInfoFromParam and DebugInfoFromParam or BASE.Debug.getinfo(3,"l") +local Function="function" +if DebugInfoCurrent.name then +Function=DebugInfoCurrent.name +end +if _TraceAll==true or _TraceClass[self.ClassName]or _TraceClassMethod[self.ClassName].Method[Function]then +local LineCurrent=0 +if DebugInfoCurrent.currentline then +LineCurrent=DebugInfoCurrent.currentline +end +local LineFrom=0 +if DebugInfoFrom then +LineFrom=DebugInfoFrom.currentline +end +env.info(string.format("%6d(%6d)/%1s:%30s%05d.%s",LineCurrent,LineFrom,"T",self.ClassName,self.ClassID,BASE:_Serialize(Arguments))) +end +end +end +function BASE:T(Arguments) +if BASE.Debug and _TraceOnOff==true then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=1 then +self:_T(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:T2(Arguments) +if BASE.Debug and _TraceOnOff==true and _TraceLevel>=2 then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=2 then +self:_T(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:T3(Arguments) +if BASE.Debug and _TraceOnOff==true and _TraceLevel>=3 then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +if _TraceLevel>=3 then +self:_T(Arguments,DebugInfoCurrent,DebugInfoFrom) +end +end +end +function BASE:E(Arguments) +if BASE.Debug then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +local Function="function" +if DebugInfoCurrent.name then +Function=DebugInfoCurrent.name +end +local LineCurrent=DebugInfoCurrent.currentline +local LineFrom=-1 +if DebugInfoFrom then +LineFrom=DebugInfoFrom.currentline +end +env.info(string.format("%6d(%6d)/%1s:%30s%05d.%s(%s)",LineCurrent,LineFrom,"E",self.ClassName,self.ClassID,Function,UTILS.BasicSerialize(Arguments))) +else +env.info(string.format("%1s:%30s%05d(%s)","E",self.ClassName,self.ClassID,UTILS.BasicSerialize(Arguments))) +end +end +function BASE:I(Arguments) +if BASE.Debug then +local DebugInfoCurrent=BASE.Debug.getinfo(2,"nl") +local DebugInfoFrom=BASE.Debug.getinfo(3,"l") +local Function="function" +if DebugInfoCurrent.name then +Function=DebugInfoCurrent.name +end +local LineCurrent=DebugInfoCurrent.currentline +local LineFrom=-1 +if DebugInfoFrom then +LineFrom=DebugInfoFrom.currentline +end +env.info(string.format("%6d(%6d)/%1s:%30s%05d.%s(%s)",LineCurrent,LineFrom,"I",self.ClassName,self.ClassID,Function,UTILS.BasicSerialize(Arguments))) +else +env.info(string.format("%1s:%30s%05d(%s)","I",self.ClassName,self.ClassID,UTILS.BasicSerialize(Arguments))) +end +end +ASTAR={ +ClassName="ASTAR", +Debug=nil, +lid=nil, +nodes={}, +counter=1, +Nnodes=0, +ncost=0, +ncostcache=0, +nvalid=0, +nvalidcache=0, +} +ASTAR.INF=1/0 +ASTAR.version="0.4.0" +function ASTAR:New() +local self=BASE:Inherit(self,BASE:New()) +self.lid="ASTAR | " +return self +end +function ASTAR:SetStartCoordinate(Coordinate) +self.startCoord=Coordinate +return self +end +function ASTAR:SetEndCoordinate(Coordinate) +self.endCoord=Coordinate +return self +end +function ASTAR:GetNodeFromCoordinate(Coordinate) +local node={} +node.coordinate=Coordinate +node.surfacetype=Coordinate:GetSurfaceType() +node.id=self.counter +node.valid={} +node.cost={} +self.counter=self.counter+1 +return node +end +function ASTAR:AddNode(Node) +self.nodes[Node.id]=Node +self.Nnodes=self.Nnodes+1 +return self +end +function ASTAR:AddNodeFromCoordinate(Coordinate) +local node=self:GetNodeFromCoordinate(Coordinate) +self:AddNode(node) +return node +end +function ASTAR:CheckValidSurfaceType(Node,SurfaceTypes) +if SurfaceTypes then +if type(SurfaceTypes)~="table"then +SurfaceTypes={SurfaceTypes} +end +for _,surface in pairs(SurfaceTypes)do +if surface==Node.surfacetype then +return true +end +end +return false +else +return true +end +end +function ASTAR:SetValidNeighbourFunction(NeighbourFunction,...) +self.ValidNeighbourFunc=NeighbourFunction +self.ValidNeighbourArg={} +if arg then +self.ValidNeighbourArg=arg +end +return self +end +function ASTAR:SetValidNeighbourLoS(CorridorWidth) +self:SetValidNeighbourFunction(ASTAR.LoS,CorridorWidth) +return self +end +function ASTAR:SetValidNeighbourDistance(MaxDistance) +self:SetValidNeighbourFunction(ASTAR.DistMax,MaxDistance) +return self +end +function ASTAR:SetValidNeighbourRoad(MaxDistance) +self:SetValidNeighbourFunction(ASTAR.Road,MaxDistance) +return self +end +function ASTAR:SetCostFunction(CostFunction,...) +self.CostFunc=CostFunction +self.CostArg={} +if arg then +self.CostArg=arg +end +return self +end +function ASTAR:SetCostDist2D() +self:SetCostFunction(ASTAR.Dist2D) +return self +end +function ASTAR:SetCostDist3D() +self:SetCostFunction(ASTAR.Dist3D) +return self +end +function ASTAR:SetCostRoad() +self:SetCostFunction(ASTAR) +return self +end +function ASTAR:CreateGrid(ValidSurfaceTypes,BoxHY,SpaceX,deltaX,deltaY,MarkGrid) +local Dz=SpaceX or 10000 +local Dx=BoxHY and BoxHY/2 or 20000 +local dz=deltaX or 2000 +local dx=deltaY or dz +local angle=self.startCoord:HeadingTo(self.endCoord) +local dist=self.startCoord:Get2DDistance(self.endCoord)+2*Dz +local co=COORDINATE:New(0,0,0) +local do1=co:Get2DDistance(self.startCoord) +local ho1=co:HeadingTo(self.startCoord) +local xmin=-Dx +local zmin=-Dz +local nz=dist/dz+1 +local nx=2*Dx/dx+1 +local text=string.format("Building grid with nx=%d ny=%d => total=%d nodes",nx,nz,nx*nz) +self:T(self.lid..text) +for i=1,nx do +local x=xmin+dx*(i-1) +for j=1,nz do +local z=zmin+dz*(j-1) +local vec3=UTILS.Rotate2D({x=x,y=0,z=z},angle) +local c=COORDINATE:New(vec3.z,vec3.y,vec3.x):Translate(do1,ho1,true) +local node=self:GetNodeFromCoordinate(c) +if self:CheckValidSurfaceType(node,ValidSurfaceTypes)then +if MarkGrid then +c:MarkToAll(string.format("i=%d, j=%d surface=%d",i,j,node.surfacetype)) +end +self:AddNode(node) +end +end +end +local text=string.format("Done building grid!") +self:T2(self.lid..text) +return self +end +function ASTAR.LoS(nodeA,nodeB,corridor) +local offset=1 +local dx=corridor and corridor/2 or nil +local dy=dx +local cA=nodeA.coordinate:GetVec3() +local cB=nodeB.coordinate:GetVec3() +cA.y=offset +cB.y=offset +local los=land.isVisible(cA,cB) +if los and corridor then +local heading=nodeA.coordinate:HeadingTo(nodeB.coordinate) +local Ap=UTILS.VecTranslate(cA,dx,heading+90) +local Bp=UTILS.VecTranslate(cB,dx,heading+90) +los=land.isVisible(Ap,Bp) +if los then +local Am=UTILS.VecTranslate(cA,dx,heading-90) +local Bm=UTILS.VecTranslate(cB,dx,heading-90) +los=land.isVisible(Am,Bm) +end +end +return los +end +function ASTAR.Road(nodeA,nodeB) +local path=land.findPathOnRoads("roads",nodeA.coordinate.x,nodeA.coordinate.z,nodeB.coordinate.x,nodeB.coordinate.z) +if path then +return true +else +return false +end +end +function ASTAR.DistMax(nodeA,nodeB,distmax) +distmax=distmax or 2000 +local dist=nodeA.coordinate:Get2DDistance(nodeB.coordinate) +return dist<=distmax +end +function ASTAR.Dist2D(nodeA,nodeB) +local dist=nodeA.coordinate:Get2DDistance(nodeB) +return dist +end +function ASTAR.Dist3D(nodeA,nodeB) +local dist=nodeA.coordinate:Get3DDistance(nodeB.coordinate) +return dist +end +function ASTAR.DistRoad(nodeA,nodeB) +local path=land.findPathOnRoads("roads",nodeA.coordinate.x,nodeA.coordinate.z,nodeB.coordinate.x,nodeB.coordinate.z) +if path then +local dist=0 +for i=2,#path do +local b=path[i] +local a=path[i-1] +dist=dist+UTILS.VecDist2D(a,b) +end +return dist +end +return math.huge +end +function ASTAR:FindClosestNode(Coordinate) +local distMin=math.huge +local closeNode=nil +for _,_node in pairs(self.nodes)do +local node=_node +local dist=node.coordinate:Get2DDistance(Coordinate) +if dist<distMin then +distMin=dist +closeNode=node +end +end +return closeNode,distMin +end +function ASTAR:FindStartNode() +local node,dist=self:FindClosestNode(self.startCoord) +self.startNode=node +if dist>1000 then +self:T(self.lid.."Adding start node to node grid!") +self:AddNode(node) +end +return self +end +function ASTAR:FindEndNode() +local node,dist=self:FindClosestNode(self.endCoord) +self.endNode=node +if dist>1000 then +self:T(self.lid.."Adding end node to node grid!") +self:AddNode(node) +end +return self +end +function ASTAR:GetPath(ExcludeStartNode,ExcludeEndNode) +self:FindStartNode() +self:FindEndNode() +local nodes=self.nodes +local start=self.startNode +local goal=self.endNode +local openset={} +local closedset={} +local came_from={} +local g_score={} +local f_score={} +openset[start.id]=true +local Nopen=1 +g_score[start.id]=0 +f_score[start.id]=g_score[start.id]+self:_HeuristicCost(start,goal) +local T0=timer.getAbsTime() +local text=string.format("Starting A* pathfinding with %d Nodes",self.Nnodes) +self:T(self.lid..text) +local Tstart=UTILS.GetOSTime() +while Nopen>0 do +local current=self:_LowestFscore(openset,f_score) +if current.id==goal.id then +local path=self:_UnwindPath({},came_from,goal) +if not ExcludeEndNode then +table.insert(path,goal) +end +if ExcludeStartNode then +table.remove(path,1) +end +local Tstop=UTILS.GetOSTime() +local dT=nil +if Tstart and Tstop then +dT=Tstop-Tstart +end +local text=string.format("Found path with %d nodes (%d total)",#path,self.Nnodes) +if dT then +text=text..string.format(", OS Time %.6f sec",dT) +end +text=text..string.format(", Nvalid=%d [%d cached]",self.nvalid,self.nvalidcache) +text=text..string.format(", Ncost=%d [%d cached]",self.ncost,self.ncostcache) +self:T(self.lid..text) +return path +end +openset[current.id]=nil +Nopen=Nopen-1 +closedset[current.id]=true +local neighbors=self:_NeighbourNodes(current,nodes) +for _,neighbor in pairs(neighbors)do +if self:_NotIn(closedset,neighbor.id)then +local tentative_g_score=g_score[current.id]+self:_DistNodes(current,neighbor) +if self:_NotIn(openset,neighbor.id)or tentative_g_score<g_score[neighbor.id]then +came_from[neighbor]=current +g_score[neighbor.id]=tentative_g_score +f_score[neighbor.id]=g_score[neighbor.id]+self:_HeuristicCost(neighbor,goal) +if self:_NotIn(openset,neighbor.id)then +openset[neighbor.id]=true +Nopen=Nopen+1 +end +end +end +end +end +local text=string.format("WARNING: Could NOT find valid path!") +self:E(self.lid..text) +MESSAGE:New(text,60,"ASTAR"):ToAllIf(self.Debug) +return nil +end +function ASTAR:_HeuristicCost(nodeA,nodeB) +self.ncost=self.ncost+1 +local cost=nodeA.cost[nodeB.id] +if cost~=nil then +self.ncostcache=self.ncostcache+1 +return cost +end +local cost=nil +if self.CostFunc then +cost=self.CostFunc(nodeA,nodeB,unpack(self.CostArg)) +else +cost=self:_DistNodes(nodeA,nodeB) +end +nodeA.cost[nodeB.id]=cost +nodeB.cost[nodeA.id]=cost +return cost +end +function ASTAR:_IsValidNeighbour(node,neighbor) +self.nvalid=self.nvalid+1 +local valid=node.valid[neighbor.id] +if valid~=nil then +self.nvalidcache=self.nvalidcache+1 +return valid +end +local valid=nil +if self.ValidNeighbourFunc then +valid=self.ValidNeighbourFunc(node,neighbor,unpack(self.ValidNeighbourArg)) +else +valid=true +end +node.valid[neighbor.id]=valid +neighbor.valid[node.id]=valid +return valid +end +function ASTAR:_DistNodes(nodeA,nodeB) +return nodeA.coordinate:Get2DDistance(nodeB.coordinate) +end +function ASTAR:_LowestFscore(set,f_score) +local lowest,bestNode=ASTAR.INF,nil +for nid,node in pairs(set)do +local score=f_score[nid] +if score<lowest then +lowest,bestNode=score,nid +end +end +return self.nodes[bestNode] +end +function ASTAR:_NeighbourNodes(theNode,nodes) +local neighbors={} +for _,node in pairs(nodes)do +if theNode.id~=node.id then +local isvalid=self:_IsValidNeighbour(theNode,node) +if isvalid then +table.insert(neighbors,node) +end +end +end +return neighbors +end +function ASTAR:_NotIn(set,theNode) +return set[theNode]==nil +end +function ASTAR:_UnwindPath(flat_path,map,current_node) +if map[current_node]then +table.insert(flat_path,1,map[current_node]) +return self:_UnwindPath(flat_path,map,map[current_node]) +else +return flat_path +end +end +BEACON={ +ClassName="BEACON", +Positionable=nil, +name=nil, +UniqueName=0, +} +BEACON.Type={ +NULL=0, +VOR=1, +DME=2, +VOR_DME=3, +TACAN=4, +VORTAC=5, +RSBN=128, +BROADCAST_STATION=1024, +HOMER=8, +AIRPORT_HOMER=4104, +AIRPORT_HOMER_WITH_MARKER=4136, +ILS_FAR_HOMER=16408, +ILS_NEAR_HOMER=16424, +ILS_LOCALIZER=16640, +ILS_GLIDESLOPE=16896, +PRMG_LOCALIZER=33024, +PRMG_GLIDESLOPE=33280, +ICLS=131584, +ICLS_LOCALIZER=131328, +ICLS_GLIDESLOPE=131584, +NAUTICAL_HOMER=65536, +} +BEACON.System={ +PAR_10=1, +RSBN_5=2, +TACAN=3, +TACAN_TANKER_X=4, +TACAN_TANKER_Y=5, +VOR=6, +ILS_LOCALIZER=7, +ILS_GLIDESLOPE=8, +PRMG_LOCALIZER=9, +PRMG_GLIDESLOPE=10, +BROADCAST_STATION=11, +VORTAC=12, +TACAN_AA_MODE_X=13, +TACAN_AA_MODE_Y=14, +VORDME=15, +ICLS_LOCALIZER=16, +ICLS_GLIDESLOPE=17, +} +function BEACON:New(Positionable) +local self=BASE:Inherit(self,BASE:New()) +self:F(Positionable) +if Positionable:GetPointVec2()then +self.Positionable=Positionable +self.name=Positionable:GetName() +self:I(string.format("New BEACON %s",tostring(self.name))) +return self +end +self:E({"The passed positionable is invalid, no BEACON created",Positionable}) +return nil +end +function BEACON:ActivateTACAN(Channel,Mode,Message,Bearing,Duration) +self:T({channel=Channel,mode=Mode,callsign=Message,bearing=Bearing,duration=Duration}) +Mode=Mode or"Y" +local Frequency=UTILS.TACANToFrequency(Channel,Mode) +if not Frequency then +self:E({"The passed TACAN channel is invalid, the BEACON is not emitting"}) +return self +end +local Type=BEACON.Type.TACAN +local System=BEACON.System.TACAN +local AA=self.Positionable:IsAir() +if AA then +System=5 +if Mode=="X"then +System=BEACON.System.TACAN_TANKER_X +else +System=BEACON.System.TACAN_TANKER_Y +end +end +local UnitID=self.Positionable:GetID() +self:I({string.format("BEACON Activating TACAN %s: Channel=%d%s, Morse=%s, Bearing=%s, Duration=%s!",tostring(self.name),Channel,Mode,Message,tostring(Bearing),tostring(Duration))}) +self.Positionable:CommandActivateBeacon(Type,System,Frequency,UnitID,Channel,Mode,AA,Message,Bearing) +if Duration then +self.Positionable:DeactivateBeacon(Duration) +end +return self +end +function BEACON:ActivateICLS(Channel,Callsign,Duration) +self:F({Channel=Channel,Callsign=Callsign,Duration=Duration}) +local UnitID=self.Positionable:GetID() +self:T2({"ICLS BEACON started!"}) +self.Positionable:CommandActivateICLS(Channel,UnitID,Callsign) +if Duration then +self.Positionable:DeactivateBeacon(Duration) +end +return self +end +function BEACON:ActivateLink4(Frequency,Morse,Duration) +self:F({Frequency=Frequency,Morse=Morse,Duration=Duration}) +local UnitID=self.Positionable:GetID() +self:T2({"LINK4 BEACON started!"}) +self.Positionable:CommandActivateLink4(Frequency,UnitID,Morse) +if Duration then +self.Positionable:CommandDeactivateLink4(Duration) +end +return self +end +function BEACON:AATACAN(TACANChannel,Message,Bearing,BeaconDuration) +self:F({TACANChannel,Message,Bearing,BeaconDuration}) +self:E("This method is DEPRECATED! Please use ActivateTACAN() instead.") +local IsValid=true +if not self.Positionable:IsAir()then +self:E({"The POSITIONABLE you want to attach the AA Tacan Beacon is not an aircraft ! The BEACON is not emitting",self.Positionable}) +IsValid=false +end +local Frequency=self:_TACANToFrequency(TACANChannel,"Y") +if not Frequency then +self:E({"The passed TACAN channel is invalid, the BEACON is not emitting"}) +IsValid=false +end +local System +if Bearing then +System=BEACON.System.TACAN_TANKER_Y +else +System=BEACON.System.TACAN_AA_MODE_Y +end +if IsValid then +self:T2({"AA TACAN BEACON started !"}) +self.Positionable:SetCommand({ +id="ActivateBeacon", +params={ +type=BEACON.Type.TACAN, +system=System, +callsign=Message, +AA=true, +frequency=Frequency, +bearing=Bearing, +modeChannel="Y", +} +}) +if BeaconDuration then +SCHEDULER:New(nil, +function() +self:StopAATACAN() +end,{},BeaconDuration) +end +end +return self +end +function BEACON:StopAATACAN() +self:F() +if not self.Positionable then +self:E({"Start the beacon first before stoping it !"}) +else +self.Positionable:SetCommand({ +id='DeactivateBeacon', +params={ +} +}) +end +end +function BEACON:RadioBeacon(FileName,Frequency,Modulation,Power,BeaconDuration) +self:F({FileName,Frequency,Modulation,Power,BeaconDuration}) +local IsValid=false +Modulation=Modulation or radio.modulation.AM +if type(FileName)=="string"then +if FileName:find(".ogg")or FileName:find(".wav")then +if not FileName:find("l10n/DEFAULT/")then +FileName="l10n/DEFAULT/"..FileName +end +IsValid=true +end +end +if not IsValid then +self:E({"File name invalid. Maybe something wrong with the extension? ",FileName}) +end +if type(Frequency)~="number"and IsValid then +self:E({"Frequency invalid. ",Frequency}) +IsValid=false +end +Frequency=Frequency*1000000 +if Modulation~=radio.modulation.AM and Modulation~=radio.modulation.FM and IsValid then +self:E({"Modulation is invalid. Use DCS's enum radio.modulation.",Modulation}) +IsValid=false +end +if type(Power)~="number"and IsValid then +self:E({"Power is invalid. ",Power}) +IsValid=false +end +Power=math.floor(math.abs(Power)) +if IsValid then +self:T2({"Activating Beacon on ",Frequency,Modulation}) +BEACON.UniqueName=BEACON.UniqueName+1 +self.BeaconName="MooseBeacon"..tostring(BEACON.UniqueName) +trigger.action.radioTransmission(FileName,self.Positionable:GetPositionVec3(),Modulation,true,Frequency,Power,self.BeaconName) +if BeaconDuration then +SCHEDULER:New(nil, +function() +self:StopRadioBeacon() +end,{},BeaconDuration) +end +end +return self +end +function BEACON:StopRadioBeacon() +self:F() +trigger.action.stopRadioTransmission(self.BeaconName) +return self +end +function BEACON:_TACANToFrequency(TACANChannel,TACANMode) +self:F3({TACANChannel,TACANMode}) +if type(TACANChannel)~="number"then +if TACANMode~="X"and TACANMode~="Y"then +return nil +end +end +local A=1151 +local B=64 +if TACANChannel<64 then +B=1 +end +if TACANMode=='Y'then +A=1025 +if TACANChannel<64 then +A=1088 +end +else +if TACANChannel<64 then +A=962 +end +end +return(A+TACANChannel-B)*1000000 +end +CONDITION={ +ClassName="CONDITION", +lid=nil, +functionsGen={}, +functionsAny={}, +functionsAll={}, +functionCounter=0, +defaultPersist=false, +} +CONDITION.version="0.3.0" +function CONDITION:New(Name) +local self=BASE:Inherit(self,BASE:New()) +self.name=Name or"Condition X" +self:SetNoneResult(false) +self.lid=string.format("%s | ",self.name) +return self +end +function CONDITION:SetAny(Any) +self.isAny=Any +return self +end +function CONDITION:SetNegateResult(Negate) +self.negateResult=Negate +return self +end +function CONDITION:SetNoneResult(ReturnValue) +if not ReturnValue then +self.noneResult=false +else +self.noneResult=true +end +return self +end +function CONDITION:SetDefaultPersistence(IsPersistent) +self.defaultPersist=IsPersistent +return self +end +function CONDITION:AddFunction(Function,...) +local condition=self:_CreateCondition(0,Function,...) +table.insert(self.functionsGen,condition) +return condition +end +function CONDITION:AddFunctionAny(Function,...) +local condition=self:_CreateCondition(1,Function,...) +table.insert(self.functionsAny,condition) +return condition +end +function CONDITION:AddFunctionAll(Function,...) +local condition=self:_CreateCondition(2,Function,...) +table.insert(self.functionsAll,condition) +return condition +end +function CONDITION:RemoveFunction(ConditionFunction) +if ConditionFunction then +local data=nil +if ConditionFunction.type==0 then +data=self.functionsGen +elseif ConditionFunction.type==1 then +data=self.functionsAny +elseif ConditionFunction.type==2 then +data=self.functionsAll +end +if data then +for i=#data,1,-1 do +local cf=data[i] +if cf.uid==ConditionFunction.uid then +self:T(self.lid..string.format("Removed ConditionFunction UID=%d",cf.uid)) +table.remove(data,i) +return self +end +end +end +end +return self +end +function CONDITION:RemoveNonPersistant() +for i=#self.functionsGen,1,-1 do +local cf=self.functionsGen[i] +if not cf.persistence then +table.remove(self.functionsGen,i) +end +end +for i=#self.functionsAll,1,-1 do +local cf=self.functionsAll[i] +if not cf.persistence then +table.remove(self.functionsAll,i) +end +end +for i=#self.functionsAny,1,-1 do +local cf=self.functionsAny[i] +if not cf.persistence then +table.remove(self.functionsAny,i) +end +end +return self +end +function CONDITION:Evaluate(AnyTrue) +if#self.functionsAll+#self.functionsAny+#self.functionsAll==0 then +return self.noneResult +end +local evalAny=self.isAny +if AnyTrue~=nil then +evalAny=AnyTrue +end +local isGen=nil +if evalAny then +isGen=self:_EvalConditionsAny(self.functionsGen) +else +isGen=self:_EvalConditionsAll(self.functionsGen) +end +local isAny=self:_EvalConditionsAny(self.functionsAny) +local isAll=self:_EvalConditionsAll(self.functionsAll) +local result=isGen and isAny and isAll +if self.negateResult then +result=not result +end +self:T(self.lid..string.format("Evaluate: isGen=%s, isAny=%s, isAll=%s (negate=%s) ==> result=%s",tostring(isGen),tostring(isAny),tostring(isAll),tostring(self.negateResult),tostring(result))) +return result +end +function CONDITION:_EvalConditionsAll(functions) +local gotone=false +for _,_condition in pairs(functions or{})do +local condition=_condition +gotone=true +local istrue=condition.func(unpack(condition.arg)) +if not istrue then +return false +end +end +return true +end +function CONDITION:_EvalConditionsAny(functions) +local gotone=false +for _,_condition in pairs(functions or{})do +local condition=_condition +gotone=true +local istrue=condition.func(unpack(condition.arg)) +if istrue then +return true +end +end +if gotone then +return false +else +return true +end +end +function CONDITION:_CreateCondition(Ftype,Function,...) +self.functionCounter=self.functionCounter+1 +local condition={} +condition.uid=self.functionCounter +condition.type=Ftype or 0 +condition.persistence=self.defaultPersist +condition.func=Function +condition.arg={} +if arg then +condition.arg=arg +end +return condition +end +function CONDITION.IsTimeGreater(Time,Absolute) +local Tnow=nil +if Absolute then +Tnow=timer.getAbsTime() +else +Tnow=timer.getTime() +end +if Tnow>Time then +return true +else +return false +end +return nil +end +function CONDITION.IsRandomSuccess(Probability) +Probability=Probability or 50 +math.random() +math.random() +math.random() +local N=math.random()*100 +if N<Probability then +return true +else +return false +end +end +function CONDITION.ReturnTrue() +return true +end +function CONDITION.ReturnFalse() +return false +end +do +USERFLAG={ +ClassName="USERFLAG", +UserFlagName=nil, +} +function USERFLAG:New(UserFlagName) +local self=BASE:Inherit(self,BASE:New()) +self.UserFlagName=UserFlagName +return self +end +function USERFLAG:GetName() +return self.UserFlagName +end +function USERFLAG:Set(Number,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,USERFLAG.Set,self,Number) +else +trigger.action.setUserFlag(self.UserFlagName,Number) +end +return self +end +function USERFLAG:Get() +return trigger.misc.getUserFlag(self.UserFlagName) +end +function USERFLAG:Is(Number) +return trigger.misc.getUserFlag(self.UserFlagName)==Number +end +end +REPORT={ +ClassName="REPORT", +Title="", +} +function REPORT:New(Title) +local self=BASE:Inherit(self,BASE:New()) +self.Report={} +self:SetTitle(Title or"") +self:SetIndent(3) +return self +end +function REPORT:HasText() +return#self.Report>0 +end +function REPORT:SetIndent(Indent) +self.Indent=Indent +return self +end +function REPORT:Add(Text) +self.Report[#self.Report+1]=Text +return self +end +function REPORT:AddIndent(Text,Separator) +self.Report[#self.Report+1]=((Separator and Separator..string.rep(" ",self.Indent-1))or string.rep(" ",self.Indent))..Text:gsub("\n","\n"..string.rep(" ",self.Indent)) +return self +end +function REPORT:Text(Delimiter) +Delimiter=Delimiter or"\n" +local ReportText=(self.Title~=""and self.Title..Delimiter or self.Title)..table.concat(self.Report,Delimiter)or"" +return ReportText +end +function REPORT:SetTitle(Title) +self.Title=Title +return self +end +function REPORT:GetCount() +return#self.Report +end +SCHEDULER={ +ClassName="SCHEDULER", +Schedules={}, +MasterObject=nil, +ShowTrace=nil, +} +function SCHEDULER:New(MasterObject,SchedulerFunction,SchedulerArguments,Start,Repeat,RandomizeFactor,Stop) +local self=BASE:Inherit(self,BASE:New()) +self:F2({Start,Repeat,RandomizeFactor,Stop}) +local ScheduleID=nil +self.MasterObject=MasterObject +self.ShowTrace=false +if SchedulerFunction then +ScheduleID=self:Schedule(MasterObject,SchedulerFunction,SchedulerArguments,Start,Repeat,RandomizeFactor,Stop,3) +end +return self,ScheduleID +end +function SCHEDULER:Schedule(MasterObject,SchedulerFunction,SchedulerArguments,Start,Repeat,RandomizeFactor,Stop,TraceLevel,Fsm) +self:F2({Start,Repeat,RandomizeFactor,Stop}) +self:T3({SchedulerArguments}) +local ObjectName="-" +if MasterObject and MasterObject.ClassName and MasterObject.ClassID then +ObjectName=MasterObject.ClassName..MasterObject.ClassID +end +self:F3({"Schedule :",ObjectName,tostring(MasterObject),Start,Repeat,RandomizeFactor,Stop}) +self.MasterObject=MasterObject +local ScheduleID=_SCHEDULEDISPATCHER:AddSchedule(self, +SchedulerFunction, +SchedulerArguments, +Start, +Repeat, +RandomizeFactor, +Stop, +TraceLevel or 3, +Fsm +) +self.Schedules[#self.Schedules+1]=ScheduleID +return ScheduleID +end +function SCHEDULER:Start(ScheduleID) +self:F3({ScheduleID}) +self:T(string.format("Starting scheduler ID=%s",tostring(ScheduleID))) +_SCHEDULEDISPATCHER:Start(self,ScheduleID) +end +function SCHEDULER:Stop(ScheduleID) +self:F3({ScheduleID}) +self:T(string.format("Stopping scheduler ID=%s",tostring(ScheduleID))) +_SCHEDULEDISPATCHER:Stop(self,ScheduleID) +end +function SCHEDULER:Remove(ScheduleID) +self:F3({ScheduleID}) +self:T(string.format("Removing scheduler ID=%s",tostring(ScheduleID))) +_SCHEDULEDISPATCHER:RemoveSchedule(self,ScheduleID) +end +function SCHEDULER:Clear() +self:F3() +self:T(string.format("Clearing scheduler")) +_SCHEDULEDISPATCHER:Clear(self) +end +function SCHEDULER:ShowTrace() +_SCHEDULEDISPATCHER:ShowTrace(self) +end +function SCHEDULER:NoTrace() +_SCHEDULEDISPATCHER:NoTrace(self) +end +SCHEDULEDISPATCHER={ +ClassName="SCHEDULEDISPATCHER", +CallID=0, +PersistentSchedulers={}, +ObjectSchedulers={}, +Schedule=nil, +} +function SCHEDULEDISPATCHER:New() +local self=BASE:Inherit(self,BASE:New()) +self:F3() +return self +end +function SCHEDULEDISPATCHER:AddSchedule(Scheduler,ScheduleFunction,ScheduleArguments,Start,Repeat,Randomize,Stop,TraceLevel,Fsm) +self:F2({Scheduler,ScheduleFunction,ScheduleArguments,Start,Repeat,Randomize,Stop,TraceLevel,Fsm}) +self.CallID=self.CallID+1 +local CallID=self.CallID.."#"..(Scheduler.MasterObject and Scheduler.MasterObject.GetClassNameAndID and Scheduler.MasterObject:GetClassNameAndID()or"")or"" +self:T2(string.format("Adding schedule #%d CallID=%s",self.CallID,CallID)) +self.PersistentSchedulers=self.PersistentSchedulers or{} +self.ObjectSchedulers=self.ObjectSchedulers or setmetatable({},{__mode="v"}) +if Scheduler.MasterObject then +self.ObjectSchedulers[CallID]=Scheduler +self:F3({CallID=CallID,ObjectScheduler=tostring(self.ObjectSchedulers[CallID]),MasterObject=tostring(Scheduler.MasterObject)}) +else +self.PersistentSchedulers[CallID]=Scheduler +self:F3({CallID=CallID,PersistentScheduler=self.PersistentSchedulers[CallID]}) +end +self.Schedule=self.Schedule or setmetatable({},{__mode="k"}) +self.Schedule[Scheduler]=self.Schedule[Scheduler]or{} +self.Schedule[Scheduler][CallID]={} +self.Schedule[Scheduler][CallID].Function=ScheduleFunction +self.Schedule[Scheduler][CallID].Arguments=ScheduleArguments +self.Schedule[Scheduler][CallID].StartTime=timer.getTime()+(Start or 0) +self.Schedule[Scheduler][CallID].Start=Start+0.001 +self.Schedule[Scheduler][CallID].Repeat=Repeat or 0 +self.Schedule[Scheduler][CallID].Randomize=Randomize or 0 +self.Schedule[Scheduler][CallID].Stop=Stop +local Info={} +if debug then +TraceLevel=TraceLevel or 2 +Info=debug.getinfo(TraceLevel,"nlS") +local name_fsm=debug.getinfo(TraceLevel-1,"n").name +if name_fsm then +Info.name=name_fsm +end +end +self:T3(self.Schedule[Scheduler][CallID]) +self.Schedule[Scheduler][CallID].CallHandler=function(Params) +local CallID=Params.CallID +local Info=Params.Info or{} +local Source=Info.source or"?" +local Line=Info.currentline or"?" +local Name=Info.name or"?" +local ErrorHandler=function(errmsg) +env.info("Error in timer function: "..errmsg or"") +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +local Scheduler=self.ObjectSchedulers[CallID] +if not Scheduler then +Scheduler=self.PersistentSchedulers[CallID] +end +if Scheduler then +local MasterObject=tostring(Scheduler.MasterObject) +local Schedule=self.Schedule[Scheduler][CallID] +local SchedulerObject=Scheduler.MasterObject +local ShowTrace=Scheduler.ShowTrace +local ScheduleFunction=Schedule.Function +local ScheduleArguments=Schedule.Arguments or{} +local Start=Schedule.Start +local Repeat=Schedule.Repeat or 0 +local Randomize=Schedule.Randomize or 0 +local Stop=Schedule.Stop or 0 +local ScheduleID=Schedule.ScheduleID +local Prefix=(Repeat==0)and"--->"or"+++>" +local Status,Result +if SchedulerObject then +local function Timer() +if ShowTrace then +SchedulerObject:T(Prefix..Name..":"..Line.." ("..Source..")") +end +return ScheduleFunction(SchedulerObject,unpack(ScheduleArguments)) +end +Status,Result=xpcall(Timer,ErrorHandler) +else +local function Timer() +if ShowTrace then +self:T(Prefix..Name..":"..Line.." ("..Source..")") +end +return ScheduleFunction(unpack(ScheduleArguments)) +end +Status,Result=xpcall(Timer,ErrorHandler) +end +local CurrentTime=timer.getTime() +local StartTime=Schedule.StartTime +self:F3({CallID=CallID,ScheduleID=ScheduleID,Master=MasterObject,CurrentTime=CurrentTime,StartTime=StartTime,Start=Start,Repeat=Repeat,Randomize=Randomize,Stop=Stop}) +if Status and((Result==nil)or(Result and Result~=false))then +if Repeat~=0 and((Stop==0)or(Stop~=0 and CurrentTime<=StartTime+Stop))then +local ScheduleTime=CurrentTime+Repeat+math.random(-(Randomize*Repeat/2),(Randomize*Repeat/2))+0.0001 +return ScheduleTime +else +self:Stop(Scheduler,CallID) +end +else +self:Stop(Scheduler,CallID) +end +else +self:I("<<<>"..Name..":"..Line.." ("..Source..")") +end +return nil +end +self:Start(Scheduler,CallID,Info) +return CallID +end +function SCHEDULEDISPATCHER:RemoveSchedule(Scheduler,CallID) +self:F2({Remove=CallID,Scheduler=Scheduler}) +if CallID then +self:Stop(Scheduler,CallID) +self.Schedule[Scheduler][CallID]=nil +end +end +function SCHEDULEDISPATCHER:Start(Scheduler,CallID,Info) +self:F2({Start=CallID,Scheduler=Scheduler}) +if CallID then +local Schedule=self.Schedule[Scheduler][CallID] +if not Schedule.ScheduleID then +local Tnow=timer.getTime() +Schedule.StartTime=Tnow +Schedule.ScheduleID=timer.scheduleFunction(Schedule.CallHandler,{CallID=CallID,Info=Info},Tnow+Schedule.Start) +self:T(string.format("Starting SCHEDULEDISPATCHER Call ID=%s ==> Schedule ID=%s",tostring(CallID),tostring(Schedule.ScheduleID))) +end +else +for CallID,Schedule in pairs(self.Schedule[Scheduler]or{})do +self:Start(Scheduler,CallID,Info) +end +end +end +function SCHEDULEDISPATCHER:Stop(Scheduler,CallID) +self:F2({Stop=CallID,Scheduler=Scheduler}) +if CallID then +local Schedule=self.Schedule[Scheduler][CallID] +if Schedule and Schedule.ScheduleID then +self:T(string.format("SCHEDULEDISPATCHER stopping scheduler CallID=%s, ScheduleID=%s",tostring(CallID),tostring(Schedule.ScheduleID))) +timer.removeFunction(Schedule.ScheduleID) +Schedule.ScheduleID=nil +else +self:T(string.format("Error no ScheduleID for CallID=%s",tostring(CallID))) +end +else +for CallID,Schedule in pairs(self.Schedule[Scheduler]or{})do +self:Stop(Scheduler,CallID) +end +end +end +function SCHEDULEDISPATCHER:Clear(Scheduler) +self:F2({Scheduler=Scheduler}) +for CallID,Schedule in pairs(self.Schedule[Scheduler]or{})do +self:Stop(Scheduler,CallID) +end +end +function SCHEDULEDISPATCHER:ShowTrace(Scheduler) +self:F2({Scheduler=Scheduler}) +Scheduler.ShowTrace=true +end +function SCHEDULEDISPATCHER:NoTrace(Scheduler) +self:F2({Scheduler=Scheduler}) +Scheduler.ShowTrace=false +end +EVENT={ +ClassName="EVENT", +ClassID=0, +MissionEnd=false, +} +world.event.S_EVENT_NEW_CARGO=world.event.S_EVENT_MAX+1000 +world.event.S_EVENT_DELETE_CARGO=world.event.S_EVENT_MAX+1001 +world.event.S_EVENT_NEW_ZONE=world.event.S_EVENT_MAX+1002 +world.event.S_EVENT_DELETE_ZONE=world.event.S_EVENT_MAX+1003 +world.event.S_EVENT_NEW_ZONE_GOAL=world.event.S_EVENT_MAX+1004 +world.event.S_EVENT_DELETE_ZONE_GOAL=world.event.S_EVENT_MAX+1005 +world.event.S_EVENT_REMOVE_UNIT=world.event.S_EVENT_MAX+1006 +world.event.S_EVENT_PLAYER_ENTER_AIRCRAFT=world.event.S_EVENT_MAX+1007 +world.event.S_EVENT_NEW_DYNAMIC_CARGO=world.event.S_EVENT_MAX+1008 +world.event.S_EVENT_DYNAMIC_CARGO_LOADED=world.event.S_EVENT_MAX+1009 +world.event.S_EVENT_DYNAMIC_CARGO_UNLOADED=world.event.S_EVENT_MAX+1010 +world.event.S_EVENT_DYNAMIC_CARGO_REMOVED=world.event.S_EVENT_MAX+1011 +EVENTS={ +Shot=world.event.S_EVENT_SHOT, +Hit=world.event.S_EVENT_HIT, +Takeoff=world.event.S_EVENT_TAKEOFF, +Land=world.event.S_EVENT_LAND, +Crash=world.event.S_EVENT_CRASH, +Ejection=world.event.S_EVENT_EJECTION, +Refueling=world.event.S_EVENT_REFUELING, +Dead=world.event.S_EVENT_DEAD, +PilotDead=world.event.S_EVENT_PILOT_DEAD, +BaseCaptured=world.event.S_EVENT_BASE_CAPTURED, +MissionStart=world.event.S_EVENT_MISSION_START, +MissionEnd=world.event.S_EVENT_MISSION_END, +TookControl=world.event.S_EVENT_TOOK_CONTROL, +RefuelingStop=world.event.S_EVENT_REFUELING_STOP, +Birth=world.event.S_EVENT_BIRTH, +HumanFailure=world.event.S_EVENT_HUMAN_FAILURE, +EngineStartup=world.event.S_EVENT_ENGINE_STARTUP, +EngineShutdown=world.event.S_EVENT_ENGINE_SHUTDOWN, +PlayerEnterUnit=world.event.S_EVENT_PLAYER_ENTER_UNIT, +PlayerLeaveUnit=world.event.S_EVENT_PLAYER_LEAVE_UNIT, +PlayerComment=world.event.S_EVENT_PLAYER_COMMENT, +ShootingStart=world.event.S_EVENT_SHOOTING_START, +ShootingEnd=world.event.S_EVENT_SHOOTING_END, +MarkAdded=world.event.S_EVENT_MARK_ADDED, +MarkChange=world.event.S_EVENT_MARK_CHANGE, +MarkRemoved=world.event.S_EVENT_MARK_REMOVED, +NewCargo=world.event.S_EVENT_NEW_CARGO, +DeleteCargo=world.event.S_EVENT_DELETE_CARGO, +NewZone=world.event.S_EVENT_NEW_ZONE, +DeleteZone=world.event.S_EVENT_DELETE_ZONE, +NewZoneGoal=world.event.S_EVENT_NEW_ZONE_GOAL, +DeleteZoneGoal=world.event.S_EVENT_DELETE_ZONE_GOAL, +RemoveUnit=world.event.S_EVENT_REMOVE_UNIT, +PlayerEnterAircraft=world.event.S_EVENT_PLAYER_ENTER_AIRCRAFT, +DetailedFailure=world.event.S_EVENT_DETAILED_FAILURE or-1, +Kill=world.event.S_EVENT_KILL or-1, +Score=world.event.S_EVENT_SCORE or-1, +UnitLost=world.event.S_EVENT_UNIT_LOST or-1, +LandingAfterEjection=world.event.S_EVENT_LANDING_AFTER_EJECTION or-1, +ParatrooperLanding=world.event.S_EVENT_PARATROOPER_LENDING or-1, +DiscardChairAfterEjection=world.event.S_EVENT_DISCARD_CHAIR_AFTER_EJECTION or-1, +WeaponAdd=world.event.S_EVENT_WEAPON_ADD or-1, +TriggerZone=world.event.S_EVENT_TRIGGER_ZONE or-1, +LandingQualityMark=world.event.S_EVENT_LANDING_QUALITY_MARK or-1, +BDA=world.event.S_EVENT_BDA or-1, +AIAbortMission=world.event.S_EVENT_AI_ABORT_MISSION or-1, +DayNight=world.event.S_EVENT_DAYNIGHT or-1, +FlightTime=world.event.S_EVENT_FLIGHT_TIME or-1, +SelfKillPilot=world.event.S_EVENT_PLAYER_SELF_KILL_PILOT or-1, +PlayerCaptureAirfield=world.event.S_EVENT_PLAYER_CAPTURE_AIRFIELD or-1, +EmergencyLanding=world.event.S_EVENT_EMERGENCY_LANDING or-1, +UnitCreateTask=world.event.S_EVENT_UNIT_CREATE_TASK or-1, +UnitDeleteTask=world.event.S_EVENT_UNIT_DELETE_TASK or-1, +SimulationStart=world.event.S_EVENT_SIMULATION_START or-1, +WeaponRearm=world.event.S_EVENT_WEAPON_REARM or-1, +WeaponDrop=world.event.S_EVENT_WEAPON_DROP or-1, +UnitTaskComplete=world.event.S_EVENT_UNIT_TASK_COMPLETE or-1, +UnitTaskStage=world.event.S_EVENT_UNIT_TASK_STAGE or-1, +MacExtraScore=world.event.S_EVENT_MAC_EXTRA_SCORE or-1, +MissionRestart=world.event.S_EVENT_MISSION_RESTART or-1, +MissionWinner=world.event.S_EVENT_MISSION_WINNER or-1, +RunwayTakeoff=world.event.S_EVENT_RUNWAY_TAKEOFF or-1, +RunwayTouch=world.event.S_EVENT_RUNWAY_TOUCH or-1, +MacLMSRestart=world.event.S_EVENT_MAC_LMS_RESTART or-1, +SimulationFreeze=world.event.S_EVENT_SIMULATION_FREEZE or-1, +SimulationUnfreeze=world.event.S_EVENT_SIMULATION_UNFREEZE or-1, +HumanAircraftRepairStart=world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_START or-1, +HumanAircraftRepairFinish=world.event.S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH or-1, +NewDynamicCargo=world.event.S_EVENT_NEW_DYNAMIC_CARGO or-1, +DynamicCargoLoaded=world.event.S_EVENT_DYNAMIC_CARGO_LOADED or-1, +DynamicCargoUnloaded=world.event.S_EVENT_DYNAMIC_CARGO_UNLOADED or-1, +DynamicCargoRemoved=world.event.S_EVENT_DYNAMIC_CARGO_REMOVED or-1, +} +local _EVENTMETA={ +[world.event.S_EVENT_SHOT]={ +Order=1, +Side="I", +Event="OnEventShot", +Text="S_EVENT_SHOT" +}, +[world.event.S_EVENT_HIT]={ +Order=1, +Side="T", +Event="OnEventHit", +Text="S_EVENT_HIT" +}, +[world.event.S_EVENT_TAKEOFF]={ +Order=1, +Side="I", +Event="OnEventTakeoff", +Text="S_EVENT_TAKEOFF" +}, +[world.event.S_EVENT_LAND]={ +Order=1, +Side="I", +Event="OnEventLand", +Text="S_EVENT_LAND" +}, +[world.event.S_EVENT_CRASH]={ +Order=-1, +Side="I", +Event="OnEventCrash", +Text="S_EVENT_CRASH" +}, +[world.event.S_EVENT_EJECTION]={ +Order=1, +Side="I", +Event="OnEventEjection", +Text="S_EVENT_EJECTION" +}, +[world.event.S_EVENT_REFUELING]={ +Order=1, +Side="I", +Event="OnEventRefueling", +Text="S_EVENT_REFUELING" +}, +[world.event.S_EVENT_DEAD]={ +Order=-1, +Side="I", +Event="OnEventDead", +Text="S_EVENT_DEAD" +}, +[world.event.S_EVENT_PILOT_DEAD]={ +Order=1, +Side="I", +Event="OnEventPilotDead", +Text="S_EVENT_PILOT_DEAD" +}, +[world.event.S_EVENT_BASE_CAPTURED]={ +Order=1, +Side="I", +Event="OnEventBaseCaptured", +Text="S_EVENT_BASE_CAPTURED" +}, +[world.event.S_EVENT_MISSION_START]={ +Order=1, +Side="N", +Event="OnEventMissionStart", +Text="S_EVENT_MISSION_START" +}, +[world.event.S_EVENT_MISSION_END]={ +Order=1, +Side="N", +Event="OnEventMissionEnd", +Text="S_EVENT_MISSION_END" +}, +[world.event.S_EVENT_TOOK_CONTROL]={ +Order=1, +Side="N", +Event="OnEventTookControl", +Text="S_EVENT_TOOK_CONTROL" +}, +[world.event.S_EVENT_REFUELING_STOP]={ +Order=1, +Side="I", +Event="OnEventRefuelingStop", +Text="S_EVENT_REFUELING_STOP" +}, +[world.event.S_EVENT_BIRTH]={ +Order=1, +Side="I", +Event="OnEventBirth", +Text="S_EVENT_BIRTH" +}, +[world.event.S_EVENT_HUMAN_FAILURE]={ +Order=1, +Side="I", +Event="OnEventHumanFailure", +Text="S_EVENT_HUMAN_FAILURE" +}, +[world.event.S_EVENT_ENGINE_STARTUP]={ +Order=1, +Side="I", +Event="OnEventEngineStartup", +Text="S_EVENT_ENGINE_STARTUP" +}, +[world.event.S_EVENT_ENGINE_SHUTDOWN]={ +Order=1, +Side="I", +Event="OnEventEngineShutdown", +Text="S_EVENT_ENGINE_SHUTDOWN" +}, +[world.event.S_EVENT_PLAYER_ENTER_UNIT]={ +Order=1, +Side="I", +Event="OnEventPlayerEnterUnit", +Text="S_EVENT_PLAYER_ENTER_UNIT" +}, +[world.event.S_EVENT_PLAYER_LEAVE_UNIT]={ +Order=-1, +Side="I", +Event="OnEventPlayerLeaveUnit", +Text="S_EVENT_PLAYER_LEAVE_UNIT" +}, +[world.event.S_EVENT_PLAYER_COMMENT]={ +Order=1, +Side="I", +Event="OnEventPlayerComment", +Text="S_EVENT_PLAYER_COMMENT" +}, +[world.event.S_EVENT_SHOOTING_START]={ +Order=1, +Side="I", +Event="OnEventShootingStart", +Text="S_EVENT_SHOOTING_START" +}, +[world.event.S_EVENT_SHOOTING_END]={ +Order=1, +Side="I", +Event="OnEventShootingEnd", +Text="S_EVENT_SHOOTING_END" +}, +[world.event.S_EVENT_MARK_ADDED]={ +Order=1, +Side="I", +Event="OnEventMarkAdded", +Text="S_EVENT_MARK_ADDED" +}, +[world.event.S_EVENT_MARK_CHANGE]={ +Order=1, +Side="I", +Event="OnEventMarkChange", +Text="S_EVENT_MARK_CHANGE" +}, +[world.event.S_EVENT_MARK_REMOVED]={ +Order=1, +Side="I", +Event="OnEventMarkRemoved", +Text="S_EVENT_MARK_REMOVED" +}, +[EVENTS.NewCargo]={ +Order=1, +Event="OnEventNewCargo", +Text="S_EVENT_NEW_CARGO" +}, +[EVENTS.DeleteCargo]={ +Order=1, +Event="OnEventDeleteCargo", +Text="S_EVENT_DELETE_CARGO" +}, +[EVENTS.NewZone]={ +Order=1, +Event="OnEventNewZone", +Text="S_EVENT_NEW_ZONE" +}, +[EVENTS.DeleteZone]={ +Order=1, +Event="OnEventDeleteZone", +Text="S_EVENT_DELETE_ZONE" +}, +[EVENTS.NewZoneGoal]={ +Order=1, +Event="OnEventNewZoneGoal", +Text="S_EVENT_NEW_ZONE_GOAL" +}, +[EVENTS.DeleteZoneGoal]={ +Order=1, +Event="OnEventDeleteZoneGoal", +Text="S_EVENT_DELETE_ZONE_GOAL" +}, +[EVENTS.RemoveUnit]={ +Order=-1, +Event="OnEventRemoveUnit", +Text="S_EVENT_REMOVE_UNIT" +}, +[EVENTS.PlayerEnterAircraft]={ +Order=1, +Event="OnEventPlayerEnterAircraft", +Text="S_EVENT_PLAYER_ENTER_AIRCRAFT" +}, +[EVENTS.DetailedFailure]={ +Order=1, +Event="OnEventDetailedFailure", +Text="S_EVENT_DETAILED_FAILURE" +}, +[EVENTS.Kill]={ +Order=1, +Event="OnEventKill", +Text="S_EVENT_KILL" +}, +[EVENTS.Score]={ +Order=1, +Event="OnEventScore", +Text="S_EVENT_SCORE" +}, +[EVENTS.UnitLost]={ +Order=1, +Event="OnEventUnitLost", +Text="S_EVENT_UNIT_LOST" +}, +[EVENTS.LandingAfterEjection]={ +Order=1, +Event="OnEventLandingAfterEjection", +Text="S_EVENT_LANDING_AFTER_EJECTION" +}, +[EVENTS.ParatrooperLanding]={ +Order=1, +Event="OnEventParatrooperLanding", +Text="S_EVENT_PARATROOPER_LENDING" +}, +[EVENTS.DiscardChairAfterEjection]={ +Order=1, +Event="OnEventDiscardChairAfterEjection", +Text="S_EVENT_DISCARD_CHAIR_AFTER_EJECTION" +}, +[EVENTS.WeaponAdd]={ +Order=1, +Event="OnEventWeaponAdd", +Text="S_EVENT_WEAPON_ADD" +}, +[EVENTS.TriggerZone]={ +Order=1, +Event="OnEventTriggerZone", +Text="S_EVENT_TRIGGER_ZONE" +}, +[EVENTS.LandingQualityMark]={ +Order=1, +Event="OnEventLandingQualityMark", +Text="S_EVENT_LANDING_QUALITYMARK" +}, +[EVENTS.BDA]={ +Order=1, +Event="OnEventBDA", +Text="S_EVENT_BDA" +}, +[EVENTS.AIAbortMission]={ +Order=1, +Side="I", +Event="OnEventAIAbortMission", +Text="S_EVENT_AI_ABORT_MISSION" +}, +[EVENTS.DayNight]={ +Order=1, +Event="OnEventDayNight", +Text="S_EVENT_DAYNIGHT" +}, +[EVENTS.FlightTime]={ +Order=1, +Event="OnEventFlightTime", +Text="S_EVENT_FLIGHT_TIME" +}, +[EVENTS.SelfKillPilot]={ +Order=1, +Side="I", +Event="OnEventSelfKillPilot", +Text="S_EVENT_PLAYER_SELF_KILL_PILOT" +}, +[EVENTS.PlayerCaptureAirfield]={ +Order=1, +Event="OnEventPlayerCaptureAirfield", +Text="S_EVENT_PLAYER_CAPTURE_AIRFIELD" +}, +[EVENTS.EmergencyLanding]={ +Order=1, +Side="I", +Event="OnEventEmergencyLanding", +Text="S_EVENT_EMERGENCY_LANDING" +}, +[EVENTS.UnitCreateTask]={ +Order=1, +Event="OnEventUnitCreateTask", +Text="S_EVENT_UNIT_CREATE_TASK" +}, +[EVENTS.UnitDeleteTask]={ +Order=1, +Event="OnEventUnitDeleteTask", +Text="S_EVENT_UNIT_DELETE_TASK" +}, +[EVENTS.SimulationStart]={ +Order=1, +Event="OnEventSimulationStart", +Text="S_EVENT_SIMULATION_START" +}, +[EVENTS.WeaponRearm]={ +Order=1, +Side="I", +Event="OnEventWeaponRearm", +Text="S_EVENT_WEAPON_REARM" +}, +[EVENTS.WeaponDrop]={ +Order=1, +Side="I", +Event="OnEventWeaponDrop", +Text="S_EVENT_WEAPON_DROP" +}, +[EVENTS.UnitTaskStage]={ +Order=1, +Side="I", +Event="OnEventUnitTaskStage", +Text="S_EVENT_UNIT_TASK_STAGE " +}, +[EVENTS.MacExtraScore]={ +Order=1, +Side="I", +Event="OnEventMacExtraScore", +Text="S_EVENT_MAC_EXTRA_SCOREP" +}, +[EVENTS.MissionRestart]={ +Order=1, +Side="I", +Event="OnEventMissionRestart", +Text="S_EVENT_MISSION_RESTART" +}, +[EVENTS.MissionWinner]={ +Order=1, +Side="I", +Event="OnEventMissionWinner", +Text="S_EVENT_MISSION_WINNER" +}, +[EVENTS.RunwayTakeoff]={ +Order=1, +Side="I", +Event="OnEventRunwayTakeoff", +Text="S_EVENT_RUNWAY_TAKEOFF" +}, +[EVENTS.RunwayTouch]={ +Order=1, +Side="I", +Event="OnEventRunwayTouch", +Text="S_EVENT_RUNWAY_TOUCH" +}, +[EVENTS.MacLMSRestart]={ +Order=1, +Side="I", +Event="OnEventMacLMSRestart", +Text="S_EVENT_MAC_LMS_RESTART" +}, +[EVENTS.SimulationFreeze]={ +Order=1, +Side="I", +Event="OnEventSimulationFreeze", +Text="S_EVENT_SIMULATION_FREEZE" +}, +[EVENTS.SimulationUnfreeze]={ +Order=1, +Side="I", +Event="OnEventSimulationUnfreeze", +Text="S_EVENT_SIMULATION_UNFREEZE" +}, +[EVENTS.HumanAircraftRepairStart]={ +Order=1, +Side="I", +Event="OnEventHumanAircraftRepairStart", +Text="S_EVENT_HUMAN_AIRCRAFT_REPAIR_START" +}, +[EVENTS.HumanAircraftRepairFinish]={ +Order=1, +Side="I", +Event="OnEventHumanAircraftRepairFinish", +Text="S_EVENT_HUMAN_AIRCRAFT_REPAIR_FINISH" +}, +[EVENTS.NewDynamicCargo]={ +Order=1, +Side="I", +Event="OnEventNewDynamicCargo", +Text="S_EVENT_NEW_DYNAMIC_CARGO" +}, +[EVENTS.DynamicCargoLoaded]={ +Order=1, +Side="I", +Event="OnEventDynamicCargoLoaded", +Text="S_EVENT_DYNAMIC_CARGO_LOADED" +}, +[EVENTS.DynamicCargoUnloaded]={ +Order=1, +Side="I", +Event="OnEventDynamicCargoUnloaded", +Text="S_EVENT_DYNAMIC_CARGO_UNLOADED" +}, +[EVENTS.DynamicCargoRemoved]={ +Order=1, +Side="I", +Event="OnEventDynamicCargoRemoved", +Text="S_EVENT_DYNAMIC_CARGO_REMOVED" +}, +} +function EVENT:New() +local self=BASE:Inherit(self,BASE:New()) +self.EventHandler=world.addEventHandler(self) +return self +end +function EVENT:Init(EventID,EventClass) +self:F3({_EVENTMETA[EventID].Text,EventClass}) +if not self.Events[EventID]then +self.Events[EventID]={} +end +local EventPriority=EventClass:GetEventPriority() +if not self.Events[EventID][EventPriority]then +self.Events[EventID][EventPriority]=setmetatable({},{__mode="k"}) +end +if not self.Events[EventID][EventPriority][EventClass]then +self.Events[EventID][EventPriority][EventClass]={} +end +return self.Events[EventID][EventPriority][EventClass] +end +function EVENT:RemoveEvent(EventClass,EventID) +self:F2({"Removing subscription for class: ",EventClass:GetClassNameAndID()}) +local EventPriority=EventClass:GetEventPriority() +self.Events=self.Events or{} +self.Events[EventID]=self.Events[EventID]or{} +self.Events[EventID][EventPriority]=self.Events[EventID][EventPriority]or{} +self.Events[EventID][EventPriority][EventClass]=nil +return self +end +function EVENT:Reset(EventObject) +self:F({"Resetting subscriptions for class: ",EventObject:GetClassNameAndID()}) +local EventPriority=EventObject:GetEventPriority() +for EventID,EventData in pairs(self.Events)do +if self.EventsDead then +if self.EventsDead[EventID]then +if self.EventsDead[EventID][EventPriority]then +if self.EventsDead[EventID][EventPriority][EventObject]then +self.Events[EventID][EventPriority][EventObject]=self.EventsDead[EventID][EventPriority][EventObject] +end +end +end +end +end +end +function EVENT:RemoveAll(EventClass) +local EventClassName=EventClass:GetClassNameAndID() +local EventPriority=EventClass:GetEventPriority() +for EventID,EventData in pairs(self.Events)do +self.Events[EventID][EventPriority][EventClass]=nil +end +return self +end +function EVENT:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EventID) +self:F2(EventTemplate.name) +for EventUnitID,EventUnit in pairs(EventTemplate.units)do +self:OnEventForUnit(EventUnit.name,EventFunction,EventClass,EventID) +end +return self +end +function EVENT:OnEventGeneric(EventFunction,EventClass,EventID) +self:F2({EventID,EventClass,EventFunction}) +local EventData=self:Init(EventID,EventClass) +EventData.EventFunction=EventFunction +return self +end +function EVENT:OnEventForUnit(UnitName,EventFunction,EventClass,EventID) +self:F2(UnitName) +local EventData=self:Init(EventID,EventClass) +EventData.EventUnit=true +EventData.EventFunction=EventFunction +return self +end +function EVENT:OnEventForGroup(GroupName,EventFunction,EventClass,EventID,...) +local Event=self:Init(EventID,EventClass) +Event.EventGroup=true +Event.EventFunction=EventFunction +Event.Params=arg +return self +end +do +function EVENT:OnBirthForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.Birth) +return self +end +end +do +function EVENT:OnCrashForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.Crash) +return self +end +end +do +function EVENT:OnDeadForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.Dead) +return self +end +end +do +function EVENT:OnLandForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.Land) +return self +end +end +do +function EVENT:OnTakeOffForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.Takeoff) +return self +end +end +do +function EVENT:OnEngineShutDownForTemplate(EventTemplate,EventFunction,EventClass) +self:F2(EventTemplate.name) +self:OnEventForTemplate(EventTemplate,EventFunction,EventClass,EVENTS.EngineShutdown) +return self +end +end +do +function EVENT:CreateEventNewCargo(Cargo) +self:F({Cargo}) +local Event={ +id=EVENTS.NewCargo, +time=timer.getTime(), +cargo=Cargo, +} +world.onEvent(Event) +end +function EVENT:CreateEventDeleteCargo(Cargo) +self:F({Cargo}) +local Event={ +id=EVENTS.DeleteCargo, +time=timer.getTime(), +cargo=Cargo, +} +world.onEvent(Event) +end +function EVENT:CreateEventNewZone(Zone) +self:F({Zone}) +local Event={ +id=EVENTS.NewZone, +time=timer.getTime(), +zone=Zone, +} +world.onEvent(Event) +end +function EVENT:CreateEventDeleteZone(Zone) +self:F({Zone}) +local Event={ +id=EVENTS.DeleteZone, +time=timer.getTime(), +zone=Zone, +} +world.onEvent(Event) +end +function EVENT:CreateEventNewZoneGoal(ZoneGoal) +self:F({ZoneGoal}) +local Event={ +id=EVENTS.NewZoneGoal, +time=timer.getTime(), +ZoneGoal=ZoneGoal, +} +world.onEvent(Event) +end +function EVENT:CreateEventDeleteZoneGoal(ZoneGoal) +self:F({ZoneGoal}) +local Event={ +id=EVENTS.DeleteZoneGoal, +time=timer.getTime(), +ZoneGoal=ZoneGoal, +} +world.onEvent(Event) +end +function EVENT:CreateEventPlayerEnterUnit(PlayerUnit) +self:F({PlayerUnit}) +local Event={ +id=EVENTS.PlayerEnterUnit, +time=timer.getTime(), +initiator=PlayerUnit:GetDCSObject() +} +world.onEvent(Event) +end +function EVENT:CreateEventPlayerEnterAircraft(PlayerUnit) +self:F({PlayerUnit}) +local Event={ +id=EVENTS.PlayerEnterAircraft, +time=timer.getTime(), +initiator=PlayerUnit:GetDCSObject() +} +world.onEvent(Event) +end +function EVENT:CreateEventNewDynamicCargo(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.NewDynamicCargo, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function EVENT:CreateEventDynamicCargoLoaded(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoLoaded, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function EVENT:CreateEventDynamicCargoUnloaded(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoUnloaded, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +function EVENT:CreateEventDynamicCargoRemoved(DynamicCargo) +self:F({DynamicCargo}) +local Event={ +id=EVENTS.DynamicCargoRemoved, +time=timer.getTime(), +dynamiccargo=DynamicCargo, +initiator=DynamicCargo:GetDCSObject(), +} +world.onEvent(Event) +end +end +function EVENT:onEvent(Event) +local ErrorHandler=function(errmsg) +env.info("Error in SCHEDULER function:"..errmsg) +if BASE.Debug~=nil then +env.info(debug.traceback()) +end +return errmsg +end +local EventMeta=_EVENTMETA[Event.id] +if EventMeta then +if self and self.Events and self.Events[Event.id]and self.MissionEnd==false and(Event.initiator~=nil or(Event.initiator==nil and Event.id~=EVENTS.PlayerLeaveUnit))then +if Event.id and Event.id==EVENTS.MissionEnd then +self.MissionEnd=true +end +if Event.initiator then +Event.IniObjectCategory=Object.getCategory(Event.initiator) +if Event.IniObjectCategory==Object.Category.STATIC then +if Event.id==31 then +Event.IniDCSUnit=Event.initiator +local ID=Event.initiator.id_ +Event.IniDCSUnitName=string.format("Ejected Pilot ID %s",tostring(ID)) +Event.IniUnitName=Event.IniDCSUnitName +Event.IniCoalition=0 +Event.IniCategory=0 +Event.IniTypeName="Ejected Pilot" +elseif Event.id==33 then +Event.IniDCSUnit=Event.initiator +local ID=Event.initiator.id_ +Event.IniDCSUnitName=string.format("Ejection Seat ID %s",tostring(ID)) +Event.IniUnitName=Event.IniDCSUnitName +Event.IniCoalition=0 +Event.IniCategory=0 +Event.IniTypeName="Ejection Seat" +else +Event.IniDCSUnit=Event.initiator +Event.IniDCSUnitName=Event.IniDCSUnit:getName() +Event.IniUnitName=Event.IniDCSUnitName +Event.IniUnit=STATIC:FindByName(Event.IniDCSUnitName,false) +Event.IniCoalition=Event.IniDCSUnit:getCoalition() +Event.IniCategory=Event.IniDCSUnit:getDesc().category +Event.IniTypeName=Event.IniDCSUnit:getTypeName() +end +local Unit=UNIT:FindByName(Event.IniDCSUnitName) +if Unit then +Event.IniObjectCategory=Object.Category.UNIT +end +elseif Event.IniObjectCategory==Object.Category.UNIT then +Event.IniDCSUnit=Event.initiator +Event.IniDCSUnitName=Event.IniDCSUnit:getName() +Event.IniUnitName=Event.IniDCSUnitName +Event.IniDCSGroup=Event.IniDCSUnit:getGroup() +Event.IniUnit=UNIT:FindByName(Event.IniDCSUnitName) +if not Event.IniUnit then +Event.IniUnit=CLIENT:FindByName(Event.IniDCSUnitName,'',true) +end +Event.IniDCSGroupName=Event.IniUnit and Event.IniUnit.GroupName or"" +Event.IniGroupName=Event.IniDCSGroupName +if Event.IniDCSGroup and Event.IniDCSGroup:isExist()then +Event.IniDCSGroupName=Event.IniDCSGroup:getName() +Event.IniGroup=GROUP:FindByName(Event.IniDCSGroupName) +Event.IniGroupName=Event.IniDCSGroupName +end +Event.IniPlayerName=Event.IniDCSUnit:getPlayerName() +if Event.IniPlayerName then +local PID=NET.GetPlayerIDByName(nil,Event.IniPlayerName) +if PID then +Event.IniPlayerUCID=net.get_player_info(tonumber(PID),'ucid') +end +end +Event.IniCoalition=Event.IniDCSUnit:getCoalition() +Event.IniTypeName=Event.IniDCSUnit:getTypeName() +Event.IniCategory=Event.IniDCSUnit:getDesc().category +elseif Event.IniObjectCategory==Object.Category.CARGO then +Event.IniDCSUnit=Event.initiator +Event.IniDCSUnitName=Event.IniDCSUnit:getName() +Event.IniUnitName=Event.IniDCSUnitName +if string.match(Event.IniUnitName,".+|%d%d:%d%d|PKG%d+")then +Event.IniDynamicCargo=DYNAMICCARGO:FindByName(Event.IniUnitName) +Event.IniDynamicCargoName=Event.IniUnitName +Event.IniPlayerName=string.match(Event.IniUnitName,"^(.+)|%d%d:%d%d|PKG%d+") +else +Event.IniUnit=CARGO:FindByName(Event.IniDCSUnitName) +end +Event.IniCoalition=Event.IniDCSUnit:getCoalition() +Event.IniCategory=Event.IniDCSUnit:getDesc().category +Event.IniTypeName=Event.IniDCSUnit:getTypeName() +elseif Event.IniObjectCategory==Object.Category.SCENERY then +Event.IniDCSUnit=Event.initiator +Event.IniDCSUnitName=(Event.IniDCSUnit and Event.IniDCSUnit.getName)and Event.IniDCSUnit:getName()or"Scenery no name "..math.random(1,20000) +Event.IniUnitName=Event.IniDCSUnitName +Event.IniUnit=SCENERY:Register(Event.IniDCSUnitName,Event.initiator) +Event.IniCategory=(Event.IniDCSUnit and Event.IniDCSUnit.getDesc)and Event.IniDCSUnit:getDesc().category +Event.IniTypeName=(Event.initiator and Event.initiator.isExist +and Event.initiator:isExist()and Event.IniDCSUnit and Event.IniDCSUnit.getTypeName)and Event.IniDCSUnit:getTypeName()or"SCENERY" +elseif Event.IniObjectCategory==Object.Category.BASE then +Event.IniDCSUnit=Event.initiator +Event.IniDCSUnitName=Event.IniDCSUnit:getName() +Event.IniUnitName=Event.IniDCSUnitName +Event.IniUnit=AIRBASE:FindByName(Event.IniDCSUnitName) +Event.IniCoalition=Event.IniDCSUnit:getCoalition() +Event.IniCategory=Event.IniDCSUnit:getDesc().category +Event.IniTypeName=Event.IniDCSUnit:getTypeName() +if not Event.IniUnit then +_DATABASE:_RegisterAirbase(Event.initiator) +Event.IniUnit=AIRBASE:FindByName(Event.IniDCSUnitName) +end +end +end +if Event.target then +Event.TgtObjectCategory=Object.getCategory(Event.target) +if Event.TgtObjectCategory==Object.Category.UNIT then +Event.TgtDCSUnit=Event.target +Event.TgtDCSGroup=Event.TgtDCSUnit:getGroup() +Event.TgtDCSUnitName=Event.TgtDCSUnit:getName() +Event.TgtUnitName=Event.TgtDCSUnitName +Event.TgtUnit=UNIT:FindByName(Event.TgtDCSUnitName) +Event.TgtDCSGroupName="" +if Event.TgtDCSGroup and Event.TgtDCSGroup:isExist()then +Event.TgtDCSGroupName=Event.TgtDCSGroup:getName() +Event.TgtGroup=GROUP:FindByName(Event.TgtDCSGroupName) +Event.TgtGroupName=Event.TgtDCSGroupName +end +Event.TgtPlayerName=Event.TgtDCSUnit:getPlayerName() +if Event.TgtPlayerName then +local PID=NET.GetPlayerIDByName(nil,Event.TgtPlayerName) +if PID then +Event.TgtPlayerUCID=net.get_player_info(tonumber(PID),'ucid') +end +end +Event.TgtCoalition=Event.TgtDCSUnit:getCoalition() +Event.TgtCategory=Event.TgtDCSUnit:getDesc().category +Event.TgtTypeName=Event.TgtDCSUnit:getTypeName() +elseif Event.TgtObjectCategory==Object.Category.STATIC then +Event.TgtDCSUnit=Event.target +if Event.target.isExist and Event.target:isExist()and Event.id~=33 then +Event.TgtDCSUnitName=Event.TgtDCSUnit:getName() +if Event.TgtDCSUnitName and Event.TgtDCSUnitName~=""then +Event.TgtUnitName=Event.TgtDCSUnitName +Event.TgtUnit=STATIC:FindByName(Event.TgtDCSUnitName,false) +Event.TgtCoalition=Event.TgtDCSUnit:getCoalition() +Event.TgtCategory=Event.TgtDCSUnit:getDesc().category +Event.TgtTypeName=Event.TgtDCSUnit:getTypeName() +end +else +Event.TgtDCSUnitName=string.format("No target object for Event ID %s",tostring(Event.id)) +Event.TgtUnitName=Event.TgtDCSUnitName +Event.TgtUnit=nil +Event.TgtCoalition=0 +Event.TgtCategory=0 +if Event.id==6 then +Event.TgtTypeName="Ejected Pilot" +Event.TgtDCSUnitName=string.format("Ejected Pilot ID %s",tostring(Event.IniDCSUnitName)) +Event.TgtUnitName=Event.TgtDCSUnitName +elseif Event.id==33 then +Event.TgtTypeName="Ejection Seat" +Event.TgtDCSUnitName=string.format("Ejection Seat ID %s",tostring(Event.IniDCSUnitName)) +Event.TgtUnitName=Event.TgtDCSUnitName +else +Event.TgtTypeName="Static" +end +end +elseif Event.TgtObjectCategory==Object.Category.SCENERY then +Event.TgtDCSUnit=Event.target +Event.TgtDCSUnitName=Event.TgtDCSUnit.getName and Event.TgtDCSUnit.getName()or nil +if Event.TgtDCSUnitName~=nil then +Event.TgtUnitName=Event.TgtDCSUnitName +Event.TgtUnit=SCENERY:Register(Event.TgtDCSUnitName,Event.target) +Event.TgtCategory=Event.TgtDCSUnit:getDesc().category +Event.TgtTypeName=Event.TgtDCSUnit:getTypeName() +end +end +end +if Event.weapon and type(Event.weapon)=="table"and Event.weapon.isExist and Event.weapon:isExist()then +Event.Weapon=Event.weapon +Event.WeaponName=Event.weapon:isExist()and Event.weapon:getTypeName()or"Unknown Weapon" +Event.WeaponUNIT=CLIENT:Find(Event.Weapon,'',true) +Event.WeaponPlayerName=Event.WeaponUNIT and Event.Weapon.getPlayerName and Event.Weapon:getPlayerName() +Event.WeaponCoalition=Event.WeaponUNIT and Event.Weapon.getCoalition and Event.Weapon:getCoalition() +Event.WeaponCategory=Event.WeaponUNIT and Event.Weapon.getDesc and Event.Weapon:getDesc().category +Event.WeaponTypeName=Event.WeaponUNIT and Event.Weapon.getTypeName and Event.Weapon:getTypeName() +end +if Event.place then +if Event.id==EVENTS.LandingAfterEjection then +else +if Event.place:isExist()and Object.getCategory(Event.place)~=Object.Category.SCENERY then +Event.Place=AIRBASE:Find(Event.place) +if Event.Place then +Event.PlaceName=Event.Place:GetName() +end +end +end +end +if Event.idx then +Event.MarkID=Event.idx +Event.MarkVec3=Event.pos +Event.MarkCoordinate=COORDINATE:NewFromVec3(Event.pos) +Event.MarkText=Event.text +Event.MarkCoalition=Event.coalition +Event.IniCoalition=Event.coalition +Event.MarkGroupID=Event.groupID +end +if Event.cargo then +Event.Cargo=Event.cargo +Event.CargoName=Event.cargo.Name +end +if Event.dynamiccargo then +Event.IniDynamicCargo=Event.dynamiccargo +Event.IniDynamicCargoName=Event.IniDynamicCargo.StaticName +if Event.IniDynamicCargo.Owner or Event.IniUnitName then +Event.IniPlayerName=Event.IniDynamicCargo.Owner or string.match(Event.IniUnitName or"None|00:00|PKG00","^(.+)|%d%d:%d%d|PKG%d+") +end +end +if Event.zone then +Event.Zone=Event.zone +Event.ZoneName=Event.zone.ZoneName +end +local PriorityOrder=EventMeta.Order +local PriorityBegin=PriorityOrder==-1 and 5 or 1 +local PriorityEnd=PriorityOrder==-1 and 1 or 5 +for EventPriority=PriorityBegin,PriorityEnd,PriorityOrder do +if self.Events[Event.id][EventPriority]then +for EventClass,EventData in pairs(self.Events[Event.id][EventPriority])do +Event.IniGroup=Event.IniGroup or GROUP:FindByName(Event.IniDCSGroupName) +Event.TgtGroup=Event.TgtGroup or GROUP:FindByName(Event.TgtDCSGroupName) +if EventData.EventUnit then +if EventClass:IsAlive()or +Event.id==EVENTS.PlayerEnterUnit or +Event.id==EVENTS.Crash or +Event.id==EVENTS.Dead or +Event.id==EVENTS.RemoveUnit or +Event.id==EVENTS.UnitLost then +local UnitName=EventClass:GetName() +if(EventMeta.Side=="I"and UnitName==Event.IniDCSUnitName)or +(EventMeta.Side=="T"and UnitName==Event.TgtDCSUnitName)then +if EventData.EventFunction then +local Result,Value=xpcall( +function() +return EventData.EventFunction(EventClass,Event) +end,ErrorHandler) +else +local EventFunction=EventClass[EventMeta.Event] +if EventFunction and type(EventFunction)=="function"then +local Result,Value=xpcall( +function() +return EventFunction(EventClass,Event) +end,ErrorHandler) +end +end +end +else +self:RemoveEvent(EventClass,Event.id) +end +else +if EventData.EventGroup then +if EventClass:IsAlive()or +Event.id==EVENTS.PlayerEnterUnit or +Event.id==EVENTS.Crash or +Event.id==EVENTS.Dead or +Event.id==EVENTS.RemoveUnit or +Event.id==EVENTS.UnitLost then +local GroupName=EventClass:GetName() +if(EventMeta.Side=="I"and GroupName==Event.IniDCSGroupName)or +(EventMeta.Side=="T"and GroupName==Event.TgtDCSGroupName)then +if EventData.EventFunction then +local Result,Value=xpcall( +function() +return EventData.EventFunction(EventClass,Event,unpack(EventData.Params)) +end,ErrorHandler) +else +local EventFunction=EventClass[EventMeta.Event] +if EventFunction and type(EventFunction)=="function"then +local Result,Value=xpcall( +function() +return EventFunction(EventClass,Event,unpack(EventData.Params)) +end,ErrorHandler) +end +end +end +else +end +else +if not EventData.EventUnit then +if EventData.EventFunction then +local Result,Value=xpcall( +function() +return EventData.EventFunction(EventClass,Event) +end,ErrorHandler) +else +local EventFunction=EventClass[EventMeta.Event] +if EventFunction and type(EventFunction)=="function"then +local Result,Value=xpcall( +function() +local Result,Value=EventFunction(EventClass,Event) +return Result,Value +end,ErrorHandler) +end +end +end +end +end +end +end +end +if Event.id==EVENTS.DeleteCargo then +Event.Cargo.NoDestroy=nil +end +else +self:T({EventMeta.Text,Event}) +end +else +self:E(string.format("WARNING: Could not get EVENTMETA data for event ID=%d! Is this an unknown/new DCS event?",tostring(Event.id))) +end +Event=nil +end +EVENTHANDLER={ +ClassName="EVENTHANDLER", +ClassID=0, +} +function EVENTHANDLER:New() +self=BASE:Inherit(self,BASE:New()) +return self +end +SETTINGS={ +ClassName="SETTINGS", +ShowPlayerMenu=true, +MenuShort=false, +MenuStatic=false, +} +SETTINGS.__Enum={} +SETTINGS.__Enum.Era={ +WWII=1, +Korea=2, +Cold=3, +Modern=4, +} +do +function SETTINGS:Set(PlayerName) +if PlayerName==nil then +local self=BASE:Inherit(self,BASE:New()) +self:SetMetric() +self:SetA2G_BR() +self:SetA2A_BRAA() +self:SetLL_Accuracy(3) +self:SetMGRS_Accuracy(5) +self:SetMessageTime(MESSAGE.Type.Briefing,180) +self:SetMessageTime(MESSAGE.Type.Detailed,60) +self:SetMessageTime(MESSAGE.Type.Information,30) +self:SetMessageTime(MESSAGE.Type.Overview,60) +self:SetMessageTime(MESSAGE.Type.Update,15) +self:SetEraModern() +self:SetLocale("en") +return self +else +local Settings=_DATABASE:GetPlayerSettings(PlayerName) +if not Settings then +Settings=BASE:Inherit(self,BASE:New()) +_DATABASE:SetPlayerSettings(PlayerName,Settings) +end +return Settings +end +end +function SETTINGS:SetMenutextShort(onoff) +_SETTINGS.MenuShort=onoff +end +function SETTINGS:SetMenuStatic(onoff) +_SETTINGS.MenuStatic=onoff +end +function SETTINGS:SetMetric() +self.Metric=true +end +function SETTINGS:SetLocale(Locale) +self.Locale=Locale or"en" +end +function SETTINGS:GetLocale() +return self.Locale or _SETTINGS:GetLocale() +end +function SETTINGS:IsMetric() +return(self.Metric~=nil and self.Metric==true)or(self.Metric==nil and _SETTINGS:IsMetric()) +end +function SETTINGS:SetImperial() +self.Metric=false +end +function SETTINGS:IsImperial() +return(self.Metric~=nil and self.Metric==false)or(self.Metric==nil and _SETTINGS:IsImperial()) +end +function SETTINGS:SetLL_Accuracy(LL_Accuracy) +self.LL_Accuracy=LL_Accuracy +end +function SETTINGS:GetLL_DDM_Accuracy() +return self.LL_DDM_Accuracy or _SETTINGS:GetLL_DDM_Accuracy() +end +function SETTINGS:SetMGRS_Accuracy(MGRS_Accuracy) +self.MGRS_Accuracy=MGRS_Accuracy +end +function SETTINGS:GetMGRS_Accuracy() +return self.MGRS_Accuracy or _SETTINGS:GetMGRS_Accuracy() +end +function SETTINGS:SetMessageTime(MessageType,MessageTime) +self.MessageTypeTimings=self.MessageTypeTimings or{} +self.MessageTypeTimings[MessageType]=MessageTime +end +function SETTINGS:GetMessageTime(MessageType) +return(self.MessageTypeTimings and self.MessageTypeTimings[MessageType])or _SETTINGS:GetMessageTime(MessageType) +end +function SETTINGS:SetA2G_LL_DMS() +self.A2GSystem="LL DMS" +end +function SETTINGS:SetA2G_LL_DDM() +self.A2GSystem="LL DDM" +end +function SETTINGS:IsA2G_LL_DMS() +return(self.A2GSystem and self.A2GSystem=="LL DMS")or(not self.A2GSystem and _SETTINGS:IsA2G_LL_DMS()) +end +function SETTINGS:IsA2G_LL_DDM() +return(self.A2GSystem and self.A2GSystem=="LL DDM")or(not self.A2GSystem and _SETTINGS:IsA2G_LL_DDM()) +end +function SETTINGS:SetA2G_MGRS() +self.A2GSystem="MGRS" +end +function SETTINGS:IsA2G_MGRS() +return(self.A2GSystem and self.A2GSystem=="MGRS")or(not self.A2GSystem and _SETTINGS:IsA2G_MGRS()) +end +function SETTINGS:SetA2G_BR() +self.A2GSystem="BR" +end +function SETTINGS:IsA2G_BR() +return(self.A2GSystem and self.A2GSystem=="BR")or(not self.A2GSystem and _SETTINGS:IsA2G_BR()) +end +function SETTINGS:SetA2A_BRAA() +self.A2ASystem="BRAA" +end +function SETTINGS:IsA2A_BRAA() +return(self.A2ASystem and self.A2ASystem=="BRAA")or(not self.A2ASystem and _SETTINGS:IsA2A_BRAA()) +end +function SETTINGS:SetA2A_BULLS() +self.A2ASystem="BULLS" +end +function SETTINGS:IsA2A_BULLS() +return(self.A2ASystem and self.A2ASystem=="BULLS")or(not self.A2ASystem and _SETTINGS:IsA2A_BULLS()) +end +function SETTINGS:SetA2A_LL_DMS() +self.A2ASystem="LL DMS" +end +function SETTINGS:SetA2A_LL_DDM() +self.A2ASystem="LL DDM" +end +function SETTINGS:IsA2A_LL_DMS() +return(self.A2ASystem and self.A2ASystem=="LL DMS")or(not self.A2ASystem and _SETTINGS:IsA2A_LL_DMS()) +end +function SETTINGS:IsA2A_LL_DDM() +return(self.A2ASystem and self.A2ASystem=="LL DDM")or(not self.A2ASystem and _SETTINGS:IsA2A_LL_DDM()) +end +function SETTINGS:SetA2A_MGRS() +self.A2ASystem="MGRS" +end +function SETTINGS:IsA2A_MGRS() +return(self.A2ASystem and self.A2ASystem=="MGRS")or(not self.A2ASystem and _SETTINGS:IsA2A_MGRS()) +end +function SETTINGS:SetSystemMenu(MenuGroup,RootMenu) +local MenuText="System Settings" +local MenuTime=timer.getTime() +local SettingsMenu=MENU_GROUP:New(MenuGroup,MenuText,RootMenu):SetTime(MenuTime) +local text="A2G Coordinate System" +if _SETTINGS.MenuShort then +text="A2G Coordinates" +end +local A2GCoordinateMenu=MENU_GROUP:New(MenuGroup,text,SettingsMenu):SetTime(MenuTime) +if not self:IsA2G_LL_DMS()then +local text="Lat/Lon Degree Min Sec (LL DMS)" +if _SETTINGS.MenuShort then +text="LL DMS" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2GCoordinateMenu,self.A2GMenuSystem,self,MenuGroup,RootMenu,"LL DMS"):SetTime(MenuTime) +end +if not self:IsA2G_LL_DDM()then +local text="Lat/Lon Degree Dec Min (LL DDM)" +if _SETTINGS.MenuShort then +text="LL DDM" +end +MENU_GROUP_COMMAND:New(MenuGroup,"Lat/Lon Degree Dec Min (LL DDM)",A2GCoordinateMenu,self.A2GMenuSystem,self,MenuGroup,RootMenu,"LL DDM"):SetTime(MenuTime) +end +if self:IsA2G_LL_DDM()then +local text1="LL DDM Accuracy 1" +local text2="LL DDM Accuracy 2" +local text3="LL DDM Accuracy 3" +if _SETTINGS.MenuShort then +text1="LL DDM" +end +MENU_GROUP_COMMAND:New(MenuGroup,"LL DDM Accuracy 1",A2GCoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,1):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"LL DDM Accuracy 2",A2GCoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,2):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"LL DDM Accuracy 3",A2GCoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,3):SetTime(MenuTime) +end +if not self:IsA2G_BR()then +local text="Bearing, Range (BR)" +if _SETTINGS.MenuShort then +text="BR" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2GCoordinateMenu,self.A2GMenuSystem,self,MenuGroup,RootMenu,"BR"):SetTime(MenuTime) +end +if not self:IsA2G_MGRS()then +local text="Military Grid (MGRS)" +if _SETTINGS.MenuShort then +text="MGRS" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2GCoordinateMenu,self.A2GMenuSystem,self,MenuGroup,RootMenu,"MGRS"):SetTime(MenuTime) +end +if self:IsA2G_MGRS()then +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 1",A2GCoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,1):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 2",A2GCoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,2):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 3",A2GCoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,3):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 4",A2GCoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,4):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 5",A2GCoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,5):SetTime(MenuTime) +end +local text="A2A Coordinate System" +if _SETTINGS.MenuShort then +text="A2A Coordinates" +end +local A2ACoordinateMenu=MENU_GROUP:New(MenuGroup,text,SettingsMenu):SetTime(MenuTime) +if not self:IsA2A_LL_DMS()then +local text="Lat/Lon Degree Min Sec (LL DMS)" +if _SETTINGS.MenuShort then +text="LL DMS" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2ACoordinateMenu,self.A2AMenuSystem,self,MenuGroup,RootMenu,"LL DMS"):SetTime(MenuTime) +end +if not self:IsA2A_LL_DDM()then +local text="Lat/Lon Degree Dec Min (LL DDM)" +if _SETTINGS.MenuShort then +text="LL DDM" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2ACoordinateMenu,self.A2AMenuSystem,self,MenuGroup,RootMenu,"LL DDM"):SetTime(MenuTime) +end +if self:IsA2A_LL_DDM()or self:IsA2A_LL_DMS()then +MENU_GROUP_COMMAND:New(MenuGroup,"LL Accuracy 0",A2ACoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,0):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"LL Accuracy 1",A2ACoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,1):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"LL Accuracy 2",A2ACoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,2):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"LL Accuracy 3",A2ACoordinateMenu,self.MenuLL_DDM_Accuracy,self,MenuGroup,RootMenu,3):SetTime(MenuTime) +end +if not self:IsA2A_BULLS()then +local text="Bullseye (BULLS)" +if _SETTINGS.MenuShort then +text="Bulls" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2ACoordinateMenu,self.A2AMenuSystem,self,MenuGroup,RootMenu,"BULLS"):SetTime(MenuTime) +end +if not self:IsA2A_BRAA()then +local text="Bearing Range Altitude Aspect (BRAA)" +if _SETTINGS.MenuShort then +text="BRAA" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2ACoordinateMenu,self.A2AMenuSystem,self,MenuGroup,RootMenu,"BRAA"):SetTime(MenuTime) +end +if not self:IsA2A_MGRS()then +local text="Military Grid (MGRS)" +if _SETTINGS.MenuShort then +text="MGRS" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,A2ACoordinateMenu,self.A2AMenuSystem,self,MenuGroup,RootMenu,"MGRS"):SetTime(MenuTime) +end +if self:IsA2A_MGRS()then +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 1",A2ACoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,1):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 2",A2ACoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,2):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 3",A2ACoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,3):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 4",A2ACoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,4):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"MGRS Accuracy 5",A2ACoordinateMenu,self.MenuMGRS_Accuracy,self,MenuGroup,RootMenu,5):SetTime(MenuTime) +end +local text="Measures and Weights System" +if _SETTINGS.MenuShort then +text="Unit System" +end +local MetricsMenu=MENU_GROUP:New(MenuGroup,text,SettingsMenu):SetTime(MenuTime) +if self:IsMetric()then +local text="Imperial (Miles,Feet)" +if _SETTINGS.MenuShort then +text="Imperial" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,MetricsMenu,self.MenuMWSystem,self,MenuGroup,RootMenu,false):SetTime(MenuTime) +end +if self:IsImperial()then +local text="Metric (Kilometers,Meters)" +if _SETTINGS.MenuShort then +text="Metric" +end +MENU_GROUP_COMMAND:New(MenuGroup,text,MetricsMenu,self.MenuMWSystem,self,MenuGroup,RootMenu,true):SetTime(MenuTime) +end +local text="Messages and Reports" +if _SETTINGS.MenuShort then +text="Messages & Reports" +end +local MessagesMenu=MENU_GROUP:New(MenuGroup,text,SettingsMenu):SetTime(MenuTime) +local UpdateMessagesMenu=MENU_GROUP:New(MenuGroup,"Update Messages",MessagesMenu):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"Off",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,0):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"5 seconds",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,5):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"10 seconds",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,10):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"15 seconds",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,15):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"30 seconds",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,30):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"1 minute",UpdateMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Update,60):SetTime(MenuTime) +local InformationMessagesMenu=MENU_GROUP:New(MenuGroup,"Information Messages",MessagesMenu):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"5 seconds",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,5):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"10 seconds",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,10):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"15 seconds",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,15):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"30 seconds",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,30):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"1 minute",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,60):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"2 minutes",InformationMessagesMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Information,120):SetTime(MenuTime) +local BriefingReportsMenu=MENU_GROUP:New(MenuGroup,"Briefing Reports",MessagesMenu):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"15 seconds",BriefingReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Briefing,15):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"30 seconds",BriefingReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Briefing,30):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"1 minute",BriefingReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Briefing,60):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"2 minutes",BriefingReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Briefing,120):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"3 minutes",BriefingReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Briefing,180):SetTime(MenuTime) +local OverviewReportsMenu=MENU_GROUP:New(MenuGroup,"Overview Reports",MessagesMenu):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"15 seconds",OverviewReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Overview,15):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"30 seconds",OverviewReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Overview,30):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"1 minute",OverviewReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Overview,60):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"2 minutes",OverviewReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Overview,120):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"3 minutes",OverviewReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.Overview,180):SetTime(MenuTime) +local DetailedReportsMenu=MENU_GROUP:New(MenuGroup,"Detailed Reports",MessagesMenu):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"15 seconds",DetailedReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.DetailedReportsMenu,15):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"30 seconds",DetailedReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.DetailedReportsMenu,30):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"1 minute",DetailedReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.DetailedReportsMenu,60):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"2 minutes",DetailedReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.DetailedReportsMenu,120):SetTime(MenuTime) +MENU_GROUP_COMMAND:New(MenuGroup,"3 minutes",DetailedReportsMenu,self.MenuMessageTimingsSystem,self,MenuGroup,RootMenu,MESSAGE.Type.DetailedReportsMenu,180):SetTime(MenuTime) +SettingsMenu:Remove(MenuTime) +return self +end +function SETTINGS:SetPlayerMenuOn() +self.ShowPlayerMenu=true +end +function SETTINGS:SetPlayerMenuOff() +self.ShowPlayerMenu=false +end +function SETTINGS:SetPlayerMenu(PlayerUnit) +if _SETTINGS.ShowPlayerMenu==true then +local PlayerGroup=PlayerUnit:GetGroup() +local PlayerName=PlayerUnit:GetPlayerName()or"None" +local PlayerMenu=MENU_GROUP:New(PlayerGroup,'Settings "'..PlayerName..'"') +self.PlayerMenu=PlayerMenu +self:T(string.format("Setting menu for player %s",tostring(PlayerName))) +local submenu=MENU_GROUP:New(PlayerGroup,"LL Accuracy",PlayerMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"LL 0 Decimals",submenu,self.MenuGroupLL_DDM_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,0) +MENU_GROUP_COMMAND:New(PlayerGroup,"LL 1 Decimal",submenu,self.MenuGroupLL_DDM_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,1) +MENU_GROUP_COMMAND:New(PlayerGroup,"LL 2 Decimals",submenu,self.MenuGroupLL_DDM_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,2) +MENU_GROUP_COMMAND:New(PlayerGroup,"LL 3 Decimals",submenu,self.MenuGroupLL_DDM_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,3) +MENU_GROUP_COMMAND:New(PlayerGroup,"LL 4 Decimals",submenu,self.MenuGroupLL_DDM_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,4) +local submenu=MENU_GROUP:New(PlayerGroup,"MGRS Accuracy",PlayerMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 0",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,0) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 1",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,1) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 2",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,2) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 3",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,3) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 4",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,4) +MENU_GROUP_COMMAND:New(PlayerGroup,"MRGS Accuracy 5",submenu,self.MenuGroupMGRS_AccuracySystem,self,PlayerUnit,PlayerGroup,PlayerName,5) +local text="A2G Coordinate System" +if _SETTINGS.MenuShort then +text="A2G Coordinates" +end +local A2GCoordinateMenu=MENU_GROUP:New(PlayerGroup,text,PlayerMenu) +if not self:IsA2G_LL_DMS()or _SETTINGS.MenuStatic then +local text="Lat/Lon Degree Min Sec (LL DMS)" +if _SETTINGS.MenuShort then +text="A2G LL DMS" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2GCoordinateMenu,self.MenuGroupA2GSystem,self,PlayerUnit,PlayerGroup,PlayerName,"LL DMS") +end +if not self:IsA2G_LL_DDM()or _SETTINGS.MenuStatic then +local text="Lat/Lon Degree Dec Min (LL DDM)" +if _SETTINGS.MenuShort then +text="A2G LL DDM" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2GCoordinateMenu,self.MenuGroupA2GSystem,self,PlayerUnit,PlayerGroup,PlayerName,"LL DDM") +end +if not self:IsA2G_BR()or _SETTINGS.MenuStatic then +local text="Bearing, Range (BR)" +if _SETTINGS.MenuShort then +text="A2G BR" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2GCoordinateMenu,self.MenuGroupA2GSystem,self,PlayerUnit,PlayerGroup,PlayerName,"BR") +end +if not self:IsA2G_MGRS()or _SETTINGS.MenuStatic then +local text="Military Grid (MGRS)" +if _SETTINGS.MenuShort then +text="A2G MGRS" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2GCoordinateMenu,self.MenuGroupA2GSystem,self,PlayerUnit,PlayerGroup,PlayerName,"MGRS") +end +local text="A2A Coordinate System" +if _SETTINGS.MenuShort then +text="A2A Coordinates" +end +local A2ACoordinateMenu=MENU_GROUP:New(PlayerGroup,text,PlayerMenu) +if not self:IsA2A_LL_DMS()or _SETTINGS.MenuStatic then +local text="Lat/Lon Degree Min Sec (LL DMS)" +if _SETTINGS.MenuShort then +text="A2A LL DMS" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2ACoordinateMenu,self.MenuGroupA2GSystem,self,PlayerUnit,PlayerGroup,PlayerName,"LL DMS") +end +if not self:IsA2A_LL_DDM()or _SETTINGS.MenuStatic then +local text="Lat/Lon Degree Dec Min (LL DDM)" +if _SETTINGS.MenuShort then +text="A2A LL DDM" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2ACoordinateMenu,self.MenuGroupA2ASystem,self,PlayerUnit,PlayerGroup,PlayerName,"LL DDM") +end +if not self:IsA2A_BULLS()or _SETTINGS.MenuStatic then +local text="Bullseye (BULLS)" +if _SETTINGS.MenuShort then +text="A2A BULLS" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2ACoordinateMenu,self.MenuGroupA2ASystem,self,PlayerUnit,PlayerGroup,PlayerName,"BULLS") +end +if not self:IsA2A_BRAA()or _SETTINGS.MenuStatic then +local text="Bearing Range Altitude Aspect (BRAA)" +if _SETTINGS.MenuShort then +text="A2A BRAA" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2ACoordinateMenu,self.MenuGroupA2ASystem,self,PlayerUnit,PlayerGroup,PlayerName,"BRAA") +end +if not self:IsA2A_MGRS()or _SETTINGS.MenuStatic then +local text="Military Grid (MGRS)" +if _SETTINGS.MenuShort then +text="A2A MGRS" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,A2ACoordinateMenu,self.MenuGroupA2ASystem,self,PlayerUnit,PlayerGroup,PlayerName,"MGRS") +end +local text="Measures and Weights System" +if _SETTINGS.MenuShort then +text="Unit System" +end +local MetricsMenu=MENU_GROUP:New(PlayerGroup,text,PlayerMenu) +if self:IsMetric()or _SETTINGS.MenuStatic then +local text="Imperial (Miles,Feet)" +if _SETTINGS.MenuShort then +text="Imperial" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,MetricsMenu,self.MenuGroupMWSystem,self,PlayerUnit,PlayerGroup,PlayerName,false) +end +if self:IsImperial()or _SETTINGS.MenuStatic then +local text="Metric (Kilometers,Meters)" +if _SETTINGS.MenuShort then +text="Metric" +end +MENU_GROUP_COMMAND:New(PlayerGroup,text,MetricsMenu,self.MenuGroupMWSystem,self,PlayerUnit,PlayerGroup,PlayerName,true) +end +local text="Messages and Reports" +if _SETTINGS.MenuShort then +text="Messages & Reports" +end +local MessagesMenu=MENU_GROUP:New(PlayerGroup,text,PlayerMenu) +local UpdateMessagesMenu=MENU_GROUP:New(PlayerGroup,"Update Messages",MessagesMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates Off",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,0) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates 5 sec",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,5) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates 10 sec",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,10) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates 15 sec",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,15) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates 30 sec",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,30) +MENU_GROUP_COMMAND:New(PlayerGroup,"Updates 1 min",UpdateMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Update,60) +local InformationMessagesMenu=MENU_GROUP:New(PlayerGroup,"Info Messages",MessagesMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 5 sec",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,5) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 10 sec",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,10) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 15 sec",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,15) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 30 sec",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,30) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 1 min",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,60) +MENU_GROUP_COMMAND:New(PlayerGroup,"Info 2 min",InformationMessagesMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Information,120) +local BriefingReportsMenu=MENU_GROUP:New(PlayerGroup,"Briefing Reports",MessagesMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"Brief 15 sec",BriefingReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Briefing,15) +MENU_GROUP_COMMAND:New(PlayerGroup,"Brief 30 sec",BriefingReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Briefing,30) +MENU_GROUP_COMMAND:New(PlayerGroup,"Brief 1 min",BriefingReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Briefing,60) +MENU_GROUP_COMMAND:New(PlayerGroup,"Brief 2 min",BriefingReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Briefing,120) +MENU_GROUP_COMMAND:New(PlayerGroup,"Brief 3 min",BriefingReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Briefing,180) +local OverviewReportsMenu=MENU_GROUP:New(PlayerGroup,"Overview Reports",MessagesMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"Overview 15 sec",OverviewReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Overview,15) +MENU_GROUP_COMMAND:New(PlayerGroup,"Overview 30 sec",OverviewReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Overview,30) +MENU_GROUP_COMMAND:New(PlayerGroup,"Overview 1 min",OverviewReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Overview,60) +MENU_GROUP_COMMAND:New(PlayerGroup,"Overview 2 min",OverviewReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Overview,120) +MENU_GROUP_COMMAND:New(PlayerGroup,"Overview 3 min",OverviewReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.Overview,180) +local DetailedReportsMenu=MENU_GROUP:New(PlayerGroup,"Detailed Reports",MessagesMenu) +MENU_GROUP_COMMAND:New(PlayerGroup,"Detailed 15 sec",DetailedReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.DetailedReportsMenu,15) +MENU_GROUP_COMMAND:New(PlayerGroup,"Detailed 30 sec",DetailedReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.DetailedReportsMenu,30) +MENU_GROUP_COMMAND:New(PlayerGroup,"Detailed 1 min",DetailedReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.DetailedReportsMenu,60) +MENU_GROUP_COMMAND:New(PlayerGroup,"Detailed 2 min",DetailedReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.DetailedReportsMenu,120) +MENU_GROUP_COMMAND:New(PlayerGroup,"Detailed 3 min",DetailedReportsMenu,self.MenuGroupMessageTimingsSystem,self,PlayerUnit,PlayerGroup,PlayerName,MESSAGE.Type.DetailedReportsMenu,180) +end +return self +end +function SETTINGS:RemovePlayerMenu(PlayerUnit) +if self.PlayerMenu then +self.PlayerMenu:Remove() +self.PlayerMenu=nil +end +return self +end +function SETTINGS:A2GMenuSystem(MenuGroup,RootMenu,A2GSystem) +self.A2GSystem=A2GSystem +MESSAGE:New(string.format("Settings: Default A2G coordinate system set to %s for all players!",A2GSystem),5):ToAll() +self:SetSystemMenu(MenuGroup,RootMenu) +end +function SETTINGS:A2AMenuSystem(MenuGroup,RootMenu,A2ASystem) +self.A2ASystem=A2ASystem +MESSAGE:New(string.format("Settings: Default A2A coordinate system set to %s for all players!",A2ASystem),5):ToAll() +self:SetSystemMenu(MenuGroup,RootMenu) +end +function SETTINGS:MenuLL_DDM_Accuracy(MenuGroup,RootMenu,LL_Accuracy) +self.LL_Accuracy=LL_Accuracy +MESSAGE:New(string.format("Settings: Default LL accuracy set to %s for all players!",LL_Accuracy),5):ToAll() +self:SetSystemMenu(MenuGroup,RootMenu) +end +function SETTINGS:MenuMGRS_Accuracy(MenuGroup,RootMenu,MGRS_Accuracy) +self.MGRS_Accuracy=MGRS_Accuracy +MESSAGE:New(string.format("Settings: Default MGRS accuracy set to %s for all players!",MGRS_Accuracy),5):ToAll() +self:SetSystemMenu(MenuGroup,RootMenu) +end +function SETTINGS:MenuMWSystem(MenuGroup,RootMenu,MW) +self.Metric=MW +MESSAGE:New(string.format("Settings: Default measurement format set to %s for all players!",MW and"Metric"or"Imperial"),5):ToAll() +self:SetSystemMenu(MenuGroup,RootMenu) +end +function SETTINGS:MenuMessageTimingsSystem(MenuGroup,RootMenu,MessageType,MessageTime) +self:SetMessageTime(MessageType,MessageTime) +MESSAGE:New(string.format("Settings: Default message time set for %s to %d.",MessageType,MessageTime),5):ToAll() +end +do +function SETTINGS:MenuGroupA2GSystem(PlayerUnit,PlayerGroup,PlayerName,A2GSystem) +self.A2GSystem=A2GSystem +MESSAGE:New(string.format("Settings: A2G format set to %s for player %s.",A2GSystem,PlayerName),5):ToGroup(PlayerGroup) +if _SETTINGS.MenuStatic==false then +self:RemovePlayerMenu(PlayerUnit) +self:SetPlayerMenu(PlayerUnit) +end +end +function SETTINGS:MenuGroupA2ASystem(PlayerUnit,PlayerGroup,PlayerName,A2ASystem) +self.A2ASystem=A2ASystem +MESSAGE:New(string.format("Settings: A2A format set to %s for player %s.",A2ASystem,PlayerName),5):ToGroup(PlayerGroup) +if _SETTINGS.MenuStatic==false then +self:RemovePlayerMenu(PlayerUnit) +self:SetPlayerMenu(PlayerUnit) +end +end +function SETTINGS:MenuGroupLL_DDM_AccuracySystem(PlayerUnit,PlayerGroup,PlayerName,LL_Accuracy) +self.LL_Accuracy=LL_Accuracy +MESSAGE:New(string.format("Settings: LL format accuracy set to %d decimal places for player %s.",LL_Accuracy,PlayerName),5):ToGroup(PlayerGroup) +if _SETTINGS.MenuStatic==false then +self:RemovePlayerMenu(PlayerUnit) +self:SetPlayerMenu(PlayerUnit) +end +end +function SETTINGS:MenuGroupMGRS_AccuracySystem(PlayerUnit,PlayerGroup,PlayerName,MGRS_Accuracy) +self.MGRS_Accuracy=MGRS_Accuracy +MESSAGE:New(string.format("Settings: MGRS format accuracy set to %d for player %s.",MGRS_Accuracy,PlayerName),5):ToGroup(PlayerGroup) +if _SETTINGS.MenuStatic==false then +self:RemovePlayerMenu(PlayerUnit) +self:SetPlayerMenu(PlayerUnit) +end +end +function SETTINGS:MenuGroupMWSystem(PlayerUnit,PlayerGroup,PlayerName,MW) +self.Metric=MW +MESSAGE:New(string.format("Settings: Measurement format set to %s for player %s.",MW and"Metric"or"Imperial",PlayerName),5):ToGroup(PlayerGroup) +if _SETTINGS.MenuStatic==false then +self:RemovePlayerMenu(PlayerUnit) +self:SetPlayerMenu(PlayerUnit) +end +end +function SETTINGS:MenuGroupMessageTimingsSystem(PlayerUnit,PlayerGroup,PlayerName,MessageType,MessageTime) +self:SetMessageTime(MessageType,MessageTime) +MESSAGE:New(string.format("Settings: Default message time set for %s to %d.",MessageType,MessageTime),5):ToGroup(PlayerGroup) +end +end +function SETTINGS:SetEraWWII() +self.Era=SETTINGS.__Enum.Era.WWII +end +function SETTINGS:SetEraKorea() +self.Era=SETTINGS.__Enum.Era.Korea +end +function SETTINGS:SetEraCold() +self.Era=SETTINGS.__Enum.Era.Cold +end +function SETTINGS:SetEraModern() +self.Era=SETTINGS.__Enum.Era.Modern +end +end +MENU_INDEX={} +MENU_INDEX.MenuMission={} +MENU_INDEX.MenuMission.Menus={} +MENU_INDEX.Coalition={} +MENU_INDEX.Coalition[coalition.side.BLUE]={} +MENU_INDEX.Coalition[coalition.side.BLUE].Menus={} +MENU_INDEX.Coalition[coalition.side.RED]={} +MENU_INDEX.Coalition[coalition.side.RED].Menus={} +MENU_INDEX.Group={} +function MENU_INDEX:ParentPath(ParentMenu,MenuText) +local Path=ParentMenu and"@"..table.concat(ParentMenu.MenuPath or{},"@")or"" +if ParentMenu then +if ParentMenu:IsInstanceOf("MENU_GROUP")or ParentMenu:IsInstanceOf("MENU_GROUP_COMMAND")then +local GroupName=ParentMenu.Group:GetName() +if not self.Group[GroupName].Menus[Path]then +BASE:E({Path=Path,GroupName=GroupName}) +error("Parent path not found in menu index for group menu") +return nil +end +elseif ParentMenu:IsInstanceOf("MENU_COALITION")or ParentMenu:IsInstanceOf("MENU_COALITION_COMMAND")then +local Coalition=ParentMenu.Coalition +if not self.Coalition[Coalition].Menus[Path]then +BASE:E({Path=Path,Coalition=Coalition}) +error("Parent path not found in menu index for coalition menu") +return nil +end +elseif ParentMenu:IsInstanceOf("MENU_MISSION")or ParentMenu:IsInstanceOf("MENU_MISSION_COMMAND")then +if not self.MenuMission.Menus[Path]then +BASE:E({Path=Path}) +error("Parent path not found in menu index for mission menu") +return nil +end +end +end +Path=Path.."@"..MenuText +return Path +end +function MENU_INDEX:PrepareMission() +self.MenuMission.Menus=self.MenuMission.Menus or{} +end +function MENU_INDEX:PrepareCoalition(CoalitionSide) +self.Coalition[CoalitionSide]=self.Coalition[CoalitionSide]or{} +self.Coalition[CoalitionSide].Menus=self.Coalition[CoalitionSide].Menus or{} +end +function MENU_INDEX:PrepareGroup(Group) +if Group and Group:IsAlive()~=nil then +local GroupName=Group:GetName() +self.Group[GroupName]=self.Group[GroupName]or{} +self.Group[GroupName].Menus=self.Group[GroupName].Menus or{} +end +end +function MENU_INDEX:HasMissionMenu(Path) +return self.MenuMission.Menus[Path] +end +function MENU_INDEX:SetMissionMenu(Path,Menu) +self.MenuMission.Menus[Path]=Menu +end +function MENU_INDEX:ClearMissionMenu(Path) +self.MenuMission.Menus[Path]=nil +end +function MENU_INDEX:HasCoalitionMenu(Coalition,Path) +return self.Coalition[Coalition].Menus[Path] +end +function MENU_INDEX:SetCoalitionMenu(Coalition,Path,Menu) +self.Coalition[Coalition].Menus[Path]=Menu +end +function MENU_INDEX:ClearCoalitionMenu(Coalition,Path) +self.Coalition[Coalition].Menus[Path]=nil +end +function MENU_INDEX:HasGroupMenu(Group,Path) +if Group and Group:IsAlive()then +local MenuGroupName=Group:GetName() +if self.Group[MenuGroupName]and self.Group[MenuGroupName].Menus and self.Group[MenuGroupName].Menus[Path]then +return self.Group[MenuGroupName].Menus[Path] +end +end +return nil +end +function MENU_INDEX:SetGroupMenu(Group,Path,Menu) +local MenuGroupName=Group:GetName() +self.Group[MenuGroupName].Menus[Path]=Menu +end +function MENU_INDEX:ClearGroupMenu(Group,Path) +local MenuGroupName=Group:GetName() +self.Group[MenuGroupName].Menus[Path]=nil +end +function MENU_INDEX:Refresh(Group) +for MenuID,Menu in pairs(self.MenuMission.Menus)do +Menu:Refresh() +end +for MenuID,Menu in pairs(self.Coalition[coalition.side.BLUE].Menus)do +Menu:Refresh() +end +for MenuID,Menu in pairs(self.Coalition[coalition.side.RED].Menus)do +Menu:Refresh() +end +local GroupName=Group:GetName() +for MenuID,Menu in pairs(self.Group[GroupName].Menus)do +Menu:Refresh() +end +return self +end +do +MENU_BASE={ +ClassName="MENU_BASE", +MenuPath=nil, +MenuText="", +MenuParentPath=nil, +} +function MENU_BASE:New(MenuText,ParentMenu) +local MenuParentPath={} +if ParentMenu~=nil then +MenuParentPath=ParentMenu.MenuPath +end +local self=BASE:Inherit(self,BASE:New()) +self.MenuPath=nil +self.MenuText=MenuText +self.ParentMenu=ParentMenu +self.MenuParentPath=MenuParentPath +self.Path=(self.ParentMenu and"@"..table.concat(self.MenuParentPath or{},"@")or"").."@"..self.MenuText +self.Menus={} +self.MenuCount=0 +self.MenuStamp=timer.getTime() +self.MenuRemoveParent=false +if self.ParentMenu then +self.ParentMenu.Menus=self.ParentMenu.Menus or{} +self.ParentMenu.Menus[MenuText]=self +end +return self +end +function MENU_BASE:SetParentMenu(MenuText,Menu) +if self.ParentMenu then +self.ParentMenu.Menus=self.ParentMenu.Menus or{} +self.ParentMenu.Menus[MenuText]=Menu +self.ParentMenu.MenuCount=self.ParentMenu.MenuCount+1 +end +end +function MENU_BASE:ClearParentMenu(MenuText) +if self.ParentMenu and self.ParentMenu.Menus[MenuText]then +self.ParentMenu.Menus[MenuText]=nil +self.ParentMenu.MenuCount=self.ParentMenu.MenuCount-1 +if self.ParentMenu.MenuCount==0 then +end +end +end +function MENU_BASE:SetRemoveParent(RemoveParent) +self.MenuRemoveParent=RemoveParent +return self +end +function MENU_BASE:GetMenu(MenuText) +return self.Menus[MenuText] +end +function MENU_BASE:SetStamp(MenuStamp) +self.MenuStamp=MenuStamp +return self +end +function MENU_BASE:GetStamp() +return timer.getTime() +end +function MENU_BASE:SetTime(MenuStamp) +self.MenuStamp=MenuStamp +return self +end +function MENU_BASE:SetTag(MenuTag) +self.MenuTag=MenuTag +return self +end +end +do +MENU_COMMAND_BASE={ +ClassName="MENU_COMMAND_BASE", +CommandMenuFunction=nil, +CommandMenuArgument=nil, +MenuCallHandler=nil, +} +function MENU_COMMAND_BASE:New(MenuText,ParentMenu,CommandMenuFunction,CommandMenuArguments) +local self=BASE:Inherit(self,MENU_BASE:New(MenuText,ParentMenu)) +local ErrorHandler=function(errmsg) +env.info("MOOSE error in MENU COMMAND function: "..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +self:SetCommandMenuFunction(CommandMenuFunction) +self:SetCommandMenuArguments(CommandMenuArguments) +self.MenuCallHandler=function() +local function MenuFunction() +return self.CommandMenuFunction(unpack(self.CommandMenuArguments)) +end +local Status,Result=xpcall(MenuFunction,ErrorHandler) +end +return self +end +function MENU_COMMAND_BASE:SetCommandMenuFunction(CommandMenuFunction) +self.CommandMenuFunction=CommandMenuFunction +return self +end +function MENU_COMMAND_BASE:SetCommandMenuArguments(CommandMenuArguments) +self.CommandMenuArguments=CommandMenuArguments +return self +end +end +do +MENU_MISSION={ +ClassName="MENU_MISSION", +} +function MENU_MISSION:New(MenuText,ParentMenu) +MENU_INDEX:PrepareMission() +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local MissionMenu=MENU_INDEX:HasMissionMenu(Path) +if MissionMenu then +return MissionMenu +else +local self=BASE:Inherit(self,MENU_BASE:New(MenuText,ParentMenu)) +MENU_INDEX:SetMissionMenu(Path,self) +self.MenuPath=missionCommands.addSubMenu(self.MenuText,self.MenuParentPath) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_MISSION:Refresh() +do +missionCommands.removeItem(self.MenuPath) +self.MenuPath=missionCommands.addSubMenu(self.MenuText,self.MenuParentPath) +end +return self +end +function MENU_MISSION:RemoveSubMenus() +for MenuID,Menu in pairs(self.Menus or{})do +Menu:Remove() +end +self.Menus=nil +end +function MENU_MISSION:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareMission() +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local MissionMenu=MENU_INDEX:HasMissionMenu(Path) +if MissionMenu==self then +self:RemoveSubMenus() +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +self:F({Text=self.MenuText,Path=self.MenuPath}) +if self.MenuPath~=nil then +missionCommands.removeItem(self.MenuPath) +end +MENU_INDEX:ClearMissionMenu(self.Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_MISSION",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText}) +end +return self +end +end +do +MENU_MISSION_COMMAND={ +ClassName="MENU_MISSION_COMMAND", +} +function MENU_MISSION_COMMAND:New(MenuText,ParentMenu,CommandMenuFunction,...) +MENU_INDEX:PrepareMission() +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local MissionMenu=MENU_INDEX:HasMissionMenu(Path) +if MissionMenu then +MissionMenu:SetCommandMenuFunction(CommandMenuFunction) +MissionMenu:SetCommandMenuArguments(arg) +return MissionMenu +else +local self=BASE:Inherit(self,MENU_COMMAND_BASE:New(MenuText,ParentMenu,CommandMenuFunction,arg)) +MENU_INDEX:SetMissionMenu(Path,self) +self.MenuPath=missionCommands.addCommand(MenuText,self.MenuParentPath,self.MenuCallHandler) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_MISSION_COMMAND:Refresh() +do +missionCommands.removeItem(self.MenuPath) +missionCommands.addCommand(self.MenuText,self.MenuParentPath,self.MenuCallHandler) +end +return self +end +function MENU_MISSION_COMMAND:Remove() +MENU_INDEX:PrepareMission() +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local MissionMenu=MENU_INDEX:HasMissionMenu(Path) +if MissionMenu==self then +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +self:F({Text=self.MenuText,Path=self.MenuPath}) +if self.MenuPath~=nil then +missionCommands.removeItem(self.MenuPath) +end +MENU_INDEX:ClearMissionMenu(self.Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_MISSION_COMMAND",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText}) +end +return self +end +end +do +MENU_COALITION={ +ClassName="MENU_COALITION" +} +function MENU_COALITION:New(Coalition,MenuText,ParentMenu) +MENU_INDEX:PrepareCoalition(Coalition) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local CoalitionMenu=MENU_INDEX:HasCoalitionMenu(Coalition,Path) +if CoalitionMenu then +return CoalitionMenu +else +local self=BASE:Inherit(self,MENU_BASE:New(MenuText,ParentMenu)) +MENU_INDEX:SetCoalitionMenu(Coalition,Path,self) +self.Coalition=Coalition +self.MenuPath=missionCommands.addSubMenuForCoalition(Coalition,MenuText,self.MenuParentPath) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_COALITION:Refresh() +do +missionCommands.removeItemForCoalition(self.Coalition,self.MenuPath) +missionCommands.addSubMenuForCoalition(self.Coalition,self.MenuText,self.MenuParentPath) +end +return self +end +function MENU_COALITION:RemoveSubMenus() +for MenuID,Menu in pairs(self.Menus or{})do +Menu:Remove() +end +self.Menus=nil +end +function MENU_COALITION:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareCoalition(self.Coalition) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local CoalitionMenu=MENU_INDEX:HasCoalitionMenu(self.Coalition,Path) +if CoalitionMenu==self then +self:RemoveSubMenus() +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +self:F({Coalition=self.Coalition,Text=self.MenuText,Path=self.MenuPath}) +if self.MenuPath~=nil then +missionCommands.removeItemForCoalition(self.Coalition,self.MenuPath) +end +MENU_INDEX:ClearCoalitionMenu(self.Coalition,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_COALITION",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Coalition=self.Coalition}) +end +return self +end +end +do +MENU_COALITION_COMMAND={ +ClassName="MENU_COALITION_COMMAND" +} +function MENU_COALITION_COMMAND:New(Coalition,MenuText,ParentMenu,CommandMenuFunction,...) +MENU_INDEX:PrepareCoalition(Coalition) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local CoalitionMenu=MENU_INDEX:HasCoalitionMenu(Coalition,Path) +if CoalitionMenu then +CoalitionMenu:SetCommandMenuFunction(CommandMenuFunction) +CoalitionMenu:SetCommandMenuArguments(arg) +return CoalitionMenu +else +local self=BASE:Inherit(self,MENU_COMMAND_BASE:New(MenuText,ParentMenu,CommandMenuFunction,arg)) +MENU_INDEX:SetCoalitionMenu(Coalition,Path,self) +self.Coalition=Coalition +self.MenuPath=missionCommands.addCommandForCoalition(self.Coalition,MenuText,self.MenuParentPath,self.MenuCallHandler) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_COALITION_COMMAND:Refresh() +do +missionCommands.removeItemForCoalition(self.Coalition,self.MenuPath) +missionCommands.addCommandForCoalition(self.Coalition,self.MenuText,self.MenuParentPath,self.MenuCallHandler) +end +return self +end +function MENU_COALITION_COMMAND:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareCoalition(self.Coalition) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local CoalitionMenu=MENU_INDEX:HasCoalitionMenu(self.Coalition,Path) +if CoalitionMenu==self then +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +self:F({Coalition=self.Coalition,Text=self.MenuText,Path=self.MenuPath}) +if self.MenuPath~=nil then +missionCommands.removeItemForCoalition(self.Coalition,self.MenuPath) +end +MENU_INDEX:ClearCoalitionMenu(self.Coalition,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_COALITION_COMMAND",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Coalition=self.Coalition}) +end +return self +end +end +do +local _MENUGROUPS={} +MENU_GROUP={ +ClassName="MENU_GROUP" +} +function MENU_GROUP:New(Group,MenuText,ParentMenu) +MENU_INDEX:PrepareGroup(Group) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(Group,Path) +if GroupMenu then +return GroupMenu +else +self=BASE:Inherit(self,MENU_BASE:New(MenuText,ParentMenu)) +MENU_INDEX:SetGroupMenu(Group,Path,self) +self.Group=Group +self.GroupID=Group:GetID() +self.MenuPath=missionCommands.addSubMenuForGroup(self.GroupID,MenuText,self.MenuParentPath) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_GROUP:Refresh() +do +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +missionCommands.addSubMenuForGroup(self.GroupID,self.MenuText,self.MenuParentPath) +for MenuText,Menu in pairs(self.Menus or{})do +Menu:Refresh() +end +end +return self +end +function MENU_GROUP:RefreshAndOrderByTag() +do +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +missionCommands.addSubMenuForGroup(self.GroupID,self.MenuText,self.MenuParentPath) +local MenuTable={} +for MenuText,Menu in pairs(self.Menus or{})do +local tag=Menu.MenuTag or math.random(1,10000) +MenuTable[#MenuTable+1]={Tag=tag,Enty=Menu} +end +table.sort(MenuTable,function(k1,k2)return k1.tag<k2.tag end) +for _,Menu in pairs(MenuTable)do +Menu.Entry:Refresh() +end +end +return self +end +function MENU_GROUP:RemoveSubMenus(MenuStamp,MenuTag) +for MenuText,Menu in pairs(self.Menus or{})do +Menu:Remove(MenuStamp,MenuTag) +end +self.Menus=nil +end +function MENU_GROUP:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareGroup(self.Group) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(self.Group,Path) +if GroupMenu==self then +self:RemoveSubMenus(MenuStamp,MenuTag) +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +if self.MenuPath~=nil then +self:F({Group=self.GroupID,Text=self.MenuText,Path=self.MenuPath}) +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +end +MENU_INDEX:ClearGroupMenu(self.Group,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_GROUP",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Group=self.Group}) +return nil +end +return self +end +MENU_GROUP_COMMAND={ +ClassName="MENU_GROUP_COMMAND" +} +function MENU_GROUP_COMMAND:New(Group,MenuText,ParentMenu,CommandMenuFunction,...) +MENU_INDEX:PrepareGroup(Group) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(Group,Path) +if GroupMenu then +GroupMenu:SetCommandMenuFunction(CommandMenuFunction) +GroupMenu:SetCommandMenuArguments(arg) +return GroupMenu +else +self=BASE:Inherit(self,MENU_COMMAND_BASE:New(MenuText,ParentMenu,CommandMenuFunction,arg)) +MENU_INDEX:SetGroupMenu(Group,Path,self) +self.Group=Group +self.GroupID=Group:GetID() +self.MenuPath=missionCommands.addCommandForGroup(self.GroupID,MenuText,self.MenuParentPath,self.MenuCallHandler) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_GROUP_COMMAND:Refresh() +do +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +missionCommands.addCommandForGroup(self.GroupID,self.MenuText,self.MenuParentPath,self.MenuCallHandler) +end +return self +end +function MENU_GROUP_COMMAND:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareGroup(self.Group) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(self.Group,Path) +if GroupMenu==self then +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +if self.MenuPath~=nil then +self:F({Group=self.GroupID,Text=self.MenuText,Path=self.MenuPath}) +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +end +MENU_INDEX:ClearGroupMenu(self.Group,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_GROUP_COMMAND",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Group=self.Group}) +end +return self +end +end +do +MENU_GROUP_DELAYED={ +ClassName="MENU_GROUP_DELAYED" +} +function MENU_GROUP_DELAYED:New(Group,MenuText,ParentMenu) +MENU_INDEX:PrepareGroup(Group) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(Group,Path) +if GroupMenu then +return GroupMenu +else +self=BASE:Inherit(self,MENU_BASE:New(MenuText,ParentMenu)) +MENU_INDEX:SetGroupMenu(Group,Path,self) +self.Group=Group +self.GroupID=Group:GetID() +if self.MenuParentPath then +self.MenuPath=UTILS.DeepCopy(self.MenuParentPath) +else +self.MenuPath={} +end +table.insert(self.MenuPath,self.MenuText) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_GROUP_DELAYED:Set() +if not self.GroupID then return end +do +if not self.MenuSet then +missionCommands.addSubMenuForGroup(self.GroupID,self.MenuText,self.MenuParentPath) +self.MenuSet=true +end +for MenuText,Menu in pairs(self.Menus or{})do +Menu:Set() +end +end +end +function MENU_GROUP_DELAYED:Refresh() +do +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +missionCommands.addSubMenuForGroup(self.GroupID,self.MenuText,self.MenuParentPath) +for MenuText,Menu in pairs(self.Menus or{})do +Menu:Refresh() +end +end +return self +end +function MENU_GROUP_DELAYED:RemoveSubMenus(MenuStamp,MenuTag) +for MenuText,Menu in pairs(self.Menus or{})do +Menu:Remove(MenuStamp,MenuTag) +end +self.Menus=nil +end +function MENU_GROUP_DELAYED:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareGroup(self.Group) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(self.Group,Path) +if GroupMenu==self then +self:RemoveSubMenus(MenuStamp,MenuTag) +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +if self.MenuPath~=nil then +self:F({Group=self.GroupID,Text=self.MenuText,Path=self.MenuPath}) +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +end +MENU_INDEX:ClearGroupMenu(self.Group,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_GROUP_DELAYED",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Group=self.Group}) +return nil +end +return self +end +MENU_GROUP_COMMAND_DELAYED={ +ClassName="MENU_GROUP_COMMAND_DELAYED" +} +function MENU_GROUP_COMMAND_DELAYED:New(Group,MenuText,ParentMenu,CommandMenuFunction,...) +MENU_INDEX:PrepareGroup(Group) +local Path=MENU_INDEX:ParentPath(ParentMenu,MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(Group,Path) +if GroupMenu then +GroupMenu:SetCommandMenuFunction(CommandMenuFunction) +GroupMenu:SetCommandMenuArguments(arg) +return GroupMenu +else +self=BASE:Inherit(self,MENU_COMMAND_BASE:New(MenuText,ParentMenu,CommandMenuFunction,arg)) +MENU_INDEX:SetGroupMenu(Group,Path,self) +self.Group=Group +self.GroupID=Group:GetID() +if self.MenuParentPath then +self.MenuPath=UTILS.DeepCopy(self.MenuParentPath) +else +self.MenuPath={} +end +table.insert(self.MenuPath,self.MenuText) +self:SetParentMenu(self.MenuText,self) +return self +end +end +function MENU_GROUP_COMMAND_DELAYED:Set() +do +if not self.MenuSet then +self.MenuPath=missionCommands.addCommandForGroup(self.GroupID,self.MenuText,self.MenuParentPath,self.MenuCallHandler) +self.MenuSet=true +end +end +end +function MENU_GROUP_COMMAND_DELAYED:Refresh() +do +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +missionCommands.addCommandForGroup(self.GroupID,self.MenuText,self.MenuParentPath,self.MenuCallHandler) +end +return self +end +function MENU_GROUP_COMMAND_DELAYED:Remove(MenuStamp,MenuTag) +MENU_INDEX:PrepareGroup(self.Group) +local Path=MENU_INDEX:ParentPath(self.ParentMenu,self.MenuText) +local GroupMenu=MENU_INDEX:HasGroupMenu(self.Group,Path) +if GroupMenu==self then +if not MenuStamp or self.MenuStamp~=MenuStamp then +if(not MenuTag)or(MenuTag and self.MenuTag and MenuTag==self.MenuTag)then +if self.MenuPath~=nil then +self:F({Group=self.GroupID,Text=self.MenuText,Path=self.MenuPath}) +missionCommands.removeItemForGroup(self.GroupID,self.MenuPath) +end +MENU_INDEX:ClearGroupMenu(self.Group,Path) +self:ClearParentMenu(self.MenuText) +return nil +end +end +else +BASE:E({"Cannot Remove MENU_GROUP_COMMAND_DELAYED",Path=Path,ParentMenu=self.ParentMenu,MenuText=self.MenuText,Group=self.Group}) +end +return self +end +end +ZONE_BASE={ +ClassName="ZONE_BASE", +ZoneName="", +ZoneProbability=1, +DrawID=nil, +Color={}, +ZoneID=nil, +Properties={}, +Surface=nil, +Checktime=5, +} +function ZONE_BASE:New(ZoneName) +local self=BASE:Inherit(self,FSM:New()) +self.ZoneName=ZoneName +return self +end +function ZONE_BASE:GetName() +return self.ZoneName +end +function ZONE_BASE:SetName(ZoneName) +self.ZoneName=ZoneName +end +function ZONE_BASE:IsVec2InZone(Vec2) +return false +end +function ZONE_BASE:IsVec3InZone(Vec3) +if not Vec3 then return false end +local InZone=self:IsVec2InZone({x=Vec3.x,y=Vec3.z}) +return InZone +end +function ZONE_BASE:IsCoordinateInZone(Coordinate) +if not Coordinate then return false end +local InZone=self:IsVec2InZone(Coordinate:GetVec2()) +return InZone +end +function ZONE_BASE:IsPointVec2InZone(Coordinate) +local InZone=self:IsVec2InZone(Coordinate:GetVec2()) +return InZone +end +function ZONE_BASE:IsPointVec3InZone(PointVec3) +local InZone=self:IsPointVec2InZone(PointVec3) +return InZone +end +function ZONE_BASE:GetVec2() +return nil +end +function ZONE_BASE:GetPointVec2() +local Vec2=self:GetVec2() +local PointVec2=COORDINATE:NewFromVec2(Vec2) +return PointVec2 +end +function ZONE_BASE:GetVec3(Height) +Height=Height or 0 +local Vec2=self:GetVec2() +local Vec3={x=Vec2.x,y=Height and Height or land.getHeight(self:GetVec2()),z=Vec2.y} +return Vec3 +end +function ZONE_BASE:GetPointVec3(Height) +local Vec3=self:GetVec3(Height) +local PointVec3=COORDINATE:NewFromVec3(Vec3) +return PointVec3 +end +function ZONE_BASE:GetCoordinate(Height) +local Vec3=self:GetVec3(Height) +if self.Coordinate then +self.Coordinate.x=Vec3.x +self.Coordinate.y=Vec3.y +self.Coordinate.z=Vec3.z +else +self.Coordinate=COORDINATE:NewFromVec3(Vec3) +end +return self.Coordinate +end +function ZONE_BASE:Get2DDistance(Coordinate) +local a=self:GetVec2() +local b={} +if Coordinate.z then +b.x=Coordinate.x +b.y=Coordinate.z +else +b.x=Coordinate.x +b.y=Coordinate.y +end +local dist=UTILS.VecDist2D(a,b) +return dist +end +function ZONE_BASE:GetRandomVec2() +return nil +end +function ZONE_BASE:GetRandomPointVec2() +return nil +end +function ZONE_BASE:GetRandomPointVec3() +return nil +end +function ZONE_BASE:GetBoundingSquare() +return nil +end +function ZONE_BASE:GetSurfaceType() +local coord=self:GetCoordinate() +local surface=coord:GetSurfaceType() +return surface +end +function ZONE_BASE:BoundZone() +end +function ZONE_BASE:SetDrawCoalition(Coalition) +self.drawCoalition=Coalition or-1 +return self +end +function ZONE_BASE:GetDrawCoalition() +return self.drawCoalition or-1 +end +function ZONE_BASE:SetColor(RGBcolor,Alpha) +RGBcolor=RGBcolor or{1,0,0} +Alpha=Alpha or 0.15 +self.Color={} +self.Color[1]=RGBcolor[1] +self.Color[2]=RGBcolor[2] +self.Color[3]=RGBcolor[3] +self.Color[4]=Alpha +return self +end +function ZONE_BASE:GetColor() +return self.Color or{1,0,0,0.15} +end +function ZONE_BASE:GetColorRGB() +local rgb={} +local Color=self:GetColor() +rgb[1]=Color[1] +rgb[2]=Color[2] +rgb[3]=Color[3] +return rgb +end +function ZONE_BASE:GetColorAlpha() +local Color=self:GetColor() +local alpha=Color[4] +return alpha +end +function ZONE_BASE:SetFillColor(RGBcolor,Alpha) +RGBcolor=RGBcolor or{1,0,0} +Alpha=Alpha or 0.15 +self.FillColor={} +self.FillColor[1]=RGBcolor[1] +self.FillColor[2]=RGBcolor[2] +self.FillColor[3]=RGBcolor[3] +self.FillColor[4]=Alpha +return self +end +function ZONE_BASE:GetFillColor() +return self.FillColor or{1,0,0,0.15} +end +function ZONE_BASE:GetFillColorRGB() +local rgb={} +local FillColor=self:GetFillColor() +rgb[1]=FillColor[1] +rgb[2]=FillColor[2] +rgb[3]=FillColor[3] +return rgb +end +function ZONE_BASE:GetFillColorAlpha() +local FillColor=self:GetFillColor() +local alpha=FillColor[4] +return alpha +end +function ZONE_BASE:UndrawZone(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,ZONE_BASE.UndrawZone,self) +else +if self.DrawID then +if type(self.DrawID)~="table"then +UTILS.RemoveMark(self.DrawID) +else +for _,mark_id in pairs(self.DrawID)do +UTILS.RemoveMark(mark_id) +end +end +end +end +return self +end +function ZONE_BASE:GetDrawID() +return self.DrawID +end +function ZONE_BASE:SmokeZone(SmokeColor) +end +function ZONE_BASE:SetZoneProbability(ZoneProbability) +self.ZoneProbability=ZoneProbability or 1 +return self +end +function ZONE_BASE:GetZoneProbability() +return self.ZoneProbability +end +function ZONE_BASE:FindNearestCoordinateOnRadius(Outsidecoordinate) +local Vec1=self:GetVec2() +local Radius=self:GetRadius() +local Vec2=Outsidecoordinate:GetVec2() +local Point=UTILS.FindNearestPointOnCircle(Vec1,Radius,Vec2) +local rc=COORDINATE:NewFromVec2(Point) +return rc +end +function ZONE_BASE:GetZoneMaybe() +local Randomization=math.random() +if Randomization<=self.ZoneProbability then +return self +else +return nil +end +end +function ZONE_BASE:SetCheckTime(seconds) +self.Checktime=seconds or 5 +return self +end +function ZONE_BASE:Trigger(Objects) +self:SetStartState("TriggerStopped") +self:AddTransition("TriggerStopped","TriggerStart","TriggerRunning") +self:AddTransition("*","EnteredZone","*") +self:AddTransition("*","LeftZone","*") +self:AddTransition("*","ZoneEmpty","*") +self:AddTransition("*","ObjectDead","*") +self:AddTransition("*","TriggerRunCheck","*") +self:AddTransition("*","TriggerStop","TriggerStopped") +self:TriggerStart() +self.checkobjects=Objects +self.ObjectsInZone=false +if UTILS.IsInstanceOf(Objects,"SET_BASE")then +self.objectset=Objects.Set +else +self.objectset={Objects} +end +self:_TriggerCheck(true) +self:__TriggerRunCheck(self.Checktime) +return self +end +function ZONE_BASE:SetPartlyInside(state) +self.PartlyInside=state or not(state==false) +return self +end +function ZONE_BASE:_TriggerCheck(fromstart) +local objectset=self.objectset or{} +if fromstart then +for _,_object in pairs(objectset)do +local obj=_object +if not obj.TriggerInZone then +obj.TriggerInZone={} +obj.TriggerZoneDeadNotification=false +end +if obj and obj:IsAlive()and self:IsCoordinateInZone(obj:GetCoordinate())then +obj.TriggerInZone[self.ZoneName]=true +self.ObjectsInZone=true +else +obj.TriggerInZone[self.ZoneName]=false +end +end +else +local objcount=0 +for _,_object in pairs(objectset)do +local obj=_object +if obj and obj:IsAlive()then +if not obj.TriggerInZone then +obj.TriggerInZone={} +end +if not obj.TriggerInZone[self.ZoneName]then +obj.TriggerInZone[self.ZoneName]=false +end +local inzone +if self.PartlyInside and obj.ClassName=="GROUP"then +inzone=obj:IsAnyInZone(self) +else +inzone=self:IsCoordinateInZone(obj:GetCoordinate()) +end +if inzone and obj.TriggerInZone[self.ZoneName]then +objcount=objcount+1 +self.ObjectsInZone=true +obj.TriggerZoneDeadNotification=false +end +if inzone and not obj.TriggerInZone[self.ZoneName]then +self:__EnteredZone(0.5,obj) +obj.TriggerInZone[self.ZoneName]=true +objcount=objcount+1 +self.ObjectsInZone=true +obj.TriggerZoneDeadNotification=false +elseif(not inzone)and obj.TriggerInZone[self.ZoneName]then +self:__LeftZone(0.5,obj) +obj.TriggerInZone[self.ZoneName]=false +else +end +else +if not obj.TriggerZoneDeadNotification==true then +obj.TriggerInZone=nil +self:__ObjectDead(0.5,obj) +obj.TriggerZoneDeadNotification=true +end +end +end +if objcount==0 and self.ObjectsInZone==true then +self.ObjectsInZone=false +self:__ZoneEmpty(0.5) +end +end +return self +end +function ZONE_BASE:onafterTriggerRunCheck(From,Event,To) +if self:GetState()~="TriggerStopped"then +self:_TriggerCheck() +self:__TriggerRunCheck(self.Checktime) +end +return self +end +function ZONE_BASE:GetProperty(PropertyName) +return self.Properties[PropertyName] +end +function ZONE_BASE:GetAllProperties() +return self.Properties +end +ZONE_RADIUS={ +ClassName="ZONE_RADIUS", +} +function ZONE_RADIUS:New(ZoneName,Vec2,Radius,DoNotRegisterZone) +local self=BASE:Inherit(self,ZONE_BASE:New(ZoneName)) +self.Radius=Radius +self.Vec2=Vec2 +if not DoNotRegisterZone then +_EVENTDISPATCHER:CreateEventNewZone(self) +end +return self +end +function ZONE_RADIUS:UpdateFromVec2(Vec2,Radius) +self.Vec2=Vec2 +if Radius then +self.Radius=Radius +end +return self +end +function ZONE_RADIUS:UpdateFromVec3(Vec3,Radius) +self.Vec2.x=Vec3.x +self.Vec2.y=Vec3.z +if Radius then +self.Radius=Radius +end +return self +end +function ZONE_RADIUS:MarkZone(Points) +local Point={} +local Vec2=self:GetVec2() +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,(360/Points)do +local Radial=Angle*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +COORDINATE:NewFromVec2(Point):MarkToAll(self:GetName()) +end +end +function ZONE_RADIUS:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +local coordinate=self:GetCoordinate() +local Radius=self:GetRadius() +Color=Color or self:GetColorRGB() +Alpha=Alpha or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillAlpha=FillAlpha or self:GetColorAlpha() +self.DrawID=coordinate:CircleToAll(Radius,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +return self +end +function ZONE_RADIUS:BoundZone(Points,CountryID,UnBound) +local Point={} +local Vec2=self:GetVec2() +local countryID=CountryID or country.id.USA +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,(360/Points)do +local Radial=Angle*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +local CountryName=_DATABASE.COUNTRY_NAME[countryID] +local Tire={ +["country"]=CountryName, +["category"]="Fortifications", +["canCargo"]=false, +["shape_name"]="H-tyre_B_WF", +["type"]="Black_Tyre_WF", +["y"]=Point.y, +["x"]=Point.x, +["name"]=string.format("%s-Tire #%0d",self:GetName(),Angle), +["heading"]=0, +} +local Group=coalition.addStaticObject(countryID,Tire) +if UnBound and UnBound==true then +Group:destroy() +end +end +return self +end +function ZONE_RADIUS:SmokeZone(SmokeColor,Points,AddHeight,AngleOffset) +local Point={} +local Vec2=self:GetVec2() +AddHeight=AddHeight or 0 +AngleOffset=AngleOffset or 0 +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,360/Points do +local Radial=(Angle+AngleOffset)*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +COORDINATE:New(Point.x,AddHeight,Point.y):Smoke(SmokeColor) +end +return self +end +function ZONE_RADIUS:FlareZone(FlareColor,Points,Azimuth,AddHeight) +local Point={} +local Vec2=self:GetVec2() +AddHeight=AddHeight or 0 +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,360/Points do +local Radial=Angle*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +COORDINATE:New(Point.x,AddHeight,Point.y):Flare(FlareColor,Azimuth) +end +return self +end +function ZONE_RADIUS:GetRadius() +return self.Radius +end +function ZONE_RADIUS:SetRadius(Radius) +self.Radius=Radius +return self.Radius +end +function ZONE_RADIUS:GetVec2() +return self.Vec2 +end +function ZONE_RADIUS:SetVec2(Vec2) +self.Vec2=Vec2 +return self.Vec2 +end +function ZONE_RADIUS:GetVec3(Height) +Height=Height or 0 +local Vec2=self:GetVec2() +local Vec3={x=Vec2.x,y=land.getHeight(self:GetVec2())+Height,z=Vec2.y} +return Vec3 +end +function ZONE_RADIUS:Scan(ObjectCategories,UnitCategories) +self.ScanData={} +self.ScanData.Coalitions={} +self.ScanData.Scenery={} +self.ScanData.SceneryTable={} +self.ScanData.Units={} +local ZoneCoord=self:GetCoordinate() +local ZoneRadius=self:GetRadius() +local SphereSearch={ +id=world.VolumeType.SPHERE, +params={ +point=ZoneCoord:GetVec3(), +radius=ZoneRadius, +} +} +local function EvaluateZone(ZoneObject) +if ZoneObject and self:IsVec3InZone(ZoneObject:getPoint())then +local ObjectCategory=Object.getCategory(ZoneObject) +if(ObjectCategory==Object.Category.UNIT and ZoneObject:isExist()and ZoneObject:isActive())or(ObjectCategory==Object.Category.STATIC and ZoneObject:isExist())then +local Include=false +if not UnitCategories then +Include=true +else +local CategoryDCSUnit=ZoneObject:getDesc().category +for UnitCategoryID,UnitCategory in pairs(UnitCategories)do +if UnitCategory==CategoryDCSUnit then +Include=true +break +end +end +end +if Include then +local CoalitionDCSUnit=ZoneObject:getCoalition() +self.ScanData.Coalitions[CoalitionDCSUnit]=true +self.ScanData.Units[ZoneObject]=ZoneObject +end +end +if ObjectCategory==Object.Category.SCENERY then +local SceneryType=ZoneObject:getTypeName() +local SceneryName=ZoneObject:getName() +self.ScanData.Scenery[SceneryType]=self.ScanData.Scenery[SceneryType]or{} +self.ScanData.Scenery[SceneryType][SceneryName]=SCENERY:Register(tostring(SceneryName),ZoneObject) +table.insert(self.ScanData.SceneryTable,self.ScanData.Scenery[SceneryType][SceneryName]) +end +end +return true +end +world.searchObjects(ObjectCategories,SphereSearch,EvaluateZone) +end +function ZONE_RADIUS:RemoveJunk() +local radius=self.Radius +local vec3=self:GetVec3() +local volS={ +id=world.VolumeType.SPHERE, +params={point=vec3,radius=radius} +} +local n=world.removeJunk(volS) +return n +end +function ZONE_RADIUS:GetScannedUnits() +return self.ScanData.Units +end +function ZONE_RADIUS:GetScannedSetUnit() +local SetUnit=SET_UNIT:New() +if self.ScanData then +for ObjectID,UnitObject in pairs(self.ScanData.Units)do +local UnitObject=UnitObject +if UnitObject:isExist()then +local FoundUnit=UNIT:FindByName(UnitObject:getName()) +if FoundUnit then +SetUnit:AddUnit(FoundUnit) +else +local FoundStatic=STATIC:FindByName(UnitObject:getName(),false) +if FoundStatic then +SetUnit:AddUnit(FoundStatic) +end +end +end +end +end +return SetUnit +end +function ZONE_RADIUS:GetScannedSetGroup() +self.ScanSetGroup=self.ScanSetGroup or SET_GROUP:New() +self.ScanSetGroup.Set={} +if self.ScanData then +for ObjectID,UnitObject in pairs(self.ScanData.Units)do +local UnitObject=UnitObject +if UnitObject:isExist()then +local FoundUnit=UNIT:FindByName(UnitObject:getName()) +if FoundUnit then +local group=FoundUnit:GetGroup() +self.ScanSetGroup:AddGroup(group) +end +end +end +end +return self.ScanSetGroup +end +function ZONE_RADIUS:CountScannedCoalitions() +local Count=0 +for CoalitionID,Coalition in pairs(self.ScanData.Coalitions)do +Count=Count+1 +end +return Count +end +function ZONE_RADIUS:CheckScannedCoalition(Coalition) +if Coalition then +return self.ScanData.Coalitions[Coalition] +end +return nil +end +function ZONE_RADIUS:GetScannedCoalition(Coalition) +if Coalition then +return self.ScanData.Coalitions[Coalition] +else +local Count=0 +local ReturnCoalition=nil +for CoalitionID,Coalition in pairs(self.ScanData.Coalitions)do +Count=Count+1 +ReturnCoalition=CoalitionID +end +if Count~=1 then +ReturnCoalition=nil +end +return ReturnCoalition +end +end +function ZONE_RADIUS:GetScannedSceneryType(SceneryType) +return self.ScanData.Scenery[SceneryType] +end +function ZONE_RADIUS:GetScannedScenery() +return self.ScanData.Scenery +end +function ZONE_RADIUS:GetScannedSceneryObjects() +return self.ScanData.SceneryTable +end +function ZONE_RADIUS:GetScannedSetScenery() +local scenery=SET_SCENERY:New() +local objects=self:GetScannedSceneryObjects() +for _,_obj in pairs(objects)do +scenery:AddScenery(_obj) +end +return scenery +end +function ZONE_RADIUS:IsAllInZoneOfCoalition(Coalition) +return self:CountScannedCoalitions()==1 and self:GetScannedCoalition(Coalition)==true +end +function ZONE_RADIUS:IsAllInZoneOfOtherCoalition(Coalition) +return self:CountScannedCoalitions()==1 and self:GetScannedCoalition(Coalition)==nil +end +function ZONE_RADIUS:IsSomeInZoneOfCoalition(Coalition) +return self:CountScannedCoalitions()>1 and self:GetScannedCoalition(Coalition)==true +end +function ZONE_RADIUS:IsNoneInZoneOfCoalition(Coalition) +return self:GetScannedCoalition(Coalition)==nil +end +function ZONE_RADIUS:IsNoneInZone() +return self:CountScannedCoalitions()==0 +end +function ZONE_RADIUS:SearchZone(EvaluateFunction,ObjectCategories) +local SearchZoneResult=true +local ZoneCoord=self:GetCoordinate() +local ZoneRadius=self:GetRadius() +local SphereSearch={ +id=world.VolumeType.SPHERE, +params={ +point=ZoneCoord:GetVec3(), +radius=ZoneRadius, +} +} +local function EvaluateZone(ZoneDCSUnit) +local ZoneUnit=UNIT:Find(ZoneDCSUnit) +return EvaluateFunction(ZoneUnit) +end +world.searchObjects(Object.Category.UNIT,SphereSearch,EvaluateZone) +end +function ZONE_RADIUS:IsVec2InZone(Vec2) +if not Vec2 then return false end +local ZoneVec2=self:GetVec2() +if ZoneVec2 then +if((Vec2.x-ZoneVec2.x)^2+(Vec2.y-ZoneVec2.y)^2)^0.5<=self:GetRadius()then +return true +end +end +return false +end +function ZONE_RADIUS:IsVec3InZone(Vec3) +if not Vec3 then return false end +local InZone=self:IsVec2InZone({x=Vec3.x,y=Vec3.z}) +return InZone +end +function ZONE_RADIUS:GetClearZonePositions(PosRadius,NumPositions) +return UTILS.GetClearZonePositions(self,PosRadius,NumPositions) +end +function ZONE_RADIUS:GetRandomClearZoneCoordinate(PosRadius,NumPositions) +return UTILS.GetRandomClearZoneCoordinate(self,PosRadius,NumPositions) +end +function ZONE_RADIUS:GetRandomVec2(inner,outer,surfacetypes) +local Vec2=self:GetVec2() +local _inner=inner or 0 +local _outer=outer or self:GetRadius() +math.random() +math.random() +math.random() +if surfacetypes and type(surfacetypes)~="table"then +surfacetypes={surfacetypes} +end +local function _getpoint() +local point={} +local angle=math.random()*math.pi*2 +point.x=Vec2.x+math.cos(angle)*math.random(_inner,_outer) +point.y=Vec2.y+math.sin(angle)*math.random(_inner,_outer) +return point +end +local function _checkSurface(point) +local stype=land.getSurfaceType(point) +for _,sf in pairs(surfacetypes)do +if sf==stype then +return true +end +end +return false +end +local point=_getpoint() +if surfacetypes then +local N=1;local Nmax=100;local gotit=false +while gotit==false and N<=Nmax do +gotit=_checkSurface(point) +if gotit then +else +point=_getpoint() +N=N+1 +end +end +end +return point +end +function ZONE_RADIUS:GetRandomPointVec2(inner,outer) +local PointVec2=COORDINATE:NewFromVec2(self:GetRandomVec2(inner,outer)) +return PointVec2 +end +function ZONE_RADIUS:GetRandomVec3(inner,outer) +local Vec2=self:GetRandomVec2(inner,outer) +return{x=Vec2.x,y=self.y,z=Vec2.y} +end +function ZONE_RADIUS:GetRandomPointVec3(inner,outer) +local PointVec3=COORDINATE:NewFromVec2(self:GetRandomVec2(inner,outer)) +return PointVec3 +end +function ZONE_RADIUS:GetRandomCoordinate(inner,outer,surfacetypes) +local vec2=self:GetRandomVec2(inner,outer,surfacetypes) +local Coordinate=COORDINATE:NewFromVec2(vec2) +return Coordinate +end +function ZONE_RADIUS:GetRandomCoordinateWithoutBuildings(inner,outer,distance,markbuildings,markfinal) +local dist=distance or 100 +local objects={} +if self.ScanData and self.ScanData.Scenery then +objects=self:GetScannedScenery() +else +self:Scan({Object.Category.SCENERY}) +objects=self:GetScannedScenery() +end +local T0=timer.getTime() +local T1=timer.getTime() +local buildings={} +local buildingzones={} +if self.ScanData and self.ScanData.BuildingCoordinates then +buildings=self.ScanData.BuildingCoordinates +buildingzones=self.ScanData.BuildingZones +else +for _,_object in pairs(objects)do +for _,_scen in pairs(_object)do +local scenery=_scen +local description=scenery:GetDesc() +if description and description.attributes and description.attributes.Buildings then +if markbuildings then +MARKER:New(scenery:GetCoordinate(),"Building"):ToAll() +end +buildings[#buildings+1]=scenery:GetCoordinate() +local bradius=scenery:GetBoundingRadius()or dist +local bzone=ZONE_RADIUS:New("Building-"..math.random(1,100000),scenery:GetVec2(),bradius,false) +buildingzones[#buildingzones+1]=bzone +end +end +end +self.ScanData.BuildingCoordinates=buildings +self.ScanData.BuildingZones=buildingzones +end +local rcoord=nil +local found=true +local iterations=0 +for i=1,1000 do +iterations=iterations+1 +rcoord=self:GetRandomCoordinate(inner,outer) +found=true +for _,_coord in pairs(buildingzones)do +local zone=_coord +if zone:IsPointVec2InZone(rcoord)then +found=false +break +end +end +if found then +if markfinal then +MARKER:New(rcoord,"FREE"):ToAll() +end +break +end +end +if not found then +local rcoord=nil +local found=true +local iterations=0 +for i=1,1000 do +iterations=iterations+1 +rcoord=self:GetRandomCoordinate(inner,outer) +found=true +for _,_coord in pairs(buildings)do +local coord=_coord +if coord:Get3DDistance(rcoord)<dist then +found=false +end +end +if found then +if markfinal then +MARKER:New(rcoord,"FREE"):ToAll() +end +break +end +end +end +T1=timer.getTime() +if found then return rcoord else return nil end +end +ZONE={ +ClassName="ZONE", +} +function ZONE:New(ZoneName) +local zone=_DATABASE:FindZone(ZoneName) +if zone then +return zone +end +local Zone=trigger.misc.getZone(ZoneName) +if not Zone then +env.error("ERROR: Zone "..ZoneName.." does not exist!") +return nil +end +local self=BASE:Inherit(self,ZONE_RADIUS:New(ZoneName,{x=Zone.point.x,y=Zone.point.z},Zone.radius,true)) +self.Color={1,0,0,0.15} +self.Zone=Zone +return self +end +function ZONE:FindByName(ZoneName) +local ZoneFound=_DATABASE:FindZone(ZoneName) +return ZoneFound +end +ZONE_UNIT={ +ClassName="ZONE_UNIT", +} +function ZONE_UNIT:New(ZoneName,ZoneUNIT,Radius,Offset) +if Offset then +if(Offset.dx or Offset.dy)and(Offset.rho or Offset.theta)then +error("Cannot use (dx, dy) with (rho, theta)") +end +end +local self=BASE:Inherit(self,ZONE_RADIUS:New(ZoneName,ZoneUNIT:GetVec2(),Radius,true)) +if Offset then +self.dy=Offset.dy or 0.0 +self.dx=Offset.dx or 0.0 +self.rho=Offset.rho or 0.0 +self.theta=(Offset.theta or 0.0)*math.pi/180.0 +self.relative_to_unit=Offset.relative_to_unit or false +end +self.ZoneUNIT=ZoneUNIT +self.LastVec2=ZoneUNIT:GetVec2() +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_UNIT:UpdateFromUnit(Unit) +if Unit and Unit:IsAlive()then +local vec2=Unit:GetVec2() +self.LastVec2=vec2 +elseif self.ZoneUNIT and self.ZoneUNIT:IsAlive()then +local ZoneVec2=self.ZoneUNIT:GetVec2() +self.LastVec2=ZoneVec2 +end +return self +end +function ZONE_UNIT:GetVec2() +local ZoneVec2=self.ZoneUNIT:GetVec2() +if ZoneVec2 then +local heading +if self.relative_to_unit then +heading=(self.ZoneUNIT:GetHeading()or 0.0)*math.pi/180.0 +else +heading=0.0 +end +if(self.dx or self.dy)then +ZoneVec2.x=ZoneVec2.x+self.dx*math.cos(-heading)+self.dy*math.sin(-heading) +ZoneVec2.y=ZoneVec2.y-self.dx*math.sin(-heading)+self.dy*math.cos(-heading) +end +if(self.rho or self.theta)then +ZoneVec2.x=ZoneVec2.x+self.rho*math.cos(self.theta+heading) +ZoneVec2.y=ZoneVec2.y+self.rho*math.sin(self.theta+heading) +end +self.LastVec2=ZoneVec2 +return ZoneVec2 +else +return self.LastVec2 +end +return nil +end +function ZONE_UNIT:GetRandomVec2() +local RandomVec2={} +local Vec2=self:GetVec2() +if not Vec2 then +Vec2=self.LastVec2 +end +local angle=math.random()*math.pi*2; +RandomVec2.x=Vec2.x+math.cos(angle)*math.random()*self:GetRadius(); +RandomVec2.y=Vec2.y+math.sin(angle)*math.random()*self:GetRadius(); +return RandomVec2 +end +function ZONE_UNIT:GetVec3(Height) +Height=Height or 0 +local Vec2=self:GetVec2() +local Vec3={x=Vec2.x,y=land.getHeight(self:GetVec2())+Height,z=Vec2.y} +return Vec3 +end +ZONE_GROUP={ +ClassName="ZONE_GROUP", +} +function ZONE_GROUP:New(ZoneName,ZoneGROUP,Radius) +local self=BASE:Inherit(self,ZONE_RADIUS:New(ZoneName,ZoneGROUP:GetVec2(),Radius,true)) +self._.ZoneGROUP=ZoneGROUP +self._.ZoneVec2Cache=self._.ZoneGROUP:GetVec2() +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_GROUP:GetVec2() +local ZoneVec2=nil +if self._.ZoneGROUP:IsAlive()then +ZoneVec2=self._.ZoneGROUP:GetVec2() +self._.ZoneVec2Cache=ZoneVec2 +else +ZoneVec2=self._.ZoneVec2Cache +end +return ZoneVec2 +end +function ZONE_GROUP:UpdateFromGroup(Group) +if Group and Group:IsAlive()then +local vec2=Group:GetVec2() +self.Vec2=vec2 +elseif self._.ZoneGROUP and self._.ZoneGROUP:IsAlive()then +local ZoneVec2=self._.ZoneGROUP:GetVec2() +self.Vec2=ZoneVec2 +self._.ZoneVec2Cache=ZoneVec2 +end +return self +end +function ZONE_GROUP:GetRandomVec2() +local Point={} +local Vec2=self._.ZoneGROUP:GetVec2() +local angle=math.random()*math.pi*2; +Point.x=Vec2.x+math.cos(angle)*math.random()*self:GetRadius(); +Point.y=Vec2.y+math.sin(angle)*math.random()*self:GetRadius(); +return Point +end +function ZONE_GROUP:GetRandomPointVec2(inner,outer) +local PointVec2=COORDINATE:NewFromVec2(self:GetRandomVec2()) +return PointVec2 +end +_ZONE_TRIANGLE={ +ClassName="ZONE_TRIANGLE", +Points={}, +Coords={}, +CenterVec2={x=0,y=0}, +SurfaceArea=0, +DrawID={} +} +function _ZONE_TRIANGLE:New(p1,p2,p3) +local self=BASE:Inherit(self,ZONE_BASE:New()) +self.Points={p1,p2,p3} +local center_x=(p1.x+p2.x+p3.x)/3 +local center_y=(p1.y+p2.y+p3.y)/3 +self.CenterVec2={x=center_x,y=center_y} +for _,pt in pairs({p1,p2,p3})do +table.add(self.Coords,COORDINATE:NewFromVec2(pt)) +end +self.SurfaceArea=math.abs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))*0.5 +return self +end +function _ZONE_TRIANGLE:ContainsPoint(pt,points) +points=points or self.Points +local function sign(p1,p2,p3) +return(p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y) +end +local d1=sign(pt,self.Points[1],self.Points[2]) +local d2=sign(pt,self.Points[2],self.Points[3]) +local d3=sign(pt,self.Points[3],self.Points[1]) +local has_neg=(d1<0)or(d2<0)or(d3<0) +local has_pos=(d1>0)or(d2>0)or(d3>0) +return not(has_neg and has_pos) +end +function _ZONE_TRIANGLE:GetRandomVec2(points) +points=points or self.Points +local pt={math.random(),math.random()} +table.sort(pt) +local s=pt[1] +local t=pt[2]-pt[1] +local u=1-pt[2] +return{x=s*points[1].x+t*points[2].x+u*points[3].x, +y=s*points[1].y+t*points[2].y+u*points[3].y} +end +function _ZONE_TRIANGLE:Draw(Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Alpha=Alpha or 1 +FillColor=FillColor or Color +if not FillColor then UTILS.DeepCopy(Color)end +FillAlpha=FillAlpha or Alpha +if not FillAlpha then FillAlpha=1 end +for i=1,#self.Coords do +local c1=self.Coords[i] +local c2=self.Coords[i%#self.Coords+1] +local id=c1:LineToAll(c2,Coalition,Color,Alpha,LineType,ReadOnly) +self.DrawID[#self.DrawID+1]=id +end +local newID=self.Coords[1]:MarkupToAllFreeForm({self.Coords[2],self.Coords[3]},Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +self.DrawID[#self.DrawID+1]=newID +return self.DrawID +end +function _ZONE_TRIANGLE:Fill(Coalition,FillColor,FillAlpha,ReadOnly) +Coalition=Coalition or-1 +FillColor=FillColor +FillAlpha=FillAlpha +local newID=self.Coords[1]:MarkupToAllFreeForm({self.Coords[2],self.Coords[3]},Coalition,nil,nil,FillColor,FillAlpha,0,nil) +self.DrawID[#self.DrawID+1]=newID +return self.DrawID +end +ZONE_POLYGON_BASE={ +ClassName="ZONE_POLYGON_BASE", +_Triangles={}, +SurfaceArea=0, +DrawID={}, +FillTriangles={}, +Borderlines={}, +} +function ZONE_POLYGON_BASE:New(ZoneName,PointsArray) +local self=BASE:Inherit(self,ZONE_BASE:New(ZoneName)) +if PointsArray then +self._.Polygon={} +for i=1,#PointsArray do +self._.Polygon[i]={} +self._.Polygon[i].x=PointsArray[i].x +self._.Polygon[i].y=PointsArray[i].y +end +self._Triangles=self:_Triangulate() +self.SurfaceArea=self:_CalculateSurfaceArea() +end +return self +end +function ZONE_POLYGON_BASE:_Triangulate() +local points=self._.Polygon +local triangles={} +local function get_orientation(shape_points) +local sum=0 +for i=1,#shape_points do +local j=i%#shape_points+1 +sum=sum+(shape_points[j].x-shape_points[i].x)*(shape_points[j].y+shape_points[i].y) +end +return sum>=0 and"clockwise"or"counter-clockwise" +end +local function ensure_clockwise(shape_points) +local orientation=get_orientation(shape_points) +if orientation=="counter-clockwise"then +local reversed={} +for i=#shape_points,1,-1 do +table.insert(reversed,shape_points[i]) +end +return reversed +end +return shape_points +end +local function is_clockwise(p1,p2,p3) +local cross_product=(p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x) +return cross_product<0 +end +local function divide_recursively(shape_points) +if#shape_points==3 then +table.insert(triangles,_ZONE_TRIANGLE:New(shape_points[1],shape_points[2],shape_points[3])) +elseif#shape_points>3 then +for i,p1 in ipairs(shape_points)do +local p2=shape_points[(i%#shape_points)+1] +local p3=shape_points[(i+1)%#shape_points+1] +local triangle=_ZONE_TRIANGLE:New(p1,p2,p3) +local is_ear=true +if not is_clockwise(p1,p2,p3)then +is_ear=false +else +for _,point in ipairs(shape_points)do +if point~=p1 and point~=p2 and point~=p3 and triangle:ContainsPoint(point)then +is_ear=false +break +end +end +end +if is_ear then +local is_valid_triangle=true +for _,point in ipairs(points)do +if point~=p1 and point~=p2 and point~=p3 and triangle:ContainsPoint(point)then +is_valid_triangle=false +break +end +end +if is_valid_triangle then +table.insert(triangles,triangle) +local remaining_points={} +for j,point in ipairs(shape_points)do +if point~=p2 then +table.insert(remaining_points,point) +end +end +divide_recursively(remaining_points) +break +end +else +end +end +end +end +points=ensure_clockwise(points) +divide_recursively(points) +return triangles +end +function ZONE_POLYGON_BASE:UpdateFromVec2(Vec2Array) +self._.Polygon={} +for i=1,#Vec2Array do +self._.Polygon[i]={} +self._.Polygon[i].x=Vec2Array[i].x +self._.Polygon[i].y=Vec2Array[i].y +end +self._Triangles=self:_Triangulate() +self.SurfaceArea=self:_CalculateSurfaceArea() +return self +end +function ZONE_POLYGON_BASE:UpdateFromVec3(Vec3Array) +self._.Polygon={} +for i=1,#Vec3Array do +self._.Polygon[i]={} +self._.Polygon[i].x=Vec3Array[i].x +self._.Polygon[i].y=Vec3Array[i].z +end +self._Triangles=self:_Triangulate() +self.SurfaceArea=self:_CalculateSurfaceArea() +return self +end +function ZONE_POLYGON_BASE:_CalculateSurfaceArea() +local area=0 +for _,triangle in pairs(self._Triangles)do +area=area+triangle.SurfaceArea +end +return area +end +function ZONE_POLYGON_BASE:GetVec2() +local Bounds=self:GetBoundingSquare() +return{x=(Bounds.x2+Bounds.x1)/2,y=(Bounds.y2+Bounds.y1)/2} +end +function ZONE_POLYGON_BASE:GetVertexVec2(Index) +return self._.Polygon[Index or 1] +end +function ZONE_POLYGON_BASE:GetVertexVec3(Index) +local vec2=self:GetVertexVec2(Index) +if vec2 then +local vec3={x=vec2.x,y=land.getHeight(vec2),z=vec2.y} +return vec3 +end +return nil +end +function ZONE_POLYGON_BASE:GetVertexCoordinate(Index) +local vec2=self:GetVertexVec2(Index) +if vec2 then +local coord=COORDINATE:NewFromVec2(vec2) +return coord +end +return nil +end +function ZONE_POLYGON_BASE:GetVerticiesVec2() +return self._.Polygon +end +function ZONE_POLYGON_BASE:GetVerticiesVec3() +local coords={} +for i,vec2 in ipairs(self._.Polygon)do +local vec3={x=vec2.x,y=land.getHeight(vec2),z=vec2.y} +table.insert(coords,vec3) +end +return coords +end +function ZONE_POLYGON_BASE:GetVerticiesCoordinates() +local coords={} +for i,vec2 in ipairs(self._.Polygon)do +local coord=COORDINATE:NewFromVec2(vec2) +table.insert(coords,coord) +end +return coords +end +function ZONE_POLYGON_BASE:Flush() +return self +end +function ZONE_POLYGON_BASE:GetClearZonePositions(PosRadius,NumPositions) +return UTILS.GetClearZonePositions(self,PosRadius,NumPositions) +end +function ZONE_POLYGON_BASE:GetRandomClearZoneCoordinate(PosRadius,NumPositions) +return UTILS.GetRandomClearZoneCoordinate(self,PosRadius,NumPositions) +end +function ZONE_POLYGON_BASE:BoundZone(UnBound) +local i +local j +local Segments=10 +i=1 +j=#self._.Polygon +while i<=#self._.Polygon do +local DeltaX=self._.Polygon[j].x-self._.Polygon[i].x +local DeltaY=self._.Polygon[j].y-self._.Polygon[i].y +for Segment=0,Segments do +local PointX=self._.Polygon[i].x+(Segment*DeltaX/Segments) +local PointY=self._.Polygon[i].y+(Segment*DeltaY/Segments) +local Tire={ +["country"]="USA", +["category"]="Fortifications", +["canCargo"]=false, +["shape_name"]="H-tyre_B_WF", +["type"]="Black_Tyre_WF", +["y"]=PointY, +["x"]=PointX, +["name"]=string.format("%s-Tire #%0d",self:GetName(),((i-1)*Segments)+Segment), +["heading"]=0, +} +local Group=coalition.addStaticObject(country.id.USA,Tire) +if UnBound and UnBound==true then +Group:destroy() +end +end +j=i +i=i+1 +end +return self +end +function ZONE_POLYGON_BASE:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,IncludeTriangles) +if self._.Polygon and#self._.Polygon>=3 then +Coalition=Coalition or self:GetDrawCoalition() +self:SetDrawCoalition(Coalition) +Color=Color or self:GetColorRGB() +Alpha=Alpha or self:GetColorAlpha() +FillColor=FillColor or self:GetFillColorRGB() +FillAlpha=FillAlpha or self:GetFillColorAlpha() +if FillColor then +self:ReFill(FillColor,FillAlpha) +end +if Color then +self:ReDrawBorderline(Color,Alpha,LineType) +end +end +if false then +local coords=self:GetVerticiesCoordinates() +local coord=coords[1] +table.remove(coords,1) +coord:MarkupToAllFreeForm(coords,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,"Drew Polygon") +if true then +return +end +end +return self +end +function ZONE_POLYGON_BASE:ReFill(Color,Alpha) +local color=Color or self:GetFillColorRGB()or{1,0,0} +local alpha=Alpha or self:GetFillColorAlpha()or 1 +local coalition=self:GetDrawCoalition()or-1 +if#self.FillTriangles>0 then +for _,triangle in pairs(self._Triangles)do +triangle:UndrawZone() +end +for _,_value in pairs(self.FillTriangles)do +table.remove_by_value(self.DrawID,_value) +end +self.FillTriangles=nil +self.FillTriangles={} +end +for _,triangle in pairs(self._Triangles)do +local draw_ids=triangle:Fill(coalition,color,alpha,nil) +self.FillTriangles=draw_ids +table.combine(self.DrawID,draw_ids) +end +return self +end +function ZONE_POLYGON_BASE:ReDrawBorderline(Color,Alpha,LineType) +local color=Color or self:GetFillColorRGB()or{1,0,0} +local alpha=Alpha or self:GetFillColorAlpha()or 1 +local coalition=self:GetDrawCoalition()or-1 +local linetype=LineType or 1 +if#self.Borderlines>0 then +for _,MarkID in pairs(self.Borderlines)do +trigger.action.removeMark(MarkID) +end +for _,_value in pairs(self.Borderlines)do +table.remove_by_value(self.DrawID,_value) +end +self.Borderlines=nil +self.Borderlines={} +end +local coords=self:GetVerticiesCoordinates() +for i=1,#coords do +local c1=coords[i] +local c2=coords[i%#coords+1] +local newID=c1:LineToAll(c2,coalition,color,alpha,linetype,nil) +self.DrawID[#self.DrawID+1]=newID +self.Borderlines[#self.Borderlines+1]=newID +end +return self +end +function ZONE_POLYGON_BASE:GetSurfaceArea() +return self.SurfaceArea +end +function ZONE_POLYGON_BASE:GetRadius() +local center=self:GetVec2() +local radius=0 +for _,_vec2 in pairs(self._.Polygon)do +local vec2=_vec2 +local r=UTILS.VecDist2D(center,vec2) +if r>radius then +radius=r +end +end +return radius +end +function ZONE_POLYGON_BASE:GetZoneRadius(ZoneName,DoNotRegisterZone) +local center=self:GetVec2() +local radius=self:GetRadius() +local zone=ZONE_RADIUS:New(ZoneName or self.ZoneName,center,radius,DoNotRegisterZone) +return zone +end +function ZONE_POLYGON_BASE:GetZoneQuad(ZoneName,DoNotRegisterZone) +local vec1,vec3=self:GetBoundingVec2() +local vec2={x=vec1.x,y=vec3.y} +local vec4={x=vec3.x,y=vec1.y} +local zone=ZONE_POLYGON_BASE:New(ZoneName or self.ZoneName,{vec1,vec2,vec3,vec4}) +return zone +end +function ZONE_POLYGON_BASE:RemoveJunk(Height) +Height=Height or 1000 +local vec2SW,vec2NE=self:GetBoundingVec2() +local vec3SW={x=vec2SW.x,y=-Height,z=vec2SW.y} +local vec3NE={x=vec2NE.x,y=Height,z=vec2NE.y} +local volume={ +id=world.VolumeType.BOX, +params={ +min=vec3SW, +max=vec3SW +} +} +local n=world.removeJunk(volume) +return n +end +function ZONE_POLYGON_BASE:SmokeZone(SmokeColor,Segments) +Segments=Segments or 10 +local i=1 +local j=#self._.Polygon +while i<=#self._.Polygon do +local DeltaX=self._.Polygon[j].x-self._.Polygon[i].x +local DeltaY=self._.Polygon[j].y-self._.Polygon[i].y +for Segment=0,Segments do +local PointX=self._.Polygon[i].x+(Segment*DeltaX/Segments) +local PointY=self._.Polygon[i].y+(Segment*DeltaY/Segments) +COORDINATE:New(PointX,0,PointY):Smoke(SmokeColor) +end +j=i +i=i+1 +end +return self +end +function ZONE_POLYGON_BASE:FlareZone(FlareColor,Segments,Azimuth,AddHeight) +Segments=Segments or 10 +AddHeight=AddHeight or 0 +local i=1 +local j=#self._.Polygon +while i<=#self._.Polygon do +local DeltaX=self._.Polygon[j].x-self._.Polygon[i].x +local DeltaY=self._.Polygon[j].y-self._.Polygon[i].y +for Segment=0,Segments do +local PointX=self._.Polygon[i].x+(Segment*DeltaX/Segments) +local PointY=self._.Polygon[i].y+(Segment*DeltaY/Segments) +COORDINATE:New(PointX,AddHeight,PointY):Flare(FlareColor,Azimuth) +end +j=i +i=i+1 +end +return self +end +function ZONE_POLYGON_BASE:IsVec2InZone(Vec2) +if not Vec2 then return false end +local Next +local Prev +local InPolygon=false +Next=1 +Prev=#self._.Polygon +while Next<=#self._.Polygon do +if(((self._.Polygon[Next].y>Vec2.y)~=(self._.Polygon[Prev].y>Vec2.y))and +(Vec2.x<(self._.Polygon[Prev].x-self._.Polygon[Next].x)*(Vec2.y-self._.Polygon[Next].y)/(self._.Polygon[Prev].y-self._.Polygon[Next].y)+self._.Polygon[Next].x) +)then +InPolygon=not InPolygon +end +Prev=Next +Next=Next+1 +end +return InPolygon +end +function ZONE_POLYGON_BASE:IsVec3InZone(Vec3) +if not Vec3 then return false end +local InZone=self:IsVec2InZone({x=Vec3.x,y=Vec3.z}) +return InZone +end +function ZONE_POLYGON_BASE:GetRandomVec2() +math.random() +math.random() +math.random() +local weights={} +for _,triangle in pairs(self._Triangles)do +weights[triangle]=triangle.SurfaceArea/self.SurfaceArea +end +local random_weight=math.random() +local accumulated_weight=0 +for triangle,weight in pairs(weights)do +accumulated_weight=accumulated_weight+weight +if accumulated_weight>=random_weight then +return triangle:GetRandomVec2() +end +end +end +function ZONE_POLYGON_BASE:GetRandomPointVec2() +local PointVec2=COORDINATE:NewFromVec2(self:GetRandomVec2()) +return PointVec2 +end +function ZONE_POLYGON_BASE:GetRandomPointVec3() +local PointVec3=COORDINATE:NewFromVec2(self:GetRandomVec2()) +return PointVec3 +end +function ZONE_POLYGON_BASE:GetRandomCoordinate() +local Coordinate=COORDINATE:NewFromVec2(self:GetRandomVec2()) +return Coordinate +end +function ZONE_POLYGON_BASE:GetBoundingSquare() +local x1=self._.Polygon[1].x +local y1=self._.Polygon[1].y +local x2=self._.Polygon[1].x +local y2=self._.Polygon[1].y +for i=2,#self._.Polygon do +x1=(x1>self._.Polygon[i].x)and self._.Polygon[i].x or x1 +x2=(x2<self._.Polygon[i].x)and self._.Polygon[i].x or x2 +y1=(y1>self._.Polygon[i].y)and self._.Polygon[i].y or y1 +y2=(y2<self._.Polygon[i].y)and self._.Polygon[i].y or y2 +end +return{x1=x1,y1=y1,x2=x2,y2=y2} +end +function ZONE_POLYGON_BASE:GetBoundingVec2() +local x1=self._.Polygon[1].x +local y1=self._.Polygon[1].y +local x2=self._.Polygon[1].x +local y2=self._.Polygon[1].y +for i=2,#self._.Polygon do +x1=(x1>self._.Polygon[i].x)and self._.Polygon[i].x or x1 +x2=(x2<self._.Polygon[i].x)and self._.Polygon[i].x or x2 +y1=(y1>self._.Polygon[i].y)and self._.Polygon[i].y or y1 +y2=(y2<self._.Polygon[i].y)and self._.Polygon[i].y or y2 +end +local vec1={x=x1,y=y1} +local vec2={x=x2,y=y2} +return vec1,vec2 +end +function ZONE_POLYGON_BASE:Boundary(Coalition,Color,Radius,Alpha,Segments,Closed) +Coalition=Coalition or-1 +Color=Color or{1,1,1} +Radius=Radius or 1000 +Alpha=Alpha or 1 +Segments=Segments or 10 +Closed=Closed or false +local Limit +local i=1 +local j=#self._.Polygon +if(Closed)then +Limit=#self._.Polygon+1 +else +Limit=#self._.Polygon +end +while i<=#self._.Polygon do +if j~=Limit then +local DeltaX=self._.Polygon[j].x-self._.Polygon[i].x +local DeltaY=self._.Polygon[j].y-self._.Polygon[i].y +for Segment=0,Segments do +local PointX=self._.Polygon[i].x+(Segment*DeltaX/Segments) +local PointY=self._.Polygon[i].y+(Segment*DeltaY/Segments) +end +end +j=i +i=i+1 +end +return self +end +do +ZONE_POLYGON={ +ClassName="ZONE_POLYGON", +} +function ZONE_POLYGON:New(ZoneName,ZoneGroup) +local GroupPoints=ZoneGroup:GetTaskRoute() +local self=BASE:Inherit(self,ZONE_POLYGON_BASE:New(ZoneName,GroupPoints)) +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_POLYGON:NewFromPointsArray(ZoneName,PointsArray) +local self=BASE:Inherit(self,ZONE_POLYGON_BASE:New(ZoneName,PointsArray)) +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_POLYGON:NewFromGroupName(GroupName) +local ZoneGroup=GROUP:FindByName(GroupName) +local GroupPoints=ZoneGroup:GetTaskRoute() +local self=BASE:Inherit(self,ZONE_POLYGON_BASE:New(GroupName,GroupPoints)) +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_POLYGON:NewFromDrawing(DrawingName) +local points={} +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if object["name"]==DrawingName then +if(object["primitiveType"]=="Line"and object["closed"]==true)or(object["polygonMode"]=="free")then +for _,point in UTILS.spairs(object["points"])do +local skip=false +local p={x=object["mapX"]+point["x"], +y=object["mapY"]+point["y"]} +for _,pt in pairs(points)do +if pt.x==p.x and pt.y==p.y then +skip=true +end +end +if not skip then +table.add(points,p) +end +end +elseif object["polygonMode"]=="rect"then +local angle=object["angle"] +local half_width=object["width"]/2 +local half_height=object["height"]/2 +local center={x=object["mapX"],y=object["mapY"]} +local p1=UTILS.RotatePointAroundPivot({x=center.x-half_height,y=center.y+half_width},center,angle) +local p2=UTILS.RotatePointAroundPivot({x=center.x+half_height,y=center.y+half_width},center,angle) +local p3=UTILS.RotatePointAroundPivot({x=center.x+half_height,y=center.y-half_width},center,angle) +local p4=UTILS.RotatePointAroundPivot({x=center.x-half_height,y=center.y-half_width},center,angle) +points={p1,p2,p3,p4} +else +end +end +end +end +local self=BASE:Inherit(self,ZONE_POLYGON_BASE:New(DrawingName,points)) +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_POLYGON:FindByName(ZoneName) +local ZoneFound=_DATABASE:FindZone(ZoneName) +return ZoneFound +end +function ZONE_POLYGON:Scan(ObjectCategories,UnitCategories) +self.ScanData={} +self.ScanData.Coalitions={} +self.ScanData.Scenery={} +self.ScanData.SceneryTable={} +self.ScanData.Units={} +local vectors=self:GetBoundingSquare() +local ZoneRadius=UTILS.VecDist2D({x=vectors.x1,y=vectors.y1},{x=vectors.x2,y=vectors.y2})/2 +local CenterVec3=self:GetCoordinate():GetVec3() +local SphereSearch={ +id=world.VolumeType.SPHERE, +params={ +point=CenterVec3, +radius=ZoneRadius, +} +} +local function EvaluateZone(ZoneObject) +if ZoneObject and self:IsVec3InZone(ZoneObject:getPoint())then +local ObjectCategory=Object.getCategory(ZoneObject) +if(ObjectCategory==Object.Category.UNIT and ZoneObject:isExist()and ZoneObject:isActive())or(ObjectCategory==Object.Category.STATIC and ZoneObject:isExist())then +local Include=false +if not UnitCategories then +Include=true +else +local CategoryDCSUnit=ZoneObject:getDesc().category +for UnitCategoryID,UnitCategory in pairs(UnitCategories)do +if UnitCategory==CategoryDCSUnit then +Include=true +break +end +end +end +if Include then +local CoalitionDCSUnit=ZoneObject:getCoalition() +self.ScanData.Coalitions[CoalitionDCSUnit]=true +self.ScanData.Units[ZoneObject]=ZoneObject +end +end +if ObjectCategory==Object.Category.SCENERY then +local SceneryType=ZoneObject:getTypeName() +local SceneryName=ZoneObject:getName() +self.ScanData.Scenery[SceneryType]=self.ScanData.Scenery[SceneryType]or{} +self.ScanData.Scenery[SceneryType][SceneryName]=SCENERY:Register(SceneryName,ZoneObject) +table.insert(self.ScanData.SceneryTable,self.ScanData.Scenery[SceneryType][SceneryName]) +end +end +return true +end +local inzoneunits=SET_UNIT:New():FilterZones({self}):FilterOnce() +local inzonestatics=SET_STATIC:New():FilterZones({self}):FilterOnce() +inzoneunits:ForEach( +function(unit) +local Unit=unit +local DCS=Unit:GetDCSObject() +EvaluateZone(DCS) +end +) +inzonestatics:ForEach( +function(static) +local Static=static +local DCS=Static:GetDCSObject() +EvaluateZone(DCS) +end +) +local searchscenery=false +for _,_type in pairs(ObjectCategories)do +if _type==Object.Category.SCENERY then +searchscenery=true +end +end +if searchscenery then +world.searchObjects({Object.Category.SCENERY},SphereSearch,EvaluateZone) +end +end +function ZONE_POLYGON:GetScannedUnits() +return self.ScanData.Units +end +function ZONE_POLYGON:GetScannedSetUnit() +local SetUnit=SET_UNIT:New() +if self.ScanData then +for ObjectID,UnitObject in pairs(self.ScanData.Units)do +local UnitObject=UnitObject +if UnitObject:isExist()then +local FoundUnit=UNIT:FindByName(UnitObject:getName()) +if FoundUnit then +SetUnit:AddUnit(FoundUnit) +else +local FoundStatic=STATIC:FindByName(UnitObject:getName()) +if FoundStatic then +SetUnit:AddUnit(FoundStatic) +end +end +end +end +end +return SetUnit +end +function ZONE_POLYGON:GetScannedSetGroup() +self.ScanSetGroup=self.ScanSetGroup or SET_GROUP:New() +self.ScanSetGroup.Set={} +if self.ScanData then +for ObjectID,UnitObject in pairs(self.ScanData.Units)do +local UnitObject=UnitObject +if UnitObject:isExist()then +local FoundUnit=UNIT:FindByName(UnitObject:getName()) +if FoundUnit then +local group=FoundUnit:GetGroup() +self.ScanSetGroup:AddGroup(group) +end +end +end +end +return self.ScanSetGroup +end +function ZONE_POLYGON:CountScannedCoalitions() +local Count=0 +for CoalitionID,Coalition in pairs(self.ScanData.Coalitions)do +Count=Count+1 +end +return Count +end +function ZONE_POLYGON:CheckScannedCoalition(Coalition) +if Coalition then +return self.ScanData.Coalitions[Coalition] +end +return nil +end +function ZONE_POLYGON:GetScannedCoalition(Coalition) +if Coalition then +return self.ScanData.Coalitions[Coalition] +else +local Count=0 +local ReturnCoalition=nil +for CoalitionID,Coalition in pairs(self.ScanData.Coalitions)do +Count=Count+1 +ReturnCoalition=CoalitionID +end +if Count~=1 then +ReturnCoalition=nil +end +return ReturnCoalition +end +end +function ZONE_POLYGON:GetScannedSceneryType(SceneryType) +return self.ScanData.Scenery[SceneryType] +end +function ZONE_POLYGON:GetScannedSceneryObjects() +return self.ScanData.SceneryTable +end +function ZONE_POLYGON:GetScannedScenery() +return self.ScanData.Scenery +end +function ZONE_POLYGON:GetScannedSetScenery() +local scenery=SET_SCENERY:New() +local objects=self:GetScannedSceneryObjects() +for _,_obj in pairs(objects)do +scenery:AddScenery(_obj) +end +return scenery +end +function ZONE_POLYGON:IsAllInZoneOfCoalition(Coalition) +return self:CountScannedCoalitions()==1 and self:GetScannedCoalition(Coalition)==true +end +function ZONE_POLYGON:IsAllInZoneOfOtherCoalition(Coalition) +return self:CountScannedCoalitions()==1 and self:GetScannedCoalition(Coalition)==nil +end +function ZONE_POLYGON:IsSomeInZoneOfCoalition(Coalition) +return self:CountScannedCoalitions()>1 and self:GetScannedCoalition(Coalition)==true +end +function ZONE_POLYGON:IsNoneInZoneOfCoalition(Coalition) +return self:GetScannedCoalition(Coalition)==nil +end +function ZONE_POLYGON:IsNoneInZone() +return self:CountScannedCoalitions()==0 +end +end +do +ZONE_ELASTIC={ +ClassName="ZONE_ELASTIC", +points={}, +setGroups={} +} +function ZONE_ELASTIC:New(ZoneName,Points) +local self=BASE:Inherit(self,ZONE_POLYGON_BASE:New(ZoneName,Points)) +_EVENTDISPATCHER:CreateEventNewZone(self) +if Points then +self.points=Points +end +return self +end +function ZONE_ELASTIC:AddVertex2D(Vec2) +table.insert(self.points,Vec2) +return self +end +function ZONE_ELASTIC:RemoveVertex2D(Vec2) +local found=false +local findex=0 +for _id,_vec2 in pairs(self.points)do +if _vec2.x==Vec2.x and _vec2.y==Vec2.y then +found=true +findex=_id +break +end +end +if found==true and findex>0 then +table.remove(self.points,findex) +end +return self +end +function ZONE_ELASTIC:RemoveVertex3D(Vec3) +return self:RemoveVertex2D({x=Vec3.x,y=Vec3.z}) +end +function ZONE_ELASTIC:AddVertex3D(Vec3) +table.insert(self.points,{x=Vec3.x,y=Vec3.z}) +return self +end +function ZONE_ELASTIC:AddSetGroup(GroupSet) +table.insert(self.setGroups,GroupSet) +return self +end +function ZONE_ELASTIC:Update(Delay,Draw) +local points=UTILS.DeepCopy(self.points or{}) +if self.setGroups then +for _,_setGroup in pairs(self.setGroups)do +local setGroup=_setGroup +for _,_group in pairs(setGroup.Set)do +local group=_group +if group and group:IsAlive()then +table.insert(points,group:GetVec2()) +end +end +end +end +self._.Polygon=self:_ConvexHull(points) +self._Triangles=self:_Triangulate() +self.SurfaceArea=self:_CalculateSurfaceArea() +if Draw~=false then +if self.DrawID or Draw==true then +self:UndrawZone() +self:DrawZone() +end +end +return self +end +function ZONE_ELASTIC:StartUpdate(Tstart,dT,Tstop,Draw) +self.updateID=self:ScheduleRepeat(Tstart,dT,0,Tstop,ZONE_ELASTIC.Update,self,0,Draw) +return self +end +function ZONE_ELASTIC:StopUpdate(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,ZONE_ELASTIC.StopUpdate,self) +else +if self.updateID then +self:ScheduleStop(self.updateID) +self.updateID=nil +end +end +return self +end +function ZONE_ELASTIC:_ConvexHull(pl) +if#pl==0 then +return{} +end +table.sort(pl,function(left,right) +return left.x<right.x +end) +local h={} +local function ccw(a,b,c) +return(b.x-a.x)*(c.y-a.y)>(b.y-a.y)*(c.x-a.x) +end +for i,pt in pairs(pl)do +while#h>=2 and not ccw(h[#h-1],h[#h],pt)do +table.remove(h,#h) +end +table.insert(h,pt) +end +local t=#h+1 +for i=#pl,1,-1 do +local pt=pl[i] +while#h>=t and not ccw(h[#h-1],h[#h],pt)do +table.remove(h,#h) +end +table.insert(h,pt) +end +table.remove(h,#h) +return h +end +end +ZONE_OVAL={ +ClassName="OVAL", +ZoneName="", +MajorAxis=nil, +MinorAxis=nil, +Angle=0, +DrawPoly=nil +} +function ZONE_OVAL:New(name,vec2,major_axis,minor_axis,angle) +self=BASE:Inherit(self,ZONE_BASE:New()) +self.ZoneName=name +self.CenterVec2=vec2 +self.MajorAxis=major_axis +self.MinorAxis=minor_axis +self.Angle=angle or 0 +_DATABASE:AddZone(name,self) +return self +end +function ZONE_OVAL:NewFromDrawing(DrawingName) +self=BASE:Inherit(self,ZONE_BASE:New(DrawingName)) +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if string.find(object["name"],DrawingName,1,true)then +if object["polygonMode"]=="oval"then +self.CenterVec2={x=object["mapX"],y=object["mapY"]} +self.MajorAxis=object["r1"] +self.MinorAxis=object["r2"] +self.Angle=object["angle"] +end +end +end +end +_DATABASE:AddZone(DrawingName,self) +return self +end +function ZONE_OVAL:GetMajorAxis() +return self.MajorAxis +end +function ZONE_OVAL:GetMinorAxis() +return self.MinorAxis +end +function ZONE_OVAL:GetAngle() +return self.Angle +end +function ZONE_OVAL:GetVec2() +return self.CenterVec2 +end +function ZONE_OVAL:IsVec2InZone(vec2) +local cos,sin=math.cos,math.sin +local dx=vec2.x-self.CenterVec2.x +local dy=vec2.y-self.CenterVec2.y +local rx=dx*cos(self.Angle)+dy*sin(self.Angle) +local ry=-dx*sin(self.Angle)+dy*cos(self.Angle) +return rx*rx/(self.MajorAxis*self.MajorAxis)+ry*ry/(self.MinorAxis*self.MinorAxis)<=1 +end +function ZONE_OVAL:GetBoundingSquare() +local min_x=self.CenterVec2.x-self.MajorAxis +local min_y=self.CenterVec2.y-self.MinorAxis +local max_x=self.CenterVec2.x+self.MajorAxis +local max_y=self.CenterVec2.y+self.MinorAxis +return{ +{x=min_x,y=min_x},{x=max_x,y=min_y},{x=max_x,y=max_y},{x=min_x,y=max_y} +} +end +function ZONE_OVAL:PointsOnEdge(num_points) +num_points=num_points or 40 +local points={} +local dtheta=2*math.pi/num_points +for i=0,num_points-1 do +local theta=i*dtheta +local x=self.CenterVec2.x+self.MajorAxis*math.cos(theta)*math.cos(self.Angle)-self.MinorAxis*math.sin(theta)*math.sin(self.Angle) +local y=self.CenterVec2.y+self.MajorAxis*math.cos(theta)*math.sin(self.Angle)+self.MinorAxis*math.sin(theta)*math.cos(self.Angle) +table.insert(points,{x=x,y=y}) +end +return points +end +function ZONE_OVAL:GetRandomVec2() +local theta=math.rad(self.Angle) +local random_point=math.sqrt(math.random()) +local phi=math.random()*2*math.pi +local x_c=random_point*math.cos(phi) +local y_c=random_point*math.sin(phi) +local x_e=x_c*self.MajorAxis +local y_e=y_c*self.MinorAxis +local rx=(x_e*math.cos(theta)-y_e*math.sin(theta))+self.CenterVec2.x +local ry=(x_e*math.sin(theta)+y_e*math.cos(theta))+self.CenterVec2.y +return{x=rx,y=ry} +end +function ZONE_OVAL:GetRandomPointVec2() +return COORDINATE:NewFromVec2(self:GetRandomVec2()) +end +function ZONE_OVAL:GetRandomPointVec3() +return COORDINATE:NewFromVec3(self:GetRandomVec2()) +end +function ZONE_OVAL:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType) +Coalition=Coalition or self:GetDrawCoalition() +self:SetDrawCoalition(Coalition) +Color=Color or self:GetColorRGB() +Alpha=Alpha or 1 +self:SetColor(Color,Alpha) +FillColor=FillColor or self:GetFillColorRGB() +if not FillColor then +UTILS.DeepCopy(Color) +end +FillAlpha=FillAlpha or self:GetFillColorAlpha() +if not FillAlpha then +FillAlpha=0.15 +end +LineType=LineType or 1 +self:SetFillColor(FillColor,FillAlpha) +self.DrawPoly=ZONE_POLYGON:NewFromPointsArray(self.ZoneName,self:PointsOnEdge(80)) +self.DrawPoly:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType) +end +function ZONE_OVAL:UndrawZone() +if self.DrawPoly then +self.DrawPoly:UndrawZone() +end +end +do +ZONE_AIRBASE={ +ClassName="ZONE_AIRBASE", +} +function ZONE_AIRBASE:New(AirbaseName,Radius) +Radius=Radius or 4000 +local Airbase=AIRBASE:FindByName(AirbaseName) +local self=BASE:Inherit(self,ZONE_RADIUS:New(AirbaseName,Airbase:GetVec2(),Radius,true)) +self._.ZoneAirbase=Airbase +self._.ZoneVec2Cache=self._.ZoneAirbase:GetVec2() +if Airbase:IsShip()then +self.isShip=true +self.isHelipad=false +self.isAirdrome=false +elseif Airbase:IsHelipad()then +self.isShip=false +self.isHelipad=true +self.isAirdrome=false +elseif Airbase:IsAirdrome()then +self.isShip=false +self.isHelipad=false +self.isAirdrome=true +end +_EVENTDISPATCHER:CreateEventNewZone(self) +return self +end +function ZONE_AIRBASE:GetAirbase() +return self._.ZoneAirbase +end +function ZONE_AIRBASE:GetVec2() +local ZoneVec2=nil +if self._.ZoneAirbase:IsAlive()then +ZoneVec2=self._.ZoneAirbase:GetVec2() +self._.ZoneVec2Cache=ZoneVec2 +else +ZoneVec2=self._.ZoneVec2Cache +end +return ZoneVec2 +end +function ZONE_AIRBASE:GetRandomPointVec2(inner,outer) +local PointVec2=COORDINATE:NewFromVec2(self:GetRandomVec2()) +return PointVec2 +end +end +ZONE_DETECTION={ +ClassName="ZONE_DETECTION", +} +function ZONE_DETECTION:New(ZoneName,Detection,Radius) +local self=BASE:Inherit(self,ZONE_BASE:New(ZoneName)) +self:F({ZoneName,Detection,Radius}) +self.Detection=Detection +self.Radius=Radius +return self +end +function ZONE_DETECTION:BoundZone(Points,CountryID,UnBound) +local Point={} +local Vec2=self:GetVec2() +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,(360/Points)do +local Radial=Angle*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +local CountryName=_DATABASE.COUNTRY_NAME[CountryID] +local Tire={ +["country"]=CountryName, +["category"]="Fortifications", +["canCargo"]=false, +["shape_name"]="H-tyre_B_WF", +["type"]="Black_Tyre_WF", +["y"]=Point.y, +["x"]=Point.x, +["name"]=string.format("%s-Tire #%0d",self:GetName(),Angle), +["heading"]=0, +} +local Group=coalition.addStaticObject(CountryID,Tire) +if UnBound and UnBound==true then +Group:destroy() +end +end +return self +end +function ZONE_DETECTION:SmokeZone(SmokeColor,Points,AddHeight,AngleOffset) +self:F2(SmokeColor) +local Point={} +local Vec2=self:GetVec2() +AddHeight=AddHeight or 0 +AngleOffset=AngleOffset or 0 +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,360/Points do +local Radial=(Angle+AngleOffset)*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +COORDINATE:New(Point.x,AddHeight,Point.y):Smoke(SmokeColor) +end +return self +end +function ZONE_DETECTION:FlareZone(FlareColor,Points,Azimuth,AddHeight) +self:F2({FlareColor,Azimuth}) +local Point={} +local Vec2=self:GetVec2() +AddHeight=AddHeight or 0 +Points=Points and Points or 360 +local Angle +local RadialBase=math.pi*2 +for Angle=0,360,360/Points do +local Radial=Angle*RadialBase/360 +Point.x=Vec2.x+math.cos(Radial)*self:GetRadius() +Point.y=Vec2.y+math.sin(Radial)*self:GetRadius() +COORDINATE:New(Point.x,AddHeight,Point.y):Flare(FlareColor,Azimuth) +end +return self +end +function ZONE_DETECTION:GetRadius() +self:F2(self.ZoneName) +self:T2({self.Radius}) +return self.Radius +end +function ZONE_DETECTION:SetRadius(Radius) +self:F2(self.ZoneName) +self.Radius=Radius +self:T2({self.Radius}) +return self.Radius +end +function ZONE_DETECTION:IsVec2InZone(Vec2) +self:F2(Vec2) +local Coordinates=self.Detection:GetDetectedItemCoordinates() +for CoordinateID,Coordinate in pairs(Coordinates)do +local ZoneVec2=Coordinate:GetVec2() +if ZoneVec2 then +if((Vec2.x-ZoneVec2.x)^2+(Vec2.y-ZoneVec2.y)^2)^0.5<=self:GetRadius()then +return true +end +end +end +return false +end +function ZONE_DETECTION:IsVec3InZone(Vec3) +self:F2(Vec3) +local InZone=self:IsVec2InZone({x=Vec3.x,y=Vec3.z}) +return InZone +end +DATABASE={ +ClassName="DATABASE", +Templates={ +Units={}, +Groups={}, +Statics={}, +ClientsByName={}, +ClientsByID={}, +}, +UNITS={}, +UNITS_Index={}, +STATICS={}, +GROUPS={}, +PLAYERS={}, +PLAYERSJOINED={}, +PLAYERUNITS={}, +CLIENTS={}, +CARGOS={}, +AIRBASES={}, +COUNTRY_ID={}, +COUNTRY_NAME={}, +NavPoints={}, +PLAYERSETTINGS={}, +ZONENAMES={}, +HITS={}, +DESTROYS={}, +ZONES={}, +ZONES_GOAL={}, +WAREHOUSES={}, +FLIGHTGROUPS={}, +FLIGHTCONTROLS={}, +OPSZONES={}, +PATHLINES={}, +STORAGES={}, +STNS={}, +SADL={}, +DYNAMICCARGO={}, +} +local _DATABASECoalition= +{ +[1]="Red", +[2]="Blue", +[3]="Neutral", +} +local _DATABASECategory= +{ +["plane"]=Unit.Category.AIRPLANE, +["helicopter"]=Unit.Category.HELICOPTER, +["vehicle"]=Unit.Category.GROUND_UNIT, +["ship"]=Unit.Category.SHIP, +["static"]=Unit.Category.STRUCTURE, +} +function DATABASE:New() +local self=BASE:Inherit(self,BASE:New()) +self:SetEventPriority(1) +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventOnPlayerEnterUnit) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Hit,self.AccountHits) +self:HandleEvent(EVENTS.NewCargo) +self:HandleEvent(EVENTS.DeleteCargo) +self:HandleEvent(EVENTS.NewZone) +self:HandleEvent(EVENTS.DeleteZone) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventOnPlayerLeaveUnit) +self:HandleEvent(EVENTS.DynamicCargoRemoved,self._EventOnDynamicCargoRemoved) +self:_RegisterTemplates() +self:_RegisterGroupsAndUnits() +self:_RegisterClients() +self:_RegisterStatics() +self.UNITS_Position=0 +return self +end +function DATABASE:FindUnit(UnitName) +local UnitFound=self.UNITS[UnitName] +return UnitFound +end +function DATABASE:AddUnit(DCSUnitName,force) +local DCSunitName=DCSUnitName +if type(DCSunitName)=="number"then DCSunitName=string.format("%d",DCSUnitName)end +if not self.UNITS[DCSunitName]or force==true then +self:T({"Add UNIT:",DCSunitName}) +self.UNITS[DCSunitName]=UNIT:Register(DCSunitName) +end +return self.UNITS[DCSunitName] +end +function DATABASE:DeleteUnit(DCSUnitName) +self:T("DeleteUnit "..tostring(DCSUnitName)) +self.UNITS[DCSUnitName]=nil +end +function DATABASE:AddStatic(DCSStaticName) +if not self.STATICS[DCSStaticName]then +self.STATICS[DCSStaticName]=STATIC:Register(DCSStaticName) +end +return self.STATICS[DCSStaticName] +end +function DATABASE:DeleteStatic(DCSStaticName) +self.STATICS[DCSStaticName]=nil +end +function DATABASE:FindStatic(StaticName) +local StaticFound=self.STATICS[StaticName] +return StaticFound +end +function DATABASE:AddDynamicCargo(Name) +if not self.DYNAMICCARGO[Name]then +self.DYNAMICCARGO[Name]=DYNAMICCARGO:Register(Name) +end +return self.DYNAMICCARGO[Name] +end +function DATABASE:FindDynamicCargo(DynamicCargoName) +local StaticFound=self.DYNAMICCARGO[DynamicCargoName] +return StaticFound +end +function DATABASE:DeleteDynamicCargo(DynamicCargoName) +self.DYNAMICCARGO[DynamicCargoName]=nil +return self +end +function DATABASE:AddAirbase(AirbaseName) +if not self.AIRBASES[AirbaseName]then +self.AIRBASES[AirbaseName]=AIRBASE:Register(AirbaseName) +end +return self.AIRBASES[AirbaseName] +end +function DATABASE:DeleteAirbase(AirbaseName) +self.AIRBASES[AirbaseName]=nil +end +function DATABASE:FindAirbase(AirbaseName) +local AirbaseFound=self.AIRBASES[AirbaseName] +return AirbaseFound +end +function DATABASE:AddStorage(AirbaseName) +if not self.STORAGES[AirbaseName]then +self.STORAGES[AirbaseName]=STORAGE:New(AirbaseName) +end +return self.STORAGES[AirbaseName] +end +function DATABASE:DeleteStorage(AirbaseName) +self.STORAGES[AirbaseName]=nil +end +function DATABASE:FindStorage(AirbaseName) +local storage=self.STORAGES[AirbaseName] +return storage +end +do +function DATABASE:FindZone(ZoneName) +local ZoneFound=self.ZONES[ZoneName] +return ZoneFound +end +function DATABASE:AddZone(ZoneName,Zone) +if not self.ZONES[ZoneName]then +self.ZONES[ZoneName]=Zone +end +end +function DATABASE:DeleteZone(ZoneName) +self.ZONES[ZoneName]=nil +end +function DATABASE:AddPathline(PathlineName,Pathline) +if not self.PATHLINES[PathlineName]then +self.PATHLINES[PathlineName]=Pathline +end +end +function DATABASE:FindPathline(PathlineName) +local pathline=self.PATHLINES[PathlineName] +return pathline +end +function DATABASE:DeletePathline(PathlineName) +self.PATHLINES[PathlineName]=nil +return self +end +function DATABASE:_RegisterZones() +for ZoneID,ZoneData in pairs(env.mission.triggers.zones)do +local ZoneName=ZoneData.name +local color=ZoneData.color or{1,0,0,0.15} +local Zone=nil +if ZoneData.type==0 then +self:I(string.format("Register ZONE: %s (Circular)",ZoneName)) +Zone=ZONE:New(ZoneName) +else +self:I(string.format("Register ZONE: %s (Polygon, Quad)",ZoneName)) +Zone=ZONE_POLYGON:NewFromPointsArray(ZoneName,ZoneData.verticies) +end +if Zone then +Zone.Color=color +Zone.ZoneID=ZoneData.zoneId +local ZoneProperties=ZoneData.properties or nil +Zone.Properties={} +if ZoneName and ZoneProperties then +for _,ZoneProp in ipairs(ZoneProperties)do +if ZoneProp.key then +Zone.Properties[ZoneProp.key]=ZoneProp.value +end +end +end +self.ZONENAMES[ZoneName]=ZoneName +self:AddZone(ZoneName,Zone) +end +end +for ZoneGroupName,ZoneGroup in pairs(self.GROUPS)do +if ZoneGroupName:match("#ZONE_POLYGON")then +local ZoneName1=ZoneGroupName:match("(.*)#ZONE_POLYGON") +local ZoneName2=ZoneGroupName:match(".*#ZONE_POLYGON(.*)") +local ZoneName=ZoneName1..(ZoneName2 or"") +self:I(string.format("Register ZONE: %s (Polygon)",ZoneName)) +local Zone_Polygon=ZONE_POLYGON:New(ZoneName,ZoneGroup) +Zone_Polygon:SetColor({1,0,0},0.15) +self.ZONENAMES[ZoneName]=ZoneName +self:AddZone(ZoneName,Zone_Polygon) +end +end +if env.mission.drawings and env.mission.drawings.layers then +for layerID,layerData in pairs(env.mission.drawings.layers or{})do +for objectID,objectData in pairs(layerData.objects or{})do +if objectData.polygonMode and(objectData.polygonMode=="free")and objectData.points and#objectData.points>=4 then +local ZoneName=objectData.name or"Unknown free Polygon Drawing" +local vec2={x=objectData.mapX,y=objectData.mapY} +local points=UTILS.DeepCopy(objectData.points) +for i,_point in pairs(points)do +local point=_point +points[i]=UTILS.Vec2Add(point,vec2) +end +table.remove(points,#points) +self:I(string.format("Register ZONE: %s (Polygon (free) drawing with %d vertices)",ZoneName,#points)) +local Zone=ZONE_POLYGON:NewFromPointsArray(ZoneName,points) +Zone:SetColor({1,0,0},0.15) +Zone:SetFillColor({1,0,0},0.15) +if objectData.colorString then +local color=string.gsub(objectData.colorString,"^0x","") +local r=tonumber(string.sub(color,1,2),16)/255 +local g=tonumber(string.sub(color,3,4),16)/255 +local b=tonumber(string.sub(color,5,6),16)/255 +local a=tonumber(string.sub(color,7,8),16)/255 +Zone:SetColor({r,g,b},a) +end +if objectData.fillColorString then +local color=string.gsub(objectData.colorString,"^0x","") +local r=tonumber(string.sub(color,1,2),16)/255 +local g=tonumber(string.sub(color,3,4),16)/255 +local b=tonumber(string.sub(color,5,6),16)/255 +local a=tonumber(string.sub(color,7,8),16)/255 +Zone:SetFillColor({r,g,b},a) +end +self.ZONENAMES[ZoneName]=ZoneName +self:AddZone(ZoneName,Zone) +elseif objectData.polygonMode and objectData.polygonMode=="rect"then +local ZoneName=objectData.name or"Unknown rect Polygon Drawing" +local vec2={x=objectData.mapX,y=objectData.mapY} +local w=objectData.width +local h=objectData.height +local rotation=UTILS.ToRadian(objectData.angle or 0) +local sinRot=math.sin(rotation) +local cosRot=math.cos(rotation) +local dx=h/2 +local dy=w/2 +local points={ +{x=-dx*cosRot-(-dy*sinRot)+vec2.x,y=-dx*sinRot+(-dy*cosRot)+vec2.y}, +{x=dx*cosRot-(-dy*sinRot)+vec2.x,y=dx*sinRot+(-dy*cosRot)+vec2.y}, +{x=dx*cosRot-(dy*sinRot)+vec2.x,y=dx*sinRot+(dy*cosRot)+vec2.y}, +{x=-dx*cosRot-(dy*sinRot)+vec2.x,y=-dx*sinRot+(dy*cosRot)+vec2.y}, +} +self:I(string.format("Register ZONE: %s (Polygon (rect) drawing with %d vertices)",ZoneName,#points)) +local Zone=ZONE_POLYGON:NewFromPointsArray(ZoneName,points) +Zone:SetColor({1,0,0},0.15) +if objectData.colorString then +local color=string.gsub(objectData.colorString,"^0x","") +local r=tonumber(string.sub(color,1,2),16)/255 +local g=tonumber(string.sub(color,3,4),16)/255 +local b=tonumber(string.sub(color,5,6),16)/255 +local a=tonumber(string.sub(color,7,8),16)/255 +Zone:SetColor({r,g,b},a) +end +if objectData.fillColorString then +local color=string.gsub(objectData.colorString,"^0x","") +local r=tonumber(string.sub(color,1,2),16)/255 +local g=tonumber(string.sub(color,3,4),16)/255 +local b=tonumber(string.sub(color,5,6),16)/255 +local a=tonumber(string.sub(color,7,8),16)/255 +Zone:SetFillColor({r,g,b},a) +end +self.ZONENAMES[ZoneName]=ZoneName +self:AddZone(ZoneName,Zone) +elseif objectData.lineMode and(objectData.lineMode=="segments"or objectData.lineMode=="segment"or objectData.lineMode=="free")and objectData.points and#objectData.points>=2 then +local Name=objectData.name or"Unknown Line Drawing" +local vec2={x=objectData.mapX,y=objectData.mapY} +local points=UTILS.DeepCopy(objectData.points) +for i,_point in pairs(points)do +local point=_point +points[i]=UTILS.Vec2Add(point,vec2) +end +self:I(string.format("Register PATHLINE: %s (Line drawing with %d points)",Name,#points)) +local Pathline=PATHLINE:NewFromVec2Array(Name,points) +self:AddPathline(Name,Pathline) +end +end +end +end +end +end +do +function DATABASE:FindZoneGoal(ZoneName) +local ZoneFound=self.ZONES_GOAL[ZoneName] +return ZoneFound +end +function DATABASE:AddZoneGoal(ZoneName,Zone) +if not self.ZONES_GOAL[ZoneName]then +self.ZONES_GOAL[ZoneName]=Zone +end +end +function DATABASE:DeleteZoneGoal(ZoneName) +self.ZONES_GOAL[ZoneName]=nil +end +end +do +function DATABASE:FindOpsZone(ZoneName) +local ZoneFound=self.OPSZONES[ZoneName] +return ZoneFound +end +function DATABASE:AddOpsZone(OpsZone) +if OpsZone then +local ZoneName=OpsZone:GetName() +if not self.OPSZONES[ZoneName]then +self.OPSZONES[ZoneName]=OpsZone +end +end +end +function DATABASE:DeleteOpsZone(ZoneName) +self.OPSZONES[ZoneName]=nil +end +end +do +function DATABASE:AddCargo(Cargo) +if not self.CARGOS[Cargo.Name]then +self.CARGOS[Cargo.Name]=Cargo +end +end +function DATABASE:DeleteCargo(CargoName) +self.CARGOS[CargoName]=nil +end +function DATABASE:FindCargo(CargoName) +local CargoFound=self.CARGOS[CargoName] +return CargoFound +end +function DATABASE:IsCargo(TemplateName) +TemplateName=env.getValueDictByKey(TemplateName) +local Cargo=TemplateName:match("#(CARGO)") +return Cargo and Cargo=="CARGO" +end +function DATABASE:_RegisterCargos() +local Groups=UTILS.DeepCopy(self.GROUPS) +for CargoGroupName,CargoGroup in pairs(Groups)do +if self:IsCargo(CargoGroupName)then +local CargoInfo=CargoGroupName:match("#CARGO(.*)") +local CargoParam=CargoInfo and CargoInfo:match("%((.*)%)") +local CargoName1=CargoGroupName:match("(.*)#CARGO%(.*%)") +local CargoName2=CargoGroupName:match(".*#CARGO%(.*%)(.*)") +local CargoName=CargoName1..(CargoName2 or"") +local Type=CargoParam and CargoParam:match("T=([%a%d ]+),?") +local Name=CargoParam and CargoParam:match("N=([%a%d]+),?")or CargoName +local LoadRadius=CargoParam and tonumber(CargoParam:match("RR=([%a%d]+),?")) +local NearRadius=CargoParam and tonumber(CargoParam:match("NR=([%a%d]+),?")) +self:I({"Register CargoGroup:",Type=Type,Name=Name,LoadRadius=LoadRadius,NearRadius=NearRadius}) +CARGO_GROUP:New(CargoGroup,Type,Name,LoadRadius,NearRadius) +end +end +for CargoStaticName,CargoStatic in pairs(self.STATICS)do +if self:IsCargo(CargoStaticName)then +local CargoInfo=CargoStaticName:match("#CARGO(.*)") +local CargoParam=CargoInfo and CargoInfo:match("%((.*)%)") +local CargoName=CargoStaticName:match("(.*)#CARGO") +local Type=CargoParam and CargoParam:match("T=([%a%d ]+),?") +local Category=CargoParam and CargoParam:match("C=([%a%d ]+),?") +local Name=CargoParam and CargoParam:match("N=([%a%d]+),?")or CargoName +local LoadRadius=CargoParam and tonumber(CargoParam:match("RR=([%a%d]+),?")) +local NearRadius=CargoParam and tonumber(CargoParam:match("NR=([%a%d]+),?")) +if Category=="SLING"then +self:I({"Register CargoSlingload:",Type=Type,Name=Name,LoadRadius=LoadRadius,NearRadius=NearRadius}) +CARGO_SLINGLOAD:New(CargoStatic,Type,Name,LoadRadius,NearRadius) +else +if Category=="CRATE"then +self:I({"Register CargoCrate:",Type=Type,Name=Name,LoadRadius=LoadRadius,NearRadius=NearRadius}) +CARGO_CRATE:New(CargoStatic,Type,Name,LoadRadius,NearRadius) +end +end +end +end +end +end +function DATABASE:FindClient(ClientName) +local ClientFound=self.CLIENTS[ClientName] +return ClientFound +end +function DATABASE:AddClient(ClientName,Force) +local DCSUnitName=ClientName +if type(DCSUnitName)=="number"then DCSUnitName=string.format("%d",ClientName)end +if not self.CLIENTS[DCSUnitName]or Force==true then +self.CLIENTS[DCSUnitName]=CLIENT:Register(DCSUnitName) +end +return self.CLIENTS[DCSUnitName] +end +function DATABASE:FindGroup(GroupName) +if type(GroupName)~="string"or GroupName==""then return end +local GroupFound=self.GROUPS[GroupName] +if GroupFound==nil and GroupName~=nil and self.Templates.Groups[GroupName]==nil then +self:_RegisterDynamicGroup(GroupName) +return self.GROUPS[GroupName] +end +return GroupFound +end +function DATABASE:AddGroup(GroupName,force) +if not self.GROUPS[GroupName]or force==true then +self:T({"Add GROUP:",GroupName}) +self.GROUPS[GroupName]=GROUP:Register(GroupName) +end +return self.GROUPS[GroupName] +end +function DATABASE:AddPlayer(UnitName,PlayerName) +if type(UnitName)=="number"then UnitName=string.format("%d",UnitName)end +if PlayerName then +self:I({"Add player for unit:",UnitName,PlayerName}) +self.PLAYERS[PlayerName]=UnitName +self.PLAYERUNITS[PlayerName]=self:FindUnit(UnitName) +self.PLAYERSJOINED[PlayerName]=PlayerName +end +end +function DATABASE:_FindPlayerNameByUnitName(UnitName) +if UnitName then +for playername,unitname in pairs(self.PLAYERS)do +if unitname==UnitName and self.PLAYERUNITS[playername]and self.PLAYERUNITS[playername]:IsAlive()then +return playername,self.PLAYERUNITS[playername] +end +end +end +return nil +end +function DATABASE:DeletePlayer(UnitName,PlayerName) +if PlayerName then +self:T({"Clean player:",PlayerName}) +self.PLAYERS[PlayerName]=nil +self.PLAYERUNITS[PlayerName]=nil +end +end +function DATABASE:GetPlayers() +return self.PLAYERS +end +function DATABASE:GetPlayerUnits() +return self.PLAYERUNITS +end +function DATABASE:GetPlayersJoined() +return self.PLAYERSJOINED +end +function DATABASE:Spawn(SpawnTemplate) +self:F(SpawnTemplate.name) +self:T({SpawnTemplate.SpawnCountryID,SpawnTemplate.SpawnCategoryID}) +local SpawnCoalitionID=SpawnTemplate.CoalitionID +local SpawnCountryID=SpawnTemplate.CountryID +local SpawnCategoryID=SpawnTemplate.CategoryID +SpawnTemplate.CoalitionID=nil +SpawnTemplate.CountryID=nil +SpawnTemplate.CategoryID=nil +self:_RegisterGroupTemplate(SpawnTemplate,SpawnCoalitionID,SpawnCategoryID,SpawnCountryID,SpawnTemplate.name) +self:T3(SpawnTemplate) +coalition.addGroup(SpawnCountryID,SpawnCategoryID,SpawnTemplate) +SpawnTemplate.CoalitionID=SpawnCoalitionID +SpawnTemplate.CountryID=SpawnCountryID +SpawnTemplate.CategoryID=SpawnCategoryID +local SpawnGroup=self:AddGroup(SpawnTemplate.name) +for UnitID,UnitData in pairs(SpawnTemplate.units)do +self:AddUnit(UnitData.name) +end +return SpawnGroup +end +function DATABASE:SetStatusGroup(GroupName,Status) +self:F2(Status) +self.Templates.Groups[GroupName].Status=Status +end +function DATABASE:GetStatusGroup(GroupName) +self:F2(GroupName) +if self.Templates.Groups[GroupName]then +return self.Templates.Groups[GroupName].Status +else +return"" +end +end +function DATABASE:_RegisterGroupTemplate(GroupTemplate,CoalitionSide,CategoryID,CountryID,GroupName) +local GroupTemplateName=GroupName or env.getValueDictByKey(GroupTemplate.name) +if not self.Templates.Groups[GroupTemplateName]then +self.Templates.Groups[GroupTemplateName]={} +self.Templates.Groups[GroupTemplateName].Status=nil +end +if GroupTemplate.route and GroupTemplate.route.spans then +GroupTemplate.route.spans=nil +end +GroupTemplate.CategoryID=CategoryID +GroupTemplate.CoalitionID=CoalitionSide +GroupTemplate.CountryID=CountryID +self.Templates.Groups[GroupTemplateName].GroupName=GroupTemplateName +self.Templates.Groups[GroupTemplateName].Template=GroupTemplate +self.Templates.Groups[GroupTemplateName].groupId=GroupTemplate.groupId +self.Templates.Groups[GroupTemplateName].UnitCount=#GroupTemplate.units +self.Templates.Groups[GroupTemplateName].Units=GroupTemplate.units +self.Templates.Groups[GroupTemplateName].CategoryID=CategoryID +self.Templates.Groups[GroupTemplateName].CoalitionID=CoalitionSide +self.Templates.Groups[GroupTemplateName].CountryID=CountryID +local UnitNames={} +for unit_num,UnitTemplate in pairs(GroupTemplate.units)do +UnitTemplate.name=env.getValueDictByKey(UnitTemplate.name) +self.Templates.Units[UnitTemplate.name]={} +self.Templates.Units[UnitTemplate.name].UnitName=UnitTemplate.name +self.Templates.Units[UnitTemplate.name].Template=UnitTemplate +self.Templates.Units[UnitTemplate.name].GroupName=GroupTemplateName +self.Templates.Units[UnitTemplate.name].GroupTemplate=GroupTemplate +self.Templates.Units[UnitTemplate.name].GroupId=GroupTemplate.groupId +self.Templates.Units[UnitTemplate.name].CategoryID=CategoryID +self.Templates.Units[UnitTemplate.name].CoalitionID=CoalitionSide +self.Templates.Units[UnitTemplate.name].CountryID=CountryID +if UnitTemplate.skill and(UnitTemplate.skill=="Client"or UnitTemplate.skill=="Player")then +self.Templates.ClientsByName[UnitTemplate.name]=UnitTemplate +self.Templates.ClientsByName[UnitTemplate.name].CategoryID=CategoryID +self.Templates.ClientsByName[UnitTemplate.name].CoalitionID=CoalitionSide +self.Templates.ClientsByName[UnitTemplate.name].CountryID=CountryID +self.Templates.ClientsByID[UnitTemplate.unitId]=UnitTemplate +end +if UnitTemplate.AddPropAircraft then +if UnitTemplate.AddPropAircraft.STN_L16 then +local stn=UTILS.OctalToDecimal(UnitTemplate.AddPropAircraft.STN_L16) +if stn==nil or stn<1 then +self:E("WARNING: Invalid STN "..tostring(UnitTemplate.AddPropAircraft.STN_L16).." for "..UnitTemplate.name) +else +self.STNS[stn]=UnitTemplate.name +self:T("Register STN "..tostring(UnitTemplate.AddPropAircraft.STN_L16).." for "..UnitTemplate.name) +end +end +if UnitTemplate.AddPropAircraft.SADL_TN then +local sadl=UTILS.OctalToDecimal(UnitTemplate.AddPropAircraft.SADL_TN) +if sadl==nil or sadl<1 then +self:E("WARNING: Invalid SADL "..tostring(UnitTemplate.AddPropAircraft.SADL_TN).." for "..UnitTemplate.name) +else +self.SADL[sadl]=UnitTemplate.name +self:T("Register SADL "..tostring(UnitTemplate.AddPropAircraft.SADL_TN).." for "..UnitTemplate.name) +end +end +end +UnitNames[#UnitNames+1]=self.Templates.Units[UnitTemplate.name].UnitName +end +self:T({Group=self.Templates.Groups[GroupTemplateName].GroupName, +Coalition=self.Templates.Groups[GroupTemplateName].CoalitionID, +Category=self.Templates.Groups[GroupTemplateName].CategoryID, +Country=self.Templates.Groups[GroupTemplateName].CountryID, +Units=UnitNames +} +) +end +function DATABASE:GetNextSTN(octal,unitname) +local first=UTILS.OctalToDecimal(octal)or 0 +if self.STNS[first]==unitname then return octal end +local nextoctal=77777 +local found=false +if 32767-first<10 then +first=0 +end +for i=first+1,32767 do +if self.STNS[i]==nil then +found=true +nextoctal=UTILS.DecimalToOctal(i) +self.STNS[i]=unitname +self:T("Register STN "..tostring(nextoctal).." for "..unitname) +break +end +end +if not found then +self:E(string.format("WARNING: No next free STN past %05d found!",octal)) +local NewSTNS={} +for _id,_name in pairs(self.STNS)do +if self.UNITS[_name]~=nil then +NewSTNS[_id]=_name +end +end +self.STNS=nil +self.STNS=NewSTNS +end +return nextoctal +end +function DATABASE:GetNextSADL(octal,unitname) +local first=UTILS.OctalToDecimal(octal)or 0 +if self.SADL[first]==unitname then return octal end +local nextoctal=7777 +local found=false +if 4095-first<10 then +first=0 +end +for i=first+1,4095 do +if self.STNS[i]==nil then +found=true +nextoctal=UTILS.DecimalToOctal(i) +self.SADL[i]=unitname +self:T("Register SADL "..tostring(nextoctal).." for "..unitname) +break +end +end +if not found then +self:E(string.format("WARNING: No next free SADL past %04d found!",octal)) +local NewSTNS={} +for _id,_name in pairs(self.SADL)do +if self.UNITS[_name]~=nil then +NewSTNS[_id]=_name +end +end +self.SADL=nil +self.SADL=NewSTNS +end +return nextoctal +end +function DATABASE:GetGroupTemplate(GroupName) +local GroupTemplate=nil +if self.Templates.Groups[GroupName]then +GroupTemplate=self.Templates.Groups[GroupName].Template +GroupTemplate.SpawnCoalitionID=self.Templates.Groups[GroupName].CoalitionID +GroupTemplate.SpawnCategoryID=self.Templates.Groups[GroupName].CategoryID +GroupTemplate.SpawnCountryID=self.Templates.Groups[GroupName].CountryID +end +return GroupTemplate +end +function DATABASE:_RegisterStaticTemplate(StaticTemplate,CoalitionID,CategoryID,CountryID) +local StaticTemplate=UTILS.DeepCopy(StaticTemplate) +local StaticTemplateGroupName=env.getValueDictByKey(StaticTemplate.name) +local StaticTemplateName=StaticTemplate.units[1].name +self.Templates.Statics[StaticTemplateName]=self.Templates.Statics[StaticTemplateName]or{} +StaticTemplate.CategoryID=CategoryID +StaticTemplate.CoalitionID=CoalitionID +StaticTemplate.CountryID=CountryID +self.Templates.Statics[StaticTemplateName].StaticName=StaticTemplateGroupName +self.Templates.Statics[StaticTemplateName].GroupTemplate=StaticTemplate +self.Templates.Statics[StaticTemplateName].UnitTemplate=StaticTemplate.units[1] +self.Templates.Statics[StaticTemplateName].CategoryID=CategoryID +self.Templates.Statics[StaticTemplateName].CoalitionID=CoalitionID +self.Templates.Statics[StaticTemplateName].CountryID=CountryID +self:T({Static=self.Templates.Statics[StaticTemplateName].StaticName, +Coalition=self.Templates.Statics[StaticTemplateName].CoalitionID, +Category=self.Templates.Statics[StaticTemplateName].CategoryID, +Country=self.Templates.Statics[StaticTemplateName].CountryID +} +) +self:AddStatic(StaticTemplateName) +return self +end +function DATABASE:_GetGenericStaticCargoGroupTemplate(Name,Typename,Mass,Coalition,Country) +local StaticTemplate={} +StaticTemplate.name=Name or"None" +StaticTemplate.units={[1]={ +name=Name, +resourcePayload={ +["weapons"]={}, +["aircrafts"]={}, +["gasoline"]=0, +["diesel"]=0, +["methanol_mixture"]=0, +["jet_fuel"]=0, +}, +["mass"]=Mass or 0, +["category"]="Cargos", +["canCargo"]=true, +["type"]=Typename or"container_cargo", +["rate"]=100, +["y"]=0, +["x"]=0, +["heading"]=0, +}} +StaticTemplate.CategoryID="static" +StaticTemplate.CoalitionID=Coalition or coalition.side.BLUE +StaticTemplate.CountryID=Country or country.id.GERMANY +return StaticTemplate +end +function DATABASE:GetStaticGroupTemplate(StaticName) +if self.Templates.Statics[StaticName]then +local StaticTemplate=self.Templates.Statics[StaticName].GroupTemplate +return StaticTemplate,self.Templates.Statics[StaticName].CoalitionID,self.Templates.Statics[StaticName].CategoryID,self.Templates.Statics[StaticName].CountryID +else +self:E("ERROR: Static group template does NOT exist for static "..tostring(StaticName)) +return nil +end +end +function DATABASE:GetStaticUnitTemplate(StaticName) +if self.Templates.Statics[StaticName]then +local UnitTemplate=self.Templates.Statics[StaticName].UnitTemplate +return UnitTemplate,self.Templates.Statics[StaticName].CoalitionID,self.Templates.Statics[StaticName].CategoryID,self.Templates.Statics[StaticName].CountryID +else +self:E("ERROR: Static unit template does NOT exist for static "..tostring(StaticName)) +return nil +end +end +function DATABASE:GetGroupNameFromUnitName(UnitName) +if self.Templates.Units[UnitName]then +return self.Templates.Units[UnitName].GroupName +else +self:E("ERROR: Unit template does not exist for unit "..tostring(UnitName)) +return nil +end +end +function DATABASE:GetGroupTemplateFromUnitName(UnitName) +if self.Templates.Units[UnitName]then +return self.Templates.Units[UnitName].GroupTemplate +else +self:E("ERROR: Unit template does not exist for unit "..tostring(UnitName)) +return nil +end +end +function DATABASE:GetUnitTemplateFromUnitName(UnitName) +if self.Templates.Units[UnitName]then +return self.Templates.Units[UnitName] +else +self:E("ERROR: Unit template does not exist for unit "..tostring(UnitName)) +return nil +end +end +function DATABASE:GetCoalitionFromClientTemplate(ClientName) +if self.Templates.ClientsByName[ClientName]then +return self.Templates.ClientsByName[ClientName].CoalitionID +end +self:T("WARNING: Template does not exist for client "..tostring(ClientName)) +return nil +end +function DATABASE:GetCategoryFromClientTemplate(ClientName) +if self.Templates.ClientsByName[ClientName]then +return self.Templates.ClientsByName[ClientName].CategoryID +end +self:T("WARNING: Template does not exist for client "..tostring(ClientName)) +return nil +end +function DATABASE:GetCountryFromClientTemplate(ClientName) +if self.Templates.ClientsByName[ClientName]then +return self.Templates.ClientsByName[ClientName].CountryID +end +self:T("WARNING: Template does not exist for client "..tostring(ClientName)) +return nil +end +function DATABASE:GetCoalitionFromAirbase(AirbaseName) +return self.AIRBASES[AirbaseName]:GetCoalition() +end +function DATABASE:GetCategoryFromAirbase(AirbaseName) +return self.AIRBASES[AirbaseName]:GetAirbaseCategory() +end +function DATABASE:_RegisterPlayers() +local CoalitionsData={AlivePlayersRed=coalition.getPlayers(coalition.side.RED),AlivePlayersBlue=coalition.getPlayers(coalition.side.BLUE),AlivePlayersNeutral=coalition.getPlayers(coalition.side.NEUTRAL)} +for CoalitionId,CoalitionData in pairs(CoalitionsData)do +for UnitId,UnitData in pairs(CoalitionData)do +self:T3({"UnitData:",UnitData}) +if UnitData and UnitData:isExist()then +local UnitName=UnitData:getName() +local PlayerName=UnitData:getPlayerName() +if not self.PLAYERS[PlayerName]then +self:I({"Add player for unit:",UnitName,PlayerName}) +self:AddPlayer(UnitName,PlayerName) +end +end +end +end +return self +end +function DATABASE:_RegisterDynamicGroup(Groupname) +local DCSGroup=Group.getByName(Groupname) +if DCSGroup and DCSGroup:isExist()then +local DCSGroupName=DCSGroup:getName() +self:I(string.format("Register Group: %s",tostring(DCSGroupName))) +self:AddGroup(DCSGroupName,true) +for DCSUnitId,DCSUnit in pairs(DCSGroup:getUnits())do +local DCSUnitName=DCSUnit:getName() +self:I(string.format("Register Unit: %s",tostring(DCSUnitName))) +self:AddUnit(tostring(DCSUnitName),true) +end +else +self:E({"Group does not exist: ",DCSGroup}) +end +return self +end +function DATABASE:_RegisterGroupsAndUnits() +local CoalitionsData={GroupsRed=coalition.getGroups(coalition.side.RED),GroupsBlue=coalition.getGroups(coalition.side.BLUE),GroupsNeutral=coalition.getGroups(coalition.side.NEUTRAL)} +for CoalitionId,CoalitionData in pairs(CoalitionsData)do +for DCSGroupId,DCSGroup in pairs(CoalitionData)do +if DCSGroup:isExist()then +local DCSGroupName=DCSGroup:getName() +self:I(string.format("Register Group: %s",tostring(DCSGroupName))) +self:AddGroup(DCSGroupName) +for DCSUnitId,DCSUnit in pairs(DCSGroup:getUnits())do +local DCSUnitName=DCSUnit:getName() +self:I(string.format("Register Unit: %s",tostring(DCSUnitName))) +self:AddUnit(DCSUnitName) +end +else +self:E({"Group does not exist: ",DCSGroup}) +end +end +end +return self +end +function DATABASE:_RegisterClients() +for ClientName,ClientTemplate in pairs(self.Templates.ClientsByName)do +self:I(string.format("Register Client: %s",tostring(ClientName))) +local client=self:AddClient(ClientName) +client.SpawnCoord=COORDINATE:New(ClientTemplate.x,ClientTemplate.alt,ClientTemplate.y) +end +return self +end +function DATABASE:_RegisterStatics() +local CoalitionsData={GroupsRed=coalition.getStaticObjects(coalition.side.RED),GroupsBlue=coalition.getStaticObjects(coalition.side.BLUE),GroupsNeutral=coalition.getStaticObjects(coalition.side.NEUTRAL)} +for CoalitionId,CoalitionData in pairs(CoalitionsData)do +for DCSStaticId,DCSStatic in pairs(CoalitionData)do +if DCSStatic:isExist()then +local DCSStaticName=DCSStatic:getName() +self:I(string.format("Register Static: %s",tostring(DCSStaticName))) +self:AddStatic(DCSStaticName) +else +self:E({"Static does not exist: ",DCSStatic}) +end +end +end +return self +end +function DATABASE:_RegisterAirbases() +for DCSAirbaseId,DCSAirbase in pairs(world.getAirbases())do +self:_RegisterAirbase(DCSAirbase) +end +return self +end +function DATABASE:_RegisterAirbase(airbase) +local IsSyria=UTILS.GetDCSMap()=="Syria"and true or false +local countHSyria=0 +if airbase then +local DCSAirbaseName=airbase:getName() +if IsSyria and DCSAirbaseName=="H"and countHSyria>0 then +return self +elseif IsSyria and DCSAirbaseName=="H"and countHSyria==0 then +countHSyria=countHSyria+1 +end +local airbaseID=airbase:getID() +local airbase=self:AddAirbase(DCSAirbaseName) +local airbaseUID=airbase:GetID(true) +local typename=airbase:GetTypeName() +local category=airbase.category +if category==Airbase.Category.SHIP and typename=="FARP_SINGLE_01"then +category=Airbase.Category.HELIPAD +end +local text=string.format("Register %s: %s (UID=%d), Runways=%d, Parking=%d [",AIRBASE.CategoryName[category],tostring(DCSAirbaseName),airbaseUID,#airbase.runways,airbase.NparkingTotal) +for _,terminalType in pairs(AIRBASE.TerminalType)do +if airbase.NparkingTerminal and airbase.NparkingTerminal[terminalType]then +text=text..string.format("%d=%d ",terminalType,airbase.NparkingTerminal[terminalType]) +end +end +text=text.."]" +self:I(text) +end +return self +end +function DATABASE:_EventOnBirth(Event) +self:T({Event}) +if Event.IniDCSUnit then +if Event.IniObjectCategory==Object.Category.STATIC then +self:AddStatic(Event.IniDCSUnitName) +elseif Event.IniObjectCategory==Object.Category.CARGO and string.match(Event.IniUnitName,".+|%d%d:%d%d|PKG%d+")then +local cargo=self:AddDynamicCargo(Event.IniDCSUnitName) +self:I(string.format("Adding dynamic cargo %s",tostring(Event.IniDCSUnitName))) +self:CreateEventNewDynamicCargo(cargo) +else +if Event.IniObjectCategory==Object.Category.UNIT then +self:AddUnit(Event.IniDCSUnitName) +self:AddGroup(Event.IniDCSGroupName) +local DCSAirbase=Airbase.getByName(Event.IniDCSUnitName) +if DCSAirbase then +self:I(string.format("Adding airbase %s",tostring(Event.IniDCSUnitName))) +self:AddAirbase(Event.IniDCSUnitName) +end +end +end +if Event.IniObjectCategory==Object.Category.UNIT then +Event.IniGroup=self:FindGroup(Event.IniDCSGroupName) +Event.IniUnit=self:FindUnit(Event.IniDCSUnitName) +local client=self.CLIENTS[Event.IniDCSUnitName] +if client then +end +local PlayerName=Event.IniUnit:GetPlayerName() +if PlayerName then +self:I(string.format("Player '%s' joined unit '%s' (%s) of group '%s'",tostring(PlayerName),tostring(Event.IniDCSUnitName),tostring(Event.IniTypeName),tostring(Event.IniDCSGroupName))) +if client==nil or(client and client:CountPlayers()==0)then +client=self:AddClient(Event.IniDCSUnitName,true) +end +client:AddPlayer(PlayerName) +if not self.PLAYERS[PlayerName]then +self:AddPlayer(Event.IniUnitName,PlayerName) +end +local function SetPlayerSettings(self,PlayerName,IniUnit) +local Settings=SETTINGS:Set(PlayerName) +Settings:SetPlayerMenu(IniUnit) +self:CreateEventPlayerEnterAircraft(IniUnit) +end +self:ScheduleOnce(1,SetPlayerSettings,self,PlayerName,Event.IniUnit) +end +end +end +end +function DATABASE:_EventOnDeadOrCrash(Event) +if Event.IniDCSUnit then +local name=Event.IniDCSUnitName +if Event.IniObjectCategory==3 then +if self.STATICS[Event.IniDCSUnitName]then +self:DeleteStatic(Event.IniDCSUnitName) +end +if self.UNITS[Event.IniDCSUnitName]then +self:T("STATIC Event for UNIT "..tostring(Event.IniDCSUnitName)) +local DCSUnit=_DATABASE:FindUnit(Event.IniDCSUnitName) +self:T({DCSUnit}) +if DCSUnit then +return +end +end +else +if Event.IniObjectCategory==1 then +if self.UNITS[Event.IniDCSUnitName]then +self:ScheduleOnce(1,self.DeleteUnit,self,Event.IniDCSUnitName) +end +local client=self.CLIENTS[name] +if client then +client:RemovePlayers() +end +end +end +local airbase=self.AIRBASES[Event.IniDCSUnitName] +if airbase and(airbase:IsHelipad()or airbase:IsShip())then +self:DeleteAirbase(Event.IniDCSUnitName) +end +end +self:AccountDestroys(Event) +end +function DATABASE:_EventOnPlayerEnterUnit(Event) +self:F2({Event}) +if Event.IniDCSUnit then +if Event.IniObjectCategory==1 and Event.IniGroup and Event.IniGroup:IsGround()then +local IsPlayer=Event.IniDCSUnit:getPlayerName() +if IsPlayer then +self:I(string.format("Player '%s' joined GROUND unit '%s' of group '%s'",tostring(Event.IniPlayerName),tostring(Event.IniDCSUnitName),tostring(Event.IniDCSGroupName))) +local client=self.CLIENTS[Event.IniDCSUnitName] +if not client then +client=self:AddClient(Event.IniDCSUnitName) +end +client:AddPlayer(Event.IniPlayerName) +if not self.PLAYERS[Event.IniPlayerName]then +self:AddPlayer(Event.IniUnitName,Event.IniPlayerName) +end +local Settings=SETTINGS:Set(Event.IniPlayerName) +Settings:SetPlayerMenu(Event.IniUnit) +end +end +end +end +function DATABASE:_EventOnDynamicCargoRemoved(Event) +self:T({Event}) +if Event.IniDynamicCargoName then +self:DeleteDynamicCargo(Event.IniDynamicCargoName) +end +end +function DATABASE:_EventOnPlayerLeaveUnit(Event) +self:F2({Event}) +local function FindPlayerName(UnitName) +local playername=nil +for _name,_unitname in pairs(self.PLAYERS)do +if _unitname==UnitName then +playername=_name +break +end +end +return playername +end +if Event.IniUnit then +if Event.IniObjectCategory==1 then +local PlayerName=Event.IniPlayerName or Event.IniUnit:GetPlayerName()or FindPlayerName(Event.IniUnitName) +if PlayerName then +self:I(string.format("Player '%s' left unit %s",tostring(PlayerName),tostring(Event.IniUnitName))) +local Settings=SETTINGS:Set(PlayerName) +Settings:RemovePlayerMenu(Event.IniUnit) +self:DeletePlayer(Event.IniUnit,PlayerName) +local client=self.CLIENTS[Event.IniDCSUnitName] +if client then +client:RemovePlayer(PlayerName) +end +end +end +end +end +function DATABASE:ForEach(IteratorFunction,FinalizeFunction,arg,Set) +self:F2(arg) +local function CoRoutine() +local Count=0 +for ObjectID,Object in pairs(Set)do +self:T2(Object) +IteratorFunction(Object,unpack(arg)) +Count=Count+1 +end +return true +end +local co=CoRoutine +local function Schedule() +local status,res=co() +self:T3({status,res}) +if status==false then +error(res) +end +if res==false then +return true +end +if FinalizeFunction then +FinalizeFunction(unpack(arg)) +end +return false +end +Schedule() +return self +end +function DATABASE:ForEachStatic(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.STATICS) +return self +end +function DATABASE:ForEachUnit(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.UNITS) +return self +end +function DATABASE:ForEachGroup(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.GROUPS) +return self +end +function DATABASE:ForEachPlayer(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.PLAYERS) +return self +end +function DATABASE:ForEachPlayerJoined(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.PLAYERSJOINED) +return self +end +function DATABASE:ForEachPlayerUnit(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.PLAYERUNITS) +return self +end +function DATABASE:ForEachClient(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.CLIENTS) +return self +end +function DATABASE:ForEachCargo(IteratorFunction,FinalizeFunction,...) +self:F2(arg) +self:ForEach(IteratorFunction,FinalizeFunction,arg,self.CARGOS) +return self +end +function DATABASE:OnEventNewCargo(EventData) +self:F2({EventData}) +if EventData.Cargo then +self:AddCargo(EventData.Cargo) +end +end +function DATABASE:OnEventDeleteCargo(EventData) +self:F2({EventData}) +if EventData.Cargo then +self:DeleteCargo(EventData.Cargo.Name) +end +end +function DATABASE:OnEventNewZone(EventData) +self:F2({EventData}) +if EventData.Zone then +self:AddZone(EventData.Zone.ZoneName,EventData.Zone) +end +end +function DATABASE:OnEventDeleteZone(EventData) +self:F2({EventData}) +if EventData.Zone then +self:DeleteZone(EventData.Zone.ZoneName) +end +end +function DATABASE:GetPlayerSettings(PlayerName) +self:F2({PlayerName}) +return self.PLAYERSETTINGS[PlayerName] +end +function DATABASE:SetPlayerSettings(PlayerName,Settings) +self:F2({PlayerName,Settings}) +self.PLAYERSETTINGS[PlayerName]=Settings +end +function DATABASE:AddOpsGroup(opsgroup) +self.FLIGHTGROUPS[opsgroup.groupname]=opsgroup +end +function DATABASE:GetOpsGroup(groupname) +if type(groupname)=="string"then +else +groupname=groupname:GetName() +end +return self.FLIGHTGROUPS[groupname] +end +function DATABASE:FindOpsGroup(groupname) +if type(groupname)=="string"then +else +groupname=groupname:GetName() +end +return self.FLIGHTGROUPS[groupname] +end +function DATABASE:FindOpsGroupFromUnit(unitname) +local unit=nil +local groupname +if type(unitname)=="string"then +unit=UNIT:FindByName(unitname) +else +unit=unitname +end +if unit then +groupname=unit:GetGroup():GetName() +end +if groupname then +return self.FLIGHTGROUPS[groupname] +else +return nil +end +end +function DATABASE:AddFlightControl(flightcontrol) +self:F2({flightcontrol}) +self.FLIGHTCONTROLS[flightcontrol.airbasename]=flightcontrol +end +function DATABASE:GetFlightControl(airbasename) +return self.FLIGHTCONTROLS[airbasename] +end +function DATABASE:_RegisterTemplates() +self:F2() +self.Navpoints={} +self.UNITS={} +for CoalitionName,coa_data in pairs(env.mission.coalition)do +self:T({CoalitionName=CoalitionName}) +if(CoalitionName=='red'or CoalitionName=='blue'or CoalitionName=='neutrals')and type(coa_data)=='table'then +local CoalitionSide=coalition.side[string.upper(CoalitionName)] +if CoalitionName=="red"then +CoalitionSide=coalition.side.RED +elseif CoalitionName=="blue"then +CoalitionSide=coalition.side.BLUE +else +CoalitionSide=coalition.side.NEUTRAL +end +self.Navpoints[CoalitionName]={} +if coa_data.nav_points then +for nav_ind,nav_data in pairs(coa_data.nav_points)do +if type(nav_data)=='table'then +self.Navpoints[CoalitionName][nav_ind]=UTILS.DeepCopy(nav_data) +self.Navpoints[CoalitionName][nav_ind]['name']=nav_data.callsignStr +self.Navpoints[CoalitionName][nav_ind]['point']={} +self.Navpoints[CoalitionName][nav_ind]['point']['x']=nav_data.x +self.Navpoints[CoalitionName][nav_ind]['point']['y']=0 +self.Navpoints[CoalitionName][nav_ind]['point']['z']=nav_data.y +end +end +end +if coa_data.country then +for cntry_id,cntry_data in pairs(coa_data.country)do +local CountryName=string.upper(cntry_data.name) +local CountryID=cntry_data.id +self.COUNTRY_ID[CountryName]=CountryID +self.COUNTRY_NAME[CountryID]=CountryName +if type(cntry_data)=='table'then +for obj_type_name,obj_type_data in pairs(cntry_data)do +if obj_type_name=="helicopter"or obj_type_name=="ship"or obj_type_name=="plane"or obj_type_name=="vehicle"or obj_type_name=="static"then +local CategoryName=obj_type_name +if((type(obj_type_data)=='table')and obj_type_data.group and(type(obj_type_data.group)=='table')and(#obj_type_data.group>0))then +for group_num,Template in pairs(obj_type_data.group)do +if obj_type_name~="static"and Template and Template.units and type(Template.units)=='table'then +self:_RegisterGroupTemplate(Template,CoalitionSide,_DATABASECategory[string.lower(CategoryName)],CountryID) +else +self:_RegisterStaticTemplate(Template,CoalitionSide,_DATABASECategory[string.lower(CategoryName)],CountryID) +end +end +end +end +end +end +end +end +end +end +return self +end +function DATABASE:AccountHits(Event) +self:F({Event}) +if Event.IniPlayerName~=nil then +self:T("Hitting Something") +if Event.TgtCategory then +self.HITS[Event.TgtUnitName]=self.HITS[Event.TgtUnitName]or{} +local Hit=self.HITS[Event.TgtUnitName] +Hit.Players=Hit.Players or{} +Hit.Players[Event.IniPlayerName]=true +end +end +if Event.WeaponPlayerName~=nil then +self:T("Hitting Scenery") +if Event.TgtCategory then +if Event.WeaponCoalition then +self.HITS[Event.TgtUnitName]=self.HITS[Event.TgtUnitName]or{} +local Hit=self.HITS[Event.TgtUnitName] +Hit.Players=Hit.Players or{} +Hit.Players[Event.WeaponPlayerName]=true +else +end +end +end +end +function DATABASE:AccountDestroys(Event) +self:F({Event}) +local TargetUnit=nil +local TargetGroup=nil +local TargetUnitName="" +local TargetGroupName="" +local TargetPlayerName="" +local TargetCoalition=nil +local TargetCategory=nil +local TargetType=nil +local TargetUnitCoalition=nil +local TargetUnitCategory=nil +local TargetUnitType=nil +if Event.IniDCSUnit then +TargetUnit=Event.IniUnit +TargetUnitName=Event.IniDCSUnitName +TargetGroup=Event.IniDCSGroup +TargetGroupName=Event.IniDCSGroupName +TargetPlayerName=Event.IniPlayerName +TargetCoalition=Event.IniCoalition +TargetCategory=Event.IniCategory +TargetType=Event.IniTypeName +TargetUnitType=TargetType +self:T({TargetUnitName,TargetGroupName,TargetPlayerName,TargetCoalition,TargetCategory,TargetType}) +end +local Destroyed=false +if self.HITS[Event.IniUnitName]then +self.DESTROYS[Event.IniUnitName]=self.DESTROYS[Event.IniUnitName]or{} +self.DESTROYS[Event.IniUnitName]=true +end +end +do +SET_BASE={ +ClassName="SET_BASE", +Filter={}, +Set={}, +List={}, +Index={}, +Database=nil, +CallScheduler=nil, +} +function SET_BASE:New(Database) +local self=BASE:Inherit(self,FSM:New()) +self.Database=Database +self:SetStartState("Started") +self:AddTransition("*","Added","*") +self:AddTransition("*","Removed","*") +self.YieldInterval=10 +self.TimeInterval=0.001 +self.Set={} +self.Index={} +self.CallScheduler=SCHEDULER:New(self) +self:SetEventPriority(2) +return self +end +function SET_BASE:FilterFunction(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +if not self.Filter.Functions then self.Filter.Functions={}end +table.insert(self.Filter.Functions,condition) +return self +end +function SET_BASE:_EvalFilterFunctions(Object) +for _,_condition in pairs(self.Filter.Functions or{})do +local condition=_condition +if condition.func(Object,unpack(condition.arg))==false then +return false +end +end +return true +end +function SET_BASE:Clear(TriggerEvent) +for Name,Object in pairs(self.Set)do +self:Remove(Name,not TriggerEvent) +end +return self +end +function SET_BASE:_Find(ObjectName) +local ObjectFound=self.Set[ObjectName] +return ObjectFound +end +function SET_BASE:GetSet() +return self.Set or{} +end +function SET_BASE:GetSetNames() +local Names={} +for Name,Object in pairs(self.Set)do +table.insert(Names,Name) +end +return Names +end +function SET_BASE:GetSetObjects() +local Objects={} +for Name,Object in pairs(self.Set)do +table.insert(Objects,Object) +end +return Objects +end +function SET_BASE:Remove(ObjectName,NoTriggerEvent) +local TriggerEvent=true +if NoTriggerEvent then +TriggerEvent=false +else +TriggerEvent=true +end +local Object=self.Set[ObjectName] +if Object then +for Index,Key in ipairs(self.Index)do +if Key==ObjectName then +table.remove(self.Index,Index) +self.Set[ObjectName]=nil +break +end +end +if TriggerEvent then +self:Removed(ObjectName,Object) +end +end +end +function SET_BASE:Add(ObjectName,Object) +if not ObjectName or ObjectName==""then +self:E("SET_BASE:Add - Invalid ObjectName handed") +self:E({ObjectName=ObjectName,Object=Object}) +return self +end +if self.Set[ObjectName]then +self:Remove(ObjectName,true) +end +self.Set[ObjectName]=Object +table.insert(self.Index,ObjectName) +self:Added(ObjectName,Object) +return self +end +function SET_BASE:AddObject(Object) +self:Add(Object.ObjectName,Object) +end +function SET_BASE:SortByName() +local function sort(a,b) +return a<b +end +table.sort(self.Index) +end +function SET_BASE:AddSet(SetToAdd) +if not SetToAdd then return self end +for _,ObjectB in pairs(SetToAdd.Set)do +self:AddObject(ObjectB) +end +return self +end +function SET_BASE:GetSetUnion(SetB) +local union=SET_BASE:New() +for _,ObjectA in pairs(self.Set)do +union:AddObject(ObjectA) +end +for _,ObjectB in pairs(SetB.Set)do +union:AddObject(ObjectB) +end +return union +end +function SET_BASE:GetSetIntersection(SetB) +local intersection=SET_BASE:New() +local union=self:GetSetUnion(SetB) +for _,Object in pairs(union.Set)do +if self:IsIncludeObject(Object)and SetB:IsIncludeObject(Object)then +intersection:AddObject(Object) +end +end +return intersection +end +function SET_BASE:GetSetComplement(SetB) +local complement=self:GetSetUnion(SetB) +local intersection=self:GetSetIntersection(SetB) +for _,Object in pairs(intersection.Set)do +complement:Remove(Object.ObjectName,true) +end +return complement +end +function SET_BASE:CompareSets(SetA,SetB) +for _,ObjectB in pairs(SetB.Set)do +if SetA:IsIncludeObject(ObjectB)then +SetA:Add(ObjectB) +end +end +return SetA +end +function SET_BASE:Get(ObjectName) +local Object=self.Set[ObjectName] +return Object +end +function SET_BASE:GetFirst() +local ObjectName=self.Index[1] +local FirstObject=self.Set[ObjectName] +return FirstObject +end +function SET_BASE:GetLast() +local tablemax=table.maxn(self.Index) +local ObjectName=self.Index[tablemax] +local LastObject=self.Set[ObjectName] +return LastObject +end +function SET_BASE:GetRandom() +local tablemax=0 +for _,_ind in pairs(self.Index)do +tablemax=tablemax+1 +end +local RandomItem=self.Set[self.Index[math.random(1,tablemax)]] +return RandomItem +end +function SET_BASE:GetRandomSurely() +local tablemax=0 +local sorted={} +for _,_obj in pairs(self.Set)do +tablemax=tablemax+1 +sorted[tablemax]=_obj +end +local RandomItem=sorted[math.random(1,tablemax)] +return RandomItem +end +function SET_BASE:Count() +return self.Index and table.maxn(self.Index)or 0 +end +function SET_BASE:SetDatabase(BaseSet) +local OtherFilter=UTILS.DeepCopy(BaseSet.Filter) +self.Filter=OtherFilter +self.Database=BaseSet:GetSet() +return self +end +function SET_BASE:SetSomeIteratorLimit(Limit) +self.SomeIteratorLimit=Limit or 1 +return self +end +function SET_BASE:GetSomeIteratorLimit() +return self.SomeIteratorLimit or self:Count() +end +function SET_BASE:GetThreatLevelMax() +local ThreatMax=0 +for _,_unit in pairs(self.Set or{})do +local unit=_unit +local threat=unit.GetThreatLevel and unit:GetThreatLevel()or 0 +if threat>ThreatMax then +ThreatMax=threat +end +end +return ThreatMax +end +function SET_BASE:FilterOnce() +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:Remove(ObjectName,true) +end +end +return self +end +function SET_BASE:FilterClear() +for key,value in pairs(self.Filter)do +self.Filter[key]={} +end +return self +end +function SET_BASE:_FilterStart() +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +end +end +return self +end +function SET_BASE:FilterDeads() +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +return self +end +function SET_BASE:FilterCrashes() +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +return self +end +function SET_BASE:FilterStop() +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +return self +end +function SET_BASE:FindNearestObjectFromPointVec2(Coordinate) +local NearestObject=nil +local ClosestDistance=nil +for ObjectID,ObjectData in pairs(self.Set)do +if NearestObject==nil then +NearestObject=ObjectData +ClosestDistance=Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) +else +local Distance=Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) +if Distance<ClosestDistance then +NearestObject=ObjectData +ClosestDistance=Distance +end +end +end +return NearestObject +end +function SET_BASE:_EventOnBirth(Event) +if Event.IniDCSUnit then +local ObjectName,Object=self:AddInDatabase(Event) +if Object and self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +end +end +end +function SET_BASE:_EventOnDeadOrCrash(Event) +if Event.IniDCSUnit then +local ObjectName,Object=self:FindInDatabase(Event) +if ObjectName then +self:Remove(ObjectName) +end +end +end +function SET_BASE:ForEach(IteratorFunction,arg,Set,Function,FunctionArguments) +Set=Set or self:GetSet() +arg=arg or{} +local function CoRoutine() +local Count=0 +for ObjectID,ObjectData in pairs(Set)do +local Object=ObjectData +if Function then +if Function(unpack(FunctionArguments or{}),Object)==true then +IteratorFunction(Object,unpack(arg)) +end +else +IteratorFunction(Object,unpack(arg)) +end +Count=Count+1 +end +return true +end +local co=CoRoutine +local function Schedule() +local status,res=co() +if status==false then +error(res) +end +if res==false then +return true +end +return false +end +Schedule() +return self +end +function SET_BASE:ForSome(IteratorFunction,arg,Set,Function,FunctionArguments) +Set=Set or self:GetSet() +arg=arg or{} +local Limit=self:GetSomeIteratorLimit() +local function CoRoutine() +local Count=0 +for ObjectID,ObjectData in pairs(Set)do +local Object=ObjectData +if Function then +if Function(unpack(FunctionArguments),Object)==true then +IteratorFunction(Object,unpack(arg)) +end +else +IteratorFunction(Object,unpack(arg)) +end +Count=Count+1 +if Count>=Limit then +break +end +end +return true +end +local co=CoRoutine +local function Schedule() +local status,res=co() +if status==false then +error(res) +end +if res==false then +return true +end +return false +end +Schedule() +return self +end +function SET_BASE:IsIncludeObject(Object) +return true +end +function SET_BASE:IsInSet(Object) +local outcome=false +local name=Object:GetName() +self:ForEach( +function(object) +if object:GetName()==name then +outcome=true +end +end +) +return outcome +end +function SET_BASE:IsNotInSet(Object) +return not self:IsInSet(Object) +end +function SET_BASE:GetObjectNames() +local ObjectNames="" +for ObjectName,Object in pairs(self.Set)do +ObjectNames=ObjectNames..ObjectName..", " +end +return ObjectNames +end +function SET_BASE:Flush(MasterObject) +local ObjectNames="" +for ObjectName,Object in pairs(self.Set)do +ObjectNames=ObjectNames..ObjectName..", " +end +return ObjectNames +end +function SET_BASE:GetAliveSet() +local AliveSet={} +for ObjectName,Object in pairs(self.Set)do +if Object then +if Object:IsAlive()then +AliveSet[#AliveSet+1]=Object +end +end +end +return AliveSet or{} +end +end +do +SET_GROUP={ +ClassName="SET_GROUP", +Filter={ +Coalitions=nil, +Categories=nil, +Countries=nil, +GroupPrefixes=nil, +Zones=nil, +Functions=nil, +Alive=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Group.Category.AIRPLANE, +helicopter=Group.Category.HELICOPTER, +ground=Group.Category.GROUND, +ship=Group.Category.SHIP, +structure=Group.Category.STRUCTURE, +}, +}, +} +function SET_GROUP:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.GROUPS)) +self:FilterActive(false) +return self +end +function SET_GROUP:GetAliveSet() +local AliveSet={} +for GroupName,GroupObject in pairs(self.Set)do +local GroupObject=GroupObject +if GroupObject then +if GroupObject:IsAlive()then +AliveSet[GroupName]=GroupObject +end +end +end +return AliveSet or{} +end +function SET_GROUP:GetUnitTypeNames() +local MT={} +local UnitTypes={} +local ReportUnitTypes=REPORT:New() +for GroupID,GroupData in pairs(self:GetSet())do +local Units=GroupData:GetUnits() +for UnitID,UnitData in pairs(Units)do +if UnitData:IsAlive()then +local UnitType=UnitData:GetTypeName() +if not UnitTypes[UnitType]then +UnitTypes[UnitType]=1 +else +UnitTypes[UnitType]=UnitTypes[UnitType]+1 +end +end +end +end +for UnitTypeID,UnitType in pairs(UnitTypes)do +ReportUnitTypes:Add(UnitType.." of "..UnitTypeID) +end +return ReportUnitTypes +end +function SET_GROUP:AddGroup(group,DontSetCargoBayLimit) +self:Add(group:GetName(),group) +if not DontSetCargoBayLimit then +for UnitID,UnitData in pairs(group:GetUnits()or{})do +if UnitData and UnitData:IsAlive()then +UnitData:SetCargoBayWeightLimit() +end +end +end +return self +end +function SET_GROUP:AddGroupsByName(AddGroupNames) +local AddGroupNamesArray=(type(AddGroupNames)=="table")and AddGroupNames or{AddGroupNames} +for AddGroupID,AddGroupName in pairs(AddGroupNamesArray)do +self:Add(AddGroupName,GROUP:FindByName(AddGroupName)) +end +return self +end +function SET_GROUP:RemoveGroupsByName(RemoveGroupNames) +local RemoveGroupNamesArray=(type(RemoveGroupNames)=="table")and RemoveGroupNames or{RemoveGroupNames} +for RemoveGroupID,RemoveGroupName in pairs(RemoveGroupNamesArray)do +self:Remove(RemoveGroupName) +end +return self +end +function SET_GROUP:FindGroup(GroupName) +local GroupFound=self.Set[GroupName] +return GroupFound +end +function SET_GROUP:FindNearestGroupFromPointVec2(Coordinate) +local NearestGroup=nil +local ClosestDistance=nil +local Set=self:GetAliveSet() +for ObjectID,ObjectData in pairs(Set)do +if NearestGroup==nil then +NearestGroup=ObjectData +ClosestDistance=Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) +else +local Distance=Coordinate:DistanceFromPointVec2(ObjectData:GetCoordinate()) +if Distance<ClosestDistance then +NearestGroup=ObjectData +ClosestDistance=Distance +end +end +end +return NearestGroup +end +function SET_GROUP:FilterZones(Zones,Clear) +if Clear or not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_GROUP:FilterCoalitions(Coalitions,Clear) +if Clear or(not self.Filter.Coalitions)then +self.Filter.Coalitions={} +end +Coalitions=UTILS.EnsureTable(Coalitions,false) +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_GROUP:FilterCategories(Categories,Clear) +if Clear or not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_GROUP:FilterCategoryGround() +self:FilterCategories("ground") +return self +end +function SET_GROUP:FilterCategoryAirplane() +self:FilterCategories("plane") +return self +end +function SET_GROUP:FilterCategoryHelicopter() +self:FilterCategories("helicopter") +return self +end +function SET_GROUP:FilterCategoryShip() +self:FilterCategories("ship") +return self +end +function SET_GROUP:FilterCategoryStructure() +self:FilterCategories("structure") +return self +end +function SET_GROUP:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_GROUP:FilterPrefixes(Prefixes) +if not self.Filter.GroupPrefixes then +self.Filter.GroupPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.GroupPrefixes[Prefix]=Prefix +end +return self +end +function SET_GROUP:_ContinousZoneFilter() +local Database=_DATABASE.GROUPS +for ObjectName,Object in pairs(Database)do +if self:IsIncludeObject(Object)and self:IsNotInSet(Object)then +self:Add(ObjectName,Object) +elseif(not self:IsIncludeObject(Object))and self:IsInSet(Object)then +self:Remove(ObjectName) +end +end +return self +end +function SET_GROUP:FilterActive(Active) +Active=Active or not(Active==false) +self.Filter.Active=Active +return self +end +function SET_GROUP:FilterAlive() +self.Filter.Alive=true +return self +end +function SET_GROUP:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventOnDeadOrCrash) +if self.Filter.Zones then +self.ZoneTimer=TIMER:New(self._ContinousZoneFilter,self) +local timing=self.ZoneTimerInterval or 30 +self.ZoneTimer:Start(timing,timing) +end +end +return self +end +function SET_GROUP:FilterZoneTimer(Seconds) +self.ZoneTimerInterval=Seconds or 30 +return self +end +function SET_GROUP:FilterStop() +if _DATABASE then +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.RemoveUnit) +self:UnHandleEvent(EVENTS.UnitLost) +if self.Filter.Zones and self.ZoneTimer and self.ZoneTimer:IsRunning()then +self.ZoneTimer:Stop() +end +end +return self +end +function SET_GROUP:_EventOnDeadOrCrash(Event) +if Event.IniDCSUnit then +local ObjectName,Object=self:FindInDatabase(Event) +if ObjectName then +local size=1 +if Event.IniDCSGroup then +size=Event.IniDCSGroup:getSize() +elseif Event.IniDCSGroupName then +local grp=Group.getByName(Event.IniDCSGroupName) +if grp then +size=grp:getSize() +end +elseif Object:IsAlive()then +size=Object:CountAliveUnits() +end +if size==1 then +self:Remove(ObjectName) +end +end +end +end +function SET_GROUP:AddInDatabase(Event) +if Event.IniObjectCategory==Object.Category.UNIT then +if not self.Database[Event.IniDCSGroupName]then +self.Database[Event.IniDCSGroupName]=GROUP:Register(Event.IniDCSGroupName) +end +end +return Event.IniDCSGroupName,self.Database[Event.IniDCSGroupName] +end +function SET_GROUP:FindInDatabase(Event) +return Event.IniDCSGroupName,self.Database[Event.IniDCSGroupName] +end +function SET_GROUP:ForEachGroup(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_GROUP:ForSomeGroup(IteratorFunction,...) +self:ForSome(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_GROUP:ForEachGroupAlive(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetAliveSet()) +return self +end +function SET_GROUP:ForSomeGroupAlive(IteratorFunction,...) +self:ForSome(IteratorFunction,arg,self:GetAliveSet()) +return self +end +function SET_GROUP:Activate(Delay) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +local group=GroupData +if group and group:IsAlive()==false then +group:Activate(Delay) +end +end +return self +end +function SET_GROUP:ForEachGroupCompletelyInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,GroupObject) +if GroupObject:IsCompletelyInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_GROUP:ForEachGroupPartlyInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,GroupObject) +if GroupObject:IsPartlyInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_GROUP:ForEachGroupNotInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,GroupObject) +if GroupObject:IsNotInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_GROUP:AllCompletelyInZone(Zone) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if not GroupData:IsCompletelyInZone(Zone)then +return false +end +end +return true +end +function SET_GROUP:ForEachGroupAnyInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,GroupObject) +if GroupObject:IsAnyInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_GROUP:AnyCompletelyInZone(Zone) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData:IsCompletelyInZone(Zone)then +return true +end +end +return false +end +function SET_GROUP:AnyInZone(Zone) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData:IsPartlyInZone(Zone)or GroupData:IsCompletelyInZone(Zone)then +return true +end +end +return false +end +function SET_GROUP:AnyPartlyInZone(Zone) +local IsPartlyInZone=false +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData:IsCompletelyInZone(Zone)then +return false +elseif GroupData:IsPartlyInZone(Zone)then +IsPartlyInZone=true +end +end +if IsPartlyInZone then +return true +else +return false +end +end +function SET_GROUP:NoneInZone(Zone) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if not GroupData:IsNotInZone(Zone)then +return false +end +end +return true +end +function SET_GROUP:CountInZone(Zone) +local Count=0 +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData:IsCompletelyInZone(Zone)then +Count=Count+1 +end +end +return Count +end +function SET_GROUP:CountUnitInZone(Zone) +local Count=0 +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +Count=Count+GroupData:CountInZone(Zone) +end +return Count +end +function SET_GROUP:CountAlive() +local CountG=0 +local CountU=0 +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData and GroupData:IsAlive()then +CountG=CountG+1 +for _,_unit in pairs(GroupData:GetUnits())do +local unit=_unit +if unit and unit:IsAlive()then +CountU=CountU+1 +end +end +end +end +return CountG,CountU +end +function SET_GROUP:IsIncludeObject(MGroup) +local MGroupInclude=true +if self.Filter.Alive==true then +local MGroupAlive=false +if MGroup and MGroup:IsAlive()then +MGroupAlive=true +end +MGroupInclude=MGroupInclude and MGroupAlive +end +if self.Filter.Active~=nil then +local MGroupActive=false +if self.Filter.Active==false or(self.Filter.Active==true and MGroup:IsActive()==true)then +MGroupActive=true +end +MGroupInclude=MGroupInclude and MGroupActive +end +if self.Filter.Coalitions and MGroupInclude then +local MGroupCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==MGroup:GetCoalition()then +MGroupCoalition=true +end +end +MGroupInclude=MGroupInclude and MGroupCoalition +end +if self.Filter.Categories and MGroupInclude then +local MGroupCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +if self.FilterMeta.Categories[CategoryName]and self.FilterMeta.Categories[CategoryName]==MGroup:GetCategory()then +MGroupCategory=true +end +end +MGroupInclude=MGroupInclude and MGroupCategory +end +if self.Filter.Countries and MGroupInclude then +local MGroupCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +if country.id[CountryName]==MGroup:GetCountry()then +MGroupCountry=true +end +end +MGroupInclude=MGroupInclude and MGroupCountry +end +if self.Filter.GroupPrefixes and MGroupInclude then +local MGroupPrefix=false +for GroupPrefixId,GroupPrefix in pairs(self.Filter.GroupPrefixes)do +if string.find(MGroup:GetName(),string.gsub(GroupPrefix,"-","%%-"),1)then +MGroupPrefix=true +end +end +MGroupInclude=MGroupInclude and MGroupPrefix +end +if self.Filter.Zones and MGroupInclude then +local MGroupZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +if MGroup:IsInZone(Zone)then +MGroupZone=true +end +end +MGroupInclude=MGroupInclude and MGroupZone +end +if self.Filter.Functions and MGroupInclude then +local MGroupFunc=false +MGroupFunc=self:_EvalFilterFunctions(MGroup) +MGroupInclude=MGroupInclude and MGroupFunc +end +return MGroupInclude +end +function SET_GROUP:GetClosestGroup(Coordinate,Coalitions) +local Set=self:GetSet() +local dmin=math.huge +local gmin=nil +for GroupID,GroupData in pairs(Set)do +local group=GroupData +if group and group:IsAlive()and(Coalitions==nil or UTILS.IsAnyInTable(Coalitions,group:GetCoalition()))then +local coord=group:GetCoordinate() +local d +if coord~=nil then +d=UTILS.VecDist3D(Coordinate,coord) +if d<dmin then +dmin=d +gmin=group +end +end +end +end +return gmin,dmin +end +function SET_GROUP:SetCargoBayWeightLimit() +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +for UnitName,UnitData in pairs(GroupData:GetUnits())do +UnitData:SetCargoBayWeightLimit() +end +end +end +end +do +SET_UNIT={ +ClassName="SET_UNIT", +Units={}, +Filter={ +Coalitions=nil, +Categories=nil, +Types=nil, +Countries=nil, +UnitPrefixes=nil, +Zones=nil, +Functions=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Unit.Category.AIRPLANE, +helicopter=Unit.Category.HELICOPTER, +ground=Unit.Category.GROUND_UNIT, +ship=Unit.Category.SHIP, +structure=Unit.Category.STRUCTURE, +}, +}, +} +function SET_UNIT:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.UNITS)) +self:FilterActive(false) +return self +end +function SET_UNIT:AddUnit(Unit) +self:Add(Unit:GetName(),Unit) +if Unit:IsInstanceOf("UNIT")then +Unit:SetCargoBayWeightLimit() +end +return self +end +function SET_UNIT:AddUnitsByName(AddUnitNames) +local AddUnitNamesArray=(type(AddUnitNames)=="table")and AddUnitNames or{AddUnitNames} +for AddUnitID,AddUnitName in pairs(AddUnitNamesArray)do +self:Add(AddUnitName,UNIT:FindByName(AddUnitName)) +end +return self +end +function SET_UNIT:RemoveUnitsByName(RemoveUnitNames) +local RemoveUnitNamesArray=(type(RemoveUnitNames)=="table")and RemoveUnitNames or{RemoveUnitNames} +for RemoveUnitID,RemoveUnitName in pairs(RemoveUnitNamesArray)do +self:Remove(RemoveUnitName) +end +return self +end +function SET_UNIT:FindUnit(UnitName) +local UnitFound=self.Set[UnitName] +return UnitFound +end +function SET_UNIT:FilterCoalitions(Coalitions) +self.Filter.Coalitions={} +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_UNIT:FilterCategories(Categories) +if not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_UNIT:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_UNIT:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_UNIT:FilterPrefixes(Prefixes) +if not self.Filter.UnitPrefixes then +self.Filter.UnitPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.UnitPrefixes[Prefix]=Prefix +end +return self +end +function SET_UNIT:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_UNIT:FilterActive(Active) +Active=Active or not(Active==false) +self.Filter.Active=Active +return self +end +function SET_UNIT:FilterAlive() +self:FilterFunction( +function(unit) +if unit and unit:IsExist()and unit:IsAlive()then +return true +else +return false +end +end +) +return self +end +function SET_UNIT:FilterGroupPrefixes(Prefixes) +if type(Prefixes)=="string"then +Prefixes={Prefixes} +end +self:FilterFunction( +function(unit,prefixes) +local outcome=false +if unit then +local grp=unit:GetGroup() +local gname=grp~=nil and grp:GetName()or"none" +for _,_fix in pairs(prefixes or{})do +if string.find(gname,_fix)then +outcome=true +break +end +end +else +return false +end +return outcome +end,Prefixes +) +return self +end +function SET_UNIT:FilterHasRadar(RadarTypes) +self.Filter.RadarTypes=self.Filter.RadarTypes or{} +if type(RadarTypes)~="table"then +RadarTypes={RadarTypes} +end +for RadarTypeID,RadarType in pairs(RadarTypes)do +self.Filter.RadarTypes[RadarType]=RadarType +end +return self +end +function SET_UNIT:FilterHasSEAD() +self.Filter.SEAD=true +return self +end +function SET_UNIT:CountAlive() +local Set=self:GetSet() +local CountU=0 +for UnitID,UnitData in pairs(Set)do +if UnitData and UnitData:IsAlive()then +CountU=CountU+1 +end +end +return CountU +end +function SET_UNIT:GetAliveSet() +local AliveSet=SET_UNIT:New() +for GroupName,GroupObject in pairs(self.Set)do +if GroupObject and GroupObject:IsAlive()then +AliveSet[GroupName]=GroupObject +end +end +return AliveSet.Set or{},AliveSet +end +function SET_UNIT:_ContinousZoneFilter() +local Database=_DATABASE.UNITS +for ObjectName,Object in pairs(Database)do +if self:IsIncludeObject(Object)and self:IsNotInSet(Object)then +self:Add(ObjectName,Object) +elseif(not self:IsIncludeObject(Object))and self:IsInSet(Object)then +self:Remove(ObjectName) +end +end +return self +end +function SET_UNIT:FilterZoneTimer(Seconds) +self.ZoneTimerInterval=Seconds or 30 +return self +end +function SET_UNIT:FilterStop() +if _DATABASE then +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.RemoveUnit) +if self.Filter.Zones and self.ZoneTimer and self.ZoneTimer:IsRunning()then +self.ZoneTimer:Stop() +end +end +return self +end +function SET_UNIT:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._EventOnDeadOrCrash) +if self.Filter.Zones then +self.ZoneTimer=TIMER:New(self._ContinousZoneFilter,self) +local timing=self.ZoneTimerInterval or 30 +self.ZoneTimer:Start(timing,timing) +end +end +return self +end +function SET_UNIT:AddInDatabase(Event) +if Event.IniObjectCategory==Object.Category.UNIT then +if not self.Database[Event.IniDCSUnitName]then +self.Database[Event.IniDCSUnitName]=UNIT:Register(Event.IniDCSUnitName) +end +end +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_UNIT:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Set[Event.IniDCSUnitName] +end +do +function SET_UNIT:IsPartiallyInZone(ZoneTest) +local IsPartiallyInZone=false +local function EvaluateZone(ZoneUnit) +local ZoneUnitName=ZoneUnit:GetName() +if self:FindUnit(ZoneUnitName)then +IsPartiallyInZone=true +return false +end +return true +end +ZoneTest:SearchZone(EvaluateZone) +return IsPartiallyInZone +end +function SET_UNIT:IsNotInZone(Zone) +local IsNotInZone=true +local function EvaluateZone(ZoneUnit) +local ZoneUnitName=ZoneUnit:GetName() +if self:FindUnit(ZoneUnitName)then +IsNotInZone=false +return false +end +return true +end +Zone:SearchZone(EvaluateZone) +return IsNotInZone +end +end +function SET_UNIT:ForEachUnit(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_UNIT:GetSetPerThreatLevel(FromThreatLevel,ToThreatLevel) +local ThreatLevelSet={} +if self:Count()~=0 then +for UnitName,UnitObject in pairs(self.Set)do +local Unit=UnitObject +local ThreatLevel=Unit:GetThreatLevel() +ThreatLevelSet[ThreatLevel]=ThreatLevelSet[ThreatLevel]or{} +ThreatLevelSet[ThreatLevel].Set=ThreatLevelSet[ThreatLevel].Set or{} +ThreatLevelSet[ThreatLevel].Set[UnitName]=UnitObject +end +local OrderedPerThreatLevelSet={} +local ThreatLevelIncrement=FromThreatLevel<=ToThreatLevel and 1 or-1 +for ThreatLevel=FromThreatLevel,ToThreatLevel,ThreatLevelIncrement do +local ThreatLevelItem=ThreatLevelSet[ThreatLevel] +if ThreatLevelItem then +for UnitName,UnitObject in pairs(ThreatLevelItem.Set)do +table.insert(OrderedPerThreatLevelSet,UnitObject) +end +end +end +return OrderedPerThreatLevelSet +end +end +function SET_UNIT:ForEachUnitPerThreatLevel(FromThreatLevel,ToThreatLevel,IteratorFunction,...) +local ThreatLevelSet={} +if self:Count()~=0 then +for UnitName,UnitObject in pairs(self.Set)do +local Unit=UnitObject +local ThreatLevel=Unit:GetThreatLevel() +ThreatLevelSet[ThreatLevel]=ThreatLevelSet[ThreatLevel]or{} +ThreatLevelSet[ThreatLevel].Set=ThreatLevelSet[ThreatLevel].Set or{} +ThreatLevelSet[ThreatLevel].Set[UnitName]=UnitObject +end +local ThreatLevelIncrement=FromThreatLevel<=ToThreatLevel and 1 or-1 +for ThreatLevel=FromThreatLevel,ToThreatLevel,ThreatLevelIncrement do +local ThreatLevelItem=ThreatLevelSet[ThreatLevel] +if ThreatLevelItem then +self:ForEach(IteratorFunction,arg,ThreatLevelItem.Set) +end +end +end +return self +end +function SET_UNIT:ForEachUnitCompletelyInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,UnitObject) +if UnitObject:IsInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_UNIT:ForEachUnitNotInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,UnitObject) +if UnitObject:IsNotInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_UNIT:GetUnitTypes() +local MT={} +local UnitTypes={} +for UnitID,UnitData in pairs(self:GetSet())do +local TextUnit=UnitData +if TextUnit:IsAlive()then +local UnitType=TextUnit:GetTypeName() +if not UnitTypes[UnitType]then +UnitTypes[UnitType]=1 +else +UnitTypes[UnitType]=UnitTypes[UnitType]+1 +end +end +end +for UnitTypeID,UnitType in pairs(UnitTypes)do +MT[#MT+1]=UnitType.." of "..UnitTypeID +end +return UnitTypes +end +function SET_UNIT:GetUnitTypesText() +local MT={} +local UnitTypes=self:GetUnitTypes() +for UnitTypeID,UnitType in pairs(UnitTypes)do +MT[#MT+1]=UnitType.." of "..UnitTypeID +end +return table.concat(MT,", ") +end +function SET_UNIT:GetUnitThreatLevels() +local UnitThreatLevels={} +for UnitID,UnitData in pairs(self:GetSet())do +local ThreatUnit=UnitData +if ThreatUnit:IsAlive()then +local UnitThreatLevel,UnitThreatLevelText=ThreatUnit:GetThreatLevel() +local ThreatUnitName=ThreatUnit:GetName() +UnitThreatLevels[UnitThreatLevel]=UnitThreatLevels[UnitThreatLevel]or{} +UnitThreatLevels[UnitThreatLevel].UnitThreatLevelText=UnitThreatLevelText +UnitThreatLevels[UnitThreatLevel].Units=UnitThreatLevels[UnitThreatLevel].Units or{} +UnitThreatLevels[UnitThreatLevel].Units[ThreatUnitName]=ThreatUnit +end +end +return UnitThreatLevels +end +function SET_UNIT:CalculateThreatLevelA2G() +local MaxThreatLevelA2G=0 +local MaxThreatText="" +for UnitName,UnitData in pairs(self:GetSet())do +local ThreatUnit=UnitData +local ThreatLevelA2G,ThreatText=ThreatUnit:GetThreatLevel() +if ThreatLevelA2G>MaxThreatLevelA2G then +MaxThreatLevelA2G=ThreatLevelA2G +MaxThreatText=ThreatText +end +end +return MaxThreatLevelA2G,MaxThreatText +end +function SET_UNIT:GetCoordinate() +local function GetSetVec3(units) +local x=0 +local y=0 +local z=0 +local n=0 +for _,unit in pairs(units)do +local vec3=nil +if unit and unit:IsAlive()then +vec3=unit:GetVec3() +end +if vec3 then +x=x+vec3.x +y=y+vec3.y +z=z+vec3.z +n=n+1 +end +end +if n>0 then +local Vec3={x=x/n,y=y/n,z=z/n} +return Vec3 +end +return nil +end +local Coordinate=nil +local Vec3=GetSetVec3(self.Set) +if Vec3 then +Coordinate=COORDINATE:NewFromVec3(Vec3) +end +if Coordinate then +local heading=self:GetHeading()or 0 +local velocity=self:GetVelocity()or 0 +Coordinate:SetHeading(heading) +Coordinate:SetVelocity(velocity) +end +return Coordinate +end +function SET_UNIT:GetVelocity() +local Coordinate=self:GetFirst():GetCoordinate() +local MaxVelocity=0 +for UnitName,UnitData in pairs(self:GetSet())do +local Unit=UnitData +local Coordinate=Unit:GetCoordinate() +local Velocity=Coordinate:GetVelocity() +if Velocity~=0 then +MaxVelocity=(MaxVelocity<Velocity)and Velocity or MaxVelocity +end +end +return MaxVelocity +end +function SET_UNIT:GetHeading() +local HeadingSet=nil +local MovingCount=0 +for UnitName,UnitData in pairs(self:GetSet())do +local Unit=UnitData +local Coordinate=Unit:GetCoordinate() +local Velocity=Coordinate:GetVelocity() +if Velocity~=0 then +local Heading=Coordinate:GetHeading() +if HeadingSet==nil then +HeadingSet=Heading +else +local HeadingDiff=(HeadingSet-Heading+180+360)%360-180 +HeadingDiff=math.abs(HeadingDiff) +if HeadingDiff>5 then +HeadingSet=nil +break +end +end +end +end +return HeadingSet +end +function SET_UNIT:HasRadar(RadarType) +local RadarCount=0 +for UnitID,UnitData in pairs(self:GetSet())do +local UnitSensorTest=UnitData +local HasSensors +if RadarType then +HasSensors=UnitSensorTest:HasSensors(Unit.SensorType.RADAR,RadarType) +else +HasSensors=UnitSensorTest:HasSensors(Unit.SensorType.RADAR) +end +if HasSensors then +RadarCount=RadarCount+1 +end +end +return RadarCount +end +function SET_UNIT:HasSEAD() +local SEADCount=0 +for UnitID,UnitData in pairs(self:GetSet())do +local UnitSEAD=UnitData +if UnitSEAD:IsAlive()then +local UnitSEADAttributes=UnitSEAD:GetDesc().attributes +local HasSEAD=UnitSEAD:HasSEAD() +if HasSEAD then +SEADCount=SEADCount+1 +end +end +end +return SEADCount +end +function SET_UNIT:HasGroundUnits() +local GroundUnitCount=0 +for UnitID,UnitData in pairs(self:GetSet())do +local UnitTest=UnitData +if UnitTest:IsGround()then +GroundUnitCount=GroundUnitCount+1 +end +end +return GroundUnitCount +end +function SET_UNIT:HasAirUnits() +local AirUnitCount=0 +for UnitID,UnitData in pairs(self:GetSet())do +local UnitTest=UnitData +if UnitTest:IsAir()then +AirUnitCount=AirUnitCount+1 +end +end +return AirUnitCount +end +function SET_UNIT:HasFriendlyUnits(FriendlyCoalition) +local FriendlyUnitCount=0 +for UnitID,UnitData in pairs(self:GetSet())do +local UnitTest=UnitData +if UnitTest:IsFriendly(FriendlyCoalition)then +FriendlyUnitCount=FriendlyUnitCount+1 +end +end +return FriendlyUnitCount +end +function SET_UNIT:IsIncludeObject(MUnit) +local MUnitInclude=false +if MUnit:IsAlive()~=nil then +MUnitInclude=true +if self.Filter.Active~=nil then +local MUnitActive=false +if self.Filter.Active==false or(self.Filter.Active==true and MUnit:IsActive()==true)then +MUnitActive=true +end +MUnitInclude=MUnitInclude and MUnitActive +end +if self.Filter.Coalitions and MUnitInclude then +local MUnitCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==MUnit:GetCoalition()then +MUnitCoalition=true +end +end +MUnitInclude=MUnitInclude and MUnitCoalition +end +if self.Filter.Categories and MUnitInclude then +local MUnitCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +if self.FilterMeta.Categories[CategoryName]and self.FilterMeta.Categories[CategoryName]==MUnit:GetDesc().category then +MUnitCategory=true +end +end +MUnitInclude=MUnitInclude and MUnitCategory +end +if self.Filter.Types and MUnitInclude then +local MUnitType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==MUnit:GetTypeName()then +MUnitType=true +end +end +MUnitInclude=MUnitInclude and MUnitType +end +if self.Filter.Countries and MUnitInclude then +local MUnitCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +if country.id[CountryName]==MUnit:GetCountry()then +MUnitCountry=true +end +end +MUnitInclude=MUnitInclude and MUnitCountry +end +if self.Filter.UnitPrefixes and MUnitInclude then +local MUnitPrefix=false +for UnitPrefixId,UnitPrefix in pairs(self.Filter.UnitPrefixes)do +if string.find(MUnit:GetName(),UnitPrefix,1)then +MUnitPrefix=true +end +end +MUnitInclude=MUnitInclude and MUnitPrefix +end +if self.Filter.RadarTypes and MUnitInclude then +local MUnitRadar=false +for RadarTypeID,RadarType in pairs(self.Filter.RadarTypes)do +if MUnit:HasSensors(Unit.SensorType.RADAR,RadarType)==true then +if MUnit:GetRadar()==true then +end +MUnitRadar=true +end +end +MUnitInclude=MUnitInclude and MUnitRadar +end +if self.Filter.SEAD and MUnitInclude then +local MUnitSEAD=false +if MUnit:HasSEAD()==true then +MUnitSEAD=true +end +MUnitInclude=MUnitInclude and MUnitSEAD +end +end +if self.Filter.Zones and MUnitInclude then +local MGroupZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +if MUnit:IsInZone(Zone)then +MGroupZone=true +end +end +MUnitInclude=MUnitInclude and MGroupZone +end +if self.Filter.Functions and MUnitInclude then +local MUnitFunc=self:_EvalFilterFunctions(MUnit) +MUnitInclude=MUnitInclude and MUnitFunc +end +return MUnitInclude +end +function SET_UNIT:GetTypeNames(Delimiter) +Delimiter=Delimiter or", " +local TypeReport=REPORT:New() +local Types={} +for UnitName,UnitData in pairs(self:GetSet())do +local Unit=UnitData +local UnitTypeName=Unit:GetTypeName() +if not Types[UnitTypeName]then +Types[UnitTypeName]=UnitTypeName +TypeReport:Add(UnitTypeName) +end +end +return TypeReport:Text(Delimiter) +end +function SET_UNIT:SetCargoBayWeightLimit() +local Set=self:GetSet() +for UnitID,UnitData in pairs(Set)do +UnitData:SetCargoBayWeightLimit() +end +end +end +do +SET_STATIC={ +ClassName="SET_STATIC", +Statics={}, +Filter={ +Coalitions=nil, +Categories=nil, +Types=nil, +Countries=nil, +StaticPrefixes=nil, +Zones=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Unit.Category.AIRPLANE, +helicopter=Unit.Category.HELICOPTER, +ground=Unit.Category.GROUND_STATIC, +ship=Unit.Category.SHIP, +structure=Unit.Category.STRUCTURE, +}, +}, +} +function SET_STATIC:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.STATICS)) +return self +end +function SET_STATIC:AddStatic(AddStatic) +self:Add(AddStatic:GetName(),AddStatic) +return self +end +function SET_STATIC:AddStaticsByName(AddStaticNames) +local AddStaticNamesArray=(type(AddStaticNames)=="table")and AddStaticNames or{AddStaticNames} +for AddStaticID,AddStaticName in pairs(AddStaticNamesArray)do +self:Add(AddStaticName,STATIC:FindByName(AddStaticName)) +end +return self +end +function SET_STATIC:RemoveStaticsByName(RemoveStaticNames) +local RemoveStaticNamesArray=(type(RemoveStaticNames)=="table")and RemoveStaticNames or{RemoveStaticNames} +for RemoveStaticID,RemoveStaticName in pairs(RemoveStaticNamesArray)do +self:Remove(RemoveStaticName) +end +return self +end +function SET_STATIC:FindStatic(StaticName) +local StaticFound=self.Set[StaticName] +return StaticFound +end +function SET_STATIC:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_STATIC:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_STATIC:FilterCategories(Categories) +if not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_STATIC:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_STATIC:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_STATIC:FilterPrefixes(Prefixes) +if not self.Filter.StaticPrefixes then +self.Filter.StaticPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.StaticPrefixes[Prefix]=Prefix +end +return self +end +function SET_STATIC:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._EventOnDeadOrCrash) +end +return self +end +function SET_STATIC:CountAlive() +local Set=self:GetSet() +local CountU=0 +for UnitID,UnitData in pairs(Set)do +if UnitData and UnitData:IsAlive()then +CountU=CountU+1 +end +end +return CountU +end +function SET_STATIC:AddInDatabase(Event) +if Event.IniObjectCategory==Object.Category.STATIC then +if not self.Database[Event.IniDCSUnitName]then +self.Database[Event.IniDCSUnitName]=STATIC:Register(Event.IniDCSUnitName) +end +end +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_STATIC:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Set[Event.IniDCSUnitName] +end +do +function SET_STATIC:IsPartiallyInZone(Zone) +local IsPartiallyInZone=false +local function EvaluateZone(ZoneStatic) +local ZoneStaticName=ZoneStatic:GetName() +if self:FindStatic(ZoneStaticName)then +IsPartiallyInZone=true +return false +end +return true +end +return IsPartiallyInZone +end +function SET_STATIC:IsNotInZone(Zone) +local IsNotInZone=true +local function EvaluateZone(ZoneStatic) +local ZoneStaticName=ZoneStatic:GetName() +if self:FindStatic(ZoneStaticName)then +IsNotInZone=false +return false +end +return true +end +Zone:Search(EvaluateZone) +return IsNotInZone +end +function SET_STATIC:ForEachStaticInZone(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +end +function SET_STATIC:ForEachStatic(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_STATIC:ForEachStaticCompletelyInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,StaticObject) +if StaticObject:IsInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_STATIC:ForEachStaticNotInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,StaticObject) +if StaticObject:IsNotInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_STATIC:GetStaticTypes() +local MT={} +local StaticTypes={} +for StaticID,StaticData in pairs(self:GetSet())do +local TextStatic=StaticData +if TextStatic:IsAlive()then +local StaticType=TextStatic:GetTypeName() +if not StaticTypes[StaticType]then +StaticTypes[StaticType]=1 +else +StaticTypes[StaticType]=StaticTypes[StaticType]+1 +end +end +end +for StaticTypeID,StaticType in pairs(StaticTypes)do +MT[#MT+1]=StaticType.." of "..StaticTypeID +end +return StaticTypes +end +function SET_STATIC:GetStaticTypesText() +local MT={} +local StaticTypes=self:GetStaticTypes() +for StaticTypeID,StaticType in pairs(StaticTypes)do +MT[#MT+1]=StaticType.." of "..StaticTypeID +end +return table.concat(MT,", ") +end +function SET_STATIC:GetCoordinate() +local Coordinate=self:GetFirst():GetCoordinate() +local x1=Coordinate.x +local x2=Coordinate.x +local y1=Coordinate.y +local y2=Coordinate.y +local z1=Coordinate.z +local z2=Coordinate.z +local MaxVelocity=0 +local AvgHeading=nil +local MovingCount=0 +for StaticName,StaticData in pairs(self:GetSet())do +local Static=StaticData +local Coordinate=Static:GetCoordinate() +x1=(Coordinate.x<x1)and Coordinate.x or x1 +x2=(Coordinate.x>x2)and Coordinate.x or x2 +y1=(Coordinate.y<y1)and Coordinate.y or y1 +y2=(Coordinate.y>y2)and Coordinate.y or y2 +z1=(Coordinate.y<z1)and Coordinate.z or z1 +z2=(Coordinate.y>z2)and Coordinate.z or z2 +local Velocity=Coordinate:GetVelocity() +if Velocity~=0 then +MaxVelocity=(MaxVelocity<Velocity)and Velocity or MaxVelocity +local Heading=Coordinate:GetHeading() +AvgHeading=AvgHeading and(AvgHeading+Heading)or Heading +MovingCount=MovingCount+1 +end +end +AvgHeading=AvgHeading and(AvgHeading/MovingCount) +Coordinate.x=(x2-x1)/2+x1 +Coordinate.y=(y2-y1)/2+y1 +Coordinate.z=(z2-z1)/2+z1 +Coordinate:SetHeading(AvgHeading) +Coordinate:SetVelocity(MaxVelocity) +return Coordinate +end +function SET_STATIC:GetVelocity() +return 0 +end +function SET_STATIC:GetHeading() +local HeadingSet=nil +local MovingCount=0 +for StaticName,StaticData in pairs(self:GetSet())do +local Static=StaticData +local Coordinate=Static:GetCoordinate() +local Velocity=Coordinate:GetVelocity() +if Velocity~=0 then +local Heading=Coordinate:GetHeading() +if HeadingSet==nil then +HeadingSet=Heading +else +local HeadingDiff=(HeadingSet-Heading+180+360)%360-180 +HeadingDiff=math.abs(HeadingDiff) +if HeadingDiff>5 then +HeadingSet=nil +break +end +end +end +end +return HeadingSet +end +function SET_STATIC:CalculateThreatLevelA2G() +local MaxThreatLevelA2G=0 +local MaxThreatText="" +for StaticName,StaticData in pairs(self:GetSet())do +local ThreatStatic=StaticData +local ThreatLevelA2G,ThreatText=ThreatStatic:GetThreatLevel() +if ThreatLevelA2G>MaxThreatLevelA2G then +MaxThreatLevelA2G=ThreatLevelA2G +MaxThreatText=ThreatText +end +end +return MaxThreatLevelA2G,MaxThreatText +end +function SET_STATIC:IsIncludeObject(MStatic) +local MStaticInclude=true +if self.Filter.Coalitions then +local MStaticCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==MStatic:GetCoalition()then +MStaticCoalition=true +end +end +MStaticInclude=MStaticInclude and MStaticCoalition +end +if self.Filter.Categories then +local MStaticCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +if self.FilterMeta.Categories[CategoryName]and self.FilterMeta.Categories[CategoryName]==MStatic:GetDesc().category then +MStaticCategory=true +end +end +MStaticInclude=MStaticInclude and MStaticCategory +end +if self.Filter.Types then +local MStaticType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==MStatic:GetTypeName()then +MStaticType=true +end +end +MStaticInclude=MStaticInclude and MStaticType +end +if self.Filter.Countries then +local MStaticCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +if country.id[CountryName]==MStatic:GetCountry()then +MStaticCountry=true +end +end +MStaticInclude=MStaticInclude and MStaticCountry +end +if self.Filter.StaticPrefixes then +local MStaticPrefix=false +for StaticPrefixId,StaticPrefix in pairs(self.Filter.StaticPrefixes)do +if string.find(MStatic:GetName(),StaticPrefix,1)then +MStaticPrefix=true +end +end +MStaticInclude=MStaticInclude and MStaticPrefix +end +if self.Filter.Zones then +local MStaticZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +if MStatic and MStatic:IsInZone(Zone)then +MStaticZone=true +end +end +MStaticInclude=MStaticInclude and MStaticZone +end +if self.Filter.Functions and MStaticInclude then +local MClientFunc=self:_EvalFilterFunctions(MStatic) +MStaticInclude=MStaticInclude and MClientFunc +end +return MStaticInclude +end +function SET_STATIC:GetTypeNames(Delimiter) +Delimiter=Delimiter or", " +local TypeReport=REPORT:New() +local Types={} +for StaticName,StaticData in pairs(self:GetSet())do +local Static=StaticData +local StaticTypeName=Static:GetTypeName() +if not Types[StaticTypeName]then +Types[StaticTypeName]=StaticTypeName +TypeReport:Add(StaticTypeName) +end +end +return TypeReport:Text(Delimiter) +end +function SET_STATIC:GetClosestStatic(Coordinate,Coalitions) +local Set=self:GetSet() +local dmin=math.huge +local gmin=nil +for GroupID,GroupData in pairs(Set)do +local group=GroupData +if group and group:IsAlive()and(Coalitions==nil or UTILS.IsAnyInTable(Coalitions,group:GetCoalition()))then +local coord=group:GetCoord() +local d=UTILS.VecDist3D(Coordinate,coord) +if d<dmin then +dmin=d +gmin=group +end +end +end +return gmin,dmin +end +end +do +SET_CLIENT={ +ClassName="SET_CLIENT", +Clients={}, +Filter={ +Coalitions=nil, +Categories=nil, +Types=nil, +Countries=nil, +ClientPrefixes=nil, +Zones=nil, +Playernames=nil, +Callsigns=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Unit.Category.AIRPLANE, +helicopter=Unit.Category.HELICOPTER, +ground=Unit.Category.GROUND_UNIT, +ship=Unit.Category.SHIP, +structure=Unit.Category.STRUCTURE, +}, +}, +} +function SET_CLIENT:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.CLIENTS)) +self:FilterActive(false) +return self +end +function SET_CLIENT:AddClientsByName(AddClientNames) +local AddClientNamesArray=(type(AddClientNames)=="table")and AddClientNames or{AddClientNames} +for AddClientID,AddClientName in pairs(AddClientNamesArray)do +self:Add(AddClientName,CLIENT:FindByName(AddClientName)) +end +return self +end +function SET_CLIENT:RemoveClientsByName(RemoveClientNames) +local RemoveClientNamesArray=(type(RemoveClientNames)=="table")and RemoveClientNames or{RemoveClientNames} +for RemoveClientID,RemoveClientName in pairs(RemoveClientNamesArray)do +self:Remove(RemoveClientName.ClientName) +end +return self +end +function SET_CLIENT:FindClient(ClientName) +local ClientFound=self.Set[ClientName] +return ClientFound +end +function SET_CLIENT:FilterCallsigns(Callsigns) +if not self.Filter.Callsigns then +self.Filter.Callsigns={} +end +if type(Callsigns)~="table"then +Callsigns={Callsigns} +end +for callsignID,callsign in pairs(Callsigns)do +self.Filter.Callsigns[callsign]=callsign +end +return self +end +function SET_CLIENT:FilterPlayernames(Playernames) +if not self.Filter.Playernames then +self.Filter.Playernames={} +end +if type(Playernames)~="table"then +Playernames={Playernames} +end +for PlayernameID,playername in pairs(Playernames)do +self.Filter.Playernames[playername]=playername +end +return self +end +function SET_CLIENT:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_CLIENT:FilterCategories(Categories) +if not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_CLIENT:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_CLIENT:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_CLIENT:FilterPrefixes(Prefixes) +if not self.Filter.ClientPrefixes then +self.Filter.ClientPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.ClientPrefixes[Prefix]=Prefix +end +return self +end +function SET_CLIENT:FilterGroupPrefixes(Prefixes) +if type(Prefixes)=="string"then +Prefixes={Prefixes} +end +self:FilterFunction( +function(unit,prefixes) +local outcome=false +if unit then +local grp=unit:GetGroup() +local gname=grp~=nil and grp:GetName()or"none" +for _,_fix in pairs(prefixes or{})do +if string.find(gname,_fix)then +outcome=true +break +end +end +else +return false +end +return outcome +end,Prefixes +) +return self +end +function SET_CLIENT:FilterActive(Active) +Active=Active or not(Active==false) +self.Filter.Active=Active +return self +end +function SET_CLIENT:FilterAlive() +self:FilterFunction( +function(unit) +if unit and unit:IsExist()and unit:IsAlive()then +return true +else +return false +end +end +) +return self +end +function SET_CLIENT:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_CLIENT:_ContinousZoneFilter() +local Database=_DATABASE.CLIENTS +for ObjectName,Object in pairs(Database)do +if self:IsIncludeObject(Object)and self:IsNotInSet(Object)then +self:Add(ObjectName,Object) +elseif(not self:IsIncludeObject(Object))and self:IsInSet(Object)then +self:Remove(ObjectName) +end +end +return self +end +function SET_CLIENT:FilterZoneTimer(Seconds) +self.ZoneTimerInterval=Seconds or 30 +return self +end +function SET_CLIENT:FilterStop() +if _DATABASE then +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +if self.Filter.Zones and self.ZoneTimer and self.ZoneTimer:IsRunning()then +self.ZoneTimer:Stop() +end +end +return self +end +function SET_CLIENT:FilterStart() +if _DATABASE then +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventPlayerLeaveUnit) +if self.Filter.Zones then +self.ZoneTimer=TIMER:New(self._ContinousZoneFilter,self) +local timing=self.ZoneTimerInterval or 30 +self.ZoneTimer:Start(timing,timing) +end +self:_FilterStart() +end +return self +end +function SET_CLIENT:_EventPlayerEnterUnit(Event) +if Event.IniDCSUnit then +if Event.IniObjectCategory==Object.Category.UNIT and Event.IniGroup and Event.IniGroup:IsGround()then +local ObjectName,Object=self:AddInDatabase(Event) +if Object and self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +end +end +end +return self +end +function SET_CLIENT:_EventPlayerLeaveUnit(Event) +if Event.IniDCSUnit then +if Event.IniObjectCategory==Object.Category.UNIT and Event.IniGroup then +local ObjectName,Object=self:FindInDatabase(Event) +if ObjectName then +self:Remove(ObjectName) +end +end +end +return self +end +function SET_CLIENT:HandleCASlots() +self:HandleEvent(EVENTS.PlayerEnterUnit,SET_CLIENT._EventPlayerEnterUnit) +self:HandleEvent(EVENTS.PlayerLeaveUnit,SET_CLIENT._EventPlayerLeaveUnit) +self:FilterFunction(function(client)if client and client:IsAlive()and client:IsGround()then return true else return false end end) +return self +end +function SET_CLIENT:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_CLIENT:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_CLIENT:ForEachClient(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_CLIENT:ForEachClientInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,ClientObject) +if ClientObject:IsInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_CLIENT:ForEachClientNotInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,ClientObject) +if ClientObject:IsNotInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_CLIENT:CountAlive() +local Set=self:GetSet() +local CountU=0 +for UnitID,UnitData in pairs(Set)do +if UnitData and UnitData:IsAlive()then +CountU=CountU+1 +end +end +return CountU +end +function SET_CLIENT:GetAliveSet() +local AliveSet={} +for GroupName,GroupObject in pairs(self.Set)do +if GroupObject and GroupObject:IsAlive()then +AliveSet[GroupName]=GroupObject +end +end +return AliveSet or{} +end +function SET_CLIENT:IsIncludeObject(MClient) +local MClientInclude=true +if MClient then +local MClientName=MClient.UnitName +if self.Filter.Active~=nil then +local MClientActive=false +if self.Filter.Active==false or(self.Filter.Active==true and MClient:IsActive()==true and MClient:IsAlive()==true)then +MClientActive=true +end +MClientInclude=MClientInclude and MClientActive +end +if self.Filter.Coalitions and MClientInclude then +local MClientCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +local ClientCoalitionID=_DATABASE:GetCoalitionFromClientTemplate(MClientName) +if ClientCoalitionID==nil and MClient:IsAlive()~=nil then +ClientCoalitionID=MClient:GetCoalition() +end +if self.FilterMeta.Coalitions[CoalitionName]and ClientCoalitionID and self.FilterMeta.Coalitions[CoalitionName]==ClientCoalitionID then +MClientCoalition=true +end +end +MClientInclude=MClientInclude and MClientCoalition +end +if self.Filter.Categories and MClientInclude then +local MClientCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +local ClientCategoryID=_DATABASE:GetCategoryFromClientTemplate(MClientName) +local UnitCategory=0 +if ClientCategoryID==nil and MClient:IsExist()then +ClientCategoryID,UnitCategory=MClient:GetCategory() +if self.FilterMeta.Categories[CategoryName]and UnitCategory and self.FilterMeta.Categories[CategoryName]==UnitCategory then +MClientCategory=true +end +else +if self.FilterMeta.Categories[CategoryName]and ClientCategoryID and self.FilterMeta.Categories[CategoryName]==ClientCategoryID then +MClientCategory=true +end +end +end +MClientInclude=MClientInclude and MClientCategory +end +if self.Filter.Types and MClientInclude then +local MClientType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==MClient:GetTypeName()then +MClientType=true +end +end +MClientInclude=MClientInclude and MClientType +end +if self.Filter.Countries and MClientInclude then +local MClientCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +local ClientCountryID=_DATABASE:GetCountryFromClientTemplate(MClientName) +if ClientCountryID==nil and MClient:IsAlive()~=nil then +ClientCountryID=MClient:GetCountry() +end +if country.id[CountryName]and ClientCountryID and country.id[CountryName]==ClientCountryID then +MClientCountry=true +end +end +MClientInclude=MClientInclude and MClientCountry +end +if self.Filter.ClientPrefixes and MClientInclude then +local MClientPrefix=false +for ClientPrefixId,ClientPrefix in pairs(self.Filter.ClientPrefixes)do +if string.find(MClient.UnitName,ClientPrefix,1)then +MClientPrefix=true +end +end +MClientInclude=MClientInclude and MClientPrefix +end +if self.Filter.Zones and MClientInclude then +local MClientZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +local unit=MClient:GetClientGroupUnit() +if unit and unit:IsInZone(Zone)then +MClientZone=true +end +end +MClientInclude=MClientInclude and MClientZone +end +if self.Filter.Playernames and MClientInclude then +local MClientPlayername=false +local playername=MClient:GetPlayerName()or"Unknown" +for _,_Playername in pairs(self.Filter.Playernames)do +if playername and string.find(playername,_Playername)then +MClientPlayername=true +end +end +MClientInclude=MClientInclude and MClientPlayername +end +if self.Filter.Callsigns and MClientInclude then +local MClientCallsigns=false +local callsign=MClient:GetCallsign() +for _,_Callsign in pairs(self.Filter.Callsigns)do +if callsign and string.find(callsign,_Callsign,1,true)then +MClientCallsigns=true +end +end +MClientInclude=MClientInclude and MClientCallsigns +end +if self.Filter.Functions and MClientInclude then +local MClientFunc=self:_EvalFilterFunctions(MClient) +MClientInclude=MClientInclude and MClientFunc +end +end +return MClientInclude +end +end +do +SET_PLAYER={ +ClassName="SET_PLAYER", +Clients={}, +Filter={ +Coalitions=nil, +Categories=nil, +Types=nil, +Countries=nil, +ClientPrefixes=nil, +Zones=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Unit.Category.AIRPLANE, +helicopter=Unit.Category.HELICOPTER, +ground=Unit.Category.GROUND_UNIT, +ship=Unit.Category.SHIP, +structure=Unit.Category.STRUCTURE, +}, +}, +} +function SET_PLAYER:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.PLAYERS)) +return self +end +function SET_PLAYER:AddClientsByName(AddClientNames) +local AddClientNamesArray=(type(AddClientNames)=="table")and AddClientNames or{AddClientNames} +for AddClientID,AddClientName in pairs(AddClientNamesArray)do +self:Add(AddClientName,CLIENT:FindByName(AddClientName)) +end +return self +end +function SET_PLAYER:RemoveClientsByName(RemoveClientNames) +local RemoveClientNamesArray=(type(RemoveClientNames)=="table")and RemoveClientNames or{RemoveClientNames} +for RemoveClientID,RemoveClientName in pairs(RemoveClientNamesArray)do +self:Remove(RemoveClientName.ClientName) +end +return self +end +function SET_PLAYER:FindClient(PlayerName) +local ClientFound=self.Set[PlayerName] +return ClientFound +end +function SET_PLAYER:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_PLAYER:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_PLAYER:FilterCategories(Categories) +if not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_PLAYER:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_PLAYER:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_PLAYER:FilterPrefixes(Prefixes) +if not self.Filter.ClientPrefixes then +self.Filter.ClientPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.ClientPrefixes[Prefix]=Prefix +end +return self +end +function SET_PLAYER:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventOnDeadOrCrash) +end +return self +end +function SET_PLAYER:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_PLAYER:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_PLAYER:ForEachPlayer(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_PLAYER:ForEachPlayerInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,ClientObject) +if ClientObject:IsInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_PLAYER:ForEachPlayerNotInZone(ZoneObject,IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet(), +function(ZoneObject,ClientObject) +if ClientObject:IsNotInZone(ZoneObject)then +return true +else +return false +end +end,{ZoneObject}) +return self +end +function SET_PLAYER:IsIncludeObject(MClient) +local MClientInclude=true +if MClient then +local MClientName=MClient.UnitName +if self.Filter.Coalitions and MClientInclude then +local MClientCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +local ClientCoalitionID=_DATABASE:GetCoalitionFromClientTemplate(MClientName) +if ClientCoalitionID==nil and MClient:IsAlive()~=nil then +ClientCoalitionID=MClient:GetCoalition() +end +if self.FilterMeta.Coalitions[CoalitionName]and ClientCoalitionID and self.FilterMeta.Coalitions[CoalitionName]==ClientCoalitionID then +MClientCoalition=true +end +end +MClientInclude=MClientInclude and MClientCoalition +end +if self.Filter.Categories and MClientInclude then +local MClientCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +local ClientCategoryID=_DATABASE:GetCategoryFromClientTemplate(MClientName) +local UnitCategory=0 +if ClientCategoryID==nil and MClient:IsExist()then +ClientCategoryID,UnitCategory=MClient:GetCategory() +if self.FilterMeta.Categories[CategoryName]and UnitCategory and self.FilterMeta.Categories[CategoryName]==UnitCategory then +MClientCategory=true +end +else +if self.FilterMeta.Categories[CategoryName]and ClientCategoryID and self.FilterMeta.Categories[CategoryName]==ClientCategoryID then +MClientCategory=true +end +end +end +MClientInclude=MClientInclude and MClientCategory +end +if self.Filter.Types then +local MClientType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==MClient:GetTypeName()then +MClientType=true +end +end +MClientInclude=MClientInclude and MClientType +end +if self.Filter.Countries then +local MClientCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +local ClientCountryID=_DATABASE:GetCountryFromClientTemplate(MClientName) +if country.id[CountryName]and country.id[CountryName]==ClientCountryID then +MClientCountry=true +end +end +MClientInclude=MClientInclude and MClientCountry +end +if self.Filter.ClientPrefixes then +local MClientPrefix=false +for ClientPrefixId,ClientPrefix in pairs(self.Filter.ClientPrefixes)do +if string.find(MClient.UnitName,ClientPrefix,1)then +MClientPrefix=true +end +end +MClientInclude=MClientInclude and MClientPrefix +end +end +if self.Filter.Zones then +local MClientZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +local unit=MClient:GetClientGroupUnit() +if unit and unit:IsInZone(Zone)then +MClientZone=true +end +end +MClientInclude=MClientInclude and MClientZone +end +if self.Filter.Functions and MClientInclude then +local MClientFunc=self:_EvalFilterFunctions(MClient) +MClientInclude=MClientInclude and MClientFunc +end +return MClientInclude +end +end +do +SET_AIRBASE={ +ClassName="SET_AIRBASE", +Airbases={}, +Filter={ +Coalitions=nil, +Zones=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +airdrome=Airbase.Category.AIRDROME, +helipad=Airbase.Category.HELIPAD, +ship=Airbase.Category.SHIP, +}, +}, +} +function SET_AIRBASE:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.AIRBASES)) +return self +end +function SET_AIRBASE:AddAirbase(airbase) +self:Add(airbase:GetName(),airbase) +return self +end +function SET_AIRBASE:AddAirbasesByName(AddAirbaseNames) +local AddAirbaseNamesArray=(type(AddAirbaseNames)=="table")and AddAirbaseNames or{AddAirbaseNames} +for AddAirbaseID,AddAirbaseName in pairs(AddAirbaseNamesArray)do +self:Add(AddAirbaseName,AIRBASE:FindByName(AddAirbaseName)) +end +return self +end +function SET_AIRBASE:RemoveAirbasesByName(RemoveAirbaseNames) +local RemoveAirbaseNamesArray=(type(RemoveAirbaseNames)=="table")and RemoveAirbaseNames or{RemoveAirbaseNames} +for RemoveAirbaseID,RemoveAirbaseName in pairs(RemoveAirbaseNamesArray)do +self:Remove(RemoveAirbaseName) +end +return self +end +function SET_AIRBASE:FindAirbase(AirbaseName) +local AirbaseFound=self.Set[AirbaseName] +return AirbaseFound +end +function SET_AIRBASE:FindAirbaseInRange(Coordinate,Range) +local AirbaseFound=nil +for AirbaseName,AirbaseObject in pairs(self.Set)do +local AirbaseCoordinate=AirbaseObject:GetCoordinate() +local Distance=Coordinate:Get2DDistance(AirbaseCoordinate) +if Distance<=Range then +AirbaseFound=AirbaseObject +break +end +end +return AirbaseFound +end +function SET_AIRBASE:GetRandomAirbase() +local RandomAirbase=self:GetRandom() +return RandomAirbase +end +function SET_AIRBASE:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_AIRBASE:FilterCategories(Categories) +if not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_AIRBASE:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_AIRBASE:FilterStart() +if _DATABASE then +self:HandleEvent(EVENTS.BaseCaptured) +self:HandleEvent(EVENTS.Dead) +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:RemoveAirbasesByName(ObjectName) +end +end +end +return self +end +function SET_AIRBASE:OnEventBaseCaptured(EventData) +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:RemoveAirbasesByName(ObjectName) +end +end +end +function SET_AIRBASE:OnEventDead(EventData) +local airbaseName,airbase=self:FindInDatabase(EventData) +if airbase and(airbase:IsShip()or airbase:IsHelipad())then +self:RemoveAirbasesByName(airbaseName) +end +end +function SET_AIRBASE:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_AIRBASE:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_AIRBASE:ForEachAirbase(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_AIRBASE:FindNearestAirbaseFromPointVec2(Coordinate) +local NearestAirbase=self:FindNearestObjectFromPointVec2(Coordinate) +return NearestAirbase +end +function SET_AIRBASE:IsIncludeObject(MAirbase) +local MAirbaseInclude=true +if MAirbase then +local MAirbaseName=MAirbase:GetName() +if self.Filter.Coalitions then +local MAirbaseCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +local AirbaseCoalitionID=_DATABASE:GetCoalitionFromAirbase(MAirbaseName) +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==AirbaseCoalitionID then +MAirbaseCoalition=true +end +end +MAirbaseInclude=MAirbaseInclude and MAirbaseCoalition +end +if self.Filter.Categories and MAirbaseInclude then +local MAirbaseCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +local AirbaseCategoryID=_DATABASE:GetCategoryFromAirbase(MAirbaseName) +if self.FilterMeta.Categories[CategoryName]and self.FilterMeta.Categories[CategoryName]==AirbaseCategoryID then +MAirbaseCategory=true +end +end +MAirbaseInclude=MAirbaseInclude and MAirbaseCategory +end +if self.Filter.Zones and MAirbaseInclude then +local MAirbaseZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +local coord=MAirbase:GetCoordinate() +if coord and Zone:IsCoordinateInZone(coord)then +MAirbaseZone=true +end +end +MAirbaseInclude=MAirbaseInclude and MAirbaseZone +end +end +if self.Filter.Functions and MAirbaseInclude then +local MClientFunc=self:_EvalFilterFunctions(MAirbase) +MAirbaseInclude=MAirbaseInclude and MClientFunc +end +return MAirbaseInclude +end +end +do +SET_CARGO={ +ClassName="SET_CARGO", +Cargos={}, +Filter={ +Coalitions=nil, +Types=nil, +Countries=nil, +ClientPrefixes=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +}, +} +function SET_CARGO:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.CARGOS)) +return self +end +function SET_CARGO:AddCargo(Cargo) +self:Add(Cargo:GetName(),Cargo) +return self +end +function SET_CARGO:AddCargosByName(AddCargoNames) +local AddCargoNamesArray=(type(AddCargoNames)=="table")and AddCargoNames or{AddCargoNames} +for AddCargoID,AddCargoName in pairs(AddCargoNamesArray)do +self:Add(AddCargoName,CARGO:FindByName(AddCargoName)) +end +return self +end +function SET_CARGO:RemoveCargosByName(RemoveCargoNames) +local RemoveCargoNamesArray=(type(RemoveCargoNames)=="table")and RemoveCargoNames or{RemoveCargoNames} +for RemoveCargoID,RemoveCargoName in pairs(RemoveCargoNamesArray)do +self:Remove(RemoveCargoName.CargoName) +end +return self +end +function SET_CARGO:FindCargo(CargoName) +local CargoFound=self.Set[CargoName] +return CargoFound +end +function SET_CARGO:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_CARGO:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_CARGO:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_CARGO:FilterPrefixes(Prefixes) +if not self.Filter.CargoPrefixes then +self.Filter.CargoPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.CargoPrefixes[Prefix]=Prefix +end +return self +end +function SET_CARGO:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.NewCargo) +self:HandleEvent(EVENTS.DeleteCargo) +end +return self +end +function SET_CARGO:FilterStop() +self:UnHandleEvent(EVENTS.NewCargo) +self:UnHandleEvent(EVENTS.DeleteCargo) +return self +end +function SET_CARGO:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_CARGO:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_CARGO:ForEachCargo(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_CARGO:FindNearestCargoFromPointVec2(Coordinate) +local NearestCargo=self:FindNearestObjectFromPointVec2(Coordinate) +return NearestCargo +end +function SET_CARGO:FirstCargoWithState(State) +local FirstCargo=nil +for CargoName,Cargo in pairs(self.Set)do +if Cargo:Is(State)then +FirstCargo=Cargo +break +end +end +return FirstCargo +end +function SET_CARGO:FirstCargoWithStateAndNotDeployed(State) +local FirstCargo=nil +for CargoName,Cargo in pairs(self.Set)do +if Cargo:Is(State)and not Cargo:IsDeployed()then +FirstCargo=Cargo +break +end +end +return FirstCargo +end +function SET_CARGO:FirstCargoUnLoaded() +local FirstCargo=self:FirstCargoWithState("UnLoaded") +return FirstCargo +end +function SET_CARGO:FirstCargoUnLoadedAndNotDeployed() +local FirstCargo=self:FirstCargoWithStateAndNotDeployed("UnLoaded") +return FirstCargo +end +function SET_CARGO:FirstCargoLoaded() +local FirstCargo=self:FirstCargoWithState("Loaded") +return FirstCargo +end +function SET_CARGO:FirstCargoDeployed() +local FirstCargo=self:FirstCargoWithState("Deployed") +return FirstCargo +end +function SET_CARGO:IsIncludeObject(MCargo) +local MCargoInclude=true +if MCargo then +local MCargoName=MCargo:GetName() +if self.Filter.Coalitions then +local MCargoCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +local CargoCoalitionID=MCargo:GetCoalition() +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==CargoCoalitionID then +MCargoCoalition=true +end +end +MCargoInclude=MCargoInclude and MCargoCoalition +end +if self.Filter.Types then +local MCargoType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==MCargo:GetType()then +MCargoType=true +end +end +MCargoInclude=MCargoInclude and MCargoType +end +if self.Filter.CargoPrefixes then +local MCargoPrefix=false +for CargoPrefixId,CargoPrefix in pairs(self.Filter.CargoPrefixes)do +if string.find(MCargo.Name,CargoPrefix,1)then +MCargoPrefix=true +end +end +MCargoInclude=MCargoInclude and MCargoPrefix +end +end +if self.Filter.Functions and MCargoInclude then +local MClientFunc=self:_EvalFilterFunctions(MCargo) +MCargoInclude=MCargoInclude and MClientFunc +end +return MCargoInclude +end +function SET_CARGO:OnEventNewCargo(EventData) +if EventData.Cargo then +if EventData.Cargo and self:IsIncludeObject(EventData.Cargo)then +self:Add(EventData.Cargo.Name,EventData.Cargo) +end +end +end +function SET_CARGO:OnEventDeleteCargo(EventData) +if EventData.Cargo then +local Cargo=_DATABASE:FindCargo(EventData.Cargo.Name) +if Cargo and Cargo.Name then +if Cargo.NoDestroy then +else +self:Remove(Cargo.Name) +end +end +end +end +end +do +SET_ZONE={ +ClassName="SET_ZONE", +Zones={}, +Filter={ +Prefixes=nil, +}, +FilterMeta={ +}, +Checktime=5, +} +function SET_ZONE:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.ZONES)) +return self +end +function SET_ZONE:AddZonesByName(AddZoneNames) +local AddZoneNamesArray=(type(AddZoneNames)=="table")and AddZoneNames or{AddZoneNames} +for AddAirbaseID,AddZoneName in pairs(AddZoneNamesArray)do +self:Add(AddZoneName,ZONE:FindByName(AddZoneName)) +end +return self +end +function SET_ZONE:AddZone(Zone) +self:Add(Zone:GetName(),Zone) +return self +end +function SET_ZONE:RemoveZonesByName(RemoveZoneNames) +local RemoveZoneNamesArray=(type(RemoveZoneNames)=="table")and RemoveZoneNames or{RemoveZoneNames} +for RemoveZoneID,RemoveZoneName in pairs(RemoveZoneNamesArray)do +self:Remove(RemoveZoneName) +end +return self +end +function SET_ZONE:FindZone(ZoneName) +local ZoneFound=self.Set[ZoneName] +return ZoneFound +end +function SET_ZONE:GetRandomZone(margin) +local margin=margin or 100 +if self:Count()~=0 then +local Index=self.Index +local ZoneFound=nil +local counter=0 +while(not ZoneFound)or(counter<margin)do +local ZoneRandom=math.random(1,#Index) +ZoneFound=self.Set[Index[ZoneRandom]]:GetZoneMaybe() +counter=counter+1 +end +return ZoneFound +end +return nil +end +function SET_ZONE:SetZoneProbability(ZoneName,ZoneProbability) +local Zone=self:FindZone(ZoneName) +Zone:SetZoneProbability(ZoneProbability) +end +function SET_ZONE:FilterPrefixes(Prefixes) +if not self.Filter.Prefixes then +self.Filter.Prefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.Prefixes[Prefix]=Prefix +end +return self +end +function SET_ZONE:FilterStart() +if _DATABASE then +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:RemoveZonesByName(ObjectName) +end +end +end +self:HandleEvent(EVENTS.NewZone) +self:HandleEvent(EVENTS.DeleteZone) +return self +end +function SET_ZONE:FilterStop() +self:UnHandleEvent(EVENTS.NewZone) +self:UnHandleEvent(EVENTS.DeleteZone) +return self +end +function SET_ZONE:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_ZONE:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_ZONE:ForEachZone(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_ZONE:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +for _,_zone in pairs(self.Set)do +local zone=_zone +zone:DrawZone(Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly) +end +return self +end +function SET_ZONE:GetAverageCoordinate() +local x,y,z=0,0,0 +local count=0 +for _,_zone in pairs(self.Set)do +local zone=_zone +local vec3=zone:GetVec3() +x=x+vec3.x +y=y+vec3.y +z=z+vec3.z +count=count+1 +end +if count>1 then +x=x/count +y=y/count +z=z/count +end +local coord=COORDINATE:New(x,y,z) +return coord +end +function SET_ZONE:IsIncludeObject(MZone) +local MZoneInclude=true +if MZone then +local MZoneName=MZone:GetName() +if self.Filter.Prefixes then +local MZonePrefix=false +for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do +if string.find(MZoneName,ZonePrefix,1)then +MZonePrefix=true +end +end +MZoneInclude=MZoneInclude and MZonePrefix +end +end +if self.Filter.Functions and MZoneInclude then +local MClientFunc=self:_EvalFilterFunctions(MZone) +MZoneInclude=MZoneInclude and MClientFunc +end +return MZoneInclude +end +function SET_ZONE:OnEventNewZone(EventData) +if EventData.Zone then +if EventData.Zone and self:IsIncludeObject(EventData.Zone)then +self:Add(EventData.Zone.ZoneName,EventData.Zone) +end +end +end +function SET_ZONE:OnEventDeleteZone(EventData) +if EventData.Zone then +local Zone=_DATABASE:FindZone(EventData.Zone.ZoneName) +if Zone and Zone.ZoneName then +if Zone.NoDestroy then +else +self:Remove(Zone.ZoneName) +end +end +end +end +function SET_ZONE:IsCoordinateInZone(Coordinate) +for _,Zone in pairs(self:GetSet())do +local Zone=Zone +if Zone:IsCoordinateInZone(Coordinate)then +return Zone +end +end +return nil +end +function SET_ZONE:GetClosestZone(Coordinate) +local dmin=math.huge +local zmin=nil +for _,Zone in pairs(self:GetSet())do +local Zone=Zone +local d=Zone:Get2DDistance(Coordinate) +if d<dmin then +dmin=d +zmin=Zone +end +end +return zmin,dmin +end +function SET_ZONE:SetCheckTime(seconds) +self.Checktime=seconds or 5 +return self +end +function SET_ZONE:Trigger(Objects) +self:AddTransition("*","TriggerStart","TriggerRunning") +self:AddTransition("*","EnteredZone","*") +self:AddTransition("*","LeftZone","*") +self:AddTransition("*","TriggerRunCheck","*") +self:AddTransition("*","TriggerStop","TriggerStopped") +self:TriggerStart() +self.checkobjects=Objects +if UTILS.IsInstanceOf(Objects,"SET_BASE")then +self.objectset=Objects.Set +else +self.objectset={Objects} +end +self:_TriggerCheck(true) +self:__TriggerRunCheck(self.Checktime) +return self +end +function SET_ZONE:SetPartlyInside(state) +for _,Zone in pairs(self.Set)do +if Zone.SetPartlyInside then +Zone:SetPartlyInside(state) +end +end +return self +end +function SET_ZONE:_TriggerCheck(fromstart) +if fromstart then +for _,_object in pairs(self.objectset)do +local obj=_object +if obj and obj:IsAlive()then +for _,_zone in pairs(self.Set)do +if not obj.TriggerInZone then obj.TriggerInZone={}end +if _zone:IsCoordinateInZone(obj:GetCoordinate())then +obj.TriggerInZone[_zone.ZoneName]=true +else +obj.TriggerInZone[_zone.ZoneName]=false +end +end +end +end +else +for _,_object in pairs(self.objectset)do +local obj=_object +if obj and obj:IsAlive()then +for _,_zone in pairs(self.Set)do +if not obj.TriggerInZone then +obj.TriggerInZone={} +end +if not obj.TriggerInZone[_zone.ZoneName]then +obj.TriggerInZone[_zone.ZoneName]=false +end +local inzone +if _zone.PartlyInside and obj.ClassName=="GROUP"then +inzone=obj:IsAnyInZone(_zone) +else +inzone=_zone:IsCoordinateInZone(obj:GetCoordinate()) +end +if inzone and not obj.TriggerInZone[_zone.ZoneName]then +self:__EnteredZone(0.5,obj,_zone) +obj.TriggerInZone[_zone.ZoneName]=true +elseif(not inzone)and obj.TriggerInZone[_zone.ZoneName]then +self:__LeftZone(0.5,obj,_zone) +obj.TriggerInZone[_zone.ZoneName]=false +else +end +end +end +end +end +return self +end +function SET_ZONE:onafterTriggerRunCheck(From,Event,To) +if self:GetState()~="TriggerStopped"then +self:_TriggerCheck() +self:__TriggerRunCheck(self.Checktime) +end +return self +end +end +do +SET_ZONE_GOAL={ +ClassName="SET_ZONE_GOAL", +Zones={}, +Filter={ +Prefixes=nil, +}, +FilterMeta={ +}, +} +function SET_ZONE_GOAL:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.ZONES_GOAL)) +return self +end +function SET_ZONE_GOAL:AddZone(Zone) +self:Add(Zone:GetName(),Zone) +return self +end +function SET_ZONE_GOAL:RemoveZonesByName(RemoveZoneNames) +local RemoveZoneNamesArray=(type(RemoveZoneNames)=="table")and RemoveZoneNames or{RemoveZoneNames} +for RemoveZoneID,RemoveZoneName in pairs(RemoveZoneNamesArray)do +self:Remove(RemoveZoneName) +end +return self +end +function SET_ZONE_GOAL:FindZone(ZoneName) +local ZoneFound=self.Set[ZoneName] +return ZoneFound +end +function SET_ZONE_GOAL:GetRandomZone() +if self:Count()~=0 then +local Index=self.Index +local ZoneFound=nil +while not ZoneFound do +local ZoneRandom=math.random(1,#Index) +ZoneFound=self.Set[Index[ZoneRandom]]:GetZoneMaybe() +end +return ZoneFound +end +return nil +end +function SET_ZONE_GOAL:SetZoneProbability(ZoneName,ZoneProbability) +local Zone=self:FindZone(ZoneName) +Zone:SetZoneProbability(ZoneProbability) +end +function SET_ZONE_GOAL:FilterPrefixes(Prefixes) +if not self.Filter.Prefixes then +self.Filter.Prefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.Prefixes[Prefix]=Prefix +end +return self +end +function SET_ZONE_GOAL:FilterStart() +if _DATABASE then +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:RemoveZonesByName(ObjectName) +end +end +end +self:HandleEvent(EVENTS.NewZoneGoal) +self:HandleEvent(EVENTS.DeleteZoneGoal) +return self +end +function SET_ZONE_GOAL:FilterStop() +self:UnHandleEvent(EVENTS.NewZoneGoal) +self:UnHandleEvent(EVENTS.DeleteZoneGoal) +return self +end +function SET_ZONE_GOAL:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_ZONE_GOAL:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_ZONE_GOAL:ForEachZone(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_ZONE_GOAL:IsIncludeObject(MZone) +local MZoneInclude=true +if MZone then +local MZoneName=MZone:GetName() +if self.Filter.Prefixes then +local MZonePrefix=false +for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do +if string.find(MZoneName,ZonePrefix,1)then +MZonePrefix=true +end +end +MZoneInclude=MZoneInclude and MZonePrefix +end +end +if self.Filter.Functions and MZoneInclude then +local MClientFunc=self:_EvalFilterFunctions(MZone) +MZoneInclude=MZoneInclude and MClientFunc +end +return MZoneInclude +end +function SET_ZONE_GOAL:OnEventNewZoneGoal(EventData) +if EventData.ZoneGoal then +if EventData.ZoneGoal and self:IsIncludeObject(EventData.ZoneGoal)then +self:Add(EventData.ZoneGoal.ZoneName,EventData.ZoneGoal) +end +end +end +function SET_ZONE_GOAL:OnEventDeleteZoneGoal(EventData) +if EventData.ZoneGoal then +local Zone=_DATABASE:FindZone(EventData.ZoneGoal.ZoneName) +if Zone and Zone.ZoneName then +if Zone.NoDestroy then +else +self:Remove(Zone.ZoneName) +end +end +end +end +function SET_ZONE_GOAL:IsCoordinateInZone(Coordinate) +for _,Zone in pairs(self:GetSet())do +local Zone=Zone +if Zone:IsCoordinateInZone(Coordinate)then +return Zone +end +end +return nil +end +end +do +SET_OPSZONE={ +ClassName="SET_OPSZONE", +Zones={}, +Filter={ +Prefixes=nil, +Coalitions=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +}, +} +function SET_OPSZONE:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.OPSZONES)) +return self +end +function SET_OPSZONE:AddZone(Zone) +self:Add(Zone:GetName(),Zone) +return self +end +function SET_OPSZONE:RemoveZonesByName(RemoveZoneNames) +local RemoveZoneNamesArray=(type(RemoveZoneNames)=="table")and RemoveZoneNames or{RemoveZoneNames} +for RemoveZoneID,RemoveZoneName in pairs(RemoveZoneNamesArray)do +self:Remove(RemoveZoneName) +end +return self +end +function SET_OPSZONE:FindZone(ZoneName) +local ZoneFound=self.Set[ZoneName] +return ZoneFound +end +function SET_OPSZONE:GetRandomZone() +if self:Count()~=0 then +local Index=self.Index +local ZoneFound=nil +while not ZoneFound do +local ZoneRandom=math.random(1,#Index) +ZoneFound=self.Set[Index[ZoneRandom]]:GetZoneMaybe() +end +return ZoneFound +end +return nil +end +function SET_OPSZONE:SetZoneProbability(ZoneName,Probability) +local Zone=self:FindZone(ZoneName) +Zone:SetZoneProbability(Probability) +return self +end +function SET_OPSZONE:FilterPrefixes(Prefixes) +if not self.Filter.Prefixes then +self.Filter.Prefixes={} +end +Prefixes=UTILS.EnsureTable(Prefixes,false) +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.Prefixes[Prefix]=Prefix +end +return self +end +function SET_OPSZONE:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +Coalitions=UTILS.EnsureTable(Coalitions,false) +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_OPSZONE:FilterOnce() +for ObjectName,Object in pairs(self.Database)do +self:Remove(ObjectName,true) +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +end +end +return self +end +function SET_OPSZONE:FilterClear() +local parent=self:GetParent(self,SET_OPSZONE) +parent:FilterClear() +return self +end +function SET_OPSZONE:FilterStart() +if _DATABASE then +for ObjectName,Object in pairs(self.Database)do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:RemoveZonesByName(ObjectName) +end +end +end +self:HandleEvent(EVENTS.NewZoneGoal) +self:HandleEvent(EVENTS.DeleteZoneGoal) +return self +end +function SET_OPSZONE:FilterStop() +self:UnHandleEvent(EVENTS.NewZoneGoal) +self:UnHandleEvent(EVENTS.DeleteZoneGoal) +return self +end +function SET_OPSZONE:AddInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_OPSZONE:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Database[Event.IniDCSUnitName] +end +function SET_OPSZONE:ForEachZone(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_OPSZONE:IsIncludeObject(MZone) +local MZoneInclude=true +if MZone then +local MZoneName=MZone:GetName() +if self.Filter.Prefixes then +local MZonePrefix=false +for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do +if string.find(MZoneName,ZonePrefix,1)then +MZonePrefix=true +break +end +end +MZoneInclude=MZoneInclude and MZonePrefix +end +if self.Filter.Coalitions then +local MGroupCoalition=false +local coalition=MZone:GetOwner() +for _,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==coalition then +MGroupCoalition=true +break +end +end +MZoneInclude=MZoneInclude and MGroupCoalition +end +end +if self.Filter.Functions and MZoneInclude then +local MClientFunc=self:_EvalFilterFunctions(MZone) +MZoneInclude=MZoneInclude and MClientFunc +end +return MZoneInclude +end +function SET_OPSZONE:OnEventNewZoneGoal(EventData) +if EventData.ZoneGoal then +if EventData.ZoneGoal and self:IsIncludeObject(EventData.ZoneGoal)then +self:Add(EventData.ZoneGoal.ZoneName,EventData.ZoneGoal) +end +end +end +function SET_OPSZONE:OnEventDeleteZoneGoal(EventData) +if EventData.ZoneGoal then +local Zone=_DATABASE:FindZone(EventData.ZoneGoal.ZoneName) +if Zone and Zone.ZoneName then +if Zone.NoDestroy then +else +self:Remove(Zone.ZoneName) +end +end +end +end +function SET_OPSZONE:Start() +for _,_Zone in pairs(self:GetSet())do +local Zone=_Zone +if Zone:IsStopped()then +Zone:Start() +end +end +return self +end +function SET_OPSZONE:IsCoordinateInZone(Coordinate) +for _,_Zone in pairs(self:GetSet())do +local Zone=_Zone +if Zone:GetZone():IsCoordinateInZone(Coordinate)then +return Zone +end +end +return nil +end +function SET_OPSZONE:GetClosestZone(Coordinate,Coalitions) +Coalitions=UTILS.EnsureTable(Coalitions,true) +local dmin=math.huge +local zmin=nil +for _,_opszone in pairs(self:GetSet())do +local opszone=_opszone +local coal=opszone:GetOwner() +if opszone:IsStarted()and(Coalitions==nil or(Coalitions and UTILS.IsInTable(Coalitions,coal)))then +local d=opszone:GetZone():Get2DDistance(Coordinate) +if d<dmin then +dmin=d +zmin=opszone +end +end +end +return zmin,dmin +end +end +do +SET_OPSGROUP={ +ClassName="SET_OPSGROUP", +Filter={ +Coalitions=nil, +Categories=nil, +Countries=nil, +GroupPrefixes=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +}, +Categories={ +plane=Group.Category.AIRPLANE, +helicopter=Group.Category.HELICOPTER, +ground=Group.Category.GROUND, +ship=Group.Category.SHIP, +}, +}, +} +function SET_OPSGROUP:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.GROUPS)) +self:FilterActive(false) +return self +end +function SET_OPSGROUP:GetAliveSet() +local AliveSet=SET_OPSGROUP:New() +for GroupName,GroupObject in pairs(self.Set)do +local GroupObject=GroupObject +if GroupObject and GroupObject:IsAlive()then +AliveSet:Add(GroupName,GroupObject) +end +end +return AliveSet.Set or{} +end +function SET_OPSGROUP:Add(ObjectName,Object) +if self.Set[ObjectName]then +self:Remove(ObjectName,true) +end +local object=nil +if Object:IsInstanceOf("GROUP")then +object=_DATABASE:FindOpsGroup(ObjectName) +if not object then +if Object:IsShip()then +object=NAVYGROUP:New(Object) +elseif Object:IsGround()then +object=ARMYGROUP:New(Object) +elseif Object:IsAir()then +object=FLIGHTGROUP:New(Object) +else +env.error("ERROR: Unknown category of group object!") +end +end +elseif Object:IsInstanceOf("OPSGROUP")then +object=Object +else +env.error("ERROR: Object must be a GROUP or OPSGROUP!") +end +self.Set[ObjectName]=object +table.insert(self.Index,ObjectName) +self:Added(ObjectName,object) +end +function SET_OPSGROUP:AddObject(Object) +self:Add(Object.groupname,Object) +end +function SET_OPSGROUP:AddGroup(group) +local groupname=group:GetName() +self:Add(groupname,group) +return self +end +function SET_OPSGROUP:AddGroupsByName(AddGroupNames) +local AddGroupNamesArray=(type(AddGroupNames)=="table")and AddGroupNames or{AddGroupNames} +for AddGroupID,AddGroupName in pairs(AddGroupNamesArray)do +self:Add(AddGroupName,GROUP:FindByName(AddGroupName)) +end +return self +end +function SET_OPSGROUP:RemoveGroupsByName(RemoveGroupNames) +local RemoveGroupNamesArray=(type(RemoveGroupNames)=="table")and RemoveGroupNames or{RemoveGroupNames} +for RemoveGroupID,RemoveGroupName in pairs(RemoveGroupNamesArray)do +self:Remove(RemoveGroupName) +end +return self +end +function SET_OPSGROUP:CountAlive() +local CountG=0 +local CountU=0 +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +if GroupData and GroupData:IsAlive()then +CountG=CountG+1 +CountU=CountU+GroupData:GetGroup():CountAliveUnits() +end +end +return CountG,CountU +end +function SET_OPSGROUP:FindGroup(GroupName) +local GroupFound=self.Set[GroupName] +return GroupFound +end +function SET_OPSGROUP:FindFlightGroup(GroupName) +local GroupFound=self:FindGroup(GroupName) +return GroupFound +end +function SET_OPSGROUP:FindArmyGroup(GroupName) +local GroupFound=self:FindGroup(GroupName) +return GroupFound +end +function SET_OPSGROUP:FindNavyGroup(GroupName) +local GroupFound=self:FindGroup(GroupName) +return GroupFound +end +function SET_OPSGROUP:FilterCoalitions(Coalitions,Clear) +if Clear or not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_OPSGROUP:FilterCategories(Categories,Clear) +if Clear or not self.Filter.Categories then +self.Filter.Categories={} +end +if type(Categories)~="table"then +Categories={Categories} +end +for CategoryID,Category in pairs(Categories)do +self.Filter.Categories[Category]=Category +end +return self +end +function SET_OPSGROUP:FilterCategoryGround() +self:FilterCategories("ground") +return self +end +function SET_OPSGROUP:FilterCategoryAirplane() +self:FilterCategories("plane") +return self +end +function SET_OPSGROUP:FilterCategoryAircraft() +self:FilterCategories({"plane","helicopter"}) +return self +end +function SET_OPSGROUP:FilterCategoryHelicopter() +self:FilterCategories("helicopter") +return self +end +function SET_OPSGROUP:FilterCategoryShip() +self:FilterCategories("ship") +return self +end +function SET_OPSGROUP:FilterCountries(Countries,Clear) +if Clear or not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_OPSGROUP:FilterPrefixes(Prefixes,Clear) +if Clear or not self.Filter.GroupPrefixes then +self.Filter.GroupPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.GroupPrefixes[Prefix]=Prefix +end +return self +end +function SET_OPSGROUP:FilterActive(Active) +Active=Active or not(Active==false) +self.Filter.Active=Active +return self +end +function SET_OPSGROUP:FilterStart() +if _DATABASE then +self:_FilterStart() +self:HandleEvent(EVENTS.Birth,self._EventOnBirth) +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._EventOnDeadOrCrash) +end +return self +end +function SET_OPSGROUP:Activate(Delay) +local Set=self:GetSet() +for GroupID,GroupData in pairs(Set)do +local group=GroupData +if group and group:IsAlive()==false then +group:Activate(Delay) +end +end +return self +end +function SET_OPSGROUP:_EventOnBirth(Event) +if Event.IniDCSUnit and Event.IniDCSGroup then +local DCSgroup=Event.IniDCSGroup +local CountAliveActive=0 +for index,data in pairs(DCSgroup:getUnits())do +if data:isExist()and data:isActive()then +CountAliveActive=CountAliveActive+1 +end +end +if DCSgroup:getInitialSize()==DCSgroup:getSize()then +local groupname,group=self:AddInDatabase(Event) +if group and CountAliveActive==DCSgroup:getInitialSize()then +if group and self:IsIncludeObject(group)then +self:Add(groupname,group) +end +end +end +end +end +function SET_OPSGROUP:_EventOnDeadOrCrash(Event) +if Event.IniDCSGroup then +local ObjectName,Object=self:FindInDatabase(Event) +if ObjectName then +if Event.IniDCSGroup:getSize()==1 then +self:Remove(ObjectName) +end +end +end +end +function SET_OPSGROUP:AddInDatabase(Event) +if Event.IniObjectCategory==Object.Category.UNIT then +if not self.Database[Event.IniDCSGroupName]then +self.Database[Event.IniDCSGroupName]=GROUP:Register(Event.IniDCSGroupName) +end +end +return Event.IniDCSGroupName,self.Database[Event.IniDCSGroupName] +end +function SET_OPSGROUP:FindInDatabase(Event) +return Event.IniDCSGroupName,self.Database[Event.IniDCSGroupName] +end +function SET_OPSGROUP:ForEachGroup(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_OPSGROUP:IsIncludeObject(MGroup) +local MGroupInclude=true +if self.Filter.Active~=nil then +local MGroupActive=false +if self.Filter.Active==false or(self.Filter.Active==true and MGroup:IsActive()==true)then +MGroupActive=true +end +MGroupInclude=MGroupInclude and MGroupActive +end +if self.Filter.Coalitions and MGroupInclude then +local MGroupCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==MGroup:GetCoalition()then +MGroupCoalition=true +end +end +MGroupInclude=MGroupInclude and MGroupCoalition +end +if self.Filter.Categories and MGroupInclude then +local MGroupCategory=false +for CategoryID,CategoryName in pairs(self.Filter.Categories)do +if self.FilterMeta.Categories[CategoryName]and self.FilterMeta.Categories[CategoryName]==MGroup:GetCategory()then +MGroupCategory=true +end +end +MGroupInclude=MGroupInclude and MGroupCategory +end +if self.Filter.Countries and MGroupInclude then +local MGroupCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +if country.id[CountryName]==MGroup:GetCountry()then +MGroupCountry=true +end +end +MGroupInclude=MGroupInclude and MGroupCountry +end +if self.Filter.GroupPrefixes and MGroupInclude then +local MGroupPrefix=false +for GroupPrefixId,GroupPrefix in pairs(self.Filter.GroupPrefixes)do +if string.find(MGroup:GetName(),GroupPrefix:gsub("-","%%-"),1)then +MGroupPrefix=true +end +end +MGroupInclude=MGroupInclude and MGroupPrefix +end +if self.Filter.Functions and MGroupInclude then +local MClientFunc=self:_EvalFilterFunctions(MGroup) +MGroupInclude=MGroupInclude and MClientFunc +end +return MGroupInclude +end +end +do +SET_SCENERY={ +ClassName="SET_SCENERY", +Scenerys={}, +Filter={ +SceneryPrefixes=nil, +SceneryRoles=nil, +Zones=nil, +}, +} +function SET_SCENERY:New(ZoneSet) +local zoneset={} +local self=BASE:Inherit(self,SET_BASE:New(zoneset)) +local zonenames={} +if ZoneSet then +for _,_zone in pairs(ZoneSet.Set)do +table.insert(zonenames,_zone:GetName()) +end +self:AddSceneryByName(zonenames) +end +return self +end +function SET_SCENERY:NewFromZone(Zone) +local zone=Zone +if type(Zone)=="string"then +zone=ZONE:FindByName(Zone) +end +zone:Scan({Object.Category.SCENERY}) +return zone:GetScannedSetScenery() +end +function SET_SCENERY:AddScenery(AddScenery) +self:Add(AddScenery:GetName(),AddScenery) +return self +end +function SET_SCENERY:AddSceneryByName(AddSceneryNames) +local AddSceneryNamesArray=(type(AddSceneryNames)=="table")and AddSceneryNames or{AddSceneryNames} +for AddSceneryID,AddSceneryName in pairs(AddSceneryNamesArray)do +self:Add(AddSceneryName,SCENERY:FindByZoneName(AddSceneryName)) +end +return self +end +function SET_SCENERY:RemoveSceneryByName(RemoveSceneryNames) +local RemoveSceneryNamesArray=(type(RemoveSceneryNames)=="table")and RemoveSceneryNames or{RemoveSceneryNames} +for RemoveSceneryID,RemoveSceneryName in pairs(RemoveSceneryNamesArray)do +self:Remove(RemoveSceneryName) +end +return self +end +function SET_SCENERY:FindScenery(SceneryName) +local SceneryFound=self.Set[SceneryName] +return SceneryFound +end +function SET_SCENERY:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_SCENERY:FilterPrefixes(Prefixes) +if not self.Filter.SceneryPrefixes then +self.Filter.SceneryPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.SceneryPrefixes[Prefix]=Prefix +end +return self +end +function SET_SCENERY:FilterRoles(Role) +if not self.Filter.SceneryRoles then +self.Filter.SceneryRoles={} +end +if type(Role)~="table"then +Role={Role} +end +for PrefixID,Prefix in pairs(Role)do +self.Filter.SceneryRoles[Prefix]=Prefix +end +return self +end +function SET_SCENERY:CountAlive() +local Set=self:GetSet() +local CountU=0 +for UnitID,UnitData in pairs(Set)do +if UnitData and UnitData:IsAlive()then +CountU=CountU+1 +end +end +return CountU +end +function SET_SCENERY:GetAliveSet() +local AliveSet=SET_SCENERY:New() +for GroupName,GroupObject in pairs(self.Set)do +local GroupObject=GroupObject +if GroupObject then +if GroupObject:IsAlive()then +AliveSet:Add(GroupName,GroupObject) +end +end +end +return AliveSet.Set or{},AliveSet +end +function SET_SCENERY:ForEachScenery(IteratorFunction,...) +self:ForEach(IteratorFunction,arg,self:GetSet()) +return self +end +function SET_SCENERY:GetCoordinate() +local Coordinate=self:GetFirst():GetCoordinate() +local x1=Coordinate.x +local x2=Coordinate.x +local y1=Coordinate.y +local y2=Coordinate.y +local z1=Coordinate.z +local z2=Coordinate.z +for SceneryName,SceneryData in pairs(self:GetSet())do +local Scenery=SceneryData +local Coordinate=Scenery:GetCoordinate() +x1=(Coordinate.x<x1)and Coordinate.x or x1 +x2=(Coordinate.x>x2)and Coordinate.x or x2 +y1=(Coordinate.y<y1)and Coordinate.y or y1 +y2=(Coordinate.y>y2)and Coordinate.y or y2 +z1=(Coordinate.y<z1)and Coordinate.z or z1 +z2=(Coordinate.y>z2)and Coordinate.z or z2 +end +Coordinate.x=(x2-x1)/2+x1 +Coordinate.y=(y2-y1)/2+y1 +Coordinate.z=(z2-z1)/2+z1 +return Coordinate +end +function SET_SCENERY:IsIncludeObject(MScenery) +local MSceneryInclude=true +if MScenery then +local MSceneryName=MScenery:GetName() +if self.Filter.Prefixes then +local MSceneryPrefix=false +for ZonePrefixId,ZonePrefix in pairs(self.Filter.Prefixes)do +if string.find(MSceneryName,ZonePrefix,1)then +MSceneryPrefix=true +end +end +MSceneryInclude=MSceneryInclude and MSceneryPrefix +end +if self.Filter.Zones then +local MSceneryZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +local coord=MScenery:GetCoordinate() +if coord and Zone:IsCoordinateInZone(coord)then +MSceneryZone=true +end +end +MSceneryInclude=MSceneryInclude and MSceneryZone +end +if self.Filter.SceneryRoles then +local MSceneryRole=false +local Role=MScenery:GetProperty("ROLE")or"none" +for ZoneRoleId,ZoneRole in pairs(self.Filter.SceneryRoles)do +if ZoneRole==Role then +MSceneryRole=true +end +end +MSceneryInclude=MSceneryInclude and MSceneryRole +end +end +if self.Filter.Functions and MSceneryInclude then +local MClientFunc=self:_EvalFilterFunctions(MScenery) +MSceneryInclude=MSceneryInclude and MClientFunc +end +return MSceneryInclude +end +function SET_SCENERY:FilterOnce() +for ObjectName,Object in pairs(self:GetSet())do +if self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +else +self:Remove(ObjectName,true) +end +end +return self +end +function SET_SCENERY:GetLife0() +local life0=0 +self:ForEachScenery( +function(obj) +local Obj=obj +life0=life0+Obj:GetLife0() +end +) +return life0 +end +function SET_SCENERY:GetLife() +local life=0 +self:ForEachScenery( +function(obj) +local Obj=obj +life=life+Obj:GetLife() +end +) +return life +end +function SET_SCENERY:GetRelativeLife() +local life=self:GetLife() +local life0=self:GetLife0() +local rlife=math.floor((life/life0)*100) +return rlife +end +end +do +SET_DYNAMICCARGO={ +ClassName="SET_DYNAMICCARGO", +Set={}, +List={}, +Index={}, +Database=nil, +CallScheduler=nil, +Filter={ +Coalitions=nil, +Types=nil, +Countries=nil, +StaticPrefixes=nil, +Zones=nil, +}, +FilterMeta={ +Coalitions={ +red=coalition.side.RED, +blue=coalition.side.BLUE, +neutral=coalition.side.NEUTRAL, +} +}, +ZoneTimerInterval=20, +ZoneTimer=nil, +} +function SET_DYNAMICCARGO:New() +local self=BASE:Inherit(self,SET_BASE:New(_DATABASE.DYNAMICCARGO)) +return self +end +function SET_DYNAMICCARGO:IsIncludeObject(DCargo) +local DCargoInclude=true +if self.Filter.Coalitions then +local DCargoCoalition=false +for CoalitionID,CoalitionName in pairs(self.Filter.Coalitions)do +if self.FilterMeta.Coalitions[CoalitionName]and self.FilterMeta.Coalitions[CoalitionName]==DCargo:GetCoalition()then +DCargoCoalition=true +end +end +DCargoInclude=DCargoInclude and DCargoCoalition +end +if self.Filter.Types then +local DCargoType=false +for TypeID,TypeName in pairs(self.Filter.Types)do +if TypeName==DCargo:GetTypeName()then +DCargoType=true +end +end +DCargoInclude=DCargoInclude and DCargoType +end +if self.Filter.Countries then +local DCargoCountry=false +for CountryID,CountryName in pairs(self.Filter.Countries)do +if country.id[CountryName]==DCargo:GetCountry()then +DCargoCountry=true +end +end +DCargoInclude=DCargoInclude and DCargoCountry +end +if self.Filter.StaticPrefixes then +local DCargoPrefix=false +for StaticPrefixId,StaticPrefix in pairs(self.Filter.StaticPrefixes)do +if string.find(DCargo:GetName(),StaticPrefix,1)then +DCargoPrefix=true +end +end +DCargoInclude=DCargoInclude and DCargoPrefix +end +if self.Filter.Zones then +local DCargoZone=false +for ZoneName,Zone in pairs(self.Filter.Zones)do +if DCargo and DCargo:IsInZone(Zone)then +DCargoZone=true +end +end +DCargoInclude=DCargoInclude and DCargoZone +end +if self.Filter.Functions and DCargoInclude then +local MClientFunc=self:_EvalFilterFunctions(DCargo) +DCargoInclude=DCargoInclude and MClientFunc +end +return DCargoInclude +end +function SET_DYNAMICCARGO:FilterCoalitions(Coalitions) +if not self.Filter.Coalitions then +self.Filter.Coalitions={} +end +if type(Coalitions)~="table"then +Coalitions={Coalitions} +end +for CoalitionID,Coalition in pairs(Coalitions)do +self.Filter.Coalitions[Coalition]=Coalition +end +return self +end +function SET_DYNAMICCARGO:FilterTypes(Types) +if not self.Filter.Types then +self.Filter.Types={} +end +if type(Types)~="table"then +Types={Types} +end +for TypeID,Type in pairs(Types)do +self.Filter.Types[Type]=Type +end +return self +end +function SET_DYNAMICCARGO:FilterCountries(Countries) +if not self.Filter.Countries then +self.Filter.Countries={} +end +if type(Countries)~="table"then +Countries={Countries} +end +for CountryID,Country in pairs(Countries)do +self.Filter.Countries[Country]=Country +end +return self +end +function SET_DYNAMICCARGO:FilterPrefixes(Prefixes) +if not self.Filter.StaticPrefixes then +self.Filter.StaticPrefixes={} +end +if type(Prefixes)~="table"then +Prefixes={Prefixes} +end +for PrefixID,Prefix in pairs(Prefixes)do +self.Filter.StaticPrefixes[Prefix]=Prefix +end +return self +end +function SET_DYNAMICCARGO:FilterNamePattern(Patterns) +return self:FilterPrefixes(Patterns) +end +function SET_DYNAMICCARGO:FilterIsLoaded() +self:FilterFunction( +function(cargo) +if cargo and cargo.CargoState and cargo.CargoState==DYNAMICCARGO.State.LOADED then +return true +else +return false +end +end +) +return self +end +function SET_DYNAMICCARGO:FilterIsUnloaded() +self:FilterFunction( +function(cargo) +if cargo and cargo.CargoState and cargo.CargoState==DYNAMICCARGO.State.UNLOADED then +return true +else +return false +end +end +) +return self +end +function SET_DYNAMICCARGO:FilterIsNew() +self:FilterFunction( +function(cargo) +if cargo and cargo.CargoState and cargo.CargoState==DYNAMICCARGO.State.NEW then +return true +else +return false +end +end +) +return self +end +function SET_DYNAMICCARGO:FilterCurrentOwner(PlayerName) +self:FilterFunction( +function(cargo) +if cargo and cargo.Owner and string.find(cargo.Owner,PlayerName,1,true)then +return true +else +return false +end +end +) +return self +end +function SET_DYNAMICCARGO:FilterZones(Zones) +if not self.Filter.Zones then +self.Filter.Zones={} +end +local zones={} +if Zones.ClassName and Zones.ClassName=="SET_ZONE"then +zones=Zones.Set +elseif type(Zones)~="table"or(type(Zones)=="table"and Zones.ClassName)then +self:E("***** FilterZones needs either a table of ZONE Objects or a SET_ZONE as parameter!") +return self +else +zones=Zones +end +for _,Zone in pairs(zones)do +local zonename=Zone:GetName() +self.Filter.Zones[zonename]=Zone +end +return self +end +function SET_DYNAMICCARGO:FilterStart() +if _DATABASE then +self:HandleEvent(EVENTS.NewDynamicCargo,self._EventHandlerDCAdd) +self:HandleEvent(EVENTS.DynamicCargoRemoved,self._EventHandlerDCRemove) +if self.Filter.Zones then +self.ZoneTimer=TIMER:New(self._ContinousZoneFilter,self) +local timing=self.ZoneTimerInterval or 30 +self.ZoneTimer:Start(timing,timing) +end +self:_FilterStart() +end +return self +end +function SET_DYNAMICCARGO:FilterStop() +if _DATABASE then +self:UnHandleEvent(EVENTS.NewDynamicCargo) +self:UnHandleEvent(EVENTS.DynamicCargoRemoved) +if self.ZoneTimer and self.ZoneTimer:IsRunning()then +self.ZoneTimer:Stop() +end +end +return self +end +function SET_DYNAMICCARGO:_ContinousZoneFilter() +local Database=_DATABASE.DYNAMICCARGO +for ObjectName,Object in pairs(Database)do +if self:IsIncludeObject(Object)and self:IsNotInSet(Object)then +self:Add(ObjectName,Object) +elseif(not self:IsIncludeObject(Object))and self:IsInSet(Object)then +self:Remove(ObjectName) +end +end +return self +end +function SET_DYNAMICCARGO:_EventHandlerDCAdd(Event) +if Event.IniDynamicCargo and Event.IniDynamicCargoName then +if not _DATABASE.DYNAMICCARGO[Event.IniDynamicCargoName]then +_DATABASE:AddDynamicCargo(Event.IniDynamicCargoName) +end +local ObjectName,Object=self:FindInDatabase(Event) +if Object and self:IsIncludeObject(Object)then +self:Add(ObjectName,Object) +end +end +return self +end +function SET_DYNAMICCARGO:_EventHandlerDCRemove(Event) +if Event.IniDCSUnitName then +local ObjectName,Object=self:FindInDatabase(Event) +if ObjectName then +self:Remove(ObjectName) +end +end +return self +end +function SET_DYNAMICCARGO:FindInDatabase(Event) +return Event.IniDCSUnitName,self.Set[Event.IniDCSUnitName] +end +function SET_DYNAMICCARGO:FilterZoneTimer(Seconds) +self.ZoneTimerInterval=Seconds or 30 +return self +end +function SET_DYNAMICCARGO:FilterDeads() +return self +end +function SET_DYNAMICCARGO:FilterCrashes() +return self +end +function SET_DYNAMICCARGO:GetOwnerNames() +local owners={} +self:ForEach( +function(cargo) +if cargo and cargo.Owner then +table.insert(owners,cargo.Owner,cargo.Owner) +end +end +) +return owners +end +function SET_DYNAMICCARGO:GetStorageObjects() +local owners={} +self:ForEach( +function(cargo) +if cargo and cargo.warehouse then +table.insert(owners,cargo.StaticName,cargo.warehouse) +end +end +) +return owners +end +function SET_DYNAMICCARGO:GetOwnerClientObjects() +local owners={} +self:ForEach( +function(cargo) +if cargo and cargo.Owner then +local client=CLIENT:FindByPlayerName(cargo.Owner) +if client then +table.insert(owners,cargo.Owner,client) +end +end +end +) +return owners +end +end +do +COORDINATE={ +ClassName="COORDINATE", +} +COORDINATE.WaypointAltType={ +BARO="BARO", +RADIO="RADIO", +} +COORDINATE.WaypointAction={ +TurningPoint="Turning Point", +FlyoverPoint="Fly Over Point", +FromParkingArea="From Parking Area", +FromParkingAreaHot="From Parking Area Hot", +FromGroundAreaHot="From Ground Area Hot", +FromGroundArea="From Ground Area", +FromRunway="From Runway", +Landing="Landing", +LandingReFuAr="LandingReFuAr", +} +COORDINATE.WaypointType={ +TakeOffParking="TakeOffParking", +TakeOffParkingHot="TakeOffParkingHot", +TakeOff="TakeOffParkingHot", +TakeOffGroundHot="TakeOffGroundHot", +TakeOffGround="TakeOffGround", +TurningPoint="Turning Point", +Land="Land", +LandingReFuAr="LandingReFuAr", +} +function COORDINATE:New(x,y,z) +local self=BASE:Inherit(self,BASE:New()) +self.x=x +self.y=y +self.z=z +return self +end +function COORDINATE:NewFromCoordinate(Coordinate) +local self=BASE:Inherit(self,BASE:New()) +self.x=Coordinate.x +self.y=Coordinate.y +self.z=Coordinate.z +return self +end +function COORDINATE:NewFromVec2(Vec2,LandHeightAdd) +local LandHeight=land.getHeight(Vec2) +LandHeightAdd=LandHeightAdd or 0 +LandHeight=LandHeight+LandHeightAdd +local self=self:New(Vec2.x,LandHeight,Vec2.y) +return self +end +function COORDINATE:NewFromVec3(Vec3) +local self=self:New(Vec3.x,Vec3.y,Vec3.z) +self:F2(self) +return self +end +function COORDINATE:NewFromWaypoint(Waypoint) +local self=self:New(Waypoint.x,Waypoint.alt,Waypoint.y) +return self +end +function COORDINATE:GetCoordinate() +return self +end +function COORDINATE:GetVec3() +return{x=self.x,y=self.y,z=self.z} +end +function COORDINATE:GetVec2() +return{x=self.x,y=self.z} +end +function COORDINATE:UpdateFromVec3(Vec3) +self.x=Vec3.x +self.y=Vec3.y +self.z=Vec3.z +return self +end +function COORDINATE:UpdateFromCoordinate(Coordinate) +self.x=Coordinate.x +self.y=Coordinate.y +self.z=Coordinate.z +return self +end +function COORDINATE:UpdateFromVec2(Vec2) +self.x=Vec2.x +self.z=Vec2.y +return self +end +function COORDINATE:GetMagneticDeclination(Month,Year) +local decl=UTILS.GetMagneticDeclination() +if require then +local magvar=require('magvar') +if magvar then +local date,year,month,day=UTILS.GetDCSMissionDate() +magvar.init(Month or month,Year or year) +local lat,lon=self:GetLLDDM() +decl=magvar.get_mag_decl(lat,lon) +if decl then +decl=math.deg(decl) +end +end +else +self:T("The require package is not available. Using constant value for magnetic declination") +end +return decl +end +function COORDINATE:NewFromLLDD(latitude,longitude,altitude) +local vec3=coord.LLtoLO(latitude,longitude) +local _coord=self:NewFromVec3(vec3) +if altitude==nil then +_coord.y=self:GetLandHeight() +else +_coord.y=altitude +end +return _coord +end +function COORDINATE:IsAtCoordinate2D(Coordinate,Precision) +self:F({Coordinate=Coordinate:GetVec2()}) +self:F({self=self:GetVec2()}) +local x=Coordinate.x +local z=Coordinate.z +return x-Precision<=self.x and x+Precision>=self.x and z-Precision<=self.z and z+Precision>=self.z +end +function COORDINATE:ScanObjects(radius,scanunits,scanstatics,scanscenery) +self:F(string.format("Scanning in radius %.1f m.",radius or 100)) +local SphereSearch={ +id=world.VolumeType.SPHERE, +params={ +point=self:GetVec3(), +radius=radius, +} +} +radius=radius or 100 +if scanunits==nil then +scanunits=true +end +if scanstatics==nil then +scanstatics=true +end +if scanscenery==nil then +scanscenery=false +end +local scanobjects={} +if scanunits then +table.insert(scanobjects,Object.Category.UNIT) +end +if scanstatics then +table.insert(scanobjects,Object.Category.STATIC) +end +if scanscenery then +table.insert(scanobjects,Object.Category.SCENERY) +end +local Units={} +local Statics={} +local Scenery={} +local gotstatics=false +local gotunits=false +local gotscenery=false +local function EvaluateZone(ZoneObject) +if ZoneObject then +local ObjectCategory=Object.getCategory(ZoneObject) +if ObjectCategory==Object.Category.UNIT and ZoneObject:isExist()then +table.insert(Units,UNIT:Find(ZoneObject)) +gotunits=true +elseif ObjectCategory==Object.Category.STATIC and ZoneObject:isExist()then +table.insert(Statics,ZoneObject) +gotstatics=true +elseif ObjectCategory==Object.Category.SCENERY then +table.insert(Scenery,ZoneObject) +gotscenery=true +end +end +return true +end +world.searchObjects(scanobjects,SphereSearch,EvaluateZone) +for _,unit in pairs(Units)do +self:T(string.format("Scan found unit %s",unit:GetName())) +end +for _,static in pairs(Statics)do +self:T(string.format("Scan found static %s",static:getName())) +_DATABASE:AddStatic(static:getName()) +end +for _,scenery in pairs(Scenery)do +self:T(string.format("Scan found scenery %s typename=%s",scenery:getName(),scenery:getTypeName())) +end +return gotunits,gotstatics,gotscenery,Units,Statics,Scenery +end +function COORDINATE:ScanUnits(radius) +local _,_,_,units=self:ScanObjects(radius,true,false,false) +local set=SET_UNIT:New() +for _,unit in pairs(units)do +set:AddUnit(unit) +end +return set +end +function COORDINATE:ScanStatics(radius) +local _,_,_,_,statics=self:ScanObjects(radius,false,true,false) +local set=SET_STATIC:New() +for _,stat in pairs(statics)do +set:AddStatic(STATIC:Find(stat)) +end +return set +end +function COORDINATE:FindClosestStatic(radius) +local units=self:ScanStatics(radius) +local umin=nil +local dmin=math.huge +for _,_unit in pairs(units.Set)do +local unit=_unit +local coordinate=unit:GetCoordinate() +local d=self:Get2DDistance(coordinate) +if d<dmin then +dmin=d +umin=unit +end +end +return umin +end +function COORDINATE:FindClosestUnit(radius) +local units=self:ScanUnits(radius) +local umin=nil +local dmin=math.huge +for _,_unit in pairs(units.Set)do +local unit=_unit +local coordinate=unit:GetCoordinate() +local d=self:Get2DDistance(coordinate) +if d<dmin then +dmin=d +umin=unit +end +end +return umin +end +function COORDINATE:ScanScenery(radius) +local _,_,_,_,_,scenerys=self:ScanObjects(radius,false,false,true) +local set={} +for _,_scenery in pairs(scenerys)do +local scenery=_scenery +local name=scenery:getName() +local s=SCENERY:Register(name,scenery) +table.insert(set,s) +end +return set +end +function COORDINATE:FindClosestScenery(radius) +local sceneries=self:ScanScenery(radius) +local umin=nil +local dmin=math.huge +for _,_scenery in pairs(sceneries)do +local scenery=_scenery +local coordinate=scenery:GetCoordinate() +local d=self:Get2DDistance(coordinate) +if d<dmin then +dmin=d +umin=scenery +end +end +return umin +end +function COORDINATE:DistanceFromPointVec2(PointVec2Reference) +self:F2(PointVec2Reference) +if not PointVec2Reference then return math.huge end +local Distance=((PointVec2Reference.x-self.x)^2+(PointVec2Reference.z-self.z)^2)^0.5 +self:T2(Distance) +return Distance +end +function COORDINATE:Translate(Distance,Angle,Keepalt,Overwrite) +local alpha=math.rad((Angle or 0)) +local x=Distance*math.cos(alpha)+self.x +local z=Distance*math.sin(alpha)+self.z +local y=Keepalt and self.y or land.getHeight({x=x,y=z}) +if Overwrite then +self.x=x +self.y=y +self.z=z +return self +else +local coord=COORDINATE:New(x,y,z) +return coord +end +end +function COORDINATE:Rotate2D(Angle) +if not Angle then +return self +end +local phi=math.rad(Angle) +local X=self.z +local Y=self.x +local x=X*math.cos(phi)-Y*math.sin(phi) +local y=X*math.sin(phi)+Y*math.cos(phi) +local coord=COORDINATE:NewFromVec3({x=y,y=self.y,z=x}) +return coord +end +function COORDINATE:GetRandomVec2InRadius(OuterRadius,InnerRadius) +self:F2({OuterRadius,InnerRadius}) +math.random() +math.random() +math.random() +local Theta=2*math.pi*math.random() +local Radials=math.random()+math.random() +if Radials>1 then +Radials=2-Radials +end +local RadialMultiplier +if InnerRadius and InnerRadius<=OuterRadius then +RadialMultiplier=(OuterRadius-InnerRadius)*Radials+InnerRadius +else +RadialMultiplier=OuterRadius*Radials +end +local RandomVec2 +if OuterRadius>0 then +RandomVec2={x=math.cos(Theta)*RadialMultiplier+self.x,y=math.sin(Theta)*RadialMultiplier+self.z} +else +RandomVec2={x=self.x,y=self.z} +end +return RandomVec2 +end +function COORDINATE:GetRandomCoordinateInRadius(OuterRadius,InnerRadius) +self:F2({OuterRadius,InnerRadius}) +local coord=COORDINATE:NewFromVec2(self:GetRandomVec2InRadius(OuterRadius,InnerRadius)) +return coord +end +function COORDINATE:GetRandomVec3InRadius(OuterRadius,InnerRadius) +local RandomVec2=self:GetRandomVec2InRadius(OuterRadius,InnerRadius) +local y=self.y+math.random(InnerRadius,OuterRadius) +local RandomVec3={x=RandomVec2.x,y=y,z=RandomVec2.y} +return RandomVec3 +end +function COORDINATE:GetLandHeight() +local Vec2={x=self.x,y=self.z} +return land.getHeight(Vec2) +end +function COORDINATE:GetLandProfileVec3(Destination) +return land.profile(self:GetVec3(),Destination) +end +function COORDINATE:GetLandProfileCoordinates(Destination) +local points=self:GetLandProfileVec3(Destination:GetVec3()) +local coords={} +for _,point in ipairs(points)do +table.insert(coords,COORDINATE:NewFromVec3(point)) +end +return coords +end +function COORDINATE:SetHeading(Heading) +self.Heading=Heading +end +function COORDINATE:GetHeading() +return self.Heading +end +function COORDINATE:SetVelocity(Velocity) +self.Velocity=Velocity +end +function COORDINATE:GetVelocity() +local Velocity=self.Velocity +return Velocity or 0 +end +function COORDINATE:GetName() +local name=self:ToStringMGRS() +return name +end +function COORDINATE:GetMovingText(Settings) +return self:GetVelocityText(Settings)..", "..self:GetHeadingText(Settings) +end +function COORDINATE:GetDirectionVec3(TargetCoordinate) +if TargetCoordinate then +return{x=TargetCoordinate.x-self.x,y=TargetCoordinate.y-self.y,z=TargetCoordinate.z-self.z} +else +return{x=0,y=0,z=0} +end +end +function COORDINATE:GetNorthCorrectionRadians() +local TargetVec3=self:GetVec3() +local lat,lon=coord.LOtoLL(TargetVec3) +local north_posit=coord.LLtoLO(lat+1,lon) +return math.atan2(north_posit.z-TargetVec3.z,north_posit.x-TargetVec3.x) +end +function COORDINATE:GetAngleRadians(DirectionVec3) +local DirectionRadians=math.atan2(DirectionVec3.z,DirectionVec3.x) +if DirectionRadians<0 then +DirectionRadians=DirectionRadians+2*math.pi +end +return DirectionRadians +end +function COORDINATE:GetAngleDegrees(DirectionVec3) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Angle=UTILS.ToDegree(AngleRadians) +return Angle +end +function COORDINATE:GetIntermediateCoordinate(ToCoordinate,Fraction) +local f=Fraction or 0.5 +local vec=UTILS.VecSubstract(ToCoordinate,self) +if f>1 then +local norm=UTILS.VecNorm(vec) +f=Fraction/norm +end +vec.x=f*vec.x +vec.y=f*vec.y +vec.z=f*vec.z +vec=UTILS.VecAdd(self,vec) +local coord=COORDINATE:New(vec.x,vec.y,vec.z) +return coord +end +function COORDINATE:Get2DDistance(TargetCoordinate) +if not TargetCoordinate then return 1000000 end +local a=self:GetVec2() +if not TargetCoordinate.ClassName then +TargetCoordinate=COORDINATE:NewFromVec3(TargetCoordinate) +end +local b=TargetCoordinate:GetVec2() +local norm=UTILS.VecDist2D(a,b) +return norm +end +function COORDINATE:GetTemperature(height) +self:F2(height) +local y=height or self.y +local point={x=self.x,y=height or self.y,z=self.z} +local T,P=atmosphere.getTemperatureAndPressure(point) +return T-273.15 +end +function COORDINATE:GetTemperatureText(height,Settings) +local DegreesCelcius=self:GetTemperature(height) +local Settings=Settings or _SETTINGS +if DegreesCelcius then +if Settings:IsMetric()then +return string.format(" %-2.2f °C",DegreesCelcius) +else +return string.format(" %-2.2f °F",UTILS.CelsiusToFahrenheit(DegreesCelcius)) +end +else +return" no temperature" +end +return nil +end +function COORDINATE:GetPressure(height) +local point={x=self.x,y=height or self.y,z=self.z} +local T,P=atmosphere.getTemperatureAndPressure(point) +return P/100 +end +function COORDINATE:GetPressureText(height,Settings) +local Pressure_hPa=self:GetPressure(height) +local Pressure_mmHg=Pressure_hPa*0.7500615613030 +local Pressure_inHg=Pressure_hPa*0.0295299830714 +local Settings=Settings or _SETTINGS +if Pressure_hPa then +if Settings:IsMetric()then +return string.format(" %4.1f hPa (%3.1f mmHg)",Pressure_hPa,Pressure_mmHg) +else +return string.format(" %4.1f hPa (%3.2f inHg)",Pressure_hPa,Pressure_inHg) +end +else +return" no pressure" +end +return nil +end +function COORDINATE:HeadingTo(ToCoordinate) +local dz=ToCoordinate.z-self.z +local dx=ToCoordinate.x-self.x +local heading=math.deg(math.atan2(dz,dx)) +if heading<0 then +heading=360+heading +end +return heading +end +function COORDINATE:GetWindVec3(height,turbulence) +local landheight=self:GetLandHeight()+0.1 +local point={x=self.x,y=math.max(height or self.y,landheight),z=self.z} +local wind=nil +if turbulence then +wind=atmosphere.getWindWithTurbulence(point) +else +wind=atmosphere.getWind(point) +end +return wind +end +function COORDINATE:GetWind(height,turbulence) +local wind=self:GetWindVec3(height,turbulence) +local direction=UTILS.VecHdg(wind) +if direction>180 then +direction=direction-180 +else +direction=direction+180 +end +local strength=UTILS.VecNorm(wind) +return direction,strength +end +function COORDINATE:GetWindWithTurbulenceVec3(height) +local landheight=self:GetLandHeight()+0.1 +local point={x=self.x,y=math.max(height or self.y,landheight),z=self.z} +local vec3=atmosphere.getWindWithTurbulence(point) +return vec3 +end +function COORDINATE:GetX() +return self.x +end +function COORDINATE:GetY() +if self:IsInstanceOf("POINT_VEC2")then +return self.z +end +return self.y +end +function COORDINATE:GetZ() +return self.z +end +function COORDINATE:SetX(x) +self.x=x +return self +end +function COORDINATE:SetY(y) +if self:IsInstanceOf("POINT_VEC2")then +self.z=y +else +self.y=y +end +return self +end +function COORDINATE:SetZ(z) +self.z=z +return self +end +function COORDINATE:AddX(x) +self.x=self.x+x +return self +end +function COORDINATE:GetLat() +return self.x +end +function COORDINATE:SetLat(x) +self.x=x +return self +end +function COORDINATE:GetLon() +return self.z +end +function COORDINATE:SetLon(z) +self.z=z +return self +end +function COORDINATE:GetAlt() +return self.y~=0 or land.getHeight({x=self.x,y=self.z}) +end +function COORDINATE:SetAlt(Altitude) +self.y=Altitude or land.getHeight({x=self.x,y=self.z}) +return self +end +function COORDINATE:AddAlt(Altitude) +self.y=land.getHeight({x=self.x,y=self.z})+Altitude or 0 +return self +end +function COORDINATE:GetRandomPointVec2InRadius(OuterRadius,InnerRadius) +self:F2({OuterRadius,InnerRadius}) +return COORDINATE:NewFromVec2(self:GetRandomVec2InRadius(OuterRadius,InnerRadius)) +end +function COORDINATE:AddY(y) +if self:IsInstanceOf("POINT_VEC2")then +return self:AddZ(y) +else +self.y=self.y+y +end +return self +end +function COORDINATE:AddZ(z) +self.z=self.z+z +return self +end +function COORDINATE:GetWindText(height,Settings) +local Direction,Strength=self:GetWind(height) +local Settings=Settings or _SETTINGS +if Direction and Strength then +if Settings:IsMetric()then +return string.format(" %d ° at %3.2f mps",Direction,UTILS.MpsToKmph(Strength)) +else +return string.format(" %d ° at %3.2f kps",Direction,UTILS.MpsToKnots(Strength)) +end +else +return" no wind" +end +return nil +end +function COORDINATE:Get3DDistance(TargetCoordinate) +local TargetVec3={x=TargetCoordinate.x,y=TargetCoordinate.y,z=TargetCoordinate.z} +local SourceVec3=self:GetVec3() +local dist=UTILS.VecDist3D(TargetVec3,SourceVec3) +return dist +end +function COORDINATE:GetBearingText(AngleRadians,Precision,Settings,MagVar) +local Settings=Settings or _SETTINGS +local AngleDegrees=UTILS.Round(UTILS.ToDegree(AngleRadians),Precision) +local s=string.format('%03d°',AngleDegrees) +if MagVar then +local variation=self:GetMagneticDeclination()or 0 +local AngleMagnetic=AngleDegrees-variation +if AngleMagnetic<0 then AngleMagnetic=360-AngleMagnetic end +s=string.format('%03d°M|%03d°',AngleMagnetic,AngleDegrees) +end +return s +end +function COORDINATE:GetDistanceText(Distance,Settings,Language,Precision) +local Settings=Settings or _SETTINGS +local Language=Language or Settings.Locale or _SETTINGS.Locale or"EN" +Language=string.lower(Language) +local Precision=Precision or 0 +local DistanceText +if Settings:IsMetric()then +if Language=="en"then +DistanceText=" for "..UTILS.Round(Distance/1000,Precision).." km" +elseif Language=="ru"then +DistanceText=" за "..UTILS.Round(Distance/1000,Precision).." километров" +end +else +if Language=="en"then +DistanceText=" for "..UTILS.Round(UTILS.MetersToNM(Distance),Precision).." miles" +elseif Language=="ru"then +DistanceText=" за "..UTILS.Round(UTILS.MetersToNM(Distance),Precision).." миль" +end +end +return DistanceText +end +function COORDINATE:GetAltitudeText(Settings,Language) +local Altitude=self.y +local Settings=Settings or _SETTINGS +local Language=Language or Settings.Locale or _SETTINGS.Locale or"EN" +Language=string.lower(Language) +if Altitude~=0 then +if Settings:IsMetric()then +if Language=="en"then +return" at "..UTILS.Round(self.y,-3).." meters" +elseif Language=="ru"then +return" в "..UTILS.Round(self.y,-3).." метры" +end +else +if Language=="en"then +return" at "..UTILS.Round(UTILS.MetersToFeet(self.y),-3).." feet" +elseif Language=="ru"then +return" в "..UTILS.Round(self.y,-3).." ноги" +end +end +else +return"" +end +end +function COORDINATE:GetVelocityText(Settings) +local Velocity=self:GetVelocity() +local Settings=Settings or _SETTINGS +if Velocity then +if Settings:IsMetric()then +return string.format(" moving at %d km/h",UTILS.MpsToKmph(Velocity)) +else +return string.format(" moving at %d mi/h",UTILS.MpsToKmph(Velocity)/1.852) +end +else +return" stationary" +end +end +function COORDINATE:GetHeadingText(Settings) +local Heading=self:GetHeading() +if Heading then +return string.format(" bearing %3d°",Heading) +else +return" bearing unknown" +end +end +function COORDINATE:GetBRText(AngleRadians,Distance,Settings,Language,MagVar,Precision) +local Settings=Settings or _SETTINGS +Precision=Precision or 0 +local BearingText=self:GetBearingText(AngleRadians,0,Settings,MagVar) +local DistanceText=self:GetDistanceText(Distance,Settings,Language,Precision) +local BRText=BearingText..DistanceText +return BRText +end +function COORDINATE:GetBRAText(AngleRadians,Distance,Settings,Language,MagVar) +local Settings=Settings or _SETTINGS +local BearingText=self:GetBearingText(AngleRadians,0,Settings,MagVar) +local DistanceText=self:GetDistanceText(Distance,Settings,Language,0) +local AltitudeText=self:GetAltitudeText(Settings,Language) +local BRAText=BearingText..DistanceText..AltitudeText +return BRAText +end +function COORDINATE:SetAltitude(altitude,asl) +local alt=altitude +if asl then +alt=altitude +else +alt=self:GetLandHeight()+altitude +end +self.y=alt +return self +end +function COORDINATE:SetAtLandheight() +local alt=self:GetLandHeight() +self.y=alt +return self +end +function COORDINATE:WaypointAir(AltType,Type,Action,Speed,SpeedLocked,airbase,DCSTasks,description,timeReFuAr) +self:F2({AltType,Type,Action,Speed,SpeedLocked}) +AltType=AltType or"RADIO" +if SpeedLocked==nil then +SpeedLocked=true +end +Speed=Speed or 500 +local RoutePoint={} +RoutePoint.x=self.x +RoutePoint.y=self.z +RoutePoint.alt=self.y +RoutePoint.alt_type=AltType +RoutePoint.type=Type or nil +RoutePoint.action=Action or nil +RoutePoint.speed=Speed/3.6 +RoutePoint.speed_locked=SpeedLocked +RoutePoint.ETA=0 +RoutePoint.ETA_locked=false +RoutePoint.name=description +if airbase then +local AirbaseID=airbase:GetID() +local AirbaseCategory=airbase:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP or AirbaseCategory==Airbase.Category.HELIPAD then +RoutePoint.linkUnit=AirbaseID +RoutePoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.AIRDROME then +RoutePoint.airdromeId=AirbaseID +else +self:E("ERROR: Unknown airbase category in COORDINATE:WaypointAir()!") +end +end +if Type==COORDINATE.WaypointType.LandingReFuAr then +RoutePoint.timeReFuAr=timeReFuAr or 10 +end +RoutePoint.task={} +RoutePoint.task.id="ComboTask" +RoutePoint.task.params={} +RoutePoint.task.params.tasks=DCSTasks or{} +self:T({RoutePoint=RoutePoint}) +return RoutePoint +end +function COORDINATE:WaypointAirTurningPoint(AltType,Speed,DCSTasks,description) +return self:WaypointAir(AltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true,nil,DCSTasks,description) +end +function COORDINATE:WaypointAirFlyOverPoint(AltType,Speed) +return self:WaypointAir(AltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.FlyoverPoint,Speed) +end +function COORDINATE:WaypointAirTakeOffParkingHot(AltType,Speed) +return self:WaypointAir(AltType,COORDINATE.WaypointType.TakeOffParkingHot,COORDINATE.WaypointAction.FromParkingAreaHot,Speed) +end +function COORDINATE:WaypointAirTakeOffParking(AltType,Speed) +return self:WaypointAir(AltType,COORDINATE.WaypointType.TakeOffParking,COORDINATE.WaypointAction.FromParkingArea,Speed) +end +function COORDINATE:WaypointAirTakeOffRunway(AltType,Speed) +return self:WaypointAir(AltType,COORDINATE.WaypointType.TakeOff,COORDINATE.WaypointAction.FromRunway,Speed) +end +function COORDINATE:WaypointAirLanding(Speed,airbase,DCSTasks,description) +return self:WaypointAir(nil,COORDINATE.WaypointType.Land,COORDINATE.WaypointAction.Landing,Speed,false,airbase,DCSTasks,description) +end +function COORDINATE:WaypointAirLandingReFu(Speed,airbase,timeReFuAr,DCSTasks,description) +return self:WaypointAir(nil,COORDINATE.WaypointType.LandingReFuAr,COORDINATE.WaypointAction.LandingReFuAr,Speed,false,airbase,DCSTasks,description,timeReFuAr or 10) +end +function COORDINATE:WaypointGround(Speed,Formation,DCSTasks) +self:F2({Speed,Formation,DCSTasks}) +local RoutePoint={} +RoutePoint.x=self.x +RoutePoint.y=self.z +RoutePoint.alt=self:GetLandHeight()+1 +RoutePoint.alt_type=COORDINATE.WaypointAltType.BARO +RoutePoint.type="Turning Point" +RoutePoint.action=Formation or"Off Road" +RoutePoint.formation_template="" +RoutePoint.ETA=0 +RoutePoint.ETA_locked=false +RoutePoint.speed=(Speed or 20)/3.6 +RoutePoint.speed_locked=true +RoutePoint.task={} +RoutePoint.task.id="ComboTask" +RoutePoint.task.params={} +RoutePoint.task.params.tasks=DCSTasks or{} +return RoutePoint +end +function COORDINATE:WaypointNaval(Speed,Depth,DCSTasks) +self:F2({Speed,Depth,DCSTasks}) +local RoutePoint={} +RoutePoint.x=self.x +RoutePoint.y=self.z +RoutePoint.alt=Depth or self.y +RoutePoint.alt_type="BARO" +RoutePoint.type="Turning Point" +RoutePoint.action="Turning Point" +RoutePoint.formation_template="" +RoutePoint.ETA=0 +RoutePoint.ETA_locked=false +RoutePoint.speed=(Speed or 20)/3.6 +RoutePoint.speed_locked=true +RoutePoint.task={} +RoutePoint.task.id="ComboTask" +RoutePoint.task.params={} +RoutePoint.task.params.tasks=DCSTasks or{} +return RoutePoint +end +function COORDINATE:GetClosestAirbase(Category,Coalition) +local airbases=AIRBASE.GetAllAirbases(Coalition) +local closest=nil +local distmin=nil +for _,_airbase in pairs(airbases)do +local airbase=_airbase +if airbase then +local category=airbase:GetAirbaseCategory() +if Category and Category==category or Category==nil then +local dist=self:Get2DDistance(airbase:GetCoordinate()) +if closest==nil then +distmin=dist +closest=airbase +else +if dist<distmin then +distmin=dist +closest=airbase +end +end +end +end +end +return closest,distmin +end +function COORDINATE:GetClosestAirbase2(Category,Coalition) +local closest,distmin=self:GetClosestAirbase(Category,Coalition) +return closest,distmin +end +function COORDINATE:GetClosestParkingSpot(airbase,terminaltype,free) +local airbases={} +if airbase then +table.insert(airbases,airbase) +else +airbases=AIRBASE.GetAllAirbases() +end +local _closest=nil +local _termID=nil +local _distmin=nil +local spot=nil +for _,_airbase in pairs(airbases)do +local mybase=_airbase +local parkingdata=mybase:GetParkingSpotsTable(terminaltype) +for _,_spot in pairs(parkingdata)do +if(free==true and _spot.Free==true)or(free==false and _spot.Free==false)or free==nil then +local _coord=_spot.Coordinate +local _dist=self:Get2DDistance(_coord) +if _distmin==nil then +_closest=_coord +_distmin=_dist +_termID=_spot.TerminalID +spot=_spot +else +if _dist<_distmin then +_distmin=_dist +_closest=_coord +_termID=_spot.TerminalID +spot=_spot +end +end +end +end +end +return _closest,_termID,_distmin,spot +end +function COORDINATE:GetClosestFreeParkingSpot(airbase,terminaltype) +return self:GetClosestParkingSpot(airbase,terminaltype,true) +end +function COORDINATE:GetClosestOccupiedParkingSpot(airbase,terminaltype) +return self:GetClosestParkingSpot(airbase,terminaltype,false) +end +function COORDINATE:GetClosestPointToRoad(Railroad) +local roadtype="roads" +if Railroad==true then +roadtype="railroads" +end +local x,y=land.getClosestPointOnRoads(roadtype,self.x,self.z) +local coord=nil +if x and y then +local vec2={x=x,y=y} +coord=COORDINATE:NewFromVec2(vec2) +end +return coord +end +function COORDINATE:GetPathOnRoad(ToCoord,IncludeEndpoints,Railroad,MarkPath,SmokePath) +local RoadType="roads" +if Railroad==true then +RoadType="railroads" +end +local path=land.findPathOnRoads(RoadType,self.x,self.z,ToCoord.x,ToCoord.z) +local Path={} +local Way=0 +if IncludeEndpoints then +Path[1]=self +end +local GotPath=true +if path then +for _i,_vec2 in ipairs(path)do +local coord=COORDINATE:NewFromVec2(_vec2) +Path[#Path+1]=coord +end +else +self:E("Path is nil. No valid path on road could be found.") +GotPath=false +end +if IncludeEndpoints then +Path[#Path+1]=ToCoord +end +if MarkPath or SmokePath then +for i,c in pairs(Path)do +local coord=c +if MarkPath then +coord:MarkToAll(string.format("Path segment %d",i)) +end +if SmokePath then +if i==1 or i==#Path then +coord:SmokeBlue() +else +coord:SmokeGreen() +end +end +end +end +if#Path>=2 then +for i=1,#Path-1 do +Way=Way+Path[i+1]:Get2DDistance(Path[i]) +end +else +return nil,nil,false +end +return Path,Way,GotPath +end +function COORDINATE:GetSurfaceType() +local vec2=self:GetVec2() +local surface=land.getSurfaceType(vec2) +return surface +end +function COORDINATE:IsSurfaceTypeLand() +return self:GetSurfaceType()==land.SurfaceType.LAND +end +function COORDINATE:IsSurfaceTypeLand() +return self:GetSurfaceType()==land.SurfaceType.LAND +end +function COORDINATE:IsSurfaceTypeRoad() +return self:GetSurfaceType()==land.SurfaceType.ROAD +end +function COORDINATE:IsSurfaceTypeRunway() +return self:GetSurfaceType()==land.SurfaceType.RUNWAY +end +function COORDINATE:IsSurfaceTypeShallowWater() +return self:GetSurfaceType()==land.SurfaceType.SHALLOW_WATER +end +function COORDINATE:IsSurfaceTypeWater() +return self:GetSurfaceType()==land.SurfaceType.WATER +end +function COORDINATE:Explosion(ExplosionIntensity,Delay) +ExplosionIntensity=ExplosionIntensity or 100 +if Delay and Delay>0 then +self:ScheduleOnce(Delay,self.Explosion,self,ExplosionIntensity) +else +trigger.action.explosion(self:GetVec3(),ExplosionIntensity) +end +return self +end +function COORDINATE:IlluminationBomb(Power,Delay) +Power=Power or 1000 +if Delay and Delay>0 then +self:ScheduleOnce(Delay,self.IlluminationBomb,self,Power) +else +trigger.action.illuminationBomb(self:GetVec3(),Power) +end +return self +end +function COORDINATE:Smoke(SmokeColor,Duration,Delay,Name,Offset,Direction,Distance) +self:F2({SmokeColor,Name,Duration,Delay,Offset}) +SmokeColor=SmokeColor or SMOKECOLOR.Green +if Delay and Delay>0 then +self:ScheduleOnce(Delay,COORDINATE.Smoke,self,SmokeColor,Duration,0,Name,Direction,Distance) +else +self.firename=Name or"Smoke-"..math.random(1,100000) +if Offset or self.SmokeOffset then +local Angle=Direction or self:GetSmokeOffsetDirection() +local Distance=Distance or self:GetSmokeOffsetDistance() +local newpos=self:Translate(Distance,Angle,true,false) +local newvec3=newpos:GetVec3() +trigger.action.smoke(newvec3,SmokeColor,self.firename) +else +trigger.action.smoke(self:GetVec3(),SmokeColor,self.firename) +end +if Duration and Duration>0 then +self:ScheduleOnce(Duration,COORDINATE.StopSmoke,self,self.firename) +end +end +return self +end +function COORDINATE:GetSmokeOffsetDirection() +local direction=self.SmokeOffsetDirection or math.random(1,359) +return direction +end +function COORDINATE:SetSmokeOffsetDirection(Direction) +if self then +self.SmokeOffsetDirection=Direction or math.random(1,359) +return self +else +COORDINATE.SmokeOffsetDirection=Direction or math.random(1,359) +end +end +function COORDINATE:GetSmokeOffsetDistance() +local distance=self.SmokeOffsetDistance or math.random(10,20) +return distance +end +function COORDINATE:SetSmokeOffsetDistance(Distance) +if self then +self.SmokeOffsetDistance=Distance or math.random(10,20) +return self +else +COORDINATE.SmokeOffsetDistance=Distance or math.random(10,20) +end +end +function COORDINATE:SwitchSmokeOffsetOn() +if self then +self.SmokeOffset=true +return self +else +COORDINATE.SmokeOffset=true +end +end +function COORDINATE:SwitchSmokeOffsetOff() +if self then +self.SmokeOffset=false +return self +else +COORDINATE.SmokeOffset=false +end +end +function COORDINATE:StopSmoke(name) +self:StopBigSmokeAndFire(name) +end +function COORDINATE:SmokeGreen(Duration,Delay) +self:Smoke(SMOKECOLOR.Green,Duration,Delay) +return self +end +function COORDINATE:SmokeRed(Duration,Delay) +self:Smoke(SMOKECOLOR.Red,Duration,Delay) +return self +end +function COORDINATE:SmokeWhite(Duration,Delay) +self:Smoke(SMOKECOLOR.White,Duration,Delay) +return self +end +function COORDINATE:SmokeOrange(Duration,Delay) +self:Smoke(SMOKECOLOR.Orange,Duration,Delay) +return self +end +function COORDINATE:SmokeBlue(Duration,Delay) +self:Smoke(SMOKECOLOR.Blue,Duration,Delay) +return self +end +function COORDINATE:BigSmokeAndFire(Preset,Density,Duration,Delay,Name) +self:F2({preset=Preset,density=Density}) +Preset=Preset or BIGSMOKEPRESET.SmallSmokeAndFire +Density=Density or 0.5 +if Delay and Delay>0 then +self:ScheduleOnce(Delay,COORDINATE.BigSmokeAndFire,self,Preset,Density,Duration,0,Name) +else +self.firename=Name or"Fire-"..math.random(1,10000) +trigger.action.effectSmokeBig(self:GetVec3(),Preset,Density,self.firename) +if Duration and Duration>0 then +self:ScheduleOnce(Duration,COORDINATE.StopBigSmokeAndFire,self,self.firename) +end +end +return self +end +function COORDINATE:StopBigSmokeAndFire(name) +name=name or self.firename +trigger.action.effectSmokeStop(name) +end +function COORDINATE:BigSmokeAndFireSmall(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.SmallSmokeAndFire,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeAndFireMedium(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.MediumSmokeAndFire,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeAndFireLarge(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.LargeSmokeAndFire,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeAndFireHuge(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.HugeSmokeAndFire,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeSmall(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.SmallSmoke,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeMedium(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.MediumSmoke,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeLarge(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.LargeSmoke,Density,Duration,Delay,Name) +return self +end +function COORDINATE:BigSmokeHuge(Density,Duration,Delay,Name) +self:BigSmokeAndFire(BIGSMOKEPRESET.HugeSmoke,Density,Duration,Delay,Name) +return self +end +function COORDINATE:Flare(FlareColor,Azimuth) +self:F2({FlareColor}) +trigger.action.signalFlare(self:GetVec3(),FlareColor,Azimuth and Azimuth or 0) +end +function COORDINATE:FlareWhite(Azimuth) +self:F2(Azimuth) +self:Flare(FLARECOLOR.White,Azimuth) +end +function COORDINATE:FlareYellow(Azimuth) +self:F2(Azimuth) +self:Flare(FLARECOLOR.Yellow,Azimuth) +end +function COORDINATE:FlareGreen(Azimuth) +self:F2(Azimuth) +self:Flare(FLARECOLOR.Green,Azimuth) +end +function COORDINATE:FlareRed(Azimuth) +self:F2(Azimuth) +self:Flare(FLARECOLOR.Red,Azimuth) +end +do +function COORDINATE:MarkToAll(MarkText,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local text=Text or"" +trigger.action.markToAll(MarkID,MarkText,self:GetVec3(),ReadOnly,text) +return MarkID +end +function COORDINATE:MarkToCoalition(MarkText,Coalition,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local text=Text or"" +trigger.action.markToCoalition(MarkID,MarkText,self:GetVec3(),Coalition,ReadOnly,text) +return MarkID +end +function COORDINATE:MarkToCoalitionRed(MarkText,ReadOnly,Text) +return self:MarkToCoalition(MarkText,coalition.side.RED,ReadOnly,Text) +end +function COORDINATE:MarkToCoalitionBlue(MarkText,ReadOnly,Text) +return self:MarkToCoalition(MarkText,coalition.side.BLUE,ReadOnly,Text) +end +function COORDINATE:MarkToGroup(MarkText,MarkGroup,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local text=Text or"" +trigger.action.markToGroup(MarkID,MarkText,self:GetVec3(),MarkGroup:GetID(),ReadOnly,text) +return MarkID +end +function COORDINATE:RemoveMark(MarkID) +trigger.action.removeMark(MarkID) +end +function COORDINATE:LineToAll(Endpoint,Coalition,Color,Alpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local vec3=Endpoint:GetVec3() +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +trigger.action.lineToAll(Coalition,MarkID,self:GetVec3(),vec3,Color,LineType,ReadOnly,Text or"") +return MarkID +end +function COORDINATE:CircleToAll(Radius,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local vec3=self:GetVec3() +Radius=Radius or 1000 +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.15 +trigger.action.circleToAll(Coalition,MarkID,vec3,Radius,Color,FillColor,LineType,ReadOnly,Text or"") +return MarkID +end +end +function COORDINATE:RectToAll(Endpoint,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local vec3=Endpoint:GetVec3() +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.15 +trigger.action.rectToAll(Coalition,MarkID,self:GetVec3(),vec3,Color,FillColor,LineType,ReadOnly,Text or"") +return MarkID +end +function COORDINATE:QuadToAll(Coord2,Coord3,Coord4,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local point1=self:GetVec3() +local point2=Coord2:GetVec3() +local point3=Coord3:GetVec3() +local point4=Coord4:GetVec3() +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.15 +trigger.action.quadToAll(Coalition,MarkID,point1,point2,point3,point4,Color,FillColor,LineType,ReadOnly,Text or"") +return MarkID +end +function COORDINATE:MarkupToAllFreeForm(Coordinates,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.15 +local vecs={} +vecs[1]=self:GetVec3() +for i,coord in ipairs(Coordinates)do +vecs[i+1]=coord:GetVec3() +end +if#vecs<3 then +self:E("ERROR: A free form polygon needs at least three points!") +elseif#vecs==3 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==4 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==5 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==6 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==7 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==8 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==9 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==10 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10],Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==11 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10], +vecs[11], +Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==12 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10], +vecs[11],vecs[12], +Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==13 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10], +vecs[11],vecs[12],vecs[13], +Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==14 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10], +vecs[11],vecs[12],vecs[13],vecs[14], +Color,FillColor,LineType,ReadOnly,Text or"") +elseif#vecs==15 then +trigger.action.markupToAll(7,Coalition,MarkID,vecs[1],vecs[2],vecs[3],vecs[4],vecs[5],vecs[6],vecs[7],vecs[8],vecs[9],vecs[10], +vecs[11],vecs[12],vecs[13],vecs[14],vecs[15], +Color,FillColor,LineType,ReadOnly,Text or"") +else +local s=string.format("trigger.action.markupToAll(7, %d, %d,",Coalition,MarkID) +for _,vec in pairs(vecs)do +s=s..string.format("{x=%.1f, y=%.1f, z=%.1f},",vec.x,vec.y,vec.z) +end +s=s..string.format("{%.3f, %.3f, %.3f, %.3f},",Color[1],Color[2],Color[3],Color[4]) +s=s..string.format("{%.3f, %.3f, %.3f, %.3f},",FillColor[1],FillColor[2],FillColor[3],FillColor[4]) +s=s..string.format("%d,",LineType or 1) +s=s..string.format("%s",tostring(ReadOnly)) +if Text and type(Text)=="string"and string.len(Text)>0 then +s=s..string.format(", \"%s\"",tostring(Text)) +end +s=s..")" +local success=UTILS.DoString(s) +if not success then +self:E("ERROR: Could not draw polygon") +env.info(s) +end +end +return MarkID +end +function COORDINATE:TextToAll(Text,Coalition,Color,Alpha,FillColor,FillAlpha,FontSize,ReadOnly) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.3 +FontSize=FontSize or 14 +trigger.action.textToAll(Coalition,MarkID,self:GetVec3(),Color,FillColor,FontSize,ReadOnly,Text or"Hello World") +return MarkID +end +function COORDINATE:ArrowToAll(Endpoint,Coalition,Color,Alpha,FillColor,FillAlpha,LineType,ReadOnly,Text) +local MarkID=UTILS.GetMarkID() +if ReadOnly==nil then +ReadOnly=false +end +local vec3=Endpoint:GetVec3() +Coalition=Coalition or-1 +Color=Color or{1,0,0} +Color[4]=Alpha or 1.0 +LineType=LineType or 1 +FillColor=FillColor or UTILS.DeepCopy(Color) +FillColor[4]=FillAlpha or 0.15 +trigger.action.arrowToAll(Coalition,MarkID,vec3,self:GetVec3(),Color,FillColor,LineType,ReadOnly,Text or"") +return MarkID +end +function COORDINATE:IsLOS(ToCoordinate,Offset) +Offset=Offset or 2 +local FromVec3=self:GetVec3() +FromVec3.y=FromVec3.y+Offset +local ToVec3=ToCoordinate:GetVec3() +ToVec3.y=ToVec3.y+Offset +local IsLOS=land.isVisible(FromVec3,ToVec3) +return IsLOS +end +function COORDINATE:IsInRadius(Coordinate,Radius) +local InVec2=self:GetVec2() +local Vec2=Coordinate:GetVec2() +local InRadius=UTILS.IsInRadius(InVec2,Vec2,Radius) +return InRadius +end +function COORDINATE:IsInSphere(Coordinate,Radius) +local InVec3=self:GetVec3() +local Vec3=Coordinate:GetVec3() +local InSphere=UTILS.IsInSphere(InVec3,Vec3,Radius) +return InSphere +end +function COORDINATE:GetSunriseAtDate(Day,Month,Year,InSeconds) +local DayOfYear=UTILS.GetDayOfYear(Year,Month,Day) +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tdiff) +if InSeconds then +return sunrise +else +return UTILS.SecondsToClock(sunrise,true) +end +end +function COORDINATE:GetSunriseAtDayOfYear(DayOfYear,InSeconds) +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tdiff) +if InSeconds then +return sunrise +else +return UTILS.SecondsToClock(sunrise,true) +end +end +function COORDINATE:GetSunrise(InSeconds) +local DayOfYear=UTILS.GetMissionDayOfYear() +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tdiff) +local date=UTILS.GetDCSMissionDate() +if InSeconds or type(sunrise)=="string"then +return sunrise +else +return UTILS.SecondsToClock(sunrise,true) +end +end +function COORDINATE:GetMinutesToSunrise(OnlyToday) +local time=UTILS.SecondsOfToday() +local sunrise=nil +local delta=nil +if OnlyToday then +sunrise=self:GetSunrise(true) +delta=sunrise-time +else +local DayOfYear=UTILS.GetMissionDayOfYear()+1 +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tdiff) +delta=sunrise+UTILS.SecondsToMidnight() +end +return delta/60 +end +function COORDINATE:IsDay(Clock) +if Clock then +local Time=UTILS.ClockToSeconds(Clock) +local clock=UTILS.Split(Clock,"+")[1] +local DayOfYear=UTILS.GetMissionDayOfYear(Time) +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,true,Tdiff) +local sunset=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,false,Tdiff) +if type(sunrise)=="string"or type(sunset)=="string"then +if sunrise=="N/R"then return false end +if sunset=="N/S"then return true end +end +local time=UTILS.ClockToSeconds(clock) +if time>sunrise and time<=sunset then +return true +else +return false +end +else +local sunrise=self:GetSunrise(true) +local sunset=self:GetSunset(true) +if type(sunrise)=="string"or type(sunset)=="string"then +if sunrise=="N/R"then return false end +if sunset=="N/S"then return true end +end +local time=UTILS.SecondsOfToday() +if time>sunrise and time<=sunset then +return true +else +return false +end +end +end +function COORDINATE:IsNight(Clock) +return not self:IsDay(Clock) +end +function COORDINATE:GetSunsetAtDate(Day,Month,Year,InSeconds) +local DayOfYear=UTILS.GetDayOfYear(Year,Month,Day) +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunset=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,false,Tdiff) +if InSeconds then +return sunset +else +return UTILS.SecondsToClock(sunset,true) +end +end +function COORDINATE:GetSunset(InSeconds) +local DayOfYear=UTILS.GetMissionDayOfYear() +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +local sunrise=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,false,Tdiff) +local date=UTILS.GetDCSMissionDate() +if InSeconds or type(sunrise)=="string"then +return sunrise +else +return UTILS.SecondsToClock(sunrise,true) +end +end +function COORDINATE:GetMinutesToSunset(OnlyToday) +local time=UTILS.SecondsOfToday() +local sunset=nil +local delta=nil +if OnlyToday then +sunset=self:GetSunset(true) +delta=sunset-time +else +local DayOfYear=UTILS.GetMissionDayOfYear()+1 +local Latitude,Longitude=self:GetLLDDM() +local Tdiff=UTILS.GMTToLocalTimeDifference() +sunset=UTILS.GetSunRiseAndSet(DayOfYear,Latitude,Longitude,false,Tdiff) +delta=sunset+UTILS.SecondsToMidnight() +end +return delta/60 +end +function COORDINATE:ToStringBR(FromCoordinate,Settings,MagVar,Precision) +local DirectionVec3=FromCoordinate:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(FromCoordinate) +return"BR, "..self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar,Precision) +end +function COORDINATE:ToStringBRA(FromCoordinate,Settings,MagVar) +local DirectionVec3=FromCoordinate:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=FromCoordinate:Get2DDistance(self) +local Altitude=self:GetAltitudeText() +return"BRA, "..self:GetBRAText(AngleRadians,Distance,Settings,nil,MagVar) +end +function COORDINATE:ToStringBRAANATO(FromCoordinate,Bogey,Spades,SSML,Angels,Zeros) +local BRAANATO="Merged." +local currentCoord=FromCoordinate +local DirectionVec3=FromCoordinate:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local bearing=UTILS.Round(UTILS.ToDegree(AngleRadians),0) +local magnetic=self:GetMagneticDeclination()or 0 +bearing=bearing-magnetic +local rangeMetres=self:Get2DDistance(currentCoord) +local rangeNM=UTILS.Round(UTILS.MetersToNM(rangeMetres),0) +local aspect=self:ToStringAspect(currentCoord) +local alt=UTILS.Round(UTILS.MetersToFeet(self.y)/1000,0) +local alttext=string.format("%d thousand",alt) +if Angels then +alttext=string.format("Angels %d",alt) +end +if alt<1 then +alttext="very low" +end +local track="Maneuver" +if self.Heading then +track=UTILS.BearingToCardinal(self.Heading)or"North" +end +if rangeNM>3 then +if SSML then +if Zeros then +bearing=string.format("%03d",bearing) +local AngleDegText=string.gsub(bearing,"%d","%1 ") +AngleDegText=string.gsub(AngleDegText," $","") +AngleDegText=string.gsub(AngleDegText,"0","zero") +if aspect==""then +BRAANATO=string.format("brah %s, %d miles, %s, Track %s",AngleDegText,rangeNM,alttext,track) +else +BRAANATO=string.format("brah %s, %d miles, %s, %s, Track %s",AngleDegText,rangeNM,alttext,aspect,track) +end +else +if aspect==""then +BRAANATO=string.format("brah <say-as interpret-as='characters'>%03d</say-as>, %d miles, %s, Track %s",bearing,rangeNM,alttext,track) +else +BRAANATO=string.format("brah <say-as interpret-as='characters'>%03d</say-as>, %d miles, %s, %s, Track %s",bearing,rangeNM,alttext,aspect,track) +end +end +if Bogey and Spades then +BRAANATO=BRAANATO..", Bogey, Spades." +elseif Bogey then +BRAANATO=BRAANATO..", Bogey." +elseif Spades then +BRAANATO=BRAANATO..", Spades." +else +BRAANATO=BRAANATO.."." +end +else +if aspect==""then +BRAANATO=string.format("BRA %03d, %d miles, %s, Track %s",bearing,rangeNM,alttext,track) +else +BRAANATO=string.format("BRAA %03d, %d miles, %s, %s, Track %s",bearing,rangeNM,alttext,aspect,track) +end +if Bogey and Spades then +BRAANATO=BRAANATO..", Bogey, Spades." +elseif Bogey then +BRAANATO=BRAANATO..", Bogey." +elseif Spades then +BRAANATO=BRAANATO..", Spades." +else +BRAANATO=BRAANATO.."." +end +end +end +return BRAANATO +end +function COORDINATE.GetBullseyeCoordinate(Coalition) +return COORDINATE:NewFromVec3(coalition.getMainRefPoint(Coalition)) +end +function COORDINATE:ToStringBULLS(Coalition,Settings,MagVar) +local BullsCoordinate=COORDINATE:NewFromVec3(coalition.getMainRefPoint(Coalition)) +local DirectionVec3=BullsCoordinate:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(BullsCoordinate) +local Altitude=self:GetAltitudeText() +return"BULLS, "..self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar) +end +function COORDINATE:ToStringAspect(TargetCoordinate) +local Heading=self.Heading +local DirectionVec3=self:GetDirectionVec3(TargetCoordinate) +local Angle=self:GetAngleDegrees(DirectionVec3) +if Heading then +local Aspect=Angle-Heading +if Aspect>-135 and Aspect<=-45 then +return"Flanking" +end +if Aspect>-45 and Aspect<=45 then +return"Hot" +end +if Aspect>45 and Aspect<=135 then +return"Flanking" +end +if Aspect>135 or Aspect<=-135 then +return"Cold" +end +end +return"" +end +function COORDINATE:GetLLDDM() +return coord.LOtoLL(self:GetVec3()) +end +function COORDINATE:ToStringLL(Settings) +local LL_Accuracy=Settings and Settings.LL_Accuracy or _SETTINGS.LL_Accuracy +local lat,lon=coord.LOtoLL(self:GetVec3()) +return string.format('%f',lat)..' '..string.format('%f',lon) +end +function COORDINATE:ToStringLLDMS(Settings) +local LL_Accuracy=Settings and Settings.LL_Accuracy or _SETTINGS.LL_Accuracy +local lat,lon=coord.LOtoLL(self:GetVec3()) +return"LL DMS "..UTILS.tostringLL(lat,lon,LL_Accuracy,true) +end +function COORDINATE:ToStringLLDDM(Settings) +local LL_Accuracy=Settings and Settings.LL_Accuracy or _SETTINGS.LL_Accuracy +local lat,lon=coord.LOtoLL(self:GetVec3()) +return"LL DDM "..UTILS.tostringLL(lat,lon,LL_Accuracy,false) +end +function COORDINATE:ToStringMGRS(Settings) +local MGRS_Accuracy=Settings and Settings.MGRS_Accuracy or _SETTINGS.MGRS_Accuracy +local lat,lon=coord.LOtoLL(self:GetVec3()) +local MGRS=coord.LLtoMGRS(lat,lon) +return"MGRS "..UTILS.tostringMGRS(MGRS,MGRS_Accuracy) +end +function COORDINATE:NewFromMGRSString(MGRSString) +local myparts=UTILS.Split(MGRSString," ") +local northing=tostring(myparts[5])or"" +local easting=tostring(myparts[4])or"" +if string.len(easting)<5 then easting=easting..string.rep("0",5-string.len(easting))end +if string.len(northing)<5 then northing=northing..string.rep("0",5-string.len(northing))end +local MGRS={ +UTMZone=myparts[2], +MGRSDigraph=myparts[3], +Easting=easting, +Northing=northing, +} +local lat,lon=coord.MGRStoLL(MGRS) +local point=coord.LLtoLO(lat,lon,0) +local coord=COORDINATE:NewFromVec2({x=point.x,y=point.z}) +return coord +end +function COORDINATE:NewFromMGRS(UTMZone,MGRSDigraph,Easting,Northing) +if string.len(Easting)<5 then Easting=tostring(Easting..string.rep("0",5-string.len(Easting)))end +if string.len(Northing)<5 then Northing=tostring(Northing..string.rep("0",5-string.len(Northing)))end +local MGRS={ +UTMZone=UTMZone, +MGRSDigraph=MGRSDigraph, +Easting=tostring(Easting), +Northing=tostring(Northing), +} +local lat,lon=coord.MGRStoLL(MGRS) +local point=coord.LLtoLO(lat,lon,0) +local coord=COORDINATE:NewFromVec2({x=point.x,y=point.z}) +return coord +end +function COORDINATE:ToStringFromRP(ReferenceCoord,ReferenceName,Controllable,Settings,MagVar) +self:F2({ReferenceCoord=ReferenceCoord,ReferenceName=ReferenceName}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +local IsAir=Controllable and Controllable:IsAirPlane()or false +if IsAir then +local DirectionVec3=ReferenceCoord:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(ReferenceCoord) +return"Targets are the last seen "..self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar).." from "..ReferenceName +else +local DirectionVec3=ReferenceCoord:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(ReferenceCoord) +return"Target are located "..self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar).." from "..ReferenceName +end +return nil +end +function COORDINATE:ToStringFromRPShort(ReferenceCoord,ReferenceName,Controllable,Settings,MagVar) +self:F2({ReferenceCoord=ReferenceCoord,ReferenceName=ReferenceName}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +local IsAir=Controllable and Controllable:IsAirPlane()or false +if IsAir then +local DirectionVec3=ReferenceCoord:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(ReferenceCoord) +return self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar).." from "..ReferenceName +else +local DirectionVec3=ReferenceCoord:GetDirectionVec3(self) +local AngleRadians=self:GetAngleRadians(DirectionVec3) +local Distance=self:Get2DDistance(ReferenceCoord) +return self:GetBRText(AngleRadians,Distance,Settings,nil,MagVar).." from "..ReferenceName +end +return nil +end +function COORDINATE:ToStringA2G(Controllable,Settings,MagVar) +self:F2({Controllable=Controllable and Controllable:GetName()}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +if Settings:IsA2G_BR()then +if Controllable then +local Coordinate=Controllable:GetCoordinate() +return Controllable and self:ToStringBR(Coordinate,Settings,MagVar)or self:ToStringMGRS(Settings) +else +return self:ToStringMGRS(Settings) +end +end +if Settings:IsA2G_LL_DMS()then +return self:ToStringLLDMS(Settings) +end +if Settings:IsA2G_LL_DDM()then +return self:ToStringLLDDM(Settings) +end +if Settings:IsA2G_MGRS()then +return self:ToStringMGRS(Settings) +end +return nil +end +function COORDINATE:ToStringA2A(Controllable,Settings,MagVar) +self:F2({Controllable=Controllable and Controllable:GetName()}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +if Settings:IsA2A_BRAA()then +if Controllable then +local Coordinate=Controllable:GetCoordinate() +return self:ToStringBRA(Coordinate,Settings,MagVar) +else +return self:ToStringMGRS(Settings) +end +end +if Settings:IsA2A_BULLS()then +local Coalition=Controllable:GetCoalition() +return self:ToStringBULLS(Coalition,Settings,MagVar) +end +if Settings:IsA2A_LL_DMS()then +return self:ToStringLLDMS(Settings) +end +if Settings:IsA2A_LL_DDM()then +return self:ToStringLLDDM(Settings) +end +if Settings:IsA2A_MGRS()then +return self:ToStringMGRS(Settings) +end +return nil +end +function COORDINATE:ToString(Controllable,Settings) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +local ModeA2A=nil +if ModeA2A==nil then +local IsAir=Controllable and(Controllable:IsAirPlane()or Controllable:IsHelicopter())or false +if IsAir then +ModeA2A=true +else +ModeA2A=false +end +end +if ModeA2A==true then +return self:ToStringA2A(Controllable,Settings) +else +return self:ToStringA2G(Controllable,Settings) +end +return nil +end +function COORDINATE:ToStringPressure(Controllable,Settings) +self:F2({Controllable=Controllable and Controllable:GetName()}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +return self:GetPressureText(nil,Settings) +end +function COORDINATE:ToStringWind(Controllable,Settings) +self:F2({Controllable=Controllable and Controllable:GetName()}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +return self:GetWindText(nil,Settings) +end +function COORDINATE:ToStringTemperature(Controllable,Settings) +self:F2({Controllable=Controllable and Controllable:GetName()}) +local Settings=Settings or(Controllable and _DATABASE:GetPlayerSettings(Controllable:GetPlayerName()))or _SETTINGS +return self:GetTemperatureText(nil,Settings) +end +function COORDINATE:IsInSteepArea(Radius,Minelevation) +local steep=false +local elev=Minelevation or 8 +local bdelta=0 +local h0=self:GetLandHeight() +local radius=Radius or 50 +local diam=radius*2 +for i=0,150,30 do +local polar=math.fmod(i+180,360) +local c1=self:Translate(radius,i,false,false) +local c2=self:Translate(radius,polar,false,false) +local h1=c1:GetLandHeight() +local h2=c2:GetLandHeight() +local d1=math.abs(h1-h2) +local d2=math.abs(h0-h1) +local d3=math.abs(h0-h2) +local dm=d1>d2 and d1 or d2 +local dm1=dm>d3 and dm or d3 +bdelta=dm1>bdelta and dm1 or bdelta +self:T(string.format("d1=%d, d2=%d, d3=%d, max delta=%d",d1,d2,d3,bdelta)) +end +local steepness=bdelta/(radius/100) +if steepness>=elev then steep=true end +return steep,math.floor(steepness) +end +function COORDINATE:IsInFlatArea(Radius,Minelevation) +local steep,elev=self:IsInSteepArea(Radius,Minelevation) +local flat=not steep +return flat,elev +end +function COORDINATE:GetRandomPointVec3InRadius(OuterRadius,InnerRadius) +return COORDINATE:NewFromVec3(self:GetRandomVec3InRadius(OuterRadius,InnerRadius)) +end +function COORDINATE:GetSimpleZones(SearchRadius,PosRadius,NumPositions) +local clearPositions=UTILS.GetSimpleZones(self:GetVec3(),SearchRadius,PosRadius,NumPositions) +if clearPositions and#clearPositions>0 then +local coords={} +for _,pos in pairs(clearPositions)do +local coord=COORDINATE:NewFromVec2(pos) +table.insert(coords,coord) +end +return coords +end +return nil +end +end +do +POINT_VEC3={ +ClassName="POINT_VEC3", +Metric=true, +RoutePointAltType={ +BARO="BARO", +}, +RoutePointType={ +TakeOffParking="TakeOffParking", +TurningPoint="Turning Point", +}, +RoutePointAction={ +FromParkingArea="From Parking Area", +TurningPoint="Turning Point", +}, +} +function POINT_VEC3:New(x,y,z) +local self=BASE:Inherit(self,COORDINATE:New(x,y,z)) +self:F2(self) +return self +end +end +do +POINT_VEC2={ +ClassName="POINT_VEC2", +} +function POINT_VEC2:New(x,y,LandHeightAdd) +local LandHeight=land.getHeight({["x"]=x,["y"]=y}) +LandHeightAdd=LandHeightAdd or 0 +LandHeight=LandHeight+LandHeightAdd +local self=BASE:Inherit(self,COORDINATE:New(x,LandHeight,y)) +self:F2(self) +return self +end +end +do +VELOCITY={ +ClassName="VELOCITY", +} +function VELOCITY:New(VelocityMps) +local self=BASE:Inherit(self,BASE:New()) +self:F({}) +self.Velocity=VelocityMps +return self +end +function VELOCITY:Set(VelocityMps) +self.Velocity=VelocityMps +return self +end +function VELOCITY:Get() +return self.Velocity +end +function VELOCITY:SetKmph(VelocityKmph) +self.Velocity=UTILS.KmphToMps(VelocityKmph) +return self +end +function VELOCITY:GetKmph() +return UTILS.MpsToKmph(self.Velocity) +end +function VELOCITY:SetMiph(VelocityMiph) +self.Velocity=UTILS.MiphToMps(VelocityMiph) +return self +end +function VELOCITY:GetMiph() +return UTILS.MpsToMiph(self.Velocity) +end +function VELOCITY:GetText(Settings) +local Settings=Settings or _SETTINGS +if self.Velocity~=0 then +if Settings:IsMetric()then +return string.format("%d km/h",UTILS.MpsToKmph(self.Velocity)) +else +return string.format("%d mi/h",UTILS.MpsToMiph(self.Velocity)) +end +else +return"stationary" +end +end +function VELOCITY:ToString(VelocityGroup,Settings) +self:F({Group=VelocityGroup and VelocityGroup:GetName()}) +local Settings=Settings or(VelocityGroup and _DATABASE:GetPlayerSettings(VelocityGroup:GetPlayerName()))or _SETTINGS +return self:GetText(Settings) +end +end +do +VELOCITY_POSITIONABLE={ +ClassName="VELOCITY_POSITIONABLE", +} +function VELOCITY_POSITIONABLE:New(Positionable) +local self=BASE:Inherit(self,VELOCITY:New()) +self:F({}) +self.Positionable=Positionable +return self +end +function VELOCITY_POSITIONABLE:Get() +return self.Positionable:GetVelocityMPS()or 0 +end +function VELOCITY_POSITIONABLE:GetKmph() +return UTILS.MpsToKmph(self.Positionable:GetVelocityMPS()or 0) +end +function VELOCITY_POSITIONABLE:GetMiph() +return UTILS.MpsToMiph(self.Positionable:GetVelocityMPS()or 0) +end +function VELOCITY_POSITIONABLE:ToString() +self:F({Group=self.Positionable and self.Positionable:GetName()}) +local Settings=Settings or(self.Positionable and _DATABASE:GetPlayerSettings(self.Positionable:GetPlayerName()))or _SETTINGS +self.Velocity=self.Positionable:GetVelocityMPS() +return self:GetText(Settings) +end +end +MESSAGE={ +ClassName="MESSAGE", +MessageCategory=0, +MessageID=0, +} +MESSAGE.Type={ +Update="Update", +Information="Information", +Briefing="Briefing Report", +Overview="Overview Report", +Detailed="Detailed Report", +} +function MESSAGE:New(Text,Duration,Category,ClearScreen) +local self=BASE:Inherit(self,BASE:New()) +self:F({Text,Duration,Category}) +self.MessageType=nil +if Category and Category~=""then +if Category:sub(-1)~="\n"then +self.MessageCategory=Category..": " +else +self.MessageCategory=Category:sub(1,-2)..":\n" +end +else +self.MessageCategory="" +end +self.ClearScreen=false +if ClearScreen~=nil then +self.ClearScreen=ClearScreen +end +self.MessageDuration=Duration or 5 +self.MessageTime=timer.getTime() +self.MessageText=Text:gsub("^\n","",1):gsub("\n$","",1) +self.MessageSent=false +self.MessageGroup=false +self.MessageCoalition=false +return self +end +function MESSAGE:NewType(MessageText,MessageType,ClearScreen) +local self=BASE:Inherit(self,BASE:New()) +self:F({MessageText}) +self.MessageType=MessageType +self.ClearScreen=false +if ClearScreen~=nil then +self.ClearScreen=ClearScreen +end +self.MessageTime=timer.getTime() +self.MessageText=MessageText:gsub("^\n","",1):gsub("\n$","",1) +return self +end +function MESSAGE:Clear() +self:F() +self.ClearScreen=true +return self +end +function MESSAGE:ToClient(Client,Settings) +self:F(Client) +self:ToUnit(Client,Settings) +return self +end +function MESSAGE:ToGroup(Group,Settings) +self:F(Group.GroupName) +if Group and Group:IsAlive()then +if self.MessageType then +local Settings=Settings or(Group and _DATABASE:GetPlayerSettings(Group:GetPlayerName()))or _SETTINGS +self.MessageDuration=Settings:GetMessageTime(self.MessageType) +self.MessageCategory="" +end +if self.MessageDuration~=0 then +self:T(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","").." / "..self.MessageDuration) +trigger.action.outTextForGroup(Group:GetID(),self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$",""),self.MessageDuration,self.ClearScreen) +end +end +return self +end +function MESSAGE:ToUnit(Unit,Settings) +self:F(Unit.IdentifiableName) +if Unit and Unit:IsAlive()then +if self.MessageType then +local Settings=Settings or(Unit and _DATABASE:GetPlayerSettings(Unit:GetPlayerName()))or _SETTINGS +self.MessageDuration=Settings:GetMessageTime(self.MessageType) +self.MessageCategory="" +end +if self.MessageDuration~=0 then +self:T(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","").." / "..self.MessageDuration) +local ID=Unit:GetID() +trigger.action.outTextForUnit(Unit:GetID(),self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$",""),self.MessageDuration,self.ClearScreen) +end +end +return self +end +function MESSAGE:ToCountry(Country,Settings) +self:F(Country) +if Country then +if self.MessageType then +local Settings=Settings or _SETTINGS +self.MessageDuration=Settings:GetMessageTime(self.MessageType) +self.MessageCategory="" +end +if self.MessageDuration~=0 then +self:T(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","").." / "..self.MessageDuration) +trigger.action.outTextForCountry(Country,self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$",""),self.MessageDuration,self.ClearScreen) +end +end +return self +end +function MESSAGE:ToCountryIf(Country,Condition,Settings) +self:F(Country) +if Country and Condition==true then +self:ToCountry(Country,Settings) +end +return self +end +function MESSAGE:ToBlue() +self:F() +self:ToCoalition(coalition.side.BLUE) +return self +end +function MESSAGE:ToRed() +self:F() +self:ToCoalition(coalition.side.RED) +return self +end +function MESSAGE:ToCoalition(CoalitionSide,Settings) +self:F(CoalitionSide) +if self.MessageType then +local Settings=Settings or _SETTINGS +self.MessageDuration=Settings:GetMessageTime(self.MessageType) +self.MessageCategory="" +end +if CoalitionSide then +if self.MessageDuration~=0 then +self:T(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","").." / "..self.MessageDuration) +trigger.action.outTextForCoalition(CoalitionSide,self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$",""),self.MessageDuration,self.ClearScreen) +end +end +self.CoalitionSide=CoalitionSide +return self +end +function MESSAGE:ToCoalitionIf(CoalitionSide,Condition) +self:F(CoalitionSide) +if Condition and Condition==true then +self:ToCoalition(CoalitionSide) +end +return self +end +function MESSAGE:ToAll(Settings,Delay) +self:F() +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MESSAGE.ToAll,self,Settings,0) +else +if self.MessageType then +local Settings=Settings or _SETTINGS +self.MessageDuration=Settings:GetMessageTime(self.MessageType) +self.MessageCategory="" +end +if self.MessageDuration~=0 then +self:T(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","").." / "..self.MessageDuration) +trigger.action.outText(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$",""),self.MessageDuration,self.ClearScreen) +end +end +return self +end +function MESSAGE:ToAllIf(Condition) +if Condition and Condition==true then +self:ToAll() +end +return self +end +function MESSAGE:ToLog() +env.info(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","")) +return self +end +function MESSAGE:ToLogIf(Condition) +if Condition and Condition==true then +env.info(self.MessageCategory..self.MessageText:gsub("\n$",""):gsub("\n$","")) +end +return self +end +_MESSAGESRS={} +function MESSAGE.SetMSRS(PathToSRS,Port,PathToCredentials,Frequency,Modulation,Gender,Culture,Voice,Coalition,Volume,Label,Coordinate,Backend) +_MESSAGESRS.PathToSRS=PathToSRS or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +_MESSAGESRS.frequency=Frequency or MSRS.frequencies or 243 +_MESSAGESRS.modulation=Modulation or MSRS.modulations or radio.modulation.AM +_MESSAGESRS.MSRS=MSRS:New(_MESSAGESRS.PathToSRS,_MESSAGESRS.frequency,_MESSAGESRS.modulation) +_MESSAGESRS.coalition=Coalition or MSRS.coalition or coalition.side.NEUTRAL +_MESSAGESRS.MSRS:SetCoalition(_MESSAGESRS.coalition) +_MESSAGESRS.coordinate=Coordinate +if Coordinate then +_MESSAGESRS.MSRS:SetCoordinate(Coordinate) +end +if Backend then +_MESSAGESRS.MSRS:SetBackend(Backend) +end +_MESSAGESRS.Culture=Culture or MSRS.culture or"en-GB" +_MESSAGESRS.MSRS:SetCulture(Culture) +_MESSAGESRS.Gender=Gender or MSRS.gender or"female" +_MESSAGESRS.MSRS:SetGender(Gender) +if PathToCredentials then +_MESSAGESRS.MSRS:SetProviderOptionsGoogle(PathToCredentials) +_MESSAGESRS.MSRS:SetProvider(MSRS.Provider.GOOGLE) +end +_MESSAGESRS.label=Label or MSRS.Label or"MESSAGE" +_MESSAGESRS.MSRS:SetLabel(_MESSAGESRS.label) +_MESSAGESRS.port=Port or MSRS.port or 5002 +_MESSAGESRS.MSRS:SetPort(_MESSAGESRS.port) +_MESSAGESRS.volume=Volume or MSRS.volume or 1 +_MESSAGESRS.MSRS:SetVolume(_MESSAGESRS.volume) +if Voice then _MESSAGESRS.MSRS:SetVoice(Voice)end +_MESSAGESRS.voice=Voice or MSRS.voice +_MESSAGESRS.SRSQ=MSRSQUEUE:New(_MESSAGESRS.label) +end +function MESSAGE:ToSRS(frequency,modulation,gender,culture,voice,coalition,volume,coordinate) +local tgender=gender or _MESSAGESRS.Gender +if _MESSAGESRS.SRSQ then +if voice then +_MESSAGESRS.MSRS:SetVoice(voice or _MESSAGESRS.voice) +end +if coordinate then +_MESSAGESRS.MSRS:SetCoordinate(coordinate) +end +local category=string.gsub(self.MessageCategory,":","") +_MESSAGESRS.SRSQ:NewTransmission(self.MessageText,nil,_MESSAGESRS.MSRS,0.5,1,nil,nil,nil,frequency or _MESSAGESRS.frequency,modulation or _MESSAGESRS.modulation,gender or _MESSAGESRS.Gender,culture or _MESSAGESRS.Culture,nil,volume or _MESSAGESRS.volume,category,coordinate or _MESSAGESRS.coordinate) +end +return self +end +function MESSAGE:ToSRSBlue(frequency,modulation,gender,culture,voice,volume,coordinate) +self:ToSRS(frequency,modulation,gender,culture,voice,coalition.side.BLUE,volume,coordinate) +return self +end +function MESSAGE:ToSRSRed(frequency,modulation,gender,culture,voice,volume,coordinate) +self:ToSRS(frequency,modulation,gender,culture,voice,coalition.side.RED,volume,coordinate) +return self +end +function MESSAGE:ToSRSAll(frequency,modulation,gender,culture,voice,volume,coordinate) +self:ToSRS(frequency,modulation,gender,culture,voice,coalition.side.NEUTRAL,volume,coordinate) +return self +end +do +FSM={ +ClassName="FSM", +} +function FSM:New() +self=BASE:Inherit(self,BASE:New()) +self.options=options or{} +self.options.subs=self.options.subs or{} +self.current=self.options.initial or'none' +self.Events={} +self.subs={} +self.endstates={} +self.Scores={} +self._StartState="none" +self._Transitions={} +self._Processes={} +self._EndStates={} +self._Scores={} +self._EventSchedules={} +self.CallScheduler=SCHEDULER:New(self) +return self +end +function FSM:SetStartState(State) +self._StartState=State +self.current=State +end +function FSM:GetStartState() +return self._StartState or{} +end +function FSM:AddTransition(From,Event,To) +local Transition={} +Transition.From=From +Transition.Event=Event +Transition.To=To +self._Transitions[Transition]=Transition +self:_eventmap(self.Events,Transition) +end +function FSM:GetTransitions() +return self._Transitions or{} +end +function FSM:AddProcess(From,Event,Process,ReturnEvents) +local Sub={} +Sub.From=From +Sub.Event=Event +Sub.fsm=Process +Sub.StartEvent="Start" +Sub.ReturnEvents=ReturnEvents +self._Processes[Sub]=Sub +self:_submap(self.subs,Sub,nil) +self:AddTransition(From,Event,From) +return Process +end +function FSM:GetProcesses() +self:F({Processes=self._Processes}) +return self._Processes or{} +end +function FSM:GetProcess(From,Event) +for ProcessID,Process in pairs(self:GetProcesses())do +if Process.From==From and Process.Event==Event then +return Process.fsm +end +end +error("Sub-Process from state "..From.." with event "..Event.." not found!") +end +function FSM:SetProcess(From,Event,Fsm) +for ProcessID,Process in pairs(self:GetProcesses())do +if Process.From==From and Process.Event==Event then +Process.fsm=Fsm +return true +end +end +error("Sub-Process from state "..From.." with event "..Event.." not found!") +end +function FSM:AddEndState(State) +self._EndStates[State]=State +self.endstates[State]=State +end +function FSM:GetEndStates() +return self._EndStates or{} +end +function FSM:AddScore(State,ScoreText,Score) +self:F({State,ScoreText,Score}) +self._Scores[State]=self._Scores[State]or{} +self._Scores[State].ScoreText=ScoreText +self._Scores[State].Score=Score +return self +end +function FSM:AddScoreProcess(From,Event,State,ScoreText,Score) +self:F({From,Event,State,ScoreText,Score}) +local Process=self:GetProcess(From,Event) +Process._Scores[State]=Process._Scores[State]or{} +Process._Scores[State].ScoreText=ScoreText +Process._Scores[State].Score=Score +return Process +end +function FSM:GetScores() +return self._Scores or{} +end +function FSM:GetSubs() +return self.options.subs +end +function FSM:LoadCallBacks(CallBackTable) +for name,callback in pairs(CallBackTable or{})do +self[name]=callback +end +end +function FSM:_eventmap(Events,EventStructure) +local Event=EventStructure.Event +local __Event="__"..EventStructure.Event +self[Event]=self[Event]or self:_create_transition(Event) +self[__Event]=self[__Event]or self:_delayed_transition(Event) +Events[Event]=self.Events[Event]or{map={}} +self:_add_to_map(Events[Event].map,EventStructure) +end +function FSM:_submap(subs,sub,name) +subs[sub.From]=subs[sub.From]or{} +subs[sub.From][sub.Event]=subs[sub.From][sub.Event]or{} +subs[sub.From][sub.Event][sub]={} +subs[sub.From][sub.Event][sub].fsm=sub.fsm +subs[sub.From][sub.Event][sub].StartEvent=sub.StartEvent +subs[sub.From][sub.Event][sub].ReturnEvents=sub.ReturnEvents or{} +subs[sub.From][sub.Event][sub].name=name +subs[sub.From][sub.Event][sub].fsmparent=self +end +function FSM:_call_handler(step,trigger,params,EventName) +local handler=step..trigger +if self[handler]then +self._EventSchedules[EventName]=nil +local ErrorHandler=function(errmsg) +env.info("Error in SCHEDULER function:"..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +local Result,Value=xpcall(function() +return self[handler](self,unpack(params)) +end,ErrorHandler) +return Value +end +end +function FSM._handler(self,EventName,...) +local Can,To=self:can(EventName) +if To=="*"then +To=self.current +end +if Can then +local From=self.current +local Params={From,EventName,To,...} +if self["onleave"..From]or +self["OnLeave"..From]or +self["onbefore"..EventName]or +self["OnBefore"..EventName]or +self["onafter"..EventName]or +self["OnAfter"..EventName]or +self["onenter"..To]or +self["OnEnter"..To]then +if self:_call_handler("onbefore",EventName,Params,EventName)==false then +self:T("*** FSM *** Cancel".." *** "..self.current.." --> "..EventName.." --> "..To.." *** onbefore"..EventName) +return false +else +if self:_call_handler("OnBefore",EventName,Params,EventName)==false then +self:T("*** FSM *** Cancel".." *** "..self.current.." --> "..EventName.." --> "..To.." *** OnBefore"..EventName) +return false +else +if self:_call_handler("onleave",From,Params,EventName)==false then +self:T("*** FSM *** Cancel".." *** "..self.current.." --> "..EventName.." --> "..To.." *** onleave"..From) +return false +else +if self:_call_handler("OnLeave",From,Params,EventName)==false then +self:T("*** FSM *** Cancel".." *** "..self.current.." --> "..EventName.." --> "..To.." *** OnLeave"..From) +return false +end +end +end +end +else +local ClassName=self:GetClassName() +if ClassName=="FSM"then +self:T("*** FSM *** Transit *** "..self.current.." --> "..EventName.." --> "..To) +end +if ClassName=="FSM_TASK"then +self:T("*** FSM *** Transit *** "..self.current.." --> "..EventName.." --> "..To.." *** Task: "..self.TaskName) +end +if ClassName=="FSM_CONTROLLABLE"then +self:T("*** FSM *** Transit *** "..self.current.." --> "..EventName.." --> "..To.." *** TaskUnit: "..self.Controllable.ControllableName.." *** ") +end +if ClassName=="FSM_PROCESS"then +self:T("*** FSM *** Transit *** "..self.current.." --> "..EventName.." --> "..To.." *** Task: "..self.Task:GetName()..", TaskUnit: "..self.Controllable.ControllableName.." *** ") +end +end +self.current=To +local execute=true +local subtable=self:_gosub(From,EventName) +for _,sub in pairs(subtable)do +self:T("*** FSM *** Sub *** "..sub.StartEvent) +sub.fsm.fsmparent=self +sub.fsm.ReturnEvents=sub.ReturnEvents +sub.fsm[sub.StartEvent](sub.fsm) +execute=false +end +local fsmparent,Event=self:_isendstate(To) +if fsmparent and Event then +self:T("*** FSM *** End *** "..Event) +self:_call_handler("onenter",To,Params,EventName) +self:_call_handler("OnEnter",To,Params,EventName) +self:_call_handler("onafter",EventName,Params,EventName) +self:_call_handler("OnAfter",EventName,Params,EventName) +self:_call_handler("onstate","change",Params,EventName) +fsmparent[Event](fsmparent) +execute=false +end +if execute then +self:_call_handler("onafter",EventName,Params,EventName) +self:_call_handler("OnAfter",EventName,Params,EventName) +self:_call_handler("onenter",To,Params,EventName) +self:_call_handler("OnEnter",To,Params,EventName) +self:_call_handler("onstate","change",Params,EventName) +end +else +self:T("*** FSM *** NO Transition *** "..self.current.." --> "..EventName.." --> ? ") +end +return nil +end +function FSM:_delayed_transition(EventName) +return function(self,DelaySeconds,...) +self:T3("Delayed Event: "..EventName) +local CallID=0 +if DelaySeconds~=nil then +if DelaySeconds<0 then +DelaySeconds=math.abs(DelaySeconds) +if not self._EventSchedules[EventName]then +CallID=self.CallScheduler:Schedule(self,self._handler,{EventName,...},DelaySeconds or 1,nil,nil,nil,4,true) +self._EventSchedules[EventName]=CallID +self:T2(string.format("NEGATIVE Event %s delayed by %.3f sec SCHEDULED with CallID=%s",EventName,DelaySeconds,tostring(CallID))) +else +self:T2(string.format("NEGATIVE Event %s delayed by %.3f sec CANCELLED as we already have such an event in the queue.",EventName,DelaySeconds)) +end +else +CallID=self.CallScheduler:Schedule(self,self._handler,{EventName,...},DelaySeconds or 1,nil,nil,nil,4,true) +self:T2(string.format("Event %s delayed by %.3f sec SCHEDULED with CallID=%s",EventName,DelaySeconds,tostring(CallID))) +end +else +error("FSM: An asynchronous event trigger requires a DelaySeconds parameter!!! This can be positive or negative! Sorry, but will not process this.") +end +end +end +function FSM:_create_transition(EventName) +return function(self,...) +return self._handler(self,EventName,...) +end +end +function FSM:_gosub(ParentFrom,ParentEvent) +local fsmtable={} +if self.subs[ParentFrom]and self.subs[ParentFrom][ParentEvent]then +return self.subs[ParentFrom][ParentEvent] +else +return{} +end +end +function FSM:_isendstate(Current) +local FSMParent=self.fsmparent +if FSMParent and self.endstates[Current]then +FSMParent.current=Current +local ParentFrom=FSMParent.current +local Event=self.ReturnEvents[Current] +if Event then +return FSMParent,Event +else +end +end +return nil +end +function FSM:_add_to_map(Map,Event) +self:F3({Map,Event}) +if type(Event.From)=='string'then +Map[Event.From]=Event.To +else +for _,From in ipairs(Event.From)do +Map[From]=Event.To +end +end +end +function FSM:GetState() +return self.current +end +function FSM:GetCurrentState() +return self.current +end +function FSM:Is(State) +return self.current==State +end +function FSM:is(state) +return self.current==state +end +function FSM:can(e) +local Event=self.Events[e] +local To=Event and Event.map[self.current]or Event.map['*'] +return To~=nil,To +end +function FSM:cannot(e) +return not self:can(e) +end +end +do +FSM_CONTROLLABLE={ +ClassName="FSM_CONTROLLABLE", +} +function FSM_CONTROLLABLE:New(Controllable) +local self=BASE:Inherit(self,FSM:New()) +if Controllable then +self:SetControllable(Controllable) +end +self:AddTransition("*","Stop","Stopped") +return self +end +function FSM_CONTROLLABLE:OnAfterStop(Controllable,From,Event,To) +self.CallScheduler:Clear() +end +function FSM_CONTROLLABLE:SetControllable(FSMControllable) +self.Controllable=FSMControllable +end +function FSM_CONTROLLABLE:GetControllable() +return self.Controllable +end +function FSM_CONTROLLABLE:_call_handler(step,trigger,params,EventName) +local handler=step..trigger +local ErrorHandler=function(errmsg) +env.info("Error in SCHEDULER function:"..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +if self[handler]then +self:T("*** FSM *** "..step.." *** "..params[1].." --> "..params[2].." --> "..params[3].." *** TaskUnit: "..self.Controllable:GetName()) +self._EventSchedules[EventName]=nil +local Result,Value=xpcall(function() +return self[handler](self,self.Controllable,unpack(params)) +end,ErrorHandler) +return Value +end +end +end +do +FSM_PROCESS={ClassName="FSM_PROCESS"} +function FSM_PROCESS:New(Controllable,Task) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +self:Assign(Controllable,Task) +return self +end +function FSM_PROCESS:Init(FsmProcess) +self:T("No Initialisation") +end +function FSM_PROCESS:_call_handler(step,trigger,params,EventName) +local handler=step..trigger +local ErrorHandler=function(errmsg) +env.info("Error in FSM_PROCESS call handler:"..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +if self[handler]then +if handler~="onstatechange"then +self:T("*** FSM *** "..step.." *** "..params[1].." --> "..params[2].." --> "..params[3].." *** Task: "..self.Task:GetName()..", TaskUnit: "..self.Controllable:GetName()) +end +self._EventSchedules[EventName]=nil +local Result,Value +if self.Controllable and self.Controllable:IsAlive()==true then +Result,Value=xpcall(function() +return self[handler](self,self.Controllable,self.Task,unpack(params)) +end,ErrorHandler) +end +return Value +end +end +function FSM_PROCESS:Copy(Controllable,Task) +local NewFsm=self:New(Controllable,Task) +NewFsm:Assign(Controllable,Task) +NewFsm:Init(self) +NewFsm:SetStartState(self:GetStartState()) +for TransitionID,Transition in pairs(self:GetTransitions())do +NewFsm:AddTransition(Transition.From,Transition.Event,Transition.To) +end +for ProcessID,Process in pairs(self:GetProcesses())do +local FsmProcess=NewFsm:AddProcess(Process.From,Process.Event,Process.fsm:Copy(Controllable,Task),Process.ReturnEvents) +end +for EndStateID,EndState in pairs(self:GetEndStates())do +NewFsm:AddEndState(EndState) +end +for ScoreID,Score in pairs(self:GetScores())do +NewFsm:AddScore(ScoreID,Score.ScoreText,Score.Score) +end +return NewFsm +end +function FSM_PROCESS:Remove() +self:F({self:GetClassNameAndID()}) +self:F("Clearing Schedules") +self.CallScheduler:Clear() +for ProcessID,Process in pairs(self:GetProcesses())do +if Process.fsm then +Process.fsm:Remove() +Process.fsm=nil +end +end +return self +end +function FSM_PROCESS:SetTask(Task) +self.Task=Task +return self +end +function FSM_PROCESS:GetTask() +return self.Task +end +function FSM_PROCESS:GetMission() +return self.Task.Mission +end +function FSM_PROCESS:GetCommandCenter() +return self:GetTask():GetMission():GetCommandCenter() +end +function FSM_PROCESS:Message(Message) +self:F({Message=Message}) +local CC=self:GetCommandCenter() +local TaskGroup=self.Controllable:GetGroup() +local PlayerName=self.Controllable:GetPlayerName() +PlayerName=PlayerName and" ("..PlayerName..")"or"" +local Callsign=self.Controllable:GetCallsign() +local Prefix=Callsign and" @ "..Callsign..PlayerName or"" +Message=Prefix..": "..Message +CC:MessageToGroup(Message,TaskGroup) +end +function FSM_PROCESS:Assign(ProcessUnit,Task) +self:SetControllable(ProcessUnit) +self:SetTask(Task) +return self +end +function FSM_PROCESS:onenterFailed(ProcessUnit,Task,From,Event,To) +self:T("*** FSM *** Failed *** "..Task:GetName().."/"..ProcessUnit:GetName().." *** "..From.." --> "..Event.." --> "..To) +self.Task:Fail() +end +function FSM_PROCESS:onstatechange(ProcessUnit,Task,From,Event,To) +if From~=To then +self:T("*** FSM *** Change *** "..Task:GetName().."/"..ProcessUnit:GetName().." *** "..From.." --> "..Event.." --> "..To) +end +if self._Scores[To]then +local Task=self.Task +local Scoring=Task:GetScoring() +if Scoring then +Scoring:_AddMissionTaskScore(Task.Mission,ProcessUnit,self._Scores[To].ScoreText,self._Scores[To].Score) +end +end +end +end +do +FSM_TASK={ +ClassName="FSM_TASK", +} +function FSM_TASK:New(TaskName) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +self["onstatechange"]=self.OnStateChange +self.TaskName=TaskName +return self +end +function FSM_TASK:_call_handler(step,trigger,params,EventName) +local handler=step..trigger +local ErrorHandler=function(errmsg) +env.info("Error in SCHEDULER function:"..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +if self[handler]then +self:T("*** FSM *** "..step.." *** "..params[1].." --> "..params[2].." --> "..params[3].." *** Task: "..self.TaskName) +self._EventSchedules[EventName]=nil +local Result,Value=xpcall(function() +return self[handler](self,unpack(params)) +end,ErrorHandler) +return Value +end +end +end +do +FSM_SET={ +ClassName="FSM_SET", +} +function FSM_SET:New(FSMSet) +self=BASE:Inherit(self,FSM:New()) +if FSMSet then +self:Set(FSMSet) +end +return self +end +function FSM_SET:Set(FSMSet) +self:F(FSMSet) +self.Set=FSMSet +end +function FSM_SET:Get() +return self.Set +end +function FSM_SET:_call_handler(step,trigger,params,EventName) +local handler=step..trigger +if self[handler]then +self:T("*** FSM *** "..step.." *** "..params[1].." --> "..params[2].." --> "..params[3]) +self._EventSchedules[EventName]=nil +return self[handler](self,self.Set,unpack(params)) +end +end +end +SPAWN={ +ClassName="SPAWN", +SpawnTemplatePrefix=nil, +SpawnAliasPrefix=nil, +} +SPAWN.Takeoff={ +Air=1, +Runway=2, +Hot=3, +Cold=4, +} +function SPAWN:New(SpawnTemplatePrefix) +local self=BASE:Inherit(self,BASE:New()) +local TemplateGroup=GROUP:FindByName(SpawnTemplatePrefix) +if TemplateGroup then +self.SpawnTemplatePrefix=SpawnTemplatePrefix +self.SpawnIndex=0 +self.SpawnCount=0 +self.AliveUnits=0 +self.SpawnIsScheduled=false +self.SpawnTemplate=self._GetTemplate(self,SpawnTemplatePrefix) +self.Repeat=false +self.UnControlled=false +self.SpawnInitLimit=false +self.SpawnMaxUnitsAlive=0 +self.SpawnMaxGroups=0 +self.SpawnRandomize=false +self.SpawnVisible=false +self.AIOnOff=true +self.SpawnUnControlled=false +self.SpawnInitKeepUnitNames=false +self.DelayOnOff=false +self.SpawnGrouping=nil +self.SpawnInitLivery=nil +self.SpawnInitSkill=nil +self.SpawnInitFreq=nil +self.SpawnInitModu=nil +self.SpawnInitRadio=nil +self.SpawnInitModex=nil +self.SpawnInitModexPrefix=nil +self.SpawnInitModexPostfix=nil +self.SpawnInitAirbase=nil +self.TweakedTemplate=false +self.SpawnRandomCallsign=false +self.SpawnGroups={} +else +error("SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '"..SpawnTemplatePrefix.."'") +end +self:SetEventPriority(5) +self.SpawnHookScheduler=SCHEDULER:New(nil) +return self +end +function SPAWN:NewWithAlias(SpawnTemplatePrefix,SpawnAliasPrefix) +local self=BASE:Inherit(self,BASE:New()) +local TemplateGroup=GROUP:FindByName(SpawnTemplatePrefix) +if TemplateGroup then +self.SpawnTemplatePrefix=SpawnTemplatePrefix +self.SpawnAliasPrefix=SpawnAliasPrefix +self.SpawnIndex=0 +self.SpawnCount=0 +self.AliveUnits=0 +self.SpawnIsScheduled=false +self.SpawnTemplate=self._GetTemplate(self,SpawnTemplatePrefix) +self.Repeat=false +self.UnControlled=false +self.SpawnInitLimit=false +self.SpawnMaxUnitsAlive=0 +self.SpawnMaxGroups=0 +self.SpawnRandomize=false +self.SpawnVisible=false +self.AIOnOff=true +self.SpawnUnControlled=false +self.SpawnInitKeepUnitNames=false +self.DelayOnOff=false +self.SpawnGrouping=nil +self.SpawnInitLivery=nil +self.SpawnInitSkill=nil +self.SpawnInitFreq=nil +self.SpawnInitModu=nil +self.SpawnInitRadio=nil +self.SpawnInitModex=nil +self.SpawnInitModexPrefix=nil +self.SpawnInitModexPostfix=nil +self.SpawnInitAirbase=nil +self.TweakedTemplate=false +self.SpawnGroups={} +else +error("SPAWN:New: There is no group declared in the mission editor with SpawnTemplatePrefix = '"..SpawnTemplatePrefix.."'") +end +self:SetEventPriority(5) +self.SpawnHookScheduler=SCHEDULER:New(nil) +return self +end +function SPAWN:NewFromTemplate(SpawnTemplate,SpawnTemplatePrefix,SpawnAliasPrefix,NoMooseNamingPostfix) +local self=BASE:Inherit(self,BASE:New()) +if SpawnTemplatePrefix==nil or SpawnTemplatePrefix==""then +BASE:I("ERROR: in function NewFromTemplate, required parameter SpawnTemplatePrefix is not set") +return nil +end +if SpawnTemplate then +self.SpawnTemplate=UTILS.DeepCopy(SpawnTemplate) +self.SpawnTemplatePrefix=SpawnTemplatePrefix +self.SpawnAliasPrefix=SpawnAliasPrefix or SpawnTemplatePrefix +self.SpawnTemplate.name=SpawnTemplatePrefix +self.SpawnIndex=0 +self.SpawnCount=0 +self.AliveUnits=0 +self.SpawnIsScheduled=false +self.Repeat=false +self.UnControlled=false +self.SpawnInitLimit=false +self.SpawnMaxUnitsAlive=0 +self.SpawnMaxGroups=0 +self.SpawnRandomize=false +self.SpawnVisible=false +self.AIOnOff=true +self.SpawnUnControlled=false +self.SpawnInitKeepUnitNames=false +self.DelayOnOff=false +self.Grouping=nil +self.SpawnInitLivery=nil +self.SpawnInitSkill=nil +self.SpawnInitFreq=nil +self.SpawnInitModu=nil +self.SpawnInitRadio=nil +self.SpawnInitModex=nil +self.SpawnInitModexPrefix=nil +self.SpawnInitModexPostfix=nil +self.SpawnInitAirbase=nil +self.TweakedTemplate=true +self.MooseNameing=true +if NoMooseNamingPostfix==true then +self.MooseNameing=false +end +self.SpawnGroups={} +else +error("There is no template provided for SpawnTemplatePrefix = '"..SpawnTemplatePrefix.."'") +end +self:SetEventPriority(5) +self.SpawnHookScheduler=SCHEDULER:New(nil) +return self +end +function SPAWN:InitLimit(SpawnMaxUnitsAlive,SpawnMaxGroups) +self.SpawnInitLimit=true +self.SpawnMaxUnitsAlive=SpawnMaxUnitsAlive +self.SpawnMaxGroups=SpawnMaxGroups +for SpawnGroupID=1,self.SpawnMaxGroups do +self:_InitializeSpawnGroups(SpawnGroupID) +end +return self +end +function SPAWN:InitKeepUnitNames(KeepUnitNames) +self.SpawnInitKeepUnitNames=false +if KeepUnitNames==true then self.SpawnInitKeepUnitNames=true end +return self +end +function SPAWN:InitLateActivated(LateActivated) +self.LateActivated=LateActivated or true +return self +end +function SPAWN:InitAirbase(AirbaseName,Takeoff,TerminalType) +self.SpawnInitAirbase=AIRBASE:FindByName(AirbaseName) +self.SpawnInitTakeoff=Takeoff or SPAWN.Takeoff.Hot +self.SpawnInitTerminalType=TerminalType +return self +end +function SPAWN:InitHeading(HeadingMin,HeadingMax) +self.SpawnInitHeadingMin=HeadingMin +self.SpawnInitHeadingMax=HeadingMax +return self +end +function SPAWN:InitGroupHeading(HeadingMin,HeadingMax,unitVar) +self:F({HeadingMin=HeadingMin,HeadingMax=HeadingMax,unitVar=unitVar}) +self.SpawnInitGroupHeadingMin=HeadingMin +self.SpawnInitGroupHeadingMax=HeadingMax +self.SpawnInitGroupUnitVar=unitVar +return self +end +function SPAWN:InitCoalition(Coalition) +self:F({coalition=Coalition}) +self.SpawnInitCoalition=Coalition +return self +end +function SPAWN:InitCountry(Country) +self.SpawnInitCountry=Country +return self +end +function SPAWN:InitCategory(Category) +self.SpawnInitCategory=Category +return self +end +function SPAWN:InitLivery(Livery) +self.SpawnInitLivery=Livery +return self +end +function SPAWN:InitSkill(Skill) +if Skill:lower()=="average"then +self.SpawnInitSkill="Average" +elseif Skill:lower()=="good"then +self.SpawnInitSkill="Good" +elseif Skill:lower()=="excellent"then +self.SpawnInitSkill="Excellent" +elseif Skill:lower()=="random"then +self.SpawnInitSkill="Random" +else +self.SpawnInitSkill="High" +end +return self +end +function SPAWN:InitSTN(Octal) +self.SpawnInitSTN=Octal or 77777 +local num=UTILS.OctalToDecimal(Octal) +if num==nil or num<1 then +self:E("WARNING - STN "..tostring(Octal).." is not valid!") +return self +end +if _DATABASE.STNS[num]~=nil then +self:E("WARNING - STN already assigned: "..tostring(Octal).." is used for ".._DATABASE.STNS[Octal]) +end +return self +end +function SPAWN:InitSADL(Octal) +self.SpawnInitSADL=Octal or 7777 +local num=UTILS.OctalToDecimal(Octal) +if num==nil or num<1 then +self:E("WARNING - SADL "..tostring(Octal).." is not valid!") +return self +end +if _DATABASE.SADL[num]~=nil then +self:E("WARNING - SADL already assigned: "..tostring(Octal).." is used for ".._DATABASE.SADL[Octal]) +end +return self +end +function SPAWN:InitSpeedMps(MPS) +if MPS==nil or tonumber(MPS)<0 then +MPS=125 +end +self.InitSpeed=MPS +return self +end +function SPAWN:InitSpeedKnots(Knots) +if Knots==nil or tonumber(Knots)<0 then +Knots=300 +end +self.InitSpeed=UTILS.KnotsToMps(Knots) +return self +end +function SPAWN:InitSpeedKph(KPH) +if KPH==nil or tonumber(KPH)<0 then +KPH=UTILS.KnotsToKmph(300) +end +self.InitSpeed=UTILS.KmphToMps(KPH) +return self +end +function SPAWN:InitRadioCommsOnOff(switch) +self.SpawnInitRadio=switch or true +return self +end +function SPAWN:InitRadioFrequency(frequency) +self.SpawnInitFreq=frequency +return self +end +function SPAWN:InitRadioModulation(modulation) +if modulation and modulation:lower()=="fm"then +self.SpawnInitModu=radio.modulation.FM +else +self.SpawnInitModu=radio.modulation.AM +end +return self +end +function SPAWN:InitModex(modex,prefix,postfix) +if modex then +self.SpawnInitModex=tonumber(modex) +end +self.SpawnInitModexPrefix=prefix +self.SpawnInitModexPostfix=postfix +return self +end +function SPAWN:InitRandomizeRoute(SpawnStartPoint,SpawnEndPoint,SpawnRadius,SpawnHeight) +self.SpawnRandomizeRoute=true +self.SpawnRandomizeRouteStartPoint=SpawnStartPoint +self.SpawnRandomizeRouteEndPoint=SpawnEndPoint +self.SpawnRandomizeRouteRadius=SpawnRadius +self.SpawnRandomizeRouteHeight=SpawnHeight +for GroupID=1,self.SpawnMaxGroups do +self:_RandomizeRoute(GroupID) +end +return self +end +function SPAWN:InitRandomizePosition(RandomizePosition,OuterRadius,InnerRadius) +self.SpawnRandomizePosition=RandomizePosition or false +self.SpawnRandomizePositionOuterRadius=OuterRadius or 0 +self.SpawnRandomizePositionInnerRadius=InnerRadius or 0 +for GroupID=1,self.SpawnMaxGroups do +self:_RandomizeRoute(GroupID) +end +return self +end +function SPAWN:InitRandomizeUnits(RandomizeUnits,OuterRadius,InnerRadius) +self.SpawnRandomizeUnits=RandomizeUnits or false +self.SpawnOuterRadius=OuterRadius or 0 +self.SpawnInnerRadius=InnerRadius or 0 +for GroupID=1,self.SpawnMaxGroups do +self:_RandomizeRoute(GroupID) +end +return self +end +function SPAWN:InitSetUnitRelativePositions(Positions) +self.SpawnUnitsWithRelativePositions=true +self.UnitsRelativePositions=Positions +return self +end +function SPAWN:InitSetUnitAbsolutePositions(Positions) +self.SpawnUnitsWithAbsolutePositions=true +self.UnitsAbsolutePositions=Positions +return self +end +function SPAWN:InitValidateAndRepositionGroundUnits(OnOff,MaxRadius,Spacing) +self.SpawnValidateAndRepositionGroundUnits=OnOff +self.SpawnValidateAndRepositionGroundUnitsRadius=MaxRadius +self.SpawnValidateAndRepositionGroundUnitsSpacing=Spacing +return self +end +function SPAWN:InitRandomizeTemplate(SpawnTemplatePrefixTable) +local temptable={} +for _,_temp in pairs(SpawnTemplatePrefixTable)do +temptable[#temptable+1]=_temp +end +self.SpawnTemplatePrefixTable=UTILS.ShuffleTable(temptable) +self.SpawnRandomizeTemplate=true +for SpawnGroupID=1,self.SpawnMaxGroups do +self:_RandomizeTemplate(SpawnGroupID,RandomizePositionInZone) +end +return self +end +function SPAWN:InitRandomizeTemplateSet(SpawnTemplateSet,RandomizePositionInZone) +local setnames=SpawnTemplateSet:GetSetNames() +self:InitRandomizeTemplate(setnames,RandomizePositionInZone) +return self +end +function SPAWN:InitRandomizeTemplatePrefixes(SpawnTemplatePrefixes,RandomizePositionInZone) +local SpawnTemplateSet=SET_GROUP:New():FilterPrefixes(SpawnTemplatePrefixes):FilterOnce() +self:InitRandomizeTemplateSet(SpawnTemplateSet,RandomizePositionInZone) +return self +end +function SPAWN:InitGrouping(Grouping) +self.SpawnGrouping=Grouping +return self +end +function SPAWN:InitRandomizeZones(SpawnZoneTable,RandomizePositionInZone) +local temptable={} +for _,_temp in pairs(SpawnZoneTable)do +temptable[#temptable+1]=_temp +end +self.SpawnZoneTable=UTILS.ShuffleTable(temptable) +self.SpawnRandomizeZones=true +for SpawnGroupID=1,self.SpawnMaxGroups do +self:_RandomizeZones(SpawnGroupID,RandomizePositionInZone) +end +return self +end +function SPAWN:InitRandomizeCallsign() +self.SpawnRandomCallsign=true +return self +end +function SPAWN:InitCallSign(ID,Name,Minor,Major) +local Name=Name or"Enfield" +self.SpawnInitCallSign=true +self.SpawnInitCallSignID=ID or 1 +self.SpawnInitCallSignMinor=Minor or 1 +self.SpawnInitCallSignMajor=Major or 1 +self.SpawnInitCallSignName=string.lower(Name):gsub("^%l",string.upper) +return self +end +function SPAWN:InitPositionCoordinate(Coordinate) +self:InitPositionVec2(Coordinate:GetVec2()) +return self +end +function SPAWN:InitPositionVec2(Vec2) +self.SpawnInitPosition=Vec2 +self.SpawnFromNewPosition=true +for SpawnGroupID=1,self.SpawnMaxGroups do +self:_SetInitialPosition(SpawnGroupID) +end +return self +end +function SPAWN:InitRepeat() +self.Repeat=true +self.RepeatOnEngineShutDown=false +self.RepeatOnLanding=true +return self +end +function SPAWN:InitRepeatOnLanding(WaitingTime) +self:InitRepeat() +self.RepeatOnEngineShutDown=false +self.RepeatOnLanding=true +self.RepeatOnLandingTime=(WaitingTime and WaitingTime>3)and WaitingTime or 3 +return self +end +function SPAWN:InitRepeatOnEngineShutDown() +self:InitRepeat() +self.RepeatOnEngineShutDown=true +self.RepeatOnLanding=false +return self +end +function SPAWN:InitCleanUp(SpawnCleanUpInterval) +self.SpawnCleanUpInterval=SpawnCleanUpInterval +self.SpawnCleanUpTimeStamps={} +local SpawnGroup,SpawnCursor=self:GetFirstAliveGroup() +self.CleanUpScheduler=SCHEDULER:New(self,self._SpawnCleanUpScheduler,{},1,SpawnCleanUpInterval,0.2) +return self +end +function SPAWN:InitArray(SpawnAngle,SpawnWidth,SpawnDeltaX,SpawnDeltaY) +self.SpawnVisible=true +local SpawnX=0 +local SpawnY=0 +local SpawnXIndex=0 +local SpawnYIndex=0 +for SpawnGroupID=1,self.SpawnMaxGroups do +self.SpawnGroups[SpawnGroupID].Visible=true +self.SpawnGroups[SpawnGroupID].Spawned=false +SpawnXIndex=SpawnXIndex+1 +if SpawnWidth and SpawnWidth~=0 then +if SpawnXIndex>=SpawnWidth then +SpawnXIndex=0 +SpawnYIndex=SpawnYIndex+1 +end +end +local SpawnRootX=self.SpawnGroups[SpawnGroupID].SpawnTemplate.x +local SpawnRootY=self.SpawnGroups[SpawnGroupID].SpawnTemplate.y +self:_TranslateRotate(SpawnGroupID,SpawnRootX,SpawnRootY,SpawnX,SpawnY,SpawnAngle) +self.SpawnGroups[SpawnGroupID].SpawnTemplate.lateActivation=true +self.SpawnGroups[SpawnGroupID].SpawnTemplate.visible=true +self.SpawnGroups[SpawnGroupID].Visible=true +self:HandleEvent(EVENTS.Birth,self._OnBirth) +self:HandleEvent(EVENTS.Dead,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._OnDeadOrCrash) +if self.Repeat then +self:HandleEvent(EVENTS.Takeoff,self._OnTakeOff) +self:HandleEvent(EVENTS.Land,self._OnLand) +end +if self.RepeatOnEngineShutDown then +self:HandleEvent(EVENTS.EngineShutdown,self._OnEngineShutDown) +end +self.SpawnGroups[SpawnGroupID].Group=_DATABASE:Spawn(self.SpawnGroups[SpawnGroupID].SpawnTemplate) +SpawnX=SpawnXIndex*SpawnDeltaX +SpawnY=SpawnYIndex*SpawnDeltaY +end +return self +end +function SPAWN:StopRepeat() +if self.Repeat then +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +end +if self.RepeatOnEngineShutDown then +self:UnHandleEvent(EVENTS.EngineShutdown) +end +self.Repeat=false +self.RepeatOnEngineShutDown=false +self.RepeatOnLanding=false +return self +end +do +function SPAWN:InitAIOnOff(AIOnOff) +self.AIOnOff=AIOnOff +return self +end +function SPAWN:InitAIOn() +return self:InitAIOnOff(true) +end +function SPAWN:InitAIOff() +return self:InitAIOnOff(false) +end +end +do +function SPAWN:InitDelayOnOff(DelayOnOff) +self.DelayOnOff=DelayOnOff +return self +end +function SPAWN:InitDelayOn() +return self:InitDelayOnOff(true) +end +function SPAWN:InitDelayOff() +return self:InitDelayOnOff(false) +end +end +function SPAWN:InitHiddenOnMap(OnOff) +self.SpawnHiddenOnMap=OnOff==false and false or true +return self +end +function SPAWN:InitHiddenOnMFD() +self.SpawnHiddenOnMFD=true +return self +end +function SPAWN:InitHiddenOnPlanner() +self.SpawnHiddenOnPlanner=true +return self +end +function SPAWN:Spawn() +if self.SpawnInitAirbase then +return self:SpawnAtAirbase(self.SpawnInitAirbase,self.SpawnInitTakeoff,nil,self.SpawnInitTerminalType) +else +return self:SpawnWithIndex(self.SpawnIndex+1) +end +end +function SPAWN:ReSpawn(SpawnIndex) +if not SpawnIndex then +SpawnIndex=1 +end +local SpawnGroup=self:GetGroupFromIndex(SpawnIndex) +local WayPoints=SpawnGroup and SpawnGroup.WayPoints or nil +if SpawnGroup then +local SpawnDCSGroup=SpawnGroup:GetDCSObject() +if SpawnDCSGroup then +SpawnGroup:Destroy() +end +end +local SpawnGroup=self:SpawnWithIndex(SpawnIndex) +if SpawnGroup and WayPoints then +SpawnGroup:WayPointInitialize(WayPoints) +SpawnGroup:WayPointExecute(1,5) +end +if SpawnGroup and SpawnGroup.ReSpawnFunction then +SpawnGroup:ReSpawnFunction() +end +if SpawnGroup then SpawnGroup:ResetEvents()end +return SpawnGroup +end +function SPAWN:SetSpawnIndex(SpawnIndex) +self.SpawnIndex=SpawnIndex or 0 +end +function SPAWN:SpawnWithIndex(SpawnIndex,NoBirth) +if self:_GetSpawnIndex(SpawnIndex)then +if self.SpawnFromNewPosition then +self:_SetInitialPosition(SpawnIndex) +end +if self.SpawnGroups[self.SpawnIndex].Visible then +self.SpawnGroups[self.SpawnIndex].Group:Activate() +else +local SpawnTemplate=self.SpawnGroups[self.SpawnIndex].SpawnTemplate +local SpawnZone=self.SpawnGroups[self.SpawnIndex].SpawnZone +if SpawnTemplate then +local PointVec3=COORDINATE:New(SpawnTemplate.route.points[1].x,SpawnTemplate.route.points[1].alt,SpawnTemplate.route.points[1].y) +if self.SpawnRandomizePosition then +local RandomVec2=PointVec3:GetRandomVec2InRadius(self.SpawnRandomizePositionOuterRadius,self.SpawnRandomizePositionInnerRadius) +local CurrentX=SpawnTemplate.units[1].x +local CurrentY=SpawnTemplate.units[1].y +SpawnTemplate.x=RandomVec2.x +SpawnTemplate.y=RandomVec2.y +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].x=SpawnTemplate.units[UnitID].x+(RandomVec2.x-CurrentX) +SpawnTemplate.units[UnitID].y=SpawnTemplate.units[UnitID].y+(RandomVec2.y-CurrentY) +end +end +if self.SpawnRandomizeUnits then +for UnitID=1,#SpawnTemplate.units do +local RandomVec2=PointVec3:GetRandomVec2InRadius(self.SpawnOuterRadius,self.SpawnInnerRadius) +if(SpawnZone)then +local inZone=SpawnZone:IsVec2InZone(RandomVec2) +local numTries=1 +while(not inZone)and(numTries<20)do +if not inZone then +RandomVec2=PointVec3:GetRandomVec2InRadius(self.SpawnOuterRadius,self.SpawnInnerRadius) +numTries=numTries+1 +inZone=SpawnZone:IsVec2InZone(RandomVec2) +end +end +if(not inZone)then +RandomVec2=SpawnZone:GetRandomVec2() +end +end +SpawnTemplate.units[UnitID].x=RandomVec2.x +SpawnTemplate.units[UnitID].y=RandomVec2.y +end +end +local function _Heading(courseDeg) +local h +if courseDeg<=180 then +h=math.rad(courseDeg) +else +h=-math.rad(360-courseDeg) +end +return h +end +local Rad180=math.rad(180) +local function _HeadingRad(courseRad) +if courseRad<=Rad180 then +return courseRad +else +return-((2*Rad180)-courseRad) +end +end +local function _RandomInRange(min,max) +if min and max then +return min+(math.random()*(max-min)) +else +return min +end +end +if self.SpawnInitGroupHeadingMin and#SpawnTemplate.units>0 then +local pivotX=SpawnTemplate.units[1].x +local pivotY=SpawnTemplate.units[1].y +local headingRad=math.rad(_RandomInRange(self.SpawnInitGroupHeadingMin or 0,self.SpawnInitGroupHeadingMax)) +local cosHeading=math.cos(headingRad) +local sinHeading=math.sin(headingRad) +local unitVarRad=math.rad(self.SpawnInitGroupUnitVar or 0) +for UnitID=1,#SpawnTemplate.units do +if not self.SpawnRandomizeUnits then +if UnitID>1 then +local unitXOff=SpawnTemplate.units[UnitID].x-pivotX +local unitYOff=SpawnTemplate.units[UnitID].y-pivotY +SpawnTemplate.units[UnitID].x=pivotX+(unitXOff*cosHeading)-(unitYOff*sinHeading) +SpawnTemplate.units[UnitID].y=pivotY+(unitYOff*cosHeading)+(unitXOff*sinHeading) +end +end +local unitHeading=SpawnTemplate.units[UnitID].heading+headingRad +SpawnTemplate.units[UnitID].heading=_HeadingRad(_RandomInRange(unitHeading-unitVarRad,unitHeading+unitVarRad)) +SpawnTemplate.units[UnitID].psi=-SpawnTemplate.units[UnitID].heading +end +end +if self.SpawnInitHeadingMin then +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].heading=_Heading(_RandomInRange(self.SpawnInitHeadingMin,self.SpawnInitHeadingMax)) +SpawnTemplate.units[UnitID].psi=-SpawnTemplate.units[UnitID].heading +end +end +if self.SpawnUnitsWithRelativePositions and self.UnitsRelativePositions then +local BaseX=SpawnTemplate.units[1].x or 0 +local BaseY=SpawnTemplate.units[1].y or 0 +local BaseZ=SpawnTemplate.units[1].z or 0 +for UnitID=1,#SpawnTemplate.units do +if self.UnitsRelativePositions[UnitID].heading then +SpawnTemplate.units[UnitID].heading=math.rad(self.UnitsRelativePositions[UnitID].heading or 0) +end +SpawnTemplate.units[UnitID].x=BaseX+(self.UnitsRelativePositions[UnitID].x or 0) +SpawnTemplate.units[UnitID].y=BaseY+(self.UnitsRelativePositions[UnitID].y or 0) +if self.UnitsRelativePositions[UnitID].z then +SpawnTemplate.units[UnitID].z=BaseZ+(self.UnitsRelativePositions[UnitID].z or 0) +end +end +end +if self.SpawnUnitsWithAbsolutePositions and self.UnitsAbsolutePositions then +for UnitID=1,#SpawnTemplate.units do +if self.UnitsAbsolutePositions[UnitID].heading then +SpawnTemplate.units[UnitID].heading=math.rad(self.UnitsAbsolutePositions[UnitID].heading or 0) +end +SpawnTemplate.units[UnitID].x=self.UnitsAbsolutePositions[UnitID].x or 0 +SpawnTemplate.units[UnitID].y=self.UnitsAbsolutePositions[UnitID].y or 0 +if self.UnitsAbsolutePositions[UnitID].z then +SpawnTemplate.units[UnitID].z=self.UnitsAbsolutePositions[UnitID].z or 0 +end +end +end +if self.SpawnInitLivery then +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].livery_id=self.SpawnInitLivery +end +end +if self.SpawnInitSkill then +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].skill=self.SpawnInitSkill +end +end +if self.SpawnInitModex then +for UnitID=1,#SpawnTemplate.units do +local modexnumber=string.format("%03d",self.SpawnInitModex+(UnitID-1)) +if self.SpawnInitModexPrefix then modexnumber=self.SpawnInitModexPrefix..modexnumber end +if self.SpawnInitModexPostfix then modexnumber=modexnumber..self.SpawnInitModexPostfix end +SpawnTemplate.units[UnitID].onboard_num=modexnumber +end +end +if self.SpawnInitRadio then +SpawnTemplate.communication=self.SpawnInitRadio +end +if self.SpawnInitFreq then +SpawnTemplate.frequency=self.SpawnInitFreq +end +if self.SpawnInitModu then +SpawnTemplate.modulation=self.SpawnInitModu +end +if self.SpawnHiddenOnPlanner then +SpawnTemplate.hiddenOnPlanner=true +end +if self.SpawnHiddenOnMFD then +SpawnTemplate.hiddenOnMFD=true +end +if self.SpawnHiddenOnMap then +SpawnTemplate.hidden=self.SpawnHiddenOnMap +end +if self.SpawnValidateAndRepositionGroundUnits then +local units=SpawnTemplate.units +local gPos={x=SpawnTemplate.x,y=SpawnTemplate.y} +UTILS.ValidateAndRepositionGroundUnits(units,gPos,self.SpawnValidateAndRepositionGroundUnitsRadius,self.SpawnValidateAndRepositionGroundUnitsSpacing) +end +SpawnTemplate.CategoryID=self.SpawnInitCategory or SpawnTemplate.CategoryID +SpawnTemplate.CountryID=self.SpawnInitCountry or SpawnTemplate.CountryID +SpawnTemplate.CoalitionID=self.SpawnInitCoalition or SpawnTemplate.CoalitionID +end +if not NoBirth then +self:HandleEvent(EVENTS.Birth,self._OnBirth) +end +self:HandleEvent(EVENTS.Crash,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.UnitLost,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.RemoveUnit,self._OnDeadOrCrash) +if self.Repeat then +self:HandleEvent(EVENTS.Takeoff,self._OnTakeOff) +self:HandleEvent(EVENTS.Land,self._OnLand) +end +if self.RepeatOnEngineShutDown then +self:HandleEvent(EVENTS.EngineShutdown,self._OnEngineShutDown) +end +self.SpawnGroups[self.SpawnIndex].Group=_DATABASE:Spawn(SpawnTemplate) +local SpawnGroup=self.SpawnGroups[self.SpawnIndex].Group +if SpawnGroup then +SpawnGroup:SetAIOnOff(self.AIOnOff) +end +self:T3(SpawnTemplate.name) +if self.SpawnFunctionHook then +self.SpawnHookScheduler:Schedule(nil,self.SpawnFunctionHook,{self.SpawnGroups[self.SpawnIndex].Group,unpack(self.SpawnFunctionArguments)},0.3) +end +end +self.SpawnGroups[self.SpawnIndex].Spawned=true +self.SpawnGroups[self.SpawnIndex].Group.TemplateDonor=self.SpawnTemplatePrefix +return self.SpawnGroups[self.SpawnIndex].Group +else +end +return nil +end +function SPAWN:SpawnScheduled(SpawnTime,SpawnTimeVariation,WithDelay) +local SpawnTime=SpawnTime or 60 +local SpawnTimeVariation=SpawnTimeVariation or 0.5 +if SpawnTime<15 then +self:E("****SPAWN SCHEDULED****\nWARNING - Setting a very low SpawnTime heavily impacts your mission performance and CPU time, it is NOT useful to check the alive state of an object every "..tostring(SpawnTime).." seconds.\nSetting to 15 second intervals.\n*****") +SpawnTime=15 +end +if SpawnTimeVariation>1 or SpawnTimeVariation<0 then SpawnTimeVariation=0.5 end +if SpawnTime~=nil and SpawnTimeVariation~=nil then +local InitialDelay=0 +if WithDelay or self.DelayOnOff==true then +InitialDelay=math.random(SpawnTime-SpawnTime*SpawnTimeVariation,SpawnTime+SpawnTime*SpawnTimeVariation) +end +self.SpawnScheduler=SCHEDULER:New(self,self._Scheduler,{},InitialDelay,SpawnTime,SpawnTimeVariation) +end +return self +end +function SPAWN:SpawnScheduleStart() +self.SpawnScheduler:Start() +return self +end +function SPAWN:SpawnScheduleStop() +self.SpawnScheduler:Stop() +return self +end +function SPAWN:OnSpawnGroup(SpawnCallBackFunction,...) +self.SpawnFunctionHook=SpawnCallBackFunction +self.SpawnFunctionArguments={} +if arg then +self.SpawnFunctionArguments=arg +end +return self +end +function SPAWN:SpawnAtAirbase(SpawnAirbase,Takeoff,TakeoffAltitude,TerminalType,EmergencyAirSpawn,Parkingdata) +local PointVec3=SpawnAirbase:GetCoordinate() +Takeoff=Takeoff or SPAWN.Takeoff.Hot +if EmergencyAirSpawn==nil then +EmergencyAirSpawn=true +end +if self:_GetSpawnIndex(self.SpawnIndex+1)then +local SpawnTemplate=self.SpawnGroups[self.SpawnIndex].SpawnTemplate +if SpawnTemplate then +local group=GROUP:FindByName(self.SpawnTemplatePrefix) +local unit=group:GetUnit(1) +local istransport=group:HasAttribute("Transports")and group:HasAttribute("Planes") +local isawacs=group:HasAttribute("AWACS") +local isfighter=group:HasAttribute("Fighters")or group:HasAttribute("Interceptors")or group:HasAttribute("Multirole fighters")or(group:HasAttribute("Bombers")and not group:HasAttribute("Strategic bombers")) +local isbomber=group:HasAttribute("Strategic bombers") +local istanker=group:HasAttribute("Tankers") +local ishelo=unit:HasAttribute("Helicopters") +local nunits=#SpawnTemplate.units +local SpawnPoint=SpawnTemplate.route.points[1] +SpawnPoint.linkUnit=nil +SpawnPoint.helipadId=nil +SpawnPoint.airdromeId=nil +local AirbaseID=SpawnAirbase:GetID() +local AirbaseCategory=SpawnAirbase:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.HELIPAD then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +else +SpawnPoint.airdromeId=AirbaseID +end +SpawnPoint.alt=0 +SpawnPoint.type=GROUPTEMPLATE.Takeoff[Takeoff][1] +SpawnPoint.action=GROUPTEMPLATE.Takeoff[Takeoff][2] +local spawnonground=not(Takeoff==SPAWN.Takeoff.Air) +local autoparking=false +if SpawnAirbase.isAirdrome then +autoparking=false +else +autoparking=true +end +local parkingspots={} +local parkingindex={} +local spots +if spawnonground and not SpawnTemplate.parked then +local nfree=0 +local termtype=TerminalType +if Takeoff==SPAWN.Takeoff.Runway then +if SpawnAirbase.isShip then +if ishelo then +termtype=AIRBASE.TerminalType.HelicopterUsable +else +termtype=AIRBASE.TerminalType.OpenMedOrBig +end +else +termtype=AIRBASE.TerminalType.Runway +end +end +local scanradius=50 +local scanunits=true +local scanstatics=true +local scanscenery=false +local verysafe=false +if autoparking then +nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true) +spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true) +elseif Parkingdata~=nil then +nfree=#Parkingdata +spots=Parkingdata +else +if ishelo then +if termtype==nil then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.HelicopterOnly,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +if nfree<nunits then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.HelicopterUsable,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +if termtype==nil then +if isbomber or istransport or istanker or isawacs then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.OpenBig,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +if nfree<nunits then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.OpenMedOrBig,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,AIRBASE.TerminalType.FighterAircraft,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(group,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +end +end +local _notenough=false +if autoparking then +if nfree>=1 then +for i=1,nunits do +table.insert(parkingspots,spots[1].Coordinate) +table.insert(parkingindex,spots[1].TerminalID) +end +PointVec3=spots[1].Coordinate +else +_notenough=true +end +else +if nfree>=nunits then +for i=1,nunits do +table.insert(parkingspots,spots[i].Coordinate) +table.insert(parkingindex,spots[i].TerminalID) +end +else +_notenough=true +end +end +if _notenough then +if EmergencyAirSpawn and not self.SpawnUnControlled then +self:E(string.format("WARNING: Group %s has no parking spots at %s ==> air start!",self.SpawnTemplatePrefix,SpawnAirbase:GetName())) +autoparking=false +SpawnPoint.type=GROUPTEMPLATE.Takeoff[GROUP.Takeoff.Air][1] +SpawnPoint.action=GROUPTEMPLATE.Takeoff[GROUP.Takeoff.Air][2] +PointVec3.x=PointVec3.x+math.random(-500,500) +PointVec3.z=PointVec3.z+math.random(-500,500) +if ishelo then +PointVec3.y=PointVec3:GetLandHeight()+math.random(100,1000) +else +PointVec3.y=PointVec3:GetLandHeight()+math.random(500,2500) +end +Takeoff=GROUP.Takeoff.Air +else +self:E(string.format("WARNING: Group %s has no parking spots at %s ==> No emergency air start or uncontrolled spawning ==> No spawn!",self.SpawnTemplatePrefix,SpawnAirbase:GetName())) +return nil +end +end +else +if TakeoffAltitude then +PointVec3.y=TakeoffAltitude +else +if ishelo then +PointVec3.y=PointVec3:GetLandHeight()+math.random(100,1000) +else +PointVec3.y=PointVec3:GetLandHeight()+math.random(500,2500) +end +end +end +if not SpawnTemplate.parked then +SpawnTemplate.parked=true +for UnitID=1,nunits do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x +local SY=UnitTemplate.y +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=PointVec3.x+(SX-BX) +local TY=PointVec3.z+(SY-BY) +if spawnonground then +if autoparking then +SpawnTemplate.units[UnitID].x=PointVec3.x +SpawnTemplate.units[UnitID].y=PointVec3.z +SpawnTemplate.units[UnitID].alt=PointVec3.y +else +SpawnTemplate.units[UnitID].x=parkingspots[UnitID].x +SpawnTemplate.units[UnitID].y=parkingspots[UnitID].z +SpawnTemplate.units[UnitID].alt=parkingspots[UnitID].y +end +else +SpawnTemplate.units[UnitID].x=TX +SpawnTemplate.units[UnitID].y=TY +SpawnTemplate.units[UnitID].alt=PointVec3.y +end +UnitTemplate.parking=nil +UnitTemplate.parking_id=nil +if parkingindex[UnitID]then +UnitTemplate.parking=parkingindex[UnitID] +end +end +end +SpawnPoint.x=PointVec3.x +SpawnPoint.y=PointVec3.z +SpawnPoint.alt=PointVec3.y +SpawnTemplate.x=PointVec3.x +SpawnTemplate.y=PointVec3.z +SpawnTemplate.uncontrolled=self.SpawnUnControlled +local GroupSpawned=self:SpawnWithIndex(self.SpawnIndex) +if Takeoff==GROUP.Takeoff.Air then +for UnitID,UnitSpawned in pairs(GroupSpawned:GetUnits())do +self:ScheduleOnce(5,BASE.CreateEventTakeoff,{GroupSpawned,timer.getTime(),UnitSpawned:GetDCSObject()}) +end +end +return GroupSpawned +end +end +return nil +end +function SPAWN:SpawnAtParkingSpot(Airbase,Spots,Takeoff) +if type(Spots)~="table"then +Spots={Spots} +end +if type(Airbase)=="string"then +Airbase=AIRBASE:FindByName(Airbase) +end +local group=GROUP:FindByName(self.SpawnTemplatePrefix) +local nunits=self.SpawnGrouping or#group:GetUnits() +if nunits then +if#Spots<nunits then +self:E("ERROR: Number of provided parking spots is less than number of units in group!") +return nil +end +local Parkingdata={} +for _,TerminalID in pairs(Spots)do +local spot=Airbase:GetParkingSpotData(TerminalID) +if spot and spot.Free then +table.insert(Parkingdata,spot) +end +end +if#Parkingdata>=nunits then +return self:SpawnAtAirbase(Airbase,Takeoff,nil,nil,nil,Parkingdata) +else +self:E("ERROR: Could not find enough free parking spots!") +end +else +self:E("ERROR: Could not get number of units in group!") +end +return nil +end +function SPAWN:ParkAircraft(SpawnAirbase,TerminalType,Parkingdata,SpawnIndex) +local PointVec3=SpawnAirbase:GetCoordinate() +local Takeoff=SPAWN.Takeoff.Cold +local SpawnTemplate=self.SpawnGroups[SpawnIndex].SpawnTemplate +if SpawnTemplate then +local GroupAlive=self:GetGroupFromIndex(SpawnIndex) +local TemplateGroup=GROUP:FindByName(self.SpawnTemplatePrefix) +local TemplateUnit=TemplateGroup:GetUnit(1) +local ishelo=TemplateUnit:HasAttribute("Helicopters") +local isbomber=TemplateUnit:HasAttribute("Bombers") +local istransport=TemplateUnit:HasAttribute("Transports") +local isfighter=TemplateUnit:HasAttribute("Battleplanes") +local nunits=#SpawnTemplate.units +local SpawnPoint=SpawnTemplate.route.points[1] +SpawnPoint.linkUnit=nil +SpawnPoint.helipadId=nil +SpawnPoint.airdromeId=nil +local AirbaseID=SpawnAirbase:GetID() +local AirbaseCategory=SpawnAirbase:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.HELIPAD then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.AIRDROME then +SpawnPoint.airdromeId=AirbaseID +end +SpawnPoint.alt=0 +SpawnPoint.type=GROUPTEMPLATE.Takeoff[Takeoff][1] +SpawnPoint.action=GROUPTEMPLATE.Takeoff[Takeoff][2] +local spawnonground=not(Takeoff==SPAWN.Takeoff.Air) +local spawnonship=false +local spawnonfarp=false +local spawnonrunway=false +local spawnonairport=false +if spawnonground then +if AirbaseCategory==Airbase.Category.SHIP then +spawnonship=true +elseif AirbaseCategory==Airbase.Category.HELIPAD then +spawnonfarp=true +elseif AirbaseCategory==Airbase.Category.AIRDROME then +spawnonairport=true +end +spawnonrunway=Takeoff==SPAWN.Takeoff.Runway +end +local parkingspots={} +local parkingindex={} +local spots +if spawnonground and not SpawnTemplate.parked then +local nfree=0 +local termtype=TerminalType +local scanradius=50 +local scanunits=true +local scanstatics=true +local scanscenery=false +local verysafe=false +if spawnonship or spawnonfarp or spawnonrunway then +nfree=SpawnAirbase:GetFreeParkingSpotsNumber(termtype,true) +spots=SpawnAirbase:GetFreeParkingSpotsTable(termtype,true) +else +if ishelo then +if termtype==nil then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterOnly,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +if nfree<nunits then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterUsable,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +if termtype==nil then +if isbomber or istransport then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.OpenBig,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +if nfree<nunits then +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.OpenMedOrBig,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.FighterAircraft,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +else +spots=SpawnAirbase:FindFreeParkingSpotForAircraft(TemplateGroup,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits,Parkingdata) +nfree=#spots +end +end +end +local _notenough=false +if spawnonship or spawnonfarp or spawnonrunway then +if nfree>=1 then +for i=1,nunits do +table.insert(parkingspots,spots[1].Coordinate) +table.insert(parkingindex,spots[1].TerminalID) +end +PointVec3=spots[1].Coordinate +else +_notenough=true +end +elseif spawnonairport then +if nfree>=nunits then +for i=1,nunits do +table.insert(parkingspots,spots[i].Coordinate) +table.insert(parkingindex,spots[i].TerminalID) +end +else +_notenough=true +end +end +if _notenough then +if not self.SpawnUnControlled then +else +self:E(string.format("WARNING: Group %s has no parking spots at %s ==> No emergency air start or uncontrolled spawning ==> No spawn!",self.SpawnTemplatePrefix,SpawnAirbase:GetName())) +return nil +end +end +else +end +if not SpawnTemplate.parked then +SpawnTemplate.parked=true +for UnitID=1,nunits do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x +local SY=UnitTemplate.y +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=PointVec3.x+(SX-BX) +local TY=PointVec3.z+(SY-BY) +if spawnonground then +if spawnonship or spawnonfarp or spawnonrunway then +SpawnTemplate.units[UnitID].x=PointVec3.x +SpawnTemplate.units[UnitID].y=PointVec3.z +SpawnTemplate.units[UnitID].alt=PointVec3.y +else +SpawnTemplate.units[UnitID].x=parkingspots[UnitID].x +SpawnTemplate.units[UnitID].y=parkingspots[UnitID].z +SpawnTemplate.units[UnitID].alt=parkingspots[UnitID].y +end +else +SpawnTemplate.units[UnitID].x=TX +SpawnTemplate.units[UnitID].y=TY +SpawnTemplate.units[UnitID].alt=PointVec3.y +end +UnitTemplate.parking=nil +UnitTemplate.parking_id=nil +if parkingindex[UnitID]then +UnitTemplate.parking=parkingindex[UnitID] +end +end +end +SpawnPoint.x=PointVec3.x +SpawnPoint.y=PointVec3.z +SpawnPoint.alt=PointVec3.y +SpawnTemplate.x=PointVec3.x +SpawnTemplate.y=PointVec3.z +SpawnTemplate.uncontrolled=true +local GroupSpawned=self:SpawnWithIndex(SpawnIndex,true) +if Takeoff==GROUP.Takeoff.Air then +for UnitID,UnitSpawned in pairs(GroupSpawned:GetUnits())do +SCHEDULER:New(nil,BASE.CreateEventTakeoff,{GroupSpawned,timer.getTime(),UnitSpawned:GetDCSObject()},5) +end +end +if Takeoff~=SPAWN.Takeoff.Runway and Takeoff~=SPAWN.Takeoff.Air and spawnonairport then +SCHEDULER:New(nil,AIRBASE.CheckOnRunWay,{SpawnAirbase,GroupSpawned,75,true},1.0) +end +end +end +function SPAWN:ParkAtAirbase(SpawnAirbase,TerminalType,Parkingdata) +self:ParkAircraft(SpawnAirbase,TerminalType,Parkingdata,1) +for SpawnIndex=2,self.SpawnMaxGroups do +self:ParkAircraft(SpawnAirbase,TerminalType,Parkingdata,SpawnIndex) +end +self:SetSpawnIndex(0) +return nil +end +function SPAWN:SpawnFromVec3(Vec3,SpawnIndex) +local PointVec3=COORDINATE:NewFromVec3(Vec3) +if SpawnIndex then +else +SpawnIndex=self.SpawnIndex+1 +end +if self:_GetSpawnIndex(SpawnIndex)then +local SpawnTemplate=self.SpawnGroups[self.SpawnIndex].SpawnTemplate +if SpawnTemplate then +local TemplateHeight=SpawnTemplate.route and SpawnTemplate.route.points[1].alt or nil +SpawnTemplate.route=SpawnTemplate.route or{} +SpawnTemplate.route.points=SpawnTemplate.route.points or{} +SpawnTemplate.route.points[1]=SpawnTemplate.route.points[1]or{} +SpawnTemplate.route.points[1].x=SpawnTemplate.route.points[1].x or 0 +SpawnTemplate.route.points[1].y=SpawnTemplate.route.points[1].y or 0 +for UnitID=1,#SpawnTemplate.units do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x or 0 +local SY=UnitTemplate.y or 0 +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=Vec3.x+(SX-BX) +local TY=Vec3.z+(SY-BY) +SpawnTemplate.units[UnitID].x=TX +SpawnTemplate.units[UnitID].y=TY +if SpawnTemplate.CategoryID~=Group.Category.SHIP then +SpawnTemplate.units[UnitID].alt=Vec3.y or TemplateHeight +end +end +SpawnTemplate.route.points[1].x=Vec3.x +SpawnTemplate.route.points[1].y=Vec3.z +if SpawnTemplate.CategoryID~=Group.Category.SHIP then +SpawnTemplate.route.points[1].alt=Vec3.y or TemplateHeight +end +SpawnTemplate.x=Vec3.x +SpawnTemplate.y=Vec3.z +SpawnTemplate.alt=Vec3.y or TemplateHeight +return self:SpawnWithIndex(self.SpawnIndex) +end +end +return nil +end +function SPAWN:SpawnFromCoordinate(Coordinate,SpawnIndex) +return self:SpawnFromVec3(Coordinate:GetVec3(),SpawnIndex) +end +function SPAWN:SpawnFromPointVec3(PointVec3,SpawnIndex) +return self:SpawnFromVec3(PointVec3:GetVec3(),SpawnIndex) +end +function SPAWN:SpawnFromVec2(Vec2,MinHeight,MaxHeight,SpawnIndex) +local Height=nil +if MinHeight and MaxHeight then +Height=math.random(MinHeight,MaxHeight) +end +return self:SpawnFromVec3({x=Vec2.x,y=Height,z=Vec2.y},SpawnIndex) +end +function SPAWN:SpawnFromPointVec2(PointVec2,MinHeight,MaxHeight,SpawnIndex) +return self:SpawnFromVec2(PointVec2:GetVec2(),MinHeight,MaxHeight,SpawnIndex) +end +function SPAWN:SpawnFromUnit(HostUnit,MinHeight,MaxHeight,SpawnIndex) +if HostUnit and HostUnit:IsAlive()~=nil then +return self:SpawnFromVec2(HostUnit:GetVec2(),MinHeight,MaxHeight,SpawnIndex) +end +return nil +end +function SPAWN:SpawnFromStatic(HostStatic,MinHeight,MaxHeight,SpawnIndex) +if HostStatic and HostStatic:IsAlive()then +return self:SpawnFromVec2(HostStatic:GetVec2(),MinHeight,MaxHeight,SpawnIndex) +end +return nil +end +function SPAWN:SpawnInZone(Zone,RandomizeGroup,MinHeight,MaxHeight,SpawnIndex) +if Zone then +if RandomizeGroup then +return self:SpawnFromVec2(Zone:GetRandomVec2(),MinHeight,MaxHeight,SpawnIndex) +else +return self:SpawnFromVec2(Zone:GetVec2(),MinHeight,MaxHeight,SpawnIndex) +end +end +return nil +end +function SPAWN:InitUnControlled(UnControlled) +self:F2({self.SpawnTemplatePrefix,UnControlled}) +self.SpawnUnControlled=(UnControlled==true)and true or nil +for SpawnGroupID=1,self.SpawnMaxGroups do +self.SpawnGroups[SpawnGroupID].UnControlled=self.SpawnUnControlled +end +return self +end +function SPAWN:GetCoordinate() +local LateGroup=GROUP:FindByName(self.SpawnTemplatePrefix) +if LateGroup then +return LateGroup:GetCoordinate() +end +return nil +end +function SPAWN:SpawnGroupName(SpawnIndex) +local SpawnPrefix=self.SpawnTemplatePrefix +if self.SpawnAliasPrefix then +SpawnPrefix=self.SpawnAliasPrefix +end +if SpawnIndex then +local SpawnName=string.format('%s#%03d',SpawnPrefix,SpawnIndex) +return SpawnName +else +return SpawnPrefix +end +end +function SPAWN:GetFirstAliveGroup() +for SpawnIndex=1,self.SpawnCount do +local SpawnGroup=self:GetGroupFromIndex(SpawnIndex) +if SpawnGroup and SpawnGroup:IsAlive()then +return SpawnGroup,SpawnIndex +end +end +return nil,nil +end +function SPAWN:GetNextAliveGroup(SpawnIndexStart) +SpawnIndexStart=SpawnIndexStart+1 +for SpawnIndex=SpawnIndexStart,self.SpawnCount do +local SpawnGroup=self:GetGroupFromIndex(SpawnIndex) +if SpawnGroup and SpawnGroup:IsAlive()then +return SpawnGroup,SpawnIndex +end +end +return nil,nil +end +function SPAWN:GetLastAliveGroup() +for SpawnIndex=self.SpawnCount,1,-1 do +local SpawnGroup=self:GetGroupFromIndex(SpawnIndex) +if SpawnGroup and SpawnGroup:IsAlive()then +self.SpawnIndex=SpawnIndex +return SpawnGroup +end +end +self.SpawnIndex=nil +return nil +end +function SPAWN:GetGroupFromIndex(SpawnIndex) +if not SpawnIndex then +SpawnIndex=1 +end +if self.SpawnGroups and self.SpawnGroups[SpawnIndex]then +local SpawnGroup=self.SpawnGroups[SpawnIndex].Group +return SpawnGroup +else +return nil +end +end +function SPAWN:_GetPrefixFromGroup(SpawnGroup) +local GroupName=SpawnGroup:GetName() +if GroupName then +local SpawnPrefix=self:_GetPrefixFromGroupName(GroupName) +return SpawnPrefix +end +return nil +end +function SPAWN:_GetPrefixFromGroupName(SpawnGroupName) +if SpawnGroupName then +local SpawnPrefix=string.match(SpawnGroupName,".*#") +if SpawnPrefix then +SpawnPrefix=SpawnPrefix:sub(1,-2) +end +return SpawnPrefix +end +return nil +end +function SPAWN:GetSpawnIndexFromGroup(SpawnGroup) +local IndexString=string.match(SpawnGroup:GetName(),"#(%d*)$"):sub(2) +local Index=tonumber(IndexString) +self:T3(IndexString,Index) +return Index +end +function SPAWN:_GetLastIndex() +return self.SpawnMaxGroups +end +function SPAWN:_InitializeSpawnGroups(SpawnIndex) +if not self.SpawnGroups[SpawnIndex]then +self.SpawnGroups[SpawnIndex]={} +self.SpawnGroups[SpawnIndex].Visible=false +self.SpawnGroups[SpawnIndex].Spawned=false +self.SpawnGroups[SpawnIndex].UnControlled=false +self.SpawnGroups[SpawnIndex].SpawnTime=0 +self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix=self.SpawnTemplatePrefix +self.SpawnGroups[SpawnIndex].SpawnTemplate=self:_Prepare(self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix,SpawnIndex) +end +self:_RandomizeTemplate(SpawnIndex) +self:_RandomizeRoute(SpawnIndex) +return self.SpawnGroups[SpawnIndex] +end +function SPAWN:_GetGroupCategoryID(SpawnPrefix) +local TemplateGroup=Group.getByName(SpawnPrefix) +if TemplateGroup then +return TemplateGroup:getCategory() +else +return nil +end +end +function SPAWN:_GetGroupCoalitionID(SpawnPrefix) +local TemplateGroup=Group.getByName(SpawnPrefix) +if TemplateGroup then +return TemplateGroup:getCoalition() +else +return nil +end +end +function SPAWN:_GetGroupCountryID(SpawnPrefix) +local TemplateGroup=Group.getByName(SpawnPrefix) +if TemplateGroup then +local TemplateUnits=TemplateGroup:getUnits() +return TemplateUnits[1]:getCountry() +else +return nil +end +end +function SPAWN:_GetTemplate(SpawnTemplatePrefix) +local SpawnTemplate=nil +if _DATABASE.Templates.Groups[SpawnTemplatePrefix]==nil then +error('No Template exists for SpawnTemplatePrefix = '..SpawnTemplatePrefix) +end +local Template=_DATABASE.Templates.Groups[SpawnTemplatePrefix].Template +SpawnTemplate=UTILS.DeepCopy(_DATABASE.Templates.Groups[SpawnTemplatePrefix].Template) +if SpawnTemplate==nil then +error('No Template returned for SpawnTemplatePrefix = '..SpawnTemplatePrefix) +end +self:T3({SpawnTemplate}) +return SpawnTemplate +end +function SPAWN:_Prepare(SpawnTemplatePrefix,SpawnIndex) +local SpawnTemplate +if self.TweakedTemplate~=nil and self.TweakedTemplate==true then +BASE:I("WARNING: You are using a tweaked template.") +SpawnTemplate=self.SpawnTemplate +if self.MooseNameing==true then +SpawnTemplate.name=self:SpawnGroupName(SpawnIndex) +else +SpawnTemplate.name=self:SpawnGroupName() +end +else +SpawnTemplate=self:_GetTemplate(SpawnTemplatePrefix) +SpawnTemplate.name=self:SpawnGroupName(SpawnIndex) +end +SpawnTemplate.groupId=nil +SpawnTemplate.lateActivation=self.LateActivated or false +if SpawnTemplate.CategoryID==Group.Category.GROUND then +self:T3("For ground units, visible needs to be false...") +SpawnTemplate.visible=false +end +if self.SpawnGrouping then +local UnitAmount=#SpawnTemplate.units +if UnitAmount>self.SpawnGrouping then +for UnitID=self.SpawnGrouping+1,UnitAmount do +SpawnTemplate.units[UnitID]=nil +end +else +if UnitAmount<self.SpawnGrouping then +for UnitID=UnitAmount+1,self.SpawnGrouping do +SpawnTemplate.units[UnitID]=UTILS.DeepCopy(SpawnTemplate.units[1]) +SpawnTemplate.units[UnitID].unitId=nil +end +end +end +end +if self.SpawnInitKeepUnitNames==false then +for UnitID=1,#SpawnTemplate.units do +if not string.find(SpawnTemplate.units[UnitID].name,"#IFF_",1,true)then +SpawnTemplate.units[UnitID].name=string.format(SpawnTemplate.name..'-%02d',UnitID) +end +SpawnTemplate.units[UnitID].unitId=nil +end +else +for UnitID=1,#SpawnTemplate.units do +local SpawnInitKeepUnitIFF=false +if string.find(SpawnTemplate.units[UnitID].name,"#IFF_",1,true)then +SpawnInitKeepUnitIFF=true +end +local UnitPrefix,Rest +if SpawnInitKeepUnitIFF==false then +UnitPrefix,Rest=string.match(SpawnTemplate.units[UnitID].name,"^([^#]+)#?"):gsub("^%s*(.-)%s*$","%1") +SpawnTemplate.units[UnitID].name=string.format('%s#%03d-%02d',UnitPrefix,SpawnIndex,UnitID) +end +SpawnTemplate.units[UnitID].unitId=nil +end +end +if self.SpawnRandomCallsign and SpawnTemplate.units[1].callsign then +if type(SpawnTemplate.units[1].callsign)~="number"then +local min=1 +local max=8 +local ctable=CALLSIGN.Aircraft +if string.find(SpawnTemplate.units[1].type,"A-10",1,true)then +max=12 +end +if string.find(SpawnTemplate.units[1].type,"18",1,true)then +min=9 +max=20 +ctable=CALLSIGN.F18 +end +if string.find(SpawnTemplate.units[1].type,"16",1,true)then +min=9 +max=20 +ctable=CALLSIGN.F16 +end +if SpawnTemplate.units[1].type=="F-15E"then +min=9 +max=18 +ctable=CALLSIGN.F15E +end +local callsignnr=math.random(min,max) +local callsignname="Enfield" +for name,value in pairs(ctable)do +if value==callsignnr then +callsignname=name +end +end +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].callsign[1]=callsignnr +SpawnTemplate.units[UnitID].callsign[2]=UnitID +SpawnTemplate.units[UnitID].callsign[3]="1" +SpawnTemplate.units[UnitID].callsign["name"]=tostring(callsignname)..tostring(UnitID).."1" +end +else +for UnitID=1,#SpawnTemplate.units do +SpawnTemplate.units[UnitID].callsign=math.random(1,999) +end +end +end +if self.SpawnInitCallSign then +for UnitID=1,#SpawnTemplate.units do +local Callsign=SpawnTemplate.units[UnitID].callsign +if Callsign and type(Callsign)~="number"then +SpawnTemplate.units[UnitID].callsign[1]=self.SpawnInitCallSignID +SpawnTemplate.units[UnitID].callsign[2]=self.SpawnInitCallSignMinor +SpawnTemplate.units[UnitID].callsign[3]=self.SpawnInitCallSignMajor +SpawnTemplate.units[UnitID].callsign["name"]=string.format("%s%d%d",self.SpawnInitCallSignName,self.SpawnInitCallSignMinor,self.SpawnInitCallSignMajor) +end +end +end +for UnitID=1,#SpawnTemplate.units do +local Callsign=SpawnTemplate.units[UnitID].callsign +if Callsign then +if type(Callsign)~="number"and not self.SpawnInitCallSign then +Callsign[2]=((SpawnIndex-1)%10)+1 +local CallsignName=SpawnTemplate.units[UnitID].callsign["name"] +CallsignName=string.match(CallsignName,"^(%a+)") +local CallsignLen=CallsignName:len() +SpawnTemplate.units[UnitID].callsign[2]=UnitID +SpawnTemplate.units[UnitID].callsign["name"]=CallsignName:sub(1,CallsignLen)..SpawnTemplate.units[UnitID].callsign[2]..SpawnTemplate.units[UnitID].callsign[3] +elseif type(Callsign)=="number"then +SpawnTemplate.units[UnitID].callsign=Callsign+SpawnIndex +end +end +if self.InitSpeed then +SpawnTemplate.units[UnitID].speed=self.InitSpeed +end +local AddProps=SpawnTemplate.units[UnitID].AddPropAircraft +if AddProps then +if SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16 then +if self.SpawnInitSTN then +local octal=self.SpawnInitSTN +if UnitID>1 then +octal=_DATABASE:GetNextSTN(self.SpawnInitSTN,SpawnTemplate.units[UnitID].name) +end +SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16=string.format("%05d",octal) +else +if tonumber(SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16)~=nil then +local octal=SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16 +local num=UTILS.OctalToDecimal(octal) +if _DATABASE.STNS[num]~=nil or UnitID>1 then +octal=_DATABASE:GetNextSTN(octal,SpawnTemplate.units[UnitID].name) +end +SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16=string.format("%05d",octal) +else +local OSTN=_DATABASE:GetNextSTN(1,SpawnTemplate.units[UnitID].name) +SpawnTemplate.units[UnitID].AddPropAircraft.STN_L16=string.format("%05d",OSTN) +end +end +end +if SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN then +if self.SpawnInitSADL then +local octal=self.SpawnInitSADL +if UnitID>1 then +octal=_DATABASE:GetNextSADL(self.SpawnInitSADL,SpawnTemplate.units[UnitID].name) +end +SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN=string.format("%04d",octal) +else +if tonumber(SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN)~=nil then +local octal=SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN +local num=UTILS.OctalToDecimal(octal) +self.SpawnInitSADL=num +if _DATABASE.SADL[num]~=nil or UnitID>1 then +octal=_DATABASE:GetNextSADL(self.SpawnInitSADL,SpawnTemplate.units[UnitID].name) +end +SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN=string.format("%04d",octal) +else +local OSTN=_DATABASE:GetNextSADL(1,SpawnTemplate.units[UnitID].name) +SpawnTemplate.units[UnitID].AddPropAircraft.SADL_TN=string.format("%04d",OSTN) +end +end +end +if SpawnTemplate.units[UnitID].AddPropAircraft.VoiceCallsignNumber and type(Callsign)~="number"then +SpawnTemplate.units[UnitID].AddPropAircraft.VoiceCallsignNumber=SpawnTemplate.units[UnitID].callsign[2]..SpawnTemplate.units[UnitID].callsign[3] +end +if SpawnTemplate.units[UnitID].AddPropAircraft.VoiceCallsignLabel and type(Callsign)~="number"then +local CallsignName=SpawnTemplate.units[UnitID].callsign["name"] +CallsignName=string.match(CallsignName,"^(%a+)") +local label="NY" +if not string.find(CallsignName," ")then +label=string.upper(string.match(CallsignName,"^%a")..string.match(CallsignName,"%a$")) +end +SpawnTemplate.units[UnitID].AddPropAircraft.VoiceCallsignLabel=label +end +if SpawnTemplate.units[UnitID].datalinks and SpawnTemplate.units[UnitID].datalinks.Link16 and SpawnTemplate.units[UnitID].datalinks.Link16.settings then +SpawnTemplate.units[UnitID].datalinks.Link16.settings.flightLead=UnitID==1 and true or false +end +if SpawnTemplate.units[UnitID].datalinks and SpawnTemplate.units[UnitID].datalinks.SADL and SpawnTemplate.units[UnitID].datalinks.SADL.settings then +SpawnTemplate.units[UnitID].datalinks.SADL.settings.flightLead=UnitID==1 and true or false +end +end +end +for UnitID=1,#SpawnTemplate.units do +if SpawnTemplate.units[UnitID].datalinks and SpawnTemplate.units[UnitID].datalinks.Link16 and SpawnTemplate.units[UnitID].datalinks.Link16.network then +local team={} +local isF16=string.find(SpawnTemplate.units[UnitID].type,"F-16",1,true)and true or false +for ID=1,#SpawnTemplate.units do +local member={} +member.missionUnitId=ID +if isF16 then +member.TDOA=true +end +table.insert(team,member) +end +SpawnTemplate.units[UnitID].datalinks.Link16.network.teamMembers=team +end +end +self:T3({"Template:",SpawnTemplate}) +return SpawnTemplate +end +function SPAWN:_RandomizeRoute(SpawnIndex) +if self.SpawnRandomizeRoute then +local SpawnTemplate=self.SpawnGroups[SpawnIndex].SpawnTemplate +local RouteCount=#SpawnTemplate.route.points +for t=self.SpawnRandomizeRouteStartPoint+1,(RouteCount-self.SpawnRandomizeRouteEndPoint)do +SpawnTemplate.route.points[t].x=SpawnTemplate.route.points[t].x+math.random(self.SpawnRandomizeRouteRadius*-1,self.SpawnRandomizeRouteRadius) +SpawnTemplate.route.points[t].y=SpawnTemplate.route.points[t].y+math.random(self.SpawnRandomizeRouteRadius*-1,self.SpawnRandomizeRouteRadius) +if SpawnTemplate.CategoryID==Group.Category.AIRPLANE or SpawnTemplate.CategoryID==Group.Category.HELICOPTER then +if SpawnTemplate.route.points[t].alt and self.SpawnRandomizeRouteHeight then +SpawnTemplate.route.points[t].alt=SpawnTemplate.route.points[t].alt+math.random(1,self.SpawnRandomizeRouteHeight) +end +else +SpawnTemplate.route.points[t].alt=nil +end +end +end +self:_RandomizeZones(SpawnIndex) +return self +end +function SPAWN:_RandomizeTemplate(SpawnIndex) +if self.SpawnRandomizeTemplate then +self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix=self.SpawnTemplatePrefixTable[math.random(1,#self.SpawnTemplatePrefixTable)] +self.SpawnGroups[SpawnIndex].SpawnTemplate=self:_Prepare(self.SpawnGroups[SpawnIndex].SpawnTemplatePrefix,SpawnIndex) +self.SpawnGroups[SpawnIndex].SpawnTemplate.route=UTILS.DeepCopy(self.SpawnTemplate.route) +self.SpawnGroups[SpawnIndex].SpawnTemplate.x=self.SpawnTemplate.x +self.SpawnGroups[SpawnIndex].SpawnTemplate.y=self.SpawnTemplate.y +self.SpawnGroups[SpawnIndex].SpawnTemplate.start_time=self.SpawnTemplate.start_time +local OldX=self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].x +local OldY=self.SpawnGroups[SpawnIndex].SpawnTemplate.units[1].y +for UnitID=1,#self.SpawnGroups[SpawnIndex].SpawnTemplate.units do +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].heading=self.SpawnTemplate.units[1].heading +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x=self.SpawnTemplate.units[1].x+(self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].x-OldX) +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y=self.SpawnTemplate.units[1].y+(self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].y-OldY) +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[UnitID].alt=self.SpawnTemplate.units[1].alt +end +end +self:_RandomizeRoute(SpawnIndex) +return self +end +function SPAWN:_SetInitialPosition(SpawnIndex) +if self.SpawnFromNewPosition then +local SpawnVec2=self.SpawnInitPosition +local SpawnTemplate=self.SpawnGroups[SpawnIndex].SpawnTemplate +SpawnTemplate.route=SpawnTemplate.route or{} +SpawnTemplate.route.points=SpawnTemplate.route.points or{} +SpawnTemplate.route.points[1]=SpawnTemplate.route.points[1]or{} +SpawnTemplate.route.points[1].x=SpawnTemplate.route.points[1].x or 0 +SpawnTemplate.route.points[1].y=SpawnTemplate.route.points[1].y or 0 +for UnitID=1,#SpawnTemplate.units do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x +local SY=UnitTemplate.y +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=SpawnVec2.x+(SX-BX) +local TY=SpawnVec2.y+(SY-BY) +UnitTemplate.x=TX +UnitTemplate.y=TY +end +SpawnTemplate.route.points[1].x=SpawnVec2.x +SpawnTemplate.route.points[1].y=SpawnVec2.y +SpawnTemplate.x=SpawnVec2.x +SpawnTemplate.y=SpawnVec2.y +end +return self +end +function SPAWN:_RandomizeZones(SpawnIndex,RandomizePositionInZone) +if self.SpawnRandomizeZones then +local SpawnZone=nil +while not SpawnZone do +local ZoneID=math.random(#self.SpawnZoneTable) +SpawnZone=self.SpawnZoneTable[ZoneID]:GetZoneMaybe() +end +local SpawnVec2=SpawnZone:GetVec2() +if RandomizePositionInZone~=false then +SpawnVec2=SpawnZone:GetRandomVec2() +end +local SpawnTemplate=self.SpawnGroups[SpawnIndex].SpawnTemplate +self.SpawnGroups[SpawnIndex].SpawnZone=SpawnZone +for UnitID=1,#SpawnTemplate.units do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x +local SY=UnitTemplate.y +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=SpawnVec2.x+(SX-BX) +local TY=SpawnVec2.y+(SY-BY) +UnitTemplate.x=TX +UnitTemplate.y=TY +end +SpawnTemplate.x=SpawnVec2.x +SpawnTemplate.y=SpawnVec2.y +SpawnTemplate.route.points[1].x=SpawnVec2.x +SpawnTemplate.route.points[1].y=SpawnVec2.y +end +return self +end +function SPAWN:_TranslateRotate(SpawnIndex,SpawnRootX,SpawnRootY,SpawnX,SpawnY,SpawnAngle) +local TranslatedX=SpawnX +local TranslatedY=SpawnY +local RotatedX=-TranslatedX*math.cos(math.rad(SpawnAngle))+TranslatedY*math.sin(math.rad(SpawnAngle)) +local RotatedY=TranslatedX*math.sin(math.rad(SpawnAngle))+TranslatedY*math.cos(math.rad(SpawnAngle)) +self.SpawnGroups[SpawnIndex].SpawnTemplate.x=SpawnRootX-RotatedX +self.SpawnGroups[SpawnIndex].SpawnTemplate.y=SpawnRootY+RotatedY +local SpawnUnitCount=table.getn(self.SpawnGroups[SpawnIndex].SpawnTemplate.units) +for u=1,SpawnUnitCount do +local TranslatedX=SpawnX +local TranslatedY=SpawnY-10*(u-1) +local RotatedX=-TranslatedX*math.cos(math.rad(SpawnAngle))+TranslatedY*math.sin(math.rad(SpawnAngle)) +local RotatedY=TranslatedX*math.sin(math.rad(SpawnAngle))+TranslatedY*math.cos(math.rad(SpawnAngle)) +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].x=SpawnRootX-RotatedX +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].y=SpawnRootY+RotatedY +self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading=self.SpawnGroups[SpawnIndex].SpawnTemplate.units[u].heading+math.rad(SpawnAngle) +end +return self +end +function SPAWN:_GetSpawnIndex(SpawnIndex) +if(self.SpawnMaxGroups==0)or(SpawnIndex<=self.SpawnMaxGroups)then +if(self.SpawnMaxUnitsAlive==0)or(self.AliveUnits+#self.SpawnTemplate.units<=self.SpawnMaxUnitsAlive)or self.UnControlled==true then +if SpawnIndex and SpawnIndex>=self.SpawnCount+1 then +self.SpawnCount=self.SpawnCount+1 +SpawnIndex=self.SpawnCount +end +self.SpawnIndex=SpawnIndex +if not self.SpawnGroups[self.SpawnIndex]then +self:_InitializeSpawnGroups(self.SpawnIndex) +end +else +return nil +end +else +return nil +end +return self.SpawnIndex +end +function SPAWN:_OnBirth(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.SpawnTemplatePrefix or(self.SpawnAliasPrefix and EventPrefix==self.SpawnAliasPrefix)then +self.AliveUnits=self.AliveUnits+1 +end +end +end +end +function SPAWN:_CountAliveUnits() +local count=0 +if self.SpawnAliasPrefix then +if not self.SpawnAliasPrefixEscaped then self.SpawnAliasPrefixEscaped=string.gsub(self.SpawnAliasPrefix,"[%p%s]",".")end +local SpawnAliasPrefix=self.SpawnAliasPrefixEscaped +local agroups=GROUP:FindAllByMatching(SpawnAliasPrefix) +for _,_grp in pairs(agroups)do +local game=self:_GetPrefixFromGroupName(_grp.GroupName) +if game and game==self.SpawnAliasPrefix then +count=count+_grp:CountAliveUnits() +end +end +else +if not self.SpawnTemplatePrefixEscaped then self.SpawnTemplatePrefixEscaped=string.gsub(self.SpawnTemplatePrefix,"[%p%s]",".")end +local SpawnTemplatePrefix=self.SpawnTemplatePrefixEscaped +local groups=GROUP:FindAllByMatching(SpawnTemplatePrefix) +for _,_grp in pairs(groups)do +local game=self:_GetPrefixFromGroupName(_grp.GroupName) +if game and game==self.SpawnTemplatePrefix then +count=count+_grp:CountAliveUnits() +end +end +end +self.AliveUnits=count +return self +end +function SPAWN:_OnDeadOrCrash(EventData) +local unit=UNIT:FindByName(EventData.IniUnitName) +if unit then +local EventPrefix=self:_GetPrefixFromGroupName(unit.GroupName) +if EventPrefix then +if EventPrefix==self.SpawnTemplatePrefix or(self.SpawnAliasPrefix and EventPrefix==self.SpawnAliasPrefix)and self.AliveUnits>0 then +self:ScheduleOnce(1,self._CountAliveUnits,self) +end +end +end +end +function SPAWN:_OnTakeOff(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.SpawnTemplatePrefix or(self.SpawnAliasPrefix and EventPrefix==self.SpawnAliasPrefix)then +SpawnGroup:SetState(SpawnGroup,"Spawn_Landed",false) +end +end +end +end +function SPAWN:_OnLand(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.SpawnTemplatePrefix or(self.SpawnAliasPrefix and EventPrefix==self.SpawnAliasPrefix)then +SpawnGroup:SetState(SpawnGroup,"Spawn_Landed",true) +if self.RepeatOnLanding then +local SpawnGroupIndex=self:GetSpawnIndexFromGroup(SpawnGroup) +SCHEDULER:New(nil,self.ReSpawn,{self,SpawnGroupIndex},self.RepeatOnLandingTime or 3) +end +end +end +end +end +function SPAWN:_OnEngineShutDown(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.SpawnTemplatePrefix or(self.SpawnAliasPrefix and EventPrefix==self.SpawnAliasPrefix)then +local Landed=SpawnGroup:GetState(SpawnGroup,"Spawn_Landed") +if Landed and self.RepeatOnEngineShutDown then +local SpawnGroupIndex=self:GetSpawnIndexFromGroup(SpawnGroup) +SCHEDULER:New(nil,self.ReSpawn,{self,SpawnGroupIndex},3) +end +end +end +end +end +function SPAWN:_Scheduler() +self:F2({"_Scheduler",self.SpawnTemplatePrefix,self.SpawnAliasPrefix,self.SpawnIndex,self.SpawnMaxGroups,self.SpawnMaxUnitsAlive}) +self:Spawn() +return true +end +function SPAWN:_SpawnCleanUpScheduler() +local SpawnGroup,SpawnCursor=self:GetFirstAliveGroup() +local IsHelo=false +while SpawnGroup do +IsHelo=SpawnGroup:IsHelicopter() +local SpawnUnits=SpawnGroup:GetUnits() +for UnitID,UnitData in pairs(SpawnUnits)do +local SpawnUnit=UnitData +local SpawnUnitName=SpawnUnit:GetName() +self.SpawnCleanUpTimeStamps[SpawnUnitName]=self.SpawnCleanUpTimeStamps[SpawnUnitName]or{} +local Stamp=self.SpawnCleanUpTimeStamps[SpawnUnitName] +if Stamp.Vec2 then +if(SpawnUnit:InAir()==false and SpawnUnit:GetVelocityKMH()<1)or IsHelo then +local NewVec2=SpawnUnit:GetVec2()or{x=0,y=0} +if(Stamp.Vec2.x==NewVec2.x and Stamp.Vec2.y==NewVec2.y)or(SpawnUnit:GetLife()<=1)then +if Stamp.Time+self.SpawnCleanUpInterval<timer.getTime()then +SCHEDULER:New(nil,self.ReSpawn,{self,SpawnCursor},3) +Stamp.Vec2=nil +Stamp.Time=nil +end +else +Stamp.Time=timer.getTime() +Stamp.Vec2=SpawnUnit:GetVec2() +end +else +Stamp.Vec2=nil +Stamp.Time=nil +end +else +if SpawnUnit:InAir()==false or(IsHelo and SpawnUnit:GetLife()<=1)then +Stamp.Vec2=SpawnUnit:GetVec2()or{x=0,y=0} +if(SpawnUnit:GetVelocityKMH()<1)then +Stamp.Time=timer.getTime() +end +else +Stamp.Time=nil +Stamp.Vec2=nil +end +end +end +SpawnGroup,SpawnCursor=self:GetNextAliveGroup(SpawnCursor) +end +return true +end +SPAWNSTATIC={ +ClassName="SPAWNSTATIC", +SpawnIndex=0, +} +function SPAWNSTATIC:NewFromStatic(SpawnTemplateName,SpawnCountryID) +local self=BASE:Inherit(self,BASE:New()) +local TemplateStatic,CoalitionID,CategoryID,CountryID=_DATABASE:GetStaticGroupTemplate(SpawnTemplateName) +if TemplateStatic then +self.SpawnTemplatePrefix=SpawnTemplateName +self.TemplateStaticUnit=UTILS.DeepCopy(TemplateStatic.units[1]) +self.CountryID=SpawnCountryID or CountryID +self.CategoryID=CategoryID +self.CoalitionID=CoalitionID +self.SpawnIndex=0 +self.StaticCopyFrom=SpawnTemplateName +else +error("SPAWNSTATIC:New: There is no static declared in the mission editor with SpawnTemplatePrefix = '"..tostring(SpawnTemplateName).."'") +end +self:SetEventPriority(5) +return self +end +function SPAWNSTATIC:NewFromTemplate(SpawnTemplate,CountryID) +local self=BASE:Inherit(self,BASE:New()) +self.TemplateStaticUnit=UTILS.DeepCopy(SpawnTemplate) +self.SpawnTemplatePrefix=SpawnTemplate.name +self.CountryID=CountryID or country.id.USA +return self +end +function SPAWNSTATIC:NewFromType(StaticType,StaticCategory,CountryID) +local self=BASE:Inherit(self,BASE:New()) +self.InitStaticType=StaticType +self.InitStaticCategory=StaticCategory +self.CountryID=CountryID or country.id.USA +self.SpawnTemplatePrefix=self.InitStaticType +self.TemplateStaticUnit={} +self.InitStaticCoordinate=COORDINATE:New(0,0,0) +self.InitStaticHeading=0 +return self +end +function SPAWNSTATIC:_InitResourceTable(CombinedWeight) +if not self.TemplateStaticUnit.resourcePayload then +self.TemplateStaticUnit.resourcePayload={ +["weapons"]={}, +["aircrafts"]={}, +["gasoline"]=0, +["diesel"]=0, +["methanol_mixture"]=0, +["jet_fuel"]=0, +} +end +self:InitCargo(true) +self:InitCargoMass(CombinedWeight or 1) +return self +end +function SPAWNSTATIC:AddCargoResource(Type,Name,Amount,CombinedWeight) +if not self.TemplateStaticUnit.resourcePayload then +self:_InitResourceTable(CombinedWeight) +end +if Type==STORAGE.Type.LIQUIDS and type(Name)=="string"then +self.TemplateStaticUnit.resourcePayload[Name]=Amount +else +self.TemplateStaticUnit.resourcePayload[Type]={ +[Name]={ +["amount"]=Amount, +} +} +end +UTILS.PrintTableToLog(self.TemplateStaticUnit) +return self +end +function SPAWNSTATIC:ResetCargoResources() +self.TemplateStaticUnit.resourcePayload=nil +self:_InitResourceTable() +return self +end +function SPAWNSTATIC:InitCoordinate(Coordinate) +self.InitStaticCoordinate=Coordinate +return self +end +function SPAWNSTATIC:InitHeading(Heading) +self.InitStaticHeading=Heading +return self +end +function SPAWNSTATIC:InitLivery(LiveryName) +self.InitStaticLivery=LiveryName +return self +end +function SPAWNSTATIC:InitType(StaticType) +self.InitStaticType=StaticType +return self +end +function SPAWNSTATIC:InitShape(StaticShape) +self.InitStaticShape=StaticShape +return self +end +function SPAWNSTATIC:InitFARP(CallsignID,Frequency,Modulation,DynamicSpawns,DynamicHotStarts) +self.InitFarp=true +self.InitFarpCallsignID=CallsignID or 1 +self.InitFarpFreq=Frequency or 127.5 +self.InitFarpModu=Modulation or 0 +self.InitFarpDynamicSpawns=DynamicSpawns +self.InitFarpDynamicHotStarts=(DynamicSpawns==true and DynamicHotStarts==true)and true or nil +return self +end +function SPAWNSTATIC:InitCargoMass(Mass) +self.InitStaticCargoMass=Mass +return self +end +function SPAWNSTATIC:InitCargo(IsCargo) +self.InitStaticCargo=IsCargo +return self +end +function SPAWNSTATIC:InitDead(IsDead) +self.InitStaticDead=IsDead +return self +end +function SPAWNSTATIC:InitCountry(CountryID) +self.CountryID=CountryID +return self +end +function SPAWNSTATIC:InitNamePrefix(NamePrefix) +self.SpawnTemplatePrefix=NamePrefix +return self +end +function SPAWNSTATIC:InitLinkToUnit(Unit,OffsetX,OffsetY,OffsetAngle) +self.InitLinkUnit=Unit +self.InitOffsetX=OffsetX or 0 +self.InitOffsetY=OffsetY or 0 +self.InitOffsetAngle=OffsetAngle or 0 +return self +end +function SPAWNSTATIC:InitValidateAndRepositionStatic(OnOff,MaxRadius) +self.ValidateAndRepositionStatic=OnOff +self.ValidateAndRepositionStaticMaxRadius=MaxRadius +return self +end +function SPAWNSTATIC:OnSpawnStatic(SpawnCallBackFunction,...) +self:F("OnSpawnStatic") +self.SpawnFunctionHook=SpawnCallBackFunction +self.SpawnFunctionArguments={} +if arg then +self.SpawnFunctionArguments=arg +end +return self +end +function SPAWNSTATIC:Spawn(Heading,NewName) +if Heading then +self.InitStaticHeading=Heading +end +if NewName then +self.InitStaticName=NewName +end +return self:_SpawnStatic(self.TemplateStaticUnit,self.CountryID) +end +function SPAWNSTATIC:SpawnFromPointVec2(PointVec2,Heading,NewName) +local vec2={x=PointVec2:GetX(),y=PointVec2:GetY()} +local Coordinate=COORDINATE:NewFromVec2(vec2) +return self:SpawnFromCoordinate(Coordinate,Heading,NewName) +end +function SPAWNSTATIC:SpawnFromCoordinate(Coordinate,Heading,NewName) +self.InitStaticCoordinate=Coordinate +if Heading then +self.InitStaticHeading=Heading +end +if NewName then +self.InitStaticName=NewName +end +return self:_SpawnStatic(self.TemplateStaticUnit,self.CountryID) +end +function SPAWNSTATIC:SpawnFromZone(Zone,Heading,NewName) +local Static=self:SpawnFromCoordinate(Zone:GetCoordinate(),Heading,NewName) +return Static +end +function SPAWNSTATIC:_SpawnStatic(Template,CountryID) +Template=Template or{} +local CountryID=CountryID or self.CountryID +if self.InitStaticType then +Template.type=self.InitStaticType +end +if self.InitStaticCategory then +Template.category=self.InitStaticCategory +end +if self.InitStaticCoordinate then +Template.x=self.InitStaticCoordinate.x +Template.y=self.InitStaticCoordinate.z +Template.alt=self.InitStaticCoordinate.y +end +if self.InitStaticHeading then +Template.heading=math.rad(self.InitStaticHeading) +end +if self.InitStaticShape then +Template.shape_name=self.InitStaticShape +end +if self.InitStaticLivery then +Template.livery_id=self.InitStaticLivery +end +if self.InitStaticDead~=nil then +Template.dead=self.InitStaticDead +end +if self.InitStaticCargo~=nil then +Template.canCargo=self.InitStaticCargo +end +if self.InitStaticCargoMass~=nil then +Template.mass=self.InitStaticCargoMass +end +if self.InitLinkUnit then +Template.linkUnit=self.InitLinkUnit:GetID() +Template.linkOffset=true +Template.offsets={} +Template.offsets.y=self.InitOffsetY +Template.offsets.x=self.InitOffsetX +Template.offsets.angle=self.InitOffsetAngle and math.rad(self.InitOffsetAngle)or 0 +end +if self.InitFarp then +Template.heliport_callsign_id=self.InitFarpCallsignID +Template.heliport_frequency=self.InitFarpFreq +Template.heliport_modulation=self.InitFarpModu +Template.unitId=nil +end +self.SpawnIndex=self.SpawnIndex+1 +Template.name=self.InitStaticName or string.format("%s#%05d",self.SpawnTemplatePrefix,self.SpawnIndex) +local Static=nil +if self.ValidateAndRepositionStatic then +local validPos=UTILS.ValidateAndRepositionStatic(CountryID,Template.category,Template.type,Template,Template.shape_name,self.ValidateAndRepositionStaticMaxRadius) +if validPos then +Template.x=validPos.x +Template.y=validPos.y +end +end +if self.InitFarp then +local TemplateGroup={} +TemplateGroup.units={} +TemplateGroup.units[1]=Template +TemplateGroup.visible=true +TemplateGroup.hidden=false +TemplateGroup.x=Template.x +TemplateGroup.y=Template.y +TemplateGroup.name=Template.name +if self.InitFarpDynamicSpawns==true then +TemplateGroup.units[1].dynamicSpawn=true +if self.InitFarpDynamicHotStarts==true then +TemplateGroup.units[1].allowHotStart=true +end +end +self:T("Spawning FARP") +self:T({Template=Template}) +self:T({TemplateGroup=TemplateGroup}) +Static=coalition.addGroup(CountryID,-1,TemplateGroup) +local Event={ +id=EVENTS.Birth, +time=timer.getTime(), +initiator=Static +} +world.onEvent(Event) +else +self:T("Spawning Static") +self:T2({Template=Template}) +Static=coalition.addStaticObject(CountryID,Template) +if Static then +self:T(string.format("Succesfully spawned static object \"%s\" ID=%d",Static:getName(),Static:getID())) +else +self:E(string.format("ERROR: DCS static object \"%s\" is nil!",tostring(Template.name))) +end +end +local mystatic=_DATABASE:AddStatic(Template.name) +if self.SpawnFunctionHook then +self:ScheduleOnce(0.3,self.SpawnFunctionHook,mystatic,unpack(self.SpawnFunctionArguments)) +end +if self.StaticCopyFrom~=nil then +mystatic.StaticCopyFrom=self.StaticCopyFrom +end +local TemplateGroup={} +TemplateGroup.units={} +TemplateGroup.units[1]=Template +TemplateGroup.x=Template.x +TemplateGroup.y=Template.y +TemplateGroup.name=Template.name +_DATABASE:_RegisterStaticTemplate(TemplateGroup,self.CoalitionID,self.CategoryID,CountryID) +return mystatic +end +TIMER={ +ClassName="TIMER", +lid=nil, +} +_TIMERID=0 +TIMER.version="0.2.0" +function TIMER:New(Function,...) +local self=BASE:Inherit(self,BASE:New()) +self.func=Function +self.para=arg or{} +self.ncalls=0 +self.isrunning=false +_TIMERID=_TIMERID+1 +self.uid=_TIMERID +self.lid=string.format("TIMER UID=%d | ",self.uid) +return self +end +function TIMER:Start(Tstart,dT,Duration) +local Tnow=timer.getTime() +self.Tstart=Tstart and Tnow+math.max(Tstart,0.001)or Tnow+0.001 +self.dT=dT +if Duration then +self.Tstop=self.Tstart+Duration +end +self.tid=timer.scheduleFunction(self._Function,self,self.Tstart) +self.lid=string.format("TIMER UID=%d/%d | ",self.uid,self.tid) +self.isrunning=true +self:T(self.lid..string.format("Starting Timer in %.3f sec, dT=%s, Tstop=%s",self.Tstart-Tnow,tostring(self.dT),tostring(self.Tstop))) +return self +end +function TIMER:StartIf(Condition,Tstart,dT,Duration) +if Condition then +self:Start(Tstart,dT,Duration) +end +return self +end +function TIMER:Stop(Delay) +if Delay and Delay>0 then +self.Tstop=timer.getTime()+Delay +else +if self.tid then +self:T(self.lid..string.format("Stopping timer by removing timer function after %d calls!",self.ncalls)) +local status=pcall( +function() +timer.removeFunction(self.tid) +end +) +if status then +self:T2(self.lid..string.format("Stopped timer!")) +else +self:E(self.lid..string.format("WARNING: Could not remove timer function! isrunning=%s",tostring(self.isrunning))) +end +self.isrunning=false +end +end +return self +end +function TIMER:SetMaxFunctionCalls(Nmax) +self.ncallsMax=Nmax +return self +end +function TIMER:SetTimeInterval(dT) +self.dT=dT +return self +end +function TIMER:IsRunning() +return self.isrunning +end +function TIMER:_Function(time) +self.func(unpack(self.para)) +self.ncalls=self.ncalls+1 +local Tnext=self.dT and time+self.dT or nil +local stopme=false +if Tnext==nil then +self:T(self.lid..string.format("No next time as dT=nil ==> Stopping timer after %d function calls",self.ncalls)) +stopme=true +elseif self.Tstop and Tnext>self.Tstop then +self:T(self.lid..string.format("Stop time passed %.3f > %.3f ==> Stopping timer after %d function calls",Tnext,self.Tstop,self.ncalls)) +stopme=true +elseif self.ncallsMax and self.ncalls>=self.ncallsMax then +self:T(self.lid..string.format("Max function calls Nmax=%d reached ==> Stopping timer after %d function calls",self.ncallsMax,self.ncalls)) +stopme=true +end +if stopme then +self:Stop() +return nil +else +return Tnext +end +end +do +GOAL={ +ClassName="GOAL", +} +GOAL.Players={} +GOAL.TotalContributions=0 +function GOAL:New() +local self=BASE:Inherit(self,FSM:New()) +self:F({}) +self:SetStartState("Pending") +self:AddTransition("*","Achieved","Achieved") +self:SetEventPriority(5) +return self +end +function GOAL:AddPlayerContribution(PlayerName) +self:F({PlayerName}) +self.Players[PlayerName]=self.Players[PlayerName]or 0 +self.Players[PlayerName]=self.Players[PlayerName]+1 +self.TotalContributions=self.TotalContributions+1 +end +function GOAL:GetPlayerContribution(PlayerName) +return self.Players[PlayerName]or 0 +end +function GOAL:GetPlayerContributions() +return self.Players or{} +end +function GOAL:GetTotalContributions() +return self.TotalContributions or 0 +end +function GOAL:IsAchieved() +return self:Is("Achieved") +end +end +do +SPOT={ +ClassName="SPOT", +} +function SPOT:New(Recce) +local self=BASE:Inherit(self,FSM:New()) +self:F({}) +self:SetStartState("Off") +self:AddTransition("Off","LaseOn","On") +self:AddTransition("Off","LaseOnCoordinate","On") +self:AddTransition("On","Lasing","On") +self:AddTransition({"On","Destroyed"},"LaseOff","Off") +self:AddTransition("*","Destroyed","Destroyed") +self.Recce=Recce +self.RecceName=self.Recce:GetName() +self.LaseScheduler=SCHEDULER:New(self) +self:SetEventPriority(5) +self.Lasing=false +return self +end +function SPOT:onafterLaseOn(From,Event,To,Target,LaserCode,Duration) +self:T({From,Event,To}) +self:T2({"LaseOn",Target,LaserCode,Duration}) +local function StopLase(self) +self:LaseOff() +end +self.Target=Target +self.TargetName=Target:GetName() +self.LaserCode=LaserCode +self.Lasing=true +local RecceDcsUnit=self.Recce:GetDCSObject() +local relativespot=self.relstartpos or{x=0,y=2,z=0} +self.SpotIR=Spot.createInfraRed(RecceDcsUnit,relativespot,Target:GetPointVec3():AddY(1):GetVec3()) +self.SpotLaser=Spot.createLaser(RecceDcsUnit,relativespot,Target:GetPointVec3():AddY(1):GetVec3(),LaserCode) +if Duration then +self.ScheduleID=self.LaseScheduler:Schedule(self,StopLase,{self},Duration) +end +self:HandleEvent(EVENTS.Dead) +self:__Lasing(-1) +return self +end +function SPOT:onafterLaseOnCoordinate(From,Event,To,Coordinate,LaserCode,Duration) +self:T2({"LaseOnCoordinate",Coordinate,LaserCode,Duration}) +local function StopLase(self) +self:LaseOff() +end +self.Target=nil +self.TargetCoord=Coordinate +self.LaserCode=LaserCode +self.Lasing=true +local RecceDcsUnit=self.Recce:GetDCSObject() +self.SpotIR=Spot.createInfraRed(RecceDcsUnit,{x=0,y=1,z=0},Coordinate:GetVec3()) +self.SpotLaser=Spot.createLaser(RecceDcsUnit,{x=0,y=1,z=0},Coordinate:GetVec3(),LaserCode) +if Duration then +self.ScheduleID=self.LaseScheduler:Schedule(self,StopLase,{self},Duration) +end +self:__Lasing(-1) +return self +end +function SPOT:OnEventDead(EventData) +self:T2({Dead=EventData.IniDCSUnitName,Target=self.Target}) +if self.Target then +if EventData.IniDCSUnitName==self.TargetName then +self:F({"Target dead ",self.TargetName}) +self:Destroyed() +self:LaseOff() +end +end +if self.Recce then +if EventData.IniDCSUnitName==self.RecceName then +self:F({"Recce dead ",self.RecceName}) +self:LaseOff() +end +end +return self +end +function SPOT:onafterLasing(From,Event,To) +self:T({From,Event,To}) +if self.Lasing then +if self.Target and self.Target:IsAlive()then +self.SpotIR:setPoint(self.Target:GetPointVec3():AddY(1):AddY(math.random(-100,100)/200):AddX(math.random(-100,100)/200):GetVec3()) +self.SpotLaser:setPoint(self.Target:GetPointVec3():AddY(1):GetVec3()) +self:__Lasing(0.2) +elseif self.TargetCoord then +local irvec3={x=self.TargetCoord.x+math.random(-100,100)/200,y=self.TargetCoord.y+math.random(-100,100)/200,z=self.TargetCoord.z} +local lsvec3={x=self.TargetCoord.x,y=self.TargetCoord.y,z=self.TargetCoord.z} +self.SpotIR:setPoint(irvec3) +self.SpotLaser:setPoint(lsvec3) +self:__Lasing(0.2) +else +self:F({"Target is not alive",self.Target:IsAlive()}) +end +end +return self +end +function SPOT:onafterLaseOff(From,Event,To) +self:T({From,Event,To}) +self:T2({"Stopped lasing for ",self.Target and self.Target:GetName()or"coord",SpotIR=self.SportIR,SpotLaser=self.SpotLaser}) +self.Lasing=false +self.SpotIR:destroy() +self.SpotLaser:destroy() +self.SpotIR=nil +self.SpotLaser=nil +if self.ScheduleID then +self.LaseScheduler:Stop(self.ScheduleID) +end +self.ScheduleID=nil +self.Target=nil +return self +end +function SPOT:IsLasing() +return self.Lasing +end +function SPOT:SetRelativeStartPosition(position) +self.relstartpos=position or{x=0,y=2,z=0} +return self +end +end +MARKEROPS_BASE={ +ClassName="MARKEROPS", +Tag="mytag", +Keywords={}, +version="0.1.4", +debug=false, +Casesensitive=true, +} +function MARKEROPS_BASE:New(Tagname,Keywords,Casesensitive) +local self=BASE:Inherit(self,FSM:New()) +self.lid=string.format("MARKEROPS_BASE %s | ",tostring(self.version)) +self.Tag=Tagname or"mytag" +self.Keywords=Keywords or{} +self.debug=false +self.Casesensitive=true +if Casesensitive and Casesensitive==false then +self.Casesensitive=false +end +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","MarkAdded","*") +self:AddTransition("*","MarkChanged","*") +self:AddTransition("*","MarkDeleted","*") +self:AddTransition("Running","Stop","Stopped") +self:HandleEvent(EVENTS.MarkAdded,self.OnEventMark) +self:HandleEvent(EVENTS.MarkChange,self.OnEventMark) +self:HandleEvent(EVENTS.MarkRemoved,self.OnEventMark) +self:I(self.lid..string.format("started for %s",self.Tag)) +self:__Start(1) +return self +end +function MARKEROPS_BASE:OnEventMark(Event) +self:T({Event}) +if Event==nil or Event.idx==nil then +self:E("Skipping onEvent. Event or Event.idx unknown.") +return true +end +local coalition=Event.MarkCoalition +if Event.id==world.event.S_EVENT_MARK_ADDED then +self:T({event="S_EVENT_MARK_ADDED",carrier=Event.IniGroupName,vec3=Event.pos}) +local Eventtext=tostring(Event.text) +if Eventtext~=nil then +if self:_MatchTag(Eventtext)then +local coord=COORDINATE:NewFromVec3({y=Event.pos.y,x=Event.pos.x,z=Event.pos.z}) +if self.debug then +local coordtext=coord:ToStringLLDDM() +local text=tostring(Event.text) +local m=MESSAGE:New(string.format("Mark added at %s with text: %s",coordtext,text),10,"Info",false):ToAll() +end +local matchtable=self:_MatchKeywords(Eventtext) +self:MarkAdded(Eventtext,matchtable,coord,Event.idx,coalition,Event.PlayerName,Event) +end +end +elseif Event.id==world.event.S_EVENT_MARK_CHANGE then +self:T({event="S_EVENT_MARK_CHANGE",carrier=Event.IniGroupName,vec3=Event.pos}) +local Eventtext=tostring(Event.text) +if Eventtext~=nil then +if self:_MatchTag(Eventtext)then +local coord=COORDINATE:NewFromVec3({y=Event.pos.y,x=Event.pos.x,z=Event.pos.z}) +if self.debug then +local coordtext=coord:ToStringLLDDM() +local text=tostring(Event.text) +local m=MESSAGE:New(string.format("Mark changed at %s with text: %s",coordtext,text),10,"Info",false):ToAll() +end +local matchtable=self:_MatchKeywords(Eventtext) +self:MarkChanged(Eventtext,matchtable,coord,Event.idx,coalition,Event.PlayerName,Event) +end +end +elseif Event.id==world.event.S_EVENT_MARK_REMOVED then +self:T({event="S_EVENT_MARK_REMOVED",carrier=Event.IniGroupName,vec3=Event.pos}) +local Eventtext=tostring(Event.text) +if Eventtext~=nil then +if self:_MatchTag(Eventtext)then +self:MarkDeleted() +end +end +end +end +function MARKEROPS_BASE:_MatchTag(Eventtext) +local matches=false +if not self.Casesensitive then +local type=string.lower(self.Tag) +if string.find(string.lower(Eventtext),type)then +matches=true +end +else +local type=self.Tag +if string.find(Eventtext,type)then +matches=true +end +end +return matches +end +function MARKEROPS_BASE:_MatchKeywords(Eventtext) +local matchtable={} +local keytable=self.Keywords +for _index,_word in pairs(keytable)do +if string.find(string.lower(Eventtext),string.lower(_word))then +table.insert(matchtable,_word) +end +end +return matchtable +end +function MARKEROPS_BASE:onbeforeMarkAdded(From,Event,To,Text,Keywords,Coord,MarkerID,CoalitionNumber) +self:T({self.lid,From,Event,To,Text,Keywords,Coord:ToStringLLDDM()}) +end +function MARKEROPS_BASE:onbeforeMarkChanged(From,Event,To,Text,Keywords,Coord,MarkerID,CoalitionNumber) +self:T({self.lid,From,Event,To,Text,Keywords,Coord:ToStringLLDDM()}) +end +function MARKEROPS_BASE:onbeforeMarkDeleted(From,Event,To) +self:T({self.lid,From,Event,To}) +end +function MARKEROPS_BASE:onenterStopped(From,Event,To) +self:T({self.lid,From,Event,To}) +self:UnHandleEvent(EVENTS.MarkAdded) +self:UnHandleEvent(EVENTS.MarkChange) +self:UnHandleEvent(EVENTS.MarkRemoved) +end +TEXTANDSOUND={ +ClassName="TEXTANDSOUND", +version="0.0.1", +lid="", +locale="en", +entries={}, +textclass="", +} +function TEXTANDSOUND:New(ClassName,Defaultlocale) +local self=BASE:Inherit(self,BASE:New()) +self.lid=string.format("%s (%s) | ",self.ClassName,self.version) +self.locale=Defaultlocale or(_SETTINGS:GetLocale()or"en") +self.textclass=ClassName or"none" +self.entries={} +local initentry={} +initentry.Classname=ClassName +initentry.Data={} +initentry.Locale=self.locale +self.entries[self.locale]=initentry +self:I(self.lid.."Instantiated.") +self:T({self.entries[self.locale]}) +return self +end +function TEXTANDSOUND:AddEntry(Locale,ID,Text,Soundfile,Soundlength,Subtitle) +self:T(self.lid.."AddEntry") +local locale=Locale or self.locale +local dataentry={} +dataentry.ID=ID or"1" +dataentry.Text=Text or"none" +dataentry.Soundfile=Soundfile +dataentry.Soundlength=Soundlength or 0 +dataentry.Subtitle=Subtitle +if not self.entries[locale]then +local initentry={} +initentry.Classname=self.textclass +initentry.Data={} +initentry.Locale=locale +self.entries[locale]=initentry +end +self.entries[locale].Data[ID]=dataentry +self:T({self.entries[locale].Data}) +return self +end +function TEXTANDSOUND:GetEntry(ID,Locale) +self:T(self.lid.."GetEntry") +local locale=Locale or self.locale +if not self.entries[locale]then +locale=self.locale +end +local Text,Soundfile,Soundlength,Subtitle=nil,nil,0,nil +if self.entries[locale]then +if self.entries[locale].Data then +local data=self.entries[locale].Data[ID] +if data then +Text=data.Text +Soundfile=data.Soundfile +Soundlength=data.Soundlength +Subtitle=data.Subtitle +elseif self.entries[self.locale].Data[ID]then +local data=self.entries[self.locale].Data[ID] +Text=data.Text +Soundfile=data.Soundfile +Soundlength=data.Soundlength +Subtitle=data.Subtitle +end +end +else +return nil,nil,0,nil +end +return Text,Soundfile,Soundlength,Subtitle +end +function TEXTANDSOUND:GetDefaultLocale() +self:T(self.lid.."GetDefaultLocale") +return self.locale +end +function TEXTANDSOUND:SetDefaultLocale(locale) +self:T(self.lid.."SetDefaultLocale") +self.locale=locale or"en" +return self +end +function TEXTANDSOUND:HasLocale(Locale) +self:T(self.lid.."HasLocale") +return self.entries[Locale]and true or false +end +function TEXTANDSOUND:FlushToLog() +self:I(self.lid.."Flushing entries:") +local text=string.format("Textclass: %s | Default Locale: %s",self.textclass,self.locale) +for _,_entry in pairs(self.entries)do +local entry=_entry +local text=string.format("Textclassname: %s | Locale: %s",entry.Classname,entry.Locale) +self:I(text) +for _ID,_data in pairs(entry.Data)do +local data=_data +local text=string.format("ID: %s\nText: %s\nSoundfile: %s With length: %d\nSubtitle: %s",tostring(_ID),data.Text or"none",data.Soundfile or"none",data.Soundlength or 0,data.Subtitle or"none") +self:I(text) +end +end +return self +end +PATHLINE={ +ClassName="PATHLINE", +lid=nil, +points={}, +} +PATHLINE.version="0.1.1" +function PATHLINE:New(Name) +local self=BASE:Inherit(self,BASE:New()) +self.name=Name or"Unknown Path" +self.lid=string.format("PATHLINE %s | ",Name) +return self +end +function PATHLINE:NewFromVec2Array(Name,Vec2Array) +local self=PATHLINE:New(Name) +for i=1,#Vec2Array do +self:AddPointFromVec2(Vec2Array[i]) +end +return self +end +function PATHLINE:NewFromVec3Array(Name,Vec3Array) +local self=PATHLINE:New(Name) +for i=1,#Vec3Array do +self:AddPointFromVec3(Vec3Array[i]) +end +return self +end +function PATHLINE:FindByName(Name) +local pathline=_DATABASE:FindPathline(Name) +return pathline +end +function PATHLINE:AddPointFromVec2(Vec2) +if Vec2 then +local point=self:_CreatePoint(Vec2) +table.insert(self.points,point) +end +return self +end +function PATHLINE:AddPointFromVec3(Vec3) +if Vec3 then +local point=self:_CreatePoint(Vec3) +table.insert(self.points,point) +end +return self +end +function PATHLINE:GetName() +return self.name +end +function PATHLINE:GetNumberOfPoints() +local N=#self.points +return N +end +function PATHLINE:GetPoints() +return self.points +end +function PATHLINE:GetPoints3D() +local vecs={} +for _,_point in pairs(self.points)do +local point=_point +table.insert(vecs,point.vec3) +end +return vecs +end +function PATHLINE:GetPoints2D() +local vecs={} +for _,_point in pairs(self.points)do +local point=_point +table.insert(vecs,point.vec2) +end +return vecs +end +function PATHLINE:GetCoordinates() +local vecs={} +for _,_point in pairs(self.points)do +local point=_point +local coord=COORDINATE:NewFromVec3(point.vec3) +table.insert(vecs,coord) +end +return vecs +end +function PATHLINE:GetPointFromIndex(n) +local N=self:GetNumberOfPoints() +n=n or 1 +local point=nil +if n>=1 and n<=N then +point=self.points[n] +else +self:E(self.lid..string.format("ERROR: No point in pathline for N=%s",tostring(n))) +end +return point +end +function PATHLINE:GetPoint3DFromIndex(n) +local point=self:GetPointFromIndex(n) +if point then +return point.vec3 +end +return nil +end +function PATHLINE:GetPoint2DFromIndex(n) +local point=self:GetPointFromIndex(n) +if point then +return point.vec2 +end +return nil +end +function PATHLINE:MarkPoints(Switch) +for i,_point in pairs(self.points)do +local point=_point +if Switch==false then +if point.markerID then +UTILS.RemoveMark(point.markerID,Delay) +end +else +if point.markerID then +UTILS.RemoveMark(point.markerID) +end +point.markerID=UTILS.GetMarkID() +local text=string.format("Pathline %s: Point #%d\nSurface Type=%d\nHeight=%.1f m\nDepth=%.1f m",self.name,i,point.surfaceType,point.landHeight,point.depth) +trigger.action.markToAll(point.markerID,text,point.vec3,"") +end +end +end +function PATHLINE:_CreatePoint(Vec) +local point={} +if Vec.z then +point.vec3=UTILS.DeepCopy(Vec) +point.vec2={x=Vec.x,y=Vec.z} +else +point.vec2=UTILS.DeepCopy(Vec) +point.vec3={x=Vec.x,y=land.getHeight(Vec),z=Vec.y} +end +point.surfaceType=land.getSurfaceType(point.vec2) +point.landHeight,point.depth=land.getSurfaceHeightWithSeabed(point.vec2) +point.markerID=nil +return point +end +CLIENTMENU={ +ClassName="CLIENTMENU", +lid="", +version="0.1.3", +name=nil, +path=nil, +group=nil, +client=nil, +GroupID=nil, +Children={}, +Once=false, +Generic=false, +debug=false, +Controller=nil, +groupname=nil, +active=false, +} +CLIENTMENU_ID=0 +function CLIENTMENU:NewEntry(Client,Text,Parent,Function,...) +local self=BASE:Inherit(self,BASE:New()) +CLIENTMENU_ID=CLIENTMENU_ID+1 +self.ID=CLIENTMENU_ID +if Client then +self.group=Client:GetGroup() +self.client=Client +self.GroupID=self.group:GetID() +self.groupname=self.group:GetName()or"Unknown Groupname" +else +self.Generic=true +end +self.name=Text or"unknown entry" +if Parent then +if Parent:IsInstanceOf("MENU_BASE")then +self.parentpath=Parent.MenuPath +else +self.parentpath=Parent:GetPath() +Parent:AddChild(self) +end +end +self.Parent=Parent +self.Function=Function +self.Functionargs=arg or{} +table.insert(self.Functionargs,self.group) +table.insert(self.Functionargs,self.client) +if self.Functionargs and self.debug then +self:T({"Functionargs",self.Functionargs}) +end +if not self.Generic and self.active==false then +if Function~=nil then +local ErrorHandler=function(errmsg) +env.info("MOOSE Error in CLIENTMENU COMMAND function: "..errmsg) +if BASE.Debug~=nil then +env.info(BASE.Debug.traceback()) +end +return errmsg +end +self.CallHandler=function() +local function MenuFunction() +return self.Function(unpack(self.Functionargs)) +end +local Status,Result=xpcall(MenuFunction,ErrorHandler) +if self.Once==true then +self:Clear() +end +end +self.path=missionCommands.addCommandForGroup(self.GroupID,Text,self.parentpath,self.CallHandler) +self.active=true +else +self.path=missionCommands.addSubMenuForGroup(self.GroupID,Text,self.parentpath) +self.active=true +end +else +if self.parentpath then +self.path=UTILS.DeepCopy(self.parentpath) +else +self.path={} +end +self.path[#self.path+1]=Text +end +self.UUID=table.concat(self.path,";") +self:T({self.UUID}) +self.Once=false +self.lid=string.format("CLIENTMENU %s | %s | ",self.ID,self.name) +self:T(self.lid.."Created") +return self +end +function CLIENTMENU:CreateUUID(Parent,Text) +local path={} +if Parent and Parent.path then +path=Parent.path +end +path[#path+1]=Text +local UUID=table.concat(path,";") +return UUID +end +function CLIENTMENU:SetController(Controller) +self.Controller=Controller +return self +end +function CLIENTMENU:SetOnce() +self:T(self.lid.."SetOnce") +self.Once=true +return self +end +function CLIENTMENU:RemoveF10() +self:T(self.lid.."RemoveF10") +if self.GroupID then +local function RemoveFunction() +return missionCommands.removeItemForGroup(self.GroupID,self.path) +end +local status,err=pcall(RemoveFunction) +if not status then +self:I(string.format("**** Error Removing Menu Entry %s for %s!",tostring(self.name),self.groupname)) +end +self.active=false +end +return self +end +function CLIENTMENU:GetPath() +self:T(self.lid.."GetPath") +return self.path +end +function CLIENTMENU:GetUUID() +self:T(self.lid.."GetUUID") +return self.UUID +end +function CLIENTMENU:AddChild(Child) +self:T(self.lid.."AddChild "..Child.ID) +table.insert(self.Children,Child.ID,Child) +return self +end +function CLIENTMENU:RemoveChild(Child) +self:T(self.lid.."RemoveChild "..Child.ID) +table.remove(self.Children,Child.ID) +return self +end +function CLIENTMENU:RemoveSubEntries() +self:T(self.lid.."RemoveSubEntries") +self:T({self.Children}) +for _id,_entry in pairs(self.Children)do +self:T("Removing ".._id) +if _entry then +_entry:RemoveSubEntries() +_entry:RemoveF10() +if _entry.Parent then +_entry.Parent:RemoveChild(self) +end +end +end +return self +end +function CLIENTMENU:Clear() +self:T(self.lid.."Clear") +for _id,_entry in pairs(self.Children)do +if _entry then +_entry:RemoveSubEntries() +_entry=nil +end +end +self:RemoveF10() +if self.Parent then +self.Parent:RemoveChild(self) +end +return self +end +CLIENTMENUMANAGER={ +ClassName="CLIENTMENUMANAGER", +lid="", +version="0.1.7", +name=nil, +clientset=nil, +menutree={}, +flattree={}, +playertree={}, +entrycount=0, +rootentries={}, +debug=true, +PlayerMenu={}, +Coalition=nil, +} +function CLIENTMENUMANAGER:New(ClientSet,Alias,Coalition) +local self=BASE:Inherit(self,BASE:New()) +self.clientset=ClientSet +self.PlayerMenu={} +self.name=Alias or"Nightshift" +self.Coalition=Coalition or coalition.side.BLUE +self.lid=string.format("CLIENTMENUMANAGER %s | %s | ",self.version,self.name) +if self.debug then +self:I(self.lid.."Created") +end +return self +end +function CLIENTMENUMANAGER:_EventHandler(EventData,Retry) +self:T(self.lid.."_EventHandler: "..EventData.id) +if EventData.id==EVENTS.PlayerLeaveUnit or EventData.id==EVENTS.Ejection or EventData.id==EVENTS.Crash or EventData.id==EVENTS.PilotDead then +self:T(self.lid.."Leave event for player: "..tostring(EventData.IniPlayerName)) +local Client=_DATABASE:FindClient(EventData.IniUnitName) +if Client then +self:ResetMenu(Client) +end +elseif(EventData.id==EVENTS.PlayerEnterAircraft)and EventData.IniCoalition==self.Coalition then +if EventData.IniPlayerName and EventData.IniGroup then +if(not self.clientset:IsIncludeObject(_DATABASE:FindClient(EventData.IniUnitName)))then +self:T(self.lid.."Client not in SET: "..EventData.IniPlayerName) +if not Retry then +self:ScheduleOnce(2,CLIENTMENUMANAGER._EventHandler,self,EventData,true) +end +return self +end +local player=_DATABASE:FindClient(EventData.IniUnitName) +self:Propagate(player) +end +elseif EventData.id==EVENTS.PlayerEnterUnit then +local grp=GROUP:FindByName(EventData.IniGroupName) +if grp:IsGround()then +self:T(string.format("Player %s entered GROUND unit %s!",EventData.IniPlayerName,EventData.IniUnitName)) +local IsPlayer=EventData.IniDCSUnit:getPlayerName() +if IsPlayer then +local client=_DATABASE.CLIENTS[EventData.IniDCSUnitName] +if not client then +self:I(string.format("Player '%s' joined ground unit '%s' of group '%s'",tostring(EventData.IniPlayerName),tostring(EventData.IniDCSUnitName),tostring(EventData.IniDCSGroupName))) +client=_DATABASE:AddClient(EventData.IniDCSUnitName) +client:AddPlayer(EventData.IniPlayerName) +if not _DATABASE.PLAYERS[EventData.IniPlayerName]then +_DATABASE:AddPlayer(EventData.IniUnitName,EventData.IniPlayerName) +end +local Settings=SETTINGS:Set(EventData.IniPlayerName) +Settings:SetPlayerMenu(EventData.IniUnit) +end +self:Propagate(client) +end +end +end +return self +end +function CLIENTMENUMANAGER:InitAutoPropagation() +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.Crash,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventHandler) +self:SetEventPriority(6) +return self +end +function CLIENTMENUMANAGER:NewEntry(Text,Parent,Function,...) +self:T(self.lid.."NewEntry "..Text or"None") +self.entrycount=self.entrycount+1 +local entry=CLIENTMENU:NewEntry(nil,Text,Parent,Function,unpack(arg)) +if not Parent then +self.rootentries[self.entrycount]=entry +end +local depth=#entry.path +if not self.menutree[depth]then self.menutree[depth]={}end +table.insert(self.menutree[depth],entry.UUID) +self.flattree[entry.UUID]=entry +return entry +end +function CLIENTMENUMANAGER:EntryUUIDExists(UUID) +local exists=self.flattree[UUID]and true or false +return exists +end +function CLIENTMENUMANAGER:FindEntryByUUID(UUID) +self:T(self.lid.."FindEntryByUUID "..UUID or"None") +local entry=nil +for _gid,_entry in pairs(self.flattree)do +local Entry=_entry +if Entry and Entry.UUID==UUID then +entry=Entry +end +end +return entry +end +function CLIENTMENUMANAGER:FindUUIDsByText(Text,Parent) +self:T(self.lid.."FindUUIDsByText "..Text or"None") +local matches={} +local entries={} +local n=0 +for _uuid,_entry in pairs(self.flattree)do +local Entry=_entry +if Parent then +if Entry and string.find(Entry.name,Text,1,true)and string.find(Entry.UUID,Parent.UUID,1,true)then +table.insert(matches,_uuid) +table.insert(entries,Entry) +n=n+1 +end +else +if Entry and string.find(Entry.name,Text,1,true)then +table.insert(matches,_uuid) +table.insert(entries,Entry) +n=n+1 +end +end +end +return matches,entries,n +end +function CLIENTMENUMANAGER:FindEntriesByText(Text,Parent) +self:T(self.lid.."FindEntriesByText "..Text or"None") +local matches,objects,number=self:FindUUIDsByText(Text,Parent) +return objects,number +end +function CLIENTMENUMANAGER:FindUUIDsByParent(Parent) +self:T(self.lid.."FindUUIDsByParent") +local matches={} +local entries={} +local n=0 +for _uuid,_entry in pairs(self.flattree)do +local Entry=_entry +if Parent then +if Entry and string.find(Entry.UUID,Parent.UUID,1,true)then +table.insert(matches,_uuid) +table.insert(entries,Entry) +n=n+1 +end +end +end +return matches,entries,n +end +function CLIENTMENUMANAGER:FindEntriesByParent(Parent) +self:T(self.lid.."FindEntriesByParent") +local matches,objects,number=self:FindUUIDsByParent(Parent) +return objects,number +end +function CLIENTMENUMANAGER:ChangeEntryText(Entry,Text,Client) +self:T(self.lid.."ChangeEntryText "..Text or"None") +local newentry=CLIENTMENU:NewEntry(nil,Text,Entry.Parent,Entry.Function,unpack(Entry.Functionargs)) +self:DeleteF10Entry(Entry,Client) +self:DeleteGenericEntry(Entry) +if not Entry.Parent then +self.rootentries[self.entrycount]=newentry +end +local depth=#newentry.path +if not self.menutree[depth]then self.menutree[depth]={}end +table.insert(self.menutree[depth],newentry.UUID) +self.flattree[newentry.UUID]=newentry +self:AddEntry(newentry,Client) +return self +end +function CLIENTMENUMANAGER:Propagate(Client) +self:T(self.lid.."Propagate") +local knownunits={} +local Set=self.clientset.Set +if Client then +Set={Client} +end +self:ResetMenu(Client) +for _,_client in pairs(Set)do +local client=_client +if client and client:IsAlive()then +local playerunit=client:GetName() +local playername=client:GetPlayerName()or"none" +if not knownunits[playerunit]then +knownunits[playerunit]=true +else +self:I("Player in multi seat unit: "..playername) +break +end +if not self.playertree[playername]then +self.playertree[playername]={} +end +for level,branch in pairs(self.menutree)do +self:T("Building branch:"..level) +for _,leaf in pairs(branch)do +self:T("Building leaf:"..leaf) +local entry=self:FindEntryByUUID(leaf) +if entry then +self:T("Found generic entry:"..entry.UUID) +local parent=nil +if entry.Parent and entry.Parent.UUID then +parent=self.playertree[playername][entry.Parent.UUID]or self:FindEntryByUUID(entry.Parent.UUID) +end +self.playertree[playername][entry.UUID]=CLIENTMENU:NewEntry(client,entry.name,parent,entry.Function,unpack(entry.Functionargs)) +self.playertree[playername][entry.UUID].Once=entry.Once +else +self:T("NO generic entry for:"..leaf) +end +end +end +end +end +return self +end +function CLIENTMENUMANAGER:AddEntry(Entry,Client) +self:T(self.lid.."AddEntry") +local Set=self.clientset.Set +local knownunits={} +if Client then +Set={Client} +end +for _,_client in pairs(Set)do +local client=_client +if client and client:IsAlive()then +local playername=client:GetPlayerName()or"None" +local unitname=client:GetName() +if not knownunits[unitname]then +knownunits[unitname]=true +else +self:I("Player in multi seat unit: "..playername) +break +end +if Entry then +self:T("Adding generic entry:"..Entry.UUID) +local parent=nil +if not self.playertree[playername]then +self.playertree[playername]={} +end +if Entry.Parent and Entry.Parent.UUID then +parent=self.playertree[playername][Entry.Parent.UUID]or self:FindEntryByUUID(Entry.Parent.UUID) +end +self.playertree[playername][Entry.UUID]=CLIENTMENU:NewEntry(client,Entry.name,parent,Entry.Function,unpack(Entry.Functionargs)) +self.playertree[playername][Entry.UUID].Once=Entry.Once +else +self:T("NO generic entry given") +end +end +end +return self +end +function CLIENTMENUMANAGER:ResetMenu(Client) +self:T(self.lid.."ResetMenu") +for _,_entry in pairs(self.rootentries)do +if _entry then +self:DeleteF10Entry(_entry,Client) +end +end +return self +end +function CLIENTMENUMANAGER:ResetMenuComplete() +self:T(self.lid.."ResetMenuComplete") +for _,_entry in pairs(self.rootentries)do +if _entry then +self:DeleteF10Entry(_entry) +end +end +self.playertree=nil +self.playertree={} +self.rootentries=nil +self.rootentries={} +self.menutree=nil +self.menutree={} +return self +end +function CLIENTMENUMANAGER:DeleteEntry(Entry,Client) +self:T(self.lid.."DeleteEntry") +return self:DeleteF10Entry(Entry,Client) +end +function CLIENTMENUMANAGER:DeleteF10Entry(Entry,Client) +self:T(self.lid.."DeleteF10Entry") +local Set=self.clientset.Set +if Client then +Set={Client} +end +for _,_client in pairs(Set)do +if _client and _client:IsAlive()then +local playername=_client:GetPlayerName() +if self.playertree[playername]then +local centry=self.playertree[playername][Entry.UUID] +if centry then +centry:Clear() +end +end +end +end +return self +end +function CLIENTMENUMANAGER:DeleteGenericEntry(Entry) +self:T(self.lid.."DeleteGenericEntry") +if Entry.Children and#Entry.Children>0 then +self:RemoveGenericSubEntries(Entry) +end +local depth=#Entry.path +local uuid=Entry.UUID +local tbl=UTILS.DeepCopy(self.menutree) +if tbl[depth]then +for i=depth,#tbl do +for _id,_uuid in pairs(tbl[i])do +self:T(_uuid) +if string.find(_uuid,uuid,1,true)or _uuid==uuid then +self.menutree[i][_id]=nil +self.flattree[_uuid]=nil +end +end +end +end +return self +end +function CLIENTMENUMANAGER:RemoveGenericSubEntries(Entry) +self:T(self.lid.."RemoveGenericSubEntries") +local depth=#Entry.path+1 +local uuid=Entry.UUID +local tbl=UTILS.DeepCopy(self.menutree) +if tbl[depth]then +for i=depth,#tbl do +self:T("Level = "..i) +for _id,_uuid in pairs(tbl[i])do +self:T(_uuid) +if string.find(_uuid,uuid,1,true)then +self:T("Match for ".._uuid) +self.menutree[i][_id]=nil +self.flattree[_uuid]=nil +end +end +end +end +return self +end +function CLIENTMENUMANAGER:RemoveF10SubEntries(Entry,Client) +self:T(self.lid.."RemoveSubEntries") +local Set=self.clientset.Set +if Client then +Set={Client} +end +for _,_client in pairs(Set)do +if _client and _client:IsAlive()then +local playername=_client:GetPlayerName() +if self.playertree[playername]then +local centry=self.playertree[playername][Entry.UUID] +centry:RemoveSubEntries() +end +end +end +return self +end +OBJECT={ +ClassName="OBJECT", +ObjectName="", +} +function OBJECT:New(ObjectName) +local self=BASE:Inherit(self,BASE:New()) +self:F2(ObjectName) +self.ObjectName=ObjectName +return self +end +function OBJECT:GetID() +local DCSObject=self:GetDCSObject() +if DCSObject then +local ObjectID=DCSObject:getID() +return ObjectID +end +self:E({"Cannot GetID",Name=self.ObjectName,Class=self:GetClassName()}) +return nil +end +function OBJECT:Destroy() +local DCSObject=self:GetDCSObject() +if DCSObject then +DCSObject:destroy(false) +return true +end +self:E({"Cannot Destroy",Name=self.ObjectName,Class=self:GetClassName()}) +return nil +end +IDENTIFIABLE={ +ClassName="IDENTIFIABLE", +IdentifiableName="", +} +local _CategoryName={ +[Unit.Category.AIRPLANE]="Airplane", +[Unit.Category.HELICOPTER]="Helicopter", +[Unit.Category.GROUND_UNIT]="Ground Identifiable", +[Unit.Category.SHIP]="Ship", +[Unit.Category.STRUCTURE]="Structure", +} +function IDENTIFIABLE:New(IdentifiableName) +local self=BASE:Inherit(self,OBJECT:New(IdentifiableName)) +self:F2(IdentifiableName) +self.IdentifiableName=IdentifiableName +return self +end +function IDENTIFIABLE:IsAlive() +self:F3(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableIsAlive=DCSIdentifiable:isExist() +return IdentifiableIsAlive +end +return false +end +function IDENTIFIABLE:GetName() +local IdentifiableName=self.IdentifiableName +return IdentifiableName +end +function IDENTIFIABLE:GetTypeName() +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableTypeName=DCSIdentifiable:getTypeName() +self:T3(IdentifiableTypeName) +return IdentifiableTypeName +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCategory() +self:F2(self.ObjectName) +local DCSObject=self:GetDCSObject() +if DCSObject then +local ObjectCategory,UnitCategory=DCSObject:getCategory() +self:T3(ObjectCategory) +return ObjectCategory,UnitCategory +end +return nil,nil +end +function IDENTIFIABLE:GetCategoryName() +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableCategoryName=_CategoryName[self:GetDesc().category] +return IdentifiableCategoryName +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCoalition() +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableCoalition=DCSIdentifiable:getCoalition() +self:T3(IdentifiableCoalition) +return IdentifiableCoalition +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCoalitionName() +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableCoalition=DCSIdentifiable:getCoalition() +self:T3(IdentifiableCoalition) +return UTILS.GetCoalitionName(IdentifiableCoalition) +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCountry() +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableCountry=DCSIdentifiable:getCountry() +self:T3(IdentifiableCountry) +return IdentifiableCountry +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCountryName() +self:F2(self.IdentifiableName) +local countryid=self:GetCountry() +for name,id in pairs(country.id)do +if countryid==id then +return name +end +end +end +function IDENTIFIABLE:GetDesc() +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableDesc=DCSIdentifiable:getDesc() +self:T2(IdentifiableDesc) +return IdentifiableDesc +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:HasAttribute(AttributeName) +self:F2(self.IdentifiableName) +local DCSIdentifiable=self:GetDCSObject() +if DCSIdentifiable then +local IdentifiableHasAttribute=DCSIdentifiable:hasAttribute(AttributeName) +self:T2(IdentifiableHasAttribute) +return IdentifiableHasAttribute +end +self:F(self.ClassName.." "..self.IdentifiableName.." not found!") +return nil +end +function IDENTIFIABLE:GetCallsign() +return'' +end +function IDENTIFIABLE:GetThreatLevel() +return 0,"Scenery" +end +POSITIONABLE={ +ClassName="POSITIONABLE", +PositionableName="", +coordinate=nil, +pointvec3=nil, +} +POSITIONABLE.__={} +POSITIONABLE.__.Cargo={} +function POSITIONABLE:New(PositionableName) +local self=BASE:Inherit(self,IDENTIFIABLE:New(PositionableName)) +self.PositionableName=PositionableName +return self +end +function POSITIONABLE:Destroy(GenerateEvent) +self:F2(self.ObjectName) +local DCSObject=self:GetDCSObject() +if DCSObject then +local UnitGroup=self:GetGroup() +local UnitGroupName=UnitGroup:GetName() +self:F({UnitGroupName=UnitGroupName}) +if GenerateEvent and GenerateEvent==true then +if self:IsAir()then +self:CreateEventCrash(timer.getTime(),DCSObject) +else +self:CreateEventDead(timer.getTime(),DCSObject) +end +elseif GenerateEvent==false then +else +self:CreateEventRemoveUnit(timer.getTime(),DCSObject) +end +USERFLAG:New(UnitGroupName):Set(100) +DCSObject:destroy() +end +return nil +end +function POSITIONABLE:GetDCSObject() +return nil +end +function POSITIONABLE:GetPosition() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if self:IsInstanceOf("GROUP")then +DCSPositionable=self:GetFirstUnitAlive():GetDCSObject() +end +if DCSPositionable then +local PositionablePosition=DCSPositionable:getPosition() +self:T3(PositionablePosition) +return PositionablePosition +end +BASE:E({"Cannot GetPosition",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetOrientation() +local position=self:GetPosition() +if position then +return position.x,position.y,position.z +else +BASE:E({"Cannot GetOrientation",Positionable=self,Alive=self:IsAlive()}) +return nil,nil,nil +end +end +function POSITIONABLE:GetOrientationX() +local position=self:GetPosition() +if position then +return position.x +else +BASE:E({"Cannot GetOrientationX",Positionable=self,Alive=self:IsAlive()}) +return nil +end +end +function POSITIONABLE:GetOrientationY() +local position=self:GetPosition() +if position then +return position.y +else +BASE:E({"Cannot GetOrientationY",Positionable=self,Alive=self:IsAlive()}) +return nil +end +end +function POSITIONABLE:GetOrientationZ() +local position=self:GetPosition() +if position then +return position.z +else +BASE:E({"Cannot GetOrientationZ",Positionable=self,Alive=self:IsAlive()}) +return nil +end +end +function POSITIONABLE:GetPositionVec3() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionablePosition=DCSPositionable:getPosition().p +self:T3(PositionablePosition) +return PositionablePosition +end +BASE:E({"Cannot GetPositionVec3",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetVec3() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local vec3=DCSPositionable:getPoint() +if not vec3 then +local pos=DCSPositionable:getPosition() +if pos and pos.p then +vec3=pos.p +else +self:E({"Cannot get the position from DCS Object for GetVec3",Positionable=self,Alive=self:IsAlive()}) +end +end +return vec3 +end +self:E({"Cannot get the Positionable DCS Object for GetVec3",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetVec2() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local Vec3=DCSPositionable:getPoint() +return{x=Vec3.x,y=Vec3.z} +end +self:E({"Cannot GetVec2",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetPointVec2() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionableVec3=DCSPositionable:getPosition().p +local PositionablePointVec2=COORDINATE:NewFromVec3(PositionableVec3) +return PositionablePointVec2 +end +self:E({"Cannot Coordinate",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetPointVec3() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionableVec3=self:GetPositionVec3() +if false and self.pointvec3 then +self.pointvec3.x=PositionableVec3.x +self.pointvec3.y=PositionableVec3.y +self.pointvec3.z=PositionableVec3.z +else +self.pointvec3=COORDINATE:NewFromVec3(PositionableVec3) +end +return self.pointvec3 +end +BASE:E({"Cannot GetPointVec3",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetCoord() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionableVec3=self:GetVec3() +if PositionableVec3 then +if self.coordinate then +self.coordinate:UpdateFromVec3(PositionableVec3) +else +self.coordinate=COORDINATE:NewFromVec3(PositionableVec3) +end +return self.coordinate +end +end +BASE:E({"Cannot GetCoordinate",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetCoordinate() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionableVec3=self:GetVec3() +if PositionableVec3 then +local coord=COORDINATE:NewFromVec3(PositionableVec3) +local heading=self:GetHeading() +coord.Heading=heading +return coord +end +end +self:E({"Cannot GetCoordinate",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:Explode(power,delay) +power=power or 100 +if delay and delay>0 then +self:ScheduleOnce(delay,POSITIONABLE.Explode,self,power,0) +else +local coord=self:GetCoord() +if coord then +coord:Explosion(power) +end +end +return self +end +function POSITIONABLE:GetOffsetCoordinate(x,y,z) +x=x or 0 +y=y or 0 +z=z or 0 +local X=self:GetOrientationX() +local Y=self:GetOrientationY() +local Z=self:GetOrientationZ() +local A={x=x,y=y,z=z} +local x={x=X.x*A.x,y=X.y*A.x,z=X.z*A.x} +local y={x=Y.x*A.y,y=Y.y*A.y,z=Y.z*A.y} +local z={x=Z.x*A.z,y=Z.y*A.z,z=Z.z*A.z} +local a={x=x.x+y.x+z.x,y=x.y+y.y+z.y,z=x.z+y.z+z.z} +local u=self:GetVec3() +local v={x=a.x+u.x,y=a.y+u.y,z=a.z+u.z} +local coord=COORDINATE:NewFromVec3(v) +return coord +end +function POSITIONABLE:GetRelativeCoordinate(x,y,z) +x=x or 0 +y=y or 0 +z=z or 0 +local selfPos=self:GetVec3() +local X=self:GetOrientationX() +local Y=self:GetOrientationY() +local Z=self:GetOrientationZ() +local off={ +x=x-selfPos.x, +y=y-selfPos.y, +z=z-selfPos.z +} +local res={x=0,y=0,z=0} +local mat={ +{X.x,Y.x,Z.x,off.x}, +{X.y,Y.y,Z.y,off.y}, +{X.z,Y.z,Z.z,off.z} +} +local m=3 +local n=4 +local h=1 +local k=1 +while h<=m and k<=n do +local v_max=math.abs(mat[h][k]) +local i_max=h +for i=h,m,1 do +local value=math.abs(mat[i][k]) +if value>v_max then +i_max=i +v_max=value +end +end +if mat[i_max][k]==0 then +k=k+1 +else +local tmp=mat[h] +mat[h]=mat[i_max] +mat[i_max]=tmp +for i=h+1,m,1 do +local f=mat[i][k]/mat[h][k] +mat[i][k]=0 +for j=k+1,n,1 do +mat[i][j]=mat[i][j]-f*mat[h][j] +end +end +h=h+1 +k=k+1 +end +end +res.z=mat[3][4]/mat[3][3] +res.y=(mat[2][4]-res.z*mat[2][3])/mat[2][2] +res.x=(mat[1][4]-res.y*mat[1][2]-res.z*mat[1][3])/mat[1][1] +local coord=COORDINATE:NewFromVec3(res) +return coord +end +function POSITIONABLE:GetRandomVec3(Radius) +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionablePointVec3=DCSPositionable:getPosition().p +if Radius then +local PositionableRandomVec3={} +local angle=math.random()*math.pi*2 +PositionableRandomVec3.x=PositionablePointVec3.x+math.cos(angle)*math.random()*Radius +PositionableRandomVec3.y=PositionablePointVec3.y +PositionableRandomVec3.z=PositionablePointVec3.z+math.sin(angle)*math.random()*Radius +self:T3(PositionableRandomVec3) +return PositionableRandomVec3 +else +self:F("Radius is nil, returning the PointVec3 of the POSITIONABLE",PositionablePointVec3) +return PositionablePointVec3 +end +end +BASE:E({"Cannot GetRandomVec3",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetBoundingBox() +self:F2() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionableDesc=DCSPositionable:getDesc() +if PositionableDesc then +local PositionableBox=PositionableDesc.box +return PositionableBox +end +end +BASE:E({"Cannot GetBoundingBox",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetObjectSize() +local box=self:GetBoundingBox() +if box then +local x=box.max.x+math.abs(box.min.x) +local y=box.max.y+math.abs(box.min.y) +local z=box.max.z+math.abs(box.min.z) +return math.max(x,z),x,y,z +end +return 0,0,0,0 +end +function POSITIONABLE:GetBoundingRadius(MinDist) +self:F2() +local Box=self:GetBoundingBox() +local boxmin=MinDist or 0 +if Box then +local X=Box.max.x-Box.min.x +local Z=Box.max.z-Box.min.z +local CX=X/2 +local CZ=Z/2 +return math.max(math.max(CX,CZ),boxmin) +end +BASE:T({"Cannot GetBoundingRadius",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetAltitude() +self:F2() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionablePointVec3=DCSPositionable:getPoint() +return PositionablePointVec3.y +end +BASE:E({"Cannot GetAltitude",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:IsAboveRunway() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local Vec2=self:GetVec2() +local SurfaceType=land.getSurfaceType(Vec2) +local IsAboveRunway=SurfaceType==land.SurfaceType.RUNWAY +self:T2(IsAboveRunway) +return IsAboveRunway +end +BASE:E({"Cannot IsAboveRunway",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetSize() +local DCSObject=self:GetDCSObject() +if DCSObject then +return 1 +else +return 0 +end +end +function POSITIONABLE:GetHeading() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local PositionablePosition=DCSPositionable:getPosition() +if PositionablePosition then +local PositionableHeading=math.atan2(PositionablePosition.x.z,PositionablePosition.x.x) +if PositionableHeading<0 then +PositionableHeading=PositionableHeading+2*math.pi +end +PositionableHeading=PositionableHeading*180/math.pi +return PositionableHeading +end +end +self:E({"Cannot GetHeading",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:IsAir() +self:F2() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +self:T3({UnitDescriptor.category,Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +local IsAirResult=(UnitDescriptor.category==Unit.Category.AIRPLANE)or(UnitDescriptor.category==Unit.Category.HELICOPTER) +self:T3(IsAirResult) +return IsAirResult +end +self:E({"Cannot check IsAir",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:IsGround() +self:F2() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +self:T3({UnitDescriptor.category,Unit.Category.GROUND_UNIT}) +local IsGroundResult=(UnitDescriptor.category==Unit.Category.GROUND_UNIT) +self:T3(IsGroundResult) +return IsGroundResult +end +self:E({"Cannot check IsGround",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:IsShip() +self:F2() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +self:T3({UnitDescriptor.category,Unit.Category.SHIP}) +local IsShipResult=(UnitDescriptor.category==Unit.Category.SHIP) +self:T3(IsShipResult) +return IsShipResult +end +self:E({"Cannot check IsShip",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:IsSubmarine() +self:F2() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +if UnitDescriptor.attributes["Submarines"]==true then +return true +else +return false +end +end +self:E({"Cannot check IsSubmarine",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:InAir() +self:F2(self.PositionableName) +return nil +end +function POSITIONABLE:GetVelocity() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local Velocity=VELOCITY:New(self) +return Velocity +end +BASE:E({"Cannot GetVelocity",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetVelocityVec3() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable and DCSPositionable:isExist()then +local PositionableVelocityVec3=DCSPositionable:getVelocity() +self:T3(PositionableVelocityVec3) +return PositionableVelocityVec3 +end +BASE:E({"Cannot GetVelocityVec3",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function POSITIONABLE:GetRelativeVelocity(Positionable) +self:F2(self.PositionableName) +local v1=self:GetVelocityVec3() +local v2=Positionable:GetVelocityVec3() +local vtot=UTILS.VecAdd(v1,v2) +return UTILS.VecNorm(vtot) +end +function POSITIONABLE:GetHeight() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable and DCSPositionable:isExist()then +local PositionablePosition=DCSPositionable:getPosition() +if PositionablePosition then +local PositionableHeight=PositionablePosition.p.y +self:T2(PositionableHeight) +return PositionableHeight +end +end +return nil +end +function POSITIONABLE:GetVelocityKMH() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable and DCSPositionable:isExist()then +local VelocityVec3=self:GetVelocityVec3() +local Velocity=(VelocityVec3.x^2+VelocityVec3.y^2+VelocityVec3.z^2)^0.5 +local Velocity=Velocity*3.6 +self:T3(Velocity) +return Velocity +end +return 0 +end +function POSITIONABLE:GetVelocityMPS() +self:F2(self.PositionableName) +local DCSPositionable=self:GetDCSObject() +if DCSPositionable and DCSPositionable:isExist()then +local VelocityVec3=self:GetVelocityVec3() +local Velocity=(VelocityVec3.x^2+VelocityVec3.y^2+VelocityVec3.z^2)^0.5 +self:T3(Velocity) +return Velocity +end +return 0 +end +function POSITIONABLE:GetVelocityKNOTS() +self:F2(self.PositionableName) +return UTILS.MpsToKnots(self:GetVelocityMPS()) +end +function POSITIONABLE:GetAirspeedTrue() +local tas=0 +local coord=self:GetCoord() +if coord then +local alt=coord.y +local wvec3=coord:GetWindVec3(alt,false) +local vvec3=self:GetVelocityVec3() +local tasvec3=UTILS.VecSubstract(vvec3,wvec3) +tas=UTILS.VecNorm(tasvec3) +end +return tas +end +function POSITIONABLE:GetAirspeedIndicated(oatcorr) +local tas=self:GetAirspeedTrue() +local altitude=self:GetAltitude() +local ias=UTILS.TasToIas(tas,altitude,oatcorr) +return ias +end +function POSITIONABLE:GetGroundSpeed() +local gs=0 +local vel=self:GetVelocityVec3() +if vel then +local vec2={x=vel.x,y=vel.z} +gs=UTILS.Vec2Norm(vel) +end +return gs +end +function POSITIONABLE:GetAoA() +local unitpos=self:GetPosition() +if unitpos then +local unitvel=self:GetVelocityVec3() +if unitvel and UTILS.VecNorm(unitvel)~=0 then +local wind=self:GetCoordinate():GetWindWithTurbulenceVec3() +unitvel.x=unitvel.x-wind.x +unitvel.y=unitvel.y-wind.y +unitvel.z=unitvel.z-wind.z +local AxialVel={} +AxialVel.x=UTILS.VecDot(unitpos.x,unitvel) +AxialVel.y=UTILS.VecDot(unitpos.y,unitvel) +AxialVel.z=UTILS.VecDot(unitpos.z,unitvel) +local AoA=math.acos(UTILS.VecDot({x=1,y=0,z=0},{x=AxialVel.x,y=AxialVel.y,z=0})/UTILS.VecNorm({x=AxialVel.x,y=AxialVel.y,z=0})) +if AxialVel.y>0 then +AoA=-AoA +end +return math.deg(AoA) +end +end +return nil +end +function POSITIONABLE:GetClimbAngle() +local unitpos=self:GetPosition() +if unitpos then +local unitvel=self:GetVelocityVec3() +if unitvel and UTILS.VecNorm(unitvel)~=0 then +local angle=math.asin(unitvel.y/UTILS.VecNorm(unitvel)) +return math.deg(angle) +else +return 0 +end +end +return nil +end +function POSITIONABLE:GetPitch() +local unitpos=self:GetPosition() +if unitpos then +return math.deg(math.asin(unitpos.x.y)) +end +return nil +end +function POSITIONABLE:GetRoll() +local unitpos=self:GetPosition() +if unitpos then +local cp=UTILS.VecCross(unitpos.x,{x=0,y=1,z=0}) +local dp=UTILS.VecDot(cp,unitpos.z) +local Roll=math.acos(dp/(UTILS.VecNorm(cp)*UTILS.VecNorm(unitpos.z))) +if unitpos.z.y>0 then +Roll=-Roll +end +return math.deg(Roll) +end +return nil +end +function POSITIONABLE:GetYaw() +local unitpos=self:GetPosition() +if unitpos then +local unitvel=self:GetVelocityVec3() +if unitvel and UTILS.VecNorm(unitvel)~=0 then +local AxialVel={} +AxialVel.x=UTILS.VecDot(unitpos.x,unitvel) +AxialVel.y=UTILS.VecDot(unitpos.y,unitvel) +AxialVel.z=UTILS.VecDot(unitpos.z,unitvel) +local Yaw=math.acos(UTILS.VecDot({x=1,y=0,z=0},{x=AxialVel.x,y=0,z=AxialVel.z})/UTILS.VecNorm({x=AxialVel.x,y=0,z=AxialVel.z})) +if AxialVel.z>0 then +Yaw=-Yaw +end +return Yaw +end +end +return nil +end +function POSITIONABLE:GetMessageText(Message,Name) +local DCSObject=self:GetDCSObject() +if DCSObject then +local Callsign=string.format("%s",((Name~=""and Name)or self:GetCallsign()~=""and self:GetCallsign())or self:GetName()) +local MessageText=string.format("%s - %s",Callsign,Message) +return MessageText +end +return nil +end +function POSITIONABLE:GetMessage(Message,Duration,Name) +local DCSObject=self:GetDCSObject() +if DCSObject then +local MessageText=self:GetMessageText(Message,Name) +return MESSAGE:New(MessageText,Duration) +end +return nil +end +function POSITIONABLE:GetMessageType(Message,MessageType,Name) +local DCSObject=self:GetDCSObject() +if DCSObject then +local MessageText=self:GetMessageText(Message,Name) +return MESSAGE:NewType(MessageText,MessageType) +end +return nil +end +function POSITIONABLE:MessageToAll(Message,Duration,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToAll() +end +return nil +end +function POSITIONABLE:MessageToCoalition(Message,Duration,MessageCoalition,Name) +self:F2({Message,Duration}) +local Name=Name or"" +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToCoalition(MessageCoalition) +end +return nil +end +function POSITIONABLE:MessageTypeToCoalition(Message,MessageType,MessageCoalition,Name) +self:F2({Message,MessageType}) +local Name=Name or"" +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessageType(Message,MessageType,Name):ToCoalition(MessageCoalition) +end +return nil +end +function POSITIONABLE:MessageToRed(Message,Duration,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToRed() +end +return nil +end +function POSITIONABLE:MessageToBlue(Message,Duration,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToBlue() +end +return nil +end +function POSITIONABLE:MessageToClient(Message,Duration,Client,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToClient(Client) +end +return nil +end +function POSITIONABLE:MessageToUnit(Message,Duration,MessageUnit,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +if MessageUnit:IsAlive()then +self:GetMessage(Message,Duration,Name):ToUnit(MessageUnit) +else +BASE:E({"Message not sent to Unit; Unit is not alive...",Message=Message,MessageUnit=MessageUnit}) +end +else +BASE:E({"Message not sent to Unit; Positionable is not alive ...",Message=Message,Positionable=self,MessageUnit=MessageUnit}) +end +end +end +function POSITIONABLE:MessageToGroup(Message,Duration,MessageGroup,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +if MessageGroup:IsAlive()then +self:GetMessage(Message,Duration,Name):ToGroup(MessageGroup) +else +BASE:E({"Message not sent to Group; Group is not alive...",Message=Message,MessageGroup=MessageGroup}) +end +else +BASE:E({ +"Message not sent to Group; Positionable is not alive ...", +Message=Message, +Positionable=self, +MessageGroup=MessageGroup +}) +end +end +return nil +end +function POSITIONABLE:MessageToUnit(Message,Duration,MessageUnit,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +if MessageUnit:IsAlive()then +self:GetMessage(Message,Duration,Name):ToUnit(MessageUnit) +else +BASE:E({"Message not sent to Unit; Unit is not alive...",Message=Message,MessageUnit=MessageUnit}) +end +else +BASE:E({"Message not sent to Unit; Positionable is not alive ...",Message=Message,Positionable=self,MessageUnit=MessageUnit}) +end +end +return nil +end +function POSITIONABLE:MessageTypeToGroup(Message,MessageType,MessageGroup,Name) +self:F2({Message,MessageType}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +self:GetMessageType(Message,MessageType,Name):ToGroup(MessageGroup) +end +end +return nil +end +function POSITIONABLE:MessageToSetGroup(Message,Duration,MessageSetGroup,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +MessageSetGroup:ForEachGroupAlive(function(MessageGroup) +self:GetMessage(Message,Duration,Name):ToGroup(MessageGroup) +end) +end +end +return nil +end +function POSITIONABLE:MessageToSetUnit(Message,Duration,MessageSetUnit,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +MessageSetUnit:ForEachUnit( +function(MessageGroup) +self:GetMessage(Message,Duration,Name):ToUnit(MessageGroup) +end +) +end +end +return nil +end +function POSITIONABLE:MessageToSetUnit(Message,Duration,MessageSetUnit,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:isExist()then +MessageSetUnit:ForEachUnit( +function(MessageGroup) +self:GetMessage(Message,Duration,Name):ToUnit(MessageGroup) +end +) +end +end +return nil +end +function POSITIONABLE:Message(Message,Duration,Name) +self:F2({Message,Duration}) +local DCSObject=self:GetDCSObject() +if DCSObject then +self:GetMessage(Message,Duration,Name):ToGroup(self) +end +return nil +end +function POSITIONABLE:GetRadio() +self:F2(self) +return RADIO:New(self) +end +function POSITIONABLE:GetBeacon() +self:F2(self) +return BEACON:New(self) +end +function POSITIONABLE:LaseUnit(Target,LaserCode,Duration) +self:F2() +LaserCode=LaserCode or math.random(1000,9999) +local RecceDcsUnit=self:GetDCSObject() +local TargetVec3=Target:GetVec3() +self:F("building spot") +self.Spot=SPOT:New(self) +self.Spot:LaseOn(Target,LaserCode,Duration) +self.LaserCode=LaserCode +return self.Spot +end +function POSITIONABLE:LaseCoordinate(Coordinate,LaserCode,Duration) +self:F2() +LaserCode=LaserCode or math.random(1000,9999) +self.Spot=SPOT:New(self) +self.Spot:LaseOnCoordinate(Coordinate,LaserCode,Duration) +self.LaserCode=LaserCode +return self.Spot +end +function POSITIONABLE:LaseOff() +self:F2() +if self.Spot then +self.Spot:LaseOff() +self.Spot=nil +end +return self +end +function POSITIONABLE:IsLasing() +self:F2() +local Lasing=false +if self.Spot then +Lasing=self.Spot:IsLasing() +end +return Lasing +end +function POSITIONABLE:GetSpot() +return self.Spot +end +function POSITIONABLE:GetLaserCode() +return self.LaserCode +end +do +function POSITIONABLE:AddCargo(Cargo) +self.__.Cargo[Cargo]=Cargo +return self +end +function POSITIONABLE:GetCargo() +return self.__.Cargo +end +function POSITIONABLE:RemoveCargo(Cargo) +self.__.Cargo[Cargo]=nil +return self +end +function POSITIONABLE:HasCargo(Cargo) +return self.__.Cargo[Cargo] +end +function POSITIONABLE:ClearCargo() +self.__.Cargo={} +end +function POSITIONABLE:IsCargoEmpty() +local IsEmpty=true +for _,Cargo in pairs(self.__.Cargo)do +IsEmpty=false +break +end +return IsEmpty +end +function POSITIONABLE:CargoItemCount() +local ItemCount=0 +for CargoName,Cargo in pairs(self.__.Cargo)do +ItemCount=ItemCount+Cargo:GetCount() +end +return ItemCount +end +function POSITIONABLE:GetTroopCapacity() +local DCSunit=self:GetDCSObject() +local capacity=DCSunit:getDescentCapacity() +return capacity +end +function POSITIONABLE:GetCargoBayFreeWeight() +if not self.__.CargoBayWeightLimit then +self:SetCargoBayWeightLimit() +end +local CargoWeight=0 +for CargoName,Cargo in pairs(self.__.Cargo)do +CargoWeight=CargoWeight+Cargo:GetWeight() +end +return self.__.CargoBayWeightLimit-CargoWeight +end +POSITIONABLE.DefaultInfantryWeight=95 +POSITIONABLE.CargoBayCapacityValues={ +["Air"]={ +["C_130"]=70000, +}, +["Naval"]={ +["Type_071"]=245000, +["LHA_Tarawa"]=500000, +["Ropucha_class"]=150000, +["Dry_cargo_ship_1"]=70000, +["Dry_cargo_ship_2"]=70000, +["Higgins_boat"]=3700, +["USS_Samuel_Chase"]=25000, +["LST_Mk2"]=2100000, +["speedboat"]=500, +["Seawise_Giant"]=261000000, +}, +["Ground"]={ +["AAV7"]=25*POSITIONABLE.DefaultInfantryWeight, +["Bedford_MWD"]=8*POSITIONABLE.DefaultInfantryWeight, +["Blitz_36_6700A"]=10*POSITIONABLE.DefaultInfantryWeight, +["BMD_1"]=9*POSITIONABLE.DefaultInfantryWeight, +["BMP_1"]=8*POSITIONABLE.DefaultInfantryWeight, +["BMP_2"]=7*POSITIONABLE.DefaultInfantryWeight, +["BMP_3"]=8*POSITIONABLE.DefaultInfantryWeight, +["Boman"]=25*POSITIONABLE.DefaultInfantryWeight, +["BTR_80"]=9*POSITIONABLE.DefaultInfantryWeight, +["BTR_82A"]=9*POSITIONABLE.DefaultInfantryWeight, +["BTR_D"]=12*POSITIONABLE.DefaultInfantryWeight, +["Cobra"]=8*POSITIONABLE.DefaultInfantryWeight, +["Land_Rover_101_FC"]=11*POSITIONABLE.DefaultInfantryWeight, +["Land_Rover_109_S3"]=7*POSITIONABLE.DefaultInfantryWeight, +["LAV_25"]=6*POSITIONABLE.DefaultInfantryWeight, +["M_2_Bradley"]=6*POSITIONABLE.DefaultInfantryWeight, +["M1043_HMMWV_Armament"]=4*POSITIONABLE.DefaultInfantryWeight, +["M1045_HMMWV_TOW"]=4*POSITIONABLE.DefaultInfantryWeight, +["M1126_Stryker_ICV"]=9*POSITIONABLE.DefaultInfantryWeight, +["M1134_Stryker_ATGM"]=9*POSITIONABLE.DefaultInfantryWeight, +["M2A1_halftrack"]=9*POSITIONABLE.DefaultInfantryWeight, +["M_113"]=9*POSITIONABLE.DefaultInfantryWeight, +["Marder"]=6*POSITIONABLE.DefaultInfantryWeight, +["MCV_80"]=9*POSITIONABLE.DefaultInfantryWeight, +["MLRS_FDDM"]=4*POSITIONABLE.DefaultInfantryWeight, +["MTLB"]=25*POSITIONABLE.DefaultInfantryWeight, +["GAZ_66"]=8*POSITIONABLE.DefaultInfantryWeight, +["GAZ_3307"]=12*POSITIONABLE.DefaultInfantryWeight, +["GAZ_3308"]=14*POSITIONABLE.DefaultInfantryWeight, +["Grad_FDDM"]=6*POSITIONABLE.DefaultInfantryWeight, +["KAMAZ_Truck"]=12*POSITIONABLE.DefaultInfantryWeight, +["KrAZ6322"]=12*POSITIONABLE.DefaultInfantryWeight, +["M_818"]=12*POSITIONABLE.DefaultInfantryWeight, +["Tigr_233036"]=6*POSITIONABLE.DefaultInfantryWeight, +["TPZ"]=10*POSITIONABLE.DefaultInfantryWeight, +["UAZ_469"]=4*POSITIONABLE.DefaultInfantryWeight, +["Ural_375"]=12*POSITIONABLE.DefaultInfantryWeight, +["Ural_4320_31"]=14*POSITIONABLE.DefaultInfantryWeight, +["Ural_4320_APA_5D"]=10*POSITIONABLE.DefaultInfantryWeight, +["Ural_4320T"]=14*POSITIONABLE.DefaultInfantryWeight, +["ZBD04A"]=7*POSITIONABLE.DefaultInfantryWeight, +["VAB_Mephisto"]=8*POSITIONABLE.DefaultInfantryWeight, +["tt_KORD"]=6*POSITIONABLE.DefaultInfantryWeight, +["tt_DSHK"]=6*POSITIONABLE.DefaultInfantryWeight, +["HL_KORD"]=6*POSITIONABLE.DefaultInfantryWeight, +["HL_DSHK"]=6*POSITIONABLE.DefaultInfantryWeight, +["CCKW_353"]=16*POSITIONABLE.DefaultInfantryWeight, +["MaxxPro_MRAP"]=7*POSITIONABLE.DefaultInfantryWeight, +} +} +function POSITIONABLE:SetCargoBayWeightLimit(WeightLimit) +if WeightLimit then +self.__.CargoBayWeightLimit=WeightLimit +elseif self.__.CargoBayWeightLimit~=nil then +else +local Desc=self:GetDesc() +self:F({Desc=Desc}) +local TypeName=Desc.typeName or"Unknown Type" +TypeName=string.gsub(TypeName,"[%p%s]","_") +if self:IsAir()then +local Weights=POSITIONABLE.CargoBayCapacityValues.Air +local massMax=Desc.massMax or 0 +local maxTakeoff=Weights[TypeName] +if maxTakeoff then +massMax=maxTakeoff +end +local massEmpty=Desc.massEmpty or 0 +local massFuelMax=Desc.fuelMassMax or 0 +local relFuel=math.min(self:GetFuel()or 1.0,1.0) +local massFuel=massFuelMax*relFuel +local CargoWeight=massMax-(massEmpty+massFuel) +self:T(string.format("Setting Cargo bay weight limit [%s]=%d kg (Mass max=%d, empty=%d, fuelMax=%d kg (rel=%.3f), fuel=%d kg",TypeName,CargoWeight,massMax,massEmpty,massFuelMax,relFuel,massFuel)) +self.__.CargoBayWeightLimit=CargoWeight +elseif self:IsShip()then +local Weights=POSITIONABLE.CargoBayCapacityValues.Naval +self.__.CargoBayWeightLimit=(Weights[TypeName]or 50000) +else +local Weights=POSITIONABLE.CargoBayCapacityValues.Ground +local CargoBayWeightLimit=(Weights[TypeName]or 0) +self.__.CargoBayWeightLimit=CargoBayWeightLimit +end +end +self:F({CargoBayWeightLimit=self.__.CargoBayWeightLimit}) +end +function POSITIONABLE:GetCargoBayWeightLimit() +if self.__.CargoBayWeightLimit==nil then +self:SetCargoBayWeightLimit() +end +return self.__.CargoBayWeightLimit +end +end +function POSITIONABLE:Flare(FlareColor) +self:F2() +trigger.action.signalFlare(self:GetVec3(),FlareColor,0) +end +function POSITIONABLE:FlareWhite() +self:F2() +trigger.action.signalFlare(self:GetVec3(),trigger.flareColor.White,0) +end +function POSITIONABLE:FlareYellow() +self:F2() +trigger.action.signalFlare(self:GetVec3(),trigger.flareColor.Yellow,0) +end +function POSITIONABLE:FlareGreen() +self:F2() +trigger.action.signalFlare(self:GetVec3(),trigger.flareColor.Green,0) +end +function POSITIONABLE:FlareRed() +self:F2() +local Vec3=self:GetVec3() +if Vec3 then +trigger.action.signalFlare(Vec3,trigger.flareColor.Red,0) +end +end +function POSITIONABLE:Smoke(SmokeColor,Range,AddHeight) +self:F2() +if Range then +local Vec3=self:GetRandomVec3(Range) +Vec3.y=Vec3.y+AddHeight or 0 +trigger.action.smoke(Vec3,SmokeColor) +else +local Vec3=self:GetVec3() +Vec3.y=Vec3.y+AddHeight or 0 +trigger.action.smoke(self:GetVec3(),SmokeColor) +end +end +function POSITIONABLE:SmokeGreen() +self:F2() +trigger.action.smoke(self:GetVec3(),trigger.smokeColor.Green) +end +function POSITIONABLE:SmokeRed() +self:F2() +trigger.action.smoke(self:GetVec3(),trigger.smokeColor.Red) +end +function POSITIONABLE:SmokeWhite() +self:F2() +trigger.action.smoke(self:GetVec3(),trigger.smokeColor.White) +end +function POSITIONABLE:SmokeOrange() +self:F2() +trigger.action.smoke(self:GetVec3(),trigger.smokeColor.Orange) +end +function POSITIONABLE:SmokeBlue() +self:F2() +trigger.action.smoke(self:GetVec3(),trigger.smokeColor.Blue) +end +function POSITIONABLE:IsInZone(Zone) +self:F2({self.PositionableName,Zone}) +if self:IsAlive()then +local IsInZone=Zone:IsVec3InZone(self:GetVec3()) +return IsInZone +end +return false +end +function POSITIONABLE:IsNotInZone(Zone) +self:F2({self.PositionableName,Zone}) +if self:IsAlive()then +local IsNotInZone=not Zone:IsVec3InZone(self:GetVec3()) +return IsNotInZone +else +return false +end +end +CONTROLLABLE={ +ClassName="CONTROLLABLE", +ControllableName="", +WayPointFunctions={}, +} +function CONTROLLABLE:New(ControllableName) +local self=BASE:Inherit(self,POSITIONABLE:New(ControllableName)) +self.ControllableName=ControllableName +self.TaskScheduler=SCHEDULER:New(self) +return self +end +function CONTROLLABLE:_GetController() +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local ControllableController=DCSControllable:getController() +return ControllableController +end +return nil +end +function CONTROLLABLE:GetLife() +self:F2(self.ControllableName) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local UnitLife=0 +local Units=self:GetUnits() +if#Units==1 then +local Unit=Units[1] +UnitLife=Unit:GetLife() +else +local UnitLifeTotal=0 +for UnitID,Unit in pairs(Units)do +local Unit=Unit +UnitLifeTotal=UnitLifeTotal+Unit:GetLife() +end +UnitLife=UnitLifeTotal/#Units +end +return UnitLife +end +return nil +end +function CONTROLLABLE:GetLife0() +self:F2(self.ControllableName) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local UnitLife=0 +local Units=self:GetUnits() +if#Units==1 then +local Unit=Units[1] +UnitLife=Unit:GetLife0() +else +local UnitLifeTotal=0 +for UnitID,Unit in pairs(Units)do +local Unit=Unit +UnitLifeTotal=UnitLifeTotal+Unit:GetLife0() +end +UnitLife=UnitLifeTotal/#Units +end +return UnitLife +end +return nil +end +function CONTROLLABLE:GetFuelMin() +self:F(self.ControllableName) +return nil +end +function CONTROLLABLE:GetFuelAve() +self:F(self.ControllableName) +return nil +end +function CONTROLLABLE:GetFuel() +self:F(self.ControllableName) +return nil +end +function CONTROLLABLE:ClearTasks() +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +Controller:resetTask() +return self +end +return nil +end +function CONTROLLABLE:PopCurrentTask() +self:F2() +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +Controller:popTask() +return self +end +return nil +end +function CONTROLLABLE:PushTask(DCSTask,WaitTime) +self:F2() +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local DCSControllableName=self:GetName() +local function PushTask(Controller,DCSTask) +if self and self:IsAlive()then +local Controller=self:_GetController() +Controller:pushTask(DCSTask) +else +BASE:E({DCSControllableName.." is not alive anymore.",DCSTask=DCSTask}) +end +end +if not WaitTime or WaitTime==0 then +PushTask(self,DCSTask) +else +self.TaskScheduler:Schedule(self,PushTask,{DCSTask},WaitTime) +end +return self +end +return nil +end +function CONTROLLABLE:SetTask(DCSTask,WaitTime) +self:F({"SetTask",WaitTime,DCSTask=DCSTask}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local DCSControllableName=self:GetName() +self:T2("Controllable Name = "..DCSControllableName) +local function SetTask(Controller,DCSTask) +if self and self:IsAlive()then +local Controller=self:_GetController() +Controller:setTask(DCSTask) +self:T({ControllableName=self:GetName(),DCSTask=DCSTask}) +else +BASE:E({DCSControllableName.." is not alive anymore.",DCSTask=DCSTask}) +end +end +if not WaitTime or WaitTime==0 then +SetTask(self,DCSTask) +self:T({ControllableName=self:GetName(),DCSTask=DCSTask}) +else +self.TaskScheduler:Schedule(self,SetTask,{DCSTask},WaitTime) +end +return self +end +return nil +end +function CONTROLLABLE:HasTask() +local HasTaskResult=false +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +HasTaskResult=Controller:hasTask() +end +return HasTaskResult +end +function CONTROLLABLE:TaskCondition(time,userFlag,userFlagValue,condition,duration,lastWayPoint) +local DCSStopCondition={} +DCSStopCondition.time=time +DCSStopCondition.userFlag=userFlag +DCSStopCondition.userFlagValue=userFlagValue +DCSStopCondition.condition=condition +DCSStopCondition.duration=duration +DCSStopCondition.lastWayPoint=lastWayPoint +return DCSStopCondition +end +function CONTROLLABLE:TaskControlled(DCSTask,DCSStopCondition) +local DCSTaskControlled={ +id='ControlledTask', +params={ +task=DCSTask, +stopCondition=DCSStopCondition, +}, +} +return DCSTaskControlled +end +function CONTROLLABLE:TaskCombo(DCSTasks) +local DCSTaskCombo={ +id='ComboTask', +params={ +tasks=DCSTasks, +}, +} +return DCSTaskCombo +end +function CONTROLLABLE:TaskWrappedAction(DCSCommand,Index) +local DCSTaskWrappedAction={ +id="WrappedAction", +enabled=true, +number=Index or 1, +auto=false, +params={ +action=DCSCommand, +}, +} +return DCSTaskWrappedAction +end +function CONTROLLABLE:TaskEmptyTask() +local DCSTaskWrappedAction={ +["id"]="WrappedAction", +["params"]={ +["action"]={ +["id"]="Script", +["params"]={ +["command"]="", +}, +}, +}, +} +return DCSTaskWrappedAction +end +function CONTROLLABLE:SetTaskWaypoint(Waypoint,Task) +Waypoint.task=self:TaskCombo({Task}) +self:F({Waypoint.task}) +return Waypoint.task +end +function CONTROLLABLE:SetCommand(DCSCommand) +self:F2(DCSCommand) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +Controller:setCommand(DCSCommand) +return self +end +return nil +end +function CONTROLLABLE:CommandSwitchWayPoint(FromWayPoint,ToWayPoint) +self:F2({FromWayPoint,ToWayPoint}) +local CommandSwitchWayPoint={ +id='SwitchWaypoint', +params={ +fromWaypointIndex=FromWayPoint, +goToWaypointIndex=ToWayPoint, +}, +} +self:T3({CommandSwitchWayPoint}) +return CommandSwitchWayPoint +end +function CONTROLLABLE:CommandStopRoute(StopRoute) +self:F2({StopRoute}) +local CommandStopRoute={ +id='StopRoute', +params={ +value=StopRoute, +}, +} +self:T3({CommandStopRoute}) +return CommandStopRoute +end +function CONTROLLABLE:StartUncontrolled(delay) +if delay and delay>0 then +SCHEDULER:New(nil,CONTROLLABLE.StartUncontrolled,{self},delay) +else +self:SetCommand({id='Start',params={}}) +end +return self +end +function CONTROLLABLE:CommandActivateBeacon(Type,System,Frequency,UnitID,Channel,ModeChannel,AA,Callsign,Bearing,Delay) +AA=AA or self:IsAir() +UnitID=UnitID or self:GetID() +local CommandActivateBeacon={ +id="ActivateBeacon", +params={ +["type"]=Type, +["system"]=System, +["frequency"]=Frequency, +["unitId"]=UnitID, +["channel"]=Channel, +["modeChannel"]=ModeChannel, +["AA"]=AA, +["callsign"]=Callsign, +["bearing"]=Bearing, +}, +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandActivateBeacon,{self,Type,System,Frequency,UnitID,Channel,ModeChannel,AA,Callsign,Bearing},Delay) +else +self:SetCommand(CommandActivateBeacon) +end +return self +end +function CONTROLLABLE:CommandActivateACLS(UnitID,Name,Delay) +local CommandActivateACLS={ +id='ActivateACLS', +params={ +unitId=UnitID or self:GetID(), +name=Name or"ACL", +} +} +self:T({CommandActivateACLS}) +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandActivateACLS,{self,UnitID,Name},Delay) +else +local controller=self:_GetController() +controller:setCommand(CommandActivateACLS) +end +return self +end +function CONTROLLABLE:CommandDeactivateACLS(Delay) +local CommandDeactivateACLS={ +id='DeactivateACLS', +params={} +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandDeactivateACLS,{self},Delay) +else +local controller=self:_GetController() +controller:setCommand(CommandDeactivateACLS) +end +return self +end +function CONTROLLABLE:CommandActivateICLS(Channel,UnitID,Callsign,Delay) +local CommandActivateICLS={ +id="ActivateICLS", +params={ +["type"]=BEACON.Type.ICLS, +["channel"]=Channel, +["unitId"]=UnitID or self:GetID(), +["callsign"]=Callsign, +}, +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandActivateICLS,{self,Channel,UnitID,Callsign},Delay) +else +self:SetCommand(CommandActivateICLS) +end +return self +end +function CONTROLLABLE:CommandActivateLink4(Frequency,UnitID,Callsign,Delay) +local freq=Frequency or 336 +local CommandActivateLink4={ +id="ActivateLink4", +params={ +["frequency"]=freq*1000000, +["unitId"]=UnitID or self:GetID(), +["name"]=Callsign or"LNK", +} +} +self:T({CommandActivateLink4}) +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandActivateLink4,{self,Frequency,UnitID,Callsign},Delay) +else +local controller=self:_GetController() +controller:setCommand(CommandActivateLink4) +end +return self +end +function CONTROLLABLE:CommandDeactivateBeacon(Delay) +local CommandDeactivateBeacon={id='DeactivateBeacon',params={}} +local CommandDeactivateBeacon={id='DeactivateBeacon',params={}} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandDeactivateBeacon,{self},Delay) +else +self:SetCommand(CommandDeactivateBeacon) +end +return self +end +function CONTROLLABLE:CommandDeactivateLink4(Delay) +local CommandDeactivateLink4={id='DeactivateLink4',params={}} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandDeactivateLink4,{self},Delay) +else +local controller=self:_GetController() +controller:setCommand(CommandDeactivateLink4) +end +return self +end +function CONTROLLABLE:CommandDeactivateICLS(Delay) +local CommandDeactivateICLS={id='DeactivateICLS',params={}} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandDeactivateICLS,{self},Delay) +else +self:SetCommand(CommandDeactivateICLS) +end +return self +end +function CONTROLLABLE:CommandSetCallsign(CallName,CallNumber,Delay) +local CommandSetCallsign={id='SetCallsign',params={callname=CallName,number=CallNumber or 1}} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSetCallsign,{self,CallName,CallNumber},Delay) +else +self:SetCommand(CommandSetCallsign) +end +return self +end +function CONTROLLABLE:CommandEPLRS(SwitchOnOff,Delay) +if SwitchOnOff==nil then +SwitchOnOff=true +end +local CommandEPLRS={ +id='EPLRS', +params={ +value=SwitchOnOff, +groupId=self:GetID(), +}, +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandEPLRS,{self,SwitchOnOff},Delay) +else +self:T(string.format("EPLRS=%s for controllable %s (id=%s)",tostring(SwitchOnOff),tostring(self:GetName()),tostring(self:GetID()))) +self:SetCommand(CommandEPLRS) +end +return self +end +function CONTROLLABLE:CommandSetUnlimitedFuel(OnOff,Delay) +local CommandSetFuel={ +id='SetUnlimitedFuel', +params={ +value=OnOff +} +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSetUnlimitedFuel,{self,OnOff},Delay) +else +self:SetCommand(CommandSetFuel) +end +return self +end +function CONTROLLABLE:CommandSetFrequency(Frequency,Modulation,Power,Delay) +local CommandSetFrequency={ +id='SetFrequency', +params={ +frequency=Frequency*1000000, +modulation=Modulation or radio.modulation.AM, +power=Power or 10, +}, +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSetFrequency,{self,Frequency,Modulation,Power},Delay) +else +self:SetCommand(CommandSetFrequency) +end +return self +end +function CONTROLLABLE:CommandSetFrequencyForUnit(Frequency,Modulation,Power,UnitID,Delay) +local CommandSetFrequencyForUnit={ +id='SetFrequencyForUnit', +params={ +frequency=Frequency*1000000, +modulation=Modulation or radio.modulation.AM, +unitId=UnitID or self:GetID(), +power=Power or 10, +}, +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSetFrequencyForUnit,{self,Frequency,Modulation,Power,UnitID},Delay) +else +self:SetCommand(CommandSetFrequencyForUnit) +end +return self +end +function CONTROLLABLE:CommandSmokeOnOff(OnOff,Delay) +local switch=(OnOff==nil)and true or OnOff +local command={ +id='SMOKE_ON_OFF', +params={ +value=switch +} +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSmokeOnOff,{self,switch},Delay) +else +self:SetCommand(command) +end +return self +end +function CONTROLLABLE:CommandSmokeON(Delay) +local command={ +id='SMOKE_ON_OFF', +params={ +value=true +} +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSmokeON,{self},Delay) +else +self:SetCommand(command) +end +return self +end +function CONTROLLABLE:CommandSmokeOFF(Delay) +local command={ +id='SMOKE_ON_OFF', +params={ +value=false +} +} +if Delay and Delay>0 then +SCHEDULER:New(nil,self.CommandSmokeOFF,{self},Delay) +else +self:SetCommand(command) +end +return self +end +function CONTROLLABLE:TaskEPLRS(SwitchOnOff,idx) +if SwitchOnOff==nil then +SwitchOnOff=true +end +local CommandEPLRS={ +id='EPLRS', +params={ +value=SwitchOnOff, +groupId=self:GetID(), +}, +} +return self:TaskWrappedAction(CommandEPLRS,idx or 1) +end +function CONTROLLABLE:TaskAttackGroup(AttackGroup,WeaponType,WeaponExpend,AttackQty,Direction,Altitude,AttackQtyLimit,GroupAttack) +local DCSTask={id='AttackGroup', +params={ +groupId=AttackGroup:GetID(), +weaponType=WeaponType or 1073741822, +expend=WeaponExpend or"Auto", +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty or 1, +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or 0, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +groupAttack=GroupAttack and true or false, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskAttackUnit(AttackUnit,GroupAttack,WeaponExpend,AttackQty,Direction,Altitude,WeaponType) +local DCSTask={ +id='AttackUnit', +params={ +unitId=AttackUnit:GetID(), +groupAttack=GroupAttack and GroupAttack or false, +expend=WeaponExpend or"Auto", +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or 0, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty, +weaponType=WeaponType or 1073741822, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskBombing(Vec2,GroupAttack,WeaponExpend,AttackQty,Direction,Altitude,WeaponType,Divebomb) +local DCSTask={ +id='Bombing', +params={ +point=Vec2, +x=Vec2.x, +y=Vec2.y, +groupAttack=GroupAttack and GroupAttack or false, +expend=WeaponExpend or"Auto", +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty or 1, +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or 0, +altitudeEnabled=Altitude and true or false, +altitude=Altitude or 2000, +weaponType=WeaponType or 1073741822, +attackType=Divebomb and"Dive"or nil, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskStrafing(Vec2,AttackQty,Length,WeaponType,WeaponExpend,Direction,GroupAttack) +local DCSTask={ +id='Strafing', +params={ +point=Vec2, +weaponType=WeaponType or 805337088, +expend=WeaponExpend or"Auto", +attackQty=AttackQty or 1, +attackQtyLimit=AttackQty~=nil and true or false, +direction=Direction and math.rad(Direction)or 0, +directionEnabled=Direction and true or false, +groupAttack=GroupAttack or false, +length=Length, +} +} +return DCSTask +end +function CONTROLLABLE:TaskAttackMapObject(Vec2,GroupAttack,WeaponExpend,AttackQty,Direction,Altitude,WeaponType) +local DCSTask={ +id='AttackMapObject', +params={ +point=Vec2, +x=Vec2.x, +y=Vec2.y, +groupAttack=GroupAttack or false, +expend=WeaponExpend or"Auto", +attackQtyLimit=AttackQty and true or false, +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or 0, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +weaponType=WeaponType or 1073741822, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskCarpetBombing(Vec2,GroupAttack,WeaponExpend,AttackQty,Direction,Altitude,WeaponType,CarpetLength) +local DCSTask={ +id='CarpetBombing', +params={ +attackType="Carpet", +x=Vec2.x, +y=Vec2.y, +groupAttack=GroupAttack and GroupAttack or false, +carpetLength=CarpetLength or 500, +weaponType=WeaponType or ENUMS.WeaponFlag.AnyBomb, +expend=WeaponExpend or"All", +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty or 1, +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or 0, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskFollowBigFormation(FollowControllable,Vec3,LastWaypointIndex) +local DCSTask={ +id='FollowBigFormation', +params={ +groupId=FollowControllable:GetID(), +pos=Vec3, +lastWptIndexFlag=LastWaypointIndex and true or false, +lastWptIndex=LastWaypointIndex, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskEmbarking(Coordinate,GroupSetForEmbarking,Duration,Distribution) +local g4e={} +if GroupSetForEmbarking then +for _,_group in pairs(GroupSetForEmbarking:GetSet())do +local group=_group +table.insert(g4e,group:GetID()) +end +else +self:E("ERROR: No groups for embarking specified!") +return nil +end +local groupID=self and self:GetID() +local DCSTask={ +id='Embarking', +params={ +selectedTransport=groupID, +x=Coordinate.x, +y=Coordinate.z, +groupsForEmbarking=g4e, +durationFlag=Duration and true or false, +duration=Duration, +distributionFlag=Distribution and true or false, +distribution=Distribution, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskEmbarkToTransport(Coordinate,Radius,UnitType) +local EmbarkToTransport={ +id="EmbarkToTransport", +params={ +x=Coordinate.x, +y=Coordinate.z, +zoneRadius=Radius or 200, +selectedType=UnitType, +}, +} +return EmbarkToTransport +end +function CONTROLLABLE:TaskDisembarking(Coordinate,GroupSetToDisembark) +local g4e={} +if GroupSetToDisembark then +for _,_group in pairs(GroupSetToDisembark:GetSet())do +local group=_group +table.insert(g4e,group:GetID()) +end +else +self:E("ERROR: No groups for disembarking specified!") +return nil +end +local Disembarking={ +id="Disembarking", +params={ +x=Coordinate.x, +y=Coordinate.z, +groupsForEmbarking=g4e, +}, +} +return Disembarking +end +function CONTROLLABLE:TaskOrbitCircleAtVec2(Point,Altitude,Speed) +local DCSTask={ +id='Orbit', +params={ +pattern=AI.Task.OrbitPattern.CIRCLE, +point=Point, +speed=Speed, +altitude=Altitude+land.getHeight(Point), +}, +} +return DCSTask +end +function CONTROLLABLE:TaskOrbit(Coord,Altitude,Speed,CoordRaceTrack) +local Pattern=AI.Task.OrbitPattern.CIRCLE +local P1={x=Coord.x,y=Coord.z or Coord.y} +local P2=nil +if CoordRaceTrack then +Pattern=AI.Task.OrbitPattern.RACE_TRACK +P2={x=CoordRaceTrack.x,y=CoordRaceTrack.z or CoordRaceTrack.y} +end +local Task={ +id='Orbit', +params={ +pattern=Pattern, +point=P1, +point2=P2, +speed=Speed or UTILS.KnotsToMps(250), +altitude=Altitude or Coord.y, +}, +} +return Task +end +function CONTROLLABLE:TaskOrbitCircle(Altitude,Speed,Coordinate) +self:F2({self.ControllableName,Altitude,Speed}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local OrbitVec2=Coordinate and Coordinate:GetVec2()or self:GetVec2() +return self:TaskOrbitCircleAtVec2(OrbitVec2,Altitude,Speed) +end +return nil +end +function CONTROLLABLE:TaskHoldPosition() +self:F2({self.ControllableName}) +return self:TaskOrbitCircle(30,10) +end +function CONTROLLABLE:TaskBombingRunway(Airbase,WeaponType,WeaponExpend,AttackQty,Direction,GroupAttack) +local DCSTask={ +id='BombingRunway', +params={ +runwayId=Airbase:GetID(), +weaponType=WeaponType or ENUMS.WeaponFlag.AnyBomb, +expend=WeaponExpend or AI.Task.WeaponExpend.ALL, +attackQty=AttackQty or 1, +direction=Direction and math.rad(Direction)or 0, +groupAttack=GroupAttack and true or false, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskRefueling() +local DCSTask={ +id='Refueling', +params={}, +} +return DCSTask +end +function CONTROLLABLE:TaskRecoveryTanker(CarrierGroup,Speed,Altitude,LastWptNumber) +local LastWptFlag=type(LastWptNumber)=="number"and true or false +local DCSTask={ +id="RecoveryTanker", +params={ +groupId=CarrierGroup:GetID(), +speed=Speed, +altitude=Altitude, +lastWptIndexFlag=LastWptFlag, +lastWptIndex=LastWptNumber +} +} +return DCSTask +end +function CONTROLLABLE:TaskLandAtVec2(Vec2,Duration,CombatLanding,DirectionAfterLand) +local DCSTask={ +id='Land', +params={ +point=Vec2, +durationFlag=Duration and true or false, +duration=Duration, +combatLandingFlag=CombatLanding==true and true or false, +}, +} +if DirectionAfterLand~=nil and type(DirectionAfterLand)=="number"then +DCSTask.params.directionEnabled=true +DCSTask.params.direction=math.rad(DirectionAfterLand) +end +return DCSTask +end +function CONTROLLABLE:TaskLandAtZone(Zone,Duration,RandomPoint,CombatLanding,DirectionAfterLand) +local Point=RandomPoint and Zone:GetRandomVec2()or Zone:GetVec2() +local DCSTask=CONTROLLABLE.TaskLandAtVec2(self,Point,Duration,CombatLanding,DirectionAfterLand) +return DCSTask +end +function CONTROLLABLE:TaskFollow(FollowControllable,Vec3,LastWaypointIndex) +self:F2({self.ControllableName,FollowControllable,Vec3,LastWaypointIndex}) +local LastWaypointIndexFlag=false +local lastWptIndexFlagChangedManually=false +if LastWaypointIndex then +LastWaypointIndexFlag=true +lastWptIndexFlagChangedManually=true +end +local DCSTask={ +id='Follow', +params={ +groupId=FollowControllable:GetID(), +pos=Vec3, +lastWptIndexFlag=LastWaypointIndexFlag, +lastWptIndex=LastWaypointIndex, +lastWptIndexFlagChangedManually=lastWptIndexFlagChangedManually, +}, +} +self:T3({DCSTask}) +return DCSTask +end +function CONTROLLABLE:TaskGroundEscort(FollowControllable,LastWaypointIndex,OrbitDistance,TargetTypes) +local DCSTask={ +id='GroundEscort', +params={ +groupId=FollowControllable and FollowControllable:GetID()or nil, +engagementDistMax=OrbitDistance or 2000, +lastWptIndexFlag=LastWaypointIndex and true or false, +lastWptIndex=LastWaypointIndex, +targetTypes=TargetTypes or{"Ground vehicles"}, +lastWptIndexFlagChangedManually=true, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskEscort(FollowControllable,Vec3,LastWaypointIndex,EngagementDistance,TargetTypes) +local DCSTask={ +id='Escort', +params={ +groupId=FollowControllable and FollowControllable:GetID()or nil, +pos=Vec3, +lastWptIndexFlag=LastWaypointIndex and true or false, +lastWptIndex=LastWaypointIndex, +engagementDistMax=EngagementDistance, +targetTypes=TargetTypes or{"Air"}, +}, +} +return DCSTask +end +function CONTROLLABLE:TaskFireAtPoint(Vec2,Radius,AmmoCount,WeaponType,Altitude,ASL) +local DCSTask={ +id='FireAtPoint', +params={ +point=Vec2, +x=Vec2.x, +y=Vec2.y, +zoneRadius=Radius, +radius=Radius, +expendQty=1, +expendQtyEnabled=false, +alt_type=ASL and 0 or 1, +}, +} +if AmmoCount then +DCSTask.params.expendQty=AmmoCount +DCSTask.params.expendQtyEnabled=true +end +if Altitude then +DCSTask.params.altitude=Altitude +end +if WeaponType then +DCSTask.params.weaponType=WeaponType +end +return DCSTask +end +function CONTROLLABLE:TaskHold() +local DCSTask={id='Hold',params={}} +return DCSTask +end +function CONTROLLABLE:TaskFAC_AttackGroup(AttackGroup,WeaponType,Designation,Datalink,Frequency,Modulation,CallsignName,CallsignNumber) +local DCSTask={ +id='FAC_AttackGroup', +params={ +groupId=AttackGroup:GetID(), +weaponType=WeaponType or ENUMS.WeaponFlag.AutoDCS, +designation=Designation or"Auto", +datalink=Datalink and Datalink or true, +frequency=(Frequency or 133)*1000000, +modulation=Modulation or radio.modulation.AM, +callname=CallsignName, +number=CallsignNumber, +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskEngageTargets(Distance,TargetTypes,Priority) +local DCSTask={ +id='EngageTargets', +params={ +maxDistEnabled=Distance and true or false, +maxDist=Distance, +targetTypes=TargetTypes or{"Air"}, +priority=Priority or 0, +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskEngageTargetsInZone(Vec2,Radius,TargetTypes,Priority) +local DCSTask={ +id='EngageTargetsInZone', +params={ +point=Vec2, +zoneRadius=Radius, +targetTypes=TargetTypes or{"Air"}, +priority=Priority or 0 +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskAntiShip(TargetTypes,Priority) +local DCSTask={ +id='EngageTargets', +key="AntiShip", +params={ +targetTypes=TargetTypes or{"Ships"}, +priority=Priority or 0 +} +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskSEAD(TargetTypes,Priority) +local DCSTask={ +id='EngageTargets', +key="SEAD", +params={ +targetTypes=TargetTypes or{"Air Defence"}, +priority=Priority or 0 +} +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskCAP(TargetTypes,Priority) +local DCSTask={ +id='EngageTargets', +key="CAP", +enabled=true, +params={ +targetTypes=TargetTypes or{"Air"}, +priority=Priority or 0 +} +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskEngageGroup(AttackGroup,Priority,WeaponType,WeaponExpend,AttackQty,Direction,Altitude,AttackQtyLimit) +local DCSTask={ +id='EngageGroup', +params={ +groupId=AttackGroup:GetID(), +weaponType=WeaponType, +expend=WeaponExpend or"Auto", +directionEnabled=Direction and true or false, +direction=Direction, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty, +priority=Priority or 1, +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskEngageUnit(EngageUnit,Priority,GroupAttack,WeaponExpend,AttackQty,Direction,Altitude,Visible,ControllableAttack) +local DCSTask={ +id='EngageUnit', +params={ +unitId=EngageUnit:GetID(), +priority=Priority or 1, +groupAttack=GroupAttack and GroupAttack or false, +visible=Visible and Visible or false, +expend=WeaponExpend or"Auto", +directionEnabled=Direction and true or false, +direction=Direction and math.rad(Direction)or nil, +altitudeEnabled=Altitude and true or false, +altitude=Altitude, +attackQtyLimit=AttackQty and true or false, +attackQty=AttackQty, +controllableAttack=ControllableAttack, +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskAWACS() +local DCSTask={ +id='AWACS', +params={}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskTanker() +local DCSTask={ +id='Tanker', +params={}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskEWR() +local DCSTask={ +id='EWR', +params={}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskFAC_EngageGroup(AttackGroup,Priority,WeaponType,Designation,Datalink,Frequency,Modulation,CallsignID,CallsignNumber) +local DCSTask={ +id='FAC_EngageGroup', +params={ +groupId=AttackGroup:GetID(), +weaponType=WeaponType or"Auto", +designation=Designation, +datalink=Datalink and Datalink or false, +frequency=(Frequency or 133)*1000000, +modulation=Modulation or radio.modulation.AM, +callname=CallsignID, +number=CallsignNumber, +priority=Priority or 0, +}, +} +return DCSTask +end +function CONTROLLABLE:EnRouteTaskFAC(Frequency,Modulation,CallsignID,CallsignNumber,Priority) +local DCSTask={ +id='FAC', +params={ +frequency=(Frequency or 133)*1000000, +modulation=Modulation or radio.modulation.AM, +callname=CallsignID, +number=CallsignNumber, +priority=Priority or 0 +} +} +return DCSTask +end +function CONTROLLABLE:TaskFunction(FunctionString,...) +local DCSScript={} +DCSScript[#DCSScript+1]="local MissionControllable = GROUP:Find( ... ) " +if arg and arg.n>0 then +local ArgumentKey='_'..tostring(arg):match("table: (.*)") +self:SetState(self,ArgumentKey,arg) +DCSScript[#DCSScript+1]="local Arguments = MissionControllable:GetState( MissionControllable, '"..ArgumentKey.."' ) " +DCSScript[#DCSScript+1]=FunctionString.."( MissionControllable, unpack( Arguments ) )" +else +DCSScript[#DCSScript+1]=FunctionString.."( MissionControllable )" +end +local DCSTask=self:TaskWrappedAction(self:CommandDoScript(table.concat(DCSScript))) +return DCSTask +end +function CONTROLLABLE:TaskMission(TaskMission) +local DCSTask={ +id='Mission', +params={ +TaskMission, +}, +} +return DCSTask +end +do +function CONTROLLABLE:PatrolRoute() +local PatrolGroup=self +if not self:IsInstanceOf("GROUP")then +PatrolGroup=self:GetGroup() +end +self:F({PatrolGroup=PatrolGroup:GetName()}) +if PatrolGroup:IsGround()or PatrolGroup:IsShip()then +local Waypoints=PatrolGroup:GetTemplateRoutePoints() +local FromCoord=PatrolGroup:GetCoordinate() +local depth=0 +local IsSub=false +if PatrolGroup:IsShip()then +local navalvec3=FromCoord:GetVec3() +if navalvec3.y<0 then +depth=navalvec3.y +IsSub=true +end +end +local Waypoint=Waypoints[1] +local Speed=Waypoint.speed or(20/3.6) +local From=FromCoord:WaypointGround(Speed) +if IsSub then +From=FromCoord:WaypointNaval(Speed,Waypoint.alt) +end +table.insert(Waypoints,1,From) +local TaskRoute=PatrolGroup:TaskFunction("CONTROLLABLE.PatrolRoute") +self:F({Waypoints=Waypoints}) +local Waypoint=Waypoints[#Waypoints] +PatrolGroup:SetTaskWaypoint(Waypoint,TaskRoute) +PatrolGroup:Route(Waypoints,2) +end +end +function CONTROLLABLE:PatrolRouteRandom(Speed,Formation,ToWaypoint) +local PatrolGroup=self +if not self:IsInstanceOf("GROUP")then +PatrolGroup=self:GetGroup() +end +self:F({PatrolGroup=PatrolGroup:GetName()}) +if PatrolGroup:IsGround()or PatrolGroup:IsShip()then +local Waypoints=PatrolGroup:GetTemplateRoutePoints() +local FromCoord=PatrolGroup:GetCoordinate() +local FromWaypoint=1 +if ToWaypoint then +FromWaypoint=ToWaypoint +end +local depth=0 +local IsSub=false +if PatrolGroup:IsShip()then +local navalvec3=FromCoord:GetVec3() +if navalvec3.y<0 then +depth=navalvec3.y +IsSub=true +end +end +local ToWaypoint +repeat +ToWaypoint=math.random(1,#Waypoints) +until(ToWaypoint~=FromWaypoint) +self:F({FromWaypoint=FromWaypoint,ToWaypoint=ToWaypoint}) +local Waypoint=Waypoints[ToWaypoint] +local ToCoord=COORDINATE:NewFromVec2({x=Waypoint.x,y=Waypoint.y}) +local Route={} +if IsSub then +Route[#Route+1]=FromCoord:WaypointNaval(Speed,depth) +Route[#Route+1]=ToCoord:WaypointNaval(Speed,Waypoint.alt) +else +Route[#Route+1]=FromCoord:WaypointGround(Speed,Formation) +Route[#Route+1]=ToCoord:WaypointGround(Speed,Formation) +end +local TaskRouteToZone=PatrolGroup:TaskFunction("CONTROLLABLE.PatrolRouteRandom",Speed,Formation,ToWaypoint) +PatrolGroup:SetTaskWaypoint(Route[#Route],TaskRouteToZone) +PatrolGroup:Route(Route,1) +end +end +function CONTROLLABLE:PatrolZones(ZoneList,Speed,Formation,DelayMin,DelayMax) +if type(ZoneList)~="table"then +ZoneList={ZoneList} +end +local PatrolGroup=self +if not self:IsInstanceOf("GROUP")then +PatrolGroup=self:GetGroup() +end +DelayMin=DelayMin or 1 +if not DelayMax or DelayMax<DelayMin then +DelayMax=DelayMin +end +local Delay=math.random(DelayMin,DelayMax) +self:F({PatrolGroup=PatrolGroup:GetName()}) +if PatrolGroup:IsGround()or PatrolGroup:IsShip()then +local FromCoord=PatrolGroup:GetCoordinate() +local depth=0 +local IsSub=false +if PatrolGroup:IsShip()then +local navalvec3=FromCoord:GetVec3() +if navalvec3.y<0 then +depth=navalvec3.y +IsSub=true +end +end +local RandomZone=ZoneList[math.random(1,#ZoneList)] +local ToCoord=RandomZone:GetRandomCoordinate(10) +local Route={} +if IsSub then +Route[#Route+1]=FromCoord:WaypointNaval(Speed,depth) +Route[#Route+1]=ToCoord:WaypointNaval(Speed,depth) +else +Route[#Route+1]=FromCoord:WaypointGround(Speed,Formation) +Route[#Route+1]=ToCoord:WaypointGround(Speed,Formation) +end +local TaskRouteToZone=PatrolGroup:TaskFunction("CONTROLLABLE.PatrolZones",ZoneList,Speed,Formation,DelayMin,DelayMax) +PatrolGroup:SetTaskWaypoint(Route[#Route],TaskRouteToZone) +PatrolGroup:Route(Route,Delay) +end +end +end +function CONTROLLABLE:TaskRoute(Points) +local DCSTask={ +id='Mission', +params={ +airborne=self:IsAir(), +route={points=Points}, +}, +} +return DCSTask +end +do +function CONTROLLABLE:RouteToVec2(Point,Speed) +self:F2({Point,Speed}) +local ControllablePoint=self:GetUnit(1):GetVec2() +local PointFrom={} +PointFrom.x=ControllablePoint.x +PointFrom.y=ControllablePoint.y +PointFrom.type="Turning Point" +PointFrom.action="Turning Point" +PointFrom.speed=Speed +PointFrom.speed_locked=true +PointFrom.properties={ +["vnav"]=1, +["scale"]=0, +["angle"]=0, +["vangle"]=0, +["steer"]=2, +} +local PointTo={} +PointTo.x=Point.x +PointTo.y=Point.y +PointTo.type="Turning Point" +PointTo.action="Fly Over Point" +PointTo.speed=Speed +PointTo.speed_locked=true +PointTo.properties={ +["vnav"]=1, +["scale"]=0, +["angle"]=0, +["vangle"]=0, +["steer"]=2, +} +local Points={PointFrom,PointTo} +self:T3(Points) +self:Route(Points) +return self +end +function CONTROLLABLE:RouteToVec3(Point,Speed) +self:F2({Point,Speed}) +local ControllableVec3=self:GetUnit(1):GetVec3() +local PointFrom={} +PointFrom.x=ControllableVec3.x +PointFrom.y=ControllableVec3.z +PointFrom.alt=ControllableVec3.y +PointFrom.alt_type="BARO" +PointFrom.type="Turning Point" +PointFrom.action="Turning Point" +PointFrom.speed=Speed +PointFrom.speed_locked=true +PointFrom.properties={ +["vnav"]=1, +["scale"]=0, +["angle"]=0, +["vangle"]=0, +["steer"]=2, +} +local PointTo={} +PointTo.x=Point.x +PointTo.y=Point.z +PointTo.alt=Point.y +PointTo.alt_type="BARO" +PointTo.type="Turning Point" +PointTo.action="Fly Over Point" +PointTo.speed=Speed +PointTo.speed_locked=true +PointTo.properties={ +["vnav"]=1, +["scale"]=0, +["angle"]=0, +["vangle"]=0, +["steer"]=2, +} +local Points={PointFrom,PointTo} +self:T3(Points) +self:Route(Points) +return self +end +function CONTROLLABLE:Route(Route,DelaySeconds) +self:F2(Route) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local RouteTask=self:TaskRoute(Route) +self:SetTask(RouteTask,DelaySeconds or 1) +return self +end +return nil +end +function CONTROLLABLE:RoutePush(Route,DelaySeconds) +self:F2(Route) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local RouteTask=self:TaskRoute(Route) +self:PushTask(RouteTask,DelaySeconds or 1) +return self +end +return nil +end +function CONTROLLABLE:RouteStop() +self:F(self:GetName().." RouteStop") +local CommandStop=self:CommandStopRoute(true) +self:SetCommand(CommandStop) +end +function CONTROLLABLE:RouteResume() +self:F(self:GetName().." RouteResume") +local CommandResume=self:CommandStopRoute(false) +self:SetCommand(CommandResume) +end +function CONTROLLABLE:RouteGroundTo(ToCoordinate,Speed,Formation,DelaySeconds,WaypointFunction,WaypointFunctionArguments) +local FromCoordinate=self:GetCoordinate() +local FromWP=FromCoordinate:WaypointGround(Speed,Formation) +local ToWP=ToCoordinate:WaypointGround(Speed,Formation) +local route={FromWP,ToWP} +if WaypointFunction then +local N=#route +for n,waypoint in pairs(route)do +waypoint.task={} +waypoint.task.id="ComboTask" +waypoint.task.params={} +waypoint.task.params.tasks={self:TaskFunction("CONTROLLABLE.___PassingWaypoint",n,N,WaypointFunction,unpack(WaypointFunctionArguments or{}))} +end +end +self:Route(route,DelaySeconds) +return self +end +function CONTROLLABLE:RouteGroundOnRoad(ToCoordinate,Speed,DelaySeconds,OffRoadFormation,WaypointFunction,WaypointFunctionArguments) +Speed=Speed or 20 +DelaySeconds=DelaySeconds or 1 +OffRoadFormation=OffRoadFormation or"Off Road" +local route=self:TaskGroundOnRoad(ToCoordinate,Speed,OffRoadFormation,nil,nil,WaypointFunction,WaypointFunctionArguments) +self:Route(route,DelaySeconds) +return self +end +function CONTROLLABLE:RouteGroundOnRailRoads(ToCoordinate,Speed,DelaySeconds,WaypointFunction,WaypointFunctionArguments) +Speed=Speed or 20 +DelaySeconds=DelaySeconds or 1 +local route=self:TaskGroundOnRailRoads(ToCoordinate,Speed,WaypointFunction,WaypointFunctionArguments) +self:Route(route,DelaySeconds) +return self +end +function CONTROLLABLE:TaskGroundOnRoad(ToCoordinate,Speed,OffRoadFormation,Shortcut,FromCoordinate,WaypointFunction,WaypointFunctionArguments) +self:T({ToCoordinate=ToCoordinate,Speed=Speed,OffRoadFormation=OffRoadFormation,WaypointFunction=WaypointFunction,Args=WaypointFunctionArguments}) +Speed=Speed or 20 +OffRoadFormation=OffRoadFormation or"Off Road" +FromCoordinate=FromCoordinate or self:GetCoordinate() +local PathOnRoad,LengthOnRoad,GotPath=FromCoordinate:GetPathOnRoad(ToCoordinate,true) +local _,LengthRoad=FromCoordinate:GetPathOnRoad(ToCoordinate,false) +local LengthOffRoad +local LongRoad +local LengthDirect=FromCoordinate:Get2DDistance(ToCoordinate) +if GotPath and LengthRoad then +LengthOffRoad=LengthOnRoad-LengthRoad +LongRoad=LengthOnRoad and((LengthOnRoad>LengthDirect*10)or(LengthRoad/LengthOnRoad*100<5)) +self:T(string.format("Length on road = %.3f km",LengthOnRoad/1000)) +self:T(string.format("Length directly = %.3f km",LengthDirect/1000)) +self:T(string.format("Length fraction = %.3f km",LengthOnRoad/LengthDirect)) +self:T(string.format("Length only road = %.3f km",LengthRoad/1000)) +self:T(string.format("Length off road = %.3f km",LengthOffRoad/1000)) +self:T(string.format("Percent on road = %.1f",LengthRoad/LengthOnRoad*100)) +end +local route={} +local canroad=false +if GotPath and LengthRoad and LengthDirect>2000 then +if LongRoad and Shortcut then +table.insert(route,FromCoordinate:WaypointGround(Speed,OffRoadFormation)) +table.insert(route,ToCoordinate:WaypointGround(Speed,OffRoadFormation)) +else +table.insert(route,FromCoordinate:WaypointGround(Speed,OffRoadFormation)) +table.insert(route,PathOnRoad[2]:WaypointGround(Speed,"On Road")) +table.insert(route,PathOnRoad[#PathOnRoad-1]:WaypointGround(Speed,"On Road")) +local dist=ToCoordinate:Get2DDistance(PathOnRoad[#PathOnRoad-1]) +if dist>10 then +table.insert(route,ToCoordinate:WaypointGround(Speed,OffRoadFormation)) +table.insert(route,ToCoordinate:GetRandomCoordinateInRadius(10,5):WaypointGround(5,OffRoadFormation)) +table.insert(route,ToCoordinate:GetRandomCoordinateInRadius(10,5):WaypointGround(5,OffRoadFormation)) +end +end +canroad=true +else +table.insert(route,FromCoordinate:WaypointGround(Speed,OffRoadFormation)) +table.insert(route,ToCoordinate:WaypointGround(Speed,OffRoadFormation)) +end +if WaypointFunction then +local N=#route +for n,waypoint in pairs(route)do +waypoint.task={} +waypoint.task.id="ComboTask" +waypoint.task.params={} +waypoint.task.params.tasks={self:TaskFunction("CONTROLLABLE.___PassingWaypoint",n,N,WaypointFunction,unpack(WaypointFunctionArguments or{}))} +end +end +return route,canroad +end +function CONTROLLABLE:TaskGroundOnRailRoads(ToCoordinate,Speed,WaypointFunction,WaypointFunctionArguments) +self:F2({ToCoordinate=ToCoordinate,Speed=Speed}) +Speed=Speed or 20 +local FromCoordinate=self:GetCoordinate() +local PathOnRail,LengthOnRail=FromCoordinate:GetPathOnRoad(ToCoordinate,false,true) +self:T(string.format("Length on railroad = %.3f km",LengthOnRail/1000)) +local route={} +if PathOnRail then +table.insert(route,PathOnRail[1]:WaypointGround(Speed,"On Railroad")) +table.insert(route,PathOnRail[2]:WaypointGround(Speed,"On Railroad")) +end +if WaypointFunction then +local N=#route +for n,waypoint in pairs(route)do +waypoint.task={} +waypoint.task.id="ComboTask" +waypoint.task.params={} +waypoint.task.params.tasks={self:TaskFunction("CONTROLLABLE.___PassingWaypoint",n,N,WaypointFunction,unpack(WaypointFunctionArguments or{}))} +end +end +return route +end +function CONTROLLABLE.___PassingWaypoint(controllable,n,N,waypointfunction,...) +waypointfunction(controllable,n,N,...) +end +function CONTROLLABLE:RouteAirTo(ToCoordinate,AltType,Type,Action,Speed,DelaySeconds) +local FromCoordinate=self:GetCoordinate() +local FromWP=FromCoordinate:WaypointAir() +local ToWP=ToCoordinate:WaypointAir(AltType,Type,Action,Speed) +self:Route({FromWP,ToWP},DelaySeconds) +return self +end +function CONTROLLABLE:TaskRouteToZone(Zone,Randomize,Speed,Formation) +self:F2(Zone) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local ControllablePoint=self:GetVec2() +local PointFrom={} +PointFrom.x=ControllablePoint.x +PointFrom.y=ControllablePoint.y +PointFrom.type="Turning Point" +PointFrom.action=Formation or"Cone" +PointFrom.speed=20/3.6 +local PointTo={} +local ZonePoint +if Randomize then +ZonePoint=Zone:GetRandomVec2() +else +ZonePoint=Zone:GetVec2() +end +PointTo.x=ZonePoint.x +PointTo.y=ZonePoint.y +PointTo.type="Turning Point" +if Formation then +PointTo.action=Formation +else +PointTo.action="Cone" +end +if Speed then +PointTo.speed=Speed +else +PointTo.speed=20/3.6 +end +local Points={PointFrom,PointTo} +self:T3(Points) +self:Route(Points) +return self +end +return nil +end +function CONTROLLABLE:TaskRouteToVec2(Vec2,Speed,Formation) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local ControllablePoint=self:GetVec2() +local PointFrom={} +PointFrom.x=ControllablePoint.x +PointFrom.y=ControllablePoint.y +PointFrom.type="Turning Point" +PointFrom.action=Formation or"Cone" +PointFrom.speed=20/3.6 +local PointTo={} +PointTo.x=Vec2.x +PointTo.y=Vec2.y +PointTo.type="Turning Point" +if Formation then +PointTo.action=Formation +else +PointTo.action="Cone" +end +if Speed then +PointTo.speed=Speed +else +PointTo.speed=20/3.6 +end +local Points={PointFrom,PointTo} +self:T3(Points) +self:Route(Points) +return self +end +return nil +end +end +function CONTROLLABLE:CommandDoScript(DoScript) +local DCSDoScript={ +id="Script", +params={ +command=DoScript, +}, +} +self:T3(DCSDoScript) +return DCSDoScript +end +function CONTROLLABLE:GetTaskMission() +self:F2(self.ControllableName) +return UTILS.DeepCopy(_DATABASE.Templates.Controllables[self.ControllableName].Template) +end +function CONTROLLABLE:GetTaskRoute() +self:F2(self.ControllableName) +return UTILS.DeepCopy(_DATABASE.Templates.Controllables[self.ControllableName].Template.route.points) +end +function CONTROLLABLE:CopyRoute(Begin,End,Randomize,Radius) +self:F2({Begin,End}) +local Points={} +local ControllableName=string.match(self:GetName(),".*#") +if ControllableName then +ControllableName=ControllableName:sub(1,-2) +else +ControllableName=self:GetName() +end +self:T3({ControllableName}) +local Template=_DATABASE.Templates.Controllables[ControllableName].Template +if Template then +if not Begin then +Begin=0 +end +if not End then +End=0 +end +for TPointID=Begin+1,#Template.route.points-End do +if Template.route.points[TPointID]then +Points[#Points+1]=UTILS.DeepCopy(Template.route.points[TPointID]) +if Randomize then +if not Radius then +Radius=500 +end +Points[#Points].x=Points[#Points].x+math.random(Radius*-1,Radius) +Points[#Points].y=Points[#Points].y+math.random(Radius*-1,Radius) +end +end +end +return Points +else +error("Template not found for Controllable : "..ControllableName) +end +return nil +end +function CONTROLLABLE:GetDetectedTargets(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +self:F2(self.ControllableName) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local DetectionVisual=(DetectVisual and DetectVisual==true)and Controller.Detection.VISUAL or nil +local DetectionOptical=(DetectOptical and DetectOptical==true)and Controller.Detection.OPTIC or nil +local DetectionRadar=(DetectRadar and DetectRadar==true)and Controller.Detection.RADAR or nil +local DetectionIRST=(DetectIRST and DetectIRST==true)and Controller.Detection.IRST or nil +local DetectionRWR=(DetectRWR and DetectRWR==true)and Controller.Detection.RWR or nil +local DetectionDLINK=(DetectDLINK and DetectDLINK==true)and Controller.Detection.DLINK or nil +local Params={} +if DetectionVisual then +Params[#Params+1]=DetectionVisual +end +if DetectionOptical then +Params[#Params+1]=DetectionOptical +end +if DetectionRadar then +Params[#Params+1]=DetectionRadar +end +if DetectionIRST then +Params[#Params+1]=DetectionIRST +end +if DetectionRWR then +Params[#Params+1]=DetectionRWR +end +if DetectionDLINK then +Params[#Params+1]=DetectionDLINK +end +self:T2({DetectionVisual,DetectionOptical,DetectionRadar,DetectionIRST,DetectionRWR,DetectionDLINK}) +return self:_GetController():getDetectedTargets(Params[1],Params[2],Params[3],Params[4],Params[5],Params[6]) +end +return nil +end +function CONTROLLABLE:IsTargetDetected(DCSObject,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +self:F2(self.ControllableName) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local DetectionVisual=(DetectVisual and DetectVisual==true)and Controller.Detection.VISUAL or nil +local DetectionOptical=(DetectOptical and DetectOptical==true)and Controller.Detection.OPTIC or nil +local DetectionRadar=(DetectRadar and DetectRadar==true)and Controller.Detection.RADAR or nil +local DetectionIRST=(DetectIRST and DetectIRST==true)and Controller.Detection.IRST or nil +local DetectionRWR=(DetectRWR and DetectRWR==true)and Controller.Detection.RWR or nil +local DetectionDLINK=(DetectDLINK and DetectDLINK==true)and Controller.Detection.DLINK or nil +local Controller=self:_GetController() +local TargetIsDetected,TargetIsVisible,TargetKnowType,TargetKnowDistance,TargetLastTime,TargetLastPos,TargetLastVelocity +=Controller:isTargetDetected(DCSObject,DetectionVisual,DetectionOptical,DetectionRadar,DetectionIRST,DetectionRWR,DetectionDLINK) +return TargetIsDetected,TargetIsVisible,TargetKnowType,TargetKnowDistance,TargetLastTime,TargetLastPos,TargetLastVelocity +end +return nil +end +function CONTROLLABLE:IsUnitDetected(Unit,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +self:F2(self.ControllableName) +if Unit and Unit:IsAlive()then +return self:IsTargetDetected(Unit:GetDCSObject(),DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +end +return nil +end +function CONTROLLABLE:IsGroupDetected(Group,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +self:F2(self.ControllableName) +if Group and Group:IsAlive()then +for _,_unit in pairs(Group:GetUnits())do +local unit=_unit +if unit and unit:IsAlive()then +local isdetected=self:IsUnitDetected(unit,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +if isdetected then +return true +end +end +end +return false +end +return nil +end +function CONTROLLABLE:GetDetectedUnitSet(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +local detectedtargets=self:GetDetectedTargets(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +local unitset=SET_UNIT:New() +for DetectionObjectID,Detection in pairs(detectedtargets or{})do +local DetectedObject=Detection.object +if DetectedObject and DetectedObject:isExist()and DetectedObject.id_<50000000 then +local unit=UNIT:Find(DetectedObject) +if unit and unit:IsAlive()then +if not unitset:FindUnit(unit:GetName())then +unitset:AddUnit(unit) +end +end +end +end +return unitset +end +function CONTROLLABLE:GetDetectedGroupSet(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +local detectedtargets=self:GetDetectedTargets(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +local groupset=SET_GROUP:New() +for DetectionObjectID,Detection in pairs(detectedtargets or{})do +local DetectedObject=Detection.object +if DetectedObject and DetectedObject:isExist()and DetectedObject.id_<50000000 then +local unit=UNIT:Find(DetectedObject) +if unit and unit:IsAlive()then +local group=unit:GetGroup() +if group and not groupset:FindGroup(group:GetName())then +groupset:AddGroup(group) +end +end +end +end +return groupset +end +function CONTROLLABLE:SetOption(OptionID,OptionValue) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +Controller:setOption(OptionID,OptionValue) +return self +end +return nil +end +function CONTROLLABLE:OptionROE(ROEvalue) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,ROEvalue) +elseif self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ROE,ROEvalue) +elseif self:IsShip()then +Controller:setOption(AI.Option.Naval.id.ROE,ROEvalue) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROEHoldFirePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()or self:IsGround()or self:IsShip()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROEHoldFire() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,AI.Option.Air.val.ROE.WEAPON_HOLD) +elseif self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ROE,AI.Option.Ground.val.ROE.WEAPON_HOLD) +elseif self:IsShip()then +Controller:setOption(AI.Option.Naval.id.ROE,AI.Option.Naval.val.ROE.WEAPON_HOLD) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROEReturnFirePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()or self:IsGround()or self:IsShip()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROEReturnFire() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,AI.Option.Air.val.ROE.RETURN_FIRE) +elseif self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ROE,AI.Option.Ground.val.ROE.RETURN_FIRE) +elseif self:IsShip()then +Controller:setOption(AI.Option.Naval.id.ROE,AI.Option.Naval.val.ROE.RETURN_FIRE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROEOpenFirePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()or self:IsGround()or self:IsShip()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROEOpenFire() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,AI.Option.Air.val.ROE.OPEN_FIRE) +elseif self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ROE,AI.Option.Ground.val.ROE.OPEN_FIRE) +elseif self:IsShip()then +Controller:setOption(AI.Option.Naval.id.ROE,AI.Option.Naval.val.ROE.OPEN_FIRE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROEOpenFireWeaponFreePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROEOpenFireWeaponFree() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,AI.Option.Air.val.ROE.OPEN_FIRE_WEAPON_FREE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROEWeaponFreePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROEWeaponFree() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ROE,AI.Option.Air.val.ROE.WEAPON_FREE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROTNoReactionPossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROTNoReaction() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.REACTION_ON_THREAT,AI.Option.Air.val.REACTION_ON_THREAT.NO_REACTION) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROT(ROTvalue) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.REACTION_ON_THREAT,ROTvalue) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROTPassiveDefensePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROTPassiveDefense() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.REACTION_ON_THREAT,AI.Option.Air.val.REACTION_ON_THREAT.PASSIVE_DEFENCE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionPreferVerticalLanding() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.PREFER_VERTICAL,true) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROTEvadeFirePossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROTEvadeFire() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.REACTION_ON_THREAT,AI.Option.Air.val.REACTION_ON_THREAT.EVADE_FIRE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionROTVerticalPossible() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +if self:IsAir()then +return true +end +return false +end +return nil +end +function CONTROLLABLE:OptionROTVertical() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.REACTION_ON_THREAT,AI.Option.Air.val.REACTION_ON_THREAT.BYPASS_AND_ESCAPE) +end +return self +end +return nil +end +function CONTROLLABLE:OptionAlarmStateAuto() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.AUTO) +elseif self:IsShip()then +Controller:setOption(9,0) +end +return self +end +return nil +end +function CONTROLLABLE:OptionAlarmStateGreen() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.GREEN) +elseif self:IsShip()then +Controller:setOption(9,1) +end +return self +end +return nil +end +function CONTROLLABLE:OptionAlarmStateRed() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsGround()then +Controller:setOption(AI.Option.Ground.id.ALARM_STATE,AI.Option.Ground.val.ALARM_STATE.RED) +elseif self:IsShip()then +Controller:setOption(9,2) +end +return self +end +return nil +end +function CONTROLLABLE:OptionRTBBingoFuel(RTB) +self:F2({self.ControllableName}) +if RTB==nil then +RTB=true +end +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.RTB_ON_BINGO,RTB) +end +return self +end +return nil +end +function CONTROLLABLE:OptionRTBAmmo(WeaponsFlag) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.RTB_ON_OUT_OF_AMMO,WeaponsFlag) +end +return self +end +return nil +end +function CONTROLLABLE:OptionAllowJettisonWeaponsOnThreat() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.PROHIBIT_JETT,false) +end +return self +end +return nil +end +function CONTROLLABLE:OptionKeepWeaponsOnThreat() +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.PROHIBIT_JETT,true) +end +return self +end +return nil +end +function CONTROLLABLE:OptionProhibitAfterburner(Prohibit) +self:F2({self.ControllableName}) +if Prohibit==nil then +Prohibit=true +end +if self:IsAir()then +self:SetOption(AI.Option.Air.id.PROHIBIT_AB,Prohibit) +end +return self +end +function CONTROLLABLE:OptionEvasionOfARM(Seconds) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsGround()then +if Seconds==nil then Seconds=false end +Controller:setOption(AI.Option.Ground.id.EVASION_OF_ARM,Seconds) +end +end +return self +end +function CONTROLLABLE:OptionFormationInterval(meters) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsGround()then +if meters==nil or meters>100 or meters<0 then meters=50 end +Controller:setOption(30,meters) +end +end +return self +end +function CONTROLLABLE:OptionECM(ECMvalue) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if self:IsAir()then +Controller:setOption(AI.Option.Air.id.ECM_USING,ECMvalue or 1) +end +end +return self +end +function CONTROLLABLE:OptionECM_Never() +self:F2({self.ControllableName}) +self:OptionECM(0) +return self +end +function CONTROLLABLE:OptionECM_OnlyLockByRadar() +self:F2({self.ControllableName}) +self:OptionECM(1) +return self +end +function CONTROLLABLE:OptionECM_DetectedLockByRadar() +self:F2({self.ControllableName}) +self:OptionECM(2) +return self +end +function CONTROLLABLE:OptionECM_AlwaysOn() +self:F2({self.ControllableName}) +self:OptionECM(3) +return self +end +function CONTROLLABLE:WayPointInitialize(WayPoints) +self:F({WayPoints}) +if WayPoints then +self.WayPoints=WayPoints +else +self.WayPoints=self:GetTaskRoute() +end +return self +end +function CONTROLLABLE:GetWayPoints() +self:F() +if self.WayPoints then +return self.WayPoints +end +return nil +end +function CONTROLLABLE:WayPointFunction(WayPoint,WayPointIndex,WayPointFunction,...) +self:F2({WayPoint,WayPointIndex,WayPointFunction}) +if not self.WayPoints then +self:WayPointInitialize() +end +table.insert(self.WayPoints[WayPoint].task.params.tasks,WayPointIndex) +self.WayPoints[WayPoint].task.params.tasks[WayPointIndex]=self:TaskFunction(WayPointFunction,arg) +return self +end +function CONTROLLABLE:WayPointExecute(WayPoint,WaitTime) +self:F({WayPoint,WaitTime}) +if not WayPoint then +WayPoint=1 +end +for TaskPointID=1,WayPoint-1 do +table.remove(self.WayPoints,1) +end +self:T3(self.WayPoints) +self:SetTask(self:TaskRoute(self.WayPoints),WaitTime) +return self +end +function CONTROLLABLE:IsAirPlane() +self:F2() +local DCSObject=self:GetDCSObject() +if DCSObject then +local Category=DCSObject:getDesc().category +return Category==Unit.Category.AIRPLANE +end +return nil +end +function CONTROLLABLE:IsHelicopter() +self:F2() +local DCSObject=self:GetDCSObject() +if DCSObject then +local Category=DCSObject:getDesc().category +return Category==Unit.Category.HELICOPTER +end +return nil +end +function CONTROLLABLE:OptionRestrictBurner(RestrictBurner) +self:F2({self.ControllableName}) +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if RestrictBurner==true then +if self:IsAir()then +Controller:setOption(16,true) +end +else +if self:IsAir()then +Controller:setOption(16,false) +end +end +end +end +end +function CONTROLLABLE:OptionAAAttackRange(range) +self:F2({self.ControllableName}) +local range=range or 3 +if range<0 or range>4 then +range=3 +end +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsAir()then +self:SetOption(AI.Option.Air.id.MISSILE_ATTACK,range) +end +end +return self +end +return nil +end +function CONTROLLABLE:OptionAAAMinFiringHeightMeters(meters) +self:F2({self.ControllableName}) +local meters=meters or 20 +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsGround()then +self:SetOption(27,meters) +end +end +return self +end +return nil +end +function CONTROLLABLE:OptionAAAMaxFiringHeightMeters(meters) +self:F2({self.ControllableName}) +local meters=meters or 1000 +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsGround()then +self:SetOption(29,meters) +end +end +return self +end +return nil +end +function CONTROLLABLE:OptionAAAMinFiringHeightFeet(feet) +self:F2({self.ControllableName}) +local feet=feet or 60 +return self:OptionAAAMinFiringHeightMeters(UTILS.FeetToMeters(feet)) +end +function CONTROLLABLE:OptionAAAMaxFiringHeightfeet(feet) +self:F2({self.ControllableName}) +local feet=feet or 3000 +return self:OptionAAAMaxFiringHeightMeters(UTILS.FeetToMeters(feet)) +end +function CONTROLLABLE:OptionEngageRange(EngageRange) +self:F2({self.ControllableName}) +EngageRange=EngageRange or 100 +if EngageRange<0 or EngageRange>100 then +EngageRange=100 +end +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsGround()then +self:SetOption(AI.Option.Ground.id.AC_ENGAGEMENT_RANGE_RESTRICTION,EngageRange) +end +end +return self +end +return nil +end +function CONTROLLABLE:SetOptionLandingStraightIn() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption("36","0") +end +return self +end +function CONTROLLABLE:SetOptionLandingForcePair() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption("36","1") +end +return self +end +function CONTROLLABLE:SetOptionLandingRestrictPair() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption("36","2") +end +return self +end +function CONTROLLABLE:SetOptionLandingOverheadBreak() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption("36","3") +end +return self +end +function CONTROLLABLE:SetOptionRadarUsing(Option) +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.RADAR_USING,Option) +end +return self +end +function CONTROLLABLE:SetOptionRadarUsingNever() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.RADAR_USING,0) +end +return self +end +function CONTROLLABLE:SetOptionRadarUsingForAttackOnly() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.RADAR_USING,1) +end +return self +end +function CONTROLLABLE:SetOptionRadarUsingForSearchIfRequired() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.RADAR_USING,2) +end +return self +end +function CONTROLLABLE:SetOptionRadarUsingForContinousSearch() +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.RADAR_USING,3) +end +return self +end +function CONTROLLABLE:SetOptionWaypointPassReport(OnOff) +self:F2({self.ControllableName}) +local onoff=(OnOff==nil or OnOff==true)and false or true +if self:IsAir()then +self:SetOption(AI.Option.Air.id.PROHIBIT_WP_PASS_REPORT,onoff) +end +return self +end +function CONTROLLABLE:SetOptionRadioSilence(OnOff) +local onoff=(OnOff==true or OnOff==nil)and true or false +self:F2({self.ControllableName}) +if self:IsAir()then +self:SetOption(AI.Option.Air.id.SILENCE,onoff) +end +return self +end +function CONTROLLABLE:SetOptionRadioContact(Objects) +self:F2({self.ControllableName}) +if not Objects then Objects={"Air"}end +if type(Objects)~="table"then Objects={Objects}end +if self:IsAir()then +self:SetOption(AI.Option.Air.id.OPTION_RADIO_USAGE_CONTACT,Objects) +end +return self +end +function CONTROLLABLE:SetOptionRadioEngage(Objects) +self:F2({self.ControllableName}) +if not Objects then Objects={"Air"}end +if type(Objects)~="table"then Objects={Objects}end +if self:IsAir()then +self:SetOption(AI.Option.Air.id.OPTION_RADIO_USAGE_ENGAGE,Objects) +end +return self +end +function CONTROLLABLE:SetOptionRadioKill(Objects) +self:F2({self.ControllableName}) +if not Objects then Objects={"Air"}end +if type(Objects)~="table"then Objects={Objects}end +if self:IsAir()then +self:SetOption(AI.Option.Air.id.OPTION_RADIO_USAGE_KILL,Objects) +end +return self +end +function CONTROLLABLE:RelocateGroundRandomInRadius(speed,radius,onroad,shortcut,formation,onland) +self:F2({self.ControllableName}) +local _coord=self:GetCoordinate() +if not _coord then +return self +end +local _radius=radius or 500 +local _speed=speed or 20 +local _tocoord=_coord:GetRandomCoordinateInRadius(_radius,100) +if onland then +for i=1,50 do +local island=_tocoord:GetSurfaceType()==land.SurfaceType.LAND and true or false +if island then break end +_tocoord=_coord:GetRandomCoordinateInRadius(_radius,100) +end +end +local _onroad=onroad or true +local _grptsk={} +local _candoroad=false +local _shortcut=shortcut or false +local _formation=formation or"Off Road" +if onroad then +_grptsk,_candoroad=self:TaskGroundOnRoad(_tocoord,_speed,_formation,_shortcut) +self:Route(_grptsk,5) +else +self:TaskRouteToVec2(_tocoord:GetVec2(),_speed,_formation) +end +return self +end +function CONTROLLABLE:OptionDisperseOnAttack(Seconds) +self:F2({self.ControllableName}) +local seconds=Seconds or 0 +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsGround()then +self:SetOption(AI.Option.Ground.id.DISPERSE_ON_ATTACK,seconds) +end +end +return self +end +return nil +end +function CONTROLLABLE:IsSubmarine() +self:F2() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +if UnitDescriptor.attributes["Submarines"]==true then +return true +else +return false +end +end +return nil +end +function CONTROLLABLE:SetSpeed(Speed,Keep) +self:F2({self.ControllableName}) +local speed=Speed or 5 +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +Controller:setSpeed(speed,Keep) +end +end +return self +end +function CONTROLLABLE:SetAltitude(Altitude,Keep,AltType) +self:F2({self.ControllableName}) +local altitude=Altitude or 1000 +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=self:_GetController() +if Controller then +if self:IsAir()then +Controller:setAltitude(altitude,Keep,AltType) +end +end +end +return self +end +function CONTROLLABLE:TaskAerobatics() +local DCSTaskAerobatics={ +id="Aerobatics", +params={ +["maneuversSequency"]={}, +}, +["enabled"]=true, +["auto"]=false, +} +return DCSTaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsCandle(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local CandleTask={ +["name"]="CANDLE", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +} +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],CandleTask) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsEdgeFlight(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,FlightTime,Side) +local maxrepeats=10 +local maxflight=200 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local flighttime=FlightTime or 10 +if flighttime>200 then maxflight=flighttime end +local EdgeTask={ +["name"]="EDGE_FLIGHT", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["FlightTime"]={ +["max_v"]=maxflight, +["min_v"]=1, +["order"]=6, +["step"]=0.1, +["value"]=flighttime or 10, +}, +["SIDE"]={ +["order"]=7, +["value"]=Side or 0, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],EdgeTask) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsWingoverFlight(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,FlightTime) +local maxrepeats=10 +local maxflight=200 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local flighttime=FlightTime or 10 +if flighttime>200 then maxflight=flighttime end +local WingoverTask={ +["name"]="WINGOVER_FLIGHT", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["FlightTime"]={ +["max_v"]=maxflight, +["min_v"]=1, +["order"]=6, +["step"]=0.1, +["value"]=flighttime or 10, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],WingoverTask) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsLoop(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local LoopTask={ +["name"]="LOOP", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +} +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],LoopTask) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsHorizontalEight(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side,RollDeg) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local LoopTask={ +["name"]="HORIZONTAL_EIGHT", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SIDE"]={ +["order"]=6, +["value"]=Side or 0, +}, +["ROLL1"]={ +["order"]=7, +["value"]=RollDeg or 60, +}, +["ROLL2"]={ +["order"]=8, +["value"]=RollDeg or 60, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],LoopTask) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsHammerhead(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="HUMMERHEAD", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SIDE"]={ +["order"]=6, +["value"]=Side or 0, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsSkewedLoop(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side,RollDeg) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="SKEWED_LOOP", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["ROLL"]={ +["order"]=6, +["value"]=RollDeg or 60, +}, +["SIDE"]={ +["order"]=7, +["value"]=Side or 0, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsTurn(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side,RollDeg,Pull,Angle) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="TURN", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["Ny_req"]={ +["order"]=6, +["value"]=Pull or 2, +}, +["ROLL"]={ +["order"]=7, +["value"]=RollDeg or 60, +}, +["SECTOR"]={ +["order"]=8, +["value"]=Angle or 180, +}, +["SIDE"]={ +["order"]=9, +["value"]=Side or 0, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsDive(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Angle,FinalAltitude) +local maxrepeats=10 +local angle=Angle +if angle<15 then angle=15 elseif angle>90 then angle=90 end +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="DIVE", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 5000, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["Angle"]={ +["max_v"]=90, +["min_v"]=15, +["order"]=6, +["step"]=5, +["value"]=angle or 45, +}, +["FinalAltitude"]={ +["order"]=7, +["value"]=FinalAltitude or 1000, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsMilitaryTurn(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="MILITARY_TURN", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +} +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsImmelmann(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="IMMELMAN", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +} +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsStraightFlight(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,FlightTime) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local maxflight=200 +if Repeats>maxrepeats then maxrepeats=Repeats end +local flighttime=FlightTime or 10 +if flighttime>200 then maxflight=flighttime end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="STRAIGHT_FLIGHT", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["FlightTime"]={ +["max_v"]=maxflight, +["min_v"]=1, +["order"]=6, +["step"]=0.1, +["value"]=flighttime or 10, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsClimb(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Angle,FinalAltitude) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="CLIMB", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["Angle"]={ +["max_v"]=90, +["min_v"]=15, +["order"]=6, +["step"]=5, +["value"]=Angle or 45, +}, +["FinalAltitude"]={ +["order"]=7, +["value"]=FinalAltitude or 5000, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsSpiral(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,TurnAngle,Roll,Side,UpDown,Angle) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local updown=UpDown and 1 or 0 +local side=Side and 1 or 0 +local Task={ +["name"]="SPIRAL", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SECTOR"]={ +["order"]=6, +["value"]=TurnAngle or 360, +}, +["ROLL"]={ +["order"]=7, +["value"]=Roll or 60, +}, +["SIDE"]={ +["order"]=8, +["value"]=side or 0, +}, +["UPDOWN"]={ +["order"]=9, +["value"]=updown or 0, +}, +["Angle"]={ +["max_v"]=90, +["min_v"]=15, +["order"]=10, +["step"]=5, +["value"]=Angle or 45, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsSplitS(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,FinalSpeed) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local maxflight=200 +if Repeats>maxrepeats then maxrepeats=Repeats end +local finalspeed=FinalSpeed or 500 +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="SPLIT_S", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["FinalSpeed"]={ +["order"]=6, +["value"]=finalspeed, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsAileronRoll(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side,RollRate,TurnAngle,FixAngle) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local maxflight=200 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="AILERON_ROLL", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SIDE"]={ +["order"]=6, +["value"]=Side or 0, +}, +["RollRate"]={ +["max_v"]=450, +["min_v"]=15, +["order"]=7, +["step"]=5, +["value"]=RollRate or 90, +}, +["SECTOR"]={ +["order"]=8, +["value"]=TurnAngle or 360, +}, +["FIXSECTOR"]={ +["max_v"]=180, +["min_v"]=0, +["order"]=9, +["step"]=5, +["value"]=FixAngle or 0, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsForcedTurn(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,TurnAngle,Side,FlightTime,MinSpeed) +local maxrepeats=10 +local flighttime=FlightTime or 30 +local maxtime=200 +if flighttime>200 then maxtime=flighttime end +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="FORCED_TURN", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SECTOR"]={ +["order"]=6, +["value"]=TurnAngle or 360, +}, +["SIDE"]={ +["order"]=7, +["value"]=Side or 0, +}, +["FlightTime"]={ +["max_v"]=maxtime or 200, +["min_v"]=0, +["order"]=8, +["step"]=0.1, +["value"]=flighttime or 30, +}, +["MinSpeed"]={ +["max_v"]=3000, +["min_v"]=30, +["order"]=9, +["step"]=10, +["value"]=MinSpeed or 250, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:TaskAerobaticsBarrelRoll(TaskAerobatics,Repeats,InitAltitude,InitSpeed,UseSmoke,StartImmediately,Side,RollRate,TurnAngle) +local maxrepeats=10 +if Repeats>maxrepeats then maxrepeats=Repeats end +local usesmoke=UseSmoke and 1 or 0 +local startimmediately=StartImmediately and 1 or 0 +local Task={ +["name"]="BARREL_ROLL", +["params"]={ +["RepeatQty"]={ +["max_v"]=maxrepeats, +["min_v"]=1, +["order"]=1, +["value"]=Repeats or 1, +}, +["InitAltitude"]={ +["order"]=2, +["value"]=InitAltitude or 0, +}, +["InitSpeed"]={ +["order"]=3, +["value"]=InitSpeed or 0, +}, +["UseSmoke"]={ +["order"]=4, +["value"]=usesmoke, +}, +["StartImmediatly"]={ +["order"]=5, +["value"]=startimmediately, +}, +["SIDE"]={ +["order"]=6, +["value"]=Side or 0, +}, +["RollRate"]={ +["max_v"]=450, +["min_v"]=15, +["order"]=7, +["step"]=5, +["value"]=RollRate or 90, +}, +["SECTOR"]={ +["order"]=8, +["value"]=TurnAngle or 360, +}, +} +} +table.insert(TaskAerobatics.params["maneuversSequency"],Task) +return TaskAerobatics +end +function CONTROLLABLE:PatrolRaceTrack(Point1,Point2,Altitude,Speed,Formation,AGL,Delay) +local PatrolGroup=self +if not self:IsInstanceOf("GROUP")then +PatrolGroup=self:GetGroup() +end +local delay=Delay or 1 +self:F({PatrolGroup=PatrolGroup:GetName()}) +if PatrolGroup:IsAir()then +if Formation then +PatrolGroup:SetOption(AI.Option.Air.id.FORMATION,Formation) +end +local FromCoord=PatrolGroup:GetCoordinate() +local ToCoord=Point1:GetCoordinate() +if Altitude then +local asl=true +if AGL then asl=false end +FromCoord:SetAltitude(Altitude,asl) +ToCoord:SetAltitude(Altitude,asl) +end +local Route={} +Route[#Route+1]=FromCoord:WaypointAir(AltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true,nil,DCSTasks,description,timeReFuAr) +Route[#Route+1]=ToCoord:WaypointAir(AltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true,nil,DCSTasks,description,timeReFuAr) +local TaskRouteToZone=PatrolGroup:TaskFunction("CONTROLLABLE.PatrolRaceTrack",Point2,Point1,Altitude,Speed,Formation,Delay) +PatrolGroup:SetTaskWaypoint(Route[#Route],TaskRouteToZone) +PatrolGroup:Route(Route,Delay) +end +return self +end +function CONTROLLABLE:NewIRMarker(EnableImmediately,Runtime) +self:T2("NewIRMarker") +if self:IsInstanceOf("GROUP")then +if self.IRMarkerGroup==true then return end +self.IRMarkerGroup=true +self.IRMarkerUnit=false +elseif self:IsInstanceOf("UNIT")then +if self.IRMarkerUnit==true then return end +self.IRMarkerGroup=false +self.IRMarkerUnit=true +end +self.Runtime=Runtime or 60 +if EnableImmediately and EnableImmediately==true then +self:EnableIRMarker(Runtime) +end +return self +end +function CONTROLLABLE:EnableIRMarker(Runtime) +self:T2("EnableIRMarker") +if self.IRMarkerGroup==nil then +self:NewIRMarker(true,Runtime) +return +end +if self:IsInstanceOf("GROUP")then +self:EnableIRMarkerForGroup(Runtime) +return +end +if self.timer and self.timer:IsRunning()then return self end +local Runtime=Runtime or self.Runtime +self.timer=TIMER:New(CONTROLLABLE._MarkerBlink,self) +self.timer:Start(nil,1-math.random(1,5)/10/2,Runtime) +self.IRMarkerUnit=true +return self +end +function CONTROLLABLE:DisableIRMarker() +self:T2("DisableIRMarker") +if self:IsInstanceOf("GROUP")then +self:DisableIRMarkerForGroup() +return +end +if self.spot then +self.spot=nil +end +if self.timer and self.timer:IsRunning()then +self.timer:Stop() +self.timer=nil +end +if self:IsInstanceOf("GROUP")then +self.IRMarkerGroup=nil +elseif self:IsInstanceOf("UNIT")then +self.IRMarkerUnit=nil +end +return self +end +function CONTROLLABLE:EnableIRMarkerForGroup(Runtime) +self:T2("EnableIRMarkerForGroup") +if self:IsInstanceOf("GROUP") +then +local units=self:GetUnits()or{} +for _,_unit in pairs(units)do +_unit:EnableIRMarker(Runtime) +end +self.IRMarkerGroup=true +end +return self +end +function CONTROLLABLE:DisableIRMarkerForGroup() +self:T2("DisableIRMarkerForGroup") +if self:IsInstanceOf("GROUP")then +local units=self:GetUnits()or{} +for _,_unit in pairs(units)do +_unit:DisableIRMarker() +end +self.IRMarkerGroup=nil +end +return self +end +function CONTROLLABLE:HasIRMarker() +self:T2("HasIRMarker") +if self:IsInstanceOf("GROUP")then +local units=self:GetUnits()or{} +for _,_unit in pairs(units)do +if _unit.timer and _unit.timer:IsRunning()then return true end +end +elseif self.timer and self.timer:IsRunning()then return true end +return false +end +function CONTROLLABLE._StopSpot(spot) +if spot then +spot:destroy() +end +end +function CONTROLLABLE:_MarkerBlink() +self:T2("_MarkerBlink") +if self:IsAlive()~=true then +self:DisableIRMarker() +return +end +self.timer.dT=1-(math.random(1,2)/10/2) +local _,_,unitBBHeight,_=self:GetObjectSize() +local unitPos=self:GetPositionVec3() +if self.timer:IsRunning()then +self:T2("Create Spot") +local spot=Spot.createInfraRed( +self.DCSUnit, +{x=0,y=(unitBBHeight+1),z=0}, +{x=unitPos.x,y=(unitPos.y+unitBBHeight),z=unitPos.z} +) +self.spot=spot +local offTimer=nil +local offTimer=TIMER:New(CONTROLLABLE._StopSpot,spot) +offTimer:Start(0.5) +end +return self +end +GROUP={ +ClassName="GROUP", +} +GROUP.Takeoff={ +Air=1, +Runway=2, +Hot=3, +Cold=4, +} +GROUPTEMPLATE={} +GROUPTEMPLATE.Takeoff={ +[GROUP.Takeoff.Air]={"Turning Point","Turning Point"}, +[GROUP.Takeoff.Runway]={"TakeOff","From Runway"}, +[GROUP.Takeoff.Hot]={"TakeOffParkingHot","From Parking Area Hot"}, +[GROUP.Takeoff.Cold]={"TakeOffParking","From Parking Area"} +} +GROUP.Attribute={ +AIR_TRANSPORTPLANE="Air_TransportPlane", +AIR_AWACS="Air_AWACS", +AIR_FIGHTER="Air_Fighter", +AIR_BOMBER="Air_Bomber", +AIR_TANKER="Air_Tanker", +AIR_TRANSPORTHELO="Air_TransportHelo", +AIR_ATTACKHELO="Air_AttackHelo", +AIR_UAV="Air_UAV", +AIR_OTHER="Air_OtherAir", +GROUND_APC="Ground_APC", +GROUND_TRUCK="Ground_Truck", +GROUND_INFANTRY="Ground_Infantry", +GROUND_IFV="Ground_IFV", +GROUND_ARTILLERY="Ground_Artillery", +GROUND_TANK="Ground_Tank", +GROUND_TRAIN="Ground_Train", +GROUND_EWR="Ground_EWR", +GROUND_AAA="Ground_AAA", +GROUND_SAM="Ground_SAM", +GROUND_SHORAD="Ground_SHORAD", +GROUND_BALLISTICMISSILE="Ground_BallisticMissile", +GROUND_OTHER="Ground_OtherGround", +NAVAL_AIRCRAFTCARRIER="Naval_AircraftCarrier", +NAVAL_WARSHIP="Naval_WarShip", +NAVAL_ARMEDSHIP="Naval_ArmedShip", +NAVAL_UNARMEDSHIP="Naval_UnarmedShip", +NAVAL_OTHER="Naval_OtherNaval", +OTHER_UNKNOWN="Other_Unknown", +} +function GROUP:NewTemplate(GroupTemplate,CoalitionSide,CategoryID,CountryID) +local GroupName=GroupTemplate.name +_DATABASE:_RegisterGroupTemplate(GroupTemplate,CoalitionSide,CategoryID,CountryID,GroupName) +local self=BASE:Inherit(self,CONTROLLABLE:New(GroupName)) +self.GroupName=GroupName +if not _DATABASE.GROUPS[GroupName]then +_DATABASE.GROUPS[GroupName]=self +end +self:SetEventPriority(4) +return self +end +function GROUP:Register(GroupName) +local self=BASE:Inherit(self,CONTROLLABLE:New(GroupName)) +self.GroupName=GroupName +self:SetEventPriority(4) +return self +end +function GROUP:Find(DCSGroup) +local GroupName=DCSGroup:getName() +local GroupFound=_DATABASE:FindGroup(GroupName) +return GroupFound +end +function GROUP:FindByName(GroupName) +local GroupFound=_DATABASE:FindGroup(GroupName) +return GroupFound +end +function GROUP:FindByMatching(Pattern) +local GroupFound=nil +for name,group in pairs(_DATABASE.GROUPS)do +if string.match(name,Pattern)then +GroupFound=group +break +end +end +return GroupFound +end +function GROUP:FindAllByMatching(Pattern) +local GroupsFound={} +for name,group in pairs(_DATABASE.GROUPS)do +if string.match(name,Pattern)then +GroupsFound[#GroupsFound+1]=group +end +end +return GroupsFound +end +function GROUP:GetDCSObject() +local DCSGroup=Group.getByName(self.GroupName) +if DCSGroup then +self.LastCallDCSObject=timer.getTime() +self.DCSObject=DCSGroup +return DCSGroup +end +return nil +end +function GROUP:GetPositionVec3() +local DCSPositionable=self:GetDCSObject() +if DCSPositionable then +local unit=DCSPositionable:getUnits()[1] +if unit then +local PositionablePosition=unit:getPosition().p +return PositionablePosition +end +end +return nil +end +function GROUP:IsAlive() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +if DCSGroup:isExist()then +local DCSUnit=DCSGroup:getUnit(1) +if DCSUnit then +local GroupIsAlive=DCSUnit:isActive() +return GroupIsAlive +end +end +end +return nil +end +function GROUP:IsActive() +local DCSGroup=self:GetDCSObject() +if DCSGroup and DCSGroup:isExist()then +local unit=DCSGroup:getUnit(1) +if unit then +local GroupIsActive=unit:isActive() +return GroupIsActive +end +end +return nil +end +function GROUP:Destroy(GenerateEvent,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,GROUP.Destroy,self,GenerateEvent) +else +local DCSGroup=Group.getByName(self.GroupName) +if DCSGroup then +for Index,UnitData in pairs(DCSGroup:getUnits())do +if GenerateEvent and GenerateEvent==true then +if self:IsAir()then +self:CreateEventCrash(timer.getTime(),UnitData) +else +self:CreateEventDead(timer.getTime(),UnitData) +end +elseif GenerateEvent==false then +else +self:CreateEventRemoveUnit(timer.getTime(),UnitData) +end +end +USERFLAG:New(self:GetName()):Set(100) +DCSGroup:destroy() +DCSGroup=nil +end +end +return nil +end +function GROUP:GetCategory() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCategory=DCSGroup:getCategory() +return GroupCategory +end +return nil +end +function GROUP:GetCategoryName() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local CategoryNames={ +[Group.Category.AIRPLANE]="Airplane", +[Group.Category.HELICOPTER]="Helicopter", +[Group.Category.GROUND]="Ground Unit", +[Group.Category.SHIP]="Ship", +[Group.Category.TRAIN]="Train", +} +local GroupCategory=DCSGroup:getCategory() +return CategoryNames[GroupCategory] +end +return nil +end +function GROUP:GetCoalition() +if self.GroupCoalition~=nil then +return self.GroupCoalition +else +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCoalition=DCSGroup:getCoalition() +self.GroupCoalition=GroupCoalition +return GroupCoalition +end +end +return nil +end +function GROUP:GetCountry() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCountry=DCSGroup:getUnit(1):getCountry() +return GroupCountry +end +return nil +end +function GROUP:HasAttribute(attribute,all) +local _units=self:GetUnits() +if _units then +local _allhave=true +local _onehas=false +for _,_unit in pairs(_units)do +local _unit=_unit +if _unit then +local _hastit=_unit:HasAttribute(attribute) +if _hastit==true then +_onehas=true +else +_allhave=false +end +end +end +if all==true then +return _allhave +else +return _onehas +end +end +return nil +end +function GROUP:GetSpeedMax() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local Units=self:GetUnits() +local speedmax=nil +for _,unit in pairs(Units)do +local unit=unit +local speed=unit:GetSpeedMax() +if speedmax==nil or speed<speedmax then +speedmax=speed +end +end +return speedmax +end +return nil +end +function GROUP:GetRange() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local Units=self:GetUnits() +local Rangemin=nil +for _,unit in pairs(Units)do +local unit=unit +local range=unit:GetRange() +if range then +if Rangemin==nil then +Rangemin=range +elseif range<Rangemin then +Rangemin=range +end +end +end +return Rangemin +end +return nil +end +function GROUP:GetUnits() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local DCSUnits=DCSGroup:getUnits()or{} +local Units={} +for Index,UnitData in pairs(DCSUnits)do +local unit=UNIT:Find(UnitData) +if unit then +Units[#Units+1]=UNIT:Find(UnitData) +else +local UnitName=UnitData:getName() +unit=_DATABASE:AddUnit(UnitName) +Units[#Units+1]=unit +end +end +return Units +end +return nil +end +function GROUP:GetPlayerUnits() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local DCSUnits=DCSGroup:getUnits() +local Units={} +for Index,UnitData in pairs(DCSUnits)do +local PlayerUnit=UNIT:Find(UnitData) +if PlayerUnit:GetPlayerName()then +Units[#Units+1]=PlayerUnit +end +end +return Units +end +return nil +end +function GROUP:IsPlayer() +local unit=self:GetUnit(1) +if unit then +return unit:IsPlayer() +end +return false +end +function GROUP:GetUnit(UnitNumber) +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local UnitFound=nil +local units=DCSGroup:getUnits()or{} +if units[UnitNumber]then +local UnitFound=UNIT:Find(units[UnitNumber]) +if UnitFound then +return UnitFound +end +else +for _,_unit in pairs(units)do +local UnitFound=UNIT:Find(_unit) +if UnitFound then +return UnitFound +end +end +end +end +return nil +end +function GROUP:GetDCSUnit(UnitNumber) +local DCSGroup=self:GetDCSObject() +if DCSGroup then +if DCSGroup.getUnit and DCSGroup:getUnit(UnitNumber)then +return DCSGroup:getUnit(UnitNumber) +else +local units=DCSGroup:getUnits()or{} +for _,_unit in pairs(units)do +if _unit and _unit:isExist()then +return _unit +end +end +end +end +return nil +end +function GROUP:GetSize() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupSize=DCSGroup:getSize() +if GroupSize then +return GroupSize +else +return 0 +end +end +return nil +end +function GROUP:CountAliveUnits() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local units=self:GetUnits() +local n=0 +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()then +n=n+1 +end +end +return n +end +return 0 +end +function GROUP:GetFirstUnitAlive() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local units=self:GetUnits() +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()then +return unit +end +end +end +return nil +end +function GROUP:GetFirstUnit() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local units=self:GetUnits() +return units[1] +end +return nil +end +function GROUP:GetVelocityVec3() +local DCSGroup=self:GetDCSObject() +if DCSGroup and DCSGroup:isExist()then +local GroupUnits=DCSGroup:getUnits() +local GroupCount=0 +local VelocityVec3={x=0,y=0,z=0} +for _,DCSUnit in pairs(GroupUnits)do +if DCSUnit:isExist()and DCSUnit:isActive()then +local UnitVelocityVec3=DCSUnit:getVelocity() +VelocityVec3.x=VelocityVec3.x+UnitVelocityVec3.x +VelocityVec3.y=VelocityVec3.y+UnitVelocityVec3.y +VelocityVec3.z=VelocityVec3.z+UnitVelocityVec3.z +GroupCount=GroupCount+1 +end +end +VelocityVec3.x=VelocityVec3.x/GroupCount +VelocityVec3.y=VelocityVec3.y/GroupCount +VelocityVec3.z=VelocityVec3.z/GroupCount +return VelocityVec3 +end +BASE:E({"Cannot GetVelocityVec3",Group=self,Alive=self:IsAlive()}) +return nil +end +function GROUP:GetAltitude(FromGround) +return self:GetHeight(FromGround) +end +function GROUP:GetHeight(FromGround) +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupUnits=DCSGroup:getUnits() +local GroupCount=#GroupUnits +local GroupHeight=0 +for _,DCSUnit in pairs(GroupUnits)do +local GroupPosition=DCSUnit:getPosition() +if FromGround==true then +local LandHeight=land.getHeight({x=GroupPosition.p.x,y=GroupPosition.p.z}) +GroupHeight=GroupHeight+(GroupPosition.p.y-LandHeight) +else +GroupHeight=GroupHeight+GroupPosition.p.y +end +end +return GroupHeight/GroupCount +end +return nil +end +function GROUP:GetInitialSize() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupInitialSize=DCSGroup:getInitialSize() +return GroupInitialSize +end +return nil +end +function GROUP:GetDCSUnits() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local DCSUnits=DCSGroup:getUnits() +return DCSUnits +end +return nil +end +function GROUP:Activate(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,GROUP.Activate,self) +else +trigger.action.activateGroup(self:GetDCSObject()) +end +return self +end +function GROUP:Deactivate(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,GROUP.Deactivate,self) +else +trigger.action.deactivateGroup(self:GetDCSObject()) +end +return self +end +function GROUP:GetTypeName() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupTypeName=DCSGroup:getUnit(1):getTypeName() +return(GroupTypeName) +end +return nil +end +function GROUP:GetNatoReportingName() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupTypeName=DCSGroup:getUnit(1):getTypeName() +return UTILS.GetReportingName(GroupTypeName) +end +return"Bogey" +end +function GROUP:GetPlayerName() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local PlayerName=DCSGroup:getUnit(1):getPlayerName() +return(PlayerName) +end +return nil +end +function GROUP:GetCallsign() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCallSign=DCSGroup:getUnit(1):getCallsign() +return GroupCallSign +end +BASE:E({"Cannot GetCallsign",Positionable=self,Alive=self:IsAlive()}) +return nil +end +function GROUP:GetVec2() +local Unit=self:GetUnit(1) +if Unit then +local vec2=Unit:GetVec2() +return vec2 +end +end +function GROUP:GetVec3() +local unit=self:GetUnit(1) +if unit then +local vec3=unit:GetVec3() +return vec3 +end +self:E("ERROR: Cannot get Vec3 of group "..tostring(self.GroupName)) +return nil +end +function GROUP:GetAverageVec3() +local units=self:GetUnits()or{} +local x=0;local y=0;local z=0;local n=0 +for _,unit in pairs(units)do +local vec3=nil +if unit and unit:IsAlive()then +vec3=unit:GetVec3() +end +if vec3 then +x=x+vec3.x +y=y+vec3.y +z=z+vec3.z +n=n+1 +end +end +if n>0 then +local Vec3={x=x/n,y=y/n,z=z/n} +return Vec3 +else +return self:GetVec3() +end +end +function GROUP:GetPointVec2() +local FirstUnit=self:GetUnit(1) +if FirstUnit then +local FirstUnitPointVec2=FirstUnit:GetPointVec2() +return FirstUnitPointVec2 +end +BASE:E({"Cannot get COORDINATE",Group=self,Alive=self:IsAlive()}) +return nil +end +function GROUP:GetAverageCoordinate() +local vec3=self:GetAverageVec3() +if vec3 then +local coord=COORDINATE:NewFromVec3(vec3) +local Heading=self:GetHeading() +coord.Heading=Heading +return coord +else +local coord=self:GetCoordinate() +if coord then +return coord +else +BASE:E({"Cannot GetAverageCoordinate",Group=self,Alive=self:IsAlive()}) +return nil +end +end +end +function GROUP:GetCoordinate() +local vec3=self:GetVec3() +local coord +if vec3 then +coord=COORDINATE:NewFromVec3(vec3) +coord.Heading=self:GetHeading()or 0 +return coord +end +local Units=self:GetUnits()or{} +for _,_unit in pairs(Units)do +local FirstUnit=_unit +if FirstUnit and FirstUnit:IsAlive()then +local FirstUnitCoordinate=FirstUnit:GetCoordinate() +if FirstUnitCoordinate then +local Heading=self:GetHeading()or 0 +FirstUnitCoordinate.Heading=Heading +return FirstUnitCoordinate +end +end +end +local DCSGroup=Group.getByName(self.GroupName) +if DCSGroup then +local DCSUnits=DCSGroup:getUnits()or{} +for _,_unit in pairs(DCSUnits)do +if Object.isExist(_unit)then +local position=_unit:getPosition() +local point=position.p~=nil and position.p or _unit:GetPoint() +if point then +local coord=COORDINATE:NewFromVec3(point) +coord.Heading=0 +local munit=UNIT:Find(_unit) +if munit then +coord.Heading=munit:GetHeading()or 0 +end +return coord +end +end +end +end +BASE:E({"Cannot GetCoordinate",Group=self,Alive=self:IsAlive()}) +end +function GROUP:GetRandomVec3(Radius) +local FirstUnit=self:GetUnit(1) +if FirstUnit then +local FirstUnitRandomPointVec3=FirstUnit:GetRandomVec3(Radius) +return FirstUnitRandomPointVec3 +end +BASE:E({"Cannot GetRandomVec3",Group=self,Alive=self:IsAlive()}) +return nil +end +function GROUP:GetHeading() +local GroupSize=self:GetSize() +local HeadingAccumulator=0 +local n=0 +local Units=self:GetUnits() +if GroupSize then +for _,unit in pairs(Units)do +if unit and unit:IsAlive()then +HeadingAccumulator=HeadingAccumulator+unit:GetHeading() +n=n+1 +end +end +return math.floor(HeadingAccumulator/n) +end +BASE:E({"Cannot GetHeading",Group=self,Alive=self:IsAlive()}) +return nil +end +function GROUP:GetFuelMin() +if not self:GetDCSObject()then +BASE:E({"Cannot GetFuel",Group=self,Alive=self:IsAlive()}) +return 0 +end +local min=65535 +local unit=nil +local tmp=nil +for UnitID,UnitData in pairs(self:GetUnits())do +if UnitData and UnitData:IsAlive()then +tmp=UnitData:GetFuel() +if tmp<min then +min=tmp +unit=UnitData +end +end +end +return min,unit +end +function GROUP:GetFuelAvg() +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local GroupSize=self:GetSize() +local TotalFuel=0 +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +local UnitFuel=Unit:GetFuel()or 0 +TotalFuel=TotalFuel+UnitFuel +end +local GroupFuel=TotalFuel/GroupSize +return GroupFuel +end +BASE:E({"Cannot GetFuel",Group=self,Alive=self:IsAlive()}) +return 0 +end +function GROUP:GetFuel() +return self:GetFuelAvg() +end +function GROUP:GetAmmunition() +local DCSControllable=self:GetDCSObject() +local Ntot=0 +local Nshells=0 +local Nrockets=0 +local Nmissiles=0 +local Nbombs=0 +local Narti=0 +if DCSControllable then +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +local ntot,nshells,nrockets,nbombs,nmissiles,narti=Unit:GetAmmunition() +Ntot=Ntot+ntot +Nshells=Nshells+nshells +Nrockets=Nrockets+nrockets +Nmissiles=Nmissiles+nmissiles +Nbombs=Nbombs+nbombs +Narti=Narti+narti +end +end +return Ntot,Nshells,Nrockets,Nbombs,Nmissiles,Narti +end +do +function GROUP:IsInZone(Zone) +if self:IsAlive()then +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +local vec2=nil +if Unit then +vec2=Unit:GetVec2() +end +if vec2 and Zone:IsVec2InZone(vec2)then +return true +end +end +return false +end +return nil +end +function GROUP:IsCompletelyInZone(Zone) +if not self:IsAlive()then return false end +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +if Zone:IsVec3InZone(Unit:GetVec3())then +else +return false +end +end +return true +end +function GROUP:IsPartlyInZone(Zone) +local IsOneUnitInZone=false +local IsOneUnitOutsideZone=false +if not self:IsAlive()then return false end +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +if Zone:IsVec3InZone(Unit:GetVec3())then +IsOneUnitInZone=true +else +IsOneUnitOutsideZone=true +end +end +if IsOneUnitInZone and IsOneUnitOutsideZone then +return true +else +return false +end +end +function GROUP:IsPartlyOrCompletelyInZone(Zone) +return self:IsPartlyInZone(Zone)or self:IsCompletelyInZone(Zone) +end +function GROUP:IsNotInZone(Zone) +if not self:IsAlive()then return true end +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +if Zone:IsVec3InZone(Unit:GetVec3())then +return false +end +end +return true +end +function GROUP:IsAnyInZone(Zone) +if not self:IsAlive()then return false end +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +if Zone:IsVec3InZone(Unit:GetVec3())then +return true +end +end +return false +end +function GROUP:CountInZone(Zone) +local Count=0 +if not self:IsAlive()then return Count end +for UnitID,UnitData in pairs(self:GetUnits())do +local Unit=UnitData +if Zone:IsVec3InZone(Unit:GetVec3())then +Count=Count+1 +end +end +return Count +end +function GROUP:IsAir() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local IsAirResult=DCSGroup:getCategory()==Group.Category.AIRPLANE or DCSGroup:getCategory()==Group.Category.HELICOPTER +return IsAirResult +end +return nil +end +function GROUP:IsHelicopter() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCategory=DCSGroup:getCategory() +return GroupCategory==Group.Category.HELICOPTER +end +return nil +end +function GROUP:IsAirPlane() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCategory=DCSGroup:getCategory() +return GroupCategory==Group.Category.AIRPLANE +end +return nil +end +function GROUP:IsGround() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCategory=DCSGroup:getCategory() +return GroupCategory==Group.Category.GROUND +end +return nil +end +function GROUP:IsShip() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupCategory=DCSGroup:getCategory() +return GroupCategory==Group.Category.SHIP +end +return nil +end +function GROUP:AllOnGround() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local AllOnGroundResult=true +for Index,UnitData in pairs(DCSGroup:getUnits())do +if UnitData:inAir()then +AllOnGroundResult=false +end +end +return AllOnGroundResult +end +return nil +end +end +do +function GROUP:SetAIOnOff(AIOnOff) +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local DCSController=DCSGroup:getController() +if DCSController then +DCSController:setOnOff(AIOnOff) +return self +end +end +return nil +end +function GROUP:SetAIOn() +return self:SetAIOnOff(true) +end +function GROUP:SetAIOff() +return self:SetAIOnOff(false) +end +end +function GROUP:GetMaxVelocity() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupVelocityMax=0 +for Index,UnitData in pairs(DCSGroup:getUnits())do +if UnitData:isExist()and UnitData:isActive()then +local UnitVelocityVec3=UnitData:getVelocity() +local UnitVelocity=math.abs(UnitVelocityVec3.x)+math.abs(UnitVelocityVec3.y)+math.abs(UnitVelocityVec3.z) +if UnitVelocity>GroupVelocityMax then +GroupVelocityMax=UnitVelocity +end +end +end +return GroupVelocityMax +end +return nil +end +function GROUP:GetMinHeight() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupHeightMin=999999999 +for Index,UnitData in pairs(DCSGroup:getUnits())do +local UnitData=UnitData +local UnitHeight=UnitData:getPoint() +if UnitHeight<GroupHeightMin then +GroupHeightMin=UnitHeight +end +end +return GroupHeightMin +end +return nil +end +function GROUP:GetMaxHeight() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local GroupHeightMax=-999999999 +for Index,UnitData in pairs(DCSGroup:getUnits())do +local UnitData=UnitData +local UnitHeight=UnitData:getPoint().p.y +if UnitHeight>GroupHeightMax then +GroupHeightMax=UnitHeight +end +end +return GroupHeightMax +end +return nil +end +function GROUP:GetTemplate() +local GroupName=self:GetName() +local template=_DATABASE:GetGroupTemplate(GroupName) +if template then +return UTILS.DeepCopy(template) +end +return nil +end +function GROUP:GetTemplateRoutePoints() +local GroupName=self:GetName() +local template=_DATABASE:GetGroupTemplate(GroupName) +if template and template.route and template.route.points then +return UTILS.DeepCopy(template.route.points) +end +end +function GROUP:SetTemplateControlled(Template,Controlled) +Template.uncontrolled=not Controlled +return Template +end +function GROUP:SetTemplateCountry(Template,CountryID) +Template.CountryID=CountryID +return Template +end +function GROUP:SetTemplateCoalition(Template,CoalitionID) +Template.CoalitionID=CoalitionID +return Template +end +function GROUP:InitHeading(Heading) +self.InitRespawnHeading=Heading +return self +end +function GROUP:InitHeight(Height) +self.InitRespawnHeight=Height +return self +end +function GROUP:InitZone(Zone) +self.InitRespawnZone=Zone +return self +end +function GROUP:InitRandomizePositionZone(PositionZone) +self.InitRespawnRandomizePositionZone=PositionZone +self.InitRespawnRandomizePositionInner=nil +self.InitRespawnRandomizePositionOuter=nil +return self +end +function GROUP:InitRandomizePositionRadius(OuterRadius,InnerRadius) +self.InitRespawnRandomizePositionZone=nil +self.InitRespawnRandomizePositionOuter=OuterRadius +self.InitRespawnRandomizePositionInner=InnerRadius +return self +end +function GROUP:InitCoordinate(coordinate) +self.InitCoord=coordinate +return self +end +function GROUP:InitRadioCommsOnOff(switch) +if switch==true or switch==nil then +self.InitRespawnRadio=true +else +self.InitRespawnRadio=false +end +return self +end +function GROUP:InitRadioFrequency(frequency) +self.InitRespawnFreq=frequency +return self +end +function GROUP:InitRadioModulation(modulation) +if modulation and modulation:lower()=="fm"then +self.InitRespawnModu=radio.modulation.FM +else +self.InitRespawnModu=radio.modulation.AM +end +return self +end +function GROUP:InitModex(modex) +if modex then +self.InitRespawnModex=tonumber(modex) +end +return self +end +function GROUP:Respawn(Template,Reset) +Template=Template or self:GetTemplate() +local function _Heading(course) +local h +if course<=180 then +h=math.rad(course) +else +h=-math.rad(360-course) +end +return h +end +local function TransFormRoute(Template,OldPos,NewPos) +if Template.route and Template.route.points then +for _,_point in ipairs(Template.route.points)do +_point.x=_point.x-OldPos.x+NewPos.x +_point.y=_point.y-OldPos.y+NewPos.y +end +end +return Template +end +if self:IsAlive()then +local OldPos=self:GetVec2() +local Zone=self.InitRespawnZone +local Vec3=Zone and Zone:GetVec3()or self:GetVec3() +local From={x=Template.x,y=Template.y} +Template.x=Vec3.x +Template.y=Vec3.z +local NewPos={x=Vec3.x,y=Vec3.z} +if Reset==true then +for UnitID,UnitData in pairs(self:GetUnits())do +local GroupUnit=UnitData +if GroupUnit:IsAlive()then +local GroupUnitVec3=GroupUnit:GetVec3() +if Zone then +if self.InitRespawnRandomizePositionZone then +GroupUnitVec3=Zone:GetRandomVec3() +else +if self.InitRespawnRandomizePositionInner and self.InitRespawnRandomizePositionOuter then +GroupUnitVec3=COORDINATE:NewFromVec3(From):GetRandomVec3InRadius(self.InitRespawnRandomizePositionsOuter,self.InitRespawnRandomizePositionsInner) +else +GroupUnitVec3=Zone:GetVec3() +end +end +end +if self.InitCoord then +GroupUnitVec3=self.InitCoord:GetVec3() +end +Template.units[UnitID].alt=self.InitRespawnHeight and self.InitRespawnHeight or GroupUnitVec3.y +if Zone then +Template.units[UnitID].x=(Template.units[UnitID].x-From.x)+GroupUnitVec3.x +Template.units[UnitID].y=(Template.units[UnitID].y-From.y)+GroupUnitVec3.z +else +Template.units[UnitID].x=GroupUnitVec3.x +Template.units[UnitID].y=GroupUnitVec3.z +end +Template.units[UnitID].heading=_Heading(self.InitRespawnHeading and self.InitRespawnHeading or GroupUnit:GetHeading()) +Template.units[UnitID].psi=-Template.units[UnitID].heading +end +end +Template=TransFormRoute(Template,OldPos,NewPos) +elseif Reset==false then +for UnitID,TemplateUnitData in pairs(Template.units)do +local GroupUnitVec3={x=TemplateUnitData.x,y=TemplateUnitData.alt,z=TemplateUnitData.y} +if Zone then +if self.InitRespawnRandomizePositionZone then +GroupUnitVec3=Zone:GetRandomVec3() +else +if self.InitRespawnRandomizePositionInner and self.InitRespawnRandomizePositionOuter then +GroupUnitVec3=COORDINATE:NewFromVec2(From):GetRandomPointVec3InRadius(self.InitRespawnRandomizePositionsOuter,self.InitRespawnRandomizePositionsInner) +else +GroupUnitVec3=Zone:GetVec3() +end +end +end +if self.InitCoord then +GroupUnitVec3=self.InitCoord:GetVec3() +end +Template.units[UnitID].alt=self.InitRespawnHeight and self.InitRespawnHeight or GroupUnitVec3.y +Template.units[UnitID].x=(Template.units[UnitID].x-From.x)+GroupUnitVec3.x +Template.units[UnitID].y=(Template.units[UnitID].y-From.y)+GroupUnitVec3.z +Template.units[UnitID].heading=self.InitRespawnHeading and self.InitRespawnHeading or TemplateUnitData.heading +end +Template=TransFormRoute(Template,OldPos,NewPos) +else +local units=self:GetUnits() +for UnitID,Unit in pairs(Template.units)do +for _,_unit in pairs(units)do +local unit=_unit +if unit:GetName()==Unit.name then +local coord=unit:GetCoordinate() +local heading=unit:GetHeading() +Unit.x=coord.x +Unit.y=coord.z +Unit.alt=coord.y +Unit.heading=math.rad(heading) +Unit.psi=-Unit.heading +end +end +end +end +end +if self.InitRespawnModex then +for UnitID=1,#Template.units do +Template.units[UnitID].onboard_num=string.format("%03d",self.InitRespawnModex+(UnitID-1)) +end +end +if self.InitRespawnRadio then +Template.communication=self.InitRespawnRadio +end +if self.InitRespawnFreq then +Template.frequency=self.InitRespawnFreq +end +if self.InitRespawnModu then +Template.modulation=self.InitRespawnModu +end +self:Destroy(false) +if self.ValidateAndRepositionGroundUnits then +UTILS.ValidateAndRepositionGroundUnits(Template.units) +end +self:ScheduleOnce(0.1,_DATABASE.Spawn,_DATABASE,Template) +self:ResetEvents() +return self +end +function GROUP:Teleport(Coordinate) +self:InitZone(Coordinate) +return self:Respawn(nil,false) +end +function GROUP:RespawnAtCurrentAirbase(SpawnTemplate,Takeoff,Uncontrolled) +if self and self:IsAlive()then +local airbase=self:GetCoordinate():GetClosestAirbase() +if airbase then +else +self:E("ERROR: could not find closest airbase!") +return nil +end +Takeoff=Takeoff or SPAWN.Takeoff.Hot +local AirbaseCoord=airbase:GetCoordinate() +SpawnTemplate=SpawnTemplate or self:GetTemplate() +if SpawnTemplate then +local SpawnPoint=SpawnTemplate.route.points[1] +SpawnPoint.linkUnit=nil +SpawnPoint.helipadId=nil +SpawnPoint.airdromeId=nil +local AirbaseID=airbase:GetID() +local AirbaseCategory=airbase:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP or AirbaseCategory==Airbase.Category.HELIPAD then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.AIRDROME then +SpawnPoint.airdromeId=AirbaseID +end +SpawnPoint.type=GROUPTEMPLATE.Takeoff[Takeoff][1] +SpawnPoint.action=GROUPTEMPLATE.Takeoff[Takeoff][2] +local units=self:GetUnits() +local x +local y +for UnitID=1,#units do +local unit=units[UnitID] +local Parkingspot,TermialID,Distance=unit:GetCoordinate():GetClosestParkingSpot(airbase) +local uc=unit:GetCoordinate() +SpawnTemplate.units[UnitID].x=uc.x +SpawnTemplate.units[UnitID].y=uc.z +SpawnTemplate.units[UnitID].alt=uc.y +SpawnTemplate.units[UnitID].parking=TermialID +SpawnTemplate.units[UnitID].parking_id=nil +end +SpawnPoint.x=SpawnTemplate.units[1].x +SpawnPoint.y=SpawnTemplate.units[1].y +SpawnPoint.alt=SpawnTemplate.units[1].alt +SpawnTemplate.x=SpawnTemplate.units[1].x +SpawnTemplate.y=SpawnTemplate.units[1].y +SpawnTemplate.uncontrolled=Uncontrolled +if self.InitRespawnRadio then +SpawnTemplate.communication=self.InitRespawnRadio +end +if self.InitRespawnFreq then +SpawnTemplate.frequency=self.InitRespawnFreq +end +if self.InitRespawnModu then +SpawnTemplate.modulation=self.InitRespawnModu +end +self:Destroy(false) +_DATABASE:Spawn(SpawnTemplate) +self:ResetEvents() +return self +end +else +self:E("WARNING: GROUP is not alive!") +end +return nil +end +function GROUP:GetTaskMission() +return UTILS.DeepCopy(_DATABASE.Templates.Groups[self.GroupName].Template) +end +function GROUP:GetTaskRoute() +if _DATABASE.Templates.Groups[self.GroupName].Template and _DATABASE.Templates.Groups[self.GroupName].Template.route and _DATABASE.Templates.Groups[self.GroupName].Template.route.points then +return UTILS.DeepCopy(_DATABASE.Templates.Groups[self.GroupName].Template.route.points) +else +return{} +end +end +function GROUP:CopyRoute(Begin,End,Randomize,Radius) +local Points={} +local GroupName=string.match(self:GetName(),".*#") +if GroupName then +GroupName=GroupName:sub(1,-2) +else +GroupName=self:GetName() +end +local Template=_DATABASE.Templates.Groups[GroupName].Template +if Template then +if not Begin then +Begin=0 +end +if not End then +End=0 +end +for TPointID=Begin+1,#Template.route.points-End do +if Template.route.points[TPointID]then +Points[#Points+1]=UTILS.DeepCopy(Template.route.points[TPointID]) +if Randomize then +if not Radius then +Radius=500 +end +Points[#Points].x=Points[#Points].x+math.random(Radius*-1,Radius) +Points[#Points].y=Points[#Points].y+math.random(Radius*-1,Radius) +end +end +end +return Points +else +error("Template not found for Group : "..GroupName) +end +return nil +end +function GROUP:CalculateThreatLevelA2G() +local MaxThreatLevelA2G=0 +for UnitName,UnitData in pairs(self:GetUnits())do +local ThreatUnit=UnitData +local ThreatLevelA2G=ThreatUnit:GetThreatLevel() +if ThreatLevelA2G>MaxThreatLevelA2G then +MaxThreatLevelA2G=ThreatLevelA2G +end +end +return MaxThreatLevelA2G +end +function GROUP:GetThreatLevel() +local threatlevelMax=0 +for UnitName,UnitData in pairs(self:GetUnits())do +local ThreatUnit=UnitData +local threatlevel=ThreatUnit:GetThreatLevel() +if threatlevel>threatlevelMax then +threatlevelMax=threatlevel +end +end +return threatlevelMax +end +function GROUP:InAir() +local DCSGroup=self:GetDCSObject() +if DCSGroup then +local DCSUnit=DCSGroup:getUnit(1) +if DCSUnit then +local GroupInAir=DCSGroup:getUnit(1):inAir() +return GroupInAir +end +end +return nil +end +function GROUP:IsAirborne(AllUnits) +local units=self:GetUnits() +if units then +if AllUnits then +for _,_unit in pairs(units)do +local unit=_unit +if unit then +local inair=unit:InAir() +if not inair then +return false +end +end +end +return true +else +for _,_unit in pairs(units)do +local unit=_unit +if unit then +local inair=unit:InAir() +if inair then +return true +end +end +return false +end +end +end +return nil +end +function GROUP:GetDCSDesc(n) +n=n or 1 +local unit=self:GetUnit(n) +if unit and unit:IsAlive()~=nil then +local desc=unit:GetDesc() +return desc +end +return nil +end +function GROUP:GetAttribute() +local attribute=GROUP.Attribute.OTHER_UNKNOWN +if self then +local transportplane=self:HasAttribute("Transports")and self:HasAttribute("Planes") +local awacs=self:HasAttribute("AWACS") +local fighter=self:HasAttribute("Fighters")or self:HasAttribute("Interceptors")or self:HasAttribute("Multirole fighters")or(self:HasAttribute("Bombers")and not self:HasAttribute("Strategic bombers")) +local bomber=self:HasAttribute("Strategic bombers") +local tanker=self:HasAttribute("Tankers") +local uav=self:HasAttribute("UAVs") +local transporthelo=self:HasAttribute("Transport helicopters") +local attackhelicopter=self:HasAttribute("Attack helicopters") +local apc=self:HasAttribute("APC") +local truck=self:HasAttribute("Trucks")and self:GetCategory()==Group.Category.GROUND +local infantry=self:HasAttribute("Infantry") +local artillery=self:HasAttribute("Artillery") +local tank=self:HasAttribute("Old Tanks")or self:HasAttribute("Modern Tanks")or self:HasAttribute("Tanks") +local aaa=self:HasAttribute("AAA")and(not self:HasAttribute("SAM elements")) +local ballisticMissile=artillery and self:HasAttribute("SS_missile") +local shorad=self:HasAttribute("SR SAM") +local ewr=self:HasAttribute("EWR") +local ifv=self:HasAttribute("IFV") +local sam=self:HasAttribute("SAM elements")or self:HasAttribute("Optical Tracker") +local train=self:GetCategory()==Group.Category.TRAIN +local aircraftcarrier=self:HasAttribute("Aircraft Carriers") +local warship=self:HasAttribute("Heavy armed ships") +local armedship=self:HasAttribute("Armed ships") +local unarmedship=self:HasAttribute("Unarmed ships") +if fighter then +attribute=GROUP.Attribute.AIR_FIGHTER +elseif bomber then +attribute=GROUP.Attribute.AIR_BOMBER +elseif awacs then +attribute=GROUP.Attribute.AIR_AWACS +elseif transportplane then +attribute=GROUP.Attribute.AIR_TRANSPORTPLANE +elseif tanker then +attribute=GROUP.Attribute.AIR_TANKER +elseif attackhelicopter then +attribute=GROUP.Attribute.AIR_ATTACKHELO +elseif transporthelo then +attribute=GROUP.Attribute.AIR_TRANSPORTHELO +elseif uav then +attribute=GROUP.Attribute.AIR_UAV +elseif ewr then +attribute=GROUP.Attribute.GROUND_EWR +elseif sam then +attribute=GROUP.Attribute.GROUND_SAM +elseif aaa then +attribute=GROUP.Attribute.GROUND_AAA +elseif artillery and ballisticMissile then +attribute=GROUP.Attribute.GROUND_BALLISTICMISSILE +elseif artillery then +attribute=GROUP.Attribute.GROUND_ARTILLERY +elseif tank then +attribute=GROUP.Attribute.GROUND_TANK +elseif ifv then +attribute=GROUP.Attribute.GROUND_IFV +elseif apc then +attribute=GROUP.Attribute.GROUND_APC +elseif infantry then +attribute=GROUP.Attribute.GROUND_INFANTRY +elseif truck then +attribute=GROUP.Attribute.GROUND_TRUCK +elseif train then +attribute=GROUP.Attribute.GROUND_TRAIN +elseif aircraftcarrier then +attribute=GROUP.Attribute.NAVAL_AIRCRAFTCARRIER +elseif warship then +attribute=GROUP.Attribute.NAVAL_WARSHIP +elseif armedship then +attribute=GROUP.Attribute.NAVAL_ARMEDSHIP +elseif unarmedship then +attribute=GROUP.Attribute.NAVAL_UNARMEDSHIP +else +if self:IsGround()then +attribute=GROUP.Attribute.GROUND_OTHER +elseif self:IsShip()then +attribute=GROUP.Attribute.NAVAL_OTHER +elseif self:IsAir()then +attribute=GROUP.Attribute.AIR_OTHER +else +attribute=GROUP.Attribute.OTHER_UNKNOWN +end +end +end +return attribute +end +do +function GROUP:RouteRTB(RTBAirbase,Speed) +local DCSGroup=self:GetDCSObject() +if DCSGroup then +if RTBAirbase then +local Speed=Speed or self:GetSpeedMax()*0.8 +local coord=self:GetCoordinate() +local PointFrom=coord:WaypointAirTurningPoint(nil,Speed) +local PointLanding=RTBAirbase:GetCoordinate():WaypointAirLanding(Speed,RTBAirbase) +local Points={PointFrom,PointLanding} +local Template=self:GetTemplate() +Template.route.points=Points +self:Respawn(Template,true) +self:Route(Points) +else +self:ClearTasks() +end +end +return self +end +end +function GROUP:OnReSpawn(ReSpawnFunction) +self.ReSpawnFunction=ReSpawnFunction +end +do +function GROUP:HandleEvent(Event,EventFunction,...) +self:EventDispatcher():OnEventForGroup(self:GetName(),EventFunction,self,Event,...) +return self +end +function GROUP:UnHandleEvent(Event) +self:EventDispatcher():RemoveEvent(self,Event) +return self +end +function GROUP:ResetEvents() +self:EventDispatcher():Reset(self) +for UnitID,UnitData in pairs(self:GetUnits()or{})do +UnitData:ResetEvents() +end +return self +end +end +do +function GROUP:GetPlayerNames() +local HasPlayers=false +local PlayerNames={} +local Units=self:GetUnits() +for UnitID,UnitData in pairs(Units or{})do +local Unit=UnitData +local PlayerName=Unit:GetPlayerName() +if PlayerName and PlayerName~=""then +PlayerNames=PlayerNames or{} +table.insert(PlayerNames,PlayerName) +HasPlayers=true +end +end +if HasPlayers==true then +return PlayerNames +end +return nil +end +function GROUP:GetPlayerCount() +local PlayerCount=0 +local Units=self:GetUnits() +for UnitID,UnitData in pairs(Units or{})do +local Unit=UnitData +local PlayerName=Unit:GetPlayerName() +if PlayerName and PlayerName~=""then +PlayerCount=PlayerCount+1 +end +end +return PlayerCount +end +end +function GROUP:EnableEmission(switch) +local switch=switch or false +local DCSUnit=self:GetDCSObject() +if DCSUnit then +DCSUnit:enableEmission(switch) +end +return self +end +function GROUP:SetCommandInvisible(switch) +return self:CommandSetInvisible(switch) +end +function GROUP:CommandSetInvisible(switch) +if switch==nil then +switch=false +end +local SetInvisible={id='SetInvisible',params={value=switch}} +self:SetCommand(SetInvisible) +return self +end +function GROUP:SetCommandImmortal(switch) +return self:CommandSetImmortal(switch) +end +function GROUP:CommandSetImmortal(switch) +if switch==nil then +switch=false +end +local SetImmortal={id='SetImmortal',params={value=switch}} +self:SetCommand(SetImmortal) +return self +end +function GROUP:GetSkill() +local unit=self:GetUnit(1) +local name=unit:GetName() +local skill=_DATABASE.Templates.Units[name].Template.skill or"Random" +return skill +end +function GROUP:GetHighestThreat() +local units=self:GetUnits() +if units then +local threat=nil;local maxtl=0 +for _,_unit in pairs(units or{})do +local unit=_unit +if unit and unit:IsAlive()then +local tl=unit:GetThreatLevel() +if tl>maxtl then +maxtl=tl +threat=unit +end +end +end +return threat,maxtl +end +return nil,nil +end +function GROUP:GetCustomCallSign(ShortCallsign,Keepnumber,CallsignTranslations,CustomFunction,...) +self:T("GetCustomCallSign") +local callsign="Ghost 1" +if self:IsAlive()then +local IsPlayer=self:IsPlayer() +local shortcallsign=self:GetCallsign()or"unknown91" +local callsignroot=string.match(shortcallsign,'(%a+)')or"Ghost" +local groupname=self:GetName() +local callnumber=string.match(shortcallsign,"(%d+)$")or"91" +local callnumbermajor=string.char(string.byte(callnumber,1)) +local callnumberminor=string.char(string.byte(callnumber,2)) +local personalized=false +local playername=shortcallsign +if IsPlayer then playername=self:GetPlayerName()end +self:T2("GetCustomCallSign outcome = "..playername) +if CustomFunction and IsPlayer then +local arguments=arg or{} +local callsign=CustomFunction(groupname,playername,unpack(arguments)) +return callsign +end +if CallsignTranslations and CallsignTranslations[callsignroot]then +callsignroot=CallsignTranslations[callsignroot] +elseif IsPlayer and string.find(groupname,"#")then +if Keepnumber then +shortcallsign=string.match(groupname,"#(.+)")or"Ghost 111" +else +shortcallsign=string.match(groupname,"#%s*([%a]+)")or"Ghost" +end +personalized=true +elseif IsPlayer and string.find(playername,"|")then +shortcallsign=string.match(playername,"|%s*([%a]+)")or string.match(self:GetPlayerName(),"|%s*([%d]+)")or"Ghost" +personalized=true +end +if personalized then +shortcallsign=string.gsub(shortcallsign,"^%s*","") +shortcallsign=string.gsub(shortcallsign,"%s*$","") +if Keepnumber then +return shortcallsign +elseif ShortCallsign then +callsign=shortcallsign.." "..callnumbermajor +else +callsign=shortcallsign.." "..callnumbermajor.." "..callnumberminor +end +return callsign +end +if ShortCallsign then +callsign=callsignroot.." "..callnumbermajor +else +callsign=callsignroot.." "..callnumbermajor.." "..callnumberminor +end +end +return callsign +end +function GROUP:SetAsRecoveryTanker(CarrierGroup,Speed,ToKIAS,Altitude,Delay,LastWaypoint) +local speed=ToKIAS==true and UTILS.KnotsToAltKIAS(Speed,Altitude)or Speed +speed=UTILS.KnotsToMps(speed) +local alt=UTILS.FeetToMeters(Altitude) +local delay=Delay or 1 +local task=self:TaskRecoveryTanker(CarrierGroup,speed,alt,LastWaypoint) +self:SetTask(task,delay) +local tankertask=self:EnRouteTaskTanker() +self:PushTask(tankertask,delay+2) +return self +end +function GROUP:GetGroupSTN() +local tSTN={} +local units=self:GetUnits() +local gname=self:GetName() +gname=string.gsub(gname,"(#%d+)$","") +local report=REPORT:New() +report:Add("Link16 S/TN Report") +report:Add("Group: "..gname) +report:Add("==================") +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()then +local STN,VCL,VCN,Lead=unit:GetSTN() +local name=unit:GetName() +tSTN[name]={ +STN=STN, +VCL=VCL, +VCN=VCN, +Lead=Lead, +} +local lead=Lead==true and"(*)"or"" +report:Add(string.format("| %s%s %s %s",tostring(VCL),tostring(VCN),tostring(STN),lead)) +end +end +report:Add("==================") +local text=report:Text() +return tSTN,text +end +function GROUP:IsSAM() +local issam=false +local units=self:GetUnits() +for _,_unit in pairs(units or{})do +local unit=_unit +if unit:IsSAM()then +issam=true +break +end +end +return issam +end +function GROUP:IsAAA() +local isAAA=false +local units=self:GetUnits() +for _,_unit in pairs(units or{})do +local unit=_unit +if unit:IsAAA()then +isAAA=true +break +end +end +return isAAA +end +function GROUP:SetValidateAndRepositionGroundUnits(Enabled) +self.ValidateAndRepositionGroundUnits=Enabled +end +function GROUP:GetBoundingBox() +local bbox={min={x=math.huge,y=math.huge,z=math.huge}, +max={x=-math.huge,y=-math.huge,z=-math.huge} +} +local Units=self:GetUnits()or{} +if#Units==0 then +return nil +end +for _,unit in pairs(Units)do +if unit and unit:IsAlive()then +local ubox=unit:GetBoundingBox() +if ubox then +if ubox.min.x<bbox.min.x then +bbox.min.x=ubox.min.x +end +if ubox.min.y<bbox.min.y then +bbox.min.y=ubox.min.y +end +if ubox.min.z<bbox.min.z then +bbox.min.z=ubox.min.z +end +if ubox.max.x>bbox.max.x then +bbox.max.x=ubox.max.x +end +if ubox.max.y>bbox.max.y then +bbox.max.y=ubox.max.y +end +if ubox.max.z>bbox.max.z then +bbox.max.z=ubox.max.z +end +end +end +end +return bbox +end +UNIT={ +ClassName="UNIT", +UnitName=nil, +GroupName=nil, +DCSUnit=nil, +} +function UNIT:Register(UnitName) +local self=BASE:Inherit(self,CONTROLLABLE:New(UnitName)) +self.UnitName=UnitName +local unit=Unit.getByName(self.UnitName) +if unit then +local group=unit:getGroup() +if group then +self.GroupName=group:getName() +self.groupId=group:getID() +end +self.DCSUnit=unit +end +self:SetEventPriority(3) +return self +end +function UNIT:Find(DCSUnit) +if DCSUnit then +local UnitName=DCSUnit:getName() +local UnitFound=_DATABASE:FindUnit(UnitName) +return UnitFound +end +return nil +end +function UNIT:FindByName(UnitName) +local UnitFound=_DATABASE:FindUnit(UnitName) +return UnitFound +end +function UNIT:FindByMatching(Pattern) +local GroupFound=nil +for name,group in pairs(_DATABASE.UNITS)do +if string.match(name,Pattern)then +GroupFound=group +break +end +end +return GroupFound +end +function UNIT:FindAllByMatching(Pattern) +local GroupsFound={} +for name,group in pairs(_DATABASE.UNITS)do +if string.match(name,Pattern)then +GroupsFound[#GroupsFound+1]=group +end +end +return GroupsFound +end +function UNIT:Name() +return self.UnitName +end +function UNIT:GetDCSObject() +if(not self.LastCallDCSObject)or(self.LastCallDCSObject and timer.getTime()-self.LastCallDCSObject>1)or(self.DCSObject==nil)or(self.DCSObject:isExist()==false)then +local DCSUnit=Unit.getByName(self.UnitName) +if DCSUnit then +self.LastCallDCSObject=timer.getTime() +self.DCSObject=DCSUnit +return DCSUnit +else +self.DCSObject=nil +self.LastCallDCSObject=nil +end +else +return self.DCSObject +end +return nil +end +function UNIT:GetAltitude(FromGround) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local altitude=0 +local point=DCSUnit:getPoint() +altitude=point.y +if FromGround then +local land=land.getHeight({x=point.x,y=point.z})or 0 +altitude=altitude-land +end +return altitude +end +return nil +end +function UNIT:ReSpawnAt(Coordinate,Heading) +local SpawnGroupTemplate=UTILS.DeepCopy(_DATABASE:GetGroupTemplateFromUnitName(self:Name())) +local SpawnGroup=self:GetGroup() +if SpawnGroup then +local Vec3=SpawnGroup:GetVec3() +SpawnGroupTemplate.x=Coordinate.x +SpawnGroupTemplate.y=Coordinate.z +for UnitID,UnitData in pairs(SpawnGroup:GetUnits()or{})do +local GroupUnit=UnitData +if GroupUnit:IsAlive()then +local GroupUnitVec3=GroupUnit:GetVec3() +local GroupUnitHeading=GroupUnit:GetHeading() +SpawnGroupTemplate.units[UnitID].alt=GroupUnitVec3.y +SpawnGroupTemplate.units[UnitID].x=GroupUnitVec3.x +SpawnGroupTemplate.units[UnitID].y=GroupUnitVec3.z +SpawnGroupTemplate.units[UnitID].heading=GroupUnitHeading +end +end +end +for UnitTemplateID,UnitTemplateData in pairs(SpawnGroupTemplate.units)do +SpawnGroupTemplate.units[UnitTemplateID].unitId=nil +if UnitTemplateData.name==self:Name()then +SpawnGroupTemplate.units[UnitTemplateID].alt=Coordinate.y +SpawnGroupTemplate.units[UnitTemplateID].x=Coordinate.x +SpawnGroupTemplate.units[UnitTemplateID].y=Coordinate.z +SpawnGroupTemplate.units[UnitTemplateID].heading=Heading +else +local GroupUnit=UNIT:FindByName(SpawnGroupTemplate.units[UnitTemplateID].name) +if GroupUnit and GroupUnit:IsAlive()then +local GroupUnitVec3=GroupUnit:GetVec3() +local GroupUnitHeading=GroupUnit:GetHeading() +UnitTemplateData.alt=GroupUnitVec3.y +UnitTemplateData.x=GroupUnitVec3.x +UnitTemplateData.y=GroupUnitVec3.z +UnitTemplateData.heading=GroupUnitHeading +else +if SpawnGroupTemplate.units[UnitTemplateID].name~=self:Name()then +SpawnGroupTemplate.units[UnitTemplateID].delete=true +end +end +end +end +local i=1 +while i<=#SpawnGroupTemplate.units do +local UnitTemplateData=SpawnGroupTemplate.units[i] +if UnitTemplateData.delete then +table.remove(SpawnGroupTemplate.units,i) +else +i=i+1 +end +end +SpawnGroupTemplate.groupId=nil +if self.ValidateAndRepositionGroundUnits then +UTILS.ValidateAndRepositionGroundUnits(SpawnGroupTemplate.units) +end +_DATABASE:Spawn(SpawnGroupTemplate) +end +function UNIT:IsActive() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitIsActive=DCSUnit:isActive() +return UnitIsActive +end +return nil +end +function UNIT:IsExist() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local exists=DCSUnit:isExist() +return exists +end +return nil +end +function UNIT:IsAlive() +local DCSUnit=self:GetDCSObject() +if DCSUnit and DCSUnit:isExist()then +local UnitIsAlive=DCSUnit:isActive() +return UnitIsAlive +end +return nil +end +function UNIT:IsDead() +return not self:IsAlive() +end +function UNIT:GetCallsign() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitCallSign=DCSUnit:getCallsign() +if UnitCallSign==""then +UnitCallSign=DCSUnit:getName() +end +return UnitCallSign +end +return nil +end +function UNIT:IsPlayer() +local group=self:GetGroup() +if not group then +return false +end +local template=group:GetTemplate() +if(template==nil)or(template.units==nil)then +local DCSObject=self:GetDCSObject() +if DCSObject then +if DCSObject:getPlayerName()~=nil then +return true +else +return false +end +else +return false +end +end +local units=template.units +for _,unit in pairs(units)do +if unit.name==self:GetName()and(unit.skill=="Client"or unit.skill=="Player")then +return true +end +end +return false +end +function UNIT:GetPlayerName() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local PlayerName=DCSUnit:getPlayerName() +return PlayerName +end +return nil +end +function UNIT:IsClient() +if _DATABASE.CLIENTS[self.UnitName]then +return true +end +return false +end +function UNIT:GetClient() +local client=_DATABASE.CLIENTS[self.UnitName] +if client then +return client +end +return nil +end +function UNIT:GetNatoReportingName() +local typename=self:GetTypeName() +return UTILS.GetReportingName(typename) +end +function UNIT:GetNumber() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitNumber=DCSUnit:getNumber() +return UnitNumber +end +return nil +end +function UNIT:GetSpeedMax() +local Desc=self:GetDesc() +if Desc then +local SpeedMax=Desc.speedMax or 0 +return SpeedMax*3.6 +end +return 0 +end +function UNIT:GetRange() +local Desc=self:GetDesc() +if Desc then +local Range=Desc.range +if Range then +Range=Range*1000 +else +Range=10000000 +end +return Range +end +return nil +end +function UNIT:IsRefuelable() +local refuelable=self:HasAttribute("Refuelable") +local system=nil +local Desc=self:GetDesc() +if Desc and Desc.tankerType then +system=Desc.tankerType +end +return refuelable,system +end +function UNIT:IsTanker() +local tanker=self:HasAttribute("Tankers") +local system=nil +if tanker then +local Desc=self:GetDesc() +if Desc and Desc.tankerType then +system=Desc.tankerType +end +local typename=self:GetTypeName() +if typename=="IL-78M"then +system=1 +elseif typename=="KC130"or typename=="KC130J"then +system=1 +elseif typename=="KC135BDA"then +system=1 +elseif typename=="KC135MPRS"then +system=1 +elseif typename=="S-3B Tanker"then +system=1 +elseif typename=="KC_10_Extender"then +system=1 +elseif typename=="KC_10_Extender_D"then +system=0 +end +end +return tanker,system +end +function UNIT:IsAmmoSupply() +local typename=self:GetTypeName() +if typename=="M 818"then +return true +elseif typename=="Ural-375"then +return true +elseif typename=="ZIL-135"then +return true +end +return false +end +function UNIT:IsFuelSupply() +local typename=self:GetTypeName() +if typename=="M978 HEMTT Tanker"then +return true +elseif typename=="ATMZ-5"then +return true +elseif typename=="ATMZ-10"then +return true +elseif typename=="ATZ-5"then +return true +end +return false +end +function UNIT:GetGroup() +local UnitGroup=GROUP:FindByName(self.GroupName) +if UnitGroup then +return UnitGroup +else +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local grp=DCSUnit:getGroup() +if grp then +local UnitGroup=GROUP:FindByName(grp:getName()) +return UnitGroup +end +end +end +return nil +end +function UNIT:GetPrefix() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitPrefix=string.match(self.UnitName,".*#"):sub(1,-2) +return UnitPrefix +end +return nil +end +function UNIT:GetAmmo() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitAmmo=DCSUnit:getAmmo() +return UnitAmmo +end +return nil +end +function UNIT:SetUnitInternalCargo(mass) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +trigger.action.setUnitInternalCargo(DCSUnit:getName(),mass) +end +return self +end +function UNIT:GetAmmunition() +local nammo=0 +local nshells=0 +local nrockets=0 +local nmissiles=0 +local nbombs=0 +local narti=0 +local nAPshells=0 +local nHEshells=0 +local unit=self +local ammotable=unit:GetAmmo() +if ammotable then +local weapons=#ammotable +for w=1,weapons do +local Nammo=ammotable[w]["count"] +local Tammo=ammotable[w]["desc"]["typeName"] +local Category=ammotable[w].desc.category +local MissileCategory=nil +if Category==Weapon.Category.MISSILE then +MissileCategory=ammotable[w].desc.missileCategory +end +if Category==Weapon.Category.SHELL then +nshells=nshells+Nammo +if ammotable[w].desc.warhead and ammotable[w].desc.warhead.explosiveMass and ammotable[w].desc.warhead.explosiveMass>0 then +narti=narti+Nammo +end +if ammotable[w].desc.typeName and string.find(ammotable[w].desc.typeName,"_AP",1,true)then +nAPshells=nAPshells+Nammo +end +if ammotable[w].desc.typeName and(string.find(ammotable[w].desc.typeName,"_HE",1,true)or string.find(ammotable[w].desc.typeName,"HESH",1,true))then +nHEshells=nHEshells+Nammo +end +elseif Category==Weapon.Category.ROCKET then +nrockets=nrockets+Nammo +elseif Category==Weapon.Category.BOMB then +nbombs=nbombs+Nammo +elseif Category==Weapon.Category.MISSILE then +if MissileCategory==Weapon.MissileCategory.AAM then +nmissiles=nmissiles+Nammo +elseif MissileCategory==Weapon.MissileCategory.ANTI_SHIP then +nmissiles=nmissiles+Nammo +elseif MissileCategory==Weapon.MissileCategory.BM then +nmissiles=nmissiles+Nammo +elseif MissileCategory==Weapon.MissileCategory.OTHER then +nmissiles=nmissiles+Nammo +elseif MissileCategory==Weapon.MissileCategory.SAM then +nmissiles=nmissiles+Nammo +elseif MissileCategory==Weapon.MissileCategory.CRUISE then +nmissiles=nmissiles+Nammo +end +end +end +end +nammo=nshells+nrockets+nmissiles+nbombs +return nammo,nshells,nrockets,nbombs,nmissiles,narti,nAPshells,nHEshells +end +function UNIT:HasAPShells() +local _,_,_,_,_,_,shells=self:GetAmmunition() +if shells>0 then +return true +else +return false +end +end +function UNIT:GetAPShells() +local _,_,_,_,_,_,shells=self:GetAmmunition() +return shells or 0 +end +function UNIT:GetHEShells() +local _,_,_,_,_,_,_,shells=self:GetAmmunition() +return shells or 0 +end +function UNIT:HasHEShells() +local _,_,_,_,_,_,_,shells=self:GetAmmunition() +if shells>0 then +return true +else +return false +end +end +function UNIT:HasArtiShells() +local _,_,_,_,_,shells=self:GetAmmunition() +if shells>0 then +return true +else +return false +end +end +function UNIT:GetArtiShells() +local _,_,_,_,_,shells=self:GetAmmunition() +return shells or 0 +end +function UNIT:GetSensors() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitSensors=DCSUnit:getSensors() +return UnitSensors +end +return nil +end +function UNIT:HasSensors(...) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local HasSensors=DCSUnit:hasSensors(unpack(arg)) +return HasSensors +end +return nil +end +function UNIT:HasSEAD() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitSEADAttributes=DCSUnit:getDesc().attributes +local HasSEAD=false +if UnitSEADAttributes["RADAR_BAND1_FOR_ARM"]and UnitSEADAttributes["RADAR_BAND1_FOR_ARM"]==true or +UnitSEADAttributes["RADAR_BAND2_FOR_ARM"]and UnitSEADAttributes["RADAR_BAND2_FOR_ARM"]==true or +UnitSEADAttributes["Optical Tracker"]and UnitSEADAttributes["Optical Tracker"]==true +then +HasSEAD=true +end +return HasSEAD +end +return nil +end +function UNIT:GetRadar() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitRadarOn,UnitRadarObject=DCSUnit:getRadar() +return UnitRadarOn,UnitRadarObject +end +return nil,nil +end +function UNIT:GetFuel() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitFuel=DCSUnit:getFuel() +return UnitFuel +end +return nil +end +function UNIT:GetUnits() +local DCSUnit=self:GetDCSObject() +local Units={} +if DCSUnit then +Units[1]=UNIT:Find(DCSUnit) +return Units +end +return nil +end +function UNIT:GetLife() +local DCSUnit=self:GetDCSObject() +if DCSUnit and DCSUnit:isExist()then +local UnitLife=DCSUnit:getLife() +return UnitLife +end +return-1 +end +function UNIT:GetLife0() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitLife0=DCSUnit:getLife0() +return UnitLife0 +end +return 0 +end +function UNIT:GetLifeRelative() +if self and self:IsAlive()then +local life0=self:GetLife0() +local lifeN=self:GetLife() +return lifeN/life0 +end +return-1 +end +function UNIT:GetDamageRelative() +if self and self:IsAlive()then +return 1-self:GetLifeRelative() +end +return 1 +end +function UNIT:GetDrawArgumentValue(AnimationArgument) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local value=DCSUnit:getDrawArgumentValue(AnimationArgument or 0) +return value +end +return 0 +end +function UNIT:GetUnitCategory() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +return DCSUnit:getDesc().category +end +return nil +end +function UNIT:GetCategoryName() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local CategoryNames={ +[Unit.Category.AIRPLANE]="Airplane", +[Unit.Category.HELICOPTER]="Helicopter", +[Unit.Category.GROUND_UNIT]="Ground Unit", +[Unit.Category.SHIP]="Ship", +[Unit.Category.STRUCTURE]="Structure", +} +local UnitCategory=DCSUnit:getDesc().category +return CategoryNames[UnitCategory] +end +return nil +end +function UNIT:GetThreatLevel() +local ThreatLevel=0 +local ThreatText="" +local Descriptor=self:GetDesc() +if Descriptor then +local Attributes=Descriptor.attributes +if self:IsGround()then +local ThreatLevels={ +[1]="Unarmed", +[2]="Infantry", +[3]="Old Tanks & APCs", +[4]="Tanks & IFVs without ATGM", +[5]="Tanks & IFV with ATGM", +[6]="Modern Tanks", +[7]="AAA", +[8]="IR Guided SAMs", +[9]="SR SAMs", +[10]="MR SAMs", +[11]="LR SAMs" +} +if Attributes["LR SAM"]then +ThreatLevel=10 +elseif Attributes["MR SAM"]then +ThreatLevel=9 +elseif Attributes["SR SAM"]and +not Attributes["IR Guided SAM"]then +ThreatLevel=8 +elseif(Attributes["SR SAM"]or Attributes["MANPADS"])and +Attributes["IR Guided SAM"]then +ThreatLevel=7 +elseif Attributes["AAA"]then +ThreatLevel=6 +elseif Attributes["Modern Tanks"]then +ThreatLevel=5 +elseif(Attributes["Tanks"]or Attributes["IFV"])and +Attributes["ATGM"]then +ThreatLevel=4 +elseif(Attributes["Tanks"]or Attributes["IFV"])and +not Attributes["ATGM"]then +ThreatLevel=3 +elseif Attributes["Old Tanks"]or Attributes["APC"]or Attributes["Artillery"]then +ThreatLevel=2 +elseif Attributes["Infantry"]or Attributes["EWR"]then +ThreatLevel=1 +end +ThreatText=ThreatLevels[ThreatLevel+1] +end +if self:IsAir()then +local ThreatLevels={ +[1]="Unarmed", +[2]="Tanker", +[3]="AWACS", +[4]="Transport Helicopter", +[5]="UAV", +[6]="Bomber", +[7]="Strategic Bomber", +[8]="Attack Helicopter", +[9]="Battleplane", +[10]="Multirole Fighter", +[11]="Fighter" +} +if Attributes["Fighters"]then +ThreatLevel=10 +elseif Attributes["Multirole fighters"]then +ThreatLevel=9 +elseif Attributes["Interceptors"]then +ThreatLevel=9 +elseif Attributes["Battleplanes"]then +ThreatLevel=8 +elseif Attributes["Battle airplanes"]then +ThreatLevel=8 +elseif Attributes["Attack helicopters"]then +ThreatLevel=7 +elseif Attributes["Strategic bombers"]then +ThreatLevel=6 +elseif Attributes["Bombers"]then +ThreatLevel=5 +elseif Attributes["UAVs"]then +ThreatLevel=4 +elseif Attributes["Transport helicopters"]then +ThreatLevel=3 +elseif Attributes["AWACS"]then +ThreatLevel=2 +elseif Attributes["Tankers"]then +ThreatLevel=1 +end +ThreatText=ThreatLevels[ThreatLevel+1] +end +if self:IsShip()then +local ThreatLevels={ +[1]="Unarmed ship", +[2]="Light armed ships", +[3]="Corvettes", +[4]="", +[5]="Frigates", +[6]="", +[7]="Cruiser", +[8]="", +[9]="Destroyer", +[10]="", +[11]="Aircraft Carrier" +} +if Attributes["Aircraft Carriers"]then +ThreatLevel=10 +elseif Attributes["Destroyers"]then +ThreatLevel=8 +elseif Attributes["Cruisers"]then +ThreatLevel=6 +elseif Attributes["Frigates"]then +ThreatLevel=4 +elseif Attributes["Corvettes"]then +ThreatLevel=2 +elseif Attributes["Light armed ships"]then +ThreatLevel=1 +end +ThreatText=ThreatLevels[ThreatLevel+1] +end +end +return ThreatLevel,ThreatText +end +function UNIT:Explode(power,delay) +power=power or 100 +local DCSUnit=self:GetDCSObject() +if DCSUnit then +if delay and delay>0 then +SCHEDULER:New(nil,self.Explode,{self,power},delay) +else +self:GetCoordinate():Explosion(power) +end +return self +end +return nil +end +function UNIT:OtherUnitInRadius(AwaitUnit,Radius) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitVec3=self:GetVec3() +local AwaitUnitVec3=AwaitUnit:GetVec3() +if(((UnitVec3.x-AwaitUnitVec3.x)^2+(UnitVec3.z-AwaitUnitVec3.z)^2)^0.5<=Radius)then +return true +else +return false +end +end +return nil +end +function UNIT:IsFriendly(FriendlyCoalition) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitCoalition=DCSUnit:getCoalition() +local IsFriendlyResult=(UnitCoalition==FriendlyCoalition) +return IsFriendlyResult +end +return nil +end +function UNIT:IsShip() +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitDescriptor=DCSUnit:getDesc() +local IsShipResult=(UnitDescriptor.category==Unit.Category.SHIP) +return IsShipResult +end +return nil +end +function UNIT:InAir(NoHeloCheck) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local UnitInAir=DCSUnit:inAir() +local UnitCategory=DCSUnit:getDesc().category +if UnitInAir==true and UnitCategory==Unit.Category.HELICOPTER and(not NoHeloCheck)then +local VelocityVec3=DCSUnit:getVelocity() +local Velocity=UTILS.VecNorm(VelocityVec3) +local Coordinate=DCSUnit:getPoint() +local LandHeight=land.getHeight({x=Coordinate.x,y=Coordinate.z}) +local Height=Coordinate.y-LandHeight +if Velocity<1 and Height<=60 then +UnitInAir=false +end +end +return UnitInAir +end +return nil +end +do +function UNIT:HandleEvent(EventID,EventFunction) +self:EventDispatcher():OnEventForUnit(self:GetName(),EventFunction,self,EventID) +return self +end +function UNIT:UnHandleEvent(EventID) +self:EventDispatcher():RemoveEvent(self,EventID) +return self +end +function UNIT:ResetEvents() +self:EventDispatcher():Reset(self) +return self +end +end +do +function UNIT:IsDetected(TargetUnit) +local TargetIsDetected,TargetIsVisible,TargetLastTime,TargetKnowType,TargetKnowDistance,TargetLastPos,TargetLastVelocity=self:IsTargetDetected(TargetUnit:GetDCSObject()) +return TargetIsDetected +end +function UNIT:IsLOS(TargetUnit) +local IsLOS=self:GetPointVec3():IsLOS(TargetUnit:GetPointVec3()) +return IsLOS +end +function UNIT:KnowUnit(TargetUnit,TypeKnown,DistanceKnown) +if TypeKnown~=false then +TypeKnown=true +end +if DistanceKnown~=false then +DistanceKnown=true +end +local DCSControllable=self:GetDCSObject() +if DCSControllable then +local Controller=DCSControllable:getController() +if Controller then +local object=TargetUnit:GetDCSObject() +if object then +self:I(string.format("Unit %s now knows target unit %s. Type known=%s, distance known=%s",self:GetName(),TargetUnit:GetName(),tostring(TypeKnown),tostring(DistanceKnown))) +Controller:knowTarget(object,TypeKnown,DistanceKnown) +end +end +end +end +end +function UNIT:GetTemplate() +local group=self:GetGroup() +local name=self:GetName() +if group then +local template=group:GetTemplate() +if template then +for _,unit in pairs(template.units)do +if unit.name==name then +return UTILS.DeepCopy(unit) +end +end +end +end +return nil +end +function UNIT:GetTemplatePayload() +local unit=self:GetTemplate() +if unit then +return unit.payload +end +return nil +end +function UNIT:GetTemplatePylons() +local payload=self:GetTemplatePayload() +if payload then +return payload.pylons +end +return nil +end +function UNIT:GetTemplateFuel() +local payload=self:GetTemplatePayload() +if payload then +return payload.fuel +end +return nil +end +function UNIT:EnableEmission(switch) +local switch=switch or false +local DCSUnit=self:GetDCSObject() +if DCSUnit then +DCSUnit:enableEmission(switch) +end +return self +end +function UNIT:GetSkill() +local name=self.UnitName +local skill="Random" +if _DATABASE.Templates.Units[name]and _DATABASE.Templates.Units[name].Template and _DATABASE.Templates.Units[name].Template.skill then +skill=_DATABASE.Templates.Units[name].Template.skill or"Random" +end +return skill +end +function UNIT:GetSTN() +local STN=nil +local VCL=nil +local VCN=nil +local FGL=false +local template=self:GetTemplate() +if template then +if template.AddPropAircraft then +if template.AddPropAircraft.STN_L16 then +STN=template.AddPropAircraft.STN_L16 +elseif template.AddPropAircraft.SADL_TN then +STN=template.AddPropAircraft.SADL_TN +end +VCN=template.AddPropAircraft.VoiceCallsignNumber +VCL=template.AddPropAircraft.VoiceCallsignLabel +end +if template.datalinks and template.datalinks.Link16 and template.datalinks.Link16.settings then +FGL=template.datalinks.Link16.settings.flightLead +end +if template.datalinks and template.datalinks.SADL and template.datalinks.SADL.settings then +FGL=template.datalinks.SADL.settings.flightLead +end +end +return STN,VCL,VCN,FGL +end +do +function UNIT:SetAIOnOff(AIOnOff) +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local DCSController=DCSUnit:getController() +if DCSController then +DCSController:setOnOff(AIOnOff) +return self +end +end +return nil +end +function UNIT:SetAIOn() +return self:SetAIOnOff(true) +end +function UNIT:SetAIOff() +return self:SetAIOnOff(false) +end +end +function UNIT:IsSAM() +if self:HasSEAD()and self:IsGround()and(not self:HasAttribute("Mobile AAA"))then +return true +end +return false +end +function UNIT:IsEWR() +if self:IsGround()then +local DCSUnit=self:GetDCSObject() +if DCSUnit then +local attrs=DCSUnit:getDesc().attributes +return attrs["EWR"]==true +end +end +return false +end +function UNIT:IsAAA() +local unit=self +local desc=unit:GetDesc()or{} +local attr=desc.attributes or{} +if unit:HasSEAD()then +return false +end +if attr["AAA"]or attr["SAM related"]then +return true +end +return false +end +function UNIT:SetLife(Percent) +net.dostring_in("mission",string.format("a_unit_set_life_percentage(%d, %f)",self:GetID(),Percent)) +end +function UNIT:SetCarrierIlluminationMode(Mode) +UTILS.SetCarrierIlluminationMode(self:GetID(),Mode) +end +function UNIT:SetValidateAndRepositionGroundUnits(Enabled) +self.ValidateAndRepositionGroundUnits=Enabled +end +CLIENT={ +ClassName="CLIENT", +ClientName=nil, +ClientAlive=false, +ClientTransport=false, +ClientBriefingShown=false, +_Menus={}, +_Tasks={}, +Messages={}, +Players={}, +} +function CLIENT:Find(DCSUnit,Error) +local ClientName=DCSUnit:getName() +local ClientFound=_DATABASE:FindClient(ClientName) +if ClientFound then +ClientFound:F(ClientName) +return ClientFound +end +if not Error then +error("CLIENT not found for: "..ClientName) +end +end +function CLIENT:FindByPlayerName(Name) +local foundclient=nil +_DATABASE:ForEachClient( +function(client) +if client:GetPlayerName()==Name then +foundclient=client +end +end +) +return foundclient +end +function CLIENT:FindByName(ClientName,ClientBriefing,Error) +local ClientFound=_DATABASE:FindClient(ClientName) +if ClientFound then +ClientFound:F({ClientName,ClientBriefing}) +ClientFound:AddBriefing(ClientBriefing) +ClientFound.MessageSwitch=true +return ClientFound +end +if not Error then +error("CLIENT not found for: "..ClientName) +end +end +function CLIENT:Register(ClientName) +local self=BASE:Inherit(self,UNIT:Register(ClientName)) +self.ClientName=ClientName +self.MessageSwitch=true +self.ClientAlive2=false +return self +end +function CLIENT:Transport() +self.ClientTransport=true +return self +end +function CLIENT:AddBriefing(ClientBriefing) +self.ClientBriefing=ClientBriefing +self.ClientBriefingShown=false +return self +end +function CLIENT:AddPlayer(PlayerName) +table.insert(self.Players,PlayerName) +return self +end +function CLIENT:CountPlayers() +return#self.Players or 0 +end +function CLIENT:GetPlayers() +return self.Players +end +function CLIENT:GetPlayer() +if#self.Players>0 then +return self.Players[1] +end +return nil +end +function CLIENT:RemovePlayer(PlayerName) +for i,playername in pairs(self.Players)do +if PlayerName==playername then +table.remove(self.Players,i) +break +end +end +return self +end +function CLIENT:RemovePlayers() +self.Players={} +return self +end +function CLIENT:ShowBriefing() +if not self.ClientBriefingShown then +self.ClientBriefingShown=true +local Briefing="" +if self.ClientBriefing and self.ClientBriefing~=""then +Briefing=Briefing..self.ClientBriefing +self:Message(Briefing,60,"Briefing") +end +end +return self +end +function CLIENT:ShowMissionBriefing(MissionBriefing) +self:F({self.ClientName}) +if MissionBriefing then +self:Message(MissionBriefing,60,"Mission Briefing") +end +return self +end +function CLIENT:Reset(ClientName) +self:F() +self._Menus={} +end +function CLIENT:IsMultiSeated() +self:F(self.ClientName) +local ClientMultiSeatedTypes={ +["Mi-8MT"]="Mi-8MT", +["UH-1H"]="UH-1H", +["P-51B"]="P-51B" +} +if self:IsAlive()then +local ClientTypeName=self:GetClientGroupUnit():GetTypeName() +if ClientMultiSeatedTypes[ClientTypeName]then +return true +end +end +return false +end +function CLIENT:Alive(CallBackFunction,...) +self:F() +self.ClientCallBack=CallBackFunction +self.ClientParameters=arg +self.AliveCheckScheduler=SCHEDULER:New(self,self._AliveCheckScheduler,{"Client Alive "..self.ClientName},0.1,5,0.5) +self.AliveCheckScheduler:NoTrace() +return self +end +function CLIENT:_AliveCheckScheduler(SchedulerName) +self:T2({SchedulerName,self.ClientName,self.ClientAlive2,self.ClientBriefingShown,self.ClientCallBack}) +if self:IsAlive()then +if self.ClientAlive2==false then +self:ShowBriefing() +if self.ClientCallBack then +self:T("Calling Callback function") +self.ClientCallBack(self,unpack(self.ClientParameters)) +end +self.ClientAlive2=true +end +else +if self.ClientAlive2==true then +self.ClientAlive2=false +end +end +return true +end +function CLIENT:GetDCSGroup() +self:F3() +local ClientUnit=Unit.getByName(self.ClientName) +local CoalitionsData={AlivePlayersRed=coalition.getPlayers(coalition.side.RED),AlivePlayersBlue=coalition.getPlayers(coalition.side.BLUE)} +for CoalitionId,CoalitionData in pairs(CoalitionsData)do +self:T3({"CoalitionData:",CoalitionData}) +for UnitId,UnitData in pairs(CoalitionData)do +self:T3({"UnitData:",UnitData}) +if UnitData and UnitData:isExist()then +if ClientUnit then +local ClientGroup=ClientUnit:getGroup() +if ClientGroup then +self:T3("ClientGroup = "..self.ClientName) +if ClientGroup:isExist()and UnitData:getGroup():isExist()then +if ClientGroup:getID()==UnitData:getGroup():getID()then +self:T3("Normal logic") +self:T3(self.ClientName.." : group found!") +self.ClientGroupID=ClientGroup:getID() +self.ClientGroupName=ClientGroup:getName() +return ClientGroup +end +else +self:T3("Bug 1.5 logic") +local ClientGroupTemplate=_DATABASE.Templates.Units[self.ClientName].GroupTemplate +self.ClientGroupID=ClientGroupTemplate.groupId +self.ClientGroupName=_DATABASE.Templates.Units[self.ClientName].GroupName +self:T3(self.ClientName.." : group found in bug 1.5 resolvement logic!") +return ClientGroup +end +end +else +end +end +end +end +if ClientUnit then +local ClientGroup=ClientUnit:getGroup() +if ClientGroup then +self:T3("ClientGroup = "..self.ClientName) +if ClientGroup:isExist()then +self:T3("Normal logic") +self:T3(self.ClientName.." : group found!") +return ClientGroup +end +end +end +self.ClientGroupID=nil +self.ClientGroupName=nil +return nil +end +function CLIENT:GetClientGroupID() +self:GetDCSGroup() +return self.ClientGroupID +end +function CLIENT:GetClientGroupName() +self:GetDCSGroup() +return self.ClientGroupName +end +function CLIENT:GetClientGroupUnit() +self:F2() +local ClientDCSUnit=Unit.getByName(self.ClientName) +self:T(self.ClientDCSUnit) +if ClientDCSUnit and ClientDCSUnit:isExist()then +local ClientUnit=_DATABASE:FindUnit(self.ClientName) +return ClientUnit +end +return nil +end +function CLIENT:GetClientGroupDCSUnit() +self:F2() +local ClientDCSUnit=Unit.getByName(self.ClientName) +if ClientDCSUnit and ClientDCSUnit:isExist()then +self:T2(ClientDCSUnit) +return ClientDCSUnit +end +end +function CLIENT:IsTransport() +self:F() +return self.ClientTransport +end +function CLIENT:ShowCargo() +self:F() +local CargoMsg="" +for CargoName,Cargo in pairs(CARGOS)do +if self==Cargo:IsLoadedInClient()then +CargoMsg=CargoMsg..Cargo.CargoName.." Type:"..Cargo.CargoType.." Weight: "..Cargo.CargoWeight.."\n" +end +end +if CargoMsg==""then +CargoMsg="empty" +end +self:Message(CargoMsg,15,"Co-Pilot: Cargo Status",30) +end +function CLIENT:Message(Message,MessageDuration,MessageCategory,MessageInterval,MessageID) +self:F({Message,MessageDuration,MessageCategory,MessageInterval}) +if self.MessageSwitch==true then +if MessageCategory==nil then +MessageCategory="Messages" +end +if MessageID~=nil then +if self.Messages[MessageID]==nil then +self.Messages[MessageID]={} +self.Messages[MessageID].MessageId=MessageID +self.Messages[MessageID].MessageTime=timer.getTime() +self.Messages[MessageID].MessageDuration=MessageDuration +if MessageInterval==nil then +self.Messages[MessageID].MessageInterval=600 +else +self.Messages[MessageID].MessageInterval=MessageInterval +end +MESSAGE:New(Message,MessageDuration,MessageCategory):ToClient(self) +else +if self:GetClientGroupDCSUnit()and not self:GetClientGroupDCSUnit():inAir()then +if timer.getTime()-self.Messages[MessageID].MessageTime>=self.Messages[MessageID].MessageDuration+10 then +MESSAGE:New(Message,MessageDuration,MessageCategory):ToClient(self) +self.Messages[MessageID].MessageTime=timer.getTime() +end +else +if timer.getTime()-self.Messages[MessageID].MessageTime>=self.Messages[MessageID].MessageDuration+self.Messages[MessageID].MessageInterval then +MESSAGE:New(Message,MessageDuration,MessageCategory):ToClient(self) +self.Messages[MessageID].MessageTime=timer.getTime() +end +end +end +else +MESSAGE:New(Message,MessageDuration,MessageCategory):ToClient(self) +end +end +end +function CLIENT:GetUCID() +local PID=NET.GetPlayerIDByName(nil,self:GetPlayerName()) +return net.get_player_info(tonumber(PID),'ucid') +end +function CLIENT:GetPlayerInfo(Attribute) +local PID=NET.GetPlayerIDByName(nil,self:GetPlayerName()) +if PID then +return net.get_player_info(tonumber(PID),Attribute) +else +return nil +end +end +STATIC={ +ClassName="STATIC", +} +function STATIC:Register(StaticName) +local self=BASE:Inherit(self,POSITIONABLE:New(StaticName)) +self.StaticName=StaticName +local DCSStatic=StaticObject.getByName(self.StaticName) +if DCSStatic then +local Life0=DCSStatic:getLife()or 1 +self.Life0=Life0 +else +self:E(string.format("Static object %s does not exist!",tostring(self.StaticName))) +end +return self +end +function STATIC:GetLife0() +return self.Life0 or 1 +end +function STATIC:GetLife() +local DCSStatic=StaticObject.getByName(self.StaticName) +if DCSStatic then +return DCSStatic:getLife()or 1 +end +return nil +end +function STATIC:Find(DCSStatic) +local StaticName=DCSStatic:getName() +local StaticFound=_DATABASE:FindStatic(StaticName) +return StaticFound +end +function STATIC:FindByName(StaticName,RaiseError) +local StaticFound=_DATABASE:FindStatic(StaticName) +self.StaticName=StaticName +if StaticFound then +return StaticFound +end +if RaiseError==nil or RaiseError==true then +error("STATIC not found for: "..StaticName) +end +return nil +end +function STATIC:Destroy(GenerateEvent) +self:F2(self.ObjectName) +local DCSObject=self:GetDCSObject() +if DCSObject then +local StaticName=DCSObject:getName() +self:F({StaticName=StaticName}) +if GenerateEvent and GenerateEvent==true then +if self:IsAir()then +self:CreateEventCrash(timer.getTime(),DCSObject) +else +self:CreateEventDead(timer.getTime(),DCSObject) +end +elseif GenerateEvent==false then +else +self:CreateEventRemoveUnit(timer.getTime(),DCSObject) +end +DCSObject:destroy() +return true +end +return nil +end +function STATIC:GetDCSObject() +local DCSStatic=StaticObject.getByName(self.StaticName) +if DCSStatic then +return DCSStatic +end +return nil +end +function STATIC:GetUnits() +self:F2({self.StaticName}) +local DCSStatic=self:GetDCSObject() +local Statics={} +if DCSStatic then +Statics[1]=STATIC:Find(DCSStatic) +self:T3(Statics) +return Statics +end +return nil +end +function STATIC:GetThreatLevel() +return 1,"Static" +end +function STATIC:SpawnAt(Coordinate,Heading,Delay) +Heading=Heading or 0 +if Delay and Delay>0 then +SCHEDULER:New(nil,self.SpawnAt,{self,Coordinate,Heading},Delay) +else +local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName) +SpawnStatic:SpawnFromPointVec2(Coordinate,Heading,self.StaticName) +end +return self +end +function STATIC:ReSpawn(CountryID,Delay) +if Delay and Delay>0 then +SCHEDULER:New(nil,self.ReSpawn,{self,CountryID},Delay) +else +CountryID=CountryID or self:GetCountry() +local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName,CountryID) +SpawnStatic:Spawn(nil,self.StaticName) +end +return self +end +function STATIC:ReSpawnAt(Coordinate,Heading,Delay) +if Delay and Delay>0 then +SCHEDULER:New(nil,self.ReSpawnAt,{self,Coordinate,Heading},Delay) +else +local SpawnStatic=SPAWNSTATIC:NewFromStatic(self.StaticName,self:GetCountry()) +SpawnStatic:SpawnFromCoordinate(Coordinate,Heading,self.StaticName) +end +return self +end +function STATIC:FindByMatching(Pattern) +local GroupFound=nil +for name,static in pairs(_DATABASE.STATICS)do +if string.match(name,Pattern)then +GroupFound=static +break +end +end +return GroupFound +end +function STATIC:FindAllByMatching(Pattern) +local GroupsFound={} +for name,static in pairs(_DATABASE.STATICS)do +if string.match(name,Pattern)then +GroupsFound[#GroupsFound+1]=static +end +end +return GroupsFound +end +function STATIC:GetStaticStorage() +local name=self:GetName() +local storage=STORAGE:NewFromStaticCargo(name) +return storage +end +function STATIC:GetCargoWeight() +local DCSObject=StaticObject.getByName(self.StaticName) +local mass=-1 +if DCSObject then +mass=DCSObject:getCargoWeight()or 0 +local masstxt=DCSObject:getCargoDisplayName()or"none" +end +return mass +end +AIRBASE={ +ClassName="AIRBASE", +CategoryName={ +[Airbase.Category.AIRDROME]="Airdrome", +[Airbase.Category.HELIPAD]="Helipad", +[Airbase.Category.SHIP]="Ship", +}, +activerwyno=nil, +} +AIRBASE.Caucasus={ +["Anapa_Vityazevo"]="Anapa-Vityazevo", +["Batumi"]="Batumi", +["Beslan"]="Beslan", +["Gelendzhik"]="Gelendzhik", +["Gudauta"]="Gudauta", +["Kobuleti"]="Kobuleti", +["Krasnodar_Center"]="Krasnodar-Center", +["Krasnodar_Pashkovsky"]="Krasnodar-Pashkovsky", +["Krymsk"]="Krymsk", +["Kutaisi"]="Kutaisi", +["Maykop_Khanskaya"]="Maykop-Khanskaya", +["Mineralnye_Vody"]="Mineralnye Vody", +["Mozdok"]="Mozdok", +["Nalchik"]="Nalchik", +["Novorossiysk"]="Novorossiysk", +["Senaki_Kolkhi"]="Senaki-Kolkhi", +["Sochi_Adler"]="Sochi-Adler", +["Soganlug"]="Soganlug", +["Sukhumi_Babushara"]="Sukhumi-Babushara", +["Tbilisi_Lochini"]="Tbilisi-Lochini", +["Vaziani"]="Vaziani", +} +AIRBASE.Nevada={ +["Beatty"]="Beatty", +["Boulder_City"]="Boulder City", +["Creech"]="Creech", +["Echo_Bay"]="Echo Bay", +["Groom_Lake"]="Groom Lake", +["Henderson_Executive"]="Henderson Executive", +["Jean"]="Jean", +["Laughlin"]="Laughlin", +["Lincoln_County"]="Lincoln County", +["McCarran_International"]="McCarran International", +["Mesquite"]="Mesquite", +["Mina"]="Mina", +["Nellis"]="Nellis", +["North_Las_Vegas"]="North Las Vegas", +["Pahute_Mesa"]="Pahute Mesa", +["Tonopah"]="Tonopah", +["Tonopah_Test_Range"]="Tonopah Test Range", +} +AIRBASE.Normandy={ +["Abbeville_Drucat"]="Abbeville Drucat", +["Amiens_Glisy"]="Amiens-Glisy", +["Argentan"]="Argentan", +["Avranches_Le_Val_Saint_Pere"]="Avranches Le Val-Saint-Pere", +["Azeville"]="Azeville", +["Barville"]="Barville", +["Bazenville"]="Bazenville", +["Beaumont_le_Roger"]="Beaumont-le-Roger", +["Beauvais_Tille"]="Beauvais-Tille", +["Beny_sur_Mer"]="Beny-sur-Mer", +["Bernay_Saint_Martin"]="Bernay Saint Martin", +["Beuzeville"]="Beuzeville", +["Biggin_Hill"]="Biggin Hill", +["Biniville"]="Biniville", +["Broglie"]="Broglie", +["Brucheville"]="Brucheville", +["Cardonville"]="Cardonville", +["Carpiquet"]="Carpiquet", +["Chailey"]="Chailey", +["Chippelle"]="Chippelle", +["Conches"]="Conches", +["Cormeilles_en_Vexin"]="Cormeilles-en-Vexin", +["Creil"]="Creil", +["Cretteville"]="Cretteville", +["Cricqueville_en_Bessin"]="Cricqueville-en-Bessin", +["Deanland"]="Deanland", +["Deauville"]="Deauville", +["Detling"]="Detling", +["Deux_Jumeaux"]="Deux Jumeaux", +["Dinan_Trelivan"]="Dinan-Trelivan", +["Dunkirk_Mardyck"]="Dunkirk-Mardyck", +["Essay"]="Essay", +["Evreux"]="Evreux", +["Farnborough"]="Farnborough", +["Fecamp_Benouville"]="Fecamp-Benouville", +["Flers"]="Flers", +["Ford"]="Ford", +["Friston"]="Friston", +["Funtington"]="Funtington", +["Goulet"]="Goulet", +["Gravesend"]="Gravesend", +["Guyancourt"]="Guyancourt", +["Hauterive"]="Hauterive", +["Heathrow"]="Heathrow", +["High_Halden"]="High Halden", +["Kenley"]="Kenley", +["Lantheuil"]="Lantheuil", +["Le_Molay"]="Le Molay", +["Lessay"]="Lessay", +["Lignerolles"]="Lignerolles", +["Longues_sur_Mer"]="Longues-sur-Mer", +["Lonrai"]="Lonrai", +["Lymington"]="Lymington", +["Lympne"]="Lympne", +["Manston"]="Manston", +["Maupertus"]="Maupertus", +["Meautis"]="Meautis", +["Merville_Calonne"]="Merville Calonne", +["Needs_Oar_Point"]="Needs Oar Point", +["Odiham"]="Odiham", +["Orly"]="Orly", +["Picauville"]="Picauville", +["Poix"]="Poix", +["Ronai"]="Ronai", +["Rouen_Boos"]="Rouen-Boos", +["Rucqueville"]="Rucqueville", +["Saint_Andre_de_lEure"]="Saint-Andre-de-lEure", +["Saint_Aubin"]="Saint-Aubin", +["Saint_Omer_Wizernes"]="Saint-Omer Wizernes", +["Saint_Pierre_du_Mont"]="Saint Pierre du Mont", +["Sainte_Croix_sur_Mer"]="Sainte-Croix-sur-Mer", +["Sainte_Laurent_sur_Mer"]="Sainte-Laurent-sur-Mer", +["Sommervieu"]="Sommervieu", +["Stoney_Cross"]="Stoney Cross", +["Tangmere"]="Tangmere", +["Triqueville"]="Triqueville", +["Villacoublay"]="Villacoublay", +["Vrigny"]="Vrigny", +["West_Malling"]="West Malling", +["Eastchurch"]="Eastchurch", +["Headcorn"]="Headcorn", +["Hawkinge"]="Hawkinge", +} +AIRBASE.PersianGulf={ +["Abu_Dhabi_Intl"]="Abu Dhabi Intl", +["Abu_Musa_Island"]="Abu Musa Island", +["Al_Ain_Intl"]="Al Ain Intl", +["Al_Bateen"]="Al-Bateen", +["Al_Dhafra_AFB"]="Al Dhafra AFB", +["Al_Maktoum_Intl"]="Al Maktoum Intl", +["Al_Minhad_AFB"]="Al Minhad AFB", +["Bandar_Abbas_Intl"]="Bandar Abbas Intl", +["Bandar_Lengeh"]="Bandar Lengeh", +["Bandar_e_Jask"]="Bandar-e-Jask", +["Dubai_Intl"]="Dubai Intl", +["Fujairah_Intl"]="Fujairah Intl", +["Havadarya"]="Havadarya", +["Jiroft"]="Jiroft", +["Kerman"]="Kerman", +["Khasab"]="Khasab", +["Kish_Intl"]="Kish Intl", +["Lar"]="Lar", +["Lavan_Island"]="Lavan Island", +["Liwa_AFB"]="Liwa AFB", +["Qeshm_Island"]="Qeshm Island", +["Quasoura_airport"]="Quasoura_airport", +["Ras_Al_Khaimah_Intl"]="Ras Al Khaimah Intl", +["Sas_Al_Nakheel"]="Sas Al Nakheel", +["Sharjah_Intl"]="Sharjah Intl", +["Shiraz_Intl"]="Shiraz Intl", +["Sir_Abu_Nuayr"]="Sir Abu Nuayr", +["Sirri_Island"]="Sirri Island", +["Tunb_Island_AFB"]="Tunb Island AFB", +["Tunb_Kochak"]="Tunb Kochak", +} +AIRBASE.TheChannel={ +["Abbeville_Drucat"]="Abbeville Drucat", +["Biggin_Hill"]="Biggin Hill", +["Detling"]="Detling", +["Dunkirk_Mardyck"]="Dunkirk Mardyck", +["Eastchurch"]="Eastchurch", +["Hawkinge"]="Hawkinge", +["Headcorn"]="Headcorn", +["High_Halden"]="High Halden", +["Lympne"]="Lympne", +["Manston"]="Manston", +["Merville_Calonne"]="Merville Calonne", +["Saint_Omer_Longuenesse"]="Saint Omer Longuenesse", +} +AIRBASE.Syria={ +["Abu_al_Duhur"]="Abu al-Duhur", +["Adana_Sakirpasa"]="Adana Sakirpasa", +["Akrotiri"]="Akrotiri", +["Al_Dumayr"]="Al-Dumayr", +["Al_Qusayr"]="Al Qusayr", +["Aleppo"]="Aleppo", +["An_Nasiriyah"]="An Nasiriyah", +["At_Tanf"]="At Tanf", +["Bassel_Al_Assad"]="Bassel Al-Assad", +["Beirut_Rafic_Hariri"]="Beirut-Rafic Hariri", +["Damascus"]="Damascus", +["Deir_ez_Zor"]="Deir ez-Zor", +["Ercan"]="Ercan", +["Eyn_Shemer"]="Eyn Shemer", +["Gaziantep"]="Gaziantep", +["Gazipasa"]="Gazipasa", +["Gecitkale"]="Gecitkale", +["H"]="H", +["H3"]="H3", +["H3_Northwest"]="H3 Northwest", +["H3_Southwest"]="H3 Southwest", +["H4"]="H4", +["Haifa"]="Haifa", +["Hama"]="Hama", +["Hatay"]="Hatay", +["Herzliya"]="Herzliya", +["Incirlik"]="Incirlik", +["Jirah"]="Jirah", +["Khalkhalah"]="Khalkhalah", +["Kharab_Ishk"]="Kharab Ishk", +["King_Abdullah_II"]="King Abdullah II", +["King_Hussein_Air_College"]="King Hussein Air College", +["Kingsfield"]="Kingsfield", +["Kiryat_Shmona"]="Kiryat Shmona", +["Kuweires"]="Kuweires", +["Lakatamia"]="Lakatamia", +["Larnaca"]="Larnaca", +["Marka"]="Marka", +["Marj_Ruhayyil"]="Marj Ruhayyil", +["Marj_as_Sultan_North"]="Marj as Sultan North", +["Marj_as_Sultan_South"]="Marj as Sultan South", +["Megiddo"]="Megiddo", +["Mezzeh"]="Mezzeh", +["Minakh"]="Minakh", +["Muwaffaq_Salti"]="Muwaffaq Salti", +["Naqoura"]="Naqoura", +["Nicosia"]="Nicosia", +["Palmyra"]="Palmyra", +["Paphos"]="Paphos", +["Pinarbashi"]="Pinarbashi", +["Prince_Hassan"]="Prince Hassan", +["Qabr_as_Sitt"]="Qabr as Sitt", +["Ramat_David"]="Ramat David", +["Rayak"]="Rayak", +["Rene_Mouawad"]="Rene Mouawad", +["Rosh_Pina"]="Rosh Pina", +["Ruwayshid"]="Ruwayshid", +["Sanliurfa"]="Sanliurfa", +["Sayqal"]="Sayqal", +["Shayrat"]="Shayrat", +["Tabqa"]="Tabqa", +["Taftanaz"]="Taftanaz", +["Tal_Siman"]="Tal Siman", +["Tha_lah"]="Tha'lah", +["Tiyas"]="Tiyas", +["Wujah_Al_Hajar"]="Wujah Al Hajar", +["Ben_Gurion"]="Ben Gurion", +["Hatzor"]="Hatzor", +["Palmachim"]="Palmachim", +["Tel_Nof"]="Tel Nof", +} +AIRBASE.MarianaIslands={ +["Andersen_AFB"]="Andersen AFB", +["Antonio_B_Won_Pat_Intl"]="Antonio B. Won Pat Intl", +["North_West_Field"]="North West Field", +["Olf_Orote"]="Olf Orote", +["Pagan_Airstrip"]="Pagan Airstrip", +["Rota_Intl"]="Rota Intl", +["Saipan_Intl"]="Saipan Intl", +["Tinian_Intl"]="Tinian Intl", +} +AIRBASE.MarianaIslandsWWII= +{ +["Agana"]="Agana", +["Airfield_3"]="Airfield 3", +["Charon_Kanoa"]="Charon Kanoa", +["Gurguan_Point"]="Gurguan Point", +["Isley"]="Isley", +["Kagman"]="Kagman", +["Marpi"]="Marpi", +["Orote"]="Orote", +["Pagan"]="Pagan", +["Rota"]="Rota", +["Ushi"]="Ushi", +} +AIRBASE.SouthAtlantic={ +["Almirante_Schroeders"]="Almirante Schroeders", +["Comandante_Luis_Piedrabuena"]="Comandante Luis Piedrabuena", +["Cullen"]="Cullen", +["El_Calafate"]="El Calafate", +["Franco_Bianco"]="Franco Bianco", +["Gobernador_Gregores"]="Gobernador Gregores", +["Goose_Green"]="Goose Green", +["Gull_Point"]="Gull Point", +["Hipico_Flying_Club"]="Hipico Flying Club", +["Mount_Pleasant"]="Mount Pleasant", +["O_Higgins"]="O'Higgins", +["Pampa_Guanaco"]="Pampa Guanaco", +["Port_Stanley"]="Port Stanley", +["Porvenir"]="Porvenir", +["Puerto_Natales"]="Puerto Natales", +["Puerto_Santa_Cruz"]="Puerto Santa Cruz", +["Puerto_Williams"]="Puerto Williams", +["Punta_Arenas"]="Punta Arenas", +["Rio_Chico"]="Rio Chico", +["Rio_Gallegos"]="Rio Gallegos", +["Rio_Grande"]="Rio Grande", +["Rio_Turbio"]="Rio Turbio", +["San_Carlos_FOB"]="San Carlos FOB", +["San_Julian"]="San Julian", +["Tolhuin"]="Tolhuin", +["Ushuaia"]="Ushuaia", +["Ushuaia_Helo_Port"]="Ushuaia Helo Port", +} +AIRBASE.Sinai={ +["Abu_Rudeis"]="Abu Rudeis", +["Abu_Suwayr"]="Abu Suwayr", +["Al_Bahr_al_Ahmar"]="Al Bahr al Ahmar", +["Al_Ismailiyah"]="Al Ismailiyah", +["Al_Khatatbah"]="Al Khatatbah", +["Al_Mansurah"]="Al Mansurah", +["Al_Rahmaniyah_Air_Base"]="Al Rahmaniyah Air Base", +["As_Salihiyah"]="As Salihiyah", +["AzZaqaziq"]="AzZaqaziq", +["Baluza"]="Baluza", +["Ben_Gurion"]="Ben-Gurion", +["Beni_Suef"]="Beni Suef", +["Bilbeis_Air_Base"]="Bilbeis Air Base", +["Bir_Hasanah"]="Bir Hasanah", +["Birma_Air_Base"]="Birma Air Base", +["Borg_El_Arab_International_Airport"]="Borg El Arab International Airport", +["Cairo_International_Airport"]="Cairo International Airport", +["Cairo_West"]="Cairo West", +["Damascus_Intl"]="Damascus Intl", +["Difarsuwar_Airfield"]="Difarsuwar Airfield", +["El_Arish"]="El Arish", +["El_Gora"]="El Gora", +["El_Minya"]="El Minya", +["Fayed"]="Fayed", +["Gebel_El_Basur_Air_Base"]="Gebel El Basur Air Base", +["Hatzerim"]="Hatzerim", +["Hatzor"]="Hatzor", +["Hurghada_International_Airport"]="Hurghada International Airport", +["Inshas_Airbase"]="Inshas Airbase", +["Jiyanklis_Air_Base"]="Jiyanklis Air Base", +["Kedem"]="Kedem", +["Kibrit_Air_Base"]="Kibrit Air Base", +["Kom_Awshim"]="Kom Awshim", +["Melez"]="Melez", +["Mezzeh_Air_Base"]="Mezzeh Air Base", +["Nevatim"]="Nevatim", +["Ovda"]="Ovda", +["Palmachim"]="Palmachim", +["Quwaysina"]="Quwaysina", +["Rafic_Hariri_Intl"]="Rafic Hariri Intl", +["Ramat_David"]="Ramat David", +["Ramon_Airbase"]="Ramon Airbase", +["Ramon_International_Airport"]="Ramon International Airport", +["Sde_Dov"]="Sde Dov", +["Sharm_El_Sheikh_International_Airport"]="Sharm El Sheikh International Airport", +["St_Catherine"]="St Catherine", +["Tabuk"]="Tabuk", +["Tel_Nof"]="Tel Nof", +["Wadi_Abu_Rish"]="Wadi Abu Rish", +["Wadi_al_Jandali"]="Wadi al Jandali", +} +AIRBASE.Kola={ +["Banak"]="Banak", +["Bodo"]="Bodo", +["Ivalo"]="Ivalo", +["Jokkmokk"]="Jokkmokk", +["Kalixfors"]="Kalixfors", +["Kallax"]="Kallax", +["Kemi_Tornio"]="Kemi Tornio", +["Kirkenes"]="Kirkenes", +["Kiruna"]="Kiruna", +["Kuusamo"]="Kuusamo", +["Monchegorsk"]="Monchegorsk", +["Murmansk_International"]="Murmansk International", +["Olenya"]="Olenya", +["Rovaniemi"]="Rovaniemi", +["Severomorsk_1"]="Severomorsk-1", +["Severomorsk_3"]="Severomorsk-3", +["Vidsel"]="Vidsel", +["Vuojarvi"]="Vuojarvi", +["Andoya"]="Andoya", +["Alakurtti"]="Alakurtti", +["Kittila"]="Kittila", +["Bardufoss"]="Bardufoss", +["Alta"]="Alta", +["Sodankyla"]="Sodankyla", +["Enontekio"]="Enontekio", +["Evenes"]="Evenes", +["Hosio"]="Hosio", +["Kilpyavr"]="Kilpyavr", +["Afrikanda"]="Afrikanda", +["Kalevala"]="Kalevala", +["Koshka_Yavr"]="Koshka Yavr", +["Poduzhemye"]="Poduzhemye", +["Luostari_Pechenga"]="Luostari Pechenga", +} +AIRBASE.Afghanistan={ +["Bagram"]="Bagram", +["Bamyan"]="Bamyan", +["Bost"]="Bost", +["Camp_Bastion"]="Camp Bastion", +["Camp_Bastion_Heliport"]="Camp Bastion Heliport", +["Chaghcharan"]="Chaghcharan", +["Dwyer"]="Dwyer", +["Farah"]="Farah", +["Gardez"]="Gardez", +["Ghazni_Heliport"]="Ghazni Heliport", +["Herat"]="Herat", +["Jalalabad"]="Jalalabad", +["Kabul"]="Kabul", +["Kandahar"]="Kandahar", +["Kandahar_Heliport"]="Kandahar Heliport", +["Khost"]="Khost", +["Khost_Heliport"]="Khost Heliport", +["Maymana_Zahiraddin_Faryabi"]="Maymana Zahiraddin Faryabi", +["Nimroz"]="Nimroz", +["Qala_i_Naw"]="Qala i Naw", +["Sharana"]="Sharana", +["Shindand"]="Shindand", +["Shindand_Heliport"]="Shindand Heliport", +["Tarinkot"]="Tarinkot", +["Urgoon_Heliport"]="Urgoon Heliport", +} +AIRBASE.Iraq={ +["Al_Asad_Airbase"]="Al-Asad Airbase", +["Al_Kut_Airport"]="Al-Kut Airport", +["Al_Sahra_Airport"]="Al-Sahra Airport", +["Al_Salam_Airbase"]="Al-Salam Airbase", +["Al_Taji_Airport"]="Al-Taji Airport", +["Al_Taquddum_Airport"]="Al-Taquddum Airport", +["Baghdad_International_Airport"]="Baghdad International Airport", +["Balad_Airbase"]="Balad Airbase", +["Bashur_Airport"]="Bashur Airport", +["Erbil_International_Airport"]="Erbil International Airport", +["H2_Airbase"]="H-2 Airbase", +["H3_Main_Airbase"]="H-3 Main Airbase", +["H3_Northwest_Airbase"]="H-3 Northwest Airbase", +["H3_Southwest_Airbase"]="H-3 Southwest Airbase", +["K1_Base"]="K1 Base", +["Kirkuk_International_Airport"]="Kirkuk International Airport", +["Mosul_International_Airport"]="Mosul International Airport", +["Qayyarah_Airfield_West"]="Qayyarah Airfield West", +["Sulaimaniyah_International_Airport"]="Sulaimaniyah International Airport", +} +AIRBASE.GermanyCW={ +["Airracing_Frankfurt"]="Airracing Frankfurt", +["Airracing_Koblenz"]="Airracing Koblenz", +["Airracing_Luebeck"]="Airracing Lubeck", +["Allstedt"]="Allstedt", +["Altes_Lager"]="Altes Lager", +["Bad_Duerkheim"]="Bad Durkheim", +["Barth"]="Barth", +["Bienenfarm"]="Bienenfarm", +["Bindersleben"]="Bindersleben", +["Bitburg"]="Bitburg", +["Braunschweig"]="Braunschweig", +["Bremen"]="Bremen", +["Briest"]="Briest", +["Buechel"]="Buchel", +["Bueckeburg"]="Buckeburg", +["Celle"]="Celle", +["Cochstedt"]="Cochstedt", +["Damgarten"]="Damgarten", +["Dedelow"]="Dedelow", +["Dessau"]="Dessau", +["Fassberg"]="Fassberg", +["Finow"]="Finow", +["Frankfurt"]="Frankfurt", +["Fritzlar"]="Fritzlar", +["Fulda"]="Fulda", +["Gardelegen"]="Gardelegen", +["Garz"]="Garz", +["Gatow"]="Gatow", +["Gelnhausen"]="Gelnhausen", +["Giebelstadt"]="Giebelstadt", +["Glindbruchkippe"]="Glindbruchkippe ", +["Gross_Mohrdorf"]="Gross Mohrdorf", +["Grosse_Wiese"]="Grosse Wiese", +["Guetersloh"]="Gutersloh", +["H_FRG_01"]="H FRG 01", +["H_FRG_02"]="H FRG 02", +["H_FRG_03"]="H FRG 03", +["H_FRG_04"]="H FRG 04", +["H_FRG_05"]="H FRG 05", +["H_FRG_06"]="H FRG 06", +["H_FRG_07"]="H FRG 07", +["H_FRG_08"]="H FRG 08", +["H_FRG_09"]="H FRG 09", +["H_FRG_10"]="H FRG 10", +["H_FRG_11"]="H FRG 11", +["H_FRG_12"]="H FRG 12", +["H_FRG_13"]="H FRG 13", +["H_FRG_14"]="H FRG 14", +["H_FRG_15"]="H FRG 15", +["H_FRG_16"]="H FRG 16", +["H_FRG_17"]="H FRG 17", +["H_FRG_18"]="H FRG 18", +["H_FRG_19"]="H FRG 19", +["H_FRG_20"]="H FRG 20", +["H_FRG_21"]="H FRG 21", +["H_FRG_23"]="H FRG 23", +["H_FRG_25"]="H FRG 25", +["H_FRG_27"]="H FRG 27", +["H_FRG_30"]="H FRG 30", +["H_FRG_31"]="H FRG 31", +["H_FRG_32"]="H FRG 32", +["H_FRG_34"]="H FRG 34", +["H_FRG_38"]="H FRG 38", +["H_FRG_39"]="H FRG 39", +["H_FRG_40"]="H FRG 40", +["H_FRG_41"]="H FRG 41", +["H_FRG_42"]="H FRG 42", +["H_FRG_43"]="H FRG 43", +["H_FRG_44"]="H FRG 44", +["H_FRG_45"]="H FRG 45", +["H_FRG_46"]="H FRG 46", +["H_FRG_47"]="H FRG 47", +["H_FRG_48"]="H FRG 48", +["H_FRG_49"]="H FRG 49", +["H_FRG_50"]="H FRG 50", +["H_FRG_51"]="H FRG 51", +["H_GDR_01"]="H GDR 01", +["H_GDR_02"]="H GDR 02", +["H_GDR_03"]="H GDR 03", +["H_GDR_04"]="H GDR 04", +["H_GDR_05"]="H GDR 05", +["H_GDR_06"]="H GDR 06", +["H_GDR_07"]="H GDR 07", +["H_GDR_08"]="H GDR 08", +["H_GDR_09"]="H GDR 09", +["H_GDR_10"]="H GDR 10", +["H_GDR_11"]="H GDR 11", +["H_GDR_12"]="H GDR 12", +["H_GDR_13"]="H GDR 13", +["H_GDR_14"]="H GDR 14", +["H_GDR_15"]="H GDR 15", +["H_GDR_16"]="H GDR 16", +["H_GDR_17"]="H GDR 17", +["H_GDR_18"]="H GDR 18", +["H_GDR_19"]="H GDR 19", +["H_GDR_21"]="H GDR 21", +["H_GDR_22"]="H GDR 22", +["H_GDR_24"]="H GDR 24", +["H_GDR_25"]="H GDR 25", +["H_GDR_26"]="H GDR 26", +["H_GDR_30"]="H GDR 30", +["H_GDR_31"]="H GDR 31", +["H_GDR_32"]="H GDR 32", +["H_GDR_33"]="H GDR 33", +["H_GDR_34"]="H GDR 34", +["H_Med_FRG_01"]="H Med FRG 01", +["H_Med_FRG_02"]="H Med FRG 02", +["H_Med_FRG_04"]="H Med FRG 04", +["H_Med_FRG_06"]="H Med FRG 06", +["H_Med_FRG_11"]="H Med FRG 11", +["H_Med_FRG_12"]="H Med FRG 12", +["H_Med_FRG_13"]="H Med FRG 13", +["H_Med_FRG_14"]="H Med FRG 14", +["H_Med_FRG_15"]="H Med FRG 15", +["H_Med_FRG_16"]="H Med FRG 16", +["H_Med_FRG_17"]="H Med FRG 17", +["H_Med_FRG_21"]="H Med FRG 21", +["H_Med_FRG_24"]="H Med FRG 24", +["H_Med_FRG_26"]="H Med FRG 26", +["H_Med_FRG_27"]="H Med FRG 27", +["H_Med_FRG_29"]="H Med FRG 29", +["H_Med_GDR_01"]="H Med GDR 01", +["H_Med_GDR_02"]="H Med GDR 02", +["H_Med_GDR_03"]="H Med GDR 03", +["H_Med_GDR_08"]="H Med GDR 08", +["H_Med_GDR_09"]="H Med GDR 09", +["H_Med_GDR_10"]="H Med GDR 10", +["H_Med_GDR_11"]="H Med GDR 11", +["H_Med_GDR_12"]="H Med GDR 12", +["H_Med_GDR_13"]="H Med GDR 13", +["H_Med_GDR_14"]="H Med GDR 14", +["H_Med_GDR_16"]="H Med GDR 16", +["H_Radar_FRG_02"]="H Radar FRG 02", +["H_Radar_GDR_01"]="H Radar GDR 01", +["H_Radar_GDR_02"]="H Radar GDR 02", +["H_Radar_GDR_03"]="H Radar GDR 03", +["H_Radar_GDR_04"]="H Radar GDR 04", +["H_Radar_GDR_05"]="H Radar GDR 05", +["H_Radar_GDR_06"]="H Radar GDR 06", +["H_Radar_GDR_07"]="H Radar GDR 07", +["H_Radar_GDR_08"]="H Radar GDR 08", +["H_Radar_GDR_09"]="H Radar GDR 09", +["Hahn"]="Hahn", +["Haina"]="Haina", +["Hamburg"]="Hamburg", +["Hamburg_Finkenwerder"]="Hamburg Finkenwerder", +["Hannover"]="Hannover", +["Hasselfelde"]="Hasselfelde", +["Herrenteich"]="Herrenteich", +["Hildesheim"]="Hildesheim", +["Hockenheim"]="Hockenheim", +["Holzdorf"]="Holzdorf", +["Kammermark"]="Kammermark", +["Koethen"]="Kothen", +["Laage"]="Laage", +["Langenselbold"]="Langenselbold", +["Laerz"]="Larz", +["Leipzig_Halle"]="Leipzig Halle", +["Leipzig_Mockau"]="Leipzig Mockau", +["Luebeck"]="Lubeck", +["Lueneburg"]="Luneburg", +["Mahlwinkel"]="Mahlwinkel", +["Mendig"]="Mendig", +["Merseburg"]="Merseburg", +["Neubrandenburg"]="Neubrandenburg", +["Neuruppin"]="Neuruppin", +["Northeim"]="Northeim", +["Ober_Moerlen"]="Ober-Morlen", +["Obermehler_Schlotheim"]="Obermehler Schlotheim", +["Parchim"]="Parchim", +["Peenemuende"]="Peenemunde", +["Pferdsfeld"]="Pferdsfeld", +["Pinnow"]="Pinnow", +["Pottschutthoehe"]="Pottschutthohe", +["Ramstein"]="Ramstein", +["Rinteln"]="Rinteln", +["Schoenefeld"]="Schonefeld", +["Schweinfurt"]="Schweinfurt", +["Sembach"]="Sembach", +["Spangdahlem"]="Spangdahlem", +["Sperenberg"]="Sperenberg", +["Stendal"]="Stendal", +["Tegel"]="Tegel", +["Tempelhof"]="Tempelhof", +["Templin"]="Templin", +["Tutow"]="Tutow", +["Uelzen"]="Uelzen", +["Uetersen"]="Uetersen", +["Ummern"]="Ummern", +["Verden_Scharnhorst"]="Verden-Scharnhorst", +["Walldorf"]="Walldorf", +["Waren_Vielist"]="Waren Vielist", +["Werneuchen"]="Werneuchen", +["Weser_Wuemme"]="Weser Wumme", +["Wiesbaden"]="Wiesbaden", +["Wismar"]="Wismar", +["Wittstock"]="Wittstock", +["Worms"]="Worms", +["Wunstorf"]="Wunstorf", +["Zerbst"]="Zerbst", +["Zweibruecken"]="Zweibrucken", +} +AIRBASE.TerminalType={ +Runway=16, +HelicopterOnly=40, +Shelter=68, +OpenMed=72, +SmallSizeFighter=100, +OpenBig=104, +OpenMedOrBig=176, +HelicopterUsable=216, +FighterAircraft=244, +FighterAircraftSmall=344, +} +AIRBASE.SpotStatus={ +FREE="Free", +OCCUPIED="Occupied", +RESERVED="Reserved", +} +function AIRBASE:Register(AirbaseName) +local self=BASE:Inherit(self,POSITIONABLE:New(AirbaseName)) +self.AirbaseName=AirbaseName +self.AirbaseID=self:GetID(true) +self.descriptors=self:GetDesc() +self.category=self.descriptors and self.descriptors.category or Airbase.Category.AIRDROME +if self.category==Airbase.Category.AIRDROME then +self.isAirdrome=true +elseif self.category==Airbase.Category.HELIPAD or self.descriptors.typeName=="FARP_SINGLE_01"then +self.isHelipad=true +self.category=Airbase.Category.HELIPAD +elseif self.category==Airbase.Category.SHIP then +self.isShip=true +if self.descriptors.typeName=="Oil rig"or self.descriptors.typeName=="Ga"then +self.isHelipad=true +self.isShip=false +self.category=Airbase.Category.HELIPAD +_DATABASE:AddStatic(AirbaseName) +end +else +self:E("ERROR: Unknown airbase category!") +end +self:_InitRunways() +local Nrunways=#self.runways +if Nrunways>0 then +self:SetActiveRunway() +end +self:_InitParkingSpots() +if self.category==Airbase.Category.AIRDROME and(Nrunways==0 or self.NparkingTotal==self.NparkingTerminal[AIRBASE.TerminalType.HelicopterOnly])then +self.category=Airbase.Category.HELIPAD +self.isAirdrome=true +self.isHelipad=true +end +local vec2=self:GetVec2() +self:GetCoordinate() +self.storage=_DATABASE:AddStorage(AirbaseName) +if vec2 then +if self.isShip then +local unit=UNIT:FindByName(AirbaseName) +if unit then +self.AirbaseZone=ZONE_UNIT:New(AirbaseName,unit,2500) +end +else +self.AirbaseZone=ZONE_RADIUS:New(AirbaseName,vec2,2500) +end +else +self:E(string.format("ERROR: Cound not get position Vec2 of airbase %s",AirbaseName)) +end +self:T2(string.format("Registered airbase %s",tostring(self.AirbaseName))) +return self +end +function AIRBASE:GetVec2() +local runways=self:GetRunways() +if runways and#runways>0 then +return runways[1].center:GetVec2() +end +return self:GetCoordinate():GetVec2() +end +function AIRBASE:_GetCategory() +local name=self.AirbaseName +local static=StaticObject.getByName(name) +local airbase=Airbase.getByName(name) +local unit=Unit.getByName(name) +local text=string.format("\n=====================================================") +text=text..string.format("\nAirbase %s:",name) +if static then +local oc,uc=static:getCategory() +local ex=static:getCategoryEx() +text=text..string.format("\nSTATIC: oc=%d, uc=%d, ex=%d",oc,uc,ex) +text=text..string.format("\n--------------------------------------------------") +end +if unit then +local oc,uc=unit:getCategory() +local ex=unit:getCategoryEx() +text=text..string.format("\nUNIT: oc=%d, uc=%d, ex=%d",oc,uc,ex) +text=text..string.format("\n--------------------------------------------------") +end +if airbase then +local oc,uc=airbase:getCategory() +local ex=airbase:getCategoryEx() +text=text..string.format("\nAIRBASE: oc=%d, uc=%d, ex=%d",oc,uc,ex) +text=text..string.format("\n--------------------------------------------------") +text=text..UTILS.PrintTableToLog(airbase:getDesc(),nil,true) +end +text=text..string.format("\n=====================================================") +env.info(text) +end +function AIRBASE:Find(DCSAirbase) +local AirbaseName=DCSAirbase:getName() +local AirbaseFound=_DATABASE:FindAirbase(AirbaseName) +return AirbaseFound +end +function AIRBASE:FindByName(AirbaseName) +local AirbaseFound=_DATABASE:FindAirbase(AirbaseName) +return AirbaseFound +end +function AIRBASE:FindByID(id) +for name,_airbase in pairs(_DATABASE.AIRBASES)do +local airbase=_airbase +local aid=tonumber(airbase:GetID(true)) +if aid==id then +return airbase +end +end +return nil +end +function AIRBASE:GetDCSObject() +local DCSAirbase=Airbase.getByName(self.AirbaseName) +if DCSAirbase then +return DCSAirbase +end +return nil +end +function AIRBASE:GetZone() +return self.AirbaseZone +end +function AIRBASE:GetWarehouse() +local warehouse=nil +local airbase=self:GetDCSObject() +if airbase and Airbase.getWarehouse then +warehouse=airbase:getWarehouse() +end +return warehouse +end +function AIRBASE:GetStorage() +return self.storage +end +function AIRBASE:SetAutoCapture(Switch) +local airbase=self:GetDCSObject() +if airbase then +airbase:autoCapture(Switch) +end +return self +end +function AIRBASE:SetAutoCaptureON() +self:SetAutoCapture(true) +return self +end +function AIRBASE:SetAutoCaptureOFF() +self:SetAutoCapture(false) +return self +end +function AIRBASE:IsAutoCapture() +local airbase=self:GetDCSObject() +local auto=nil +if airbase then +auto=airbase:autoCaptureIsOn() +end +return auto +end +function AIRBASE:SetCoalition(Coal) +local airbase=self:GetDCSObject() +if airbase then +airbase:setCoalition(Coal) +end +return self +end +function AIRBASE.GetAllAirbases(coalition,category) +local airbases={} +for _,_airbase in pairs(_DATABASE.AIRBASES)do +local airbase=_airbase +if coalition==nil or airbase:GetCoalition()==coalition then +if category==nil or category==airbase:GetAirbaseCategory()then +table.insert(airbases,airbase) +end +end +end +return airbases +end +function AIRBASE.GetAllAirbaseNames(coalition,category) +local airbases={} +for airbasename,_airbase in pairs(_DATABASE.AIRBASES)do +local airbase=_airbase +if coalition==nil or airbase:GetCoalition()==coalition then +if category==nil or category==airbase:GetAirbaseCategory()then +table.insert(airbases,airbasename) +end +end +end +return airbases +end +function AIRBASE:GetID(unique) +if self.AirbaseID then +return unique and self.AirbaseID or math.abs(self.AirbaseID) +else +for DCSAirbaseId,DCSAirbase in ipairs(world.getAirbases())do +local AirbaseName=DCSAirbase:getName() +local airbaseID=tonumber(DCSAirbase:getID()) +local airbaseCategory=self:GetAirbaseCategory() +if AirbaseName==self.AirbaseName then +if airbaseCategory==Airbase.Category.SHIP or airbaseCategory==Airbase.Category.HELIPAD then +return unique and-airbaseID or airbaseID +else +return airbaseID +end +end +end +end +return nil +end +function AIRBASE:SetParkingSpotWhitelist(TerminalIdWhitelist) +if TerminalIdWhitelist==nil then +self.parkingWhitelist={} +return self +end +if type(TerminalIdWhitelist)~="table"then +TerminalIdWhitelist={TerminalIdWhitelist} +end +self.parkingWhitelist=TerminalIdWhitelist +return self +end +function AIRBASE:SetParkingSpotBlacklist(TerminalIdBlacklist) +if TerminalIdBlacklist==nil then +self.parkingBlacklist={} +return self +end +if type(TerminalIdBlacklist)~="table"then +TerminalIdBlacklist={TerminalIdBlacklist} +end +self.parkingBlacklist=TerminalIdBlacklist +return self +end +function AIRBASE:SetRadioSilentMode(Silent) +local airbase=self:GetDCSObject() +if airbase then +airbase:setRadioSilentMode(Silent) +end +return self +end +function AIRBASE:GetRadioSilentMode() +local silent=nil +local airbase=self:GetDCSObject() +if airbase then +silent=airbase:getRadioSilentMode() +end +return silent +end +function AIRBASE:GetAirbaseCategory() +return self.category +end +function AIRBASE:IsAirdrome() +return self.isAirdrome +end +function AIRBASE:IsHelipad() +return self.isHelipad +end +function AIRBASE:IsShip() +return self.isShip +end +function AIRBASE:GetParkingData(available) +self:F2(available) +local DCSAirbase=self:GetDCSObject() +local parkingdata=nil +if DCSAirbase then +parkingdata=DCSAirbase:getParking(available) +end +self:T2({parkingdata=parkingdata}) +return parkingdata +end +function AIRBASE:GetParkingSpotsNumber(termtype) +local parkingdata=self:GetParkingData(false) +local nspots=0 +for _,parkingspot in pairs(parkingdata)do +if AIRBASE._CheckTerminalType(parkingspot.Term_Type,termtype)then +nspots=nspots+1 +end +end +return nspots +end +function AIRBASE:GetFreeParkingSpotsNumber(termtype,allowTOAC) +local parkingdata=self:GetParkingData(true) +local nfree=0 +for _,parkingspot in pairs(parkingdata)do +if AIRBASE._CheckTerminalType(parkingspot.Term_Type,termtype)then +if(allowTOAC and allowTOAC==true)or parkingspot.TO_AC==false then +nfree=nfree+1 +end +end +end +return nfree +end +function AIRBASE:GetFreeParkingSpotsCoordinates(termtype,allowTOAC) +local parkingdata=self:GetParkingData(true) +local spots={} +for _,parkingspot in pairs(parkingdata)do +if AIRBASE._CheckTerminalType(parkingspot.Term_Type,termtype)then +if(allowTOAC and allowTOAC==true)or parkingspot.TO_AC==false then +table.insert(spots,COORDINATE:NewFromVec3(parkingspot.vTerminalPos)) +end +end +end +return spots +end +function AIRBASE:GetParkingSpotsCoordinates(termtype) +local parkingdata=self:GetParkingData(false) +local spots={} +for _,parkingspot in ipairs(parkingdata)do +if AIRBASE._CheckTerminalType(parkingspot.Term_Type,termtype)then +local _coord=COORDINATE:NewFromVec3(parkingspot.vTerminalPos) +table.insert(spots,_coord) +end +end +return spots +end +function AIRBASE:_InitParkingSpots() +local parkingdata=self:GetParkingData(false) +self.parking={} +self.parkingByID={} +self.NparkingTotal=0 +self.NparkingTerminal={} +for _,terminalType in pairs(AIRBASE.TerminalType)do +self.NparkingTerminal[terminalType]=0 +end +local function isClient(coord) +local clients=_DATABASE.CLIENTS +for clientname,_client in pairs(clients)do +local client=_client +if client and client.SpawnCoord then +local dist=client.SpawnCoord:Get2DDistance(coord) +if dist<2 then +return true,clientname +end +end +end +return false,nil +end +for _,spot in pairs(parkingdata)do +local park={} +park.Vec3=spot.vTerminalPos +park.Coordinate=COORDINATE:NewFromVec3(spot.vTerminalPos) +park.DistToRwy=spot.fDistToRW +park.Free=nil +park.TerminalID=spot.Term_Index +park.TerminalID0=spot.Term_Index_0 +park.TerminalType=spot.Term_Type +park.TOAC=spot.TO_AC +park.ClientSpot,park.ClientName=isClient(park.Coordinate) +park.AirbaseName=self.AirbaseName +self.NparkingTotal=self.NparkingTotal+1 +for _,terminalType in pairs(AIRBASE.TerminalType)do +if self._CheckTerminalType(park.TerminalType,terminalType)then +self.NparkingTerminal[terminalType]=self.NparkingTerminal[terminalType]+1 +end +end +self.parkingByID[park.TerminalID]=park +table.insert(self.parking,park) +end +self.NparkingTotal=self.NparkingTotal-self.NparkingTerminal[AIRBASE.TerminalType.Runway] +return self +end +function AIRBASE:_GetParkingSpotByID(TerminalID) +return self.parkingByID[TerminalID] +end +function AIRBASE:GetParkingSpotsTable(termtype) +local parkingdata=self:GetParkingData(false) +local parkingfree=self:GetParkingData(true) +local function _isfree(_tocheck) +for _,_spot in pairs(parkingfree)do +if _spot.Term_Index==_tocheck.Term_Index then +return true +end +end +return false +end +local spots={} +for _,_spot in pairs(parkingdata)do +if AIRBASE._CheckTerminalType(_spot.Term_Type,termtype)then +local spot=self:_GetParkingSpotByID(_spot.Term_Index) +if spot then +spot.Free=_isfree(_spot) +spot.TOAC=_spot.TO_AC +spot.AirbaseName=self.AirbaseName +table.insert(spots,spot) +else +self:E(string.format("ERROR: Parking spot %s is nil!",tostring(_spot.Term_Index))) +end +end +end +return spots +end +function AIRBASE:GetFreeParkingSpotsTable(termtype,allowTOAC) +local parkingfree=self:GetParkingData(true) +local freespots={} +for _,_spot in pairs(parkingfree)do +if AIRBASE._CheckTerminalType(_spot.Term_Type,termtype)then +if(allowTOAC and allowTOAC==true)or _spot.TO_AC==false then +local spot=self:_GetParkingSpotByID(_spot.Term_Index) +spot.Free=true +spot.TOAC=_spot.TO_AC +spot.AirbaseName=self.AirbaseName +table.insert(freespots,spot) +end +end +end +return freespots +end +function AIRBASE:GetParkingSpotData(TerminalID) +local parkingdata=self:GetParkingSpotsTable() +for _,_spot in pairs(parkingdata)do +local spot=_spot +self:T({TerminalID=spot.TerminalID,TerminalType=spot.TerminalType}) +if TerminalID==spot.TerminalID then +return spot +end +end +self:E("ERROR: Could not find spot with Terminal ID="..tostring(TerminalID)) +return nil +end +function AIRBASE:MarkParkingSpots(termtype,mark) +if mark==nil then +mark=true +end +local parkingdata=self:GetParkingSpotsTable(termtype) +local airbasename=self:GetName() +self:E(string.format("Parking spots at %s for terminal type %s:",airbasename,tostring(termtype))) +for _,_spot in pairs(parkingdata)do +local _text=string.format("Term Index=%d, Term Type=%d, Free=%s, TOAC=%s, Term ID0=%d, Dist2Rwy=%.1f m", +_spot.TerminalID,_spot.TerminalType,tostring(_spot.Free),tostring(_spot.TOAC),_spot.TerminalID0,_spot.DistToRwy) +if mark then +_spot.Coordinate:MarkToAll(_text) +end +local _text=string.format("%s, Term Index=%3d, Term Type=%03d, Free=%5s, TOAC=%5s, Term ID0=%3d, Dist2Rwy=%.1f m", +airbasename,_spot.TerminalID,_spot.TerminalType,tostring(_spot.Free),tostring(_spot.TOAC),_spot.TerminalID0,_spot.DistToRwy) +self:E(_text) +end +end +function AIRBASE:FindFreeParkingSpotForAircraft(group,terminaltype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nspots,parkingdata) +scanradius=scanradius or 50 +if scanunits==nil then +scanunits=true +end +if scanstatics==nil then +scanstatics=true +end +if scanscenery==nil then +scanscenery=false +end +if verysafe==nil then +verysafe=false +end +local function _overlap(object1,object2,dist) +local pos1=object1 +local pos2=object2 +local r1=pos1:GetBoundingRadius() +local r2=pos2:GetBoundingRadius() +if r1 and r2 then +local safedist=(r1+r2)*1.1 +local safe=(dist>safedist) +self:T2(string.format("r1=%.1f r2=%.1f s=%.1f d=%.1f ==> safe=%s",r1,r2,safedist,dist,tostring(safe))) +return safe +else +return true +end +end +local airport=self:GetName() +parkingdata=parkingdata or self:GetParkingSpotsTable(terminaltype) +local aircraft=nil +local _aircraftsize=23 +local ax=23 +local ay=7 +local az=17 +if group and group.ClassName=="GROUP"then +aircraft=group:GetUnit(1) +if aircraft then +_aircraftsize,ax,ay,az=aircraft:GetObjectSize() +end +end +local _nspots=nspots or group:GetSize() +self:T(string.format("%s: Looking for %d parking spot(s) for aircraft of size %.1f m (x=%.1f,y=%.1f,z=%.1f) at terminal type %s.",airport,_nspots,_aircraftsize,ax,ay,az,tostring(terminaltype))) +local validspots={} +local nvalid=0 +local _test=false +if _test then +return validspots +end +local markobstacles=false +for _,parkingspot in pairs(parkingdata)do +local _spot=parkingspot.Coordinate +local _termid=parkingspot.TerminalID +if AIRBASE._CheckTerminalType(parkingspot.TerminalType,terminaltype)and self:_CheckParkingLists(_termid)then +if verysafe and(parkingspot.Free==false or parkingspot.TOAC==true)then +self:T(string.format("%s: Parking spot id %d NOT free (or aircraft has not taken off yet). Free=%s, TOAC=%s.",airport,parkingspot.TerminalID,tostring(parkingspot.Free),tostring(parkingspot.TOAC))) +else +local _,_,_,_units,_statics,_sceneries=_spot:ScanObjects(scanradius,scanunits,scanstatics,scanscenery) +local occupied=false +for _,unit in pairs(_units)do +local _coord=unit:GetCoordinate() +local _dist=_coord:Get2DDistance(_spot) +local _safe=_overlap(aircraft,unit,_dist) +if markobstacles then +local l,x,y,z=unit:GetObjectSize() +_coord:MarkToAll(string.format("Unit %s\nx=%.1f y=%.1f z=%.1f\nl=%.1f d=%.1f\nspot %d safe=%s",unit:GetName(),x,y,z,l,_dist,_termid,tostring(_safe))) +end +if scanunits and not _safe then +occupied=true +end +end +for _,static in pairs(_statics)do +local _static=STATIC:Find(static) +local _vec3=static:getPoint() +local _coord=COORDINATE:NewFromVec3(_vec3) +local _dist=_coord:Get2DDistance(_spot) +local _safe=_overlap(aircraft,_static,_dist) +if markobstacles then +local l,x,y,z=_static:GetObjectSize() +_coord:MarkToAll(string.format("Static %s\nx=%.1f y=%.1f z=%.1f\nl=%.1f d=%.1f\nspot %d safe=%s",static:getName(),x,y,z,l,_dist,_termid,tostring(_safe))) +end +if scanstatics and not _safe then +occupied=true +end +end +for _,scenery in pairs(_sceneries)do +local _scenery=SCENERY:Register(scenery:getTypeName(),scenery) +local _vec3=scenery:getPoint() +local _coord=COORDINATE:NewFromVec3(_vec3) +local _dist=_coord:Get2DDistance(_spot) +local _safe=_overlap(aircraft,_scenery,_dist) +if markobstacles then +local l,x,y,z=scenery:GetObjectSize(scenery) +_coord:MarkToAll(string.format("Scenery %s\nx=%.1f y=%.1f z=%.1f\nl=%.1f d=%.1f\nspot %d safe=%s",scenery:getTypeName(),x,y,z,l,_dist,_termid,tostring(_safe))) +end +if scanscenery and not _safe then +occupied=true +end +end +for _,_takenspot in pairs(validspots)do +local _dist=_takenspot.Coordinate:Get2DDistance(_spot) +local _safe=_overlap(aircraft,aircraft,_dist) +if not _safe then +occupied=true +end +end +if occupied then +self:T(string.format("%s: Parking spot id %d occupied.",airport,_termid)) +else +self:T(string.format("%s: Parking spot id %d free.",airport,_termid)) +if nvalid<_nspots then +table.insert(validspots,{Coordinate=_spot,TerminalID=_termid}) +end +nvalid=nvalid+1 +self:T(string.format("%s: Parking spot id %d free. Nfree=%d/%d.",airport,_termid,nvalid,_nspots)) +end +end +if nvalid>=_nspots then +return validspots +end +end +end +return validspots +end +function AIRBASE:_CheckParkingLists(TerminalID) +if self.parkingBlacklist and#self.parkingBlacklist>0 then +for _,terminalID in pairs(self.parkingBlacklist or{})do +if terminalID==TerminalID then +return false +end +end +end +if self.parkingWhitelist and#self.parkingWhitelist>0 then +for _,terminalID in pairs(self.parkingWhitelist or{})do +if terminalID==TerminalID then +return true +end +end +return false +end +return true +end +function AIRBASE._CheckTerminalType(Term_Type,termtype) +if Term_Type==nil then +return false +end +if termtype==nil then +if Term_Type==AIRBASE.TerminalType.Runway then +return false +else +return true +end +end +local match=false +if Term_Type==termtype then +match=true +end +if termtype==AIRBASE.TerminalType.OpenMedOrBig then +if Term_Type==AIRBASE.TerminalType.OpenMed or Term_Type==AIRBASE.TerminalType.OpenBig then +match=true +end +elseif termtype==AIRBASE.TerminalType.HelicopterUsable then +if Term_Type==AIRBASE.TerminalType.OpenMed or Term_Type==AIRBASE.TerminalType.OpenBig or Term_Type==AIRBASE.TerminalType.HelicopterOnly then +match=true +end +elseif termtype==AIRBASE.TerminalType.FighterAircraft then +if Term_Type==AIRBASE.TerminalType.OpenMed or Term_Type==AIRBASE.TerminalType.OpenBig or Term_Type==AIRBASE.TerminalType.Shelter then +match=true +end +elseif termtype==AIRBASE.TerminalType.FighterAircraftSmall then +if Term_Type==AIRBASE.TerminalType.OpenMed or Term_Type==AIRBASE.TerminalType.OpenBig or Term_Type==AIRBASE.TerminalType.Shelter or Term_Type==AIRBASE.TerminalType.SmallSizeFighter then +match=true +end +end +return match +end +function AIRBASE:GetRunways() +return self.runways or{} +end +function AIRBASE:GetRunwayByName(Name) +if Name==nil then +return +end +if Name then +for _,_runway in pairs(self.runways)do +local runway=_runway +local name=self:GetRunwayName(runway) +self:T("Check Runway Name: "..name) +if name==Name:upper()then +return runway +end +end +end +self:E("ERROR: Could not find runway with name "..tostring(Name)) +return nil +end +function AIRBASE:_InitRunways(IncludeInverse) +if IncludeInverse==nil then +IncludeInverse=true +end +local Runways={} +local function _createRunway(name,course,width,length,center) +self:T("Create Runway: name = "..name) +local bearing=-1*course +local heading=math.deg(bearing) +local runway={} +local namefromheading=math.floor(heading/10) +if self.AirbaseName==AIRBASE.Syria.Beirut_Rafic_Hariri and math.abs(namefromheading-name)>1 then +runway.name=string.format("%02d",tonumber(namefromheading)) +else +runway.name=string.format("%02d",tonumber(name)) +end +runway.magheading=tonumber(runway.name)*10 +runway.idx=runway.magheading +runway.heading=heading +runway.width=width or 0 +runway.length=length or 0 +runway.center=COORDINATE:NewFromVec3(center) +if runway.heading>360 then +runway.heading=runway.heading-360 +elseif runway.heading<0 then +runway.heading=runway.heading+360 +end +if math.abs(runway.heading-runway.magheading)>60 then +self:T(string.format("WARNING: Runway %s: heading=%.1f magheading=%.1f",runway.name,runway.heading,runway.magheading)) +runway.heading=runway.heading-180 +end +if runway.heading>360 then +runway.heading=runway.heading-360 +elseif runway.heading<0 then +runway.heading=runway.heading+360 +end +runway.position=runway.center:Translate(-runway.length/2,runway.heading) +runway.endpoint=runway.center:Translate(runway.length/2,runway.heading) +local init=runway.center:GetVec3() +local width=runway.width/2 +local L2=runway.length/2 +local offset1={x=init.x+(math.cos(bearing+math.pi)*L2),y=init.z+(math.sin(bearing+math.pi)*L2)} +local offset2={x=init.x-(math.cos(bearing+math.pi)*L2),y=init.z-(math.sin(bearing+math.pi)*L2)} +local points={} +points[1]={x=offset1.x+(math.cos(bearing+(math.pi/2))*width),y=offset1.y+(math.sin(bearing+(math.pi/2))*width)} +points[2]={x=offset1.x+(math.cos(bearing-(math.pi/2))*width),y=offset1.y+(math.sin(bearing-(math.pi/2))*width)} +points[3]={x=offset2.x+(math.cos(bearing-(math.pi/2))*width),y=offset2.y+(math.sin(bearing-(math.pi/2))*width)} +points[4]={x=offset2.x+(math.cos(bearing+(math.pi/2))*width),y=offset2.y+(math.sin(bearing+(math.pi/2))*width)} +runway.zone=ZONE_POLYGON_BASE:New(string.format("%s Runway %s",self.AirbaseName,runway.name),points) +return runway +end +local airbase=self:GetDCSObject() +if airbase then +local runways=airbase:getRunways() +self:T2(runways) +if runways and#runways>0 then +for _,rwy in pairs(runways)do +self:T(rwy) +local runway=_createRunway(rwy.Name,rwy.course,rwy.width,rwy.length,rwy.position) +table.insert(Runways,runway) +if IncludeInverse then +local idx=tonumber(runway.name) +local name2=tostring(idx-18) +if idx<18 then +name2=tostring(idx+18) +end +local runway=_createRunway(name2,rwy.course-math.pi,rwy.width,rwy.length,rwy.position) +table.insert(Runways,runway) +end +end +else +self.runways={} +return{} +end +end +local rpairs={} +for i,_ri in pairs(Runways)do +local ri=_ri +for j,_rj in pairs(Runways)do +local rj=_rj +if i<j then +if ri.name==rj.name then +rpairs[i]=j +end +end +end +end +local function isLeft(a,b,c) +return((b.z-a.z)*(c.x-a.x)-(b.x-a.x)*(c.z-a.z))>0 +end +for i,j in pairs(rpairs)do +local ri=Runways[i] +local rj=Runways[j] +local c0=ri.center +local a=UTILS.VecTranslate(c0,1000,ri.heading) +local b=UTILS.VecSubstract(rj.center,ri.center) +b=UTILS.VecAdd(ri.center,b) +local left=isLeft(c0,a,b) +if left then +ri.isLeft=false +rj.isLeft=true +else +ri.isLeft=true +rj.isLeft=false +end +end +self.runways=Runways +return Runways +end +function AIRBASE:GetRunwayData(magvar,mark) +local runways={} +if self:GetAirbaseCategory()~=Airbase.Category.AIRDROME then +return{} +end +local runwaycoords=self:GetParkingSpotsCoordinates(AIRBASE.TerminalType.Runway) +if false then +for i,_coord in pairs(runwaycoords)do +local coord=_coord +coord:Translate(100,0):MarkToAll("Runway i="..i) +end +end +magvar=magvar or UTILS.GetMagneticDeclination() +local N=#runwaycoords +local N2=N/2 +local exception=false +local name=self:GetName() +if name==AIRBASE.Nevada.Jean_Airport or +name==AIRBASE.Nevada.Creech_AFB or +name==AIRBASE.PersianGulf.Abu_Dhabi_International_Airport or +name==AIRBASE.PersianGulf.Dubai_Intl or +name==AIRBASE.PersianGulf.Shiraz_International_Airport or +name==AIRBASE.PersianGulf.Kish_International_Airport or +name==AIRBASE.MarianaIslands.Andersen_AFB then +exception=1 +elseif UTILS.GetDCSMap()==DCSMAP.Syria and N>=2 and +name~=AIRBASE.Syria.Minakh and +name~=AIRBASE.Syria.Damascus and +name~=AIRBASE.Syria.Khalkhalah and +name~=AIRBASE.Syria.Marj_Ruhayyil and +name~=AIRBASE.Syria.Beirut_Rafic_Hariri then +exception=2 +end +local function f(i) +local j +if exception==1 then +j=N-(i-1) +elseif exception==2 then +if i<=N2 then +j=i+N2 +else +j=i-N2 +end +else +if i%2==0 then +j=i-1 +else +j=i+1 +end +end +if name==AIRBASE.Syria.Beirut_Rafic_Hariri then +if i==1 then +j=3 +elseif i==2 then +j=6 +elseif i==3 then +j=1 +elseif i==4 then +j=5 +elseif i==5 then +j=4 +elseif i==6 then +j=2 +end +end +if name==AIRBASE.Syria.Ramat_David then +if i==1 then +j=4 +elseif i==2 then +j=6 +elseif i==3 then +j=5 +elseif i==4 then +j=1 +elseif i==5 then +j=3 +elseif i==6 then +j=2 +end +end +return j +end +for i=1,N do +local j=f(i) +local c1=runwaycoords[i] +local c2=runwaycoords[j] +local hdg=c1:HeadingTo(c2) +local idx=string.format("%02d",UTILS.Round((hdg-magvar)/10,0)) +local runway={} +runway.heading=hdg +runway.idx=idx +runway.magheading=idx +runway.length=c1:Get2DDistance(c2) +runway.position=c1 +runway.endpoint=c2 +self:T(string.format("Airbase %s: Adding runway id=%s, heading=%03d, length=%d m i=%d j=%d",self:GetName(),runway.idx,runway.heading,runway.length,i,j)) +if mark then +runway.position:MarkToAll(string.format("Runway %s: true heading=%03d (magvar=%d), length=%d m, i=%d, j=%d",runway.idx,runway.heading,magvar,runway.length,i,j)) +end +table.insert(runways,runway) +end +local rpairs={} +for i,_ri in pairs(runways)do +local ri=_ri +for j,_rj in pairs(runways)do +local rj=_rj +if i<j then +if ri.name==rj.name then +rpairs[i]=j +end +end +end +end +local function isLeft(a,b,c) +return((b.z-a.z)*(c.x-a.x)-(b.x-a.x)*(c.z-a.z))>0 +end +for i,j in pairs(rpairs)do +local ri=runways[i] +local rj=runways[j] +local c0=ri.position +local a=UTILS.VecTranslate(c0,1000,ri.heading) +local b=UTILS.VecSubstract(rj.position,ri.position) +b=UTILS.VecAdd(ri.position,b) +local left=isLeft(c0,a,b) +if left then +ri.isLeft=false +rj.isLeft=true +else +ri.isLeft=true +rj.isLeft=false +end +end +return runways +end +function AIRBASE:SetActiveRunway(Name,PreferLeft) +self:SetActiveRunwayTakeoff(Name,PreferLeft) +self:SetActiveRunwayLanding(Name,PreferLeft) +end +function AIRBASE:SetActiveRunwayLanding(Name,PreferLeft) +local runway=self:GetRunwayByName(Name) +if not runway then +runway=self:GetRunwayIntoWind(PreferLeft) +end +if runway then +self:T(string.format("%s: Setting active runway for landing as %s",self.AirbaseName,self:GetRunwayName(runway))) +else +self:E("ERROR: Could not set the runway for landing!") +end +self.runwayLanding=runway +return runway +end +function AIRBASE:GetActiveRunway() +return self.runwayLanding,self.runwayTakeoff +end +function AIRBASE:GetActiveRunwayLanding() +return self.runwayLanding +end +function AIRBASE:GetActiveRunwayTakeoff() +return self.runwayTakeoff +end +function AIRBASE:SetActiveRunwayTakeoff(Name,PreferLeft) +local runway=self:GetRunwayByName(Name) +if not runway then +runway=self:GetRunwayIntoWind(PreferLeft) +end +if runway then +self:T(string.format("%s: Setting active runway for takeoff as %s",self.AirbaseName,self:GetRunwayName(runway))) +else +self:E("ERROR: Could not set the runway for takeoff!") +end +self.runwayTakeoff=runway +return runway +end +function AIRBASE:GetRunwayIntoWind(PreferLeft) +local runways=self:GetRunways() +local Vwind=self:GetCoordinate():GetWindWithTurbulenceVec3() +local norm=UTILS.VecNorm(Vwind) +local iact=1 +if norm>0 then +Vwind.x=Vwind.x/norm +Vwind.y=0 +Vwind.z=Vwind.z/norm +local dotmin=nil +for i,_runway in pairs(runways)do +local runway=_runway +if PreferLeft==nil or PreferLeft==runway.isLeft then +local alpha=math.rad(runway.heading) +local Vrunway={x=math.cos(alpha),y=0,z=math.sin(alpha)} +local dot=UTILS.VecDot(Vwind,Vrunway) +if dotmin==nil or dot<dotmin then +dotmin=dot +iact=i +end +end +end +else +self:E("WARNING: Norm of wind is zero! Cannot determine runway based on wind direction") +end +return runways[iact] +end +function AIRBASE:GetRunwayName(Runway,LongLeftRight) +Runway=Runway or self:GetActiveRunway() +local name="XX" +if Runway then +name=Runway.name +if Runway.isLeft==true then +if LongLeftRight then +name=name.." Left" +else +name=name.."L" +end +elseif Runway.isLeft==false then +if LongLeftRight then +name=name.." Right" +else +name=name.."R" +end +end +end +return name +end +function AIRBASE:CheckOnRunWay(group,radius,despawn) +radius=radius or 50 +if self:GetAirbaseCategory()~=Airbase.Category.AIRDROME then +return false +end +if group and group:IsAlive()then +self:T(string.format("%s, checking if group %s is on runway?",self:GetName(),group:GetName())) +local runwaypoints=self:GetParkingSpotsCoordinates(AIRBASE.TerminalType.Runway) +local units=group:GetUnits() +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()and not unit:InAir()then +self:T(string.format("%s, checking if unit %s is on runway?",self:GetName(),unit:GetName())) +for _i,_coord in pairs(runwaypoints)do +local dist=unit:GetCoordinate():Get2DDistance(_coord) +if dist<radius then +self:E(string.format("%s, unit %s of group %s was spawned on runway #%d. Distance %.1f < radius %.1f m. Despawn = %s.",self:GetName(),unit:GetName(),group:GetName(),_i,dist,radius,tostring(despawn))) +if despawn then +group:Destroy(true) +end +return true +else +self:T(string.format("%s, unit %s of group %s was NOT spawned on runway #%d. Distance %.1f > radius %.1f m. Despawn = %s.",self:GetName(),unit:GetName(),group:GetName(),_i,dist,radius,tostring(despawn))) +end +end +else +self:T(string.format("%s, checking if unit %s of group %s is on runway. Unit is NOT alive.",self:GetName(),unit:GetName(),group:GetName())) +end +end +else +self:T(string.format("%s, checking if group %s is on runway. Group is NOT alive.",self:GetName(),group:GetName())) +end +return false +end +function AIRBASE:GetCategory() +return self.category +end +function AIRBASE:GetCategoryName() +return AIRBASE.CategoryName[self.category] +end +SCENERY={ +ClassName="SCENERY", +} +function SCENERY:Register(SceneryName,SceneryObject) +local self=BASE:Inherit(self,POSITIONABLE:New(SceneryName)) +self.SceneryName=tostring(SceneryName) +self.SceneryObject=SceneryObject +if self.SceneryObject and self.SceneryObject.getLife then +self.Life0=self.SceneryObject:getLife()or 0 +else +self.Life0=0 +end +self.Properties={} +return self +end +function SCENERY:GetProperty(PropertyName) +return self.Properties[PropertyName] +end +function SCENERY:HasProperty(PropertyName) +return self.Properties[PropertyName]~=nil and true or false +end +function SCENERY:GetAllProperties() +return self.Properties +end +function SCENERY:SetProperty(PropertyName,PropertyValue) +self.Properties[PropertyName]=PropertyValue +return self +end +function SCENERY:GetName() +return self.SceneryName +end +function SCENERY:GetDCSObject() +return self.SceneryObject +end +function SCENERY:GetLife() +local life=0 +if self.SceneryObject and self.SceneryObject.getLife then +life=self.SceneryObject:getLife() +if life>self.Life0 then +self.Life0=math.floor(life*1.2) +end +end +return life +end +function SCENERY:GetLife0() +return self.Life0 or 0 +end +function SCENERY:IsAlive(Threshold) +if not Threshold then +return self:GetLife()>=1 and true or false +else +return self:GetRelativeLife()>Threshold and true or false +end +end +function SCENERY:IsDead(Threshold) +if not Threshold then +return self:GetLife()<1 and true or false +else +return self:GetRelativeLife()<=Threshold and true or false +end +end +function SCENERY:GetRelativeLife() +local life=self:GetLife() +local life0=self:GetLife0() +if life==0 or life0==0 then return 0 end +local rlife=math.floor((life/life0)*100) +return rlife +end +function SCENERY:GetThreatLevel() +return 0,"Scenery" +end +function SCENERY:FindByName(Name,Coordinate,Radius,Role) +local radius=Radius or 100 +local name=Name or"unknown" +local scenery=nil +local function SceneryScan(scoordinate,sradius,sname) +if scoordinate~=nil then +local Vec2=scoordinate:GetVec2() +local scanzone=ZONE_RADIUS:New("Zone-"..sname,Vec2,sradius,true) +scanzone:Scan({Object.Category.SCENERY}) +local scanned=scanzone:GetScannedSceneryObjects() +local rscenery=nil +for _,_scenery in pairs(scanned)do +local scenery=_scenery +if tostring(scenery.SceneryName)==tostring(sname)then +rscenery=scenery +if Role then rscenery:SetProperty("ROLE",Role)end +break +end +end +return rscenery +end +return nil +end +if Coordinate then +scenery=SceneryScan(Coordinate,radius,name) +end +return scenery +end +function SCENERY:FindByNameInZone(Name,Zone,Radius) +local radius=Radius or 100 +local name=Name or"unknown" +if type(Zone)=="string"then +Zone=ZONE:FindByName(Zone) +end +local coordinate=Zone:GetCoordinate() +return self:FindByName(Name,coordinate,Radius,Zone:GetProperty("ROLE")) +end +function SCENERY:FindByZoneName(ZoneName) +local zone=ZoneName +if type(ZoneName)=="string"then +zone=ZONE:FindByName(ZoneName) +end +local _id=zone:GetProperty('OBJECT ID') +if not _id then +BASE:E("**** Zone without object ID: "..ZoneName.." | Type: "..tostring(zone.ClassName)) +if string.find(zone.ClassName,"POLYGON")then +zone:Scan({Object.Category.SCENERY}) +local scanned=zone:GetScannedSceneryObjects() +for _,_scenery in(scanned)do +local scenery=_scenery +if scenery:IsAlive()then +local role=zone:GetProperty("ROLE") +if role then scenery:SetProperty("ROLE",role)end +return scenery +end +end +return nil +else +return self:FindByName(_id,zone:GetCoordinate(),nil,zone:GetProperty("ROLE")) +end +else +return self:FindByName(_id,zone:GetCoordinate(),nil,zone:GetProperty("ROLE")) +end +end +function SCENERY:FindAllByZoneName(ZoneName) +local zone=ZoneName +if type(ZoneName)=="string"then +zone=ZONE:FindByName(ZoneName) +end +local _id=zone:GetProperty('OBJECT ID') +if not _id then +zone:Scan({Object.Category.SCENERY}) +local scanned=zone:GetScannedSceneryObjects() +if#scanned>0 then +return scanned +else +return nil +end +else +local obj=self:FindByName(_id,zone:GetCoordinate(),nil,zone:GetProperty("ROLE")) +if obj then +return{obj} +else +return nil +end +end +end +function SCENERY:Destroy() +return self +end +MARKER={ +ClassName="MARKER", +Debug=false, +lid=nil, +mid=nil, +coordinate=nil, +text=nil, +message=nil, +readonly=nil, +coalition=nil, +} +_MARKERID=0 +MARKER.version="0.1.1" +function MARKER:New(Coordinate,Text) +local self=BASE:Inherit(self,FSM:New()) +self.coordinate=UTILS.DeepCopy(Coordinate) +self.text=Text +self.readonly=false +self.message="" +_MARKERID=_MARKERID+1 +self.myid=_MARKERID +self.lid=string.format("Marker #%d | ",self.myid) +self:SetStartState("Invisible") +self:AddTransition("Invisible","Added","Visible") +self:AddTransition("Visible","Removed","Invisible") +self:AddTransition("*","Changed","*") +self:AddTransition("*","TextUpdate","*") +self:AddTransition("*","CoordUpdate","*") +self:HandleEvent(EVENTS.MarkAdded) +self:HandleEvent(EVENTS.MarkRemoved) +self:HandleEvent(EVENTS.MarkChange) +return self +end +function MARKER:ReadOnly() +self.readonly=true +return self +end +function MARKER:ReadWrite() +self.readonly=false +return self +end +function MARKER:Message(Text) +self.message=Text or"" +return self +end +function MARKER:ToAll(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.ToAll,self) +else +self.toall=true +self.tocoalition=nil +self.coalition=nil +self.togroup=nil +self.groupname=nil +self.groupid=nil +if self.shown then +self:Remove() +end +self.mid=UTILS.GetMarkID() +trigger.action.markToAll(self.mid,self.text,self.coordinate:GetVec3(),self.readonly,self.message) +end +return self +end +function MARKER:ToCoalition(Coalition,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.ToCoalition,self,Coalition) +else +self.coalition=Coalition +self.tocoalition=true +self.toall=false +self.togroup=false +self.groupname=nil +self.groupid=nil +if self.shown then +self:Remove() +end +self.mid=UTILS.GetMarkID() +trigger.action.markToCoalition(self.mid,self.text,self.coordinate:GetVec3(),self.coalition,self.readonly,self.message) +end +return self +end +function MARKER:ToBlue(Delay) +self:ToCoalition(coalition.side.BLUE,Delay) +return self +end +function MARKER:ToRed(Delay) +self:ToCoalition(coalition.side.RED,Delay) +return self +end +function MARKER:ToNeutral(Delay) +self:ToCoalition(coalition.side.NEUTRAL,Delay) +return self +end +function MARKER:ToGroup(Group,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.ToGroup,self,Group) +else +if Group and Group:IsAlive()~=nil then +self.groupid=Group:GetID() +if self.groupid then +self.groupname=Group:GetName() +self.togroup=true +self.tocoalition=nil +self.coalition=nil +self.toall=nil +if self.shown then +self:Remove() +end +self.mid=UTILS.GetMarkID() +trigger.action.markToGroup(self.mid,self.text,self.coordinate:GetVec3(),self.groupid,self.readonly,self.message) +end +else +end +end +return self +end +function MARKER:UpdateText(Text,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.UpdateText,self,Text) +else +self.text=tostring(Text) +self:Refresh() +self:TextUpdate(tostring(Text)) +end +return self +end +function MARKER:UpdateCoordinate(Coordinate,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.UpdateCoordinate,self,Coordinate) +else +self.coordinate=Coordinate +self:Refresh() +self:CoordUpdate(Coordinate) +end +return self +end +function MARKER:Refresh(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.Refresh,self) +else +if self.toall then +self:ToAll() +elseif self.tocoalition then +self:ToCoalition(self.coalition) +elseif self.togroup then +local group=GROUP:FindByName(self.groupname) +self:ToGroup(group) +else +self:E(self.lid.."ERROR: unknown To in :Refresh()!") +end +end +return self +end +function MARKER:Remove(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MARKER.Remove,self) +else +if self.shown then +trigger.action.removeMark(self.mid) +end +end +return self +end +function MARKER:GetCoordinate() +return self.coordinate +end +function MARKER:GetText() +return self.text +end +function MARKER:SetText(Text) +self.text=Text and tostring(Text)or"" +return self +end +function MARKER:IsVisible() +return self:Is("Visible") +end +function MARKER:IsInvisible() +return self:Is("Invisible") +end +function MARKER:OnEventMarkAdded(EventData) +if EventData and EventData.MarkID then +local MarkID=EventData.MarkID +self:T3(self.lid..string.format("Captured event MarkAdded for Mark ID=%s",tostring(MarkID))) +if MarkID==self.mid then +self.shown=true +self:Added(EventData) +end +end +end +function MARKER:OnEventMarkRemoved(EventData) +if EventData and EventData.MarkID then +local MarkID=EventData.MarkID +local MarkID=EventData.MarkID +self:T3(self.lid..string.format("Captured event MarkRemoved for Mark ID=%s",tostring(MarkID))) +if MarkID==self.mid then +self.shown=false +self:Removed(EventData) +end +end +end +function MARKER:OnEventMarkChange(EventData) +if EventData and EventData.MarkID then +local MarkID=EventData.MarkID +self:T3(self.lid..string.format("Captured event MarkChange for Mark ID=%s",tostring(MarkID))) +if MarkID==self.mid then +local MarkID=EventData.MarkID +self:T3(self.lid..string.format("Captured event MarkChange for Mark ID=%s",tostring(MarkID))) +if MarkID==self.mid then +self.text=tostring(EventData.MarkText) +self:Changed(EventData) +end +end +end +end +function MARKER:onafterAdded(From,Event,To,EventData) +local text=string.format("Captured event MarkAdded for myself:\n") +text=text..string.format("Marker ID = %s\n",tostring(EventData.MarkID)) +text=text..string.format("Coalition = %s\n",tostring(EventData.MarkCoalition)) +text=text..string.format("Group ID = %s\n",tostring(EventData.MarkGroupID)) +text=text..string.format("Initiator = %s\n",EventData.IniUnit and EventData.IniUnit:GetName()or"Nobody") +text=text..string.format("Coordinate = %s\n",EventData.MarkCoordinate and EventData.MarkCoordinate:ToStringLLDMS()or"Nowhere") +text=text..string.format("Text: \n%s",tostring(EventData.MarkText)) +self:T2(self.lid..text) +end +function MARKER:onafterRemoved(From,Event,To,EventData) +local text=string.format("Captured event MarkRemoved for myself:\n") +text=text..string.format("Marker ID = %s\n",tostring(EventData.MarkID)) +text=text..string.format("Coalition = %s\n",tostring(EventData.MarkCoalition)) +text=text..string.format("Group ID = %s\n",tostring(EventData.MarkGroupID)) +text=text..string.format("Initiator = %s\n",EventData.IniUnit and EventData.IniUnit:GetName()or"Nobody") +text=text..string.format("Coordinate = %s\n",EventData.MarkCoordinate and EventData.MarkCoordinate:ToStringLLDMS()or"Nowhere") +text=text..string.format("Text: \n%s",tostring(EventData.MarkText)) +self:T2(self.lid..text) +end +function MARKER:onafterChanged(From,Event,To,EventData) +local text=string.format("Captured event MarkChange for myself:\n") +text=text..string.format("Marker ID = %s\n",tostring(EventData.MarkID)) +text=text..string.format("Coalition = %s\n",tostring(EventData.MarkCoalition)) +text=text..string.format("Group ID = %s\n",tostring(EventData.MarkGroupID)) +text=text..string.format("Initiator = %s\n",EventData.IniUnit and EventData.IniUnit:GetName()or"Nobody") +text=text..string.format("Coordinate = %s\n",EventData.MarkCoordinate and EventData.MarkCoordinate:ToStringLLDMS()or"Nowhere") +text=text..string.format("Text: \n%s",tostring(EventData.MarkText)) +self:T2(self.lid..text) +end +function MARKER:onafterTextUpdate(From,Event,To,Text) +self:T(self.lid..string.format("New Marker Text:\n%s",Text)) +end +function MARKER:onafterCoordUpdate(From,Event,To,Coordinate) +self:T(self.lid..string.format("New Marker Coordinate in LL DMS: %s",Coordinate:ToStringLLDMS())) +end +WEAPON={ +ClassName="WEAPON", +verbose=0, +} +WEAPON.version="0.1.0" +function WEAPON:New(WeaponObject) +if WeaponObject==nil then +env.error("ERROR: Weapon object does NOT exist") +return nil +end +local self=BASE:Inherit(self,POSITIONABLE:New("Weapon")) +self.weapon=WeaponObject +self.desc=WeaponObject:getDesc() +self.category=self.desc.category +if self:IsMissile()and self.desc.missileCategory then +self.categoryMissile=self.desc.missileCategory +if self.desc.guidance then +self.guidance=self.desc.guidance +end +end +self.typeName=WeaponObject:getTypeName()or"Unknown Type" +self.name=WeaponObject:getName() +self.coalition=WeaponObject:getCoalition() +self.country=WeaponObject:getCountry() +self.launcher=WeaponObject:getLauncher() +self.launcherName="Unknown Launcher" +if self.launcher then +self.launcherName=self.launcher:getName() +self.launcherUnit=UNIT:Find(self.launcher) +end +self.coordinate=COORDINATE:NewFromVec3(self.launcher:getPoint()) +self.lid=string.format("[%s] %s | ",self.typeName,self.name) +if self.launcherUnit then +self.releaseHeading=self.launcherUnit:GetHeading() +self.releaseAltitudeASL=self.launcherUnit:GetAltitude() +self.releaseAltitudeAGL=self.launcherUnit:GetAltitude(true) +self.releaseCoordinate=self.launcherUnit:GetCoordinate() +self.releasePitch=self.launcherUnit:GetPitch() +end +self:SetTimeStepTrack() +self:SetDistanceInterceptPoint() +local text=string.format("Weapon v%s\nName=%s, TypeName=%s, Category=%s, Coalition=%d, Country=%d, Launcher=%s", +self.version,self.name,self.typeName,self.category,self.coalition,self.country,self.launcherName) +self:T(self.lid..text) +self:T2(self.desc) +return self +end +function WEAPON:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function WEAPON:SetTimeStepTrack(TimeStep) +self.dtTrack=TimeStep or 0.01 +return self +end +function WEAPON:SetDistanceInterceptPoint(Distance) +self.distIP=Distance or 50 +return self +end +function WEAPON:SetMarkImpact(Switch) +if Switch==false then +self.impactMark=false +else +self.impactMark=true +end +return self +end +function WEAPON:SetSmokeImpact(Switch,SmokeColor) +if Switch==false then +self.impactSmoke=false +else +self.impactSmoke=true +end +self.impactSmokeColor=SmokeColor or SMOKECOLOR.Red +return self +end +function WEAPON:SetFuncTrack(FuncTrack,...) +self.trackFunc=FuncTrack +self.trackArg=arg or{} +return self +end +function WEAPON:SetFuncImpact(FuncImpact,...) +self.impactFunc=FuncImpact +self.impactArg=arg or{} +return self +end +function WEAPON:GetLauncher() +return self.launcherUnit +end +function WEAPON:GetTarget() +local target=nil +if self.weapon then +local object=self.weapon:getTarget() +if object then +local category=Object.getCategory(object) +local name=object:getName() +if name then +self:T(self.lid..string.format("Got Target Object %s, category=%d",name,category)) +if category==Object.Category.UNIT then +target=UNIT:FindByName(name) +elseif category==Object.Category.STATIC then +target=STATIC:FindByName(name,false) +elseif category==Object.Category.SCENERY then +self:E(self.lid..string.format("ERROR: Scenery target not implemented yet!")) +else +self:E(self.lid..string.format("ERROR: Object category=%d is not implemented yet!",category)) +end +end +end +end +return target +end +function WEAPON:GetTargetDistance(ConversionFunction) +local target=self:GetTarget() +local distance=nil +if target then +local tv3=target:GetVec3() +local wv3=self:GetVec3() +if tv3 and wv3 then +distance=UTILS.VecDist3D(tv3,wv3) +if ConversionFunction then +distance=ConversionFunction(distance) +end +end +end +return distance +end +function WEAPON:GetTargetName() +local target=self:GetTarget() +local name="None" +if target then +name=target:GetName() +end +return name +end +function WEAPON:GetVelocityVec3() +local Vvec3=nil +if self.weapon then +Vvec3=self.weapon:getVelocity() +end +return Vvec3 +end +function WEAPON:GetSpeed(ConversionFunction) +local speed=nil +if self.weapon then +local v=self:GetVelocityVec3() +speed=UTILS.VecNorm(v) +if ConversionFunction then +speed=ConversionFunction(speed) +end +end +return speed +end +function WEAPON:GetVec3() +local vec3=nil +if self.weapon then +vec3=self.weapon:getPoint() +end +return vec3 +end +function WEAPON:GetVec2() +local vec3=self:GetVec3() +if vec3 then +local vec2={x=vec3.x,y=vec3.z} +return vec2 +end +return nil +end +function WEAPON:GetTypeName() +return self.typeName +end +function WEAPON:GetCoalition() +return self.coalition +end +function WEAPON:GetCountry() +return self.country +end +function WEAPON:GetDCSObject() +return self.weapon +end +function WEAPON:GetImpactVec3() +return self.impactVec3 +end +function WEAPON:GetImpactCoordinate() +return self.impactCoord +end +function WEAPON:GetReleaseHeading(AccountForMagneticInclination) +AccountForMagneticInclination=AccountForMagneticInclination or true +if AccountForMagneticInclination then return UTILS.ClampAngle(self.releaseHeading-UTILS.GetMagneticDeclination())else return UTILS.ClampAngle(self.releaseHeading)end +end +function WEAPON:GetReleaseAltitudeASL() +return self.releaseAltitudeASL +end +function WEAPON:GetReleaseAltitudeAGL() +return self.releaseAltitudeAGL +end +function WEAPON:GetReleaseCoordinate() +return self.releaseCoordinate +end +function WEAPON:GetReleasePitch() +return self.releasePitch +end +function WEAPON:GetImpactHeading(AccountForMagneticInclination) +AccountForMagneticInclination=AccountForMagneticInclination or true +if AccountForMagneticInclination then return UTILS.ClampAngle(self.impactHeading-UTILS.GetMagneticDeclination())else return self.impactHeading end +end +function WEAPON:InAir() +local inAir=nil +if self.weapon then +inAir=self.weapon:inAir() +end +return inAir +end +function WEAPON:IsExist() +local isExist=nil +if self.weapon then +isExist=self.weapon:isExist() +end +return isExist +end +function WEAPON:IsBomb() +return self.category==Weapon.Category.BOMB +end +function WEAPON:IsMissile() +return self.category==Weapon.Category.MISSILE +end +function WEAPON:IsRocket() +return self.category==Weapon.Category.ROCKET +end +function WEAPON:IsShell() +return self.category==Weapon.Category.SHELL +end +function WEAPON:IsTorpedo() +return self.category==Weapon.Category.TORPEDO +end +function WEAPON:IsFoxOne() +return self.guidance==Weapon.GuidanceType.RADAR_SEMI_ACTIVE +end +function WEAPON:IsFoxTwo() +return self.guidance==Weapon.GuidanceType.IR +end +function WEAPON:IsFoxThree() +return self.guidance==Weapon.GuidanceType.RADAR_ACTIVE +end +function WEAPON:Destroy(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,WEAPON.Destroy,self,0) +else +if self.weapon then +self:T(self.lid.."Destroying Weapon NOW!") +self:StopTrack() +self.weapon:destroy() +end +end +return self +end +function WEAPON:StartTrack(Delay) +Delay=math.max(Delay or 0.001,0.001) +self:T(self.lid..string.format("Start tracking weapon in %.4f sec",Delay)) +self.trackScheduleID=timer.scheduleFunction(WEAPON._TrackWeapon,self,timer.getTime()+Delay) +return self +end +function WEAPON:StopTrack(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,WEAPON.StopTrack,self,0) +else +if self.trackScheduleID then +timer.removeFunction(self.trackScheduleID) +end +end +return self +end +function WEAPON:_TrackWeapon(time) +if self.verbose>=20 then +self:I(self.lid..string.format("Tracking at T=%.5f",time)) +end +local status,pos3=pcall( +function() +local point=self.weapon:getPosition() +return point +end +) +if status then +self.pos3=pos3 +self.vec3=UTILS.DeepCopy(self.pos3.p) +self.coordinate:UpdateFromVec3(self.vec3) +self.last_velocity=self.weapon:getVelocity() +self.tracking=true +if self.trackFunc then +self.trackFunc(self,unpack(self.trackArg)) +end +if self.verbose>=5 then +local vec2={x=self.vec3.x,y=self.vec3.z} +local height=land.getHeight(vec2) +local agl=self.vec3.y-height +local ip=self:_GetIP(self.distIP) +local d=0 +if ip then +d=UTILS.VecDist3D(self.vec3,ip) +end +self:I(self.lid..string.format("T=%.3f: Height=%.3f m AGL=%.3f m, dIP=%.3f",time,height,agl,d)) +end +else +local ip=self:_GetIP(self.distIP) +if self.verbose>=10 and ip then +self:I(self.lid.."Got intercept point!") +local coord=COORDINATE:NewFromVec3(ip) +coord:MarkToAll("Intercept point") +coord:SmokeBlue() +local d=UTILS.VecDist3D(ip,self.vec3) +self:I(self.lid..string.format("FF d(ip, vec3)=%.3f meters",d)) +end +self.impactVec3=ip or self.vec3 +self.impactCoord=COORDINATE:NewFromVec3(self.vec3) +self.impactHeading=UTILS.VecHdg(self.last_velocity) +if self.impactMark then +self.impactCoord:MarkToAll(string.format("Impact point of weapon %s\ntype=%s\nlauncher=%s",self.name,self.typeName,self.launcherName)) +end +if self.impactSmoke then +self.impactCoord:Smoke(self.impactSmokeColor) +end +if self.impactFunc then +self.impactFunc(self,unpack(self.impactArg or{})) +end +self.tracking=false +end +if self.tracking then +if self.dtTrack and self.dtTrack>=0.00001 then +return time+self.dtTrack +else +return nil +end +end +return nil +end +function WEAPON:_GetIP(Distance) +Distance=Distance or 50 +local ip=nil +if Distance>0 and self.pos3 then +ip=land.getIP(self.pos3.p,self.pos3.x,Distance or 20) +end +return ip +end +do +NET={ +ClassName="NET", +Version="0.1.4", +BlockTime=600, +BlockedPilots={}, +BlockedUCIDs={}, +BlockedSides={}, +BlockedSlots={}, +KnownPilots={}, +BlockMessage=nil, +UnblockMessage=nil, +lid=nil, +} +function NET:New() +local self=BASE:Inherit(self,FSM:New()) +self.BlockTime=600 +self.BlockedPilots={} +self.KnownPilots={} +self:SetBlockMessage() +self:SetUnblockMessage() +self.BlockedSides={} +self.BlockedSides[1]=false +self.BlockedSides[2]=false +self:SetStartState("Stopped") +self:AddTransition("Stopped","Run","Running") +self:AddTransition("*","PlayerJoined","*") +self:AddTransition("*","PlayerLeft","*") +self:AddTransition("*","PlayerDied","*") +self:AddTransition("*","PlayerEjected","*") +self:AddTransition("*","PlayerBlocked","*") +self:AddTransition("*","PlayerUnblocked","*") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self.lid=string.format("NET %s | ",self.Version) +self:Run() +return self +end +function NET:IsAnyBlocked(UCID,Name,PlayerID,PlayerSide,PlayerSlot) +self:T({UCID,Name,PlayerID,PlayerSide,PlayerSlot}) +local blocked=false +local TNow=timer.getTime() +if UCID and self.BlockedUCIDs[UCID]and TNow<self.BlockedUCIDs[UCID]then +blocked=true +end +if PlayerID and not Name then +Name=self:GetPlayerIDByName(Name) +end +if Name and self.BlockedPilots[Name]and TNow<self.BlockedPilots[Name]then +blocked=true +end +self:T({time=self.BlockedSides[PlayerSide]}) +if PlayerSide and type(self.BlockedSides[PlayerSide])=="number"and TNow<self.BlockedSides[PlayerSide]then +blocked=true +end +if PlayerSlot and self.BlockedSlots[PlayerSlot]and TNow<self.BlockedSlots[PlayerSlot]then +blocked=true +end +self:T("IsAnyBlocked: "..tostring(blocked)) +return blocked +end +function NET:_EventHandler(EventData) +self:T(self.lid.." _EventHandler") +self:T2({Event=EventData.id}) +local data=EventData +if data.id and data.IniUnit and(data.IniPlayerName or data.IniUnit:GetPlayerName())then +local name=data.IniPlayerName and data.IniPlayerName or data.IniUnit:GetPlayerName() +local ucid=self:GetPlayerUCID(nil,name)or"none" +local PlayerID=self:GetPlayerIDByName(name)or"none" +local PlayerSide,PlayerSlot=self:GetSlot(data.IniUnit) +if not PlayerSide then PlayerSide=EventData.IniCoalition end +if not PlayerSlot then PlayerSlot=EventData.IniUnit:GetID()or-1 end +local TNow=timer.getTime() +if data.id==EVENTS.PlayerEnterUnit or data.id==EVENTS.PlayerEnterAircraft then +self:T(self.lid.."Pilot Joining: "..name.." | UCID: "..ucid.." | Event ID: "..data.id) +local blocked=self:IsAnyBlocked(ucid,name,PlayerID,PlayerSide,PlayerSlot) +if blocked and PlayerID then +self:T("Player blocked") +local outcome=net.force_player_slot(tonumber(PlayerID),PlayerSide,data.IniUnit:GetID()) +self:T({Blocked_worked=outcome}) +if outcome==false then +local unit=data.IniUnit +local sched=TIMER:New(unit.Destroy,unit,3):Start(3) +self:__PlayerBlocked(5,unit,name,1) +end +else +local client=CLIENT:FindByPlayerName(name)or data.IniUnit +if not self.KnownPilots[name]or(self.KnownPilots[name]and TNow-self.KnownPilots[name].timestamp>3)then +self:__PlayerJoined(1,client,name) +self.KnownPilots[name]={ +name=name, +ucid=ucid, +id=PlayerID, +side=PlayerSide, +slot=PlayerSlot, +timestamp=TNow, +} +end +return self +end +end +if data.id==EVENTS.PlayerLeaveUnit and self.KnownPilots[name]then +self:T(self.lid.."Pilot Leaving: "..name.." | UCID: "..ucid) +self:__PlayerLeft(1,data.IniUnit,name) +self.KnownPilots[name]=false +return self +end +if data.id==EVENTS.Ejection and self.KnownPilots[name]then +self:T(self.lid.."Pilot Ejecting: "..name.." | UCID: "..ucid) +self:__PlayerEjected(1,data.IniUnit,name) +self.KnownPilots[name]=false +return self +end +if(data.id==EVENTS.PilotDead or data.id==EVENTS.SelfKillPilot or data.id==EVENTS.Crash)and self.KnownPilots[name]then +self:T(self.lid.."Pilot Dead: "..name.." | UCID: "..ucid) +self:__PlayerDied(1,data.IniUnit,name) +self.KnownPilots[name]=false +return self +end +end +return self +end +function NET:BlockPlayer(Client,PlayerName,Seconds,Message) +self:T({PlayerName,Seconds,Message}) +local name=PlayerName +if Client and(not PlayerName)then +name=Client:GetPlayerName() +elseif PlayerName then +name=PlayerName +else +self:F(self.lid.."Block: No Client or PlayerName given or nothing found!") +return self +end +local ucid=self:GetPlayerUCID(Client,name) +local addon=Seconds or self.BlockTime +self.BlockedPilots[name]=timer.getTime()+addon +self.BlockedUCIDs[ucid]=timer.getTime()+addon +local message=Message or self.BlockMessage +if name then +self:SendChatToPlayer(message,name) +else +self:SendChat(name..": "..message) +end +self:__PlayerBlocked(1,Client,name,Seconds) +local PlayerID=self:GetPlayerIDByName(name) +if PlayerID and tonumber(PlayerID)~=1 then +local outcome=net.force_player_slot(tonumber(PlayerID),0,'') +end +return self +end +function NET:BlockPlayerSet(PlayerSet,Seconds,Message) +self:T({PlayerSet.Set,Seconds,Message}) +local addon=Seconds or self.BlockTime +local message=Message or self.BlockMessage +for _,_client in pairs(PlayerSet.Set)do +local name=_client:GetPlayerName() +self:BlockPlayer(_client,name,addon,message) +end +return self +end +function NET:UnblockPlayerSet(PlayerSet,Message) +self:T({PlayerSet.Set,Seconds,Message}) +local message=Message or self.UnblockMessage +for _,_client in pairs(PlayerSet.Set)do +local name=_client:GetPlayerName() +self:UnblockPlayer(_client,name,message) +end +return self +end +function NET:BlockUCID(ucid,Seconds) +self:T({ucid,Seconds}) +local addon=Seconds or self.BlockTime +self.BlockedUCIDs[ucid]=timer.getTime()+addon +return self +end +function NET:UnblockUCID(ucid) +self:T({ucid}) +self.BlockedUCIDs[ucid]=nil +return self +end +function NET:BlockSide(Side,Seconds) +local addon=Seconds or self.BlockTime +if Side==1 or Side==2 then +self.BlockedSides[Side]=timer.getTime()+addon +end +return self +end +function NET:UnblockSide(Side,Seconds) +local addon=Seconds or self.BlockTime +if Side==1 or Side==2 then +self.BlockedSides[Side]=false +end +return self +end +function NET:BlockSlot(Slot,Seconds) +self:T({Slot,Seconds}) +local addon=Seconds or self.BlockTime +self.BlockedSlots[Slot]=timer.getTime()+addon +return self +end +function NET:UnblockSlot(Slot) +self:T({Slot}) +self.BlockedSlots[Slot]=nil +return self +end +function NET:UnblockPlayer(Client,PlayerName,Message) +local name=PlayerName +if Client then +name=Client:GetPlayerName() +elseif PlayerName then +name=PlayerName +else +self:F(self.lid.."Unblock: No PlayerName given or not found!") +return self +end +local ucid=self:GetPlayerUCID(Client,name) +self.BlockedPilots[name]=nil +self.BlockedUCIDs[ucid]=nil +local message=Message or self.UnblockMessage +if name then +self:SendChatToPlayer(message,name) +else +self:SendChat(name..": "..message) +end +self:__PlayerUnblocked(1,Client,name) +return self +end +function NET:SetBlockMessage(Text) +self.BlockMessage=Text or"You are blocked from joining. Wait time is: "..self.BlockTime.." seconds!" +return self +end +function NET:SetBlockTime(Seconds) +self.BlockTime=Seconds or 600 +return self +end +function NET:SetUnblockMessage(Text) +self.UnblockMessage=Text or"You are unblocked now and can join again." +return self +end +function NET:SendChat(Message,ToAll) +if Message then +net.send_chat(Message,ToAll) +end +return self +end +function NET:GetPlayerIDByName(Name) +if not Name then return nil end +local playerList=net.get_player_list() +for i=1,#playerList do +local playerName=net.get_name(i) +if playerName==Name then +return playerList[i] +end +end +return nil +end +function NET:GetPlayerIDFromClient(Client) +self:T("GetPlayerIDFromClient") +self:T({Client=Client}) +if Client then +local name=Client:GetPlayerName() +self:T({name=name}) +local id=self:GetPlayerIDByName(name) +return id +else +return nil +end +end +function NET:SendChatToClient(Message,ToClient,FromClient) +local PlayerId=self:GetPlayerIDFromClient(ToClient) +local FromId=self:GetPlayerIDFromClient(FromClient) +if Message and PlayerId and FromId then +net.send_chat_to(Message,tonumber(PlayerId),tonumber(FromId)) +elseif Message and PlayerId then +net.send_chat_to(Message,tonumber(PlayerId)) +end +return self +end +function NET:SendChatToPlayer(Message,ToPlayer,FromPlayer) +local PlayerId=self:GetPlayerIDByName(ToPlayer) +local FromId=self:GetPlayerIDByName(FromPlayer) +if Message and PlayerId and FromId then +net.send_chat_to(Message,tonumber(PlayerId),tonumber(FromId)) +elseif Message and PlayerId then +net.send_chat_to(Message,tonumber(PlayerId)) +end +return self +end +function NET:GetPlayerList() +local plist=nil +plist=net.get_player_list() +return plist +end +function NET:GetMyPlayerID() +return net.get_my_player_id() +end +function NET:GetServerID() +return net.get_server_id() +end +function NET:GetPlayerInfo(Client,Attribute) +local PlayerID=self:GetPlayerIDFromClient(Client) +if PlayerID then +return net.get_player_info(tonumber(PlayerID),Attribute) +else +return nil +end +end +function NET:GetPlayerUCID(Client,Name) +local PlayerID=nil +if Client then +PlayerID=self:GetPlayerIDFromClient(Client) +elseif Name then +PlayerID=self:GetPlayerIDByName(Name) +else +self:E(self.lid.."Neither client nor name provided!") +end +local ucid=net.get_player_info(tonumber(PlayerID),'ucid') +return ucid +end +function NET:Kick(Client,Message) +local PlayerID=self:GetPlayerIDFromClient(Client) +if PlayerID and tonumber(PlayerID)~=1 then +return net.kick(tonumber(PlayerID),Message) +else +return false +end +end +function NET:GetPlayerStatistic(Client,StatisticID) +local PlayerID=self:GetPlayerIDFromClient(Client) +local stats=StatisticID or 0 +if stats>7 or stats<0 then stats=0 end +if PlayerID then +return net.get_stat(tonumber(PlayerID),stats) +else +return nil +end +end +function NET:GetName(Client) +local PlayerID=self:GetPlayerIDFromClient(Client) +if PlayerID then +return net.get_name(tonumber(PlayerID)) +else +return nil +end +end +function NET:GetSlot(Client) +self:T("NET.GetSlot") +local PlayerID=self:GetPlayerIDFromClient(Client) +self:T("NET.GetSlot PlayerID = "..tostring(PlayerID)) +if PlayerID then +local side,slot=net.get_slot(tonumber(PlayerID)) +self:T("NET.GetSlot side, slot = "..tostring(side)..","..tostring(slot)) +return side,slot +else +return nil,nil +end +end +function NET:ForceSlot(Client,SideID,SlotID) +local PlayerID=self:GetPlayerIDFromClient(Client) +local SlotID=SlotID or Client:GetID() +if PlayerID then +return net.force_player_slot(tonumber(PlayerID),SideID,SlotID) +else +return false +end +end +function NET:ReturnToSpectators(Client) +local outcome=self:ForceSlot(Client,0) +local sched=TIMER:New(Client.Destroy,Client,1):Start(1) +return outcome +end +function NET.Lua2Json(Lua) +return net.lua2json(Lua) +end +function NET.Json2Lua(Json) +return net.json2lua(Json) +end +function NET:DoStringIn(State,DoString) +return net.dostring_in(State,DoString) +end +function NET:Log(Message) +net.log(Message) +return self +end +function NET:GetKnownPilotData(Client,Name) +local name=Name +if Client and not Name then +name=Client:GetPlayerName() +end +if name then +return self.KnownPilots[name] +else +return nil +end +end +function NET:onafterStatus(From,Event,To) +self:T({From,Event,To}) +local function HouseHold(tavolo) +local TNow=timer.getTime() +for _,entry in pairs(tavolo)do +if type(entry)=="number"and entry>=TNow then entry=false end +end +end +HouseHold(self.BlockedPilots) +HouseHold(self.BlockedSides) +HouseHold(self.BlockedSlots) +HouseHold(self.BlockedUCIDs) +if self:Is("Running")then +self:__Status(-60) +end +return self +end +function NET:onafterRun(From,Event,To) +self:T({From,Event,To}) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.Crash,self._EventHandler) +self:HandleEvent(EVENTS.SelfKillPilot,self._EventHandler) +self:__Status(-10) +end +function NET:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:UnHandleEvent(EVENTS.PlayerEnterUnit) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.SelfKillPilot) +return self +end +end +STORAGE={ +ClassName="STORAGE", +verbose=0, +} +STORAGE.Liquid={ +JETFUEL=0, +GASOLINE=1, +MW50=2, +DIESEL=3, +} +STORAGE.LiquidName={ +GASOLINE="gasoline", +DIESEL="diesel", +MW50="methanol_mixture", +JETFUEL="jet_fuel", +} +STORAGE.Type={ +WEAPONS="weapons", +LIQUIDS="liquids", +AIRCRAFT="aircrafts", +} +STORAGE.version="0.1.5" +function STORAGE:New(AirbaseName) +local self=BASE:Inherit(self,BASE:New()) +self.airbase=Airbase.getByName(AirbaseName) +if Airbase.getWarehouse and self.airbase then +self.warehouse=self.airbase:getWarehouse() +end +self.lid=string.format("STORAGE %s | ",AirbaseName) +return self +end +function STORAGE:NewFromStaticCargo(StaticCargoName) +local self=BASE:Inherit(self,BASE:New()) +self.airbase=StaticObject.getByName(StaticCargoName) +if Airbase.getWarehouse then +self.warehouse=Warehouse.getCargoAsWarehouse(self.airbase) +end +self.lid=string.format("STORAGE %s | ",StaticCargoName) +return self +end +function STORAGE:NewFromDynamicCargo(DynamicCargoName) +local self=BASE:Inherit(self,BASE:New()) +self.airbase=Unit.getByName(DynamicCargoName)or StaticObject.getByName(DynamicCargoName) +if Airbase.getWarehouse then +self.warehouse=Warehouse.getCargoAsWarehouse(self.airbase) +end +self.lid=string.format("STORAGE %s | ",DynamicCargoName) +return self +end +function STORAGE:FindByName(AirbaseName) +local storage=_DATABASE:FindStorage(AirbaseName) +return storage +end +function STORAGE:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +if self.verbose>1 then +BASE:TraceOn() +BASE:TraceClass("STORAGE") +end +return self +end +function STORAGE:AddItem(Name,Amount) +self:T(self.lid..string.format("Adding %d items of %s",Amount,UTILS.OneLineSerialize(Name))) +self.warehouse:addItem(Name,Amount) +return self +end +function STORAGE:SetItem(Name,Amount) +self:T(self.lid..string.format("Setting item %s to N=%d",UTILS.OneLineSerialize(Name),Amount)) +self.warehouse:setItem(Name,Amount) +return self +end +function STORAGE:GetItemAmount(Name) +local N=self.warehouse:getItemCount(Name) +return N +end +function STORAGE:RemoveItem(Name,Amount) +self:T(self.lid..string.format("Removing N=%d of item %s",Amount,Name)) +self.warehouse:removeItem(Name,Amount) +return self +end +function STORAGE:AddLiquid(Type,Amount) +self:T(self.lid..string.format("Adding %d liquids of %s",Amount,self:GetLiquidName(Type))) +self.warehouse:addLiquid(Type,Amount) +return self +end +function STORAGE:SetLiquid(Type,Amount) +self:T(self.lid..string.format("Setting liquid %s to N=%d",self:GetLiquidName(Type),Amount)) +self.warehouse:setLiquidAmount(Type,Amount) +return self +end +function STORAGE:RemoveLiquid(Type,Amount) +self:T(self.lid..string.format("Removing N=%d of liquid %s",Amount,self:GetLiquidName(Type))) +self.warehouse:removeLiquid(Type,Amount) +return self +end +function STORAGE:GetLiquidAmount(Type) +local N=self.warehouse:getLiquidAmount(Type) +return N +end +function STORAGE:GetLiquidName(Type) +local name="Unknown" +if Type==STORAGE.Liquid.JETFUEL then +name="Jet fuel" +elseif Type==STORAGE.Liquid.GASOLINE then +name="Aircraft gasoline" +elseif Type==STORAGE.Liquid.MW50 then +name="MW 50" +elseif Type==STORAGE.Liquid.DIESEL then +name="Diesel" +else +self:E(self.lid..string.format("ERROR: Unknown liquid type %s",tostring(Type))) +end +return name +end +function STORAGE:AddAmount(Type,Amount) +if type(Type)=="number"then +self:AddLiquid(Type,Amount) +else +self:AddItem(Type,Amount) +end +return self +end +function STORAGE:RemoveAmount(Type,Amount) +if type(Type)=="number"then +self:RemoveLiquid(Type,Amount) +else +self:RemoveItem(Type,Amount) +end +return self +end +function STORAGE:SetAmount(Type,Amount) +if type(Type)=="number"then +self:SetLiquid(Type,Amount) +else +self:SetItem(Type,Amount) +end +return self +end +function STORAGE:GetAmount(Type) +local N=0 +if type(Type)=="number"then +N=self:GetLiquidAmount(Type) +else +N=self:GetItemAmount(Type) +end +return N +end +function STORAGE:IsUnlimited(Type) +local N=self:GetAmount(Type) +local unlimited=false +if N>0 then +self:RemoveAmount(Type,1) +local n=self:GetAmount(Type) +unlimited=unlimited or n>2^29 or n==N +if not unlimited then +self:AddAmount(Type,1) +end +self:T(self.lid..string.format("Type=%s: unlimited=%s (N=%d n=%d)",tostring(Type),tostring(unlimited),N,n)) +end +return unlimited +end +function STORAGE:IsLimited(Type) +local limited=not self:IsUnlimited(Type) +return limited +end +function STORAGE:IsUnlimitedAircraft() +local unlimited=self:IsUnlimited("A-10C") +return unlimited +end +function STORAGE:IsUnlimitedLiquids() +local unlimited=self:IsUnlimited(STORAGE.Liquid.DIESEL) +return unlimited +end +function STORAGE:IsUnlimitedWeapons() +local unlimited=self:IsUnlimited(ENUMS.Storage.weapons.bombs.Mk_82) +return unlimited +end +function STORAGE:IsLimitedAircraft() +local limited=self:IsLimited("A-10C") +return limited +end +function STORAGE:IsLimitedLiquids() +local limited=self:IsLimited(STORAGE.Liquid.DIESEL) +return limited +end +function STORAGE:IsLimitedWeapons() +local limited=self:IsLimited(ENUMS.Storage.weapons.bombs.Mk_82) +return limited +end +function STORAGE:GetInventory(Item) +local inventory=self.warehouse:getInventory(Item) +return inventory.aircraft,inventory.liquids,inventory.weapon +end +function STORAGE:SaveToFile(Path,Filename) +if not io then +BASE:E("ERROR: io not desanitized. Can't save the files.") +return false +end +if Path==nil and not lfs then +BASE:E("WARNING: lfs not desanitized. File will be saved in DCS installation root directory rather than your given path.") +end +local ac,lq,wp=self:GetInventory() +local DataAircraft="" +local DataLiquids="" +local DataWeapons="" +if#lq>0 then +DataLiquids=DataLiquids.."Liquids in Storage:\n" +for key,amount in pairs(lq)do +DataLiquids=DataLiquids..tostring(key).."="..tostring(amount).."\n" +end +UTILS.SaveToFile(Path,Filename.."_Liquids.csv",DataLiquids) +if self.verbose and self.verbose>0 then +self:I(self.lid.."Saving Liquids to "..tostring(Path).."\\"..tostring(Filename).."_Liquids.csv") +end +end +if UTILS.TableLength(ac)>0 then +DataAircraft=DataAircraft.."Aircraft in Storage:\n" +for key,amount in pairs(ac)do +DataAircraft=DataAircraft..tostring(key).."="..tostring(amount).."\n" +end +UTILS.SaveToFile(Path,Filename.."_Aircraft.csv",DataAircraft) +if self.verbose and self.verbose>0 then +self:I(self.lid.."Saving Aircraft to "..tostring(Path).."\\"..tostring(Filename).."_Aircraft.csv") +end +end +if UTILS.TableLength(wp)>0 then +DataWeapons=DataWeapons.."Weapons and Materiel in Storage:\n" +for _,_category in pairs(ENUMS.Storage.weapons)do +for _,_key in pairs(_category)do +local amount=self:GetAmount(_key) +if type(_key)=="table"then +_key="{"..table.concat(_key,",").."}" +end +DataWeapons=DataWeapons..tostring(_key).."="..tostring(amount).."\n" +end +end +for key,amount in pairs(ENUMS.Storage.weapons.Gazelle)do +amount=self:GetItemAmount(ENUMS.Storage.weapons.Gazelle[key]) +DataWeapons=DataWeapons.."ENUMS.Storage.weapons.Gazelle."..tostring(key).."="..tostring(amount).."\n" +end +for key,amount in pairs(ENUMS.Storage.weapons.CH47)do +amount=self:GetItemAmount(ENUMS.Storage.weapons.CH47[key]) +DataWeapons=DataWeapons.."ENUMS.Storage.weapons.CH47."..tostring(key).."="..tostring(amount).."\n" +end +for key,amount in pairs(ENUMS.Storage.weapons.UH1H)do +amount=self:GetItemAmount(ENUMS.Storage.weapons.UH1H[key]) +DataWeapons=DataWeapons.."ENUMS.Storage.weapons.UH1H."..tostring(key).."="..tostring(amount).."\n" +end +for key,amount in pairs(ENUMS.Storage.weapons.OH58)do +amount=self:GetItemAmount(ENUMS.Storage.weapons.OH58[key]) +DataWeapons=DataWeapons.."ENUMS.Storage.weapons.OH58."..tostring(key).."="..tostring(amount).."\n" +end +for key,amount in pairs(ENUMS.Storage.weapons.AH64D)do +amount=self:GetItemAmount(ENUMS.Storage.weapons.AH64D[key]) +DataWeapons=DataWeapons.."ENUMS.Storage.weapons.AH64D."..tostring(key).."="..tostring(amount).."\n" +end +UTILS.SaveToFile(Path,Filename.."_Weapons.csv",DataWeapons) +if self.verbose and self.verbose>0 then +self:I(self.lid.."Saving Weapons to "..tostring(Path).."\\"..tostring(Filename).."_Weapons.csv") +end +end +return self +end +function STORAGE:LoadFromFile(Path,Filename) +if not io then +BASE:E("ERROR: io not desanitized. Can't read the files.") +return false +end +if Path==nil and not lfs then +BASE:E("WARNING: lfs not desanitized. File will be read from DCS installation root directory rather than your give path.") +end +if self:IsLimitedLiquids()then +local Ok,Liquids=UTILS.LoadFromFile(Path,Filename.."_Liquids.csv") +if Ok then +if self.verbose and self.verbose>0 then +self:I(self.lid.."Loading Liquids from "..tostring(Path).."\\"..tostring(Filename).."_Liquids.csv") +end +for _id,_line in pairs(Liquids)do +if string.find(_line,"Storage")==nil then +local tbl=UTILS.Split(_line,"=") +local lqno=tonumber(tbl[1]) +local lqam=tonumber(tbl[2]) +self:SetLiquid(lqno,lqam) +end +end +else +self:E("File for Liquids could not be found: "..tostring(Path).."\\"..tostring(Filename).."_Liquids.csv") +end +end +if self:IsLimitedAircraft()then +local Ok,Aircraft=UTILS.LoadFromFile(Path,Filename.."_Aircraft.csv") +if Ok then +if self.verbose and self.verbose>0 then +self:I(self.lid.."Loading Aircraft from "..tostring(Path).."\\"..tostring(Filename).."_Aircraft.csv") +end +for _id,_line in pairs(Aircraft)do +if string.find(_line,"Storage")==nil then +local tbl=UTILS.Split(_line,"=") +local acname=tbl[1] +local acnumber=tonumber(tbl[2]) +self:SetAmount(acname,acnumber) +end +end +else +self:E("File for Aircraft could not be found: "..tostring(Path).."\\"..tostring(Filename).."_Aircraft.csv") +end +end +if self:IsLimitedWeapons()then +local Ok,Weapons=UTILS.LoadFromFile(Path,Filename.."_Weapons.csv") +if Ok then +if self.verbose and self.verbose>0 then +self:I(self.lid.."Loading Weapons from "..tostring(Path).."\\"..tostring(Filename).."_Weapons.csv") +end +for _id,_line in pairs(Weapons)do +if string.find(_line,"Storage")==nil then +local tbl=UTILS.Split(_line,"=") +local wpname=tbl[1] +local wpnumber=tonumber(tbl[2]) +if string.find(wpname,"{")==1 then +wpname=string.gsub(wpname,"{","") +wpname=string.gsub(wpname,"}","") +local tbl=UTILS.Split(wpname,",") +local wptbl={} +for _id,_key in ipairs(tbl)do +table.insert(wptbl,_id,_key) +end +self:SetAmount(wptbl,wpnumber) +else +self:SetAmount(wpname,wpnumber) +end +end +end +else +self:E("File for Weapons could not be found: "..tostring(Path).."\\"..tostring(Filename).."_Weapons.csv") +end +end +return self +end +function STORAGE:StartAutoSave(Path,Filename,Interval,LoadOnce) +if LoadOnce~=false then +self:LoadFromFile(Path,Filename) +end +local interval=Interval or 300 +self.SaverTimer=TIMER:New(STORAGE.SaveToFile,self,Path,Filename) +self.SaverTimer:Start(interval,interval) +return self +end +function STORAGE:StopAutoSave() +if self.SaverTimer and self.SaverTimer:IsRunning()then +self.SaverTimer:Stop() +self.SaverTimer=nil +end +return self +end +function STORAGE:FindSyriaHHelipadWarehouse(ZoneName) +local findzone=ZONE:New(ZoneName) +local base=world.getAirbases() +for i=1,#base do +local info={} +info.callsign=Airbase.getCallsign(base[i]) +info.id=Airbase.getID(base[i]) +info.point=Airbase.getPoint(base[i]) +info.coordinate=COORDINATE:NewFromVec3(info.point) +info.DCSObject=base[i] +if info.callsign=="H"and findzone:IsCoordinateInZone(info.coordinate)then +info.warehouse=info.DCSObject:getWarehouse() +info.Storage=STORAGE:New(info.callsign..info.id) +info.Storage.airbase=info.DCSObject +info.Storage.warehouse=info.warehouse +return info.Storage +end +end +end +DYNAMICCARGO={ +ClassName="DYNAMICCARGO", +verbose=0, +testing=false, +Interval=10, +} +DYNAMICCARGO.Liquid={ +JETFUEL=0, +GASOLINE=1, +MW50=2, +DIESEL=3, +} +DYNAMICCARGO.LiquidName={ +GASOLINE="gasoline", +DIESEL="diesel", +MW50="methanol_mixture", +JETFUEL="jet_fuel", +} +DYNAMICCARGO.Type={ +WEAPONS="weapons", +LIQUIDS="liquids", +AIRCRAFT="aircrafts", +} +DYNAMICCARGO.State={ +NEW="NEW", +LOADED="LOADED", +UNLOADED="UNLOADED", +REMOVED="REMOVED", +} +DYNAMICCARGO.AircraftTypes={ +["CH-47Fbl1"]="CH-47Fbl1", +["Mi-8MTV2"]="CH-47Fbl1", +["Mi-8MT"]="CH-47Fbl1", +} +DYNAMICCARGO.AircraftDimensions={ +["CH-47Fbl1"]={ +["width"]=4, +["height"]=6, +["length"]=11, +["ropelength"]=30, +}, +["Mi-8MTV2"]={ +["width"]=6, +["height"]=6, +["length"]=15, +["ropelength"]=30, +}, +["Mi-8MT"]={ +["width"]=6, +["height"]=6, +["length"]=15, +["ropelength"]=30, +}, +} +DYNAMICCARGO.version="0.0.9" +function DYNAMICCARGO:Register(CargoName) +local self=BASE:Inherit(self,POSITIONABLE:New(CargoName)) +self.StaticName=CargoName +self.LastPosition=self:GetCoordinate() +self.CargoState=DYNAMICCARGO.State.NEW +self.Interval=DYNAMICCARGO.Interval or 10 +local DCSObject=self:GetDCSObject() +if DCSObject then +local warehouse=STORAGE:NewFromDynamicCargo(CargoName) +self.warehouse=warehouse +end +self.lid=string.format("DYNAMICCARGO %s",CargoName) +self.Owner=string.match(CargoName,"^(.+)|%d%d:%d%d|PKG%d+")or"None" +self.timer=TIMER:New(DYNAMICCARGO._UpdatePosition,self) +self.timer:Start(self.Interval,self.Interval) +if not _DYNAMICCARGO_HELOS then +_DYNAMICCARGO_HELOS=SET_CLIENT:New():FilterAlive():FilterFunction(DYNAMICCARGO._FilterHeloTypes):FilterStart() +end +if self.testing then +BASE:TraceOn() +BASE:TraceClass("DYNAMICCARGO") +end +return self +end +function DYNAMICCARGO:GetDCSObject() +local DCSStatic=StaticObject.getByName(self.StaticName)or Unit.getByName(self.StaticName) +if DCSStatic then +return DCSStatic +end +return nil +end +function DYNAMICCARGO:GetLastOwner() +return self.Owner +end +function DYNAMICCARGO:IsNew() +if self.CargoState and self.CargoState==DYNAMICCARGO.State.NEW then +return true +else +return false +end +end +function DYNAMICCARGO:IsLoaded() +if self.CargoState and self.CargoState==DYNAMICCARGO.State.LOADED then +return true +else +return false +end +end +function DYNAMICCARGO:IsUnloaded() +if self.CargoState and self.CargoState==DYNAMICCARGO.State.UNLOADED then +return true +else +return false +end +end +function DYNAMICCARGO:IsRemoved() +if self.CargoState and self.CargoState==DYNAMICCARGO.State.REMOVED then +return true +else +return false +end +end +function DYNAMICCARGO:GetCratesNeeded() +return 1 +end +function DYNAMICCARGO:WasDropped() +return self.CargoState==DYNAMICCARGO.State.UNLOADED and true or false +end +function DYNAMICCARGO:GetType() +return CTLD_CARGO.Enum.GCLOADABLE +end +function DYNAMICCARGO:GetLastPosition() +return self.LastPosition +end +function DYNAMICCARGO:GetState() +return self.CargoState +end +function DYNAMICCARGO:FindByName(Name) +local storage=_DATABASE:FindDynamicCargo(Name) +return storage +end +function DYNAMICCARGO:FindByMatching(Pattern) +local GroupFound=nil +for name,static in pairs(_DATABASE.DYNAMICCARGO)do +if string.match(name,Pattern)then +GroupFound=static +break +end +end +return GroupFound +end +function DYNAMICCARGO:FindAllByMatching(Pattern) +local GroupsFound={} +for name,static in pairs(_DATABASE.DYNAMICCARGO)do +if string.match(name,Pattern)then +GroupsFound[#GroupsFound+1]=static +end +end +return GroupsFound +end +function DYNAMICCARGO:GetStorageObject() +return self.warehouse +end +function DYNAMICCARGO:GetCargoWeight() +local DCSObject=self:GetDCSObject() +if DCSObject then +local weight=DCSObject:getCargoWeight() +return weight +else +return 0 +end +end +function DYNAMICCARGO:GetCargoDisplayName() +local DCSObject=self:GetDCSObject() +if DCSObject then +local weight=DCSObject:getCargoDisplayName() +return weight +else +return self.StaticName +end +end +function DYNAMICCARGO:_HeloHovering(Unit,ropelength) +local DCSUnit=Unit:GetDCSObject() +local hovering=false +local Height=0 +if DCSUnit then +local UnitInAir=DCSUnit:inAir() +local UnitCategory=DCSUnit:getDesc().category +if UnitInAir==true and UnitCategory==1 then +local VelocityVec3=DCSUnit:getVelocity() +local Velocity=UTILS.VecNorm(VelocityVec3) +local Coordinate=DCSUnit:getPoint() +local LandHeight=land.getHeight({x=Coordinate.x,y=Coordinate.z}) +Height=Coordinate.y-LandHeight +if Velocity<1 and Height<=ropelength and Height>6 then +hovering=true +end +end +return hovering,Height +end +return false +end +function DYNAMICCARGO:_GetPossibleHeloNearby(pos,loading) +local set=_DYNAMICCARGO_HELOS:GetAliveSet() +local success=false +local Helo=nil +local Playername=nil +for _,_helo in pairs(set or{})do +local helo=_helo +local name=helo:GetPlayerName()or _DATABASE:_FindPlayerNameByUnitName(helo:GetName())or"None" +self:T(self.lid.." Checking: "..name) +local hpos=helo:GetCoordinate() +local typename=helo:GetTypeName() +local dimensions=DYNAMICCARGO.AircraftDimensions[typename] +local hovering,height=self:_HeloHovering(helo,dimensions.ropelength) +local helolanded=not helo:InAir() +self:T(self.lid.." InAir: AGL/Hovering: "..hpos.y-hpos:GetLandHeight().."/"..tostring(hovering)) +if hpos and typename and dimensions then +local delta2D=hpos:Get2DDistance(pos) +local delta3D=hpos:Get3DDistance(pos) +if self.testing then +self:T(string.format("Cargo relative position: 2D %dm | 3D %dm",delta2D,delta3D)) +self:T(string.format("Helo dimension: length %dm | width %dm | rope %dm",dimensions.length,dimensions.width,dimensions.ropelength)) +self:T(string.format("Helo hovering: %s at %dm",tostring(hovering),height)) +end +if loading~=true and(delta2D>dimensions.length or delta2D>dimensions.width)and helolanded then +success=true +Helo=helo +Playername=name +end +if loading~=true and delta3D>dimensions.ropelength then +success=true +Helo=helo +Playername=name +end +if loading==true and((delta2D<dimensions.length and delta2D<dimensions.width and helolanded)or(delta3D==dimensions.ropelength and helo:InAir()))then +success=true +Helo=helo +Playername=name +end +end +end +return success,Helo,Playername +end +function DYNAMICCARGO:_UpdatePosition() +self:T(self.lid.." _UpdatePositionAndState") +if self:IsAlive()then +local pos=self:GetCoordinate() +if self.testing then +self:T(string.format("Cargo position: x=%d, y=%d, z=%d",pos.x,pos.y,pos.z)) +self:T(string.format("Last position: x=%d, y=%d, z=%d",self.LastPosition.x,self.LastPosition.y,self.LastPosition.z)) +end +if UTILS.Round(UTILS.VecDist3D(pos,self.LastPosition),2)>0.5 then +if self.CargoState==DYNAMICCARGO.State.NEW or self.CargoState==DYNAMICCARGO.State.UNLOADED then +local isloaded,client,playername=self:_GetPossibleHeloNearby(pos,true) +self:T(self.lid.." moved! NEW -> LOADED by "..tostring(playername)) +self.CargoState=DYNAMICCARGO.State.LOADED +self.Owner=playername +_DATABASE:CreateEventDynamicCargoLoaded(self) +end +elseif self.CargoState==DYNAMICCARGO.State.LOADED then +local count=_DYNAMICCARGO_HELOS:CountAlive() +local landheight=pos:GetLandHeight() +local agl=pos.y-landheight +agl=UTILS.Round(agl,2) +self:T(self.lid.." AGL: "..agl or-1) +local isunloaded=true +local client +local playername=self.Owner +if count>0 then +self:T(self.lid.." Possible alive helos: "..count or-1) +isunloaded,client,playername=self:_GetPossibleHeloNearby(pos,false) +if isunloaded then +self:T(self.lid.." moved! LOADED -> UNLOADED by "..tostring(playername)) +self.CargoState=DYNAMICCARGO.State.UNLOADED +self.Owner=playername +_DATABASE:CreateEventDynamicCargoUnloaded(self) +end +end +end +self.LastPosition=pos +else +if self.timer and self.timer:IsRunning()then self.timer:Stop()end +self:T(self.lid.." dead! "..self.CargoState.."-> REMOVED") +self.CargoState=DYNAMICCARGO.State.REMOVED +_DATABASE:CreateEventDynamicCargoRemoved(self) +end +return self +end +function DYNAMICCARGO._FilterHeloTypes(client) +if not client then return false end +local typename=client:GetTypeName() +local isinclude=DYNAMICCARGO.AircraftTypes[typename]~=nil and true or false +return isinclude +end +CARGOS={} +do +CARGO={ +ClassName="CARGO", +Type=nil, +Name=nil, +Weight=nil, +CargoObject=nil, +CargoCarrier=nil, +Representable=false, +Slingloadable=false, +Moveable=false, +Containable=false, +Reported={}, +} +function CARGO:New(Type,Name,Weight,LoadRadius,NearRadius) +local self=BASE:Inherit(self,FSM:New()) +self:T({Type,Name,Weight,LoadRadius,NearRadius}) +self:SetStartState("UnLoaded") +self:AddTransition({"UnLoaded","Boarding"},"Board","Boarding") +self:AddTransition("Boarding","Boarding","Boarding") +self:AddTransition("Boarding","CancelBoarding","UnLoaded") +self:AddTransition("Boarding","Load","Loaded") +self:AddTransition("UnLoaded","Load","Loaded") +self:AddTransition("Loaded","UnBoard","UnBoarding") +self:AddTransition("UnBoarding","UnBoarding","UnBoarding") +self:AddTransition("UnBoarding","UnLoad","UnLoaded") +self:AddTransition("Loaded","UnLoad","UnLoaded") +self:AddTransition("*","Damaged","Damaged") +self:AddTransition("*","Destroyed","Destroyed") +self:AddTransition("*","Respawn","UnLoaded") +self:AddTransition("*","Reset","UnLoaded") +self.Type=Type +self.Name=Name +self.Weight=Weight or 0 +self.CargoObject=nil +self.CargoCarrier=nil +self.Representable=false +self.Slingloadable=false +self.Moveable=false +self.Containable=false +self.CargoLimit=0 +self.LoadRadius=LoadRadius or 500 +self:SetDeployed(false) +self.CargoScheduler=SCHEDULER:New() +CARGOS[self.Name]=self +return self +end +function CARGO:FindByName(CargoName) +local CargoFound=_DATABASE:FindCargo(CargoName) +return CargoFound +end +function CARGO:GetX() +if self:IsLoaded()then +return self.CargoCarrier:GetCoordinate().x +else +return self.CargoObject:GetCoordinate().x +end +end +function CARGO:GetY() +if self:IsLoaded()then +return self.CargoCarrier:GetCoordinate().z +else +return self.CargoObject:GetCoordinate().z +end +end +function CARGO:GetHeading() +if self:IsLoaded()then +return self.CargoCarrier:GetHeading() +else +return self.CargoObject:GetHeading() +end +end +function CARGO:CanSlingload() +return false +end +function CARGO:CanBoard() +return true +end +function CARGO:CanUnboard() +return true +end +function CARGO:CanLoad() +return true +end +function CARGO:CanUnload() +return true +end +function CARGO:Destroy() +if self.CargoObject then +self.CargoObject:Destroy() +end +self:Destroyed() +end +function CARGO:GetName() +return self.Name +end +function CARGO:GetObject() +if self:IsLoaded()then +return self.CargoCarrier +else +return self.CargoObject +end +end +function CARGO:GetObjectName() +if self:IsLoaded()then +return self.CargoCarrier:GetName() +else +return self.CargoObject:GetName() +end +end +function CARGO:GetCount() +return 1 +end +function CARGO:GetType() +return self.Type +end +function CARGO:GetTransportationMethod() +return self.TransportationMethod +end +function CARGO:GetCoalition() +if self:IsLoaded()then +return self.CargoCarrier:GetCoalition() +else +return self.CargoObject:GetCoalition() +end +end +function CARGO:GetCoordinate() +return self.CargoObject:GetCoordinate() +end +function CARGO:IsDestroyed() +return self:Is("Destroyed") +end +function CARGO:IsLoaded() +return self:Is("Loaded") +end +function CARGO:IsLoadedInCarrier(Carrier) +return self.CargoCarrier and self.CargoCarrier:GetName()==Carrier:GetName() +end +function CARGO:IsUnLoaded() +return self:Is("UnLoaded") +end +function CARGO:IsBoarding() +return self:Is("Boarding") +end +function CARGO:IsUnboarding() +return self:Is("UnBoarding") +end +function CARGO:IsAlive() +if self:IsLoaded()then +return self.CargoCarrier:IsAlive() +else +return self.CargoObject:IsAlive() +end +end +function CARGO:SetDeployed(Deployed) +self.Deployed=Deployed +end +function CARGO:IsDeployed() +return self.Deployed +end +function CARGO:Spawn(PointVec2) +self:T() +end +function CARGO:Flare(FlareColor) +if self:IsUnLoaded()then +trigger.action.signalFlare(self.CargoObject:GetVec3(),FlareColor,0) +end +end +function CARGO:FlareWhite() +self:Flare(trigger.flareColor.White) +end +function CARGO:FlareYellow() +self:Flare(trigger.flareColor.Yellow) +end +function CARGO:FlareGreen() +self:Flare(trigger.flareColor.Green) +end +function CARGO:FlareRed() +self:Flare(trigger.flareColor.Red) +end +function CARGO:Smoke(SmokeColor,Radius) +if self:IsUnLoaded()then +if Radius then +trigger.action.smoke(self.CargoObject:GetRandomVec3(Radius),SmokeColor) +else +trigger.action.smoke(self.CargoObject:GetVec3(),SmokeColor) +end +end +end +function CARGO:SmokeGreen() +self:Smoke(trigger.smokeColor.Green,Range) +end +function CARGO:SmokeRed() +self:Smoke(trigger.smokeColor.Red,Range) +end +function CARGO:SmokeWhite() +self:Smoke(trigger.smokeColor.White,Range) +end +function CARGO:SmokeOrange() +self:Smoke(trigger.smokeColor.Orange,Range) +end +function CARGO:SmokeBlue() +self:Smoke(trigger.smokeColor.Blue,Range) +end +function CARGO:SetLoadRadius(LoadRadius) +self.LoadRadius=LoadRadius or 150 +end +function CARGO:GetLoadRadius() +return self.LoadRadius +end +function CARGO:IsInLoadRadius(Coordinate) +self:T({Coordinate,LoadRadius=self.LoadRadius}) +local Distance=0 +if self:IsUnLoaded()then +local CargoCoordinate=self.CargoObject:GetCoordinate() +Distance=Coordinate:Get2DDistance(CargoCoordinate) +self:T(Distance) +if Distance<=self.LoadRadius then +return true +end +end +return false +end +function CARGO:IsInReportRadius(Coordinate) +self:T({Coordinate}) +local Distance=0 +if self:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +self:T(Distance) +if Distance<=self.LoadRadius then +return true +end +end +return false +end +function CARGO:IsNear(Coordinate,NearRadius) +if self.CargoObject:IsAlive()then +local Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +if Distance<=NearRadius then +return true +end +end +return false +end +function CARGO:IsInZone(Zone) +if self:IsLoaded()then +return Zone:IsPointVec2InZone(self.CargoCarrier:GetPointVec2()) +else +if self.CargoObject:GetSize()~=0 then +return Zone:IsPointVec2InZone(self.CargoObject:GetPointVec2()) +else +return false +end +end +return nil +end +function CARGO:GetPointVec2() +return self.CargoObject:GetPointVec2() +end +function CARGO:GetCoordinate() +return self.CargoObject:GetCoordinate() +end +function CARGO:GetWeight() +return self.Weight +end +function CARGO:SetWeight(Weight) +self.Weight=Weight +return self +end +function CARGO:GetVolume() +return self.Volume +end +function CARGO:SetVolume(Volume) +self.Volume=Volume +return self +end +function CARGO:MessageToGroup(Message,CarrierGroup,Name) +MESSAGE:New(Message,20,"Cargo "..self:GetName()):ToGroup(CarrierGroup) +end +function CARGO:Report(ReportText,Action,CarrierGroup) +if not self.Reported[CarrierGroup]or not self.Reported[CarrierGroup][Action]then +self.Reported[CarrierGroup]={} +self.Reported[CarrierGroup][Action]=true +self:MessageToGroup(ReportText,CarrierGroup) +if self.ReportFlareColor then +if not self.Reported[CarrierGroup]["Flaring"]then +self:Flare(self.ReportFlareColor) +self.Reported[CarrierGroup]["Flaring"]=true +end +end +if self.ReportSmokeColor then +if not self.Reported[CarrierGroup]["Smoking"]then +self:Smoke(self.ReportSmokeColor) +self.Reported[CarrierGroup]["Smoking"]=true +end +end +end +end +function CARGO:ReportFlare(FlareColor) +self.ReportFlareColor=FlareColor +end +function CARGO:ReportSmoke(SmokeColor) +self.ReportSmokeColor=SmokeColor +end +function CARGO:ReportReset(Action,CarrierGroup) +self.Reported[CarrierGroup][Action]=nil +end +function CARGO:ReportResetAll(CarrierGroup) +self.Reported[CarrierGroup]=nil +end +function CARGO:RespawnOnDestroyed(RespawnDestroyed) +if RespawnDestroyed then +self.onenterDestroyed=function(self) +self:Respawn() +end +else +self.onenterDestroyed=nil +end +end +end +do +CARGO_REPRESENTABLE={ +ClassName="CARGO_REPRESENTABLE" +} +function CARGO_REPRESENTABLE:New(CargoObject,Type,Name,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO:New(Type,Name,0,LoadRadius,NearRadius)) +self:T({Type,Name,LoadRadius,NearRadius}) +local Desc=CargoObject:GetDesc() +self:T({Desc=Desc}) +local Weight=math.random(80,120) +if Desc then +if Desc.typeName=="2B11 mortar"then +Weight=210 +else +Weight=Desc.massEmpty +end +end +self:SetWeight(Weight) +return self +end +function CARGO_REPRESENTABLE:Destroy() +self:T({CargoName=self:GetName()}) +return self +end +function CARGO_REPRESENTABLE:RouteTo(ToPointVec2,Speed) +self:F2(ToPointVec2) +local Points={} +local PointStartVec2=self.CargoObject:GetPointVec2() +Points[#Points+1]=PointStartVec2:WaypointGround(Speed) +Points[#Points+1]=ToPointVec2:WaypointGround(Speed) +local TaskRoute=self.CargoObject:TaskRoute(Points) +self.CargoObject:SetTask(TaskRoute,2) +return self +end +function CARGO_REPRESENTABLE:MessageToGroup(Message,TaskGroup,Name) +local CoordinateZone=ZONE_RADIUS:New("Zone",self:GetCoordinate():GetVec2(),500) +CoordinateZone:Scan({Object.Category.UNIT}) +for _,DCSUnit in pairs(CoordinateZone:GetScannedUnits())do +local NearUnit=UNIT:Find(DCSUnit) +self:T({NearUnit=NearUnit}) +local NearUnitCoalition=NearUnit:GetCoalition() +local CargoCoalition=self:GetCoalition() +if NearUnitCoalition==CargoCoalition then +local Attributes=NearUnit:GetDesc() +self:T({Desc=Attributes}) +if NearUnit:HasAttribute("Trucks")then +MESSAGE:New(Message,20,NearUnit:GetCallsign().." reporting - Cargo "..self:GetName()):ToGroup(TaskGroup) +break +end +end +end +end +end +do +CARGO_REPORTABLE={ +ClassName="CARGO_REPORTABLE" +} +function CARGO_REPORTABLE:New(Type,Name,Weight,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO:New(Type,Name,Weight,LoadRadius,NearRadius)) +self:T({Type,Name,Weight,LoadRadius,NearRadius}) +return self +end +function CARGO_REPORTABLE:MessageToGroup(Message,TaskGroup,Name) +MESSAGE:New(Message,20,"Cargo "..self:GetName().." reporting"):ToGroup(TaskGroup) +end +end +do +CARGO_PACKAGE={ +ClassName="CARGO_PACKAGE" +} +function CARGO_PACKAGE:New(CargoCarrier,Type,Name,Weight,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO_REPRESENTABLE:New(CargoCarrier,Type,Name,Weight,LoadRadius,NearRadius)) +self:T({Type,Name,Weight,LoadRadius,NearRadius}) +self:T(CargoCarrier) +self.CargoCarrier=CargoCarrier +return self +end +function CARGO_PACKAGE:onafterOnBoard(From,Event,To,CargoCarrier,Speed,BoardDistance,LoadDistance,Angle) +self:T() +self.CargoInAir=self.CargoCarrier:InAir() +self:T(self.CargoInAir) +if not self.CargoInAir then +local Points={} +local StartPointVec2=self.CargoCarrier:GetPointVec2() +local CargoCarrierHeading=CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +self:T({CargoCarrierHeading,CargoDeployHeading}) +local CargoDeployPointVec2=CargoCarrier:GetPointVec2():Translate(BoardDistance,CargoDeployHeading) +Points[#Points+1]=StartPointVec2:WaypointGround(Speed) +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed) +local TaskRoute=self.CargoCarrier:TaskRoute(Points) +self.CargoCarrier:SetTask(TaskRoute,1) +end +self:Boarded(CargoCarrier,Speed,BoardDistance,LoadDistance,Angle) +end +function CARGO_PACKAGE:IsNear(CargoCarrier) +self:T() +local CargoCarrierPoint=CargoCarrier:GetCoordinate() +local Distance=CargoCarrierPoint:Get2DDistance(self.CargoCarrier:GetCoordinate()) +self:T(Distance) +if Distance<=self.NearRadius then +return true +else +return false +end +end +function CARGO_PACKAGE:onafterOnBoarded(From,Event,To,CargoCarrier,Speed,BoardDistance,LoadDistance,Angle) +self:T() +if self:IsNear(CargoCarrier)then +self:__Load(1,CargoCarrier,Speed,LoadDistance,Angle) +else +self:__Boarded(1,CargoCarrier,Speed,BoardDistance,LoadDistance,Angle) +end +end +function CARGO_PACKAGE:onafterUnBoard(From,Event,To,CargoCarrier,Speed,UnLoadDistance,UnBoardDistance,Radius,Angle) +self:T() +self.CargoInAir=self.CargoCarrier:InAir() +self:T(self.CargoInAir) +if not self.CargoInAir then +self:_Next(self.FsmP.UnLoad,UnLoadDistance,Angle) +local Points={} +local StartPointVec2=CargoCarrier:GetPointVec2() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +self:T({CargoCarrierHeading,CargoDeployHeading}) +local CargoDeployPointVec2=StartPointVec2:Translate(UnBoardDistance,CargoDeployHeading) +Points[#Points+1]=StartPointVec2:WaypointGround(Speed) +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed) +local TaskRoute=CargoCarrier:TaskRoute(Points) +CargoCarrier:SetTask(TaskRoute,1) +end +self:__UnBoarded(1,CargoCarrier,Speed) +end +function CARGO_PACKAGE:onafterUnBoarded(From,Event,To,CargoCarrier,Speed) +self:T() +if self:IsNear(CargoCarrier)then +self:__UnLoad(1,CargoCarrier,Speed) +else +self:__UnBoarded(1,CargoCarrier,Speed) +end +end +function CARGO_PACKAGE:onafterLoad(From,Event,To,CargoCarrier,Speed,LoadDistance,Angle) +self:T() +self.CargoCarrier=CargoCarrier +local StartPointVec2=self.CargoCarrier:GetPointVec2() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployPointVec2=StartPointVec2:Translate(LoadDistance,CargoDeployHeading) +local Points={} +Points[#Points+1]=StartPointVec2:WaypointGround(Speed) +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed) +local TaskRoute=self.CargoCarrier:TaskRoute(Points) +self.CargoCarrier:SetTask(TaskRoute,1) +end +function CARGO_PACKAGE:onafterUnLoad(From,Event,To,CargoCarrier,Speed,Distance,Angle) +self:T() +local StartPointVec2=self.CargoCarrier:GetPointVec2() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployPointVec2=StartPointVec2:Translate(Distance,CargoDeployHeading) +self.CargoCarrier=CargoCarrier +local Points={} +Points[#Points+1]=StartPointVec2:WaypointGround(Speed) +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed) +local TaskRoute=self.CargoCarrier:TaskRoute(Points) +self.CargoCarrier:SetTask(TaskRoute,1) +end +end +do +CARGO_UNIT={ +ClassName="CARGO_UNIT" +} +function CARGO_UNIT:New(CargoUnit,Type,Name,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO_REPRESENTABLE:New(CargoUnit,Type,Name,LoadRadius,NearRadius)) +self:T({Type=Type,Name=Name,LoadRadius=LoadRadius,NearRadius=NearRadius}) +self.CargoObject=CargoUnit +self:SetEventPriority(5) +return self +end +function CARGO_UNIT:onenterUnBoarding(From,Event,To,ToPointVec2,NearRadius) +self:T({From,Event,To,ToPointVec2,NearRadius}) +local Angle=180 +local Speed=60 +local DeployDistance=9 +local RouteDistance=60 +if From=="Loaded"then +if not self:IsDestroyed()then +local CargoCarrier=self.CargoCarrier +if CargoCarrier:IsAlive()then +local CargoCarrierPointVec2=CargoCarrier:GetPointVec2() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoRoutePointVec2=CargoCarrierPointVec2:Translate(RouteDistance,CargoDeployHeading) +local FromDirectionVec3=CargoCarrierPointVec2:GetDirectionVec3(ToPointVec2 or CargoRoutePointVec2) +local FromAngle=CargoCarrierPointVec2:GetAngleDegrees(FromDirectionVec3) +local FromPointVec2=CargoCarrierPointVec2:Translate(DeployDistance,FromAngle) +ToPointVec2=ToPointVec2 or CargoCarrierPointVec2:GetRandomCoordinateInRadius(NearRadius,DeployDistance) +if self.CargoObject then +if CargoCarrier:IsShip()then +self.CargoObject:ReSpawnAt(ToPointVec2,CargoDeployHeading) +else +self.CargoObject:ReSpawnAt(FromPointVec2,CargoDeployHeading) +end +self:T({"CargoUnits:",self.CargoObject:GetGroup():GetName()}) +self.CargoCarrier=nil +local Points={} +Points[#Points+1]=FromPointVec2:WaypointGround(Speed,"Vee") +Points[#Points+1]=ToPointVec2:WaypointGround(Speed,"Vee") +local TaskRoute=self.CargoObject:TaskRoute(Points) +self.CargoObject:SetTask(TaskRoute,1) +self:__UnBoarding(1,ToPointVec2,NearRadius) +end +else +self:Destroyed() +end +end +end +end +function CARGO_UNIT:onleaveUnBoarding(From,Event,To,ToPointVec2,NearRadius) +self:T({From,Event,To,ToPointVec2,NearRadius}) +local Angle=180 +local Speed=10 +local Distance=5 +if From=="UnBoarding"then +return true +end +end +function CARGO_UNIT:onafterUnBoarding(From,Event,To,ToPointVec2,NearRadius) +self:T({From,Event,To,ToPointVec2,NearRadius}) +self.CargoInAir=self.CargoObject:InAir() +self:T(self.CargoInAir) +if not self.CargoInAir then +end +self:__UnLoad(1,ToPointVec2,NearRadius) +end +function CARGO_UNIT:onenterUnLoaded(From,Event,To,ToPointVec2) +self:T({ToPointVec2,From,Event,To}) +local Angle=180 +local Speed=10 +local Distance=5 +if From=="Loaded"then +local StartPointVec2=self.CargoCarrier:GetPointVec2() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployCoord=StartPointVec2:Translate(Distance,CargoDeployHeading) +ToPointVec2=ToPointVec2 or COORDINATE:New(CargoDeployCoord.x,CargoDeployCoord.z) +if self.CargoObject then +self.CargoObject:ReSpawnAt(ToPointVec2,0) +self.CargoCarrier=nil +end +end +if self.OnUnLoadedCallBack then +self.OnUnLoadedCallBack(self,unpack(self.OnUnLoadedParameters)) +self.OnUnLoadedCallBack=nil +end +end +function CARGO_UNIT:onafterBoard(From,Event,To,CargoCarrier,NearRadius,...) +self:T({From,Event,To,CargoCarrier,NearRadius=NearRadius}) +self.CargoInAir=self.CargoObject:InAir() +local Desc=self.CargoObject:GetDesc() +local MaxSpeed=Desc.speedMaxOffRoad +local TypeName=Desc.typeName +if not self.CargoInAir then +local NearRadius=NearRadius or CargoCarrier:GetBoundingRadius()+5 +if self:IsNear(CargoCarrier:GetPointVec2(),NearRadius)then +self:Load(CargoCarrier,NearRadius,...) +else +if MaxSpeed and MaxSpeed==0 or TypeName and TypeName=="Stinger comm"then +self:Load(CargoCarrier,NearRadius,...) +else +local Speed=90 +local Angle=180 +local Distance=0 +local CargoCarrierPointVec2=CargoCarrier:GetPointVec2() +local CargoCarrierHeading=CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployPointVec2=CargoCarrierPointVec2:Translate(Distance,CargoDeployHeading) +self.CargoObject:OptionAlarmStateGreen() +local Points={} +local PointStartVec2=self.CargoObject:GetPointVec2() +Points[#Points+1]=PointStartVec2:WaypointGround(Speed) +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed) +local TaskRoute=self.CargoObject:TaskRoute(Points) +self.CargoObject:SetTask(TaskRoute,2) +self:__Boarding(-5,CargoCarrier,NearRadius,...) +self.RunCount=0 +end +end +end +end +function CARGO_UNIT:onafterBoarding(From,Event,To,CargoCarrier,NearRadius,...) +self:T({From,Event,To,CargoCarrier:GetName(),NearRadius=NearRadius}) +self:T({IsAlive=self.CargoObject:IsAlive()}) +if CargoCarrier and CargoCarrier:IsAlive()then +if(CargoCarrier:IsAir()and not CargoCarrier:InAir())or true then +local NearRadius=NearRadius or CargoCarrier:GetBoundingRadius(NearRadius)+5 +if self:IsNear(CargoCarrier:GetPointVec2(),NearRadius)then +self:__Load(-1,CargoCarrier,...) +else +if self:IsNear(CargoCarrier:GetPointVec2(),20)then +self:__Boarding(-1,CargoCarrier,NearRadius,...) +self.RunCount=self.RunCount+1 +else +self:__Boarding(-2,CargoCarrier,NearRadius,...) +self.RunCount=self.RunCount+2 +end +if self.RunCount>=40 then +self.RunCount=0 +local Speed=90 +local Angle=180 +local Distance=0 +local CargoCarrierPointVec2=CargoCarrier:GetPointVec2() +local CargoCarrierHeading=CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployPointVec2=CargoCarrierPointVec2:Translate(Distance,CargoDeployHeading) +self.CargoObject:OptionAlarmStateGreen() +local Points={} +local PointStartVec2=self.CargoObject:GetPointVec2() +Points[#Points+1]=PointStartVec2:WaypointGround(Speed,"Off road") +Points[#Points+1]=CargoDeployPointVec2:WaypointGround(Speed,"Off road") +local TaskRoute=self.CargoObject:TaskRoute(Points) +self.CargoObject:SetTask(TaskRoute,0.2) +end +end +else +self.CargoObject:MessageToGroup("Cancelling Boarding... Get back on the ground!",5,CargoCarrier:GetGroup(),self:GetName()) +self:CancelBoarding(CargoCarrier,NearRadius,...) +self.CargoObject:SetCommand(self.CargoObject:CommandStopRoute(true)) +end +else +self:T("Something is wrong") +end +end +function CARGO_UNIT:onenterLoaded(From,Event,To,CargoCarrier) +self:T({From,Event,To,CargoCarrier}) +self.CargoCarrier=CargoCarrier +if self.CargoObject then +self.CargoObject:Destroy(false) +end +end +function CARGO_UNIT:GetTransportationMethod() +if self:IsLoaded()then +return"for unboarding" +else +if self:IsUnLoaded()then +return"for boarding" +else +if self:IsDeployed()then +return"delivered" +end +end +end +return"" +end +end +do +CARGO_SLINGLOAD={ +ClassName="CARGO_SLINGLOAD" +} +function CARGO_SLINGLOAD:New(CargoStatic,Type,Name,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO_REPRESENTABLE:New(CargoStatic,Type,Name,nil,LoadRadius,NearRadius)) +self:T({Type,Name,NearRadius}) +self.CargoObject=CargoStatic +_EVENTDISPATCHER:CreateEventNewCargo(self) +self:HandleEvent(EVENTS.Dead,self.OnEventCargoDead) +self:HandleEvent(EVENTS.Crash,self.OnEventCargoDead) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventCargoDead) +self:SetEventPriority(4) +self.NearRadius=NearRadius or 25 +return self +end +function CARGO_SLINGLOAD:OnEventCargoDead(EventData) +local Destroyed=false +if self:IsDestroyed()or self:IsUnLoaded()then +if self.CargoObject:GetName()==EventData.IniUnitName then +if not self.NoDestroy then +Destroyed=true +end +end +end +if Destroyed then +self:I({"Cargo crate destroyed: "..self.CargoObject:GetName()}) +self:Destroyed() +end +end +function CARGO_SLINGLOAD:CanSlingload() +return true +end +function CARGO_SLINGLOAD:CanBoard() +return false +end +function CARGO_SLINGLOAD:CanUnboard() +return false +end +function CARGO_SLINGLOAD:CanLoad() +return false +end +function CARGO_SLINGLOAD:CanUnload() +return false +end +function CARGO_SLINGLOAD:IsInReportRadius(Coordinate) +local Distance=0 +if self:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +if Distance<=self.LoadRadius then +return true +end +end +return false +end +function CARGO_SLINGLOAD:IsInLoadRadius(Coordinate) +local Distance=0 +if self:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +if Distance<=self.NearRadius then +return true +end +end +return false +end +function CARGO_SLINGLOAD:GetCoordinate() +return self.CargoObject:GetCoordinate() +end +function CARGO_SLINGLOAD:IsAlive() +local Alive=true +if self:IsLoaded()then +Alive=Alive==true and self.CargoCarrier:IsAlive() +else +Alive=Alive==true and self.CargoObject:IsAlive() +end +return Alive +end +function CARGO_SLINGLOAD:RouteTo(Coordinate) +end +function CARGO_SLINGLOAD:IsNear(CargoCarrier,NearRadius) +return self:IsNear(CargoCarrier:GetCoordinate(),NearRadius) +end +function CARGO_SLINGLOAD:Respawn() +if self.CargoObject then +self.CargoObject:ReSpawn() +self:__Reset(-0.1) +end +end +function CARGO_SLINGLOAD:onafterReset() +if self.CargoObject then +self:SetDeployed(false) +self:SetStartState("UnLoaded") +self.CargoCarrier=nil +_EVENTDISPATCHER:CreateEventNewCargo(self) +end +end +function CARGO_SLINGLOAD:GetTransportationMethod() +if self:IsLoaded()then +return"for sling loading" +else +if self:IsUnLoaded()then +return"for sling loading" +else +if self:IsDeployed()then +return"delivered" +end +end +end +return"" +end +end +do +CARGO_CRATE={ +ClassName="CARGO_CRATE" +} +function CARGO_CRATE:New(CargoStatic,Type,Name,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO_REPRESENTABLE:New(CargoStatic,Type,Name,nil,LoadRadius,NearRadius)) +self:T({Type,Name,NearRadius}) +self.CargoObject=CargoStatic +_EVENTDISPATCHER:CreateEventNewCargo(self) +self:HandleEvent(EVENTS.Dead,self.OnEventCargoDead) +self:HandleEvent(EVENTS.Crash,self.OnEventCargoDead) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventCargoDead) +self:SetEventPriority(4) +self.NearRadius=NearRadius or 25 +return self +end +function CARGO_CRATE:OnEventCargoDead(EventData) +local Destroyed=false +if self:IsDestroyed()or self:IsUnLoaded()or self:IsBoarding()then +if self.CargoObject:GetName()==EventData.IniUnitName then +if not self.NoDestroy then +Destroyed=true +end +end +else +if self:IsLoaded()then +local CarrierName=self.CargoCarrier:GetName() +if CarrierName==EventData.IniDCSUnitName then +MESSAGE:New("Cargo is lost from carrier "..CarrierName,15):ToAll() +Destroyed=true +self.CargoCarrier:ClearCargo() +end +end +end +if Destroyed then +self:I({"Cargo crate destroyed: "..self.CargoObject:GetName()}) +self:Destroyed() +end +end +function CARGO_CRATE:onenterUnLoaded(From,Event,To,ToPointVec2) +local Angle=180 +local Speed=10 +local Distance=10 +if From=="Loaded"then +local StartCoordinate=self.CargoCarrier:GetCoordinate() +local CargoCarrierHeading=self.CargoCarrier:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +local CargoDeployCoord=StartCoordinate:Translate(Distance,CargoDeployHeading) +ToPointVec2=ToPointVec2 or COORDINATE:NewFromVec2({x=CargoDeployCoord.x,y=CargoDeployCoord.z}) +if self.CargoObject then +self.CargoObject:ReSpawnAt(ToPointVec2,0) +self.CargoCarrier=nil +end +end +if self.OnUnLoadedCallBack then +self.OnUnLoadedCallBack(self,unpack(self.OnUnLoadedParameters)) +self.OnUnLoadedCallBack=nil +end +end +function CARGO_CRATE:onenterLoaded(From,Event,To,CargoCarrier) +self.CargoCarrier=CargoCarrier +if self.CargoObject then +self:T("Destroying") +self.NoDestroy=true +self.CargoObject:Destroy(false) +end +end +function CARGO_CRATE:CanBoard() +return false +end +function CARGO_CRATE:CanUnboard() +return false +end +function CARGO_CRATE:CanSlingload() +return false +end +function CARGO_CRATE:IsInReportRadius(Coordinate) +local Distance=0 +if self:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +if Distance<=self.LoadRadius then +return true +end +end +return false +end +function CARGO_CRATE:IsInLoadRadius(Coordinate) +local Distance=0 +if self:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(self.CargoObject:GetCoordinate()) +if Distance<=self.NearRadius then +return true +end +end +return false +end +function CARGO_CRATE:GetCoordinate() +return self.CargoObject:GetCoordinate() +end +function CARGO_CRATE:IsAlive() +local Alive=true +if self:IsLoaded()then +Alive=Alive==true and self.CargoCarrier:IsAlive() +else +Alive=Alive==true and self.CargoObject:IsAlive() +end +return Alive +end +function CARGO_CRATE:RouteTo(Coordinate) +self:T({Coordinate=Coordinate}) +end +function CARGO_CRATE:IsNear(CargoCarrier,NearRadius) +self:T({NearRadius=NearRadius}) +return self:IsNear(CargoCarrier:GetCoordinate(),NearRadius) +end +function CARGO_CRATE:Respawn() +self:T({"Respawning crate "..self:GetName()}) +if self.CargoObject then +self.CargoObject:ReSpawn() +self:__Reset(-0.1) +end +end +function CARGO_CRATE:onafterReset() +self:T({"Reset crate "..self:GetName()}) +if self.CargoObject then +self:SetDeployed(false) +self:SetStartState("UnLoaded") +self.CargoCarrier=nil +_EVENTDISPATCHER:CreateEventNewCargo(self) +end +end +function CARGO_CRATE:GetTransportationMethod() +if self:IsLoaded()then +return"for unloading" +else +if self:IsUnLoaded()then +return"for loading" +else +if self:IsDeployed()then +return"delivered" +end +end +end +return"" +end +end +do +CARGO_GROUP={ +ClassName="CARGO_GROUP", +} +function CARGO_GROUP:New(CargoGroup,Type,Name,LoadRadius,NearRadius) +local self=BASE:Inherit(self,CARGO_REPORTABLE:New(Type,Name,0,LoadRadius,NearRadius)) +self:T({Type,Name,LoadRadius}) +self.CargoSet=SET_CARGO:New() +self.CargoGroup=CargoGroup +self.Grouped=true +self.CargoUnitTemplate={} +self.NearRadius=NearRadius +self:SetDeployed(false) +local WeightGroup=0 +local VolumeGroup=0 +self.CargoGroup:Destroy() +local GroupName=CargoGroup:GetName() +self.CargoName=Name +self.CargoTemplate=UTILS.DeepCopy(_DATABASE:GetGroupTemplate(GroupName)) +self.CargoTemplate.lateActivation=false +self.GroupTemplate=UTILS.DeepCopy(self.CargoTemplate) +self.GroupTemplate.name=self.CargoName.."#CARGO" +self.GroupTemplate.groupId=nil +self.GroupTemplate.units={} +for UnitID,UnitTemplate in pairs(self.CargoTemplate.units)do +UnitTemplate.name=UnitTemplate.name.."#CARGO" +local CargoUnitName=UnitTemplate.name +self.CargoUnitTemplate[CargoUnitName]=UnitTemplate +self.GroupTemplate.units[#self.GroupTemplate.units+1]=self.CargoUnitTemplate[CargoUnitName] +self.GroupTemplate.units[#self.GroupTemplate.units].unitId=nil +local Unit=UNIT:Register(CargoUnitName) +end +self.CargoGroup=GROUP:NewTemplate(self.GroupTemplate,self.GroupTemplate.CoalitionID,self.GroupTemplate.CategoryID,self.GroupTemplate.CountryID) +self.CargoObject=_DATABASE:Spawn(self.GroupTemplate) +for CargoUnitID,CargoUnit in pairs(self.CargoObject:GetUnits())do +local CargoUnitName=CargoUnit:GetName() +local Cargo=CARGO_UNIT:New(CargoUnit,Type,CargoUnitName,LoadRadius,NearRadius) +self.CargoSet:Add(CargoUnitName,Cargo) +WeightGroup=WeightGroup+Cargo:GetWeight() +end +self:SetWeight(WeightGroup) +self:T({"Weight Cargo",WeightGroup}) +_EVENTDISPATCHER:CreateEventNewCargo(self) +self:HandleEvent(EVENTS.Dead,self.OnEventCargoDead) +self:HandleEvent(EVENTS.Crash,self.OnEventCargoDead) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventCargoDead) +self:SetEventPriority(4) +return self +end +function CARGO_GROUP:Respawn() +self:T({"Respawning"}) +for CargoID,CargoData in pairs(self.CargoSet:GetSet())do +local Cargo=CargoData +Cargo:Destroy() +Cargo:SetStartState("UnLoaded") +end +_DATABASE:Spawn(self.GroupTemplate) +for CargoUnitID,CargoUnit in pairs(self.CargoObject:GetUnits())do +local CargoUnitName=CargoUnit:GetName() +local Cargo=CARGO_UNIT:New(CargoUnit,self.Type,CargoUnitName,self.LoadRadius) +self.CargoSet:Add(CargoUnitName,Cargo) +end +self:SetDeployed(false) +self:SetStartState("UnLoaded") +end +function CARGO_GROUP:Ungroup() +if self.Grouped==true then +self.Grouped=false +self.CargoGroup:Destroy() +for CargoUnitName,CargoUnit in pairs(self.CargoSet:GetSet())do +local CargoUnit=CargoUnit +if CargoUnit:IsUnLoaded()then +local GroupTemplate=UTILS.DeepCopy(self.CargoTemplate) +GroupTemplate.name=self.CargoName.."#CARGO#"..CargoUnitName +GroupTemplate.groupId=nil +if CargoUnit:IsUnLoaded()then +GroupTemplate.units={} +GroupTemplate.units[1]=self.CargoUnitTemplate[CargoUnitName] +GroupTemplate.units[#GroupTemplate.units].unitId=nil +GroupTemplate.units[#GroupTemplate.units].x=CargoUnit:GetX() +GroupTemplate.units[#GroupTemplate.units].y=CargoUnit:GetY() +GroupTemplate.units[#GroupTemplate.units].heading=CargoUnit:GetHeading() +end +local CargoGroup=GROUP:NewTemplate(GroupTemplate,GroupTemplate.CoalitionID,GroupTemplate.CategoryID,GroupTemplate.CountryID) +_DATABASE:Spawn(GroupTemplate) +end +end +self.CargoObject=nil +end +end +function CARGO_GROUP:Regroup() +self:T("Regroup") +if self.Grouped==false then +self.Grouped=true +local GroupTemplate=UTILS.DeepCopy(self.CargoTemplate) +GroupTemplate.name=self.CargoName.."#CARGO" +GroupTemplate.groupId=nil +GroupTemplate.units={} +for CargoUnitName,CargoUnit in pairs(self.CargoSet:GetSet())do +local CargoUnit=CargoUnit +self:T({CargoUnit:GetName(),UnLoaded=CargoUnit:IsUnLoaded()}) +if CargoUnit:IsUnLoaded()then +CargoUnit.CargoObject:Destroy() +GroupTemplate.units[#GroupTemplate.units+1]=self.CargoUnitTemplate[CargoUnitName] +GroupTemplate.units[#GroupTemplate.units].unitId=nil +GroupTemplate.units[#GroupTemplate.units].x=CargoUnit:GetX() +GroupTemplate.units[#GroupTemplate.units].y=CargoUnit:GetY() +GroupTemplate.units[#GroupTemplate.units].heading=CargoUnit:GetHeading() +end +end +self.CargoGroup=GROUP:NewTemplate(GroupTemplate,GroupTemplate.CoalitionID,GroupTemplate.CategoryID,GroupTemplate.CountryID) +self:T({"Regroup",GroupTemplate}) +self.CargoObject=_DATABASE:Spawn(GroupTemplate) +end +end +function CARGO_GROUP:OnEventCargoDead(EventData) +self:T(EventData) +local Destroyed=false +if self:IsDestroyed()or self:IsUnLoaded()or self:IsBoarding()or self:IsUnboarding()then +Destroyed=true +for CargoID,CargoData in pairs(self.CargoSet:GetSet())do +local Cargo=CargoData +if Cargo:IsAlive()then +Destroyed=false +else +Cargo:Destroyed() +end +end +else +local CarrierName=self.CargoCarrier:GetName() +if CarrierName==EventData.IniDCSUnitName then +MESSAGE:New("Cargo is lost from carrier "..CarrierName,15):ToAll() +Destroyed=true +self.CargoCarrier:ClearCargo() +end +end +if Destroyed then +self:Destroyed() +self:T({"Cargo group destroyed"}) +end +end +function CARGO_GROUP:onafterBoard(From,Event,To,CargoCarrier,NearRadius,...) +self:T({CargoCarrier.UnitName,From,Event,To,NearRadius=NearRadius}) +NearRadius=NearRadius or self.NearRadius +self.CargoSet:ForEach( +function(Cargo,...) +self:T({"Board Unit",Cargo:GetName(),Cargo:IsDestroyed(),Cargo.CargoObject:IsAlive()}) +local CargoGroup=Cargo.CargoObject +CargoGroup:OptionAlarmStateGreen() +Cargo:__Board(1,CargoCarrier,NearRadius,...) +end,... +) +self:__Boarding(-1,CargoCarrier,NearRadius,...) +end +function CARGO_GROUP:onafterLoad(From,Event,To,CargoCarrier,...) +if From=="UnLoaded"then +for CargoID,Cargo in pairs(self.CargoSet:GetSet())do +if not Cargo:IsDestroyed()then +Cargo:Load(CargoCarrier) +end +end +end +self.CargoCarrier=CargoCarrier +self.CargoCarrier:AddCargo(self) +end +function CARGO_GROUP:onafterBoarding(From,Event,To,CargoCarrier,NearRadius,...) +local Boarded=true +local Cancelled=false +local Dead=true +self.CargoSet:Flush() +for CargoID,Cargo in pairs(self.CargoSet:GetSet())do +if not Cargo:is("Loaded") +and(not Cargo:is("Destroyed"))then +Boarded=false +end +if Cargo:is("UnLoaded")then +Cancelled=true +end +if not Cargo:is("Destroyed")then +Dead=false +end +end +if not Dead then +if not Cancelled then +if not Boarded then +self:__Boarding(-5,CargoCarrier,NearRadius,...) +else +self:T("Group Cargo is loaded") +self:__Load(1,CargoCarrier,...) +end +else +self:__CancelBoarding(1,CargoCarrier,NearRadius,...) +end +else +self:__Destroyed(1,CargoCarrier,NearRadius,...) +end +end +function CARGO_GROUP:onafterUnBoard(From,Event,To,ToPointVec2,NearRadius,...) +self:T({From,Event,To,ToPointVec2,NearRadius}) +NearRadius=NearRadius or 25 +local Timer=1 +if From=="Loaded"then +if self.CargoObject then +self.CargoObject:Destroy() +end +self.CargoSet:ForEach( +function(Cargo,NearRadius) +if not Cargo:IsDestroyed()then +local ToVec=nil +if ToPointVec2==nil then +ToVec=self.CargoCarrier:GetPointVec2():GetRandomPointVec2InRadius(2*NearRadius,NearRadius) +else +ToVec=ToPointVec2 +end +Cargo:__UnBoard(Timer,ToVec,NearRadius) +Timer=Timer+1 +end +end,{NearRadius} +) +self:__UnBoarding(1,ToPointVec2,NearRadius,...) +end +end +function CARGO_GROUP:onafterUnBoarding(From,Event,To,ToPointVec2,NearRadius,...) +local Angle=180 +local Speed=10 +local Distance=5 +if From=="UnBoarding"then +local UnBoarded=true +for CargoID,Cargo in pairs(self.CargoSet:GetSet())do +self:T({Cargo:GetName(),Cargo.current}) +if not Cargo:is("UnLoaded")and not Cargo:IsDestroyed()then +UnBoarded=false +end +end +if UnBoarded then +self:__UnLoad(1,ToPointVec2,...) +else +self:__UnBoarding(1,ToPointVec2,NearRadius,...) +end +return false +end +end +function CARGO_GROUP:onafterUnLoad(From,Event,To,ToPointVec2,...) +if From=="Loaded"then +self.CargoSet:ForEach( +function(Cargo) +local RandomVec2=nil +if ToPointVec2 then +RandomVec2=ToPointVec2:GetRandomPointVec2InRadius(20,10) +end +Cargo:UnBoard(RandomVec2) +end +) +end +self.CargoCarrier:RemoveCargo(self) +self.CargoCarrier=nil +end +function CARGO_GROUP:GetCoordinate() +local Cargo=self:GetFirstAlive() +if Cargo then +return Cargo.CargoObject:GetCoordinate() +end +return nil +end +function CARGO:GetX() +local Cargo=self:GetFirstAlive() +if Cargo then +return Cargo:GetCoordinate().x +end +return nil +end +function CARGO:GetY() +local Cargo=self:GetFirstAlive() +if Cargo then +return Cargo:GetCoordinate().z +end +return nil +end +function CARGO_GROUP:IsAlive() +local Cargo=self:GetFirstAlive() +return Cargo~=nil +end +function CARGO_GROUP:GetFirstAlive() +local CargoFirstAlive=nil +for _,Cargo in pairs(self.CargoSet:GetSet())do +if not Cargo:IsDestroyed()then +CargoFirstAlive=Cargo +break +end +end +return CargoFirstAlive +end +function CARGO_GROUP:GetCount() +return self.CargoSet:Count() +end +function CARGO_GROUP:GetGroup(Cargo) +local Cargo=Cargo or self:GetFirstAlive() +return Cargo.CargoObject:GetGroup() +end +function CARGO_GROUP:RouteTo(Coordinate) +self.CargoSet:ForEach( +function(Cargo) +Cargo.CargoObject:RouteGroundTo(Coordinate,10,"vee",0) +end +) +end +function CARGO_GROUP:IsNear(CargoCarrier,NearRadius) +self:T({NearRadius=NearRadius}) +for _,Cargo in pairs(self.CargoSet:GetSet())do +local Cargo=Cargo +if Cargo:IsAlive()then +if Cargo:IsNear(CargoCarrier:GetCoordinate(),NearRadius)then +self:T("Near") +return true +end +end +end +return nil +end +function CARGO_GROUP:IsInLoadRadius(Coordinate) +local Cargo=self:GetFirstAlive() +if Cargo then +local Distance=0 +local CargoCoordinate +if Cargo:IsLoaded()then +CargoCoordinate=Cargo.CargoCarrier:GetCoordinate() +else +CargoCoordinate=Cargo.CargoObject:GetCoordinate() +end +if CargoCoordinate then +Distance=Coordinate:Get2DDistance(CargoCoordinate) +else +return false +end +self:T({Distance=Distance,LoadRadius=self.LoadRadius}) +if Distance<=self.LoadRadius then +return true +else +return false +end +end +return nil +end +function CARGO_GROUP:IsInReportRadius(Coordinate) +local Cargo=self:GetFirstAlive() +if Cargo then +self:T({Cargo}) +local Distance=0 +if Cargo:IsUnLoaded()then +Distance=Coordinate:Get2DDistance(Cargo.CargoObject:GetCoordinate()) +if Distance<=self.LoadRadius then +return true +end +end +end +return nil +end +function CARGO_GROUP:Flare(FlareColor) +local Cargo=self.CargoSet:GetFirst() +if Cargo then +Cargo:Flare(FlareColor) +end +end +function CARGO_GROUP:Smoke(SmokeColor,Radius) +local Cargo=self.CargoSet:GetFirst() +if Cargo then +Cargo:Smoke(SmokeColor,Radius) +end +end +function CARGO_GROUP:IsInZone(Zone) +local Cargo=self.CargoSet:GetFirst() +if Cargo then +return Cargo:IsInZone(Zone) +end +return nil +end +function CARGO_GROUP:GetTransportationMethod() +if self:IsLoaded()then +return"for unboarding" +else +if self:IsUnLoaded()then +return"for boarding" +else +if self:IsDeployed()then +return"delivered" +end +end +end +return"" +end +end +SCORING={ +ClassName="SCORING", +ClassID=0, +Players={}, +AutoSave=true, +version="1.18.4" +} +local _SCORINGCoalition={ +[1]="Red", +[2]="Blue", +} +local _SCORINGCategory={ +[Unit.Category.AIRPLANE]="Plane", +[Unit.Category.HELICOPTER]="Helicopter", +[Unit.Category.GROUND_UNIT]="Vehicle", +[Unit.Category.SHIP]="Ship", +[Unit.Category.STRUCTURE]="Structure", +} +function SCORING:New(GameName,SavePath,AutoSave) +local self=BASE:Inherit(self,BASE:New()) +if GameName then +self.GameName=GameName +else +error("A game name must be given to register the scoring results") +end +self.ScoringObjects={} +self.ScoringZones={} +self:SetMessagesToAll() +self:SetMessagesHit(false) +self:SetMessagesDestroy(true) +self:SetMessagesScore(true) +self:SetMessagesZone(true) +self:SetScaleDestroyScore(10) +self:SetScaleDestroyPenalty(30) +self:SetScoreIncrementOnHit(0) +self:SetFratricide(self.ScaleDestroyPenalty*3) +self.penaltyonfratricide=true +self:SetCoalitionChangePenalty(self.ScaleDestroyPenalty) +self.penaltyoncoalitionchange=true +self:SetDisplayMessagePrefix() +self:HandleEvent(EVENTS.Dead,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._EventOnDeadOrCrash) +self:HandleEvent(EVENTS.Hit,self._EventOnHit) +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.PlayerLeaveUnit) +self.ScoringPlayerScan=BASE:ScheduleOnce(1,function() +for PlayerName,PlayerUnit in pairs(_DATABASE:GetPlayerUnits())do +self:_AddPlayerFromUnit(PlayerUnit) +self:SetScoringMenu(PlayerUnit:GetGroup()) +end +end) +self.AutoSavePath=SavePath +self.AutoSave=AutoSave or true +if self.AutoSave==true then +self:OpenCSV(GameName) +end +return self +end +function SCORING:SetDisplayMessagePrefix(DisplayMessagePrefix) +self.DisplayMessagePrefix=DisplayMessagePrefix or"" +return self +end +function SCORING:SetScaleDestroyScore(Scale) +self.ScaleDestroyScore=Scale +return self +end +function SCORING:SetScaleDestroyPenalty(Scale) +self.ScaleDestroyPenalty=Scale +return self +end +function SCORING:AddUnitScore(ScoreUnit,Score) +local UnitName=ScoreUnit:GetName() +self.ScoringObjects[UnitName]=Score +return self +end +function SCORING:RemoveUnitScore(ScoreUnit) +local UnitName=ScoreUnit:GetName() +self.ScoringObjects[UnitName]=nil +return self +end +function SCORING:AddStaticScore(ScoreStatic,Score) +local StaticName=ScoreStatic:GetName() +self.ScoringObjects[StaticName]=Score +return self +end +function SCORING:RemoveStaticScore(ScoreStatic) +local StaticName=ScoreStatic:GetName() +self.ScoringObjects[StaticName]=nil +return self +end +function SCORING:AddScoreGroup(ScoreGroup,Score) +local ScoreUnits=ScoreGroup:GetUnits() +for ScoreUnitID,ScoreUnit in pairs(ScoreUnits)do +local UnitName=ScoreUnit:GetName() +self.ScoringObjects[UnitName]=Score +end +return self +end +function SCORING:AddScoreSetGroup(Set,Score) +local set=Set:GetSetObjects() +for _,_group in pairs(set)do +if _group and _group:IsAlive()then +self:AddScoreGroup(_group,Score) +end +end +local function AddScore(group) +self:AddScoreGroup(group,Score) +end +function Set:OnAfterAdded(From,Event,To,ObjectName,Object) +AddScore(Object) +end +return self +end +function SCORING:AddZoneScore(ScoreZone,Score) +local ZoneName=ScoreZone:GetName() +self.ScoringZones[ZoneName]={} +self.ScoringZones[ZoneName].ScoreZone=ScoreZone +self.ScoringZones[ZoneName].Score=Score +return self +end +function SCORING:RemoveZoneScore(ScoreZone) +local ZoneName=ScoreZone:GetName() +self.ScoringZones[ZoneName]=nil +return self +end +function SCORING:SetMessagesHit(OnOff) +self.MessagesHit=OnOff +return self +end +function SCORING:SetScoreIncrementOnHit(score) +self.ScoreIncrementOnHit=score +return self +end +function SCORING:IfMessagesHit() +return self.MessagesHit +end +function SCORING:SetMessagesDestroy(OnOff) +self.MessagesDestroy=OnOff +return self +end +function SCORING:IfMessagesDestroy() +return self.MessagesDestroy +end +function SCORING:SetMessagesScore(OnOff) +self.MessagesScore=OnOff +return self +end +function SCORING:IfMessagesScore() +return self.MessagesScore +end +function SCORING:SetMessagesZone(OnOff) +self.MessagesZone=OnOff +return self +end +function SCORING:IfMessagesZone() +return self.MessagesZone +end +function SCORING:SetMessagesToAll() +self.MessagesAudience=1 +return self +end +function SCORING:IfMessagesToAll() +return self.MessagesAudience==1 +end +function SCORING:SetMessagesToCoalition() +self.MessagesAudience=2 +return self +end +function SCORING:IfMessagesToCoalition() +return self.MessagesAudience==2 +end +function SCORING:SetFratricide(Fratricide) +self.Fratricide=Fratricide +return self +end +function SCORING:SwitchFratricide(OnOff) +self.penaltyonfratricide=OnOff +return self +end +function SCORING:SwitchTreason(OnOff) +self.penaltyoncoalitionchange=OnOff +return self +end +function SCORING:SetCoalitionChangePenalty(CoalitionChangePenalty) +self.CoalitionChangePenalty=CoalitionChangePenalty +return self +end +function SCORING:SetScoringMenu(ScoringGroup) +local Menu=MENU_GROUP:New(ScoringGroup,'Scoring and Statistics') +local ReportGroupSummary=MENU_GROUP_COMMAND:New(ScoringGroup,'Summary report players in group',Menu,SCORING.ReportScoreGroupSummary,self,ScoringGroup) +local ReportGroupDetailed=MENU_GROUP_COMMAND:New(ScoringGroup,'Detailed report players in group',Menu,SCORING.ReportScoreGroupDetailed,self,ScoringGroup) +local ReportToAllSummary=MENU_GROUP_COMMAND:New(ScoringGroup,'Summary report all players',Menu,SCORING.ReportScoreAllSummary,self,ScoringGroup) +self:SetState(ScoringGroup,"ScoringMenu",Menu) +return self +end +function SCORING:_AddPlayerFromUnit(UnitData) +self:F(UnitData) +if UnitData:IsAlive()then +local UnitName=UnitData:GetName() +local PlayerName=UnitData:GetPlayerName() +local UnitDesc=UnitData:GetDesc() +local UnitCategory=UnitDesc.category +local UnitCoalition=UnitData:GetCoalition() +local UnitTypeName=UnitData:GetTypeName() +local UnitThreatLevel,UnitThreatType=UnitData:GetThreatLevel() +self:T({PlayerName,UnitName,UnitCategory,UnitCoalition,UnitTypeName}) +if self.Players[PlayerName]==nil then +self.Players[PlayerName]={} +self.Players[PlayerName].Hit={} +self.Players[PlayerName].Destroy={} +self.Players[PlayerName].Goals={} +self.Players[PlayerName].Mission={} +self.Players[PlayerName].HitPlayers={} +self.Players[PlayerName].Score=0 +self.Players[PlayerName].Penalty=0 +self.Players[PlayerName].PenaltyCoalition=0 +self.Players[PlayerName].PenaltyWarning=0 +end +if not self.Players[PlayerName].UnitCoalition then +self.Players[PlayerName].UnitCoalition=UnitCoalition +else +if self.Players[PlayerName].UnitCoalition~=UnitCoalition and self.penaltyoncoalitionchange then +self.Players[PlayerName].Penalty=self.Players[PlayerName].Penalty+self.CoalitionChangePenalty or 50 +self.Players[PlayerName].PenaltyCoalition=self.Players[PlayerName].PenaltyCoalition+1 +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' changed coalition from ".._SCORINGCoalition[self.Players[PlayerName].UnitCoalition].." to ".._SCORINGCoalition[UnitCoalition].. +"(changed "..self.Players[PlayerName].PenaltyCoalition.." times the coalition). "..self.CoalitionChangePenalty.." penalty points added.", +MESSAGE.Type.Information +):ToAll() +self:ScoreCSV(PlayerName,"","COALITION_PENALTY",1,-1*self.CoalitionChangePenalty,self.Players[PlayerName].UnitName,_SCORINGCoalition[self.Players[PlayerName].UnitCoalition],_SCORINGCategory[self.Players[PlayerName].UnitCategory],self.Players[PlayerName].UnitType, +UnitName,_SCORINGCoalition[UnitCoalition],_SCORINGCategory[UnitCategory],UnitData:GetTypeName()) +end +end +self.Players[PlayerName].UnitName=UnitName +self.Players[PlayerName].UnitCoalition=UnitCoalition +self.Players[PlayerName].UnitCategory=UnitCategory +self.Players[PlayerName].UnitType=UnitTypeName +self.Players[PlayerName].UNIT=UnitData +self.Players[PlayerName].ThreatLevel=UnitThreatLevel +self.Players[PlayerName].ThreatType=UnitThreatType +if self.Players[PlayerName].Penalty>self.Fratricide*0.50 and self.penaltyonfratricide then +if self.Players[PlayerName].PenaltyWarning<1 then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."': WARNING! If you continue to commit FRATRICIDE and have a PENALTY score higher than "..self.Fratricide..", you will be COURT MARTIALED and DISMISSED from this mission! \nYour total penalty is: "..self.Players[PlayerName].Penalty, +MESSAGE.Type.Information) +:ToAll() +self.Players[PlayerName].PenaltyWarning=self.Players[PlayerName].PenaltyWarning+1 +end +end +if self.Players[PlayerName].Penalty>self.Fratricide and self.penaltyonfratricide then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' committed FRATRICIDE, he will be COURT MARTIALED and is DISMISSED from this mission!", +MESSAGE.Type.Information) +:ToAll() +UnitData:GetGroup():Destroy() +end +end +end +function SCORING:AddGoalScorePlayer(PlayerName,GoalTag,Text,Score) +self:F({PlayerName,PlayerName,GoalTag,Text,Score}) +if PlayerName then +local PlayerData=self.Players[PlayerName] +PlayerData.Goals[GoalTag]=PlayerData.Goals[GoalTag]or{Score=0} +PlayerData.Goals[GoalTag].Score=PlayerData.Goals[GoalTag].Score+Score +PlayerData.Score=PlayerData.Score+Score +if Text then +MESSAGE:NewType(self.DisplayMessagePrefix..Text, +MESSAGE.Type.Information) +:ToAll() +end +self:ScoreCSV(PlayerName,"","GOAL_"..string.upper(GoalTag),1,Score,nil) +end +end +function SCORING:AddGoalScore(PlayerUnit,GoalTag,Text,Score) +local PlayerName=PlayerUnit:GetPlayerName() +self:T2({PlayerUnit.UnitName,PlayerName,GoalTag,Text,Score}) +if PlayerName then +local PlayerData=self.Players[PlayerName] +PlayerData.Goals[GoalTag]=PlayerData.Goals[GoalTag]or{Score=0} +PlayerData.Goals[GoalTag].Score=PlayerData.Goals[GoalTag].Score+Score +PlayerData.Score=PlayerData.Score+Score +if Text then +MESSAGE:NewType(self.DisplayMessagePrefix..Text, +MESSAGE.Type.Information) +:ToAll() +end +self:ScoreCSV(PlayerName,"","GOAL_"..string.upper(GoalTag),1,Score,PlayerUnit:GetName()) +end +end +function SCORING:_AddMissionTaskScore(Mission,PlayerUnit,Text,Score) +local PlayerName=PlayerUnit:GetPlayerName() +local MissionName=Mission:GetName() +self:F({Mission:GetName(),PlayerUnit.UnitName,PlayerName,Text,Score}) +if PlayerName then +local PlayerData=self.Players[PlayerName] +if not PlayerData.Mission[MissionName]then +PlayerData.Mission[MissionName]={} +PlayerData.Mission[MissionName].ScoreTask=0 +PlayerData.Mission[MissionName].ScoreMission=0 +end +self:T(PlayerName) +self:T(PlayerData.Mission[MissionName]) +PlayerData.Score=self.Players[PlayerName].Score+Score +PlayerData.Mission[MissionName].ScoreTask=self.Players[PlayerName].Mission[MissionName].ScoreTask+Score +if Text then +MESSAGE:NewType(self.DisplayMessagePrefix..Mission:GetText().." : "..Text.." Score: "..Score, +MESSAGE.Type.Information) +:ToAll() +end +self:ScoreCSV(PlayerName,"","TASK_"..MissionName:gsub(' ','_'),1,Score,PlayerUnit:GetName()) +end +end +function SCORING:_AddMissionGoalScore(Mission,PlayerName,Text,Score) +local MissionName=Mission:GetName() +self:F({Mission:GetName(),PlayerName,Text,Score}) +if PlayerName then +local PlayerData=self.Players[PlayerName] +if not PlayerData.Mission[MissionName]then +PlayerData.Mission[MissionName]={} +PlayerData.Mission[MissionName].ScoreTask=0 +PlayerData.Mission[MissionName].ScoreMission=0 +end +self:T(PlayerName) +self:T(PlayerData.Mission[MissionName]) +PlayerData.Score=self.Players[PlayerName].Score+Score +PlayerData.Mission[MissionName].ScoreTask=self.Players[PlayerName].Mission[MissionName].ScoreTask+Score +if Text then +MESSAGE:NewType(string.format("%s%s: %s! Player %s receives %d score!",self.DisplayMessagePrefix,Mission:GetText(),Text,PlayerName,Score),MESSAGE.Type.Information):ToAll() +end +self:ScoreCSV(PlayerName,"","TASK_"..MissionName:gsub(' ','_'),1,Score) +end +end +function SCORING:_AddMissionScore(Mission,Text,Score) +local MissionName=Mission:GetName() +self:F({Mission,Text,Score}) +self:F(self.Players) +for PlayerName,PlayerData in pairs(self.Players)do +self:F(PlayerData) +if PlayerData.Mission[MissionName]then +PlayerData.Score=PlayerData.Score+Score +PlayerData.Mission[MissionName].ScoreMission=PlayerData.Mission[MissionName].ScoreMission+Score +if Text then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' has "..Text.." in "..Mission:GetText()..". "..Score.." mission score!", +MESSAGE.Type.Information) +:ToAll() +end +self:ScoreCSV(PlayerName,"","MISSION_"..MissionName:gsub(' ','_'),1,Score) +end +end +end +function SCORING:OnEventBirth(Event) +if Event.IniUnit then +Event.IniUnit.ThreatLevel,Event.IniUnit.ThreatType=Event.IniUnit:GetThreatLevel() +if Event.IniObjectCategory==1 then +local PlayerName=Event.IniUnit:GetPlayerName() +Event.IniUnit.BirthTime=timer.getTime() +if PlayerName then +self:_AddPlayerFromUnit(Event.IniUnit) +self.Players[PlayerName].PlayerKills=0 +self:SetScoringMenu(Event.IniGroup) +end +end +end +end +function SCORING:OnEventPlayerLeaveUnit(Event) +if Event.IniUnit then +local Menu=self:GetState(Event.IniUnit:GetGroup(),"ScoringMenu") +if Menu then +end +end +end +function SCORING:_EventOnHit(Event) +self:F({Event}) +local InitUnit=nil +local InitUNIT=nil +local InitUnitName="" +local InitGroup=nil +local InitGroupName="" +local InitPlayerName=nil +local InitCoalition=nil +local InitCategory=nil +local InitType=nil +local InitUnitCoalition=nil +local InitUnitCategory=nil +local InitUnitType=nil +local TargetUnit=nil +local TargetUNIT=nil +local TargetUnitName="" +local TargetGroup=nil +local TargetGroupName="" +local TargetPlayerName=nil +local TargetCoalition=nil +local TargetCategory=nil +local TargetType=nil +local TargetUnitCoalition=nil +local TargetUnitCategory=nil +local TargetUnitType=nil +local TargetIsScenery=false +if Event.IniDCSUnit then +InitUnit=Event.IniDCSUnit +InitUNIT=Event.IniUnit +InitUnitName=Event.IniDCSUnitName +InitGroup=Event.IniDCSGroup +InitGroupName=Event.IniDCSGroupName +InitPlayerName=Event.IniPlayerName +InitCoalition=Event.IniCoalition +InitCategory=Event.IniCategory +InitType=Event.IniTypeName +InitUnitCoalition=_SCORINGCoalition[InitCoalition] +InitUnitCategory=_SCORINGCategory[InitCategory] +InitUnitType=InitType +self:T({InitUnitName,InitGroupName,InitPlayerName,InitCoalition,InitCategory,InitType,InitUnitCoalition,InitUnitCategory,InitUnitType}) +end +if Event.TgtDCSUnit then +TargetUnit=Event.TgtDCSUnit +TargetUNIT=Event.TgtUnit +TargetUnitName=Event.TgtDCSUnitName +TargetGroup=Event.TgtDCSGroup +TargetGroupName=Event.TgtDCSGroupName +TargetPlayerName=Event.TgtPlayerName +TargetCoalition=Event.TgtCoalition +TargetCategory=Event.TgtCategory +TargetType=Event.TgtTypeName +if(not TargetCategory)and TargetUNIT~=nil and TargetUnit:IsInstanceOf("SCENERY")then +TargetCategory=Unit.Category.STRUCTURE +TargetIsScenery=true +end +TargetUnitCoalition=_SCORINGCoalition[TargetCoalition] +TargetUnitCategory=_SCORINGCategory[TargetCategory] +TargetUnitType=TargetType +self:T({TargetUnitName,TargetGroupName,TargetPlayerName,TargetCoalition,TargetCategory,TargetType,TargetUnitCoalition,TargetUnitCategory,TargetUnitType}) +end +if InitPlayerName~=nil then +self:_AddPlayerFromUnit(InitUNIT) +if self.Players[InitPlayerName]then +if TargetPlayerName~=nil then +self:_AddPlayerFromUnit(TargetUNIT) +end +self:T("Hitting Something") +if TargetCategory then +local Player=self.Players[InitPlayerName] +Player.Hit[TargetCategory]=Player.Hit[TargetCategory]or{} +Player.Hit[TargetCategory][TargetUnitName]=Player.Hit[TargetCategory][TargetUnitName]or{} +local PlayerHit=Player.Hit[TargetCategory][TargetUnitName] +PlayerHit.Score=PlayerHit.Score or 0 +PlayerHit.Penalty=PlayerHit.Penalty or 0 +PlayerHit.ScoreHit=PlayerHit.ScoreHit or 0 +PlayerHit.PenaltyHit=PlayerHit.PenaltyHit or 0 +PlayerHit.TimeStamp=PlayerHit.TimeStamp or 0 +PlayerHit.UNIT=PlayerHit.UNIT or TargetUNIT +if PlayerHit.UNIT.ThreatType==nil then +PlayerHit.ThreatLevel,PlayerHit.ThreatType=PlayerHit.UNIT:GetThreatLevel() +if PlayerHit.ThreatType==nil or PlayerHit.ThreatType==""then +PlayerHit.ThreatLevel=1 +PlayerHit.ThreatType="Unknown" +end +else +PlayerHit.ThreatLevel=PlayerHit.UNIT.ThreatLevel +PlayerHit.ThreatType=PlayerHit.UNIT.ThreatType +end +if timer.getTime()-PlayerHit.TimeStamp>1 then +PlayerHit.TimeStamp=timer.getTime() +if TargetPlayerName~=nil then +Player.HitPlayers[TargetPlayerName]=true +end +local Score=0 +if InitCoalition then +if InitCoalition==TargetCoalition then +local Penalty=10 +Player.Penalty=Player.Penalty+Penalty +PlayerHit.Penalty=PlayerHit.Penalty+Penalty +PlayerHit.PenaltyHit=PlayerHit.PenaltyHit+1 +if TargetPlayerName~=nil then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit friendly player '"..TargetPlayerName.."' "..TargetUnitCategory.." ( "..TargetType.." ) "..PlayerHit.PenaltyHit.." times. ".. +"Penalty: -"..Penalty..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +else +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit friendly target "..TargetUnitCategory.." ( "..TargetType.." ) "..PlayerHit.PenaltyHit.." times. ".. +"Penalty: -"..Penalty..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +end +self:ScoreCSV(InitPlayerName,TargetPlayerName,"HIT_PENALTY",1,-10,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +else +Player.Score=Player.Score+self.ScoreIncrementOnHit +PlayerHit.Score=PlayerHit.Score+self.ScoreIncrementOnHit +PlayerHit.ScoreHit=PlayerHit.ScoreHit+1 +if TargetPlayerName~=nil then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit enemy player '"..TargetPlayerName.."' "..TargetUnitCategory.." ( "..TargetType.." ) "..PlayerHit.ScoreHit.." times. ".. +"Score: "..PlayerHit.Score..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +elseif TargetIsScenery~=true then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit enemy target "..TargetUnitCategory.." ( "..TargetType.." ) "..PlayerHit.ScoreHit.." times. ".. +"Score: "..PlayerHit.Score..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +elseif TargetIsScenery==true then +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit scenery object.".." Score: "..PlayerHit.Score..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +end +self:ScoreCSV(InitPlayerName,TargetPlayerName,"HIT_SCORE",1,1,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +end +else +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..InitPlayerName.."' hit nothing special.", +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +self:ScoreCSV(InitPlayerName,"","HIT_SCORE",1,0,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,"","Scenery",TargetUnitType) +end +end +end +end +elseif InitPlayerName==nil then +end +if Event.WeaponPlayerName~=nil then +self:_AddPlayerFromUnit(Event.WeaponUNIT) +if self.Players[Event.WeaponPlayerName]then +if TargetPlayerName~=nil then +self:_AddPlayerFromUnit(TargetUNIT) +end +self:T("Hitting Scenery") +if TargetCategory then +local Player=self.Players[Event.WeaponPlayerName] +Player.Hit[TargetCategory]=Player.Hit[TargetCategory]or{} +Player.Hit[TargetCategory][TargetUnitName]=Player.Hit[TargetCategory][TargetUnitName]or{} +local PlayerHit=Player.Hit[TargetCategory][TargetUnitName] +PlayerHit.Score=PlayerHit.Score or 0 +PlayerHit.Penalty=PlayerHit.Penalty or 0 +PlayerHit.ScoreHit=PlayerHit.ScoreHit or 0 +PlayerHit.PenaltyHit=PlayerHit.PenaltyHit or 0 +PlayerHit.TimeStamp=PlayerHit.TimeStamp or 0 +PlayerHit.UNIT=PlayerHit.UNIT or TargetUNIT +if PlayerHit.UNIT.ThreatType==nil then +PlayerHit.ThreatLevel,PlayerHit.ThreatType=PlayerHit.UNIT:GetThreatLevel() +if PlayerHit.ThreatType==nil then +PlayerHit.ThreatLevel=1 +PlayerHit.ThreatType="Unknown" +end +else +PlayerHit.ThreatLevel=PlayerHit.UNIT.ThreatLevel +PlayerHit.ThreatType=PlayerHit.UNIT.ThreatType +end +if timer.getTime()-PlayerHit.TimeStamp>1 then +PlayerHit.TimeStamp=timer.getTime() +local Score=0 +if InitCoalition then +if InitCoalition==TargetCoalition then +local Penalty=10 +Player.Penalty=Player.Penalty+Penalty +PlayerHit.Penalty=PlayerHit.Penalty+Penalty +PlayerHit.PenaltyHit=PlayerHit.PenaltyHit+1*self.ScaleDestroyPenalty +MESSAGE +:NewType(self.DisplayMessagePrefix.."Player '"..Event.WeaponPlayerName.."' hit friendly target ".. +TargetUnitCategory.." ( "..TargetType.." ) ".. +"Penalty: -"..Penalty.." = "..Player.Score-Player.Penalty, +MESSAGE.Type.Update +) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(Event.WeaponCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +self:ScoreCSV(Event.WeaponPlayerName,TargetPlayerName,"HIT_PENALTY",1,-10,Event.WeaponName,Event.WeaponCoalition,Event.WeaponCategory,Event.WeaponTypeName,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +else +Player.Score=Player.Score+self.ScoreIncrementOnHit +PlayerHit.Score=PlayerHit.Score+self.ScoreIncrementOnHit +PlayerHit.ScoreHit=PlayerHit.ScoreHit+1 +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..Event.WeaponPlayerName.."' hit enemy target "..TargetUnitCategory.." ( "..TargetType.." ) ".. +"Score: "..PlayerHit.Score..". Score Total:"..Player.Score-Player.Penalty, +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(Event.WeaponCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +self:ScoreCSV(Event.WeaponPlayerName,TargetPlayerName,"HIT_SCORE",1,1,Event.WeaponName,Event.WeaponCoalition,Event.WeaponCategory,Event.WeaponTypeName,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +end +else +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..Event.WeaponPlayerName.."' hit scenery object.", +MESSAGE.Type.Update) +:ToAllIf(self:IfMessagesHit()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesHit()and self:IfMessagesToCoalition()) +self:ScoreCSV(Event.WeaponPlayerName,"","HIT_SCORE",1,0,Event.WeaponName,Event.WeaponCoalition,Event.WeaponCategory,Event.WeaponTypeName,TargetUnitName,"","Scenery",TargetUnitType) +end +end +end +end +end +end +function SCORING:_EventOnDeadOrCrash(Event) +self:F({Event}) +local TargetUnit=nil +local TargetGroup=nil +local TargetUnitName="" +local TargetGroupName="" +local TargetPlayerName="" +local TargetCoalition=nil +local TargetCategory=nil +local TargetType=nil +local TargetUnitCoalition=nil +local TargetUnitCategory=nil +local TargetUnitType=nil +if Event.IniDCSUnit then +TargetUnit=Event.IniUnit +TargetUnitName=Event.IniDCSUnitName +TargetGroup=Event.IniDCSGroup +TargetGroupName=Event.IniDCSGroupName +TargetPlayerName=Event.IniPlayerName +TargetCoalition=Event.IniCoalition +TargetCategory=Event.IniCategory +TargetType=Event.IniTypeName +TargetUnitCoalition=_SCORINGCoalition[TargetCoalition] +TargetUnitCategory=_SCORINGCategory[TargetCategory] +TargetUnitType=TargetType +self:T({TargetUnitName,TargetGroupName,TargetPlayerName,TargetCoalition,TargetCategory,TargetType}) +end +for PlayerName,Player in pairs(self.Players)do +if Player then +self:T("Something got destroyed") +local InitUnitName=Player.UnitName +local InitUnitType=Player.UnitType +local InitCoalition=Player.UnitCoalition +local InitCategory=Player.UnitCategory +local InitUnitCoalition=_SCORINGCoalition[InitCoalition] +local InitUnitCategory=_SCORINGCategory[InitCategory] +self:T({InitUnitName,InitUnitType,InitUnitCoalition,InitCoalition,InitUnitCategory,InitCategory}) +local Destroyed=false +if Player and Player.Hit and Player.Hit[TargetCategory]and Player.Hit[TargetCategory][TargetUnitName]and Player.Hit[TargetCategory][TargetUnitName].TimeStamp~=0 and(TargetUnit.BirthTime==nil or Player.Hit[TargetCategory][TargetUnitName].TimeStamp>TargetUnit.BirthTime)then +local TargetThreatLevel=Player.Hit[TargetCategory][TargetUnitName].ThreatLevel +local TargetThreatType=Player.Hit[TargetCategory][TargetUnitName].ThreatType +Player.Destroy[TargetCategory]=Player.Destroy[TargetCategory]or{} +Player.Destroy[TargetCategory][TargetType]=Player.Destroy[TargetCategory][TargetType]or{} +local TargetDestroy=Player.Destroy[TargetCategory][TargetType] +TargetDestroy.Score=TargetDestroy.Score or 0 +TargetDestroy.ScoreDestroy=TargetDestroy.ScoreDestroy or 0 +TargetDestroy.Penalty=TargetDestroy.Penalty or 0 +TargetDestroy.PenaltyDestroy=TargetDestroy.PenaltyDestroy or 0 +if TargetCoalition then +if InitCoalition==TargetCoalition then +local ThreatLevelTarget=TargetThreatLevel +local ThreatTypeTarget=TargetThreatType +local ThreatLevelPlayer=Player.ThreatLevel/10+1 +local ThreatPenalty=math.ceil((ThreatLevelTarget/ThreatLevelPlayer)*self.ScaleDestroyPenalty/10) +self:F({ThreatLevel=ThreatPenalty,ThreatLevelTarget=ThreatLevelTarget,ThreatTypeTarget=ThreatTypeTarget,ThreatLevelPlayer=ThreatLevelPlayer}) +Player.Penalty=Player.Penalty+ThreatPenalty +TargetDestroy.Penalty=TargetDestroy.Penalty+ThreatPenalty +TargetDestroy.PenaltyDestroy=TargetDestroy.PenaltyDestroy+1 +if Player.HitPlayers[TargetPlayerName]then +self:OnKillPvP(PlayerName,TargetPlayerName,true) +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' destroyed friendly player '"..TargetPlayerName.."' "..TargetUnitCategory.." ( "..ThreatTypeTarget.." ) ".. +"Penalty: -"..ThreatPenalty.." = "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesDestroy()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesDestroy()and self:IfMessagesToCoalition()) +else +self:OnKillPvE(PlayerName,TargetUnitName,true,TargetThreatLevel,Player.ThreatLevel,ThreatPenalty) +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' destroyed friendly target "..TargetUnitCategory.." ( "..ThreatTypeTarget.." ) ".. +"Penalty: -"..ThreatPenalty.." = "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesDestroy()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesDestroy()and self:IfMessagesToCoalition()) +end +self:ScoreCSV(PlayerName,TargetPlayerName,"DESTROY_PENALTY",1,ThreatPenalty,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +Destroyed=true +else +local ThreatLevelTarget=TargetThreatLevel +local ThreatTypeTarget=TargetThreatType +local ThreatLevelPlayer=Player.ThreatLevel/10+1 +local ThreatScore=math.ceil((ThreatLevelTarget/ThreatLevelPlayer)*self.ScaleDestroyScore/10) +self:F({ThreatLevel=ThreatScore,ThreatLevelTarget=ThreatLevelTarget,ThreatTypeTarget=ThreatTypeTarget,ThreatLevelPlayer=ThreatLevelPlayer}) +Player.Score=Player.Score+ThreatScore +TargetDestroy.Score=TargetDestroy.Score+ThreatScore +TargetDestroy.ScoreDestroy=TargetDestroy.ScoreDestroy+1 +if Player.HitPlayers[TargetPlayerName]then +if Player.PlayerKills~=nil then +Player.PlayerKills=Player.PlayerKills+1 +else +Player.PlayerKills=1 +end +self:OnKillPvP(PlayerName,TargetPlayerName,false,TargetThreatLevel,Player.ThreatLevel,ThreatScore) +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' destroyed enemy player '"..TargetPlayerName.."' "..TargetUnitCategory.." ( "..ThreatTypeTarget.." ) ".. +"Score: +"..ThreatScore.." = "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesDestroy()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesDestroy()and self:IfMessagesToCoalition()) +else +self:OnKillPvE(PlayerName,TargetUnitName,false,TargetThreatLevel,Player.ThreatLevel,ThreatScore) +MESSAGE:NewType(self.DisplayMessagePrefix.."Player '"..PlayerName.."' destroyed enemy "..TargetUnitCategory.." ( "..ThreatTypeTarget.." ) ".. +"Score: +"..ThreatScore.." = "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesDestroy()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesDestroy()and self:IfMessagesToCoalition()) +end +self:ScoreCSV(PlayerName,TargetPlayerName,"DESTROY_SCORE",1,ThreatScore,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +Destroyed=true +local UnitName=TargetUnit:GetName() +local Score=self.ScoringObjects[UnitName] +if Score then +Player.Score=Player.Score+Score +TargetDestroy.Score=TargetDestroy.Score+Score +MESSAGE:NewType(self.DisplayMessagePrefix.."Special target '"..TargetUnitCategory.." ( "..ThreatTypeTarget.." ) ".." destroyed! ".. +"Player '"..PlayerName.."' receives an extra "..Score.." points! Total: "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesScore()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesScore()and self:IfMessagesToCoalition()) +self:ScoreCSV(PlayerName,TargetPlayerName,"DESTROY_SCORE",1,Score,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +Destroyed=true +end +for ZoneName,ScoreZoneData in pairs(self.ScoringZones)do +self:F({ScoringZone=ScoreZoneData}) +local ScoreZone=ScoreZoneData.ScoreZone +local Score=ScoreZoneData.Score +if ScoreZone:IsVec2InZone(TargetUnit:GetVec2())then +Player.Score=Player.Score+Score +TargetDestroy.Score=TargetDestroy.Score+Score +MESSAGE:NewType(self.DisplayMessagePrefix.."Target destroyed in zone '"..ScoreZone:GetName().."'.".. +"Player '"..PlayerName.."' receives an extra "..Score.." points! ".."Total: "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesZone()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesZone()and self:IfMessagesToCoalition()) +self:ScoreCSV(PlayerName,TargetPlayerName,"DESTROY_SCORE",1,Score,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +Destroyed=true +end +end +end +else +for ZoneName,ScoreZoneData in pairs(self.ScoringZones)do +self:F({ScoringZone=ScoreZoneData}) +local ScoreZone=ScoreZoneData.ScoreZone +local Score=ScoreZoneData.Score +if ScoreZone:IsVec2InZone(TargetUnit:GetVec2())then +Player.Score=Player.Score+Score +TargetDestroy.Score=TargetDestroy.Score+Score +MESSAGE:NewType(self.DisplayMessagePrefix.."Scenery destroyed in zone '"..ScoreZone:GetName().."'.".. +"Player '"..PlayerName.."' receives an extra "..Score.." points! ".."Total: "..Player.Score-Player.Penalty, +MESSAGE.Type.Information) +:ToAllIf(self:IfMessagesZone()and self:IfMessagesToAll()) +:ToCoalitionIf(InitCoalition,self:IfMessagesZone()and self:IfMessagesToCoalition()) +self:ScoreCSV(PlayerName,"","DESTROY_SCORE",1,Score,InitUnitName,InitUnitCoalition,InitUnitCategory,InitUnitType,TargetUnitName,"","Scenery",TargetUnitType) +Destroyed=true +end +end +end +if Destroyed then +Player.Hit[TargetCategory][TargetUnitName].TimeStamp=0 +end +end +end +end +end +function SCORING:ReportDetailedPlayerHits(PlayerName) +local ScoreMessage="" +local PlayerScore=0 +local PlayerPenalty=0 +local PlayerData=self.Players[PlayerName] +if PlayerData then +self:T("Score Player: "..PlayerName) +local InitUnitCoalition=_SCORINGCoalition[PlayerData.UnitCoalition] +local InitUnitCategory=_SCORINGCategory[PlayerData.UnitCategory] +local InitUnitType=PlayerData.UnitType +local InitUnitName=PlayerData.UnitName +local ScoreMessageHits="" +for CategoryID,CategoryName in pairs(_SCORINGCategory)do +self:T(CategoryName) +if PlayerData.Hit[CategoryID]then +self:T("Hit scores exist for player "..PlayerName) +local Score=0 +local ScoreHit=0 +local Penalty=0 +local PenaltyHit=0 +for UnitName,UnitData in pairs(PlayerData.Hit[CategoryID])do +Score=Score+UnitData.Score +ScoreHit=ScoreHit+UnitData.ScoreHit +Penalty=Penalty+UnitData.Penalty +PenaltyHit=UnitData.PenaltyHit +end +local ScoreMessageHit=string.format("%s: %d ",CategoryName,Score-Penalty) +self:T(ScoreMessageHit) +ScoreMessageHits=ScoreMessageHits..ScoreMessageHit +PlayerScore=PlayerScore+Score +PlayerPenalty=PlayerPenalty+Penalty +else +end +end +if ScoreMessageHits~=""then +ScoreMessage="Hits: "..ScoreMessageHits +end +end +return ScoreMessage,PlayerScore,PlayerPenalty +end +function SCORING:ReportDetailedPlayerDestroys(PlayerName) +local ScoreMessage="" +local PlayerScore=0 +local PlayerPenalty=0 +local PlayerData=self.Players[PlayerName] +if PlayerData then +self:T("Score Player: "..PlayerName) +local InitUnitCoalition=_SCORINGCoalition[PlayerData.UnitCoalition] +local InitUnitCategory=_SCORINGCategory[PlayerData.UnitCategory] +local InitUnitType=PlayerData.UnitType +local InitUnitName=PlayerData.UnitName +local ScoreMessageDestroys="" +for CategoryID,CategoryName in pairs(_SCORINGCategory)do +if PlayerData.Destroy[CategoryID]then +self:T("Destroy scores exist for player "..PlayerName) +local Score=0 +local ScoreDestroy=0 +local Penalty=0 +local PenaltyDestroy=0 +for UnitName,UnitData in pairs(PlayerData.Destroy[CategoryID])do +self:F({UnitData=UnitData}) +if UnitData~={}then +Score=Score+UnitData.Score +ScoreDestroy=ScoreDestroy+UnitData.ScoreDestroy +Penalty=Penalty+UnitData.Penalty +PenaltyDestroy=PenaltyDestroy+UnitData.PenaltyDestroy +end +end +local ScoreMessageDestroy=string.format(" %s: %d ",CategoryName,Score-Penalty) +self:T(ScoreMessageDestroy) +ScoreMessageDestroys=ScoreMessageDestroys..ScoreMessageDestroy +PlayerScore=PlayerScore+Score +PlayerPenalty=PlayerPenalty+Penalty +else +end +end +if ScoreMessageDestroys~=""then +ScoreMessage="Destroys: "..ScoreMessageDestroys +end +end +return ScoreMessage,PlayerScore,PlayerPenalty +end +function SCORING:ReportDetailedPlayerCoalitionChanges(PlayerName) +local ScoreMessage="" +local PlayerScore=0 +local PlayerPenalty=0 +local PlayerData=self.Players[PlayerName] +if PlayerData then +self:T("Score Player: "..PlayerName) +local InitUnitCoalition=_SCORINGCoalition[PlayerData.UnitCoalition] +local InitUnitCategory=_SCORINGCategory[PlayerData.UnitCategory] +local InitUnitType=PlayerData.UnitType +local InitUnitName=PlayerData.UnitName +local ScoreMessageCoalitionChangePenalties="" +if PlayerData.PenaltyCoalition~=0 then +ScoreMessageCoalitionChangePenalties=ScoreMessageCoalitionChangePenalties..string.format(" -%d (%d changed)",PlayerData.Penalty,PlayerData.PenaltyCoalition) +PlayerPenalty=PlayerPenalty+PlayerData.Penalty +end +if ScoreMessageCoalitionChangePenalties~=""then +ScoreMessage=ScoreMessage.."Coalition Penalties: "..ScoreMessageCoalitionChangePenalties +end +end +return ScoreMessage,PlayerScore,PlayerPenalty +end +function SCORING:ReportDetailedPlayerGoals(PlayerName) +local ScoreMessage="" +local PlayerScore=0 +local PlayerPenalty=0 +local PlayerData=self.Players[PlayerName] +if PlayerData then +self:T("Score Player: "..PlayerName) +local InitUnitCoalition=_SCORINGCoalition[PlayerData.UnitCoalition] +local InitUnitCategory=_SCORINGCategory[PlayerData.UnitCategory] +local InitUnitType=PlayerData.UnitType +local InitUnitName=PlayerData.UnitName +local ScoreMessageGoal="" +local ScoreGoal=0 +local ScoreTask=0 +for GoalName,GoalData in pairs(PlayerData.Goals)do +ScoreGoal=ScoreGoal+GoalData.Score +ScoreMessageGoal=ScoreMessageGoal.."'"..GoalName.."':"..GoalData.Score.."; " +end +PlayerScore=PlayerScore+ScoreGoal +if ScoreMessageGoal~=""then +ScoreMessage="Goals: "..ScoreMessageGoal +end +end +return ScoreMessage,PlayerScore,PlayerPenalty +end +function SCORING:ReportDetailedPlayerMissions(PlayerName) +local ScoreMessage="" +local PlayerScore=0 +local PlayerPenalty=0 +local PlayerData=self.Players[PlayerName] +if PlayerData then +self:T("Score Player: "..PlayerName) +local InitUnitCoalition=_SCORINGCoalition[PlayerData.UnitCoalition] +local InitUnitCategory=_SCORINGCategory[PlayerData.UnitCategory] +local InitUnitType=PlayerData.UnitType +local InitUnitName=PlayerData.UnitName +local ScoreMessageMission="" +local ScoreMission=0 +local ScoreTask=0 +for MissionName,MissionData in pairs(PlayerData.Mission)do +ScoreMission=ScoreMission+MissionData.ScoreMission +ScoreTask=ScoreTask+MissionData.ScoreTask +ScoreMessageMission=ScoreMessageMission.."'"..MissionName.."'; " +end +PlayerScore=PlayerScore+ScoreMission+ScoreTask +if ScoreMessageMission~=""then +ScoreMessage="Tasks: "..ScoreTask.." Mission: "..ScoreMission.." ( "..ScoreMessageMission..")" +end +end +return ScoreMessage,PlayerScore,PlayerPenalty +end +function SCORING:ReportScoreGroupSummary(PlayerGroup) +local PlayerMessage="" +self:T("Report Score Group Summary") +local PlayerUnits=PlayerGroup:GetUnits() +for UnitID,PlayerUnit in pairs(PlayerUnits)do +local PlayerUnit=PlayerUnit +local PlayerName=PlayerUnit:GetPlayerName() +if PlayerName then +local ReportHits,ScoreHits,PenaltyHits=self:ReportDetailedPlayerHits(PlayerName) +ReportHits=ReportHits~=""and"\n- "..ReportHits or ReportHits +self:F({ReportHits,ScoreHits,PenaltyHits}) +local ReportDestroys,ScoreDestroys,PenaltyDestroys=self:ReportDetailedPlayerDestroys(PlayerName) +ReportDestroys=ReportDestroys~=""and"\n- "..ReportDestroys or ReportDestroys +self:F({ReportDestroys,ScoreDestroys,PenaltyDestroys}) +local ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges=self:ReportDetailedPlayerCoalitionChanges(PlayerName) +ReportCoalitionChanges=ReportCoalitionChanges~=""and"\n- "..ReportCoalitionChanges or ReportCoalitionChanges +self:F({ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges}) +local ReportGoals,ScoreGoals,PenaltyGoals=self:ReportDetailedPlayerGoals(PlayerName) +ReportGoals=ReportGoals~=""and"\n- "..ReportGoals or ReportGoals +self:F({ReportGoals,ScoreGoals,PenaltyGoals}) +local ReportMissions,ScoreMissions,PenaltyMissions=self:ReportDetailedPlayerMissions(PlayerName) +ReportMissions=ReportMissions~=""and"\n- "..ReportMissions or ReportMissions +self:F({ReportMissions,ScoreMissions,PenaltyMissions}) +local PlayerScore=ScoreHits+ScoreDestroys+ScoreCoalitionChanges+ScoreGoals+ScoreMissions +local PlayerPenalty=PenaltyHits+PenaltyDestroys+PenaltyCoalitionChanges+PenaltyGoals+PenaltyMissions +PlayerMessage=string.format("Player '%s' Score = %d ( %d Score, -%d Penalties )", +PlayerName, +PlayerScore-PlayerPenalty, +PlayerScore, +PlayerPenalty +) +MESSAGE:NewType(PlayerMessage,MESSAGE.Type.Detailed):ToGroup(PlayerGroup) +end +end +end +function SCORING:ReportScoreGroupDetailed(PlayerGroup) +local PlayerMessage="" +self:T("Report Score Group Detailed") +local PlayerUnits=PlayerGroup:GetUnits() +for UnitID,PlayerUnit in pairs(PlayerUnits)do +local PlayerUnit=PlayerUnit +local PlayerName=PlayerUnit:GetPlayerName() +if PlayerName then +local ReportHits,ScoreHits,PenaltyHits=self:ReportDetailedPlayerHits(PlayerName) +ReportHits=ReportHits~=""and"\n- "..ReportHits or ReportHits +self:F({ReportHits,ScoreHits,PenaltyHits}) +local ReportDestroys,ScoreDestroys,PenaltyDestroys=self:ReportDetailedPlayerDestroys(PlayerName) +ReportDestroys=ReportDestroys~=""and"\n- "..ReportDestroys or ReportDestroys +self:F({ReportDestroys,ScoreDestroys,PenaltyDestroys}) +local ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges=self:ReportDetailedPlayerCoalitionChanges(PlayerName) +ReportCoalitionChanges=ReportCoalitionChanges~=""and"\n- "..ReportCoalitionChanges or ReportCoalitionChanges +self:F({ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges}) +local ReportGoals,ScoreGoals,PenaltyGoals=self:ReportDetailedPlayerGoals(PlayerName) +ReportGoals=ReportGoals~=""and"\n- "..ReportGoals or ReportGoals +self:F({ReportGoals,ScoreGoals,PenaltyGoals}) +local ReportMissions,ScoreMissions,PenaltyMissions=self:ReportDetailedPlayerMissions(PlayerName) +ReportMissions=ReportMissions~=""and"\n- "..ReportMissions or ReportMissions +self:F({ReportMissions,ScoreMissions,PenaltyMissions}) +local PlayerScore=ScoreHits+ScoreDestroys+ScoreCoalitionChanges+ScoreGoals+ScoreMissions +local PlayerPenalty=PenaltyHits+PenaltyDestroys+PenaltyCoalitionChanges+PenaltyGoals+PenaltyMissions +PlayerMessage= +string.format("Player '%s' Score = %d ( %d Score, -%d Penalties )%s%s%s%s%s", +PlayerName, +PlayerScore-PlayerPenalty, +PlayerScore, +PlayerPenalty, +ReportHits, +ReportDestroys, +ReportCoalitionChanges, +ReportGoals, +ReportMissions +) +MESSAGE:NewType(PlayerMessage,MESSAGE.Type.Detailed):ToGroup(PlayerGroup) +end +end +end +function SCORING:ReportScoreAllSummary(PlayerGroup) +local PlayerMessage="" +self:T({"Summary Score Report of All Players",Players=self.Players}) +for PlayerName,PlayerData in pairs(self.Players)do +self:T({PlayerName=PlayerName,PlayerGroup=PlayerGroup}) +if PlayerName then +local ReportHits,ScoreHits,PenaltyHits=self:ReportDetailedPlayerHits(PlayerName) +ReportHits=ReportHits~=""and"\n- "..ReportHits or ReportHits +self:F({ReportHits,ScoreHits,PenaltyHits}) +local ReportDestroys,ScoreDestroys,PenaltyDestroys=self:ReportDetailedPlayerDestroys(PlayerName) +ReportDestroys=ReportDestroys~=""and"\n- "..ReportDestroys or ReportDestroys +self:F({ReportDestroys,ScoreDestroys,PenaltyDestroys}) +local ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges=self:ReportDetailedPlayerCoalitionChanges(PlayerName) +ReportCoalitionChanges=ReportCoalitionChanges~=""and"\n- "..ReportCoalitionChanges or ReportCoalitionChanges +self:F({ReportCoalitionChanges,ScoreCoalitionChanges,PenaltyCoalitionChanges}) +local ReportGoals,ScoreGoals,PenaltyGoals=self:ReportDetailedPlayerGoals(PlayerName) +ReportGoals=ReportGoals~=""and"\n- "..ReportGoals or ReportGoals +self:F({ReportGoals,ScoreGoals,PenaltyGoals}) +local ReportMissions,ScoreMissions,PenaltyMissions=self:ReportDetailedPlayerMissions(PlayerName) +ReportMissions=ReportMissions~=""and"\n- "..ReportMissions or ReportMissions +self:F({ReportMissions,ScoreMissions,PenaltyMissions}) +local PlayerScore=ScoreHits+ScoreDestroys+ScoreCoalitionChanges+ScoreGoals+ScoreMissions +local PlayerPenalty=PenaltyHits+PenaltyDestroys+PenaltyCoalitionChanges+PenaltyGoals+PenaltyMissions +PlayerMessage= +string.format("Player '%s' Score = %d ( %d Score, -%d Penalties )", +PlayerName, +PlayerScore-PlayerPenalty, +PlayerScore, +PlayerPenalty +) +MESSAGE:NewType(PlayerMessage,MESSAGE.Type.Overview):ToGroup(PlayerGroup) +end +end +end +function SCORING:SecondsToClock(sSeconds) +local nSeconds=sSeconds +if nSeconds==0 then +return"00:00:00"; +else +local nHours=string.format("%02.f",math.floor(nSeconds/3600)); +local nMins=string.format("%02.f",math.floor(nSeconds/60-(nHours*60))); +local nSecs=string.format("%02.f",math.floor(nSeconds-nHours*3600-nMins*60)); +return nHours..":"..nMins..":"..nSecs +end +end +function SCORING:OpenCSV(ScoringCSV) +self:F(ScoringCSV) +if lfs and io and os and self.AutoSave==true then +if ScoringCSV then +self.ScoringCSV=ScoringCSV +local path=self.AutoSavePath or lfs.writedir()..[[Logs\]] +local fdir=path..self.ScoringCSV.." "..os.date("%Y-%m-%d %H-%M-%S")..".csv" +self.CSVFile,self.err=io.open(fdir,"w+") +if not self.CSVFile then +error("Error: Cannot open CSV file in "..lfs.writedir()) +end +self.CSVFile:write('"GameName","RunTime","Time","PlayerName","TargetPlayerName","ScoreType","PlayerUnitCoalition","PlayerUnitCategory","PlayerUnitType","PlayerUnitName","TargetUnitCoalition","TargetUnitCategory","TargetUnitType","TargetUnitName","Times","Score"\n') +self.RunTime=os.date("%y-%m-%d_%H-%M-%S") +else +error("A string containing the CSV file name must be given.") +end +else +self:F("The MissionScripting.lua file has not been changed to allow lfs, io and os modules to be used...") +end +return self +end +function SCORING:ScoreCSV(PlayerName,TargetPlayerName,ScoreType,ScoreTimes,ScoreAmount,PlayerUnitName,PlayerUnitCoalition,PlayerUnitCategory,PlayerUnitType,TargetUnitName,TargetUnitCoalition,TargetUnitCategory,TargetUnitType) +local ScoreTime=self:SecondsToClock(timer.getTime()) +PlayerName=PlayerName:gsub('"','_') +TargetPlayerName=TargetPlayerName or"" +TargetPlayerName=TargetPlayerName:gsub('"','_') +if PlayerUnitName and PlayerUnitName~=''then +local PlayerUnit=Unit.getByName(PlayerUnitName) +if PlayerUnit then +if not PlayerUnitCategory then +PlayerUnitCategory=_SCORINGCategory[PlayerUnit:getDesc().category] +end +if not PlayerUnitCoalition then +PlayerUnitCoalition=_SCORINGCoalition[PlayerUnit:getCoalition()] +end +if not PlayerUnitType then +PlayerUnitType=PlayerUnit:getTypeName() +end +else +PlayerUnitName='' +PlayerUnitCategory='' +PlayerUnitCoalition='' +PlayerUnitType='' +end +else +PlayerUnitName='' +PlayerUnitCategory='' +PlayerUnitCoalition='' +PlayerUnitType='' +end +TargetUnitCoalition=TargetUnitCoalition or"" +TargetUnitCategory=TargetUnitCategory or"" +TargetUnitType=TargetUnitType or"" +TargetUnitName=TargetUnitName or"" +if lfs and io and os and self.AutoSave==true and self.CSVFile~=nil then +self.CSVFile:write( +'"'..self.GameName..'"'..','.. +'"'..self.RunTime..'"'..','.. +''..ScoreTime..''..','.. +'"'..PlayerName..'"'..','.. +'"'..TargetPlayerName..'"'..','.. +'"'..ScoreType..'"'..','.. +'"'..PlayerUnitCoalition..'"'..','.. +'"'..PlayerUnitCategory..'"'..','.. +'"'..PlayerUnitType..'"'..','.. +'"'..PlayerUnitName..'"'..','.. +'"'..TargetUnitCoalition..'"'..','.. +'"'..TargetUnitCategory..'"'..','.. +'"'..TargetUnitType..'"'..','.. +'"'..TargetUnitName..'"'..','.. +''..ScoreTimes..''..','.. +''..ScoreAmount +) +self.CSVFile:write("\n") +end +end +function SCORING:CloseCSV() +if lfs and io and os and self.AutoSave then +self.CSVFile:close() +end +end +function SCORING:SwitchAutoSave(OnOff) +self.AutoSave=OnOff +return self +end +function SCORING:OnKillPvP(PlayerName,TargetPlayerName,IsTeamKill,TargetThreatLevel,PlayerThreatLevel,Score) +end +function SCORING:OnKillPvE(PlayerName,TargetUnitName,IsTeamKill,TargetThreatLevel,PlayerThreatLevel,Score) +end +CLEANUP_AIRBASE={ +ClassName="CLEANUP_AIRBASE", +TimeInterval=0.2, +CleanUpList={}, +} +CLEANUP_AIRBASE.__={} +CLEANUP_AIRBASE.__.Airbases={} +function CLEANUP_AIRBASE:New(AirbaseNames) +local self=BASE:Inherit(self,BASE:New()) +self:F({AirbaseNames}) +if type(AirbaseNames)=='table'then +for AirbaseID,AirbaseName in pairs(AirbaseNames)do +self:AddAirbase(AirbaseName) +end +else +local AirbaseName=AirbaseNames +self:AddAirbase(AirbaseName) +end +self:HandleEvent(EVENTS.Birth,self.__.OnEventBirth) +self.__.CleanUpScheduler=SCHEDULER:New(self,self.__.CleanUpSchedule,{},1,self.TimeInterval) +self:HandleEvent(EVENTS.EngineShutdown,self.__.EventAddForCleanUp) +self:HandleEvent(EVENTS.EngineStartup,self.__.EventAddForCleanUp) +self:HandleEvent(EVENTS.Hit,self.__.EventAddForCleanUp) +self:HandleEvent(EVENTS.PilotDead,self.__.OnEventCrash) +self:HandleEvent(EVENTS.Dead,self.__.OnEventCrash) +self:HandleEvent(EVENTS.Crash,self.__.OnEventCrash) +for UnitName,Unit in pairs(_DATABASE.UNITS)do +local Unit=Unit +if Unit:IsAlive()~=nil then +if self:IsInAirbase(Unit:GetVec2())then +self:F({UnitName=UnitName}) +self.CleanUpList[UnitName]={} +self.CleanUpList[UnitName].CleanUpUnit=Unit +self.CleanUpList[UnitName].CleanUpGroup=Unit:GetGroup() +self.CleanUpList[UnitName].CleanUpGroupName=Unit:GetGroup():GetName() +self.CleanUpList[UnitName].CleanUpUnitName=Unit:GetName() +end +end +end +return self +end +function CLEANUP_AIRBASE:AddAirbase(AirbaseName) +self.__.Airbases[AirbaseName]=AIRBASE:FindByName(AirbaseName) +self:F({"Airbase:",AirbaseName,self.__.Airbases[AirbaseName]:GetDesc()}) +return self +end +function CLEANUP_AIRBASE:RemoveAirbase(AirbaseName) +self.__.Airbases[AirbaseName]=nil +return self +end +function CLEANUP_AIRBASE:SetCleanMissiles(CleanMissiles) +if CleanMissiles then +self:HandleEvent(EVENTS.Shot,self.__.OnEventShot) +else +self:UnHandleEvent(EVENTS.Shot) +end +end +function CLEANUP_AIRBASE.__:IsInAirbase(Vec2) +local InAirbase=false +for AirbaseName,Airbase in pairs(self.__.Airbases)do +local Airbase=Airbase +if Airbase:GetZone():IsVec2InZone(Vec2)then +InAirbase=true +break; +end +end +return InAirbase +end +function CLEANUP_AIRBASE.__:DestroyUnit(CleanUpUnit) +self:F({CleanUpUnit}) +if CleanUpUnit then +local CleanUpUnitName=CleanUpUnit:GetName() +local CleanUpGroup=CleanUpUnit:GetGroup() +if CleanUpGroup:IsAlive()then +local CleanUpGroupUnits=CleanUpGroup:GetUnits() +if#CleanUpGroupUnits==1 then +local CleanUpGroupName=CleanUpGroup:GetName() +CleanUpGroup:Destroy() +else +CleanUpUnit:Destroy() +end +self.CleanUpList[CleanUpUnitName]=nil +end +end +end +function CLEANUP_AIRBASE.__:DestroyMissile(MissileObject) +self:F({MissileObject}) +if MissileObject and MissileObject:isExist()then +MissileObject:destroy() +self:T("MissileObject Destroyed") +end +end +function CLEANUP_AIRBASE.__:OnEventBirth(EventData) +self:F({EventData}) +if EventData and EventData.IniUnit and EventData.IniUnit:IsAlive()~=nil then +if self:IsInAirbase(EventData.IniUnit:GetVec2())then +self.CleanUpList[EventData.IniDCSUnitName]={} +self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnit=EventData.IniUnit +self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroup=EventData.IniGroup +self.CleanUpList[EventData.IniDCSUnitName].CleanUpGroupName=EventData.IniDCSGroupName +self.CleanUpList[EventData.IniDCSUnitName].CleanUpUnitName=EventData.IniDCSUnitName +end +end +end +function CLEANUP_AIRBASE.__:OnEventCrash(Event) +self:F({Event}) +if Event.IniDCSUnitName and Event.IniCategory==Object.Category.UNIT then +self.CleanUpList[Event.IniDCSUnitName]={} +self.CleanUpList[Event.IniDCSUnitName].CleanUpUnit=Event.IniUnit +self.CleanUpList[Event.IniDCSUnitName].CleanUpGroup=Event.IniGroup +self.CleanUpList[Event.IniDCSUnitName].CleanUpGroupName=Event.IniDCSGroupName +self.CleanUpList[Event.IniDCSUnitName].CleanUpUnitName=Event.IniDCSUnitName +end +end +function CLEANUP_AIRBASE.__:OnEventShot(Event) +self:F({Event}) +if self:IsInAirbase(Event.IniUnit:GetVec2())then +self:DestroyMissile(Event.Weapon) +end +end +function CLEANUP_AIRBASE.__:OnEventHit(Event) +self:F({Event}) +if Event.IniUnit then +if self:IsInAirbase(Event.IniUnit:GetVec2())then +self:T({"Life: ",Event.IniDCSUnitName,' = ',Event.IniUnit:GetLife(),"/",Event.IniUnit:GetLife0()}) +if Event.IniUnit:GetLife()<Event.IniUnit:GetLife0()then +self:T("CleanUp: Destroy: "..Event.IniDCSUnitName) +CLEANUP_AIRBASE.__:DestroyUnit(Event.IniUnit) +end +end +end +if Event.TgtUnit then +if self:IsInAirbase(Event.TgtUnit:GetVec2())then +self:T({"Life: ",Event.TgtDCSUnitName,' = ',Event.TgtUnit:GetLife(),"/",Event.TgtUnit:GetLife0()}) +if Event.TgtUnit:GetLife()<Event.TgtUnit:GetLife0()then +self:T("CleanUp: Destroy: "..Event.TgtDCSUnitName) +CLEANUP_AIRBASE.__:DestroyUnit(Event.TgtUnit) +end +end +end +end +function CLEANUP_AIRBASE.__:AddForCleanUp(CleanUpUnit,CleanUpUnitName) +self:F({CleanUpUnit,CleanUpUnitName}) +self.CleanUpList[CleanUpUnitName]={} +self.CleanUpList[CleanUpUnitName].CleanUpUnit=CleanUpUnit +self.CleanUpList[CleanUpUnitName].CleanUpUnitName=CleanUpUnitName +local CleanUpGroup=CleanUpUnit:GetGroup() +self.CleanUpList[CleanUpUnitName].CleanUpGroup=CleanUpGroup +self.CleanUpList[CleanUpUnitName].CleanUpGroupName=CleanUpGroup:GetName() +self.CleanUpList[CleanUpUnitName].CleanUpTime=timer.getTime() +self.CleanUpList[CleanUpUnitName].CleanUpMoved=false +self:T({"CleanUp: Add to CleanUpList: ",CleanUpGroup:GetName(),CleanUpUnitName}) +end +function CLEANUP_AIRBASE.__:EventAddForCleanUp(Event) +self:F({Event}) +if Event.IniDCSUnit and Event.IniUnit and Event.IniCategory==Object.Category.UNIT then +if self.CleanUpList[Event.IniDCSUnitName]==nil then +if self:IsInAirbase(Event.IniUnit:GetVec2())then +self:AddForCleanUp(Event.IniUnit,Event.IniDCSUnitName) +end +end +end +if Event.TgtDCSUnit and Event.TgtUnit and Event.TgtCategory==Object.Category.UNIT then +if self.CleanUpList[Event.TgtDCSUnitName]==nil then +if self:IsInAirbase(Event.TgtUnit:GetVec2())then +self:AddForCleanUp(Event.TgtUnit,Event.TgtDCSUnitName) +end +end +end +end +function CLEANUP_AIRBASE.__:CleanUpSchedule() +local CleanUpCount=0 +for CleanUpUnitName,CleanUpListData in pairs(self.CleanUpList)do +CleanUpCount=CleanUpCount+1 +local CleanUpUnit=CleanUpListData.CleanUpUnit +local CleanUpGroupName=CleanUpListData.CleanUpGroupName +if CleanUpUnit and CleanUpUnit:IsAlive()~=nil then +if self:IsInAirbase(CleanUpUnit:GetVec2())then +if _DATABASE:GetStatusGroup(CleanUpGroupName)~="ReSpawn"then +local CleanUpCoordinate=CleanUpUnit:GetCoordinate() +self:T({"CleanUp Scheduler",CleanUpUnitName}) +if CleanUpUnit:GetLife()<=CleanUpUnit:GetLife0()*0.95 then +if CleanUpUnit:IsAboveRunway()then +if CleanUpUnit:InAir()then +local CleanUpLandHeight=CleanUpCoordinate:GetLandHeight() +local CleanUpUnitHeight=CleanUpCoordinate.y-CleanUpLandHeight +if CleanUpUnitHeight<100 then +self:T({"CleanUp Scheduler","Destroy "..CleanUpUnitName.." because below safe height and damaged."}) +self:DestroyUnit(CleanUpUnit) +end +else +self:T({"CleanUp Scheduler","Destroy "..CleanUpUnitName.." because on runway and damaged."}) +self:DestroyUnit(CleanUpUnit) +end +end +end +if CleanUpUnit and(CleanUpUnit.GetPlayerName==nil or not CleanUpUnit:GetPlayerName())then +local CleanUpUnitVelocity=CleanUpUnit:GetVelocityKMH() +if CleanUpUnitVelocity<1 then +if CleanUpListData.CleanUpMoved then +if CleanUpListData.CleanUpTime+180<=timer.getTime()then +self:T({"CleanUp Scheduler","Destroy due to not moving anymore "..CleanUpUnitName}) +self:DestroyUnit(CleanUpUnit) +end +end +else +CleanUpListData.CleanUpTime=timer.getTime() +CleanUpListData.CleanUpMoved=true +end +end +else +self.CleanUpList[CleanUpUnitName]=nil +end +else +self.CleanUpList[CleanUpUnitName]=nil +end +else +self:T("CleanUp: Group "..CleanUpUnitName.." cannot be found in DCS RTE, removing ...") +self.CleanUpList[CleanUpUnitName]=nil +end +end +self:T(CleanUpCount) +return true +end +MOVEMENT={ +ClassName="MOVEMENT", +} +function MOVEMENT:New(MovePrefixes,MoveMaximum) +local self=BASE:Inherit(self,BASE:New()) +self:F({MovePrefixes,MoveMaximum}) +if type(MovePrefixes)=='table'then +self.MovePrefixes=MovePrefixes +else +self.MovePrefixes={MovePrefixes} +end +self.MoveCount=0 +self.MoveMaximum=MoveMaximum +self.AliveUnits=0 +self.MoveUnits={} +self:HandleEvent(EVENTS.Birth) +self:ScheduleStart() +return self +end +function MOVEMENT:ScheduleStart() +self:F() +self.MoveFunction=SCHEDULER:New(self,self._Scheduler,{},1,120) +end +function MOVEMENT:ScheduleStop() +self:F() +end +function MOVEMENT:OnEventBirth(EventData) +self:F({EventData}) +if timer.getTime0()<timer.getAbsTime()then +if EventData.IniDCSUnit then +self:T("Birth object : "..EventData.IniDCSUnitName) +if EventData.IniDCSGroup and EventData.IniDCSGroup:isExist()then +for MovePrefixID,MovePrefix in pairs(self.MovePrefixes)do +if string.find(EventData.IniDCSUnitName,MovePrefix,1,true)then +self.AliveUnits=self.AliveUnits+1 +self.MoveUnits[EventData.IniDCSUnitName]=EventData.IniDCSGroupName +self:T(self.AliveUnits) +end +end +end +end +EventData.IniUnit:HandleEvent(EVENTS.DEAD,self.OnDeadOrCrash) +end +end +function MOVEMENT:OnDeadOrCrash(Event) +self:F({Event}) +if Event.IniDCSUnit then +self:T("Dead object : "..Event.IniDCSUnitName) +for MovePrefixID,MovePrefix in pairs(self.MovePrefixes)do +if string.find(Event.IniDCSUnitName,MovePrefix,1,true)then +self.AliveUnits=self.AliveUnits-1 +self.MoveUnits[Event.IniDCSUnitName]=nil +self:T(self.AliveUnits) +end +end +end +end +function MOVEMENT:_Scheduler() +self:F({self.MovePrefixes,self.MoveMaximum,self.AliveUnits,self.MovementGroups}) +if self.AliveUnits>0 then +local MoveProbability=(self.MoveMaximum*100)/self.AliveUnits +self:T('Move Probability = '..MoveProbability) +for MovementUnitName,MovementGroupName in pairs(self.MoveUnits)do +local MovementGroup=Group.getByName(MovementGroupName) +if MovementGroup and MovementGroup:isExist()then +local MoveOrStop=math.random(1,100) +self:T('MoveOrStop = '..MoveOrStop) +if MoveOrStop<=MoveProbability then +self:T('Group continues moving = '..MovementGroupName) +trigger.action.groupContinueMoving(MovementGroup) +else +self:T('Group stops moving = '..MovementGroupName) +trigger.action.groupStopMoving(MovementGroup) +end +else +self.MoveUnits[MovementUnitName]=nil +end +end +end +return true +end +SEAD={ +ClassName="SEAD", +TargetSkill={ +Average={Evade=30,DelayOn={40,60}}, +Good={Evade=20,DelayOn={30,50}}, +High={Evade=15,DelayOn={20,40}}, +Excellent={Evade=10,DelayOn={10,30}} +}, +SEADGroupPrefixes={}, +SuppressedGroups={}, +EngagementRange=75, +Padding=15, +CallBack=nil, +UseCallBack=false, +debug=false, +WeaponTrack=false, +} +SEAD.Harms={ +["AGM_88"]="AGM_88", +["AGM_122"]="AGM_122", +["AGM_84"]="AGM_84", +["AGM_45"]="AGM_45", +["AGM_65"]="AGM_65", +["ALARM"]="ALARM", +["LD-10"]="LD-10", +["X_58"]="X_58", +["X_28"]="X_28", +["X_25"]="X_25", +["X_31"]="X_31", +["Kh25"]="Kh25", +["BGM_109"]="BGM_109", +["AGM_154"]="AGM_154", +["HY-2"]="HY-2", +["ADM_141A"]="ADM_141A", +} +SEAD.HarmData={ +["AGM_88"]={150,3}, +["AGM_45"]={12,2}, +["AGM_65"]={16,0.9}, +["AGM_122"]={16.5,2.3}, +["AGM_84"]={280,0.8}, +["ALARM"]={45,2}, +["LD-10"]={60,4}, +["X_58"]={70,4}, +["X_28"]={80,2.5}, +["X_25"]={25,0.76}, +["X_31"]={150,3}, +["Kh25"]={25,0.8}, +["BGM_109"]={460,0.705}, +["AGM_154"]={130,0.61}, +["HY-2"]={90,1}, +["ADM_141A"]={126,0.6}, +} +function SEAD:New(SEADGroupPrefixes,Padding) +local self=BASE:Inherit(self,FSM:New()) +self:T(SEADGroupPrefixes) +if type(SEADGroupPrefixes)=='table'then +for SEADGroupPrefixID,SEADGroupPrefix in pairs(SEADGroupPrefixes)do +self.SEADGroupPrefixes[SEADGroupPrefix]=SEADGroupPrefix +end +else +self.SEADGroupPrefixes[SEADGroupPrefixes]=SEADGroupPrefixes +end +local padding=Padding or 10 +if padding<10 then padding=10 end +self.Padding=padding +self.UseEmissionsOnOff=true +self.debug=false +self.CallBack=nil +self.UseCallBack=false +self:HandleEvent(EVENTS.Shot,self.HandleEventShot) +self:SetStartState("Running") +self:AddTransition("*","ManageEvasion","*") +self:AddTransition("*","CalculateHitZone","*") +self:I("*** SEAD - Started Version 0.4.9") +return self +end +function SEAD:UpdateSet(SEADGroupPrefixes) +self:T(SEADGroupPrefixes) +if type(SEADGroupPrefixes)=='table'then +for SEADGroupPrefixID,SEADGroupPrefix in pairs(SEADGroupPrefixes)do +self.SEADGroupPrefixes[SEADGroupPrefix]=SEADGroupPrefix +end +else +self.SEADGroupPrefixes[SEADGroupPrefixes]=SEADGroupPrefixes +end +return self +end +function SEAD:SetEngagementRange(range) +self:T({range}) +range=range or 75 +if range<0 or range>100 then +range=75 +end +self.EngagementRange=range +self:T(string.format("*** SEAD - Engagement range set to %s",range)) +return self +end +function SEAD:SetPadding(Padding) +self:T({Padding}) +local padding=Padding or 10 +if padding<10 then padding=10 end +self.Padding=padding +return self +end +function SEAD:SwitchEmissions(Switch) +self:T({Switch}) +self.UseEmissionsOnOff=Switch +return self +end +function SEAD:AddCallBack(Object) +self:T({Class=Object.ClassName}) +self.CallBack=Object +self.UseCallBack=true +return self +end +function SEAD:_CheckHarms(WeaponName) +self:T({WeaponName}) +local hit=false +local name="" +for _,_name in pairs(SEAD.Harms)do +if string.find(WeaponName,_name,1,true)then +hit=true +name=_name +break +end +end +return hit,name +end +function SEAD:_GetDistance(_point1,_point2) +self:T("_GetDistance") +if _point1 and _point2 then +local distance1=_point1:Get2DDistance(_point2) +local distance2=_point1:DistanceFromPointVec2(_point2) +if distance1 and type(distance1)=="number"then +return distance1 +elseif distance2 and type(distance2)=="number"then +return distance2 +else +self:E("*****Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +else +self:E("******Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +end +function SEAD:onafterCalculateHitZone(From,Event,To,SEADWeapon,pos0,height,SEADGroup,SEADWeaponName) +self:T("**** Calculating hit zone for "..(SEADWeaponName or"None")) +if SEADWeapon and SEADWeapon:isExist()then +local position=SEADWeapon:getPosition() +local mheight=height +local wph=math.atan2(position.x.z,position.x.x) +if wph<0 then +wph=wph+2*math.pi +end +wph=math.deg(wph) +local wpndata=SEAD.HarmData["AGM_88"] +if string.find(SEADWeaponName,"154",1)then +wpndata=SEAD.HarmData["AGM_154"] +end +local mveloc=math.floor(wpndata[2]*340.29) +local c1=(2*mheight*9.81)/(mveloc^2) +local c2=(mveloc^2)/9.81 +local Ropt=c2*math.sqrt(c1+1) +if height<=5000 then +Ropt=Ropt*0.72 +elseif height<=7500 then +Ropt=Ropt*0.82 +elseif height<=10000 then +Ropt=Ropt*0.87 +elseif height<=12500 then +Ropt=Ropt*0.98 +end +for n=1,3 do +local dist=Ropt-((n-1)*20000) +local predpos=pos0:Translate(dist,wph) +if predpos then +local targetzone=ZONE_RADIUS:New("Target Zone",predpos:GetVec2(),20000) +if self.debug then +predpos:MarkToAll(string.format("height=%dm | heading=%d | velocity=%ddeg | Ropt=%dm",mheight,wph,mveloc,Ropt),false) +targetzone:DrawZone(coalition.side.BLUE,{0,0,1},0.2,nil,nil,3,true) +end +local seadset=SET_GROUP:New():FilterPrefixes(self.SEADGroupPrefixes):FilterZones({targetzone}):FilterOnce() +local tgtgrp=seadset:GetRandom() +local _targetgroup=nil +local _targetgroupname="none" +local _targetskill="Random" +if tgtgrp and tgtgrp:IsAlive()then +_targetgroup=tgtgrp +_targetgroupname=tgtgrp:GetName() +_targetskill=tgtgrp:GetUnit(1):GetSkill() +self:T("*** Found Target = ".._targetgroupname) +self:ManageEvasion(_targetskill,_targetgroup,pos0,"AGM_88",SEADGroup,20) +end +end +end +end +return self +end +function SEAD:onafterManageEvasion(From,Event,To,_targetskill,_targetgroup,SEADPlanePos,SEADWeaponName,SEADGroup,timeoffset,Weapon) +local timeoffset=timeoffset or 0 +if _targetskill=="Random"then +local Skills={"Average","Good","High","Excellent"} +_targetskill=Skills[math.random(1,4)] +end +if self.TargetSkill[_targetskill]then +local _evade=math.random(1,100) +if(_evade>self.TargetSkill[_targetskill].Evade)then +self:T("*** SEAD - Evading") +local _targetpos=_targetgroup:GetCoordinate() +local _distance=self:_GetDistance(SEADPlanePos,_targetpos) +local hit,data=self:_CheckHarms(SEADWeaponName) +local wpnspeed=666 +local reach=10 +if hit then +local wpndata=SEAD.HarmData[data] +reach=wpndata[1]*1.1 +local mach=wpndata[2] +wpnspeed=math.floor(mach*340.29) +if Weapon and Weapon:GetSpeed()>0 then +wpnspeed=Weapon:GetSpeed() +self:T(string.format("*** SEAD - Weapon Speed from WEAPON: %f m/s",wpnspeed)) +end +end +local _tti=math.floor(_distance/wpnspeed)-timeoffset +if _distance>0 then +_distance=math.floor(_distance/1000) +else +_distance=0 +end +self:T(string.format("*** SEAD - target skill %s, distance %dkm, reach %dkm, tti %dsec",_targetskill,_distance,reach,_tti)) +if reach>=_distance then +self:T("*** SEAD - Shot in Reach") +local function SuppressionStart(args) +self:T(string.format("*** SEAD - %s Radar Off & Relocating",args[2])) +local grp=args[1] +local name=args[2] +local attacker=args[3] +if self.UseEmissionsOnOff then +grp:EnableEmission(false) +end +grp:OptionAlarmStateGreen() +grp:RelocateGroundRandomInRadius(20,300,false,false,"Diamond",true) +if self.UseCallBack then +local object=self.CallBack +object:SeadSuppressionStart(grp,name,attacker) +end +end +local function SuppressionStop(args) +self:T(string.format("*** SEAD - %s Radar On",args[2])) +local grp=args[1] +local name=args[2] +if self.UseEmissionsOnOff then +grp:EnableEmission(true) +end +grp:OptionAlarmStateRed() +grp:OptionEngageRange(self.EngagementRange) +self.SuppressedGroups[name]=false +if self.UseCallBack then +local object=self.CallBack +object:SeadSuppressionEnd(grp,name) +end +end +local delay=math.random(self.TargetSkill[_targetskill].DelayOn[1],self.TargetSkill[_targetskill].DelayOn[2]) +if delay>_tti then delay=delay/2 end +if _tti>600 then delay=_tti-90 end +local SuppressionStartTime=timer.getTime()+delay +local SuppressionEndTime=timer.getTime()+delay+_tti+self.Padding+delay +local _targetgroupname=_targetgroup:GetName() +if not self.SuppressedGroups[_targetgroupname]then +self:T(string.format("*** SEAD - %s | Parameters TTI %ds | Switch-Off in %ds",_targetgroupname,_tti,delay)) +timer.scheduleFunction(SuppressionStart,{_targetgroup,_targetgroupname,SEADGroup},SuppressionStartTime) +timer.scheduleFunction(SuppressionStop,{_targetgroup,_targetgroupname},SuppressionEndTime) +self.SuppressedGroups[_targetgroupname]=true +if self.UseCallBack then +local object=self.CallBack +object:SeadSuppressionPlanned(_targetgroup,_targetgroupname,SuppressionStartTime,SuppressionEndTime,SEADGroup) +end +end +end +end +end +return self +end +function SEAD:HandleEventShot(EventData) +self:T({EventData.id}) +local SEADWeapon=EventData.Weapon +local SEADWeaponName=EventData.WeaponName or"None" +if self:_CheckHarms(SEADWeaponName)then +local SEADPlane=EventData.IniUnit +if not SEADPlane then return self end +local SEADGroup=EventData.IniGroup +local SEADPlanePos=SEADPlane:GetCoordinate() +local SEADUnit=EventData.IniDCSUnit +local SEADUnitName=EventData.IniDCSUnitName +local WeaponWrapper=WEAPON:New(EventData.Weapon) +self:T("*** SEAD - Missile Launched = "..SEADWeaponName) +self:T('*** SEAD - Weapon Match') +if self.WeaponTrack==true then +WeaponWrapper:SetFuncTrack(function(weapon)env.info(string.format("*** Weapon Speed: %d m/s",weapon:GetSpeed()or-1))end) +WeaponWrapper:StartTrack(0.1) +WeaponWrapper:StopTrack(30) +end +local _targetskill="Random" +local _targetgroupname="none" +local _target=EventData.Weapon:getTarget() +if not _target or self.debug then +self:E("***** SEAD - No target data for "..(SEADWeaponName or"None")) +if string.find(SEADWeaponName,"AGM_88",1,true)or string.find(SEADWeaponName,"AGM_154",1,true)then +self:T("**** Tracking AGM-88/154 with no target data.") +local pos0=SEADPlane:GetCoordinate() +local fheight=SEADPlane:GetHeight() +self:__CalculateHitZone(20,SEADWeapon,pos0,fheight,SEADGroup,SEADWeaponName) +end +return self +end +local targetcat=Object.getCategory(_target) +local _targetUnit=nil +local _targetgroup=nil +self:T(string.format("*** Targetcat = %d",targetcat)) +if targetcat==Object.Category.UNIT then +self:T("*** Target Category UNIT") +_targetUnit=UNIT:Find(_target) +if _targetUnit and _targetUnit:IsAlive()then +_targetgroup=_targetUnit:GetGroup() +_targetgroupname=_targetgroup:GetName() +local _targetUnitName=_targetUnit:GetName() +_targetUnit:GetSkill() +_targetskill=_targetUnit:GetSkill() +end +elseif targetcat==Object.Category.STATIC then +self:T("*** Target Category STATIC") +local seadset=SET_GROUP:New():FilterPrefixes(self.SEADGroupPrefixes):FilterOnce() +local targetpoint=_target:getPoint()or{x=0,y=0,z=0} +local tgtcoord=COORDINATE:NewFromVec3(targetpoint) +local tgtgrp=seadset:FindNearestGroupFromPointVec2(tgtcoord) +if tgtgrp and tgtgrp:IsAlive()then +_targetgroup=tgtgrp +_targetgroupname=tgtgrp:GetName() +_targetskill=tgtgrp:GetUnit(1):GetSkill() +self:T("*** Found Target = ".._targetgroupname) +end +end +local SEADGroupFound=false +for SEADGroupPrefixID,SEADGroupPrefix in pairs(self.SEADGroupPrefixes)do +self:T("Target = ".._targetgroupname.." | Prefix = "..SEADGroupPrefix) +if string.find(_targetgroupname,SEADGroupPrefix,1,true)then +SEADGroupFound=true +self:T('*** SEAD - Group Match Found') +break +end +end +if SEADGroupFound==true then +if string.find(SEADWeaponName,"ADM_141",1,true)then +self:__ManageEvasion(2,_targetskill,_targetgroup,SEADPlanePos,SEADWeaponName,SEADGroup,2,WeaponWrapper) +else +self:ManageEvasion(_targetskill,_targetgroup,SEADPlanePos,SEADWeaponName,SEADGroup,0,WeaponWrapper) +end +end +end +return self +end +ESCORT={ +ClassName="ESCORT", +EscortName=nil, +EscortClient=nil, +EscortGroup=nil, +EscortMode=1, +MODE={ +FOLLOW=1, +MISSION=2, +}, +Targets={}, +FollowScheduler=nil, +ReportTargets=true, +OptionROE=AI.Option.Air.val.ROE.OPEN_FIRE, +OptionReactionOnThreat=AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, +SmokeDirectionVector=false, +TaskPoints={} +} +function ESCORT:New(EscortClient,EscortGroup,EscortName,EscortBriefing) +local self=BASE:Inherit(self,BASE:New()) +self:F({EscortClient,EscortGroup,EscortName}) +self.EscortClient=EscortClient +self.EscortGroup=EscortGroup +self.EscortName=EscortName +self.EscortBriefing=EscortBriefing +self.EscortSetGroup=SET_GROUP:New() +self.EscortSetGroup:AddObject(self.EscortGroup) +self.EscortSetGroup:Flush() +self.Detection=DETECTION_UNITS:New(self.EscortSetGroup,15000) +self.EscortGroup.Detection=self.Detection +if not self.EscortClient._EscortGroups then +self.EscortClient._EscortGroups={} +end +if not self.EscortClient._EscortGroups[EscortGroup:GetName()]then +self.EscortClient._EscortGroups[EscortGroup:GetName()]={} +self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortGroup=self.EscortGroup +self.EscortClient._EscortGroups[EscortGroup:GetName()].EscortName=self.EscortName +self.EscortClient._EscortGroups[EscortGroup:GetName()].Detection=self.EscortGroup.Detection +end +self.EscortMenu=MENU_GROUP:New(self.EscortClient:GetGroup(),self.EscortName) +self.EscortGroup:WayPointInitialize(1) +self.EscortGroup:OptionROTVertical() +self.EscortGroup:OptionROEOpenFire() +if not EscortBriefing then +EscortGroup:MessageToClient(EscortGroup:GetCategoryName().." '"..EscortName.."' ("..EscortGroup:GetCallsign()..") reporting! ".. +"We're escorting your flight. ".. +"Use the Radio Menu and F10 and use the options under + "..EscortName.."\n", +60,EscortClient +) +else +EscortGroup:MessageToClient(EscortGroup:GetCategoryName().." '"..EscortName.."' ("..EscortGroup:GetCallsign()..") "..EscortBriefing, +60,EscortClient +) +end +self.FollowDistance=100 +self.CT1=0 +self.GT1=0 +self.FollowScheduler,self.FollowSchedule=SCHEDULER:New(self,self._FollowScheduler,{},1,.5,.01) +self.FollowScheduler:Stop(self.FollowSchedule) +self.EscortMode=ESCORT.MODE.MISSION +return self +end +function ESCORT:SetDetection(Detection) +self.Detection=Detection +self.EscortGroup.Detection=self.Detection +self.EscortClient._EscortGroups[self.EscortGroup:GetName()].Detection=self.EscortGroup.Detection +Detection:__Start(1) +end +function ESCORT:TestSmokeDirectionVector(SmokeDirection) +self.SmokeDirectionVector=(SmokeDirection==true)and true or false +end +function ESCORT:Menus() +self:F() +self:MenuFollowAt(100) +self:MenuFollowAt(200) +self:MenuFollowAt(300) +self:MenuFollowAt(400) +self:MenuScanForTargets(100,60) +self:MenuHoldAtEscortPosition(30) +self:MenuHoldAtLeaderPosition(30) +self:MenuFlare() +self:MenuSmoke() +self:MenuReportTargets(60) +self:MenuAssistedAttack() +self:MenuROE() +self:MenuEvasion() +self:MenuResumeMission() +return self +end +function ESCORT:MenuFollowAt(Distance) +self:F(Distance) +if self.EscortGroup:IsAir()then +if not self.EscortMenuReportNavigation then +self.EscortMenuReportNavigation=MENU_GROUP:New(self.EscortClient:GetGroup(),"Navigation",self.EscortMenu) +end +if not self.EscortMenuJoinUpAndFollow then +self.EscortMenuJoinUpAndFollow={} +end +self.EscortMenuJoinUpAndFollow[#self.EscortMenuJoinUpAndFollow+1]=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Join-Up and Follow at "..Distance,self.EscortMenuReportNavigation,ESCORT._JoinUpAndFollow,self,Distance) +self.EscortMode=ESCORT.MODE.FOLLOW +end +return self +end +function ESCORT:MenuHoldAtEscortPosition(Height,Seconds,MenuTextFormat) +self:F({Height,Seconds,MenuTextFormat}) +if self.EscortGroup:IsAir()then +if not self.EscortMenuHold then +self.EscortMenuHold=MENU_GROUP:New(self.EscortClient:GetGroup(),"Hold position",self.EscortMenu) +end +if not Height then +Height=30 +end +if not Seconds then +Seconds=0 +end +local MenuText="" +if not MenuTextFormat then +if Seconds==0 then +MenuText=string.format("Hold at %d meter",Height) +else +MenuText=string.format("Hold at %d meter for %d seconds",Height,Seconds) +end +else +if Seconds==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Seconds) +end +end +if not self.EscortMenuHoldPosition then +self.EscortMenuHoldPosition={} +end +self.EscortMenuHoldPosition[#self.EscortMenuHoldPosition+1]=MENU_GROUP_COMMAND +:New( +self.EscortClient:GetGroup(), +MenuText, +self.EscortMenuHold, +ESCORT._HoldPosition, +self, +self.EscortGroup, +Height, +Seconds +) +end +return self +end +function ESCORT:MenuHoldAtLeaderPosition(Height,Seconds,MenuTextFormat) +self:F({Height,Seconds,MenuTextFormat}) +if self.EscortGroup:IsAir()then +if not self.EscortMenuHold then +self.EscortMenuHold=MENU_GROUP:New(self.EscortClient:GetGroup(),"Hold position",self.EscortMenu) +end +if not Height then +Height=30 +end +if not Seconds then +Seconds=0 +end +local MenuText="" +if not MenuTextFormat then +if Seconds==0 then +MenuText=string.format("Rejoin and hold at %d meter",Height) +else +MenuText=string.format("Rejoin and hold at %d meter for %d seconds",Height,Seconds) +end +else +if Seconds==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Seconds) +end +end +if not self.EscortMenuHoldAtLeaderPosition then +self.EscortMenuHoldAtLeaderPosition={} +end +self.EscortMenuHoldAtLeaderPosition[#self.EscortMenuHoldAtLeaderPosition+1]=MENU_GROUP_COMMAND +:New( +self.EscortClient:GetGroup(), +MenuText, +self.EscortMenuHold, +ESCORT._HoldPosition, +{ParamSelf=self, +ParamOrbitGroup=self.EscortClient, +ParamHeight=Height, +ParamSeconds=Seconds +} +) +end +return self +end +function ESCORT:MenuScanForTargets(Height,Seconds,MenuTextFormat) +self:F({Height,Seconds,MenuTextFormat}) +if self.EscortGroup:IsAir()then +if not self.EscortMenuScan then +self.EscortMenuScan=MENU_GROUP:New(self.EscortClient:GetGroup(),"Scan for targets",self.EscortMenu) +end +if not Height then +Height=100 +end +if not Seconds then +Seconds=30 +end +local MenuText="" +if not MenuTextFormat then +if Seconds==0 then +MenuText=string.format("At %d meter",Height) +else +MenuText=string.format("At %d meter for %d seconds",Height,Seconds) +end +else +if Seconds==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Seconds) +end +end +if not self.EscortMenuScanForTargets then +self.EscortMenuScanForTargets={} +end +self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1]=MENU_GROUP_COMMAND +:New( +self.EscortClient:GetGroup(), +MenuText, +self.EscortMenuScan, +ESCORT._ScanTargets, +self, +30 +) +end +return self +end +function ESCORT:MenuFlare(MenuTextFormat) +self:F() +if not self.EscortMenuReportNavigation then +self.EscortMenuReportNavigation=MENU_GROUP:New(self.EscortClient:GetGroup(),"Navigation",self.EscortMenu) +end +local MenuText="" +if not MenuTextFormat then +MenuText="Flare" +else +MenuText=MenuTextFormat +end +if not self.EscortMenuFlare then +self.EscortMenuFlare=MENU_GROUP:New(self.EscortClient:GetGroup(),MenuText,self.EscortMenuReportNavigation,ESCORT._Flare,self) +self.EscortMenuFlareGreen=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release green flare",self.EscortMenuFlare,ESCORT._Flare,self,FLARECOLOR.Green,"Released a green flare!") +self.EscortMenuFlareRed=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release red flare",self.EscortMenuFlare,ESCORT._Flare,self,FLARECOLOR.Red,"Released a red flare!") +self.EscortMenuFlareWhite=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release white flare",self.EscortMenuFlare,ESCORT._Flare,self,FLARECOLOR.White,"Released a white flare!") +self.EscortMenuFlareYellow=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release yellow flare",self.EscortMenuFlare,ESCORT._Flare,self,FLARECOLOR.Yellow,"Released a yellow flare!") +end +return self +end +function ESCORT:MenuSmoke(MenuTextFormat) +self:F() +if not self.EscortGroup:IsAir()then +if not self.EscortMenuReportNavigation then +self.EscortMenuReportNavigation=MENU_GROUP:New(self.EscortClient:GetGroup(),"Navigation",self.EscortMenu) +end +local MenuText="" +if not MenuTextFormat then +MenuText="Smoke" +else +MenuText=MenuTextFormat +end +if not self.EscortMenuSmoke then +self.EscortMenuSmoke=MENU_GROUP:New(self.EscortClient:GetGroup(),"Smoke",self.EscortMenuReportNavigation,ESCORT._Smoke,self) +self.EscortMenuSmokeGreen=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release green smoke",self.EscortMenuSmoke,ESCORT._Smoke,self,SMOKECOLOR.Green,"Releasing green smoke!") +self.EscortMenuSmokeRed=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release red smoke",self.EscortMenuSmoke,ESCORT._Smoke,self,SMOKECOLOR.Red,"Releasing red smoke!") +self.EscortMenuSmokeWhite=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release white smoke",self.EscortMenuSmoke,ESCORT._Smoke,self,SMOKECOLOR.White,"Releasing white smoke!") +self.EscortMenuSmokeOrange=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release orange smoke",self.EscortMenuSmoke,ESCORT._Smoke,self,SMOKECOLOR.Orange,"Releasing orange smoke!") +self.EscortMenuSmokeBlue=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Release blue smoke",self.EscortMenuSmoke,ESCORT._Smoke,self,SMOKECOLOR.Blue,"Releasing blue smoke!") +end +end +return self +end +function ESCORT:MenuReportTargets(Seconds) +self:F({Seconds}) +if not self.EscortMenuReportNearbyTargets then +self.EscortMenuReportNearbyTargets=MENU_GROUP:New(self.EscortClient:GetGroup(),"Report targets",self.EscortMenu) +end +if not Seconds then +Seconds=30 +end +self.EscortMenuReportNearbyTargetsNow=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Report targets now!",self.EscortMenuReportNearbyTargets,ESCORT._ReportNearbyTargetsNow,self) +self.EscortMenuReportNearbyTargetsOn=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Report targets on",self.EscortMenuReportNearbyTargets,ESCORT._SwitchReportNearbyTargets,self,true) +self.EscortMenuReportNearbyTargetsOff=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Report targets off",self.EscortMenuReportNearbyTargets,ESCORT._SwitchReportNearbyTargets,self,false) +self.EscortMenuAttackNearbyTargets=MENU_GROUP:New(self.EscortClient:GetGroup(),"Attack targets",self.EscortMenu) +self.ReportTargetsScheduler,self.ReportTargetsSchedulerID=SCHEDULER:New(self,self._ReportTargetsScheduler,{},1,Seconds) +return self +end +function ESCORT:MenuAssistedAttack() +self:F() +self.EscortMenuTargetAssistance=MENU_GROUP:New(self.EscortClient:GetGroup(),"Request assistance from",self.EscortMenu) +return self +end +function ESCORT:MenuROE(MenuTextFormat) +self:F(MenuTextFormat) +if not self.EscortMenuROE then +self.EscortMenuROE=MENU_GROUP:New(self.EscortClient:GetGroup(),"ROE",self.EscortMenu) +if self.EscortGroup:OptionROEHoldFirePossible()then +self.EscortMenuROEHoldFire=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Hold Fire",self.EscortMenuROE,ESCORT._ROE,self,self.EscortGroup:OptionROEHoldFire(),"Holding weapons!") +end +if self.EscortGroup:OptionROEReturnFirePossible()then +self.EscortMenuROEReturnFire=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Return Fire",self.EscortMenuROE,ESCORT._ROE,self,self.EscortGroup:OptionROEReturnFire(),"Returning fire!") +end +if self.EscortGroup:OptionROEOpenFirePossible()then +self.EscortMenuROEOpenFire=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Open Fire",self.EscortMenuROE,ESCORT._ROE,self,self.EscortGroup:OptionROEOpenFire(),"Opening fire on designated targets!!") +end +if self.EscortGroup:OptionROEWeaponFreePossible()then +self.EscortMenuROEWeaponFree=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Weapon Free",self.EscortMenuROE,ESCORT._ROE,self,self.EscortGroup:OptionROEWeaponFree(),"Opening fire on targets of opportunity!") +end +end +return self +end +function ESCORT:MenuEvasion(MenuTextFormat) +self:F(MenuTextFormat) +if self.EscortGroup:IsAir()then +if not self.EscortMenuEvasion then +self.EscortMenuEvasion=MENU_GROUP:New(self.EscortClient:GetGroup(),"Evasion",self.EscortMenu) +if self.EscortGroup:OptionROTNoReactionPossible()then +self.EscortMenuEvasionNoReaction=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Fight until death",self.EscortMenuEvasion,ESCORT._ROT,self,self.EscortGroup:OptionROTNoReaction(),"Fighting until death!") +end +if self.EscortGroup:OptionROTPassiveDefensePossible()then +self.EscortMenuEvasionPassiveDefense=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Use flares, chaff and jammers",self.EscortMenuEvasion,ESCORT._ROT,self,self.EscortGroup:OptionROTPassiveDefense(),"Defending using jammers, chaff and flares!") +end +if self.EscortGroup:OptionROTEvadeFirePossible()then +self.EscortMenuEvasionEvadeFire=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Evade enemy fire",self.EscortMenuEvasion,ESCORT._ROT,self,self.EscortGroup:OptionROTEvadeFire(),"Evading on enemy fire!") +end +if self.EscortGroup:OptionROTVerticalPossible()then +self.EscortMenuOptionEvasionVertical=MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(),"Go below radar and evade fire",self.EscortMenuEvasion,ESCORT._ROT,self,self.EscortGroup:OptionROTVertical(),"Evading on enemy fire with vertical manoeuvres!") +end +end +end +return self +end +function ESCORT:MenuResumeMission() +self:F() +if not self.EscortMenuResumeMission then +self.EscortMenuResumeMission=MENU_GROUP:New(self.EscortClient:GetGroup(),"Resume mission from",self.EscortMenu) +end +return self +end +function ESCORT:_HoldPosition(OrbitGroup,OrbitHeight,OrbitSeconds) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +local OrbitUnit=OrbitGroup:GetUnit(1) +self.FollowScheduler:Stop(self.FollowSchedule) +local PointFrom={} +local GroupVec3=EscortGroup:GetUnit(1):GetVec3() +PointFrom={} +PointFrom.x=GroupVec3.x +PointFrom.y=GroupVec3.z +PointFrom.speed=250 +PointFrom.type=AI.Task.WaypointType.TURNING_POINT +PointFrom.alt=GroupVec3.y +PointFrom.alt_type=AI.Task.AltitudeType.BARO +local OrbitPoint=OrbitUnit:GetVec2() +local PointTo={} +PointTo.x=OrbitPoint.x +PointTo.y=OrbitPoint.y +PointTo.speed=250 +PointTo.type=AI.Task.WaypointType.TURNING_POINT +PointTo.alt=OrbitHeight +PointTo.alt_type=AI.Task.AltitudeType.BARO +PointTo.task=EscortGroup:TaskOrbitCircleAtVec2(OrbitPoint,OrbitHeight,0) +local Points={PointFrom,PointTo} +EscortGroup:OptionROEHoldFire() +EscortGroup:OptionROTPassiveDefense() +EscortGroup:SetTask(EscortGroup:TaskRoute(Points)) +EscortGroup:MessageToClient("Orbiting at location.",10,EscortClient) +end +function ESCORT:_JoinUpAndFollow(Distance) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self.Distance=Distance +self:JoinUpAndFollow(EscortGroup,EscortClient,self.Distance) +end +function ESCORT:JoinUpAndFollow(EscortGroup,EscortClient,Distance) +self:F({EscortGroup,EscortClient,Distance}) +self.FollowScheduler:Stop(self.FollowSchedule) +EscortGroup:OptionROEHoldFire() +EscortGroup:OptionROTPassiveDefense() +self.EscortMode=ESCORT.MODE.FOLLOW +self.CT1=0 +self.GT1=0 +self.FollowScheduler:Start(self.FollowSchedule) +EscortGroup:MessageToClient("Rejoining and Following at "..Distance.."!",30,EscortClient) +end +function ESCORT:_Flare(Color,Message) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +EscortGroup:GetUnit(1):Flare(Color) +EscortGroup:MessageToClient(Message,10,EscortClient) +end +function ESCORT:_Smoke(Color,Message) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +EscortGroup:GetUnit(1):Smoke(Color) +EscortGroup:MessageToClient(Message,10,EscortClient) +end +function ESCORT:_ReportNearbyTargetsNow() +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self:_ReportTargetsScheduler() +end +function ESCORT:_SwitchReportNearbyTargets(ReportTargets) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self.ReportTargets=ReportTargets +if self.ReportTargets then +if not self.ReportTargetsScheduler then +self.ReportTargetsScheduler:Schedule(self,self._ReportTargetsScheduler,{},1,30) +end +else +self.ReportTargetsScheduler:Remove(self.ReportTargetsSchedulerID) +self.ReportTargetsScheduler=nil +end +end +function ESCORT:_ScanTargets(ScanDuration) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self.FollowScheduler:Stop(self.FollowSchedule) +if EscortGroup:IsHelicopter()then +EscortGroup:PushTask( +EscortGroup:TaskControlled( +EscortGroup:TaskOrbitCircle(200,20), +EscortGroup:TaskCondition(nil,nil,nil,nil,ScanDuration,nil) +),1) +elseif EscortGroup:IsAirPlane()then +EscortGroup:PushTask( +EscortGroup:TaskControlled( +EscortGroup:TaskOrbitCircle(1000,500), +EscortGroup:TaskCondition(nil,nil,nil,nil,ScanDuration,nil) +),1) +end +EscortGroup:MessageToClient("Scanning targets for "..ScanDuration.." seconds.",ScanDuration,EscortClient) +if self.EscortMode==ESCORT.MODE.FOLLOW then +self.FollowScheduler:Start(self.FollowSchedule) +end +end +function _Resume(EscortGroup) +env.info('_Resume') +local Escort=EscortGroup:GetState(EscortGroup,"Escort") +env.info("EscortMode = "..Escort.EscortMode) +if Escort.EscortMode==ESCORT.MODE.FOLLOW then +Escort:JoinUpAndFollow(EscortGroup,Escort.EscortClient,Escort.Distance) +end +end +function ESCORT:_AttackTarget(DetectedItem) +local EscortGroup=self.EscortGroup +self:F(EscortGroup) +local EscortClient=self.EscortClient +self.FollowScheduler:Stop(self.FollowSchedule) +if EscortGroup:IsAir()then +EscortGroup:OptionROEOpenFire() +EscortGroup:OptionROTPassiveDefense() +EscortGroup:SetState(EscortGroup,"Escort",self) +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroup:TaskAttackUnit(DetectedUnit) +end +end,Tasks +) +Tasks[#Tasks+1]=EscortGroup:TaskFunction("_Resume",{"''"}) +EscortGroup:SetTask( +EscortGroup:TaskCombo( +Tasks +),1 +) +else +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroup:TaskFireAtPoint(DetectedUnit:GetVec2(),50) +end +end,Tasks +) +EscortGroup:SetTask( +EscortGroup:TaskCombo( +Tasks +),1 +) +end +EscortGroup:MessageToClient("Engaging Designated Unit!",10,EscortClient) +end +function ESCORT:_AssistTarget(EscortGroupAttack,DetectedItem) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self.FollowScheduler:Stop(self.FollowSchedule) +if EscortGroupAttack:IsAir()then +EscortGroupAttack:OptionROEOpenFire() +EscortGroupAttack:OptionROTVertical() +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroupAttack:TaskAttackUnit(DetectedUnit) +end +end,Tasks +) +Tasks[#Tasks+1]=EscortGroupAttack:TaskOrbitCircle(500,350) +EscortGroupAttack:SetTask( +EscortGroupAttack:TaskCombo( +Tasks +),1 +) +else +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroupAttack:TaskFireAtPoint(DetectedUnit:GetVec2(),50) +end +end,Tasks +) +EscortGroupAttack:SetTask( +EscortGroupAttack:TaskCombo( +Tasks +),1 +) +end +EscortGroupAttack:MessageToClient("Assisting with the destroying the enemy unit!",10,EscortClient) +end +function ESCORT:_ROE(EscortROEFunction,EscortROEMessage) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +pcall(function()EscortROEFunction()end) +EscortGroup:MessageToClient(EscortROEMessage,10,EscortClient) +end +function ESCORT:_ROT(EscortROTFunction,EscortROTMessage) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +pcall(function()EscortROTFunction()end) +EscortGroup:MessageToClient(EscortROTMessage,10,EscortClient) +end +function ESCORT:_ResumeMission(WayPoint) +local EscortGroup=self.EscortGroup +local EscortClient=self.EscortClient +self.FollowScheduler:Stop(self.FollowSchedule) +local WayPoints=EscortGroup:GetTaskRoute() +self:T(WayPoint,WayPoints) +for WayPointIgnore=1,WayPoint do +table.remove(WayPoints,1) +end +SCHEDULER:New(EscortGroup,EscortGroup.SetTask,{EscortGroup:TaskRoute(WayPoints)},1) +EscortGroup:MessageToClient("Resuming mission from waypoint "..WayPoint..".",10,EscortClient) +end +function ESCORT:RegisterRoute() +self:F() +local EscortGroup=self.EscortGroup +local TaskPoints=EscortGroup:GetTaskRoute() +self:T(TaskPoints) +return TaskPoints +end +function ESCORT:_FollowScheduler() +self:F({self.FollowDistance}) +self:T({self.EscortClient.UnitName,self.EscortGroup.GroupName}) +if self.EscortGroup:IsAlive()and self.EscortClient:IsAlive()then +local ClientUnit=self.EscortClient:GetClientGroupUnit() +local GroupUnit=self.EscortGroup:GetUnit(1) +local FollowDistance=self.FollowDistance +self:T({ClientUnit.UnitName,GroupUnit.UnitName}) +if self.CT1==0 and self.GT1==0 then +self.CV1=ClientUnit:GetVec3() +self:T({"self.CV1",self.CV1}) +self.CT1=timer.getTime() +self.GV1=GroupUnit:GetVec3() +self.GT1=timer.getTime() +else +local CT1=self.CT1 +local CT2=timer.getTime() +local CV1=self.CV1 +local CV2=ClientUnit:GetVec3() +self.CT1=CT2 +self.CV1=CV2 +local CD=((CV2.x-CV1.x)^2+(CV2.y-CV1.y)^2+(CV2.z-CV1.z)^2)^0.5 +local CT=CT2-CT1 +local CS=(3600/CT)*(CD/1000) +self:T2({"Client:",CS,CD,CT,CV2,CV1,CT2,CT1}) +local GT1=self.GT1 +local GT2=timer.getTime() +local GV1=self.GV1 +local GV2=GroupUnit:GetVec3() +self.GT1=GT2 +self.GV1=GV2 +local GD=((GV2.x-GV1.x)^2+(GV2.y-GV1.y)^2+(GV2.z-GV1.z)^2)^0.5 +local GT=GT2-GT1 +local GS=(3600/GT)*(GD/1000) +self:T2({"Group:",GS,GD,GT,GV2,GV1,GT2,GT1}) +local GV={x=GV2.x-CV2.x,y=GV2.y-CV2.y,z=GV2.z-CV2.z} +local GH2={x=GV2.x,y=CV2.y,z=GV2.z} +local alpha=math.atan2(GV.z,GV.x) +local CVI={x=CV2.x+FollowDistance*math.cos(alpha), +y=GH2.y, +z=CV2.z+FollowDistance*math.sin(alpha), +} +local DV={x=CV2.x-CVI.x,y=CV2.y-CVI.y,z=CV2.z-CVI.z} +local DVu={x=DV.x/FollowDistance,y=DV.y/FollowDistance,z=DV.z/FollowDistance} +local GDV={x=DVu.x*CS*8+CVI.x,y=CVI.y,z=DVu.z*CS*8+CVI.z} +if self.SmokeDirectionVector==true then +trigger.action.smoke(GDV,trigger.smokeColor.Red) +end +self:T2({"CV2:",CV2}) +self:T2({"CVI:",CVI}) +self:T2({"GDV:",GDV}) +local CatchUpDistance=((GDV.x-GV2.x)^2+(GDV.y-GV2.y)^2+(GDV.z-GV2.z)^2)^0.5 +local Time=10 +local CatchUpSpeed=(CatchUpDistance-(CS*8.4))/Time +local Speed=CS+CatchUpSpeed +if Speed<0 then +Speed=0 +end +self:T({"Client Speed, Escort Speed, Speed, FollowDistance, Time:",CS,GS,Speed,FollowDistance,Time}) +self.EscortGroup:RouteToVec3(GDV,Speed/3.6) +end +return true +end +return false +end +function ESCORT:_ReportTargetsScheduler() +self:F(self.EscortGroup:GetName()) +if self.EscortGroup:IsAlive()and self.EscortClient:IsAlive()then +local EscortGroupName=self.EscortGroup:GetName() +self.EscortMenuAttackNearbyTargets:RemoveSubMenus() +if self.EscortMenuTargetAssistance then +self.EscortMenuTargetAssistance:RemoveSubMenus() +end +local DetectedItems=self.Detection:GetDetectedItems() +self:F(DetectedItems) +local DetectedTargets=false +local DetectedMsgs={} +for ClientEscortGroupName,EscortGroupData in pairs(self.EscortClient._EscortGroups)do +local ClientEscortTargets=EscortGroupData.Detection +for DetectedItemIndex,DetectedItem in pairs(DetectedItems)do +self:F({DetectedItemIndex,DetectedItem}) +local DetectedItemReportSummary=self.Detection:DetectedItemReportSummary(DetectedItem,EscortGroupData.EscortGroup,_DATABASE:GetPlayerSettings(self.EscortClient:GetPlayerName())) +if ClientEscortGroupName==EscortGroupName then +local DetectedMsg=DetectedItemReportSummary:Text("\n") +DetectedMsgs[#DetectedMsgs+1]=DetectedMsg +self:T(DetectedMsg) +MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(), +DetectedMsg, +self.EscortMenuAttackNearbyTargets, +ESCORT._AttackTarget, +self, +DetectedItem +) +else +if self.EscortMenuTargetAssistance then +local DetectedMsg=DetectedItemReportSummary:Text("\n") +self:T(DetectedMsg) +local MenuTargetAssistance=MENU_GROUP:New(self.EscortClient:GetGroup(),EscortGroupData.EscortName,self.EscortMenuTargetAssistance) +MENU_GROUP_COMMAND:New(self.EscortClient:GetGroup(), +DetectedMsg, +MenuTargetAssistance, +ESCORT._AssistTarget, +self, +EscortGroupData.EscortGroup, +DetectedItem +) +end +end +DetectedTargets=true +end +end +self:F(DetectedMsgs) +if DetectedTargets then +self.EscortGroup:MessageToClient("Reporting detected targets:\n"..table.concat(DetectedMsgs,"\n"),20,self.EscortClient) +else +self.EscortGroup:MessageToClient("No targets detected.",10,self.EscortClient) +end +return true +end +return false +end +MISSILETRAINER={ +ClassName="MISSILETRAINER", +TrackingMissiles={}, +} +function MISSILETRAINER._Alive(Client,self) +if self.Briefing then +Client:Message(self.Briefing,15,"Trainer") +end +if self.MenusOnOff==true then +Client:Message("Use the 'Radio Menu' -> 'Other (F10)' -> 'Missile Trainer' menu options to change the Missile Trainer settings (for all players).",15,"Trainer") +Client.MainMenu=MENU_GROUP:New(Client:GetGroup(),"Missile Trainer",nil) +Client.MenuMessages=MENU_GROUP:New(Client:GetGroup(),"Messages",Client.MainMenu) +Client.MenuOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Messages On",Client.MenuMessages,self._MenuMessages,{MenuSelf=self,MessagesOnOff=true}) +Client.MenuOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Messages Off",Client.MenuMessages,self._MenuMessages,{MenuSelf=self,MessagesOnOff=false}) +Client.MenuTracking=MENU_GROUP:New(Client:GetGroup(),"Tracking",Client.MainMenu) +Client.MenuTrackingToAll=MENU_GROUP_COMMAND:New(Client:GetGroup(),"To All",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingToAll=true}) +Client.MenuTrackingToTarget=MENU_GROUP_COMMAND:New(Client:GetGroup(),"To Target",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingToAll=false}) +Client.MenuTrackOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Tracking On",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingOnOff=true}) +Client.MenuTrackOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Tracking Off",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingOnOff=false}) +Client.MenuTrackIncrease=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Frequency Increase",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingFrequency=-1}) +Client.MenuTrackDecrease=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Frequency Decrease",Client.MenuTracking,self._MenuMessages,{MenuSelf=self,TrackingFrequency=1}) +Client.MenuAlerts=MENU_GROUP:New(Client:GetGroup(),"Alerts",Client.MainMenu) +Client.MenuAlertsToAll=MENU_GROUP_COMMAND:New(Client:GetGroup(),"To All",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsToAll=true}) +Client.MenuAlertsToTarget=MENU_GROUP_COMMAND:New(Client:GetGroup(),"To Target",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsToAll=false}) +Client.MenuHitsOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Hits On",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsHitsOnOff=true}) +Client.MenuHitsOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Hits Off",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsHitsOnOff=false}) +Client.MenuLaunchesOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Launches On",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsLaunchesOnOff=true}) +Client.MenuLaunchesOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Launches Off",Client.MenuAlerts,self._MenuMessages,{MenuSelf=self,AlertsLaunchesOnOff=false}) +Client.MenuDetails=MENU_GROUP:New(Client:GetGroup(),"Details",Client.MainMenu) +Client.MenuDetailsDistanceOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Range On",Client.MenuDetails,self._MenuMessages,{MenuSelf=self,DetailsRangeOnOff=true}) +Client.MenuDetailsDistanceOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Range Off",Client.MenuDetails,self._MenuMessages,{MenuSelf=self,DetailsRangeOnOff=false}) +Client.MenuDetailsBearingOn=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Bearing On",Client.MenuDetails,self._MenuMessages,{MenuSelf=self,DetailsBearingOnOff=true}) +Client.MenuDetailsBearingOff=MENU_GROUP_COMMAND:New(Client:GetGroup(),"Bearing Off",Client.MenuDetails,self._MenuMessages,{MenuSelf=self,DetailsBearingOnOff=false}) +Client.MenuDistance=MENU_GROUP:New(Client:GetGroup(),"Set distance to plane",Client.MainMenu) +Client.MenuDistance50=MENU_GROUP_COMMAND:New(Client:GetGroup(),"50 meter",Client.MenuDistance,self._MenuMessages,{MenuSelf=self,Distance=50/1000}) +Client.MenuDistance100=MENU_GROUP_COMMAND:New(Client:GetGroup(),"100 meter",Client.MenuDistance,self._MenuMessages,{MenuSelf=self,Distance=100/1000}) +Client.MenuDistance150=MENU_GROUP_COMMAND:New(Client:GetGroup(),"150 meter",Client.MenuDistance,self._MenuMessages,{MenuSelf=self,Distance=150/1000}) +Client.MenuDistance200=MENU_GROUP_COMMAND:New(Client:GetGroup(),"200 meter",Client.MenuDistance,self._MenuMessages,{MenuSelf=self,Distance=200/1000}) +else +if Client.MainMenu then +Client.MainMenu:Remove() +end +end +local ClientID=Client:GetID() +self:T(ClientID) +if not self.TrackingMissiles[ClientID]then +self.TrackingMissiles[ClientID]={} +end +self.TrackingMissiles[ClientID].Client=Client +if not self.TrackingMissiles[ClientID].MissileData then +self.TrackingMissiles[ClientID].MissileData={} +end +end +function MISSILETRAINER:New(Distance,Briefing) +local self=BASE:Inherit(self,BASE:New()) +self:F(Distance) +if Briefing then +self.Briefing=Briefing +end +self.Schedulers={} +self.SchedulerID=0 +self.MessageInterval=2 +self.MessageLastTime=timer.getTime() +self.Distance=Distance/1000 +self:HandleEvent(EVENTS.Shot) +self.DBClients=SET_CLIENT:New():FilterStart() +self.DBClients:ForEachClient( +function(Client) +self:F("ForEach:"..Client.UnitName) +Client:Alive(self._Alive,self) +end +) +self.MessagesOnOff=true +self.TrackingToAll=false +self.TrackingOnOff=true +self.TrackingFrequency=3 +self.AlertsToAll=true +self.AlertsHitsOnOff=true +self.AlertsLaunchesOnOff=true +self.DetailsRangeOnOff=true +self.DetailsBearingOnOff=true +self.MenusOnOff=true +self.TrackingMissiles={} +self.TrackingScheduler=SCHEDULER:New(self,self._TrackMissiles,{},0.5,0.05,0) +return self +end +function MISSILETRAINER:InitMessagesOnOff(MessagesOnOff) +self:F(MessagesOnOff) +self.MessagesOnOff=MessagesOnOff +if self.MessagesOnOff==true then +MESSAGE:New("Messages ON",15,"Menu"):ToAll() +else +MESSAGE:New("Messages OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitTrackingToAll(TrackingToAll) +self:F(TrackingToAll) +self.TrackingToAll=TrackingToAll +if self.TrackingToAll==true then +MESSAGE:New("Missile tracking to all players ON",15,"Menu"):ToAll() +else +MESSAGE:New("Missile tracking to all players OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitTrackingOnOff(TrackingOnOff) +self:F(TrackingOnOff) +self.TrackingOnOff=TrackingOnOff +if self.TrackingOnOff==true then +MESSAGE:New("Missile tracking ON",15,"Menu"):ToAll() +else +MESSAGE:New("Missile tracking OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitTrackingFrequency(TrackingFrequency) +self:F(TrackingFrequency) +self.TrackingFrequency=self.TrackingFrequency+TrackingFrequency +if self.TrackingFrequency<0.5 then +self.TrackingFrequency=0.5 +end +if self.TrackingFrequency then +MESSAGE:New("Missile tracking frequency is "..self.TrackingFrequency.." seconds.",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitAlertsToAll(AlertsToAll) +self:F(AlertsToAll) +self.AlertsToAll=AlertsToAll +if self.AlertsToAll==true then +MESSAGE:New("Alerts to all players ON",15,"Menu"):ToAll() +else +MESSAGE:New("Alerts to all players OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitAlertsHitsOnOff(AlertsHitsOnOff) +self:F(AlertsHitsOnOff) +self.AlertsHitsOnOff=AlertsHitsOnOff +if self.AlertsHitsOnOff==true then +MESSAGE:New("Alerts Hits ON",15,"Menu"):ToAll() +else +MESSAGE:New("Alerts Hits OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitAlertsLaunchesOnOff(AlertsLaunchesOnOff) +self:F(AlertsLaunchesOnOff) +self.AlertsLaunchesOnOff=AlertsLaunchesOnOff +if self.AlertsLaunchesOnOff==true then +MESSAGE:New("Alerts Launches ON",15,"Menu"):ToAll() +else +MESSAGE:New("Alerts Launches OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitRangeOnOff(DetailsRangeOnOff) +self:F(DetailsRangeOnOff) +self.DetailsRangeOnOff=DetailsRangeOnOff +if self.DetailsRangeOnOff==true then +MESSAGE:New("Range display ON",15,"Menu"):ToAll() +else +MESSAGE:New("Range display OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitBearingOnOff(DetailsBearingOnOff) +self:F(DetailsBearingOnOff) +self.DetailsBearingOnOff=DetailsBearingOnOff +if self.DetailsBearingOnOff==true then +MESSAGE:New("Bearing display OFF",15,"Menu"):ToAll() +else +MESSAGE:New("Bearing display OFF",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER:InitMenusOnOff(MenusOnOff) +self:F(MenusOnOff) +self.MenusOnOff=MenusOnOff +if self.MenusOnOff==true then +MESSAGE:New("Menus are ENABLED (only when a player rejoins a slot)",15,"Menu"):ToAll() +else +MESSAGE:New("Menus are DISABLED",15,"Menu"):ToAll() +end +return self +end +function MISSILETRAINER._MenuMessages(MenuParameters) +local self=MenuParameters.MenuSelf +if MenuParameters.MessagesOnOff~=nil then +self:InitMessagesOnOff(MenuParameters.MessagesOnOff) +end +if MenuParameters.TrackingToAll~=nil then +self:InitTrackingToAll(MenuParameters.TrackingToAll) +end +if MenuParameters.TrackingOnOff~=nil then +self:InitTrackingOnOff(MenuParameters.TrackingOnOff) +end +if MenuParameters.TrackingFrequency~=nil then +self:InitTrackingFrequency(MenuParameters.TrackingFrequency) +end +if MenuParameters.AlertsToAll~=nil then +self:InitAlertsToAll(MenuParameters.AlertsToAll) +end +if MenuParameters.AlertsHitsOnOff~=nil then +self:InitAlertsHitsOnOff(MenuParameters.AlertsHitsOnOff) +end +if MenuParameters.AlertsLaunchesOnOff~=nil then +self:InitAlertsLaunchesOnOff(MenuParameters.AlertsLaunchesOnOff) +end +if MenuParameters.DetailsRangeOnOff~=nil then +self:InitRangeOnOff(MenuParameters.DetailsRangeOnOff) +end +if MenuParameters.DetailsBearingOnOff~=nil then +self:InitBearingOnOff(MenuParameters.DetailsBearingOnOff) +end +if MenuParameters.Distance~=nil then +self.Distance=MenuParameters.Distance +MESSAGE:New("Hit detection distance set to "..(self.Distance*1000).." meters",15,"Menu"):ToAll() +end +end +function MISSILETRAINER:OnEventShot(EVentData) +self:F({EVentData}) +local TrainerSourceDCSUnit=EVentData.IniDCSUnit +local TrainerSourceDCSUnitName=EVentData.IniDCSUnitName +local TrainerWeapon=EVentData.Weapon +local TrainerWeaponName=EVentData.WeaponName +self:T("Missile Launched = "..TrainerWeaponName) +local TrainerTargetDCSUnit=TrainerWeapon:getTarget() +if TrainerTargetDCSUnit then +local TrainerTargetDCSUnitName=Unit.getName(TrainerTargetDCSUnit) +local TrainerTargetSkill=_DATABASE.Templates.Units[TrainerTargetDCSUnitName].Template.skill +self:T(TrainerTargetDCSUnitName) +local Client=self.DBClients:FindClient(TrainerTargetDCSUnitName) +if Client then +local TrainerSourceUnit=UNIT:Find(TrainerSourceDCSUnit) +local TrainerTargetUnit=UNIT:Find(TrainerTargetDCSUnit) +if self.MessagesOnOff==true and self.AlertsLaunchesOnOff==true then +local Message=MESSAGE:New( +string.format("%s launched a %s", +TrainerSourceUnit:GetTypeName(), +TrainerWeaponName +)..self:_AddRange(Client,TrainerWeapon)..self:_AddBearing(Client,TrainerWeapon),5,"Launch Alert") +if self.AlertsToAll then +Message:ToAll() +else +Message:ToClient(Client) +end +end +local ClientID=Client:GetID() +self:T(ClientID) +local MissileData={} +MissileData.TrainerSourceUnit=TrainerSourceUnit +MissileData.TrainerWeapon=TrainerWeapon +MissileData.TrainerTargetUnit=TrainerTargetUnit +MissileData.TrainerWeaponTypeName=TrainerWeapon:getTypeName() +MissileData.TrainerWeaponLaunched=true +table.insert(self.TrackingMissiles[ClientID].MissileData,MissileData) +end +else +if(TrainerWeapon:getTypeName()=="9M311")then +SCHEDULER:New(TrainerWeapon,TrainerWeapon.destroy,{},1) +else +end +end +end +function MISSILETRAINER:_AddRange(Client,TrainerWeapon) +local RangeText="" +if self.DetailsRangeOnOff then +local PositionMissile=TrainerWeapon:getPoint() +local TargetVec3=Client:GetVec3() +local Range=((PositionMissile.x-TargetVec3.x)^2+ +(PositionMissile.y-TargetVec3.y)^2+ +(PositionMissile.z-TargetVec3.z)^2 +)^0.5/1000 +RangeText=string.format(", at %4.2fkm",Range) +end +return RangeText +end +function MISSILETRAINER:_AddBearing(Client,TrainerWeapon) +local BearingText="" +if self.DetailsBearingOnOff then +local PositionMissile=TrainerWeapon:getPoint() +local TargetVec3=Client:GetVec3() +self:T2({TargetVec3,PositionMissile}) +local DirectionVector={x=PositionMissile.x-TargetVec3.x,y=PositionMissile.y-TargetVec3.y,z=PositionMissile.z-TargetVec3.z} +local DirectionRadians=math.atan2(DirectionVector.z,DirectionVector.x) +if DirectionRadians<0 then +DirectionRadians=DirectionRadians+2*math.pi +end +local DirectionDegrees=DirectionRadians*180/math.pi +BearingText=string.format(", %d degrees",DirectionDegrees) +end +return BearingText +end +function MISSILETRAINER:_TrackMissiles() +self:F2() +local ShowMessages=false +if self.MessagesOnOff and self.MessageLastTime+self.TrackingFrequency<=timer.getTime()then +self.MessageLastTime=timer.getTime() +ShowMessages=true +end +for ClientDataID,ClientData in pairs(self.TrackingMissiles)do +local Client=ClientData.Client +if Client and Client:IsAlive()then +for MissileDataID,MissileData in pairs(ClientData.MissileData)do +self:T3(MissileDataID) +local TrainerSourceUnit=MissileData.TrainerSourceUnit +local TrainerWeapon=MissileData.TrainerWeapon +local TrainerTargetUnit=MissileData.TrainerTargetUnit +local TrainerWeaponTypeName=MissileData.TrainerWeaponTypeName +local TrainerWeaponLaunched=MissileData.TrainerWeaponLaunched +if Client and Client:IsAlive()and TrainerSourceUnit and TrainerSourceUnit:IsAlive()and TrainerWeapon and TrainerWeapon:isExist()and TrainerTargetUnit and TrainerTargetUnit:IsAlive()then +local PositionMissile=TrainerWeapon:getPosition().p +local TargetVec3=Client:GetVec3() +local Distance=((PositionMissile.x-TargetVec3.x)^2+ +(PositionMissile.y-TargetVec3.y)^2+ +(PositionMissile.z-TargetVec3.z)^2 +)^0.5/1000 +if Distance<=self.Distance then +TrainerWeapon:destroy() +if self.MessagesOnOff==true and self.AlertsHitsOnOff==true then +self:T("killed") +local Message=MESSAGE:New( +string.format("%s launched by %s killed %s", +TrainerWeapon:getTypeName(), +TrainerSourceUnit:GetTypeName(), +TrainerTargetUnit:GetPlayerName() +),15,"Hit Alert") +if self.AlertsToAll==true then +Message:ToAll() +else +Message:ToClient(Client) +end +MissileData=nil +table.remove(ClientData.MissileData,MissileDataID) +self:T(ClientData.MissileData) +end +end +else +if not(TrainerWeapon and TrainerWeapon:isExist())then +if self.MessagesOnOff==true and self.AlertsLaunchesOnOff==true then +local Message=MESSAGE:New( +string.format("%s launched by %s self destructed!", +TrainerWeaponTypeName, +TrainerSourceUnit:GetTypeName() +),5,"Tracking") +if self.AlertsToAll==true then +Message:ToAll() +else +Message:ToClient(Client) +end +end +MissileData=nil +table.remove(ClientData.MissileData,MissileDataID) +self:T(ClientData.MissileData) +end +end +end +else +self.TrackingMissiles[ClientDataID]=nil +end +end +if ShowMessages==true and self.MessagesOnOff==true and self.TrackingOnOff==true then +for ClientDataID,ClientData in pairs(self.TrackingMissiles)do +local Client=ClientData.Client +ClientData.MessageToClient="" +ClientData.MessageToAll="" +for TrackingDataID,TrackingData in pairs(self.TrackingMissiles)do +for MissileDataID,MissileData in pairs(TrackingData.MissileData)do +local TrainerSourceUnit=MissileData.TrainerSourceUnit +local TrainerWeapon=MissileData.TrainerWeapon +local TrainerTargetUnit=MissileData.TrainerTargetUnit +local TrainerWeaponTypeName=MissileData.TrainerWeaponTypeName +local TrainerWeaponLaunched=MissileData.TrainerWeaponLaunched +if Client and Client:IsAlive()and TrainerSourceUnit and TrainerSourceUnit:IsAlive()and TrainerWeapon and TrainerWeapon:isExist()and TrainerTargetUnit and TrainerTargetUnit:IsAlive()then +if ShowMessages==true then +local TrackingTo +TrackingTo=string.format(" -> %s", +TrainerWeaponTypeName +) +if ClientDataID==TrackingDataID then +if ClientData.MessageToClient==""then +ClientData.MessageToClient="Missiles to You:\n" +end +ClientData.MessageToClient=ClientData.MessageToClient..TrackingTo..self:_AddRange(ClientData.Client,TrainerWeapon)..self:_AddBearing(ClientData.Client,TrainerWeapon).."\n" +else +if self.TrackingToAll==true then +if ClientData.MessageToAll==""then +ClientData.MessageToAll="Missiles to other Players:\n" +end +ClientData.MessageToAll=ClientData.MessageToAll..TrackingTo..self:_AddRange(ClientData.Client,TrainerWeapon)..self:_AddBearing(ClientData.Client,TrainerWeapon).." ( "..TrainerTargetUnit:GetPlayerName().." )\n" +end +end +end +end +end +end +if ClientData.MessageToClient~=""or ClientData.MessageToAll~=""then +local Message=MESSAGE:New(ClientData.MessageToClient..ClientData.MessageToAll,1,"Tracking"):ToClient(Client) +end +end +end +return true +end +ATC_GROUND={ +ClassName="ATC_GROUND", +SetClient=nil, +Airbases=nil, +AirbaseNames=nil, +} +function ATC_GROUND:New(Airbases,AirbaseList) +local self=BASE:Inherit(self,BASE:New()) +self:T({self.ClassName,Airbases}) +self.Airbases=Airbases +self.AirbaseList=AirbaseList +self.SetClient=SET_CLIENT:New():FilterCategories("plane"):FilterStart() +for AirbaseID,Airbase in pairs(self.Airbases)do +if Airbase.ZoneBoundary then +Airbase.ZoneBoundary=ZONE_POLYGON_BASE:New("Boundary "..AirbaseID,Airbase.ZoneBoundary) +else +Airbase.ZoneBoundary=_DATABASE:FindAirbase(AirbaseID):GetZone() +end +Airbase.ZoneRunways={} +if Airbase.PointsRunways then +for PointsRunwayID,PointsRunway in pairs(Airbase.PointsRunways)do +Airbase.ZoneRunways[PointsRunwayID]=ZONE_POLYGON_BASE:New("Runway "..PointsRunwayID,PointsRunway) +end +end +Airbase.Monitor=self.AirbaseList and false or true +end +for AirbaseID,AirbaseName in pairs(self.AirbaseList or{})do +self.Airbases[AirbaseName].Monitor=true +end +self.SetClient:ForEachClient( +function(Client) +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +Client:SetState(self,"Taxi",false) +end +) +SSB=USERFLAG:New("SSB") +SSB:Set(100) +return self +end +function ATC_GROUND:SmokeRunways(SmokeColor) +for AirbaseID,Airbase in pairs(self.Airbases)do +for PointsRunwayID,PointsRunway in pairs(Airbase.PointsRunways)do +Airbase.ZoneRunways[PointsRunwayID]:SmokeZone(SmokeColor) +end +end +end +function ATC_GROUND:SetKickSpeed(KickSpeed,Airbase) +if not Airbase then +self.KickSpeed=KickSpeed +else +self.Airbases[Airbase].KickSpeed=KickSpeed +end +return self +end +function ATC_GROUND:SetKickSpeedKmph(KickSpeed,Airbase) +self:SetKickSpeed(UTILS.KmphToMps(KickSpeed),Airbase) +return self +end +function ATC_GROUND:SetKickSpeedMiph(KickSpeedMiph,Airbase) +self:SetKickSpeed(UTILS.MiphToMps(KickSpeedMiph),Airbase) +return self +end +function ATC_GROUND:SetMaximumKickSpeed(MaximumKickSpeed,Airbase) +if not Airbase then +self.MaximumKickSpeed=MaximumKickSpeed +else +self.Airbases[Airbase].MaximumKickSpeed=MaximumKickSpeed +end +return self +end +function ATC_GROUND:SetMaximumKickSpeedKmph(MaximumKickSpeed,Airbase) +self:SetMaximumKickSpeed(UTILS.KmphToMps(MaximumKickSpeed),Airbase) +return self +end +function ATC_GROUND:SetMaximumKickSpeedMiph(MaximumKickSpeedMiph,Airbase) +self:SetMaximumKickSpeed(UTILS.MiphToMps(MaximumKickSpeedMiph),Airbase) +return self +end +function ATC_GROUND:_AirbaseMonitor() +self.SetClient:ForEachClient( +function(Client) +if Client:IsAlive()then +local IsOnGround=Client:InAir()==false +for AirbaseID,AirbaseMeta in pairs(self.Airbases)do +self:T(AirbaseID,AirbaseMeta.KickSpeed) +if AirbaseMeta.Monitor==true and Client:IsInZone(AirbaseMeta.ZoneBoundary)then +local NotInRunwayZone=true +for ZoneRunwayID,ZoneRunway in pairs(AirbaseMeta.ZoneRunways)do +NotInRunwayZone=(Client:IsNotInZone(ZoneRunway)==true)and NotInRunwayZone or false +end +if NotInRunwayZone then +if IsOnGround then +local Taxi=Client:GetState(self,"Taxi") +self:T(Taxi) +if Taxi==false then +local Velocity=VELOCITY:New(AirbaseMeta.KickSpeed or self.KickSpeed) +Client:Message("Welcome to "..AirbaseID..". The maximum taxiing speed is ".. +Velocity:ToString(),20,"ATC") +Client:SetState(self,"Taxi",true) +end +local Velocity=VELOCITY_POSITIONABLE:New(Client) +local IsAboveRunway=Client:IsAboveRunway() +self:T(IsAboveRunway,IsOnGround) +if IsOnGround then +local Speeding=false +if AirbaseMeta.MaximumKickSpeed then +if Velocity:Get()>AirbaseMeta.MaximumKickSpeed then +Speeding=true +end +else +if Velocity:Get()>self.MaximumKickSpeed then +Speeding=true +end +end +if Speeding==true then +MESSAGE:New("Penalty! Player "..Client:GetPlayerName().. +" has been kicked, due to a severe airbase traffic rule violation ...",10,"ATC"):ToAll() +Client:Destroy() +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +end +if IsOnGround then +local Speeding=false +if AirbaseMeta.KickSpeed then +if Velocity:Get()>AirbaseMeta.KickSpeed then +Speeding=true +end +else +if Velocity:Get()>self.KickSpeed then +Speeding=true +end +end +if Speeding==true then +local IsSpeeding=Client:GetState(self,"Speeding") +if IsSpeeding==true then +local SpeedingWarnings=Client:GetState(self,"Warnings") +self:T(SpeedingWarnings) +if SpeedingWarnings<=3 then +Client:Message("Warning "..SpeedingWarnings.."/3! Airbase traffic rule violation! Slow down now! Your speed is ".. +Velocity:ToString(),5,"ATC") +Client:SetState(self,"Warnings",SpeedingWarnings+1) +else +MESSAGE:New("Penalty! Player "..Client:GetPlayerName().." has been kicked, due to a severe airbase traffic rule violation ...",10,"ATC"):ToAll() +Client:Destroy() +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +else +Client:Message("Attention! You are speeding on the taxiway, slow down! Your speed is ".. +Velocity:ToString(),5,"ATC") +Client:SetState(self,"Speeding",true) +Client:SetState(self,"Warnings",1) +end +else +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +end +if IsOnGround and not IsAboveRunway then +local IsOffRunway=Client:GetState(self,"IsOffRunway") +if IsOffRunway==true then +local OffRunwayWarnings=Client:GetState(self,"OffRunwayWarnings") +self:T(OffRunwayWarnings) +if OffRunwayWarnings<=3 then +Client:Message("Warning "..OffRunwayWarnings.."/3! Airbase traffic rule violation! Get back on the taxi immediately!",5,"ATC") +Client:SetState(self,"OffRunwayWarnings",OffRunwayWarnings+1) +else +MESSAGE:New("Penalty! Player "..Client:GetPlayerName().." has been kicked, due to a severe airbase traffic rule violation ...",10,"ATC"):ToAll() +Client:Destroy() +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +end +else +Client:Message("Attention! You are off the taxiway. Get back on the taxiway immediately!",5,"ATC") +Client:SetState(self,"IsOffRunway",true) +Client:SetState(self,"OffRunwayWarnings",1) +end +else +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +end +end +else +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +local Taxi=Client:GetState(self,"Taxi") +if Taxi==true then +Client:Message("You have progressed to the runway ... Await take-off clearance ...",20,"ATC") +Client:SetState(self,"Taxi",false) +end +end +end +end +else +Client:SetState(self,"Taxi",false) +end +end +) +return true +end +ATC_GROUND_UNIVERSAL={ +ClassName="ATC_GROUND_UNIVERSAL", +Version="0.0.2", +SetClient=nil, +Airbases=nil, +AirbaseList=nil, +KickSpeed=nil, +} +function ATC_GROUND_UNIVERSAL:New(AirbaseList) +local self=BASE:Inherit(self,BASE:New()) +self:T({self.ClassName}) +self.Airbases={} +self.AirbaseList=AirbaseList +if not self.AirbaseList then +self.AirbaseList={} +for _name,_base in pairs(_DATABASE.AIRBASES)do +if _base and _base.isAirdrome==true then +self.AirbaseList[_name]=_name +self.Airbases[_name]={} +end +end +else +for _,_name in pairs(AirbaseList)do +local airbase=_DATABASE:FindAirbase(_name) +if airbase and(airbase.isAirdrome==true)then +self.Airbases[_name]={} +end +end +end +self.SetClient=SET_CLIENT:New():FilterCategories("plane"):FilterStart() +for AirbaseID,Airbase in pairs(self.Airbases)do +if Airbase.ZoneBoundary then +Airbase.ZoneBoundary=ZONE_POLYGON_BASE:New("Boundary "..AirbaseID,Airbase.ZoneBoundary) +else +Airbase.ZoneBoundary=_DATABASE:FindAirbase(AirbaseID):GetZone() +end +Airbase.ZoneRunways=AIRBASE:FindByName(AirbaseID):GetRunways() +Airbase.Monitor=self.AirbaseList and false or true +end +for AirbaseID,AirbaseName in pairs(self.AirbaseList or{})do +self.Airbases[AirbaseName].Monitor=true +end +self.SetClient:ForEachClient( +function(Client) +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +Client:SetState(self,"Taxi",false) +end +) +SSB=USERFLAG:New("SSB") +SSB:Set(100) +self.KickSpeed=UTILS.KnotsToMps(10) +self:SetMaximumKickSpeedMiph(30) +return self +end +function ATC_GROUND_UNIVERSAL:SetAirbaseBoundaries(Airbase,Zone) +self.Airbases[Airbase].ZoneBoundary=Zone +return self +end +function ATC_GROUND_UNIVERSAL:SmokeRunways(SmokeColor) +local SmokeColor=SmokeColor or SMOKECOLOR.Red +for AirbaseID,Airbase in pairs(self.Airbases)do +if Airbase.ZoneRunways then +for _,_runwaydata in pairs(Airbase.ZoneRunways)do +local runwaydata=_runwaydata +runwaydata.zone:SmokeZone(SmokeColor) +end +end +end +return self +end +function ATC_GROUND_UNIVERSAL:DrawRunways(Color) +local Color=Color or{1,0,0} +for AirbaseID,Airbase in pairs(self.Airbases)do +if Airbase.ZoneRunways then +for _,_runwaydata in pairs(Airbase.ZoneRunways)do +local runwaydata=_runwaydata +runwaydata.zone:DrawZone(-1,Color) +end +end +end +return self +end +function ATC_GROUND_UNIVERSAL:DrawBoundaries(Color) +local Color=Color or{1,0,0} +for AirbaseID,Airbase in pairs(self.Airbases)do +if Airbase.ZoneBoundary then +Airbase.ZoneBoundary:DrawZone(-1,Color) +end +end +return self +end +function ATC_GROUND_UNIVERSAL:SetKickSpeed(KickSpeed,Airbase) +if not Airbase then +self.KickSpeed=KickSpeed +else +self.Airbases[Airbase].KickSpeed=KickSpeed +end +return self +end +function ATC_GROUND_UNIVERSAL:SetKickSpeedKmph(KickSpeed,Airbase) +self:SetKickSpeed(UTILS.KmphToMps(KickSpeed),Airbase) +return self +end +function ATC_GROUND_UNIVERSAL:SetKickSpeedMiph(KickSpeedMiph,Airbase) +self:SetKickSpeed(UTILS.MiphToMps(KickSpeedMiph),Airbase) +return self +end +function ATC_GROUND_UNIVERSAL:SetMaximumKickSpeed(MaximumKickSpeed,Airbase) +if not Airbase then +self.MaximumKickSpeed=MaximumKickSpeed +else +self.Airbases[Airbase].MaximumKickSpeed=MaximumKickSpeed +end +return self +end +function ATC_GROUND_UNIVERSAL:SetMaximumKickSpeedKmph(MaximumKickSpeed,Airbase) +self:SetMaximumKickSpeed(UTILS.KmphToMps(MaximumKickSpeed),Airbase) +return self +end +function ATC_GROUND_UNIVERSAL:SetMaximumKickSpeedMiph(MaximumKickSpeedMiph,Airbase) +self:SetMaximumKickSpeed(UTILS.MiphToMps(MaximumKickSpeedMiph),Airbase) +return self +end +function ATC_GROUND_UNIVERSAL:_AirbaseMonitor() +self:I("_AirbaseMonitor") +self.SetClient:ForEachClient( +function(Client) +if Client:IsAlive()then +local IsOnGround=Client:InAir()==false +for AirbaseID,AirbaseMeta in pairs(self.Airbases)do +self:T(AirbaseID,AirbaseMeta.KickSpeed) +if AirbaseMeta.Monitor==true and Client:IsInZone(AirbaseMeta.ZoneBoundary)then +local NotInRunwayZone=true +if AirbaseMeta.ZoneRunways then +for _,_runwaydata in pairs(AirbaseMeta.ZoneRunways)do +local runwaydata=_runwaydata +NotInRunwayZone=(Client:IsNotInZone(_runwaydata.zone)==true)and NotInRunwayZone or false +end +end +if NotInRunwayZone then +local Taxi=Client:GetState(self,"Taxi") +if IsOnGround then +self:T(Taxi) +if Taxi==false then +local Velocity=VELOCITY:New(AirbaseMeta.KickSpeed or self.KickSpeed) +Client:Message("Welcome to "..AirbaseID..". The maximum taxiing speed is ".. +Velocity:ToString(),20,"ATC") +Client:SetState(self,"Taxi",true) +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +local Velocity=VELOCITY_POSITIONABLE:New(Client) +local IsAboveRunway=Client:IsAboveRunway() +self:T({IsAboveRunway,IsOnGround,Velocity:Get()}) +if IsOnGround and not Taxi then +local Speeding=false +if AirbaseMeta.MaximumKickSpeed then +if Velocity:Get()>AirbaseMeta.MaximumKickSpeed then +Speeding=true +end +else +if Velocity:Get()>self.MaximumKickSpeed then +Speeding=true +end +end +if Speeding==true then +Client:SetState(self,"Speeding",true) +local SpeedingWarnings=Client:GetState(self,"Warnings") +Client:SetState(self,"Warnings",SpeedingWarnings+1) +Client:Message("Warning "..SpeedingWarnings.."/3! Airbase traffic rule violation! Slow down now! Your speed is ".. +Velocity:ToString(),5,"ATC") +end +end +if IsOnGround then +local Speeding=false +if AirbaseMeta.KickSpeed then +if Velocity:Get()>AirbaseMeta.KickSpeed then +Speeding=true +end +else +if Velocity:Get()>self.KickSpeed then +Speeding=true +end +end +if Speeding==true then +local IsSpeeding=Client:GetState(self,"Speeding") +if IsSpeeding==true then +local SpeedingWarnings=Client:GetState(self,"Warnings") +self:T(SpeedingWarnings) +if SpeedingWarnings<=3 then +Client:Message("Warning "..SpeedingWarnings.."/3! Airbase traffic rule violation! Slow down now! Your speed is ".. +Velocity:ToString(),5,"ATC") +Client:SetState(self,"Warnings",SpeedingWarnings+1) +else +MESSAGE:New("Penalty! Player "..Client:GetPlayerName().." has been kicked, due to a severe airbase traffic rule violation ...",10,"ATC"):ToAll() +Client:Destroy() +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +else +Client:Message("Attention! You are speeding on the taxiway, slow down! Your speed is ".. +Velocity:ToString(),5,"ATC") +Client:SetState(self,"Speeding",true) +Client:SetState(self,"Warnings",1) +end +else +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +end +end +if IsOnGround and not IsAboveRunway then +local IsOffRunway=Client:GetState(self,"IsOffRunway") +if IsOffRunway==true then +local OffRunwayWarnings=Client:GetState(self,"OffRunwayWarnings") +self:T(OffRunwayWarnings) +if OffRunwayWarnings<=3 then +Client:Message("Warning "..OffRunwayWarnings.."/3! Airbase traffic rule violation! Get back on the taxi immediately!",5,"ATC") +Client:SetState(self,"OffRunwayWarnings",OffRunwayWarnings+1) +else +MESSAGE:New("Penalty! Player "..Client:GetPlayerName().." has been kicked, due to a severe airbase traffic rule violation ...",10,"ATC"):ToAll() +Client:Destroy() +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +end +else +Client:Message("Attention! You are off the taxiway. Get back on the taxiway immediately!",5,"ATC") +Client:SetState(self,"IsOffRunway",true) +Client:SetState(self,"OffRunwayWarnings",1) +end +else +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +end +end +else +Client:SetState(self,"Speeding",false) +Client:SetState(self,"Warnings",0) +Client:SetState(self,"IsOffRunway",false) +Client:SetState(self,"OffRunwayWarnings",0) +local Taxi=Client:GetState(self,"Taxi") +if Taxi==true then +Client:Message("You have progressed to the runway ... Await take-off clearance ...",20,"ATC") +Client:SetState(self,"Taxi",false) +end +end +end +end +else +Client:SetState(self,"Taxi",false) +end +end +) +return true +end +function ATC_GROUND_UNIVERSAL:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +return self +end +ATC_GROUND_CAUCASUS={ +ClassName="ATC_GROUND_CAUCASUS", +} +function ATC_GROUND_CAUCASUS:New(AirbaseNames) +local self=BASE:Inherit(self,ATC_GROUND_UNIVERSAL:New(AirbaseNames)) +self:SetKickSpeedKmph(50) +self:SetMaximumKickSpeedKmph(150) +return self +end +function ATC_GROUND_CAUCASUS:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +end +ATC_GROUND_NEVADA={ +ClassName="ATC_GROUND_NEVADA", +} +function ATC_GROUND_NEVADA:New(AirbaseNames) +local self=BASE:Inherit(self,ATC_GROUND_UNIVERSAL:New(AirbaseNames)) +self:SetKickSpeedKmph(50) +self:SetMaximumKickSpeedKmph(150) +return self +end +function ATC_GROUND_NEVADA:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +end +ATC_GROUND_NORMANDY={ +ClassName="ATC_GROUND_NORMANDY", +} +function ATC_GROUND_NORMANDY:New(AirbaseNames) +local self=BASE:Inherit(self,ATC_GROUND_UNIVERSAL:New(AirbaseNames)) +self:SetKickSpeedKmph(40) +self:SetMaximumKickSpeedKmph(100) +return self +end +function ATC_GROUND_NORMANDY:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +end +ATC_GROUND_PERSIANGULF={ +ClassName="ATC_GROUND_PERSIANGULF", +} +function ATC_GROUND_PERSIANGULF:New(AirbaseNames) +local self=BASE:Inherit(self,ATC_GROUND_UNIVERSAL:New(AirbaseNames)) +self:SetKickSpeedKmph(50) +self:SetMaximumKickSpeedKmph(150) +end +function ATC_GROUND_PERSIANGULF:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +end +ATC_GROUND_MARIANAISLANDS={ +ClassName="ATC_GROUND_MARIANAISLANDS", +} +function ATC_GROUND_MARIANAISLANDS:New(AirbaseNames) +local self=BASE:Inherit(self,ATC_GROUND_UNIVERSAL:New(AirbaseNames)) +self:SetKickSpeedKmph(50) +self:SetMaximumKickSpeedKmph(150) +return self +end +function ATC_GROUND_MARIANAISLANDS:Start(RepeatScanSeconds) +RepeatScanSeconds=RepeatScanSeconds or 0.05 +self.AirbaseMonitor=SCHEDULER:New(self,self._AirbaseMonitor,{self},0,RepeatScanSeconds) +end +do +DETECTION_BASE={ +ClassName="DETECTION_BASE", +DetectionSetGroup=nil, +DetectionRange=nil, +DetectedObjects={}, +DetectionRun=0, +DetectedObjectsIdentified={}, +DetectedItems={}, +DetectedItemsByIndex={}, +} +function DETECTION_BASE:New(DetectionSet) +local self=BASE:Inherit(self,FSM:New()) +self.DetectedItemCount=0 +self.DetectedItemMax=0 +self.DetectedItems={} +self.DetectionSet=DetectionSet +self.RefreshTimeInterval=30 +self:InitDetectVisual(nil) +self:InitDetectOptical(nil) +self:InitDetectRadar(nil) +self:InitDetectRWR(nil) +self:InitDetectIRST(nil) +self:InitDetectDLINK(nil) +self:FilterCategories({ +Unit.Category.AIRPLANE, +Unit.Category.GROUND_UNIT, +Unit.Category.HELICOPTER, +Unit.Category.SHIP, +Unit.Category.STRUCTURE +}) +self:SetFriendliesRange(6000) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Detecting") +self:AddTransition("Detecting","Detect","Detecting") +self:AddTransition("Detecting","Detection","Detecting") +self:AddTransition("Detecting","Detected","Detecting") +self:AddTransition("Detecting","DetectedItem","Detecting") +self:AddTransition("*","Stop","Stopped") +return self +end +do +function DETECTION_BASE:onafterStart(From,Event,To) +self:__Detect(1) +end +function DETECTION_BASE:onafterDetect(From,Event,To) +local DetectDelay=0.15 +self.DetectionCount=0 +self.DetectionRun=0 +self:UnIdentifyAllDetectedObjects() +local DetectionTimeStamp=timer.getTime() +for DetectionObjectName,DetectedObjectData in pairs(self.DetectedObjects)do +self.DetectedObjects[DetectionObjectName].IsDetected=false +self.DetectedObjects[DetectionObjectName].IsVisible=false +self.DetectedObjects[DetectionObjectName].KnowDistance=nil +self.DetectedObjects[DetectionObjectName].LastTime=nil +self.DetectedObjects[DetectionObjectName].LastPos=nil +self.DetectedObjects[DetectionObjectName].LastVelocity=nil +self.DetectedObjects[DetectionObjectName].Distance=10000000 +end +self.DetectionCount=self:CountAliveRecce() +local DetectionInterval=self.DetectionCount/(self.RefreshTimeInterval-1) +self:ForEachAliveRecce(function(DetectionGroup) +self:__Detection(DetectDelay,DetectionGroup,DetectionTimeStamp) +DetectDelay=DetectDelay+DetectionInterval +end) +self:__Detect(-self.RefreshTimeInterval) +end +function DETECTION_BASE:CountAliveRecce() +return self.DetectionSet:CountAlive() +end +function DETECTION_BASE:ForEachAliveRecce(IteratorFunction,...) +self:F2(arg) +self.DetectionSet:ForEachGroupAlive(IteratorFunction,arg) +return self +end +function DETECTION_BASE:onafterDetection(From,Event,To,Detection,DetectionTimeStamp) +self:T({DetectedObjects=self.DetectedObjects}) +self.DetectionRun=self.DetectionRun+1 +local HasDetectedObjects=false +if Detection and Detection:IsAlive()then +self:T({"DetectionGroup is Alive",Detection:GetName()}) +local DetectionGroupName=Detection:GetName() +local DetectionUnit=Detection:GetFirstUnitAlive() +local DetectedUnits={} +local DetectedTargets=DetectionUnit:GetDetectedTargets( +self.DetectVisual, +self.DetectOptical, +self.DetectRadar, +self.DetectIRST, +self.DetectRWR, +self.DetectDLINK +) +for DetectionObjectID,Detection in pairs(DetectedTargets or{})do +local DetectedObject=Detection.object +if DetectedObject and DetectedObject:isExist()and DetectedObject.id_<50000000 then +local DetectedObjectName=DetectedObject:getName() +if not self.DetectedObjects[DetectedObjectName]then +self.DetectedObjects[DetectedObjectName]=self.DetectedObjects[DetectedObjectName]or{} +self.DetectedObjects[DetectedObjectName].Name=DetectedObjectName +self.DetectedObjects[DetectedObjectName].Object=DetectedObject +end +end +end +for DetectionObjectName,DetectedObjectData in pairs(self.DetectedObjects or{})do +local DetectedObject=DetectedObjectData.Object +if DetectedObject:isExist()then +local TargetIsDetected,TargetIsVisible,TargetKnowType,TargetKnowDistance,TargetLastTime,TargetLastPos,TargetLastVelocity=DetectionUnit:IsTargetDetected( +DetectedObject, +self.DetectVisual, +self.DetectOptical, +self.DetectRadar, +self.DetectIRST, +self.DetectRWR, +self.DetectDLINK +) +local DetectionAccepted=true +local DetectedObjectName=DetectedObject:getName() +local DetectedObjectType=DetectedObject:getTypeName() +local DetectedObjectVec3=DetectedObject:getPoint() +local DetectedObjectVec2={x=DetectedObjectVec3.x,y=DetectedObjectVec3.z} +local DetectionGroupVec3=Detection:GetVec3()or{x=0,y=0,z=0} +local DetectionGroupVec2={x=DetectionGroupVec3.x,y=DetectionGroupVec3.z} +local Distance=((DetectedObjectVec3.x-DetectionGroupVec3.x)^2+ +(DetectedObjectVec3.y-DetectionGroupVec3.y)^2+ +(DetectedObjectVec3.z-DetectionGroupVec3.z)^2 +)^0.5/1000 +local DetectedUnitCategory=DetectedObject:getDesc().category +DetectionAccepted=self._.FilterCategories[DetectedUnitCategory]~=nil and DetectionAccepted or false +if self.AcceptRange and Distance*1000>self.AcceptRange then +DetectionAccepted=false +end +if self.AcceptZones then +local AnyZoneDetection=false +for AcceptZoneID,AcceptZone in pairs(self.AcceptZones)do +local AcceptZone=AcceptZone +if AcceptZone:IsVec2InZone(DetectedObjectVec2)then +AnyZoneDetection=true +end +end +if not AnyZoneDetection then +DetectionAccepted=false +end +end +if self.RejectZones then +for RejectZoneID,RejectZone in pairs(self.RejectZones)do +local RejectZone=RejectZone +if RejectZone:IsVec2InZone(DetectedObjectVec2)==true then +DetectionAccepted=false +end +end +end +if self.RadarBlur then +MESSAGE:New("Radar Blur",10):ToLogIf(self.debug):ToAllIf(self.verbose) +local minheight=self.RadarBlurMinHeight or 250 +local thresheight=self.RadarBlurThresHeight or 90 +local thresblur=self.RadarBlurThresBlur or 85 +local dist=math.floor(Distance) +if dist<=self.RadarBlurClosing then +thresheight=(((dist*dist)/self.RadarBlurClosingSquare)*thresheight) +thresblur=(((dist*dist)/self.RadarBlurClosingSquare)*thresblur) +end +local fheight=math.floor(math.random(1,10000)/100) +local fblur=math.floor(math.random(1,10000)/100) +local unit=UNIT:FindByName(DetectedObjectName) +if unit and unit:IsAlive()then +local AGL=unit:GetAltitude(true) +MESSAGE:New("Unit "..DetectedObjectName.." is at "..math.floor(AGL).."m. Distance "..math.floor(Distance).."km.",10):ToLogIf(self.debug):ToAllIf(self.verbose) +MESSAGE:New(string.format("fheight = %d/%d | fblur = %d/%d",fheight,thresheight,fblur,thresblur),10):ToLogIf(self.debug):ToAllIf(self.verbose) +if fblur>thresblur then DetectionAccepted=false end +if AGL<=minheight and fheight<thresheight then DetectionAccepted=false end +MESSAGE:New("Detection Accepted = "..tostring(DetectionAccepted),10):ToLogIf(self.debug):ToAllIf(self.verbose) +end +end +if not self.DetectedObjects[DetectedObjectName]and TargetIsVisible and self.DistanceProbability then +local DistanceFactor=Distance/4 +local DistanceProbabilityReversed=(1-self.DistanceProbability)*DistanceFactor +local DistanceProbability=1-DistanceProbabilityReversed +DistanceProbability=DistanceProbability*30/300 +local Probability=math.random() +if Probability>DistanceProbability then +DetectionAccepted=false +end +end +if not self.DetectedObjects[DetectedObjectName]and TargetIsVisible and self.AlphaAngleProbability then +local NormalVec2={x=DetectedObjectVec2.x-DetectionGroupVec2.x,y=DetectedObjectVec2.y-DetectionGroupVec2.y} +local AlphaAngle=math.atan2(NormalVec2.y,NormalVec2.x) +local Sinus=math.sin(AlphaAngle) +local AlphaAngleProbabilityReversed=(1-self.AlphaAngleProbability)*(1-Sinus) +local AlphaAngleProbability=1-AlphaAngleProbabilityReversed +AlphaAngleProbability=AlphaAngleProbability*30/300 +local Probability=math.random() +if Probability>AlphaAngleProbability then +DetectionAccepted=false +end +end +if not self.DetectedObjects[DetectedObjectName]and TargetIsVisible and self.ZoneProbability then +for ZoneDataID,ZoneData in pairs(self.ZoneProbability)do +self:F({ZoneData}) +local ZoneObject=ZoneData[1] +local ZoneProbability=ZoneData[2] +ZoneProbability=ZoneProbability*30/300 +if ZoneObject:IsVec2InZone(DetectedObjectVec2)==true then +local Probability=math.random() +if Probability>ZoneProbability then +DetectionAccepted=false +break +end +end +end +end +if DetectionAccepted then +HasDetectedObjects=true +self.DetectedObjects[DetectedObjectName]=self.DetectedObjects[DetectedObjectName]or{} +self.DetectedObjects[DetectedObjectName].Name=DetectedObjectName +if TargetIsDetected and TargetIsDetected==true then +self.DetectedObjects[DetectedObjectName].IsDetected=TargetIsDetected +end +if TargetIsDetected and TargetIsVisible and TargetIsVisible==true then +self.DetectedObjects[DetectedObjectName].IsVisible=TargetIsDetected and TargetIsVisible +end +if TargetIsDetected and not self.DetectedObjects[DetectedObjectName].KnowType then +self.DetectedObjects[DetectedObjectName].KnowType=TargetIsDetected and TargetKnowType +end +self.DetectedObjects[DetectedObjectName].KnowDistance=TargetKnowDistance +self.DetectedObjects[DetectedObjectName].LastTime=(TargetIsDetected and TargetIsVisible==false)and TargetLastTime +self.DetectedObjects[DetectedObjectName].LastPos=(TargetIsDetected and TargetIsVisible==false)and TargetLastPos +self.DetectedObjects[DetectedObjectName].LastVelocity=(TargetIsDetected and TargetIsVisible==false)and TargetLastVelocity +if not self.DetectedObjects[DetectedObjectName].Distance or(Distance and self.DetectedObjects[DetectedObjectName].Distance>Distance)then +self.DetectedObjects[DetectedObjectName].Distance=Distance +end +self.DetectedObjects[DetectedObjectName].DetectionTimeStamp=DetectionTimeStamp +self:F({DetectedObject=self.DetectedObjects[DetectedObjectName]}) +local DetectedUnit=UNIT:FindByName(DetectedObjectName) +DetectedUnits[DetectedObjectName]=DetectedUnit +else +self:F({DetectedObject="No more detection for "..DetectedObjectName}) +if self.DetectedObjects[DetectedObjectName]then +self.DetectedObjects[DetectedObjectName]=nil +end +end +else +self:F("Removing from DetectedObjects: "..DetectionObjectName) +self.DetectedObjects[DetectionObjectName]=nil +end +end +if HasDetectedObjects then +self:__Detected(0.1,DetectedUnits) +end +end +if self.DetectionCount>0 and self.DetectionRun==self.DetectionCount then +for DetectedObjectName,DetectedObject in pairs(self.DetectedObjects)do +if self.DetectedObjects[DetectedObjectName].IsDetected==true and self.DetectedObjects[DetectedObjectName].DetectionTimeStamp+300<=DetectionTimeStamp then +self.DetectedObjects[DetectedObjectName].IsDetected=false +end +end +self:CreateDetectionItems() +for DetectedItemID,DetectedItem in pairs(self.DetectedItems)do +self:UpdateDetectedItemDetection(DetectedItem) +self:CleanDetectionItem(DetectedItem,DetectedItemID) +if DetectedItem then +self:__DetectedItem(0.1,DetectedItem) +end +end +end +end +end +do +function DETECTION_BASE:CleanDetectionItem(DetectedItem,DetectedItemID) +local DetectedSet=DetectedItem.Set +if DetectedSet:Count()==0 then +self:RemoveDetectedItem(DetectedItemID) +end +return self +end +function DETECTION_BASE:ForgetDetectedUnit(UnitName) +local DetectedItems=self:GetDetectedItems() +for DetectedItemIndex,DetectedItem in pairs(DetectedItems)do +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +if DetectedSet then +DetectedSet:RemoveUnitsByName(UnitName) +end +end +return self +end +function DETECTION_BASE:CreateDetectionItems() +self:F("Error, in DETECTION_BASE class...") +return self +end +end +do +function DETECTION_BASE:InitDetectVisual(DetectVisual) +self.DetectVisual=DetectVisual +return self +end +function DETECTION_BASE:InitDetectOptical(DetectOptical) +self:F2() +self.DetectOptical=DetectOptical +return self +end +function DETECTION_BASE:InitDetectRadar(DetectRadar) +self:F2() +self.DetectRadar=DetectRadar +return self +end +function DETECTION_BASE:InitDetectIRST(DetectIRST) +self:F2() +self.DetectIRST=DetectIRST +return self +end +function DETECTION_BASE:InitDetectRWR(DetectRWR) +self:F2() +self.DetectRWR=DetectRWR +return self +end +function DETECTION_BASE:InitDetectDLINK(DetectDLINK) +self:F2() +self.DetectDLINK=DetectDLINK +return self +end +end +do +function DETECTION_BASE:FilterCategories(FilterCategories) +self:F2() +self._.FilterCategories={} +if type(FilterCategories)=="table"then +for CategoryID,Category in pairs(FilterCategories)do +self._.FilterCategories[Category]=Category +end +else +self._.FilterCategories[FilterCategories]=FilterCategories +end +return self +end +function DETECTION_BASE:SetRadarBlur(minheight,thresheight,thresblur,closing) +self.RadarBlur=true +self.RadarBlurMinHeight=minheight or 250 +self.RadarBlurThresHeight=thresheight or 90 +self.RadarBlurThresBlur=thresblur or 85 +self.RadarBlurClosing=closing or 20 +self.RadarBlurClosingSquare=self.RadarBlurClosing*self.RadarBlurClosing +return self +end +end +do +function DETECTION_BASE:SetRefreshTimeInterval(RefreshTimeInterval) +self:F2() +self.RefreshTimeInterval=RefreshTimeInterval +return self +end +end +do +function DETECTION_BASE:SetFriendliesRange(FriendliesRange) +self:F2() +self.FriendliesRange=FriendliesRange +return self +end +end +do +function DETECTION_BASE:SetIntercept(Intercept,InterceptDelay) +self:F2() +self.Intercept=Intercept +self.InterceptDelay=InterceptDelay +return self +end +end +do +function DETECTION_BASE:SetAcceptRange(AcceptRange) +self:F2() +self.AcceptRange=AcceptRange +return self +end +function DETECTION_BASE:SetAcceptZones(AcceptZones) +self:F2() +if type(AcceptZones)=="table"then +if AcceptZones.ClassName and AcceptZones:IsInstanceOf(ZONE_BASE)then +self.AcceptZones={AcceptZones} +else +self.AcceptZones=AcceptZones +end +else +self:F({"AcceptZones must be a list of ZONE_BASE derived objects or one ZONE_BASE derived object",AcceptZones}) +error() +end +return self +end +function DETECTION_BASE:SetRejectZones(RejectZones) +self:F2() +if type(RejectZones)=="table"then +if RejectZones.ClassName and RejectZones:IsInstanceOf(ZONE_BASE)then +self.RejectZones={RejectZones} +else +self.RejectZones=RejectZones +end +else +self:F({"RejectZones must be a list of ZONE_BASE derived objects or one ZONE_BASE derived object",RejectZones}) +error() +end +return self +end +end +do +function DETECTION_BASE:SetDistanceProbability(DistanceProbability) +self:F2() +self.DistanceProbability=DistanceProbability +return self +end +function DETECTION_BASE:SetAlphaAngleProbability(AlphaAngleProbability) +self:F2() +self.AlphaAngleProbability=AlphaAngleProbability +return self +end +function DETECTION_BASE:SetZoneProbability(ZoneArray) +self:F2() +self.ZoneProbability=ZoneArray +return self +end +end +do +function DETECTION_BASE:AcceptChanges(DetectedItem) +DetectedItem.Changed=false +DetectedItem.Changes={} +return self +end +function DETECTION_BASE:AddChangeItem(DetectedItem,ChangeCode,ItemUnitType) +DetectedItem.Changed=true +local ID=DetectedItem.ID +DetectedItem.Changes=DetectedItem.Changes or{} +DetectedItem.Changes[ChangeCode]=DetectedItem.Changes[ChangeCode]or{} +DetectedItem.Changes[ChangeCode].ID=ID +DetectedItem.Changes[ChangeCode].ItemUnitType=ItemUnitType +self:F({"Change on Detected Item:",DetectedItemID=DetectedItem.ID,ChangeCode=ChangeCode,ItemUnitType=ItemUnitType}) +return self +end +function DETECTION_BASE:AddChangeUnit(DetectedItem,ChangeCode,ChangeUnitType) +DetectedItem.Changed=true +local ID=DetectedItem.ID +DetectedItem.Changes=DetectedItem.Changes or{} +DetectedItem.Changes[ChangeCode]=DetectedItem.Changes[ChangeCode]or{} +DetectedItem.Changes[ChangeCode][ChangeUnitType]=DetectedItem.Changes[ChangeCode][ChangeUnitType]or 0 +DetectedItem.Changes[ChangeCode][ChangeUnitType]=DetectedItem.Changes[ChangeCode][ChangeUnitType]+1 +DetectedItem.Changes[ChangeCode].ID=ID +self:F({"Change on Detected Unit:",DetectedItemID=DetectedItem.ID,ChangeCode=ChangeCode,ChangeUnitType=ChangeUnitType}) +return self +end +end +do +function DETECTION_BASE:SetFriendlyPrefixes(FriendlyPrefixes) +self.FriendlyPrefixes=self.FriendlyPrefixes or{} +if type(FriendlyPrefixes)~="table"then +FriendlyPrefixes={FriendlyPrefixes} +end +for PrefixID,Prefix in pairs(FriendlyPrefixes)do +self:F({FriendlyPrefix=Prefix}) +self.FriendlyPrefixes[Prefix]=Prefix +end +return self +end +function DETECTION_BASE:IsFriendliesNearBy(DetectedItem,Category) +return(DetectedItem.FriendliesNearBy and DetectedItem.FriendliesNearBy[Category]~=nil)or false +end +function DETECTION_BASE:GetFriendliesNearBy(DetectedItem,Category) +return DetectedItem.FriendliesNearBy and DetectedItem.FriendliesNearBy[Category] +end +function DETECTION_BASE:IsFriendliesNearIntercept(DetectedItem) +return DetectedItem.FriendliesNearIntercept~=nil or false +end +function DETECTION_BASE:GetFriendliesNearIntercept(DetectedItem) +return DetectedItem.FriendliesNearIntercept +end +function DETECTION_BASE:GetFriendliesDistance(DetectedItem) +return DetectedItem.FriendliesDistance +end +function DETECTION_BASE:IsPlayersNearBy(DetectedItem) +return DetectedItem.PlayersNearBy~=nil +end +function DETECTION_BASE:GetPlayersNearBy(DetectedItem) +return DetectedItem.PlayersNearBy +end +function DETECTION_BASE:ReportFriendliesNearBy(TargetData) +local DetectedItem=TargetData.DetectedItem +local DetectedSet=TargetData.DetectedItem.Set +local DetectedUnit=DetectedSet:GetFirst() +DetectedItem.FriendliesNearBy=nil +if DetectedUnit and DetectedUnit:IsAlive()then +local DetectedUnitCoord=DetectedUnit:GetCoordinate() +local InterceptCoord=TargetData.InterceptCoord or DetectedUnitCoord +local SphereSearch={ +id=world.VolumeType.SPHERE, +params={ +point=InterceptCoord:GetVec3(), +radius=self.FriendliesRange, +} +} +local FindNearByFriendlies=function(FoundDCSUnit,ReportGroupData) +local DetectedItem=ReportGroupData.DetectedItem +local DetectedSet=ReportGroupData.DetectedItem.Set +local DetectedUnit=DetectedSet:GetFirst() +local DetectedUnitCoord=DetectedUnit:GetCoordinate() +local InterceptCoord=ReportGroupData.InterceptCoord or DetectedUnitCoord +local ReportSetGroup=ReportGroupData.ReportSetGroup +local EnemyCoalition=DetectedUnit:GetCoalition() +local FoundUnitCoalition=FoundDCSUnit:getCoalition() +local FoundUnitCategory=FoundDCSUnit:getDesc().category +local FoundUnitName=FoundDCSUnit:getName() +local FoundUnitGroupName=FoundDCSUnit:getGroup():getName() +local EnemyUnitName=DetectedUnit:GetName() +local FoundUnitInReportSetGroup=ReportSetGroup:FindGroup(FoundUnitGroupName)~=nil +if FoundUnitInReportSetGroup==true then +for PrefixID,Prefix in pairs(self.FriendlyPrefixes or{})do +if string.find(FoundUnitName,Prefix:gsub("-","%%-"),1)then +FoundUnitInReportSetGroup=false +break +end +end +end +if FoundUnitCoalition~=EnemyCoalition and FoundUnitInReportSetGroup==false then +local FriendlyUnit=UNIT:Find(FoundDCSUnit) +local FriendlyUnitName=FriendlyUnit:GetName() +local FriendlyUnitCategory=FriendlyUnit:GetDesc().category +DetectedItem.FriendliesNearBy=DetectedItem.FriendliesNearBy or{} +DetectedItem.FriendliesNearBy[FoundUnitCategory]=DetectedItem.FriendliesNearBy[FoundUnitCategory]or{} +DetectedItem.FriendliesNearBy[FoundUnitCategory][FriendlyUnitName]=FriendlyUnit +local Distance=DetectedUnitCoord:Get2DDistance(FriendlyUnit:GetCoordinate()) +DetectedItem.FriendliesDistance=DetectedItem.FriendliesDistance or{} +DetectedItem.FriendliesDistance[Distance]=FriendlyUnit +return true +end +return true +end +world.searchObjects(Object.Category.UNIT,SphereSearch,FindNearByFriendlies,TargetData) +DetectedItem.PlayersNearBy=nil +_DATABASE:ForEachPlayer( +function(PlayerUnitName) +local PlayerUnit=UNIT:FindByName(PlayerUnitName) +if PlayerUnit and PlayerUnit:IsAlive()then +local coord=PlayerUnit:GetCoordinate() +if coord and coord:IsInRadius(DetectedUnitCoord,self.FriendliesRange)then +local PlayerUnitCategory=PlayerUnit:GetDesc().category +if(not self.FriendliesCategory)or(self.FriendliesCategory and(self.FriendliesCategory==PlayerUnitCategory))then +local PlayerUnitName=PlayerUnit:GetName() +DetectedItem.PlayersNearBy=DetectedItem.PlayersNearBy or{} +DetectedItem.PlayersNearBy[PlayerUnitName]=PlayerUnit +DetectedItem.FriendliesNearBy=DetectedItem.FriendliesNearBy or{} +DetectedItem.FriendliesNearBy[PlayerUnitCategory]=DetectedItem.FriendliesNearBy[PlayerUnitCategory]or{} +DetectedItem.FriendliesNearBy[PlayerUnitCategory][PlayerUnitName]=PlayerUnit +local Distance=DetectedUnitCoord:Get2DDistance(PlayerUnit:GetCoordinate()) +DetectedItem.FriendliesDistance=DetectedItem.FriendliesDistance or{} +DetectedItem.FriendliesDistance[Distance]=PlayerUnit +end +end +end +end) +end +self:F({Friendlies=DetectedItem.FriendliesNearBy,Players=DetectedItem.PlayersNearBy}) +end +end +function DETECTION_BASE:IsDetectedObjectIdentified(DetectedObject) +local DetectedObjectName=DetectedObject.Name +if DetectedObjectName then +local DetectedObjectIdentified=self.DetectedObjectsIdentified[DetectedObjectName]==true +return DetectedObjectIdentified +else +return nil +end +end +function DETECTION_BASE:IdentifyDetectedObject(DetectedObject) +local DetectedObjectName=DetectedObject.Name +self.DetectedObjectsIdentified[DetectedObjectName]=true +end +function DETECTION_BASE:UnIdentifyDetectedObject(DetectedObject) +local DetectedObjectName=DetectedObject.Name +self.DetectedObjectsIdentified[DetectedObjectName]=false +end +function DETECTION_BASE:UnIdentifyAllDetectedObjects() +self.DetectedObjectsIdentified={} +end +function DETECTION_BASE:GetDetectedObject(ObjectName) +self:F2({ObjectName=ObjectName}) +if ObjectName then +local DetectedObject=self.DetectedObjects[ObjectName] +if DetectedObject then +local DetectedUnit=UNIT:FindByName(ObjectName) +if DetectedUnit and DetectedUnit:IsAlive()then +if self:IsDetectedObjectIdentified(DetectedObject)==false then +return DetectedObject +end +end +end +end +return nil +end +function DETECTION_BASE:GetDetectedUnitTypeName(DetectedUnit) +if DetectedUnit and DetectedUnit:IsAlive()then +local DetectedUnitName=DetectedUnit:GetName() +local DetectedObject=self.DetectedObjects[DetectedUnitName] +if DetectedObject then +if DetectedObject.KnowType then +return DetectedUnit:GetTypeName() +else +return"Unknown" +end +else +return"Unknown" +end +else +return"Dead:"..DetectedUnit:GetName() +end +return"Undetected:"..DetectedUnit:GetName() +end +function DETECTION_BASE:AddDetectedItem(ItemPrefix,DetectedItemKey,Set) +local DetectedItem={} +self.DetectedItemCount=self.DetectedItemCount+1 +self.DetectedItemMax=self.DetectedItemMax+1 +DetectedItemKey=DetectedItemKey or self.DetectedItemMax +self.DetectedItems[DetectedItemKey]=DetectedItem +self.DetectedItemsByIndex[DetectedItemKey]=DetectedItem +DetectedItem.Index=DetectedItemKey +DetectedItem.Set=Set or SET_UNIT:New():FilterDeads():FilterCrashes() +DetectedItem.ItemID=ItemPrefix.."."..self.DetectedItemMax +DetectedItem.ID=self.DetectedItemMax +DetectedItem.Removed=false +if self.Locking then +self:LockDetectedItem(DetectedItem) +end +return DetectedItem +end +function DETECTION_BASE:AddDetectedItemZone(ItemPrefix,DetectedItemKey,Set,Zone) +self:F({ItemPrefix,DetectedItemKey,Set,Zone}) +local DetectedItem=self:AddDetectedItem(ItemPrefix,DetectedItemKey,Set) +DetectedItem.Zone=Zone +return DetectedItem +end +function DETECTION_BASE:RemoveDetectedItem(DetectedItemKey) +local DetectedItem=self.DetectedItems[DetectedItemKey] +if DetectedItem then +self.DetectedItemCount=self.DetectedItemCount-1 +local DetectedItemIndex=DetectedItem.Index +self.DetectedItemsByIndex[DetectedItemIndex]=nil +self.DetectedItems[DetectedItemKey]=nil +end +end +function DETECTION_BASE:GetDetectedItems() +return self.DetectedItems +end +function DETECTION_BASE:GetDetectedItemsByIndex() +return self.DetectedItemsByIndex +end +function DETECTION_BASE:GetDetectedItemsCount() +local DetectedCount=self.DetectedItemCount +return DetectedCount +end +function DETECTION_BASE:GetDetectedItemByKey(Key) +self:F({DetectedItems=self.DetectedItems}) +local DetectedItem=self.DetectedItems[Key] +if DetectedItem then +return DetectedItem +end +return nil +end +function DETECTION_BASE:GetDetectedItemByIndex(Index) +self:F({self.DetectedItemsByIndex}) +local DetectedItem=self.DetectedItemsByIndex[Index] +if DetectedItem then +return DetectedItem +end +return nil +end +function DETECTION_BASE:GetDetectedItemID(DetectedItem) +return DetectedItem and DetectedItem.ItemID or"" +end +function DETECTION_BASE:GetDetectedID(Index) +local DetectedItem=self.DetectedItemsByIndex[Index] +if DetectedItem then +return DetectedItem.ID +end +return"" +end +function DETECTION_BASE:GetDetectedItemSet(DetectedItem) +local DetectedSetUnit=DetectedItem and DetectedItem.Set +if DetectedSetUnit then +return DetectedSetUnit +end +return nil +end +function DETECTION_BASE:UpdateDetectedItemDetection(DetectedItem) +local IsDetected=false +for UnitName,UnitData in pairs(DetectedItem.Set:GetSet())do +local DetectedObject=self.DetectedObjects[UnitName] +self:F({UnitName=UnitName,IsDetected=DetectedObject.IsDetected}) +if DetectedObject.IsDetected then +IsDetected=true +break +end +end +self:F({IsDetected=DetectedItem.IsDetected}) +DetectedItem.IsDetected=IsDetected +return IsDetected +end +function DETECTION_BASE:IsDetectedItemDetected(DetectedItem) +return DetectedItem.IsDetected +end +do +function DETECTION_BASE:GetDetectedItemZone(DetectedItem) +local DetectedZone=DetectedItem and DetectedItem.Zone +if DetectedZone then +return DetectedZone +end +local Detected +return nil +end +end +function DETECTION_BASE:LockDetectedItems() +for DetectedItemID,DetectedItem in pairs(self.DetectedItems)do +self:LockDetectedItem(DetectedItem) +end +self.Locking=true +return self +end +function DETECTION_BASE:UnlockDetectedItems() +for DetectedItemID,DetectedItem in pairs(self.DetectedItems)do +self:UnlockDetectedItem(DetectedItem) +end +self.Locking=nil +return self +end +function DETECTION_BASE:IsDetectedItemLocked(DetectedItem) +return self.Locking and DetectedItem.Locked==true +end +function DETECTION_BASE:LockDetectedItem(DetectedItem) +DetectedItem.Locked=true +return self +end +function DETECTION_BASE:UnlockDetectedItem(DetectedItem) +DetectedItem.Locked=nil +return self +end +function DETECTION_BASE:SetDetectedItemCoordinate(DetectedItem,Coordinate,DetectedItemUnit) +self:F({Coordinate=Coordinate}) +if DetectedItem then +if DetectedItemUnit then +DetectedItem.Coordinate=Coordinate +DetectedItem.Coordinate:SetHeading(DetectedItemUnit:GetHeading()) +DetectedItem.Coordinate.y=DetectedItemUnit:GetAltitude() +DetectedItem.Coordinate:SetVelocity(DetectedItemUnit:GetVelocityMPS()) +end +end +end +function DETECTION_BASE:GetDetectedItemCoordinate(DetectedItem) +self:F({DetectedItem=DetectedItem}) +if DetectedItem then +return DetectedItem.Coordinate +end +return nil +end +function DETECTION_BASE:GetDetectedItemCoordinates() +local Coordinates={} +for DetectedItemID,DetectedItem in pairs(self:GetDetectedItems())do +Coordinates[DetectedItem]=self:GetDetectedItemCoordinate(DetectedItem) +end +return Coordinates +end +function DETECTION_BASE:SetDetectedItemThreatLevel(DetectedItem) +local DetectedSet=DetectedItem.Set +if DetectedItem then +DetectedItem.ThreatLevel,DetectedItem.ThreatText=DetectedSet:CalculateThreatLevelA2G() +end +end +function DETECTION_BASE:GetDetectedItemThreatLevel(DetectedItem) +self:F({DetectedItem=DetectedItem}) +if DetectedItem then +self:F({ThreatLevel=DetectedItem.ThreatLevel,ThreatText=DetectedItem.ThreatText}) +return DetectedItem.ThreatLevel or 0,DetectedItem.ThreatText or"" +end +return nil,"" +end +function DETECTION_BASE:DetectedItemReportSummary(DetectedItem,AttackGroup,Settings) +self:F() +return nil +end +function DETECTION_BASE:DetectedReportDetailed(AttackGroup) +self:F() +return nil +end +function DETECTION_BASE:GetDetectionSet() +local DetectionSet=self.DetectionSet +return DetectionSet +end +function DETECTION_BASE:NearestRecce(DetectedItem) +local NearestRecce=nil +local DistanceRecce=1000000000 +for RecceGroupName,RecceGroup in pairs(self.DetectionSet:GetSet())do +if RecceGroup and RecceGroup:IsAlive()then +for RecceUnit,RecceUnit in pairs(RecceGroup:GetUnits())do +if RecceUnit:IsActive()then +local RecceUnitCoord=RecceUnit:GetCoordinate() +local Distance=RecceUnitCoord:Get2DDistance(self:GetDetectedItemCoordinate(DetectedItem)) +if Distance<DistanceRecce then +DistanceRecce=Distance +NearestRecce=RecceUnit +end +end +end +end +end +DetectedItem.NearestFAC=NearestRecce +DetectedItem.DistanceRecce=DistanceRecce +end +function DETECTION_BASE:Schedule(DelayTime,RepeatInterval) +self:F2() +self.ScheduleDelayTime=DelayTime +self.ScheduleRepeatInterval=RepeatInterval +self.DetectionScheduler=SCHEDULER:New(self,self._DetectionScheduler,{self,"Detection"},DelayTime,RepeatInterval) +return self +end +end +do +DETECTION_UNITS={ +ClassName="DETECTION_UNITS", +DetectionRange=nil, +} +function DETECTION_UNITS:New(DetectionSetGroup) +local self=BASE:Inherit(self,DETECTION_BASE:New(DetectionSetGroup)) +self._SmokeDetectedUnits=false +self._FlareDetectedUnits=false +self._SmokeDetectedZones=false +self._FlareDetectedZones=false +self._BoundDetectedZones=false +return self +end +function DETECTION_UNITS:GetChangeText(DetectedItem) +self:F(DetectedItem) +local MT={} +for ChangeCode,ChangeData in pairs(DetectedItem.Changes)do +if ChangeCode=="AU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]=" New target(s) detected: "..table.concat(MTUT,", ").."." +end +if ChangeCode=="RU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]=" Invisible or destroyed target(s): "..table.concat(MTUT,", ").."." +end +end +return table.concat(MT,"\n") +end +function DETECTION_UNITS:CreateDetectionItems() +for DetectedItemKey,_DetectedItem in pairs(self.DetectedItems)do +local DetectedItem=_DetectedItem +local DetectedItemSet=DetectedItem.Set +for DetectedUnitName,DetectedUnitData in pairs(DetectedItemSet:GetSet())do +local DetectedUnit=DetectedUnitData +local DetectedObject=nil +if DetectedUnit:IsAlive()then +DetectedObject=self:GetDetectedObject(DetectedUnit:GetName()) +end +if DetectedObject then +self:IdentifyDetectedObject(DetectedObject) +self:F({"**DETECTED**",IsVisible=DetectedObject.IsVisible}) +DetectedItem.TypeName=DetectedUnit:GetTypeName() +DetectedItem.CategoryName=DetectedUnit:GetCategoryName() +DetectedItem.Name=DetectedObject.Name +DetectedItem.IsVisible=DetectedObject.IsVisible +DetectedItem.LastTime=DetectedObject.LastTime +DetectedItem.LastPos=DetectedObject.LastPos +DetectedItem.LastVelocity=DetectedObject.LastVelocity +DetectedItem.KnowType=DetectedObject.KnowType +DetectedItem.KnowDistance=DetectedObject.KnowDistance +DetectedItem.Distance=DetectedObject.Distance +else +self:AddChangeUnit(DetectedItem,"RU",DetectedUnitName) +DetectedItemSet:Remove(DetectedUnitName) +end +end +if DetectedItemSet:Count()==0 then +self:RemoveDetectedItem(DetectedItemKey) +end +end +for DetectedUnitName,DetectedObjectData in pairs(self.DetectedObjects)do +local DetectedObject=self:GetDetectedObject(DetectedUnitName) +if DetectedObject then +self:T({"Detected Unit #",DetectedUnitName}) +local DetectedUnit=UNIT:FindByName(DetectedUnitName) +if DetectedUnit then +local DetectedTypeName=DetectedUnit:GetTypeName() +local DetectedItem=self:GetDetectedItemByKey(DetectedUnitName) +if not DetectedItem then +self:T("Added new DetectedItem") +DetectedItem=self:AddDetectedItem("UNIT",DetectedUnitName) +DetectedItem.TypeName=DetectedUnit:GetTypeName() +DetectedItem.Name=DetectedObject.Name +DetectedItem.IsVisible=DetectedObject.IsVisible +DetectedItem.LastTime=DetectedObject.LastTime +DetectedItem.LastPos=DetectedObject.LastPos +DetectedItem.LastVelocity=DetectedObject.LastVelocity +DetectedItem.KnowType=DetectedObject.KnowType +DetectedItem.KnowDistance=DetectedObject.KnowDistance +DetectedItem.Distance=DetectedObject.Distance +end +DetectedItem.Set:AddUnit(DetectedUnit) +self:AddChangeUnit(DetectedItem,"AU",DetectedTypeName) +end +end +end +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +local DetectedSet=DetectedItem.Set +local DetectedFirstUnit=DetectedSet:GetFirst() +local DetectedFirstUnitCoord=DetectedFirstUnit:GetCoordinate() +self:SetDetectedItemCoordinate(DetectedItem,DetectedFirstUnitCoord,DetectedFirstUnit) +self:ReportFriendliesNearBy({DetectedItem=DetectedItem,ReportSetGroup=self.DetectionSet}) +self:SetDetectedItemThreatLevel(DetectedItem) +self:NearestRecce(DetectedItem) +end +end +function DETECTION_UNITS:DetectedItemReportSummary(DetectedItem,AttackGroup,Settings,ForceA2GCoordinate) +self:F({DetectedItem=DetectedItem}) +local DetectedItemID=self:GetDetectedItemID(DetectedItem) +if DetectedItem then +local ReportSummary="" +local UnitDistanceText="" +local UnitCategoryText="" +if DetectedItem.KnowType then +local UnitCategoryName=DetectedItem.CategoryName +if UnitCategoryName then +UnitCategoryText=UnitCategoryName +end +if DetectedItem.TypeName then +UnitCategoryText=UnitCategoryText.." ("..DetectedItem.TypeName..")" +end +else +UnitCategoryText="Unknown" +end +if DetectedItem.KnowDistance then +if DetectedItem.IsVisible then +UnitDistanceText=" at "..string.format("%.2f",DetectedItem.Distance).." km" +end +else +if DetectedItem.IsVisible then +UnitDistanceText=" at +/- "..string.format("%.0f",DetectedItem.Distance).." km" +end +end +local DetectedItemCoordinate=self:GetDetectedItemCoordinate(DetectedItem) +local DetectedItemCoordText=DetectedItemCoordinate:ToString(AttackGroup,Settings) +if ForceA2GCoordinate then +DetectedItemCoordText=DetectedItemCoordinate:ToStringA2G(AttackGroup,Settings) +end +local ThreatLevelA2G=self:GetDetectedItemThreatLevel(DetectedItem) +local Report=REPORT:New() +Report:Add(DetectedItemID..", "..DetectedItemCoordText) +Report:Add(string.format("Threat: [%s]",string.rep("■",ThreatLevelA2G),string.rep("□",10-ThreatLevelA2G))) +Report:Add(string.format("Type: %s%s",UnitCategoryText,UnitDistanceText)) +Report:Add(string.format("Visible: %s",DetectedItem.IsVisible and"yes"or"no")) +Report:Add(string.format("Detected: %s",DetectedItem.IsDetected and"yes"or"no")) +Report:Add(string.format("Distance: %s",DetectedItem.KnowDistance and"yes"or"no")) +return Report +end +return nil +end +function DETECTION_UNITS:DetectedReportDetailed(AttackGroup) +self:F() +local Report=REPORT:New() +for DetectedItemIndex,DetectedItem in pairs(self.DetectedItems)do +local DetectedItem=DetectedItem +local ReportSummary=self:DetectedItemReportSummary(DetectedItem,AttackGroup) +Report:SetTitle("Detected units:") +Report:Add(ReportSummary:Text()) +end +local ReportText=Report:Text() +return ReportText +end +end +do +DETECTION_TYPES={ +ClassName="DETECTION_TYPES", +DetectionRange=nil, +} +function DETECTION_TYPES:New(DetectionSetGroup) +local self=BASE:Inherit(self,DETECTION_BASE:New(DetectionSetGroup)) +self._SmokeDetectedUnits=false +self._FlareDetectedUnits=false +self._SmokeDetectedZones=false +self._FlareDetectedZones=false +self._BoundDetectedZones=false +return self +end +function DETECTION_TYPES:GetChangeText(DetectedItem) +self:F(DetectedItem) +local MT={} +for ChangeCode,ChangeData in pairs(DetectedItem.Changes)do +if ChangeCode=="AU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]=" New target(s) detected: "..table.concat(MTUT,", ").."." +end +if ChangeCode=="RU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]=" Invisible or destroyed target(s): "..table.concat(MTUT,", ").."." +end +end +return table.concat(MT,"\n") +end +function DETECTION_TYPES:CreateDetectionItems() +for DetectedItemKey,DetectedItem in pairs(self.DetectedItems)do +local DetectedItemSet=DetectedItem.Set +local DetectedTypeName=DetectedItem.TypeName +for DetectedUnitName,DetectedUnitData in pairs(DetectedItemSet:GetSet())do +local DetectedUnit=DetectedUnitData +local DetectedObject=nil +if DetectedUnit:IsAlive()then +DetectedObject=self:GetDetectedObject(DetectedUnit:GetName()) +end +if DetectedObject then +self:IdentifyDetectedObject(DetectedObject) +else +self:AddChangeUnit(DetectedItem,"RU",DetectedUnitName) +DetectedItemSet:Remove(DetectedUnitName) +end +end +if DetectedItemSet:Count()==0 then +self:RemoveDetectedItem(DetectedItemKey) +end +end +for DetectedUnitName,DetectedObjectData in pairs(self.DetectedObjects)do +local DetectedObject=self:GetDetectedObject(DetectedUnitName) +if DetectedObject then +self:T({"Detected Unit #",DetectedUnitName}) +local DetectedUnit=UNIT:FindByName(DetectedUnitName) +if DetectedUnit then +local DetectedTypeName=DetectedUnit:GetTypeName() +local DetectedItem=self:GetDetectedItemByKey(DetectedTypeName) +if not DetectedItem then +DetectedItem=self:AddDetectedItem("TYPE",DetectedTypeName) +DetectedItem.TypeName=DetectedTypeName +DetectedItem.Name=DetectedUnitName +end +DetectedItem.Set:AddUnit(DetectedUnit) +self:AddChangeUnit(DetectedItem,"AU",DetectedTypeName) +end +end +end +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +local DetectedSet=DetectedItem.Set +local DetectedFirstUnit=DetectedSet:GetFirst() +local DetectedUnitCoord=DetectedFirstUnit:GetCoordinate() +self:SetDetectedItemCoordinate(DetectedItem,DetectedUnitCoord,DetectedFirstUnit) +self:ReportFriendliesNearBy({DetectedItem=DetectedItem,ReportSetGroup=self.DetectionSet}) +self:SetDetectedItemThreatLevel(DetectedItem) +self:NearestRecce(DetectedItem) +end +end +function DETECTION_TYPES:DetectedItemReportSummary(DetectedItem,AttackGroup,Settings) +self:F({DetectedItem=DetectedItem}) +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +local DetectedItemID=self:GetDetectedItemID(DetectedItem) +self:T(DetectedItem) +if DetectedItem then +local ThreatLevelA2G=self:GetDetectedItemThreatLevel(DetectedItem) +local DetectedItemsCount=DetectedSet:Count() +local DetectedItemType=DetectedItem.TypeName +local DetectedItemCoordinate=self:GetDetectedItemCoordinate(DetectedItem) +local DetectedItemCoordText=DetectedItemCoordinate:ToString(AttackGroup,Settings) +local Report=REPORT:New() +Report:Add(DetectedItemID..", "..DetectedItemCoordText) +Report:Add(string.format("Threat: [%s%s]",string.rep("■",ThreatLevelA2G),string.rep("□",10-ThreatLevelA2G))) +Report:Add(string.format("Type: %2d of %s",DetectedItemsCount,DetectedItemType)) +return Report +end +end +function DETECTION_TYPES:DetectedReportDetailed(AttackGroup) +self:F() +local Report=REPORT:New() +for DetectedItemIndex,DetectedItem in pairs(self.DetectedItems)do +local DetectedItem=DetectedItem +local ReportSummary=self:DetectedItemReportSummary(DetectedItem,AttackGroup) +Report:SetTitle("Detected types:") +Report:Add(ReportSummary:Text()) +end +local ReportText=Report:Text() +return ReportText +end +end +do +DETECTION_AREAS={ +ClassName="DETECTION_AREAS", +DetectionZoneRange=nil, +} +function DETECTION_AREAS:New(DetectionSetGroup,DetectionZoneRange) +local self=BASE:Inherit(self,DETECTION_BASE:New(DetectionSetGroup)) +self.DetectionZoneRange=DetectionZoneRange or 5000 +self._SmokeDetectedUnits=false +self._FlareDetectedUnits=false +self._SmokeDetectedZones=false +self._FlareDetectedZones=false +self._BoundDetectedZones=false +return self +end +function DETECTION_AREAS:GetDetectionZones() +local zoneset=SET_ZONE:New() +for _ID,_Item in pairs(self.DetectedItems)do +local item=_Item +if item.Zone then +zoneset:AddZone(item.Zone) +end +end +return zoneset +end +function DETECTION_AREAS:GetDetectionZoneByID(ID) +local zone=nil +for _ID,_Item in pairs(self.DetectedItems)do +local item=_Item +if item.ID==ID then +zone=item.Zone +break +end +end +return zone +end +function DETECTION_AREAS:GetDetectionZoneCount() +local zoneset=0 +for _ID,_Item in pairs(self.DetectedItems)do +if _Item.Zone then +zoneset=zoneset+1 +end +end +return zoneset +end +function DETECTION_AREAS:DetectedItemReportMenu(DetectedItem,AttackGroup,Settings) +self:F({DetectedItem=DetectedItem}) +local DetectedItemID=self:GetDetectedItemID(DetectedItem) +if DetectedItem then +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +local ReportSummaryItem +local DetectedZone=self:GetDetectedItemZone(DetectedItem) +local DetectedItemCoordinate=DetectedZone:GetCoordinate() +local DetectedItemCoordText=DetectedItemCoordinate:ToString(AttackGroup,Settings) +local ThreatLevelA2G=self:GetDetectedItemThreatLevel(DetectedItem) +local Report=REPORT:New() +Report:Add(DetectedItemID) +Report:Add(string.format("Threat: [%s%s]",string.rep("■",ThreatLevelA2G),string.rep("□",10-ThreatLevelA2G))) +return Report +end +return nil +end +function DETECTION_AREAS:DetectedItemReportSummary(DetectedItem,AttackGroup,Settings) +self:F({DetectedItem=DetectedItem}) +local DetectedItemID=self:GetDetectedItemID(DetectedItem) +if DetectedItem then +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +local ReportSummaryItem +local DetectedItemCoordinate=self:GetDetectedItemCoordinate(DetectedItem) +local DetectedAir=DetectedSet:HasAirUnits() +local DetectedAltitude=self:GetDetectedItemCoordinate(DetectedItem) +local DetectedItemCoordText="" +if DetectedAir>0 then +DetectedItemCoordText=DetectedItemCoordinate:ToStringA2A(AttackGroup,Settings) +else +DetectedItemCoordText=DetectedItemCoordinate:ToStringA2G(AttackGroup,Settings) +end +local ThreatLevelA2G=self:GetDetectedItemThreatLevel(DetectedItem) +local DetectedItemsCount=DetectedSet:Count() +local DetectedItemsTypes=DetectedSet:GetTypeNames() +local Report=REPORT:New() +Report:Add(DetectedItemID..", "..DetectedItemCoordText) +Report:Add(string.format("Threat: [%s%s]",string.rep("■",ThreatLevelA2G),string.rep("□",10-ThreatLevelA2G))) +Report:Add(string.format("Type: %2d of %s",DetectedItemsCount,DetectedItemsTypes)) +return Report +end +return nil +end +function DETECTION_AREAS:DetectedReportDetailed(AttackGroup) +self:F() +local Report=REPORT:New() +for DetectedItemIndex,DetectedItem in pairs(self.DetectedItems)do +local DetectedItem=DetectedItem +local ReportSummary=self:DetectedItemReportSummary(DetectedItem,AttackGroup) +Report:SetTitle("Detected areas:") +Report:Add(ReportSummary:Text()) +end +local ReportText=Report:Text() +return ReportText +end +function DETECTION_AREAS:CalculateIntercept(DetectedItem) +local DetectedCoord=DetectedItem.Coordinate +local DetectedSpeed=DetectedCoord:GetVelocity() +local DetectedHeading=DetectedCoord:GetHeading() +if self.Intercept then +local DetectedSet=DetectedItem.Set +local TranslateDistance=DetectedSpeed*self.InterceptDelay +local InterceptCoord=DetectedCoord:Translate(TranslateDistance,DetectedHeading) +DetectedItem.InterceptCoord=InterceptCoord +else +DetectedItem.InterceptCoord=DetectedCoord +end +end +function DETECTION_AREAS:SmokeDetectedUnits() +self:F2() +self._SmokeDetectedUnits=true +return self +end +function DETECTION_AREAS:FlareDetectedUnits() +self:F2() +self._FlareDetectedUnits=true +return self +end +function DETECTION_AREAS:SmokeDetectedZones() +self:F2() +self._SmokeDetectedZones=true +return self +end +function DETECTION_AREAS:FlareDetectedZones() +self:F2() +self._FlareDetectedZones=true +return self +end +function DETECTION_AREAS:BoundDetectedZones() +self:F2() +self._BoundDetectedZones=true +return self +end +function DETECTION_AREAS:GetChangeText(DetectedItem) +self:F(DetectedItem) +local MT={} +for ChangeCode,ChangeData in pairs(DetectedItem.Changes)do +if ChangeCode=="AA"then +MT[#MT+1]="Detected new area "..ChangeData.ID..". The center target is a "..ChangeData.ItemUnitType.."." +end +if ChangeCode=="RAU"then +MT[#MT+1]="Changed area "..ChangeData.ID..". Removed the center target." +end +if ChangeCode=="AAU"then +MT[#MT+1]="Changed area "..ChangeData.ID..". The new center target is a "..ChangeData.ItemUnitType.."." +end +if ChangeCode=="RA"then +MT[#MT+1]="Removed old area "..ChangeData.ID..". No more targets in this area." +end +if ChangeCode=="AU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]="Detected for area "..ChangeData.ID.." new target(s) "..table.concat(MTUT,", ").."." +end +if ChangeCode=="RU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]="Removed for area "..ChangeData.ID.." invisible or destroyed target(s) "..table.concat(MTUT,", ").."." +end +end +return table.concat(MT,"\n") +end +function DETECTION_AREAS:CreateDetectionItems() +self:F("Checking Detected Items for new Detected Units ...") +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +if DetectedItem then +self:T2({"Detected Item ID: ",DetectedItemID}) +local DetectedSet=DetectedItem.Set +local AreaExists=false +self:T3({"Zone Center Unit:",DetectedItem.Zone.ZoneUNIT.UnitName}) +local DetectedZoneObject=self:GetDetectedObject(DetectedItem.Zone.ZoneUNIT.UnitName) +self:T3({"Detected Zone Object:",DetectedItem.Zone:GetName(),DetectedZoneObject}) +if DetectedZoneObject then +AreaExists=true +else +DetectedSet:RemoveUnitsByName(DetectedItem.Zone.ZoneUNIT.UnitName) +self:AddChangeItem(DetectedItem,'RAU',self:GetDetectedUnitTypeName(DetectedItem.Zone.ZoneUNIT)) +for DetectedUnitName,DetectedUnitData in pairs(DetectedSet:GetSet())do +local DetectedUnit=DetectedUnitData +local DetectedObject=self:GetDetectedObject(DetectedUnit.UnitName) +local DetectedUnitTypeName=self:GetDetectedUnitTypeName(DetectedUnit) +if DetectedObject then +self:IdentifyDetectedObject(DetectedObject) +AreaExists=true +DetectedItem.Zone=ZONE_UNIT:New(DetectedUnit:GetName(),DetectedUnit,self.DetectionZoneRange) +self:AddChangeItem(DetectedItem,"AAU",DetectedUnitTypeName) +break +else +DetectedSet:Remove(DetectedUnitName) +self:AddChangeUnit(DetectedItem,"RU",DetectedUnitTypeName) +end +end +end +if AreaExists then +for DetectedUnitName,DetectedUnitData in pairs(DetectedSet:GetSet())do +local DetectedUnit=DetectedUnitData +local DetectedUnitTypeName=self:GetDetectedUnitTypeName(DetectedUnit) +local DetectedObject=nil +if DetectedUnit:IsAlive()then +DetectedObject=self:GetDetectedObject(DetectedUnit:GetName()) +end +if DetectedObject then +if DetectedUnit:IsInZone(DetectedItem.Zone)then +self:IdentifyDetectedObject(DetectedObject) +DetectedSet:AddUnit(DetectedUnit) +else +DetectedSet:Remove(DetectedUnitName) +self:AddChangeUnit(DetectedItem,"RU",DetectedUnitTypeName) +end +else +self:AddChangeUnit(DetectedItem,"RU","destroyed target") +DetectedSet:Remove(DetectedUnitName) +end +end +else +self:RemoveDetectedItem(DetectedItemID) +self:AddChangeItem(DetectedItem,"RA") +end +end +end +for DetectedUnitName,DetectedObjectData in pairs(self.DetectedObjects)do +local DetectedObject=self:GetDetectedObject(DetectedUnitName) +if DetectedObject then +local DetectedUnit=UNIT:FindByName(DetectedUnitName) +local DetectedUnitTypeName=self:GetDetectedUnitTypeName(DetectedUnit) +local AddedToDetectionArea=false +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +if DetectedItem then +local DetectedSet=DetectedItem.Set +if not self:IsDetectedObjectIdentified(DetectedObject)and DetectedUnit:IsInZone(DetectedItem.Zone)then +self:IdentifyDetectedObject(DetectedObject) +DetectedSet:AddUnit(DetectedUnit) +AddedToDetectionArea=true +self:AddChangeUnit(DetectedItem,"AU",DetectedUnitTypeName) +end +end +end +if AddedToDetectionArea==false then +local DetectedItem=self:AddDetectedItemZone("AREA",nil, +SET_UNIT:New():FilterDeads():FilterCrashes(), +ZONE_UNIT:New(DetectedUnitName,DetectedUnit,self.DetectionZoneRange) +) +DetectedItem.Set:AddUnit(DetectedUnit) +self:AddChangeItem(DetectedItem,"AA",DetectedUnitTypeName) +end +end +end +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +local DetectedSet=DetectedItem.Set +local DetectedFirstUnit=DetectedSet:GetFirst() +local DetectedZone=DetectedItem.Zone +local DetectedZoneCoord=DetectedZone:GetCoordinate() +self:SetDetectedItemCoordinate(DetectedItem,DetectedZoneCoord,DetectedFirstUnit) +self:CalculateIntercept(DetectedItem) +local OldFriendliesNearbyGround=self:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +self:ReportFriendliesNearBy({DetectedItem=DetectedItem,ReportSetGroup=self.DetectionSet}) +local NewFriendliesNearbyGround=self:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +if OldFriendliesNearbyGround~=NewFriendliesNearbyGround then +DetectedItem.Changed=true +end +self:SetDetectedItemThreatLevel(DetectedItem) +self:NearestRecce(DetectedItem) +if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then +DetectedZone.ZoneUNIT:SmokeRed() +end +DetectedSet:ForEachUnit( +function(DetectedUnit) +if DetectedUnit:IsAlive()then +if DETECTION_AREAS._FlareDetectedUnits or self._FlareDetectedUnits then +DetectedUnit:FlareGreen() +end +if DETECTION_AREAS._SmokeDetectedUnits or self._SmokeDetectedUnits then +DetectedUnit:SmokeGreen() +end +end +end) +if DETECTION_AREAS._FlareDetectedZones or self._FlareDetectedZones then +DetectedZone:FlareZone(SMOKECOLOR.White,30,math.random(0,90)) +end +if DETECTION_AREAS._SmokeDetectedZones or self._SmokeDetectedZones then +DetectedZone:SmokeZone(SMOKECOLOR.White,30) +end +if DETECTION_AREAS._BoundDetectedZones or self._BoundDetectedZones then +self.CountryID=DetectedSet:GetFirst():GetCountry() +DetectedZone:BoundZone(12,self.CountryID) +end +end +end +end +do +DETECTION_ZONES={ +ClassName="DETECTION_ZONES", +DetectionZoneRange=nil, +} +function DETECTION_ZONES:New(DetectionSetZone,DetectionCoalition) +local self=BASE:Inherit(self,DETECTION_BASE:New(DetectionSetZone)) +self.DetectionSetZone=DetectionSetZone +self.DetectionCoalition=DetectionCoalition +self._SmokeDetectedUnits=false +self._FlareDetectedUnits=false +self._SmokeDetectedZones=false +self._FlareDetectedZones=false +self._BoundDetectedZones=false +return self +end +function DETECTION_ZONES:CountAliveRecce() +return self.DetectionSetZone:Count() +end +function DETECTION_ZONES:ForEachAliveRecce(IteratorFunction,...) +self:F2(arg) +self.DetectionSetZone:ForEachZone(IteratorFunction,arg) +return self +end +function DETECTION_ZONES:DetectedItemReportSummary(DetectedItem,AttackGroup,Settings) +self:F({DetectedItem=DetectedItem}) +local DetectedItemID=self:GetDetectedItemID(DetectedItem) +if DetectedItem then +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +local ReportSummaryItem +local DetectedZone=self:GetDetectedItemZone(DetectedItem) +local DetectedItemCoordinate=DetectedZone:GetCoordinate() +local DetectedItemCoordText=DetectedItemCoordinate:ToString(AttackGroup,Settings) +local ThreatLevelA2G=self:GetDetectedItemThreatLevel(DetectedItem) +local DetectedItemsCount=DetectedSet:Count() +local DetectedItemsTypes=DetectedSet:GetTypeNames() +local Report=REPORT:New() +Report:Add(DetectedItemID..", "..DetectedItemCoordText) +Report:Add(string.format("Threat: [%s]",string.rep("■",ThreatLevelA2G),string.rep("□",10-ThreatLevelA2G))) +Report:Add(string.format("Type: %2d of %s",DetectedItemsCount,DetectedItemsTypes)) +Report:Add(string.format("Detected: %s",DetectedItem.IsDetected and"yes"or"no")) +return Report +end +return nil +end +function DETECTION_ZONES:DetectedReportDetailed(AttackGroup) +self:F() +local Report=REPORT:New() +for DetectedItemIndex,DetectedItem in pairs(self.DetectedItems)do +local DetectedItem=DetectedItem +local ReportSummary=self:DetectedItemReportSummary(DetectedItem,AttackGroup) +Report:SetTitle("Detected areas:") +Report:Add(ReportSummary:Text()) +end +local ReportText=Report:Text() +return ReportText +end +function DETECTION_ZONES:CalculateIntercept(DetectedItem) +local DetectedCoord=DetectedItem.Coordinate +DetectedItem.InterceptCoord=DetectedCoord +end +function DETECTION_ZONES:SmokeDetectedUnits() +self:F2() +self._SmokeDetectedUnits=true +return self +end +function DETECTION_ZONES:FlareDetectedUnits() +self:F2() +self._FlareDetectedUnits=true +return self +end +function DETECTION_ZONES:SmokeDetectedZones() +self:F2() +self._SmokeDetectedZones=true +return self +end +function DETECTION_ZONES:FlareDetectedZones() +self:F2() +self._FlareDetectedZones=true +return self +end +function DETECTION_ZONES:BoundDetectedZones() +self:F2() +self._BoundDetectedZones=true +return self +end +function DETECTION_ZONES:GetChangeText(DetectedItem) +self:F(DetectedItem) +local MT={} +for ChangeCode,ChangeData in pairs(DetectedItem.Changes)do +if ChangeCode=="AA"then +MT[#MT+1]="Detected new area "..ChangeData.ID..". The center target is a "..ChangeData.ItemUnitType.."." +end +if ChangeCode=="RAU"then +MT[#MT+1]="Changed area "..ChangeData.ID..". Removed the center target." +end +if ChangeCode=="AAU"then +MT[#MT+1]="Changed area "..ChangeData.ID..". The new center target is a "..ChangeData.ItemUnitType.."." +end +if ChangeCode=="RA"then +MT[#MT+1]="Removed old area "..ChangeData.ID..". No more targets in this area." +end +if ChangeCode=="AU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]="Detected for area "..ChangeData.ID.." new target(s) "..table.concat(MTUT,", ").."." +end +if ChangeCode=="RU"then +local MTUT={} +for ChangeUnitType,ChangeUnitCount in pairs(ChangeData)do +if ChangeUnitType~="ID"then +MTUT[#MTUT+1]=ChangeUnitCount.." of "..ChangeUnitType +end +end +MT[#MT+1]="Removed for area "..ChangeData.ID.." invisible or destroyed target(s) "..table.concat(MTUT,", ").."." +end +end +return table.concat(MT,"\n") +end +function DETECTION_ZONES:CreateDetectionItems() +self:F("Checking Detected Items for new Detected Units ...") +local DetectedUnits=SET_UNIT:New() +for ZoneName,DetectionZone in pairs(self.DetectionSetZone:GetSet())do +local DetectedItem=self:GetDetectedItemByKey(ZoneName) +if DetectedItem==nil then +DetectedItem=self:AddDetectedItemZone("ZONE",ZoneName,nil,DetectionZone) +end +local DetectedItemSetUnit=self:GetDetectedItemSet(DetectedItem) +DetectionZone:Scan({Object.Category.UNIT},{Unit.Category.GROUND_UNIT}) +local ZoneUnits=DetectionZone:GetScannedUnits() +for DCSUnitID,DCSUnit in pairs(ZoneUnits)do +local UnitName=DCSUnit:getName() +local ZoneUnit=UNIT:FindByName(UnitName) +local ZoneUnitCoalition=ZoneUnit:GetCoalition() +if ZoneUnitCoalition==self.DetectionCoalition then +if DetectedItemSetUnit:FindUnit(UnitName)==nil and DetectedUnits:FindUnit(UnitName)==nil then +self:F("Adding "..UnitName) +DetectedItemSetUnit:AddUnit(ZoneUnit) +DetectedUnits:AddUnit(ZoneUnit) +end +end +end +end +for DetectedItemID,DetectedItemData in pairs(self.DetectedItems)do +local DetectedItem=DetectedItemData +local DetectedSet=self:GetDetectedItemSet(DetectedItem) +local DetectedFirstUnit=DetectedSet:GetFirst() +local DetectedZone=self:GetDetectedItemZone(DetectedItem) +local DetectedZoneCoord=DetectedZone:GetCoordinate() +self:SetDetectedItemCoordinate(DetectedItem,DetectedZoneCoord,DetectedFirstUnit) +self:CalculateIntercept(DetectedItem) +local OldFriendliesNearbyGround=self:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +self:ReportFriendliesNearBy({DetectedItem=DetectedItem,ReportSetGroup=self.DetectionSetGroup}) +local NewFriendliesNearbyGround=self:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +if OldFriendliesNearbyGround~=NewFriendliesNearbyGround then +DetectedItem.Changed=true +end +self:SetDetectedItemThreatLevel(DetectedItem) +if DETECTION_ZONES._SmokeDetectedUnits or self._SmokeDetectedUnits then +DetectedZone:SmokeZone(SMOKECOLOR.Red,30) +end +DetectedSet:ForEachUnit( +function(DetectedUnit) +if DetectedUnit:IsAlive()then +if DETECTION_ZONES._FlareDetectedUnits or self._FlareDetectedUnits then +DetectedUnit:FlareGreen() +end +if DETECTION_ZONES._SmokeDetectedUnits or self._SmokeDetectedUnits then +DetectedUnit:SmokeGreen() +end +end +end +) +if DETECTION_ZONES._FlareDetectedZones or self._FlareDetectedZones then +DetectedZone:FlareZone(SMOKECOLOR.White,30,math.random(0,90)) +end +if DETECTION_ZONES._SmokeDetectedZones or self._SmokeDetectedZones then +DetectedZone:SmokeZone(SMOKECOLOR.White,30) +end +if DETECTION_ZONES._BoundDetectedZones or self._BoundDetectedZones then +self.CountryID=DetectedSet:GetFirst():GetCountry() +DetectedZone:BoundZone(12,self.CountryID) +end +end +end +function DETECTION_ZONES:onafterDetection(From,Event,To,Detection,DetectionTimeStamp) +self.DetectionRun=self.DetectionRun+1 +if self.DetectionCount>0 and self.DetectionRun==self.DetectionCount then +self:CreateDetectionItems() +for DetectedItemID,DetectedItem in pairs(self.DetectedItems)do +self:UpdateDetectedItemDetection(DetectedItem) +self:CleanDetectionItem(DetectedItem,DetectedItemID) +if DetectedItem then +self:__DetectedItem(0.1,DetectedItem) +end +end +self:__Detect(-self.RefreshTimeInterval) +end +end +function DETECTION_ZONES:UpdateDetectedItemDetection(DetectedItem) +local IsDetected=true +DetectedItem.IsDetected=true +return IsDetected +end +end +do +DESIGNATE={ +ClassName="DESIGNATE", +} +function DESIGNATE:New(CC,Detection,AttackSet,Mission) +local self=BASE:Inherit(self,FSM:New()) +self:F({Detection}) +self:SetStartState("Designating") +self:AddTransition("*","Detect","*") +self:AddTransition("*","LaseOn","Lasing") +self:AddTransition("Lasing","Lasing","Lasing") +self:AddTransition("*","LaseOff","Designate") +self:AddTransition("*","Smoke","*") +self:AddTransition("*","Illuminate","*") +self:AddTransition("*","DoneSmoking","*") +self:AddTransition("*","DoneIlluminating","*") +self:AddTransition("*","Status","*") +self.CC=CC +self.Detection=Detection +self.AttackSet=AttackSet +self.RecceSet=Detection:GetDetectionSet() +self.Recces={} +self.Designating={} +self:SetDesignateName() +self:SetLaseDuration() +self:SetFlashStatusMenu(false) +self:SetFlashDetectionMessages(true) +self:SetMission(Mission) +self:SetLaserCodes({1688,1130,4785,6547,1465,4578}) +self:SetAutoLase(false,false) +self:SetThreatLevelPrioritization(false) +self:SetMaximumDesignations(5) +self:SetMaximumDistanceDesignations(8000) +self:SetMaximumMarkings(2) +self:SetDesignateMenu() +self.LaserCodesUsed={} +self.MenuLaserCodes={} +self.Detection:__Start(2) +self:__Detect(-15) +self.MarkScheduler=SCHEDULER:New(self) +return self +end +function DESIGNATE:SetFlashStatusMenu(FlashMenu) +self.FlashStatusMenu={} +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +self.FlashStatusMenu[AttackGroup]=FlashMenu +end +) +return self +end +function DESIGNATE:SetFlashDetectionMessages(FlashDetectionMessage) +self.FlashDetectionMessage={} +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +self.FlashDetectionMessage[AttackGroup]=FlashDetectionMessage +end +) +return self +end +function DESIGNATE:SetMaximumDesignations(MaximumDesignations) +self.MaximumDesignations=MaximumDesignations +return self +end +function DESIGNATE:SetMaximumDistanceGroundDesignation(MaximumDistanceGroundDesignation) +self.MaximumDistanceGroundDesignation=MaximumDistanceGroundDesignation +return self +end +function DESIGNATE:SetMaximumDistanceAirDesignation(MaximumDistanceAirDesignation) +self.MaximumDistanceAirDesignation=MaximumDistanceAirDesignation +return self +end +function DESIGNATE:SetMaximumDistanceDesignations(MaximumDistanceDesignations) +self.MaximumDistanceDesignations=MaximumDistanceDesignations +return self +end +function DESIGNATE:SetMaximumMarkings(MaximumMarkings) +self.MaximumMarkings=MaximumMarkings +return self +end +function DESIGNATE:SetLaserCodes(LaserCodes) +self.LaserCodes=(type(LaserCodes)=="table")and LaserCodes or{LaserCodes} +self:F({LaserCodes=self.LaserCodes}) +self.LaserCodesUsed={} +return self +end +function DESIGNATE:AddMenuLaserCode(LaserCode,MenuText) +self.MenuLaserCodes[LaserCode]=MenuText +self:SetDesignateMenu() +return self +end +function DESIGNATE:RemoveMenuLaserCode(LaserCode) +self.MenuLaserCodes[LaserCode]=nil +self:SetDesignateMenu() +return self +end +function DESIGNATE:SetDesignateName(DesignateName) +self.DesignateName="Designation"..(DesignateName and(" for "..DesignateName)or"") +return self +end +function DESIGNATE:SetLaseDuration(LaseDuration) +self.LaseDuration=LaseDuration or 120 +return self +end +function DESIGNATE:GenerateLaserCodes() +self.LaserCodes={} +local function containsDigit(_number,_numberToFind) +local _thisNumber=_number +local _thisDigit=0 +while _thisNumber~=0 do +_thisDigit=_thisNumber%10 +_thisNumber=math.floor(_thisNumber/10) +if _thisDigit==_numberToFind then +return true +end +end +return false +end +local _code=1111 +local _count=1 +while _code<1777 and _count<30 do +while true do +_code=_code+1 +if not containsDigit(_code,8) +and not containsDigit(_code,9) +and not containsDigit(_code,0)then +self:T(_code) +table.insert(self.LaserCodes,_code) +break +end +end +_count=_count+1 +end +self.LaserCodesUsed={} +return self +end +function DESIGNATE:SetAutoLase(AutoLase,Message) +self.AutoLase=AutoLase or false +if Message then +local AutoLaseOnOff=(self.AutoLase==true)and"On"or"Off" +local CC=self.CC:GetPositionable() +if CC then +CC:MessageToSetGroup(self.DesignateName..": Auto Lase "..AutoLaseOnOff..".",15,self.AttackSet) +end +end +self:CoordinateLase() +self:SetDesignateMenu() +return self +end +function DESIGNATE:SetThreatLevelPrioritization(Prioritize) +self.ThreatLevelPrioritization=Prioritize +return self +end +function DESIGNATE:SetMission(Mission) +self.Mission=Mission +return self +end +function DESIGNATE:onafterDetect() +self:__Detect(-math.random(60)) +self:DesignationScope() +self:CoordinateLase() +self:SendStatus() +self:SetDesignateMenu() +return self +end +function DESIGNATE:DesignationScope() +local DetectedItems=self.Detection:GetDetectedItemsByIndex() +local DetectedItemCount=0 +for DesignateIndex,Designating in pairs(self.Designating)do +local DetectedItem=self.Detection:GetDetectedItemByIndex(DesignateIndex) +if DetectedItem then +local IsDetected=self.Detection:IsDetectedItemDetected(DetectedItem) +self:F({IsDetected=IsDetected}) +if IsDetected==false then +self:F("Removing") +self.Designating[DesignateIndex]=nil +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +if AttackGroup:IsAlive()==true then +local DetectionText=self.Detection:DetectedItemReportSummary(DetectedItem,AttackGroup):Text(", ") +self.CC:GetPositionable():MessageToGroup("Targets out of LOS\n"..DetectionText,10,AttackGroup,self.DesignateName) +end +end +) +else +DetectedItemCount=DetectedItemCount+1 +end +else +self.Designating[DesignateIndex]=nil +end +end +if DetectedItemCount<5 then +for DesignateIndex,DetectedItem in pairs(DetectedItems)do +local IsDetected=self.Detection:IsDetectedItemDetected(DetectedItem) +if IsDetected==true then +self:F({DistanceRecce=DetectedItem.DistanceRecce}) +if DetectedItem.DistanceRecce<=self.MaximumDistanceDesignations then +if self.Designating[DesignateIndex]==nil then +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +if self.FlashDetectionMessage[AttackGroup]==true then +local DetectionText=self.Detection:DetectedItemReportSummary(DetectedItem,AttackGroup):Text(", ") +self.CC:GetPositionable():MessageToGroup("Targets detected at \n"..DetectionText,10,AttackGroup,self.DesignateName) +end +end +) +self.Designating[DesignateIndex]="" +break +end +end +end +end +end +return self +end +function DESIGNATE:CoordinateLase() +local DetectedItems=self.Detection:GetDetectedItemsByIndex() +for DesignateIndex,Designating in pairs(self.Designating)do +local DetectedItem=DetectedItems[DesignateIndex] +if DetectedItem then +if self.AutoLase then +self:LaseOn(DesignateIndex,self.LaseDuration) +end +end +end +return self +end +function DESIGNATE:SendStatus(MenuAttackGroup) +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +if self.FlashStatusMenu[AttackGroup]or(MenuAttackGroup and(AttackGroup:GetName()==MenuAttackGroup:GetName()))then +local DetectedReport=REPORT:New("Targets ready for Designation:") +local DetectedItems=self.Detection:GetDetectedItemsByIndex() +for DesignateIndex,Designating in pairs(self.Designating)do +local DetectedItem=DetectedItems[DesignateIndex] +if DetectedItem then +local Report=self.Detection:DetectedItemReportSummary(DetectedItem,AttackGroup,nil,true):Text(", ") +DetectedReport:Add(string.rep("-",40)) +DetectedReport:Add(" - "..Report) +if string.find(Designating,"L")then +DetectedReport:Add(" - ".."Lasing Targets") +end +if string.find(Designating,"S")then +DetectedReport:Add(" - ".."Smoking Targets") +end +if string.find(Designating,"I")then +DetectedReport:Add(" - ".."Illuminating Area") +end +end +end +local CC=self.CC:GetPositionable() +CC:MessageTypeToGroup(DetectedReport:Text("\n"),MESSAGE.Type.Information,AttackGroup,self.DesignateName) +local DesignationReport=REPORT:New("Marking Targets:") +self.RecceSet:ForEachGroupAlive( +function(RecceGroup) +local RecceUnits=RecceGroup:GetUnits() +for UnitID,RecceData in pairs(RecceUnits)do +local Recce=RecceData +if Recce:IsLasing()then +DesignationReport:Add(" - "..Recce:GetMessageText("Marking "..Recce:GetSpot().Target:GetTypeName().." with laser "..Recce:GetSpot().LaserCode..".")) +end +end +end +) +CC:MessageTypeToGroup(DesignationReport:Text(),MESSAGE.Type.Information,AttackGroup,self.DesignateName) +end +end +) +return self +end +function DESIGNATE:SetMenu(AttackGroup) +self.MenuDesignate=self.MenuDesignate or{} +local MissionMenu=nil +if self.Mission then +MissionMenu=self.Mission:GetMenu(AttackGroup) +end +local MenuTime=timer.getTime() +self.MenuDesignate[AttackGroup]=MENU_GROUP_DELAYED:New(AttackGroup,self.DesignateName,MissionMenu):SetTime(MenuTime):SetTag(self.DesignateName) +local MenuDesignate=self.MenuDesignate[AttackGroup] +if self.AutoLase then +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Auto Lase Off",MenuDesignate,self.MenuAutoLase,self,false):SetTime(MenuTime):SetTag(self.DesignateName) +else +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Auto Lase On",MenuDesignate,self.MenuAutoLase,self,true):SetTime(MenuTime):SetTag(self.DesignateName) +end +local StatusMenu=MENU_GROUP_DELAYED:New(AttackGroup,"Status",MenuDesignate):SetTime(MenuTime):SetTag(self.DesignateName) +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Report Status",StatusMenu,self.MenuStatus,self,AttackGroup):SetTime(MenuTime):SetTag(self.DesignateName) +if self.FlashStatusMenu[AttackGroup]then +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Flash Status Report Off",StatusMenu,self.MenuFlashStatus,self,AttackGroup,false):SetTime(MenuTime):SetTag(self.DesignateName) +else +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Flash Status Report On",StatusMenu,self.MenuFlashStatus,self,AttackGroup,true):SetTime(MenuTime):SetTag(self.DesignateName) +end +local DesignateCount=0 +for DesignateIndex,Designating in pairs(self.Designating)do +local DetectedItem=self.Detection:GetDetectedItemByIndex(DesignateIndex) +if DetectedItem then +local Coord=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local ID=self.Detection:GetDetectedItemID(DetectedItem) +local MenuText=ID +if DetectedItem.DesignateMenuName then +MenuText=string.format("(%3s) %s",Designating,DetectedItem.DesignateMenuName) +else +MenuText=string.format("(%3s) %s",Designating,MenuText) +end +local DetectedMenu=MENU_GROUP_DELAYED:New(AttackGroup,MenuText,MenuDesignate):SetTime(MenuTime):SetTag(self.DesignateName) +if string.find(Designating,"L",1,true)==nil then +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Search other target",DetectedMenu,self.MenuForget,self,DesignateIndex):SetTime(MenuTime):SetTag(self.DesignateName) +for LaserCode,MenuText in pairs(self.MenuLaserCodes)do +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,string.format(MenuText,LaserCode),DetectedMenu,self.MenuLaseCode,self,DesignateIndex,self.LaseDuration,LaserCode):SetTime(MenuTime):SetTag(self.DesignateName) +end +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Lase with random laser code(s)",DetectedMenu,self.MenuLaseOn,self,DesignateIndex,self.LaseDuration):SetTime(MenuTime):SetTag(self.DesignateName) +else +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Stop lasing",DetectedMenu,self.MenuLaseOff,self,DesignateIndex):SetTime(MenuTime):SetTag(self.DesignateName) +end +if string.find(Designating,"S",1,true)==nil then +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Smoke red",DetectedMenu,self.MenuSmoke,self,DesignateIndex,SMOKECOLOR.Red):SetTime(MenuTime):SetTag(self.DesignateName) +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Smoke blue",DetectedMenu,self.MenuSmoke,self,DesignateIndex,SMOKECOLOR.Blue):SetTime(MenuTime):SetTag(self.DesignateName) +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Smoke green",DetectedMenu,self.MenuSmoke,self,DesignateIndex,SMOKECOLOR.Green):SetTime(MenuTime):SetTag(self.DesignateName) +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Smoke white",DetectedMenu,self.MenuSmoke,self,DesignateIndex,SMOKECOLOR.White):SetTime(MenuTime):SetTag(self.DesignateName) +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Smoke orange",DetectedMenu,self.MenuSmoke,self,DesignateIndex,SMOKECOLOR.Orange):SetTime(MenuTime):SetTag(self.DesignateName) +end +if string.find(Designating,"I",1,true)==nil then +MENU_GROUP_COMMAND_DELAYED:New(AttackGroup,"Illuminate",DetectedMenu,self.MenuIlluminate,self,DesignateIndex):SetTime(MenuTime):SetTag(self.DesignateName) +end +end +DesignateCount=DesignateCount+1 +if DesignateCount>10 then +break +end +end +MenuDesignate:Remove(MenuTime,self.DesignateName) +MenuDesignate:Set() +end +function DESIGNATE:SetDesignateMenu() +self.AttackSet:Flush(self) +local Delay=1 +self.AttackSet:ForEachGroupAlive( +function(AttackGroup) +self:ScheduleOnce(Delay,self.SetMenu,self,AttackGroup) +Delay=Delay+1 +end +) +return self +end +function DESIGNATE:MenuStatus(AttackGroup) +self:F("Status") +self:SendStatus(AttackGroup) +end +function DESIGNATE:MenuFlashStatus(AttackGroup,Flash) +self:F("Flash Status") +self.FlashStatusMenu[AttackGroup]=Flash +self:SetDesignateMenu() +end +function DESIGNATE:MenuForget(Index) +self:F("Forget") +self.Designating[Index]="" +self:SetDesignateMenu() +end +function DESIGNATE:MenuAutoLase(AutoLase) +self:F("AutoLase") +self:SetAutoLase(AutoLase,true) +end +function DESIGNATE:MenuSmoke(Index,Color) +self:F("Designate through Smoke") +if string.find(self.Designating[Index],"S")==nil then +self.Designating[Index]=self.Designating[Index].."S" +end +self:Smoke(Index,Color) +self:SetDesignateMenu() +end +function DESIGNATE:MenuIlluminate(Index) +self:F("Designate through Illumination") +if string.find(self.Designating[Index],"I",1,true)==nil then +self.Designating[Index]=self.Designating[Index].."I" +end +self:__Illuminate(1,Index) +self:SetDesignateMenu() +end +function DESIGNATE:MenuLaseOn(Index,Duration) +self:F("Designate through Lase") +self:__LaseOn(1,Index,Duration) +self:SetDesignateMenu() +end +function DESIGNATE:MenuLaseCode(Index,Duration,LaserCode) +self:F("Designate through Lase using "..LaserCode) +self:__LaseOn(1,Index,Duration,LaserCode) +self:SetDesignateMenu() +end +function DESIGNATE:MenuLaseOff(Index,Duration) +self:F("Lasing off") +self.Designating[Index]=string.gsub(self.Designating[Index],"L","") +self:__LaseOff(1,Index) +self:SetDesignateMenu() +end +function DESIGNATE:onafterLaseOn(From,Event,To,Index,Duration,LaserCode) +if string.find(self.Designating[Index],"L",1,true)==nil then +self.Designating[Index]=self.Designating[Index].."L" +self.LaseStart=timer.getTime() +self.LaseDuration=Duration +self:Lasing(Index,Duration,LaserCode) +end +end +function DESIGNATE:onafterLasing(From,Event,To,Index,Duration,LaserCodeRequested) +local DetectedItem=self.Detection:GetDetectedItemByIndex(Index) +local TargetSetUnit=self.Detection:GetDetectedItemSet(DetectedItem) +local MarkingCount=0 +local MarkedTypes={} +for TargetUnit,RecceData in pairs(self.Recces)do +local Recce=RecceData +self:F({TargetUnit=TargetUnit,Recce=Recce:GetName()}) +if not Recce:IsLasing()then +local LaserCode=Recce:GetLaserCode() +self:F({ClearingLaserCode=LaserCode}) +self.LaserCodesUsed[LaserCode]=nil +self.Recces[TargetUnit]=nil +end +end +if LaserCodeRequested then +for TargetUnit,RecceData in pairs(self.Recces)do +local Recce=RecceData +self:F({TargetUnit=TargetUnit,Recce=Recce:GetName()}) +if Recce:IsLasing()then +Recce:LaseOff() +local LaserCode=Recce:GetLaserCode() +self:F({ClearingLaserCode=LaserCode}) +self.LaserCodesUsed[LaserCode]=nil +self.Recces[TargetUnit]=nil +break +end +end +end +if TargetSetUnit==nil then return end +if self.AutoLase or(not self.AutoLase and(self.LaseStart+Duration>=timer.getTime()))then +TargetSetUnit:ForEachUnitPerThreatLevel(10,0, +function(TargetUnit) +self:F({TargetUnit=TargetUnit:GetName()}) +if MarkingCount<self.MaximumMarkings then +if TargetUnit:IsAlive()then +local Recce=self.Recces[TargetUnit] +if not Recce then +self:F("Lasing...") +for RecceGroupID,RecceGroup in pairs(self.RecceSet:GetSet())do +for UnitID,UnitData in pairs(RecceGroup:GetUnits()or{})do +local RecceUnit=UnitData +local RecceUnitDesc=RecceUnit:GetDesc() +if RecceUnit:IsLasing()==false then +if RecceUnit:IsDetected(TargetUnit)and RecceUnit:IsLOS(TargetUnit)then +local LaserCodeIndex=math.random(1,#self.LaserCodes) +local LaserCode=self.LaserCodes[LaserCodeIndex] +if LaserCodeRequested and LaserCodeRequested~=LaserCode then +LaserCode=LaserCodeRequested +LaserCodeRequested=nil +end +if not self.LaserCodesUsed[LaserCode]then +self.LaserCodesUsed[LaserCode]=LaserCodeIndex +local Spot=RecceUnit:LaseUnit(TargetUnit,LaserCode,Duration) +local AttackSet=self.AttackSet +local DesignateName=self.DesignateName +local typename=TargetUnit:GetTypeName() +function Spot:OnAfterDestroyed(From,Event,To) +self.Recce:MessageToSetGroup("Target "..typename.." destroyed. "..TargetSetUnit:CountAlive().." targets left.", +5,AttackSet,self.DesignateName) +end +self.Recces[TargetUnit]=RecceUnit +MarkingCount=MarkingCount+1 +local TargetUnitType=TargetUnit:GetTypeName() +RecceUnit:MessageToSetGroup("Marking "..TargetUnitType.." with laser "..RecceUnit:GetSpot().LaserCode.." for "..Duration.."s.", +10,self.AttackSet,DesignateName) +if not MarkedTypes[TargetUnitType]then +MarkedTypes[TargetUnitType]=true +end +return +end +else +end +else +if not RecceUnit:IsDetected(TargetUnit)or not RecceUnit:IsLOS(TargetUnit)then +local Recce=self.Recces[TargetUnit] +if Recce then +Recce:LaseOff() +Recce:MessageToSetGroup("Target "..TargetUnit:GetTypeName()"out of LOS. Cancelling lase!",10,self.AttackSet,self.DesignateName) +end +else +local TargetUnitType=TargetUnit:GetTypeName() +if not MarkedTypes[TargetUnitType]then +MarkedTypes[TargetUnitType]=true +end +end +end +end +end +else +MarkingCount=MarkingCount+1 +local TargetUnitType=TargetUnit:GetTypeName() +if not MarkedTypes[TargetUnitType]then +MarkedTypes[TargetUnitType]=true +end +Recce:MessageToSetGroup(self.DesignateName..": Marking "..TargetUnit:GetTypeName().." with laser "..Recce.LaserCode..".",10,self.AttackSet) +end +end +end +end +) +self:__Lasing(-self.LaseDuration,Index,Duration,LaserCodeRequested) +self:SetDesignateMenu() +else +self:LaseOff(Index) +end +end +function DESIGNATE:onafterLaseOff(From,Event,To,Index) +local CC=self.CC:GetPositionable() +if CC then +CC:MessageToSetGroup("Stopped lasing.",5,self.AttackSet,self.DesignateName) +end +local DetectedItem=self.Detection:GetDetectedItemByIndex(Index) +local TargetSetUnit=self.Detection:GetDetectedItemSet(DetectedItem) +local Recces=self.Recces +for TargetID,RecceData in pairs(Recces)do +local Recce=RecceData +Recce:MessageToSetGroup("Stopped lasing "..Recce:GetSpot().Target:GetTypeName()..".",5,self.AttackSet,self.DesignateName) +Recce:LaseOff() +end +Recces=nil +self.Recces={} +self.LaserCodesUsed={} +self.Designating[Index]=string.gsub(self.Designating[Index],"L","") +self:SetDesignateMenu() +end +function DESIGNATE:onafterSmoke(From,Event,To,Index,Color) +local DetectedItem=self.Detection:GetDetectedItemByIndex(Index) +local TargetSetUnit=self.Detection:GetDetectedItemSet(DetectedItem) +local TargetSetUnitCount=TargetSetUnit:Count() +local MarkedCount=0 +TargetSetUnit:ForEachUnitPerThreatLevel(10,0, +function(SmokeUnit) +if MarkedCount<self.MaximumMarkings then +MarkedCount=MarkedCount+1 +self:F("Smoking ...") +local RecceGroup=self.RecceSet:FindNearestGroupFromPointVec2(SmokeUnit:GetPointVec2()) +local RecceUnit=RecceGroup:GetUnit(1) +if RecceUnit then +RecceUnit:MessageToSetGroup("Smoking "..SmokeUnit:GetTypeName()..".",5,self.AttackSet,self.DesignateName) +if SmokeUnit:IsAlive()then +SmokeUnit:Smoke(Color,50,2) +end +self.MarkScheduler:Schedule(self, +function() +self:DoneSmoking(Index) +end,{},math.random(180,240) +) +end +end +end +) +end +function DESIGNATE:onafterIlluminate(From,Event,To,Index) +local DetectedItem=self.Detection:GetDetectedItemByIndex(Index) +local TargetSetUnit=self.Detection:GetDetectedItemSet(DetectedItem) +local TargetUnit=TargetSetUnit:GetFirst() +if TargetUnit then +local RecceGroup=self.RecceSet:FindNearestGroupFromPointVec2(TargetUnit:GetPointVec2()) +local RecceUnit=RecceGroup:GetUnit(1) +if RecceUnit then +RecceUnit:MessageToSetGroup("Illuminating "..TargetUnit:GetTypeName()..".",5,self.AttackSet,self.DesignateName) +if TargetUnit:IsAlive()then +TargetUnit:GetPointVec3():AddY(math.random(350,500)):AddX(math.random(-50,50)):AddZ(math.random(-50,50)):IlluminationBomb() +TargetUnit:GetPointVec3():AddY(math.random(350,500)):AddX(math.random(-50,50)):AddZ(math.random(-50,50)):IlluminationBomb() +end +self.MarkScheduler:Schedule(self, +function() +self:DoneIlluminating(Index) +end,{},math.random(60,90) +) +end +end +end +function DESIGNATE:onafterDoneSmoking(From,Event,To,Index) +if self.Designating[Index]~=nil then +self.Designating[Index]=string.gsub(self.Designating[Index],"S","") +self:SetDesignateMenu() +end +end +function DESIGNATE:onafterDoneIlluminating(From,Event,To,Index) +self.Designating[Index]=string.gsub(self.Designating[Index],"I","") +self:SetDesignateMenu() +end +end +RAT={ +ClassName="RAT", +Debug=false, +templategroup=nil, +alias=nil, +spawninitialized=false, +spawndelay=5, +spawninterval=5, +coalition=nil, +country=nil, +category=nil, +groupsize=nil, +friendly="same", +ctable={}, +aircraft={}, +Vcruisemax=nil, +Vclimb=1500, +AlphaDescent=3.6, +roe="hold", +rot="noreaction", +takeoff=0, +landing=9, +mindist=5000, +maxdist=5000000, +airports_map={}, +airports={}, +random_departure=true, +random_destination=true, +departure_ports={}, +destination_ports={}, +Ndestination_Airports=0, +Ndestination_Zones=0, +Ndeparture_Airports=0, +Ndeparture_Zones=0, +destinationzone=false, +return_zones={}, +returnzone=false, +excluded_ports={}, +departure_Azone=nil, +destination_Azone=nil, +addfriendlydepartures=false, +addfriendlydestinations=false, +ratcraft={}, +Tinactive=600, +reportstatus=false, +statusinterval=30, +placemarkers=false, +FLcruise=nil, +FLminuser=nil, +FLmaxuser=nil, +FLuser=nil, +commute=false, +starshape=false, +homebase=nil, +continuejourney=false, +alive=0, +ngroups=nil, +f10menu=false, +Menu={}, +SubMenuName=nil, +respawn_at_landing=false, +norespawn=false, +respawn_after_takeoff=false, +respawn_after_crash=true, +respawn_inair=true, +respawn_delay=0, +markerids={}, +waypointdescriptions={}, +waypointstatus={}, +livery=nil, +skill="High", +ATCswitch=true, +radio=nil, +frequency=nil, +modulation=nil, +actype=nil, +uncontrolled=false, +invisible=false, +immortal=false, +activate_uncontrolled=false, +activate_delay=5, +activate_delta=5, +activate_frand=0, +activate_max=1, +onboardnum=nil, +onboardnum0=1, +checkonrunway=true, +onrunwayradius=75, +onrunwaymaxretry=3, +checkontop=false, +ontopradius=2, +termtype=nil, +parkingscanradius=40, +parkingscanscenery=false, +parkingverysafe=false, +despawnair=true, +eplrs=false, +} +RAT.cat={ +plane="plane", +heli="heli", +} +RAT.wp={ +coldorhot=0, +air=1, +runway=2, +hot=3, +cold=4, +climb=5, +cruise=6, +descent=7, +holding=8, +landing=9, +finalwp=10, +} +RAT.status={ +Departure="At departure point", +Climb="Climbing", +Cruise="Cruising", +Uturn="Flying back home", +Descent="Descending", +DescentHolding="Descend to holding point", +Holding="Holding", +Destination="Arrived at destination", +Uncontrolled="Uncontrolled", +Spawned="Spawned", +EventBirthAir="Born in air", +EventBirth="Ready and starting engines", +EventEngineStartAir="On journey", +EventEngineStart="Started engines and taxiing", +EventTakeoff="Airborne after take-off", +EventLand="Landed and taxiing", +EventEngineShutdown="Engines off", +EventDead="Dead", +EventCrash="Crashed", +} +RAT.coal={ +same="same", +sameonly="sameonly", +neutral="neutral", +} +RAT.unit={ +ft2meter=0.305, +kmh2ms=0.278, +FL2m=30.48, +nm2km=1.852, +nm2m=1852, +} +RAT.ROE={ +weaponhold="hold", +weaponfree="free", +returnfire="return", +} +RAT.ROT={ +evade="evade", +passive="passive", +noreaction="noreaction", +} +RAT.ATC={ +init=false, +flight={}, +airport={}, +unregistered=-1, +onfinal=-100, +Nclearance=2, +delay=240, +messages=true, +} +RAT.markerid=0 +RAT.MenuF10=nil +RAT.id="RAT | " +RAT.version={ +version="3.0.0", +print=true, +} +function RAT:New(groupname,alias) +self=BASE:Inherit(self,SPAWN:NewWithAlias(groupname,alias)) +self.lid=string.format("RAT %s | ",alias or groupname) +if RAT.version.print then +env.info(self.lid.."Version "..RAT.version.version) +RAT.version.print=false +end +self:F(self.lid..string.format("Creating new RAT object from template: %s.",groupname)) +alias=alias or groupname +self.alias=alias +local DCSgroup=Group.getByName(groupname) +if DCSgroup==nil then +self:E(self.lid..string.format("ERROR: Group with name %s does not exist in the mission editor!",groupname)) +return nil +end +self.templategroup=GROUP:FindByName(groupname) +self.groupsize=self.templategroup:GetSize() +self.coalition=DCSgroup:getCoalition() +self:_InitAircraft(DCSgroup) +self:_GetAirportsOfMap() +return self +end +function RAT:Stop(delay) +self:T3(self.lid..string.format("Stopping RAT! Delay %s sec!",tostring(delay))) +if delay and delay>0 then +self:T2(self.lid..string.format("Stopping RAT in %d sec!",delay)) +self:ScheduleOnce(delay,RAT.Stop,self) +else +self:T(self.lid.."Stopping RAT: Clearing schedulers and unhandling events!") +if self.sid_Activate then +self.Scheduler:ScheduleStop(self.sid_Activate) +end +if self.sid_Spawn then +self.Scheduler:ScheduleStop(self.sid_Spawn) +end +if self.sid_Status then +self.Scheduler:ScheduleStop(self.sid_Status) +end +if self.Scheduler then +self.Scheduler:Clear() +end +self.norespawn=true +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.EngineStartup) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Hit) +end +end +function RAT:Spawn(naircraft) +if self.spawninitialized==true then +self:E("ERROR: Spawn function should only be called once per RAT object! Exiting and returning nil.") +return nil +else +self.spawninitialized=true +end +self.ngroups=naircraft or 1 +if self.ATCswitch and not RAT.ATC.init then +RAT._ATCInit(self.airports_map) +end +if self.f10menu and not RAT.MenuF10 then +RAT.MenuF10=MENU_MISSION:New("RAT") +end +self:_SetCoalitionTable() +self:_GetAirportsOfCoalition() +if not self.SubMenuName then +self.SubMenuName=self.alias +end +if self.departure_Azone~=nil then +self.departure_ports=self:_GetAirportsInZone(self.departure_Azone) +end +if self.destination_Azone~=nil then +self.destination_ports=self:_GetAirportsInZone(self.destination_Azone) +end +if self.addfriendlydepartures then +self:_AddFriendlyAirports(self.departure_ports) +end +if self.addfriendlydestinations then +self:_AddFriendlyAirports(self.destination_ports) +end +if self.FLcruise==nil then +if self.category==RAT.cat.plane then +self.FLcruise=200*RAT.unit.FL2m +else +self.FLcruise=005*RAT.unit.FL2m +end +end +if self.category==RAT.cat.heli then +self.mindist=50 +end +self:_CheckConsistency() +local text=string.format("\n******************************************************\n") +text=text..string.format("Spawning %i aircraft from template %s of type %s.\n",self.ngroups,self.SpawnTemplatePrefix,self.aircraft.type) +text=text..string.format("Alias: %s\n",self.alias) +text=text..string.format("Category: %s\n",self.category) +text=text..string.format("Friendly coalitions: %s\n",self.friendly) +text=text..string.format("Number of airports on map : %i\n",#self.airports_map) +text=text..string.format("Number of friendly airports: %i\n",#self.airports) +text=text..string.format("Totally random departure: %s\n",tostring(self.random_departure)) +if not self.random_departure then +text=text..string.format("Number of departure airports: %d\n",self.Ndeparture_Airports) +text=text..string.format("Number of departure zones : %d\n",self.Ndeparture_Zones) +end +text=text..string.format("Totally random destination: %s\n",tostring(self.random_destination)) +if not self.random_destination then +text=text..string.format("Number of destination airports: %d\n",self.Ndestination_Airports) +text=text..string.format("Number of destination zones : %d\n",self.Ndestination_Zones) +end +text=text..string.format("Min dist to destination: %4.1f\n",self.mindist) +text=text..string.format("Max dist to destination: %4.1f\n",self.maxdist) +text=text..string.format("Terminal type: %s\n",tostring(self.termtype)) +text=text..string.format("Takeoff type: %i\n",self.takeoff) +text=text..string.format("Landing type: %i\n",self.landing) +text=text..string.format("Commute: %s\n",tostring(self.commute)) +text=text..string.format("Journey: %s\n",tostring(self.continuejourney)) +text=text..string.format("Destination Zone: %s\n",tostring(self.destinationzone)) +text=text..string.format("Return Zone: %s\n",tostring(self.returnzone)) +text=text..string.format("Spawn delay: %4.1f\n",self.spawndelay) +text=text..string.format("Spawn interval: %4.1f\n",self.spawninterval) +text=text..string.format("Respawn delay: %s\n",tostring(self.respawn_delay)) +text=text..string.format("Respawn off: %s\n",tostring(self.norespawn)) +text=text..string.format("Respawn after landing: %s\n",tostring(self.respawn_at_landing)) +text=text..string.format("Respawn after take-off: %s\n",tostring(self.respawn_after_takeoff)) +text=text..string.format("Respawn after crash: %s\n",tostring(self.respawn_after_crash)) +text=text..string.format("Respawn in air: %s\n",tostring(self.respawn_inair)) +text=text..string.format("ROE: %s\n",tostring(self.roe)) +text=text..string.format("ROT: %s\n",tostring(self.rot)) +text=text..string.format("Immortal: %s\n",tostring(self.immortal)) +text=text..string.format("Invisible: %s\n",tostring(self.invisible)) +text=text..string.format("Vclimb: %4.1f\n",self.Vclimb) +text=text..string.format("AlphaDescent: %4.2f\n",self.AlphaDescent) +text=text..string.format("Vcruisemax: %s\n",tostring(self.Vcruisemax)) +text=text..string.format("FLcruise = %6.1f km = FL%3.0f\n",self.FLcruise/1000,self.FLcruise/RAT.unit.FL2m) +text=text..string.format("FLuser: %s\n",tostring(self.Fluser)) +text=text..string.format("FLminuser: %s\n",tostring(self.FLminuser)) +text=text..string.format("FLmaxuser: %s\n",tostring(self.FLmaxuser)) +text=text..string.format("Place markers: %s\n",tostring(self.placemarkers)) +text=text..string.format("Report status: %s\n",tostring(self.reportstatus)) +text=text..string.format("Status interval: %4.1f\n",self.statusinterval) +text=text..string.format("Time inactive: %4.1f\n",self.Tinactive) +text=text..string.format("Create F10 menu : %s\n",tostring(self.f10menu)) +text=text..string.format("F10 submenu name: %s\n",self.SubMenuName) +text=text..string.format("ATC enabled : %s\n",tostring(self.ATCswitch)) +text=text..string.format("Radio comms : %s\n",tostring(self.radio)) +text=text..string.format("Radio frequency : %s\n",tostring(self.frequency)) +text=text..string.format("Radio modulation : %s\n",tostring(self.frequency)) +text=text..string.format("Tail # prefix : %s\n",tostring(self.onboardnum)) +text=text..string.format("Check on runway: %s\n",tostring(self.checkonrunway)) +text=text..string.format("Max respawn attempts: %s\n",tostring(self.onrunwaymaxretry)) +text=text..string.format("Check on top: %s\n",tostring(self.checkontop)) +text=text..string.format("Uncontrolled: %s\n",tostring(self.uncontrolled)) +if self.uncontrolled and self.activate_uncontrolled then +text=text..string.format("Uncontrolled max : %4.1f\n",self.activate_max) +text=text..string.format("Uncontrolled delay: %4.1f\n",self.activate_delay) +text=text..string.format("Uncontrolled delta: %4.1f\n",self.activate_delta) +text=text..string.format("Uncontrolled frand: %4.1f\n",self.activate_frand) +end +if self.livery then +text=text..string.format("Available liveries:\n") +for _,livery in pairs(self.livery)do +text=text..string.format("- %s\n",livery) +end +end +text=text..string.format("******************************************************\n") +self:T(self.lid..text) +if self.f10menu then +self.Menu[self.SubMenuName]=MENU_MISSION:New(self.SubMenuName,RAT.MenuF10) +self.Menu[self.SubMenuName]["groups"]=MENU_MISSION:New("Groups",self.Menu[self.SubMenuName]) +MENU_MISSION_COMMAND:New("Spawn new group",self.Menu[self.SubMenuName],self._SpawnWithRoute,self) +MENU_MISSION_COMMAND:New("Delete markers",self.Menu[self.SubMenuName],self._DeleteMarkers,self) +MENU_MISSION_COMMAND:New("Status report",self.Menu[self.SubMenuName],self.Status,self,true) +end +local Tstart=self.spawndelay +local dt=self.spawninterval +if self.takeoff==RAT.wp.runway and not self.random_departure then +dt=math.max(dt,180) +end +local Tstop=Tstart+dt*(self.ngroups-1) +self.sid_Status=self:ScheduleRepeat(Tstart+1,self.statusinterval,nil,nil,RAT.Status,self) +self:HandleEvent(EVENTS.Birth,self._OnBirth) +self:HandleEvent(EVENTS.EngineStartup,self._OnEngineStartup) +self:HandleEvent(EVENTS.Takeoff,self._OnTakeoff) +self:HandleEvent(EVENTS.Land,self._OnLand) +self:HandleEvent(EVENTS.EngineShutdown,self._OnEngineShutdown) +self:HandleEvent(EVENTS.Dead,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self._OnDeadOrCrash) +self:HandleEvent(EVENTS.Hit,self._OnHit) +if self.ngroups==0 then +return nil +end +self.sid_Spawn=self:ScheduleRepeat(Tstart,dt,0.0,Tstop,RAT._SpawnWithRoute,self) +if self.uncontrolled and self.activate_uncontrolled then +self.sid_Activate=self:ScheduleRepeat(self.activate_delay,self.activate_delta,self.activate_frand,nil,RAT._ActivateUncontrolled,self) +end +return true +end +function RAT:_CheckConsistency() +self:F2() +if not self.random_departure then +for _,name in pairs(self.departure_ports)do +if self:_AirportExists(name)then +self.Ndeparture_Airports=self.Ndeparture_Airports+1 +elseif self:_ZoneExists(name)then +self.Ndeparture_Zones=self.Ndeparture_Zones+1 +end +end +if self.Ndeparture_Zones>0 and self.takeoff~=RAT.wp.air then +self.takeoff=RAT.wp.air +self:E(self.lid..string.format("WARNING: At least one zone defined as departure and takeoff is NOT set to air. Enabling air start for RAT group %s!",self.alias)) +end +if self.Ndeparture_Airports==0 and self.Ndeparture_Zone==0 then +self.random_departure=true +local text=string.format("No airports or zones found given in SetDeparture(). Enabling random departure airports for RAT group %s!",self.alias) +self:E(self.lid.."ERROR: "..text) +MESSAGE:New(text,30):ToAll() +end +end +if not self.random_destination then +for _,name in pairs(self.destination_ports)do +if self:_AirportExists(name)then +self.Ndestination_Airports=self.Ndestination_Airports+1 +elseif self:_ZoneExists(name)then +self.Ndestination_Zones=self.Ndestination_Zones+1 +end +end +if self.Ndestination_Zones>0 and self.landing~=RAT.wp.air and not self.returnzone then +self.landing=RAT.wp.air +self.destinationzone=true +self:E(self.lid.."WARNING: At least one zone defined as destination and landing is NOT set to air. Enabling destination zone!") +end +if self.Ndestination_Airports==0 and self.Ndestination_Zones==0 then +self.random_destination=true +local text="No airports or zones found given in SetDestination(). Enabling random destination airports!" +self:E(self.lid.."ERROR: "..text) +MESSAGE:New(text,30):ToAll() +end +end +if self.destinationzone and self.returnzone then +self:E(self.lid.."ERROR: Destination zone _and_ return to zone not possible! Disabling return to zone.") +self.returnzone=false +end +if self.returnzone and self.takeoff==RAT.wp.air then +self.landing=RAT.wp.air +end +if self.FLminuser then +self.FLminuser=math.min(self.FLminuser,self.aircraft.ceiling) +end +if self.FLmaxuser then +self.FLmaxuser=math.min(self.FLmaxuser,self.aircraft.ceiling) +end +if self.FLcruise then +self.FLcruise=math.min(self.FLcruise,self.aircraft.ceiling) +end +if self.FLminuser and self.FLmaxuser then +if self.FLminuser>self.FLmaxuser then +local min=self.FLminuser +local max=self.FLmaxuser +self.FLminuser=max +self.FLmaxuser=min +end +end +if self.FLminuser and self.FLcruise<self.FLminuser then +self.FLcruise=self.FLminuser +end +if self.FLmaxuser and self.FLcruise>self.FLmaxuser then +self.FLcruise=self.FLmaxuser +end +if self.uncontrolled then +self.takeoff=RAT.wp.cold +end +end +function RAT:SetCoalition(friendly) +self:F2(friendly) +if friendly:lower()=="sameonly"then +self.friendly=RAT.coal.sameonly +elseif friendly:lower()=="neutral"then +self.friendly=RAT.coal.neutral +else +self.friendly=RAT.coal.same +end +return self +end +function RAT:SetCoalitionAircraft(color) +self:F2(color) +if color:lower()=="blue"then +self.coalition=coalition.side.BLUE +if not self.country then +self.country=country.id.USA +end +elseif color:lower()=="red"then +self.coalition=coalition.side.RED +if not self.country then +self.country=country.id.RUSSIA +end +elseif color:lower()=="neutral"then +self.coalition=coalition.side.NEUTRAL +if not self.country then +self.country=country.id.SWITZERLAND +end +end +return self +end +function RAT:SetCountry(id) +self:F2(id) +self.country=id +return self +end +function RAT:SetTerminalType(termtype) +self:F2(termtype) +self.termtype=termtype +return self +end +function RAT:SetParkingScanRadius(radius) +self:F2(radius) +self.parkingscanradius=radius or 50 +return self +end +function RAT:SetParkingScanSceneryON() +self:F2() +self.parkingscanscenery=true +return self +end +function RAT:SetParkingScanSceneryOFF() +self:F2() +self.parkingscanscenery=false +return self +end +function RAT:SetParkingSpotSafeON() +self:F2() +self.parkingverysafe=true +return self +end +function RAT:SetParkingSpotSafeOFF() +self:F2() +self.parkingverysafe=false +return self +end +function RAT:SetDespawnAirOFF() +self.despawnair=false +return self +end +function RAT:SetTakeoff(type) +self:F2(type) +local _Type +if type:lower()=="takeoff-cold"or type:lower()=="cold"then +_Type=RAT.wp.cold +elseif type:lower()=="takeoff-hot"or type:lower()=="hot"then +_Type=RAT.wp.hot +elseif type:lower()=="takeoff-runway"or type:lower()=="runway"then +_Type=RAT.wp.runway +elseif type:lower()=="air"then +_Type=RAT.wp.air +else +_Type=RAT.wp.coldorhot +end +self.takeoff=_Type +return self +end +function RAT:SetTakeoffCold() +self.takeoff=RAT.wp.cold +return self +end +function RAT:SetTakeoffHot() +self.takeoff=RAT.wp.hot +return self +end +function RAT:SetTakeoffRunway() +self.takeoff=RAT.wp.runway +return self +end +function RAT:SetTakeoffColdOrHot() +self.takeoff=RAT.wp.coldorhot +return self +end +function RAT:SetTakeoffAir() +self.takeoff=RAT.wp.air +return self +end +function RAT:SetDeparture(departurenames) +self:F2(departurenames) +self.random_departure=false +local names +if type(departurenames)=="table"then +names=departurenames +elseif type(departurenames)=="string"then +names={departurenames} +else +self:E(self.lid.."ERROR: Input parameter must be a string or a table in SetDeparture()!") +end +for _,name in pairs(names)do +if self:_AirportExists(name)then +table.insert(self.departure_ports,name) +elseif self:_ZoneExists(name)then +table.insert(self.departure_ports,name) +else +self:E(self.lid.."ERROR: No departure airport or zone found with name "..name) +end +end +return self +end +function RAT:SetDestination(destinationnames) +self:F2(destinationnames) +self.random_destination=false +local names +if type(destinationnames)=="table"then +names=destinationnames +elseif type(destinationnames)=="string"then +names={destinationnames} +else +self:E(self.lid.."ERROR: Input parameter must be a string or a table in SetDestination()!") +end +for _,name in pairs(names)do +if self:_AirportExists(name)then +table.insert(self.destination_ports,name) +elseif self:_ZoneExists(name)then +table.insert(self.destination_ports,name) +else +self:E(self.lid.."ERROR: No destination airport or zone found with name "..name) +end +end +return self +end +function RAT:DestinationZone() +self:F2() +self.destinationzone=true +self.landing=RAT.wp.air +return self +end +function RAT:ReturnZone() +self:F2() +self.returnzone=true +return self +end +function RAT:SetDestinationsFromZone(zone) +self:F2(zone) +self.random_destination=false +self.destination_Azone=zone +return self +end +function RAT:SetDeparturesFromZone(zone) +self:F2(zone) +self.random_departure=false +self.departure_Azone=zone +return self +end +function RAT:AddFriendlyAirportsToDepartures() +self:F2() +self.addfriendlydepartures=true +return self +end +function RAT:AddFriendlyAirportsToDestinations() +self:F2() +self.addfriendlydestinations=true +return self +end +function RAT:ExcludedAirports(ports) +self:F2(ports) +if type(ports)=="string"then +self.excluded_ports={ports} +else +self.excluded_ports=ports +end +return self +end +function RAT:SetAISkill(skill) +self:F2(skill) +if skill:lower()=="average"then +self.skill="Average" +elseif skill:lower()=="good"then +self.skill="Good" +elseif skill:lower()=="excellent"then +self.skill="Excellent" +elseif skill:lower()=="random"then +self.skill="Random" +else +self.skill="High" +end +return self +end +function RAT:Livery(skins) +self:F2(skins) +if type(skins)=="string"then +self.livery={skins} +else +self.livery=skins +end +return self +end +function RAT:ChangeAircraft(actype) +self:F2(actype) +self.actype=actype +return self +end +function RAT:ContinueJourney() +self:F2() +self.continuejourney=true +self.commute=false +return self +end +function RAT:Commute(starshape) +self:F2() +self.commute=true +self.continuejourney=false +if starshape then +self.starshape=starshape +else +self.starshape=false +end +return self +end +function RAT:SetSpawnDelay(delay) +self:F2(delay) +delay=delay or 5 +self.spawndelay=math.max(0.5,delay) +return self +end +function RAT:SetSpawnInterval(interval) +self:F2(interval) +interval=interval or 5 +self.spawninterval=math.max(0.5,interval) +return self +end +function RAT:SetSpawnLimit(Nmax) +self.NspawnMax=Nmax +return self +end +function RAT:RespawnAfterLanding(delay) +self:F2(delay) +self.respawn_at_landing=true +self:SetRespawnDelay(delay) +return self +end +function RAT:SetRespawnDelay(delay) +self:F2(delay) +delay=delay or 1.0 +delay=math.max(1.0,delay) +self.respawn_delay=delay +return self +end +function RAT:NoRespawn() +self:F2() +self.norespawn=true +return self +end +function RAT:SetMaxRespawnTriedWhenSpawnedOnRunway(n) +self:F2(n) +n=n or 3 +self.onrunwaymaxretry=n +return self +end +function RAT:RespawnAfterTakeoff() +self:F2() +self.respawn_after_takeoff=true +return self +end +function RAT:RespawnAfterCrashON() +self:F2() +self.respawn_after_crash=true +return self +end +function RAT:RespawnAfterCrashOFF() +self:F2() +self.respawn_after_crash=false +return self +end +function RAT:RespawnInAirAllowed() +self:F2() +self.respawn_inair=true +return self +end +function RAT:RespawnInAirNotAllowed() +self:F2() +self.respawn_inair=false +return self +end +function RAT:CheckOnRunway(switch,distance) +self:F2(switch) +if switch==nil then +switch=true +end +self.checkonrunway=switch +self.onrunwayradius=distance or 75 +return self +end +function RAT:CheckOnTop(switch,radius) +self:F2(switch) +if switch==nil then +switch=true +end +self.checkontop=switch +self.ontopradius=radius or 2 +return self +end +function RAT:RadioON() +self:F2() +self.radio=true +return self +end +function RAT:RadioOFF() +self:F2() +self.radio=false +return self +end +function RAT:RadioFrequency(frequency) +self:F2(frequency) +self.frequency=frequency +return self +end +function RAT:RadioModulation(modulation) +self:F2(modulation) +if modulation=="AM"then +self.modulation=radio.modulation.AM +elseif modulation=="FM"then +self.modulation=radio.modulation.FM +else +self.modulation=radio.modulation.AM +end +return self +end +function RAT:RadioMenuON() +self:F2() +self.f10menu=true +return self +end +function RAT:RadioMenuOFF() +self:F2() +self.f10menu=false +return self +end +function RAT:Invisible() +self:F2() +self.invisible=true +return self +end +function RAT:SetEPLRS(switch) +if switch==nil or switch==true then +self.eplrs=true +else +self.eplrs=false +end +return self +end +function RAT:Immortal() +self:F2() +self.immortal=true +return self +end +function RAT:Uncontrolled() +self:F2() +self.uncontrolled=true +return self +end +function RAT:ActivateUncontrolled(maxactivated,delay,delta,frand) +self:F2({max=maxactivated,delay=delay,delta=delta,rand=frand}) +self.activate_uncontrolled=true +self.activate_max=maxactivated or 1 +self.activate_delay=delay or 1 +self.activate_delta=delta or 1 +self.activate_frand=frand or 0 +self.activate_delay=math.max(self.activate_delay,1) +self.activate_delta=math.max(self.activate_delta,0) +self.activate_frand=math.max(self.activate_frand,0) +self.activate_frand=math.min(self.activate_frand,1) +return self +end +function RAT:TimeDestroyInactive(time) +self:F2(time) +time=time or self.Tinactive +time=math.max(time,60) +self.Tinactive=time +return self +end +function RAT:SetMaxCruiseSpeed(speed) +self:F2(speed) +self.Vcruisemax=speed/3.6 +return self +end +function RAT:SetClimbRate(rate) +self:F2(rate) +rate=rate or self.Vclimb +rate=math.max(rate,100) +rate=math.min(rate,15000) +self.Vclimb=rate +return self +end +function RAT:SetDescentAngle(angle) +self:F2(angle) +angle=angle or self.AlphaDescent +angle=math.max(angle,0.5) +angle=math.min(angle,50) +self.AlphaDescent=angle +return self +end +function RAT:SetROE(roe) +self:F2(roe) +if roe=="return"then +self.roe=RAT.ROE.returnfire +elseif roe=="free"then +self.roe=RAT.ROE.weaponfree +else +self.roe=RAT.ROE.weaponhold +end +return self +end +function RAT:SetROT(rot) +self:F2(rot) +if rot=="passive"then +self.rot=RAT.ROT.passive +elseif rot=="evade"then +self.rot=RAT.ROT.evade +else +self.rot=RAT.ROT.noreaction +end +return self +end +function RAT:MenuName(name) +self:F2(name) +self.SubMenuName=tostring(name) +return self +end +function RAT:EnableATC(switch) +self:F2(switch) +if switch==nil then +switch=true +end +self.ATCswitch=switch +return self +end +function RAT:ATC_Messages(switch) +self:F2(switch) +if switch==nil then +switch=true +end +RAT.ATC.messages=switch +return self +end +function RAT:ATC_Clearance(n) +self:F2(n) +RAT.ATC.Nclearance=n or 2 +return self +end +function RAT:ATC_Delay(time) +self:F2(time) +RAT.ATC.delay=time or 240 +return self +end +function RAT:SetMinDistance(dist) +self:F2(dist) +self.mindist=math.max(100,dist*1000) +return self +end +function RAT:SetMaxDistance(dist) +self:F2(dist) +self.maxdist=dist*1000 +return self +end +function RAT:_Debug(switch) +self:F2(switch) +if switch==nil then +switch=true +end +self.Debug=switch +return self +end +function RAT:Debugmode() +self:F2() +self.Debug=true +return self +end +function RAT:StatusReports(switch) +self:F2(switch) +if switch==nil then +switch=true +end +self.reportstatus=switch +return self +end +function RAT:PlaceMarkers(switch) +self:F2(switch) +if switch==nil then +switch=true +end +self.placemarkers=switch +return self +end +function RAT:SetFL(FL) +self:F2(FL) +FL=FL or self.FLcruise +FL=math.max(FL,0) +self.FLuser=FL*RAT.unit.FL2m +return self +end +function RAT:SetFLmax(FL) +self:F2(FL) +self.FLmaxuser=FL*RAT.unit.FL2m +return self +end +function RAT:SetMaxCruiseAltitude(alt) +self:F2(alt) +self.FLmaxuser=alt +return self +end +function RAT:SetFLmin(FL) +self:F2(FL) +self.FLminuser=FL*RAT.unit.FL2m +return self +end +function RAT:SetMinCruiseAltitude(alt) +self:F2(alt) +self.FLminuser=alt +return self +end +function RAT:SetFLcruise(FL) +self:F2(FL) +self.FLcruise=FL*RAT.unit.FL2m +return self +end +function RAT:SetCruiseAltitude(alt) +self:F2(alt) +self.FLcruise=alt +return self +end +function RAT:SetOnboardNum(tailnumprefix,zero) +self:F2({tailnumprefix=tailnumprefix,zero=zero}) +self.onboardnum=tailnumprefix +if zero~=nil then +self.onboardnum0=zero +end +return self +end +function RAT:_InitAircraft(DCSgroup) +self:F2(DCSgroup) +local DCSunit=DCSgroup:getUnit(1) +local DCSdesc=DCSunit:getDesc() +local DCScategory=DCSgroup:getCategory() +local DCStype=DCSunit:getTypeName() +if DCScategory==Group.Category.AIRPLANE then +self.category=RAT.cat.plane +elseif DCScategory==Group.Category.HELICOPTER then +self.category=RAT.cat.heli +else +self.category="other" +self:E(self.lid.."ERROR: Group of RAT is neither airplane nor helicopter!") +end +self.aircraft.type=DCStype +self.aircraft.fuel=DCSunit:getFuel() +self.aircraft.Rmax=DCSdesc.range*RAT.unit.nm2m +self.aircraft.Reff=self.aircraft.Rmax*self.aircraft.fuel*0.95 +self.aircraft.Vmax=DCSdesc.speedMax +self.aircraft.Vymax=DCSdesc.VyMax +self.aircraft.ceiling=DCSdesc.Hmax +if DCSdesc.box then +self.aircraft.length=DCSdesc.box.max.x +self.aircraft.height=DCSdesc.box.max.y +self.aircraft.width=DCSdesc.box.max.z +elseif DCStype=="Mirage-F1CE"then +self.aircraft.length=16 +self.aircraft.height=5 +self.aircraft.width=9 +elseif DCStype=="Saab340"then +self.aircraft.length=19.73 +self.aircraft.height=6.97 +self.aircraft.width=21.44 +end +self.aircraft.box=math.max(self.aircraft.length,self.aircraft.width) +local text=string.format("\n******************************************************\n") +text=text..string.format("Aircraft parameters:\n") +text=text..string.format("Template group = %s\n",self.SpawnTemplatePrefix) +text=text..string.format("Alias = %s\n",self.alias) +text=text..string.format("Category = %s\n",self.category) +text=text..string.format("Type = %s\n",self.aircraft.type) +text=text..string.format("Length (x) = %6.1f m\n",self.aircraft.length) +text=text..string.format("Width (z) = %6.1f m\n",self.aircraft.width) +text=text..string.format("Height (y) = %6.1f m\n",self.aircraft.height) +text=text..string.format("Max air speed = %6.1f m/s\n",self.aircraft.Vmax) +text=text..string.format("Max climb speed = %6.1f m/s\n",self.aircraft.Vymax) +text=text..string.format("Initial Fuel = %6.1f\n",self.aircraft.fuel*100) +text=text..string.format("Max range = %6.1f km\n",self.aircraft.Rmax/1000) +text=text..string.format("Eff range = %6.1f km (with 95 percent initial fuel amount)\n",self.aircraft.Reff/1000) +text=text..string.format("Ceiling = %6.1f km = FL%3.0f\n",self.aircraft.ceiling/1000,self.aircraft.ceiling/RAT.unit.FL2m) +text=text..string.format("******************************************************\n") +self:T(self.lid..text) +end +function RAT:_SpawnWithRoute(_departure,_destination,_takeoff,_landing,_livery,_waypoint,_lastpos,_nrespawn,parkingdata) +self:F({rat=self.lid,departure=_departure,destination=_destination,takeoff=_takeoff,landing=_landing,livery=_livery,waypoint=_waypoint,lastpos=_lastpos,nrespawn=_nrespawn}) +if self.NspawnMax and self.SpawnIndex>=self.NspawnMax then +self:T(self.lid..string.format("Max limit of spawns reached %d >= %d! Will not spawn any more groups",self.NspawnMax,self.SpawnIndex)) +return +else +self:T2(self.lid..string.format("Spawning with spawn index=%d",self.SpawnIndex)) +end +local takeoff=self.takeoff +local landing=self.landing +if _takeoff then +takeoff=_takeoff +end +if _landing then +landing=_landing +end +if takeoff==RAT.wp.coldorhot then +local temp={RAT.wp.cold,RAT.wp.hot} +takeoff=temp[math.random(2)] +end +local nrespawn=0 +if _nrespawn then +nrespawn=_nrespawn +end +local departure,destination,waypoints,wpdesc,wpstatus=self:_SetRoute(takeoff,landing,_departure,_destination,_waypoint) +if not(departure and destination and waypoints)then +return nil +end +local livery +if _livery then +livery=_livery +elseif self.livery then +livery=self.livery[math.random(#self.livery)] +local text=string.format("Chosen livery for group %s: %s",self:_AnticipatedGroupName(),livery) +self:T(self.lid..text) +else +livery=nil +end +local uncontrolled=self.uncontrolled +local isFlightcontrol=self:_IsFlightControlAirbase(departure) +if takeoff~=RAT.wp.air and departure and isFlightcontrol then +takeoff=RAT.wp.cold +uncontrolled=true +end +local successful=self:_ModifySpawnTemplate(waypoints,livery,_lastpos,departure,takeoff,parkingdata,uncontrolled) +if not successful then +return nil +end +local group=self:SpawnWithIndex(self.SpawnIndex) +local groupname=group:GetName() +local flightgroup=FLIGHTGROUP:New(group) +if self.ATCswitch then +flightgroup.holdtime=nil +end +flightgroup.stuckDespawn=false +self.alive=self.alive+1 +self:T(self.lid..string.format("Alive groups counter now = %d.",self.alive)) +if self.ATCswitch and landing==RAT.wp.landing then +local airbasename=destination:GetName() +if self.returnzone then +airbasename=departure:GetName() +end +if not self:_IsFlightControlAirbase(airbasename)then +self:_ATCAddFlight(groupname,airbasename) +end +end +if self.placemarkers then +self:_PlaceMarkers(waypoints,wpdesc,self.SpawnIndex) +end +if isFlightcontrol and not self.activate_uncontrolled then +local N=math.random(120) +self:T(self.lid..string.format("Flight will be ready for takeoff in %d seconds",N)) +flightgroup:SetReadyForTakeoff(true,N) +end +if self.invisible then +flightgroup:SetDefaultInvisible(true) +flightgroup:SwitchInvisible(true) +end +if self.immortal then +flightgroup:SetDefaultImmortal(true) +flightgroup:SwitchImmortal(true) +end +if self.eplrs then +flightgroup:SetDefaultEPLRS(true) +flightgroup:SwitchEPLRS(true) +end +self:_SetROE(flightgroup,self.roe) +self:_SetROT(flightgroup,self.rot) +local ratcraft={} +ratcraft.index=self.SpawnIndex +ratcraft.group=group +ratcraft.flightgroup=flightgroup +ratcraft.destination=destination +ratcraft.departure=departure +ratcraft.waypoints=waypoints +ratcraft.airborne=group:InAir() +ratcraft.nunits=group:GetInitialSize() +ratcraft.Pnow=group:GetCoordinate() +ratcraft.Distance=0 +ratcraft.takeoff=takeoff +ratcraft.landing=landing +ratcraft.wpdesc=wpdesc +ratcraft.wpstatus=wpstatus +ratcraft.active=not uncontrolled +ratcraft.status=RAT.status.Spawned +ratcraft.livery=livery +ratcraft.despawnme=false +ratcraft.nrespawn=nrespawn +self.ratcraft[self.SpawnIndex]=ratcraft +if self.f10menu then +local name=self.aircraft.type.." ID "..tostring(self.SpawnIndex) +self.Menu[self.SubMenuName].groups[self.SpawnIndex]=MENU_MISSION:New(name,self.Menu[self.SubMenuName].groups) +self.Menu[self.SubMenuName].groups[self.SpawnIndex]["roe"]=MENU_MISSION:New("Set ROE",self.Menu[self.SubMenuName].groups[self.SpawnIndex]) +MENU_MISSION_COMMAND:New("Weapons hold",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["roe"],self._SetROE,self,flightgroup,RAT.ROE.weaponhold) +MENU_MISSION_COMMAND:New("Weapons free",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["roe"],self._SetROE,self,flightgroup,RAT.ROE.weaponfree) +MENU_MISSION_COMMAND:New("Return fire",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["roe"],self._SetROE,self,flightgroup,RAT.ROE.returnfire) +self.Menu[self.SubMenuName].groups[self.SpawnIndex]["rot"]=MENU_MISSION:New("Set ROT",self.Menu[self.SubMenuName].groups[self.SpawnIndex]) +MENU_MISSION_COMMAND:New("No reaction",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["rot"],self._SetROT,self,flightgroup,RAT.ROT.noreaction) +MENU_MISSION_COMMAND:New("Passive defense",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["rot"],self._SetROT,self,flightgroup,RAT.ROT.passive) +MENU_MISSION_COMMAND:New("Evade on fire",self.Menu[self.SubMenuName].groups[self.SpawnIndex]["rot"],self._SetROT,self,flightgroup,RAT.ROT.evade) +MENU_MISSION_COMMAND:New("Despawn group",self.Menu[self.SubMenuName].groups[self.SpawnIndex],self._Despawn,self,group) +MENU_MISSION_COMMAND:New("Place markers",self.Menu[self.SubMenuName].groups[self.SpawnIndex],self._PlaceMarkers,self,waypoints,self.SpawnIndex) +MENU_MISSION_COMMAND:New("Status report",self.Menu[self.SubMenuName].groups[self.SpawnIndex],self.Status,self,true,self.SpawnIndex) +end +function flightgroup.OnAfterPassingWaypoint(Flightgroup,From,Event,To,Waypoint) +local waypoint=Waypoint +local flightgroup=Flightgroup +local wpid=waypoint.uid +local ratcraft=self:_GetRatcraftFromGroup(flightgroup.group) +local wpdescription=tostring(ratcraft.wpdesc[wpid]) +local wpstatus=ratcraft.wpstatus[wpid] +self:T(self.lid..string.format("RAT passed waypoint %s [uid=%d]: %s [status=%s]",waypoint.name,wpid,wpdescription,wpstatus)) +self:_SetStatus(group,wpstatus) +if waypoint.uid==3 then +end +end +function flightgroup.OnAfterPassedFinalWaypoint(flightgroup,From,Event,To) +self:T(self.lid..string.format("RAT passed FINAL waypoint")) +local ratcraft=self:_GetRatcraftFromGroup(flightgroup.group) +local text=string.format("Flight %s arrived at final destination %s.",group:GetName(),destination:GetName()) +MESSAGE:New(text,10):ToAllIf(self.reportstatus) +self:T(self.lid..text) +if landing==RAT.wp.air then +local text=string.format("Activating despawn switch for flight %s! Group will be detroyed soon.",group:GetName()) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +ratcraft.despawnme=true +end +end +function flightgroup.OnAfterRTB(flightgroup,From,Event,To,airbase,SpeedTo,SpeedHold,SpeedLand) +self:T(self.lid..string.format("RAT group is RTB")) +end +function flightgroup.OnAfterHolding(Flightgroup,From,Event,To) +local flightgroup=Flightgroup +local ratcraft=self:_GetRatcraftFromGroup(flightgroup.group) +local destinationname=ratcraft.destination:GetName() +local text=string.format("Flight %s to %s ATC: Holding and awaiting landing clearance.",groupname,destinationname) +self:T(self.lid..text) +MESSAGE:New(text,10):ToAllIf(self.reportstatus) +local fc=_DATABASE:GetFlightControl(destinationname) +if self.ATCswitch and not fc then +self:T(self.lid..string.format("RAT group is HOLDING ==> ATCRegisterFlight")) +if self.f10menu then +MENU_MISSION_COMMAND:New("Clear for landing",self.Menu[self.SubMenuName].groups[self.SpawnIndex],flightgroup.ClearToLand,flightgroup) +end +RAT._ATCRegisterFlight(groupname,timer.getTime()) +end +end +function flightgroup.OnAfterLanded(Flightgroup,From,Event,To,Airport) +self:T(self.lid..string.format("RAT group landed at airbase")) +end +function flightgroup.OnAfterArrived(Flightgroup,From,Event,To) +self:T(self.lid..string.format("RAT group arrived")) +end +function flightgroup.OnAfterStuck(Flightgroup,From,Event,To,Stucktime) +local flightgroup=Flightgroup +self:T(self.lid..string.format("Group %s got stuck for %d seconds",flightgroup:GetName(),Stucktime)) +if Stucktime>10*60 then +self:_Respawn(flightgroup.group) +end +end +return self.SpawnIndex +end +function RAT:_IsFlightControlAirbase(airbase) +if type(airbase)=="table"then +airbase=airbase:GetName() +end +if airbase then +local fc=_DATABASE:GetFlightControl(airbase) +if fc then +self:T(self.lid..string.format("Airbase %s has a FLIGHTCONTROL running",airbase)) +return true +else +return false +end +end +return nil +end +function RAT:ClearForLanding(name) +trigger.action.setUserFlag(name,1) +local flagvalue=trigger.misc.getUserFlag(name) +self:T(self.lid.."ATC: User flag value (landing) for "..name.." set to "..flagvalue) +end +function RAT:_Respawn(group,lastpos,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,RAT._Respawn,self,group,lastpos,0) +else +if group then +self:T(self.lid..string.format("Respawning ratcraft from group %s",group:GetName())) +else +self:E(self.lid..string.format("ERROR: group is nil in _Respawn!")) +return nil +end +local ratcraft=self:_GetRatcraftFromGroup(group) +lastpos=lastpos or group:GetCoordinate() +local departure=ratcraft.departure +local destination=ratcraft.destination +local takeoff=ratcraft.takeoff +local landing=ratcraft.landing +local livery=ratcraft.livery +local lastwp=ratcraft.waypoints[#ratcraft.waypoints] +local flightgroup=ratcraft.flightgroup +local parkingdata=nil +if self.continuejourney or self.commute then +for _,_element in pairs(flightgroup.elements)do +local element=_element +if element.parking then +if parkingdata==nil then +parkingdata={} +end +self:T(self.lid..string.format("Element %s was parking at spot id=%d",element.name,element.parking.TerminalID)) +table.insert(parkingdata,UTILS.DeepCopy(element.parking)) +else +self:E(self.lid..string.format("WARNING: Element %s did NOT have a not parking spot!",tostring(element.name))) +end +end +end +self:_Despawn(ratcraft.group) +local _departure=nil +local _destination=nil +local _takeoff=nil +local _landing=nil +local _livery=nil +local _lastwp=nil +local _lastpos=nil +if self.continuejourney then +_departure=destination:GetName() +_livery=livery +if landing==RAT.wp.landing and not(self.respawn_at_landing or self.respawn_after_takeoff)then +if destination:GetCategory()==4 then +_lastpos=lastpos +end +end +if self.destinationzone then +_takeoff=RAT.wp.air +_landing=RAT.wp.air +elseif self.returnzone then +_takeoff=self.takeoff +if self.takeoff==RAT.wp.air then +_landing=RAT.wp.air +else +_landing=RAT.wp.landing +end +_departure=departure:GetName() +else +_takeoff=self.takeoff +_landing=self.landing +end +elseif self.commute then +if self.starshape==true then +if destination:GetName()==self.homebase then +_departure=self.homebase +_destination=nil +else +_departure=destination:GetName() +_destination=self.homebase +end +else +_departure=destination:GetName() +_destination=departure:GetName() +end +_livery=livery +if landing==RAT.wp.landing and lastpos and not(self.respawn_at_landing or self.respawn_after_takeoff)then +if destination:GetCategory()==4 then +_lastpos=lastpos +end +end +if self.destinationzone then +if self.takeoff==RAT.wp.air then +_takeoff=RAT.wp.air +_landing=RAT.wp.air +else +if takeoff==RAT.wp.air then +_takeoff=self.takeoff +_landing=RAT.wp.air +else +_takeoff=RAT.wp.air +_landing=RAT.wp.landing +end +end +elseif self.returnzone then +_departure=departure:GetName() +_destination=destination:GetName() +_takeoff=self.takeoff +_landing=self.landing +end +end +if _takeoff==RAT.wp.air and(self.continuejourney or self.commute)then +_lastwp=lastwp +end +self:T2({departure=_departure,destination=_destination,takeoff=_takeoff,landing=_landing,livery=_livery,lastwp=_lastwp}) +local respawndelay=self.respawn_delay or 1 +self:T(self.lid..string.format("%s delayed respawn in %.1f seconds.",self.alias,respawndelay)) +self:ScheduleOnce(respawndelay,RAT._SpawnWithRoute,self,_departure,_destination,_takeoff,_landing,_livery,nil,_lastpos,nil,parkingdata) +end +end +function RAT:_Despawn(group,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,RAT._Despawn,self,group,0) +else +if group then +local index=self:GetSpawnIndexFromGroup(group) +if index then +self:T(self.lid..string.format("Despawning group %s (index=%d)",group:GetName(),index)) +local ratcraft=self.ratcraft[index] +ratcraft.flightgroup:Despawn() +ratcraft.flightgroup:__Stop(0.1) +self.ratcraft[index].group=nil +self.ratcraft[index]["status"]="Dead" +self.ratcraft[index]=nil +if self.f10menu and self.SubMenuName~=nil then +self.Menu[self.SubMenuName]["groups"][index]:Remove() +end +end +end +end +end +function RAT:_SetRoute(takeoff,landing,_departure,_destination,_waypoint) +local VxCruiseMax +if self.Vcruisemax then +VxCruiseMax=math.min(self.Vcruisemax,self.aircraft.Vmax) +else +VxCruiseMax=math.min(self.aircraft.Vmax*0.90,250) +end +local VxCruiseMin=math.min(VxCruiseMax*0.70,166) +local VxCruise=UTILS.RandomGaussian((VxCruiseMax-VxCruiseMin)/2+VxCruiseMin,(VxCruiseMax-VxCruiseMax)/4,VxCruiseMin,VxCruiseMax) +local VxClimb=math.min(self.aircraft.Vmax*0.90,200) +local VxDescent=math.min(self.aircraft.Vmax*0.60,140) +local VxHolding=VxDescent*0.9 +local VxFinal=VxHolding*0.9 +local VyClimb=math.min(self.Vclimb*RAT.unit.ft2meter/60,self.aircraft.Vymax) +local AlphaClimb=math.asin(VyClimb/VxClimb) +local AlphaDescent=math.rad(self.AlphaDescent) +local FLcruise_expect=self.FLcruise +local departure=nil +if _departure then +if self:_AirportExists(_departure)then +departure=AIRBASE:FindByName(_departure) +if takeoff==RAT.wp.air then +departure=departure:GetZone() +end +elseif self:_ZoneExists(_departure)then +departure=ZONE:FindByName(_departure) +else +local text=string.format("ERROR! Specified departure airport %s does not exist for %s.",_departure,self.alias) +self:E(self.lid..text) +end +else +departure=self:_PickDeparture(takeoff) +if self.commute and self.starshape==true and self.homebase==nil then +self.homebase=departure:GetName() +end +end +if not departure then +local text=string.format("ERROR! No valid departure airport could be found for %s.",self.alias) +self:E(self.lid..text) +return nil +end +local Pdeparture +if takeoff==RAT.wp.air then +if _waypoint then +Pdeparture=COORDINATE:New(_waypoint.x,_waypoint.alt,_waypoint.y) +else +local vec2=departure:GetRandomVec2() +Pdeparture=COORDINATE:NewFromVec2(vec2) +end +else +Pdeparture=departure:GetCoordinate() +end +local H_departure +if takeoff==RAT.wp.air then +local Hmin +if self.category==RAT.cat.plane then +Hmin=1000 +else +Hmin=50 +end +H_departure=self:_Randomize(FLcruise_expect*0.7,0.3,Pdeparture.y+Hmin,FLcruise_expect) +if self.FLminuser then +H_departure=math.max(H_departure,self.FLminuser) +end +if _waypoint then +H_departure=_waypoint.alt +end +else +H_departure=Pdeparture.y +end +local mindist=self.mindist +if self.FLminuser then +local hclimb=self.FLminuser-H_departure +local hdescent=self.FLminuser-H_departure +local Dclimb,Ddescent,Dtot=self:_MinDistance(AlphaClimb,AlphaDescent,hclimb,hdescent) +if takeoff==RAT.wp.air and landing==RAT.wpair then +mindist=0 +elseif takeoff==RAT.wp.air then +mindist=Ddescent +elseif landing==RAT.wp.air then +mindist=Dclimb +else +mindist=Dtot +end +mindist=math.max(self.mindist,mindist) +local text=string.format("Adjusting min distance to %d km (for given min FL%03d)",mindist/1000,self.FLminuser/RAT.unit.FL2m) +self:T(self.lid..text) +end +local destination=nil +if _destination then +if self:_AirportExists(_destination)then +destination=AIRBASE:FindByName(_destination) +if landing==RAT.wp.air or self.returnzone then +destination=destination:GetZone() +end +elseif self:_ZoneExists(_destination)then +destination=ZONE:FindByName(_destination) +else +local text=string.format("ERROR: Specified destination airport/zone %s does not exist for %s!",_destination,self.alias) +self:E(self.lid.."ERROR: "..text) +end +else +local random=self.random_destination +if self.continuejourney and _departure and#self.destination_ports<3 then +random=true +end +local mylanding=landing +local acrange=self.aircraft.Reff +if self.returnzone then +mylanding=RAT.wp.air +acrange=self.aircraft.Reff/2 +end +destination=self:_PickDestination(departure,Pdeparture,mindist,math.min(acrange,self.maxdist),random,mylanding) +end +if not destination then +local text=string.format("No valid destination airport could be found for %s!",self.alias) +MESSAGE:New(text,60):ToAll() +self:E(self.lid.."ERROR: "..text) +return nil +end +if destination:GetName()==departure:GetName()then +local text=string.format("%s: Destination and departure are identical. Airport/zone %s.",self.alias,destination:GetName()) +MESSAGE:New(text,30):ToAll() +self:E(self.lid.."ERROR: "..text) +end +local Preturn +local destination_returnzone +if self.returnzone then +local vec2=destination:GetRandomVec2() +Preturn=COORDINATE:NewFromVec2(vec2) +destination_returnzone=destination +destination=departure +end +local Pdestination +if landing==RAT.wp.air then +local vec2=destination:GetRandomVec2() +Pdestination=COORDINATE:NewFromVec2(vec2) +else +Pdestination=destination:GetCoordinate() +end +local H_destination=Pdestination.y +local Rhmin=8000 +local Rhmax=20000 +if self.category==RAT.cat.heli then +Rhmin=500 +Rhmax=1000 +end +local Vholding=Pdestination:GetRandomVec2InRadius(Rhmax,Rhmin) +local Pholding=COORDINATE:NewFromVec2(Vholding) +local H_holding=Pholding.y +local h_holding +if self.category==RAT.cat.plane then +h_holding=1200 +else +h_holding=150 +end +h_holding=self:_Randomize(h_holding,0.2) +local Hh_holding=H_holding+h_holding +if landing==RAT.wp.air then +Hh_holding=H_departure +end +local d_holding=Pholding:Get2DDistance(Pdestination) +local heading +local d_total +if self.returnzone then +heading=self:_Course(Pdeparture,Preturn) +d_total=Pdeparture:Get2DDistance(Preturn)+Preturn:Get2DDistance(Pholding) +else +heading=self:_Course(Pdeparture,Pholding) +d_total=Pdeparture:Get2DDistance(Pholding) +end +if takeoff==RAT.wp.air then +local H_departure_max +if landing==RAT.wp.air then +H_departure_max=H_departure +else +H_departure_max=d_total*math.tan(AlphaDescent)+Hh_holding +end +H_departure=math.min(H_departure,H_departure_max) +end +local deltaH=math.abs(H_departure-Hh_holding) +local phi=math.atan(deltaH/d_total) +local phi_climb +local phi_descent +if(H_departure>Hh_holding)then +phi_climb=AlphaClimb+phi +phi_descent=AlphaDescent-phi +else +phi_climb=AlphaClimb-phi +phi_descent=AlphaDescent+phi +end +local D_total +if self.returnzone then +D_total=math.sqrt(deltaH*deltaH+d_total/2*d_total/2) +else +D_total=math.sqrt(deltaH*deltaH+d_total*d_total) +end +local gamma=math.rad(180)-phi_climb-phi_descent +local a=D_total*math.sin(phi_climb)/math.sin(gamma) +local b=D_total*math.sin(phi_descent)/math.sin(gamma) +local hphi_max=b*math.sin(phi_climb) +local hphi_max2=a*math.sin(phi_descent) +local h_max1=b*math.sin(AlphaClimb) +local h_max2=a*math.sin(AlphaDescent) +local h_max +if(H_departure>Hh_holding)then +h_max=math.min(h_max1,h_max2) +else +h_max=math.max(h_max1,h_max2) +end +local FLmax=h_max+H_departure +local FLmin=math.max(H_departure,Hh_holding) +if self.category==RAT.cat.heli then +FLmin=math.max(H_departure,H_destination)+50 +FLmax=math.max(H_departure,H_destination)+1000 +end +FLmax=math.min(FLmax,self.aircraft.ceiling) +if self.FLminuser then +FLmin=math.max(self.FLminuser,FLmin) +end +if self.FLmaxuser then +FLmax=math.min(self.FLmaxuser,FLmax) +end +if FLmin>FLmax then +FLmin=FLmax +end +if FLcruise_expect<FLmin then +FLcruise_expect=FLmin +end +if FLcruise_expect>FLmax then +FLcruise_expect=FLmax +end +local FLcruise=UTILS.RandomGaussian(FLcruise_expect,math.abs(FLmax-FLmin)/4,FLmin,FLmax) +if self.FLuser then +FLcruise=self.FLuser +FLcruise=math.max(FLcruise,FLmin) +FLcruise=math.min(FLcruise,FLmax) +end +local h_climb=FLcruise-H_departure +local h_descent=FLcruise-Hh_holding +local d_climb=h_climb/math.tan(AlphaClimb) +local d_descent=h_descent/math.tan(AlphaDescent) +local d_cruise=d_total-d_climb-d_descent +local text=string.format("\n******************************************************\n") +text=text..string.format("Template = %s\n",self.SpawnTemplatePrefix) +text=text..string.format("Alias = %s\n",self.alias) +text=text..string.format("Group name = %s\n\n",self:_AnticipatedGroupName()) +text=text..string.format("Speeds:\n") +text=text..string.format("VxCruiseMin = %6.1f m/s = %5.1f km/h\n",VxCruiseMin,VxCruiseMin*3.6) +text=text..string.format("VxCruiseMax = %6.1f m/s = %5.1f km/h\n",VxCruiseMax,VxCruiseMax*3.6) +text=text..string.format("VxCruise = %6.1f m/s = %5.1f km/h\n",VxCruise,VxCruise*3.6) +text=text..string.format("VxClimb = %6.1f m/s = %5.1f km/h\n",VxClimb,VxClimb*3.6) +text=text..string.format("VxDescent = %6.1f m/s = %5.1f km/h\n",VxDescent,VxDescent*3.6) +text=text..string.format("VxHolding = %6.1f m/s = %5.1f km/h\n",VxHolding,VxHolding*3.6) +text=text..string.format("VxFinal = %6.1f m/s = %5.1f km/h\n",VxFinal,VxFinal*3.6) +text=text..string.format("VyClimb = %6.1f m/s\n",VyClimb) +text=text..string.format("\nDistances:\n") +text=text..string.format("d_climb = %6.1f km\n",d_climb/1000) +text=text..string.format("d_cruise = %6.1f km\n",d_cruise/1000) +text=text..string.format("d_descent = %6.1f km\n",d_descent/1000) +text=text..string.format("d_holding = %6.1f km\n",d_holding/1000) +text=text..string.format("d_total = %6.1f km\n",d_total/1000) +text=text..string.format("\nHeights:\n") +text=text..string.format("H_departure = %6.1f m ASL\n",H_departure) +text=text..string.format("H_destination = %6.1f m ASL\n",H_destination) +text=text..string.format("H_holding = %6.1f m ASL\n",H_holding) +text=text..string.format("h_climb = %6.1f m\n",h_climb) +text=text..string.format("h_descent = %6.1f m\n",h_descent) +text=text..string.format("h_holding = %6.1f m\n",h_holding) +text=text..string.format("delta H = %6.1f m\n",deltaH) +text=text..string.format("FLmin = %6.1f m ASL = FL%03d\n",FLmin,FLmin/RAT.unit.FL2m) +text=text..string.format("FLcruise = %6.1f m ASL = FL%03d\n",FLcruise,FLcruise/RAT.unit.FL2m) +text=text..string.format("FLmax = %6.1f m ASL = FL%03d\n",FLmax,FLmax/RAT.unit.FL2m) +text=text..string.format("\nAngles:\n") +text=text..string.format("Alpha climb = %6.2f Deg\n",math.deg(AlphaClimb)) +text=text..string.format("Alpha descent = %6.2f Deg\n",math.deg(AlphaDescent)) +text=text..string.format("Phi (slope) = %6.2f Deg\n",math.deg(phi)) +text=text..string.format("Phi climb = %6.2f Deg\n",math.deg(phi_climb)) +text=text..string.format("Phi descent = %6.2f Deg\n",math.deg(phi_descent)) +if self.Debug then +local h_climb_max=FLmax-H_departure +local h_descent_max=FLmax-Hh_holding +local d_climb_max=h_climb_max/math.tan(AlphaClimb) +local d_descent_max=h_descent_max/math.tan(AlphaDescent) +local d_cruise_max=d_total-d_climb_max-d_descent_max +text=text..string.format("Heading = %6.1f Deg\n",heading) +text=text..string.format("\nSSA triangle:\n") +text=text..string.format("D_total = %6.1f km\n",D_total/1000) +text=text..string.format("gamma = %6.1f Deg\n",math.deg(gamma)) +text=text..string.format("a = %6.1f m\n",a) +text=text..string.format("b = %6.1f m\n",b) +text=text..string.format("hphi_max = %6.1f m\n",hphi_max) +text=text..string.format("hphi_max2 = %6.1f m\n",hphi_max2) +text=text..string.format("h_max1 = %6.1f m\n",h_max1) +text=text..string.format("h_max2 = %6.1f m\n",h_max2) +text=text..string.format("h_max = %6.1f m\n",h_max) +text=text..string.format("\nMax heights and distances:\n") +text=text..string.format("d_climb_max = %6.1f km\n",d_climb_max/1000) +text=text..string.format("d_cruise_max = %6.1f km\n",d_cruise_max/1000) +text=text..string.format("d_descent_max = %6.1f km\n",d_descent_max/1000) +text=text..string.format("h_climb_max = %6.1f m\n",h_climb_max) +text=text..string.format("h_descent_max = %6.1f m\n",h_descent_max) +end +text=text..string.format("******************************************************\n") +self:T2(self.lid..text) +if d_cruise<0 then +d_cruise=100 +end +local wp={} +local c={} +local waypointdescriptions={} +local waypointstatus={} +local wpholding=nil +local wpfinal=nil +c[#c+1]=Pdeparture +wp[#wp+1]=self:_Waypoint(#wp+1,"Departure",takeoff,c[#wp+1],VxClimb,H_departure,departure) +waypointdescriptions[#wp]="Departure" +waypointstatus[#wp]=RAT.status.Departure +if takeoff==RAT.wp.air then +if d_climb<5000 or d_cruise<5000 then +d_cruise=d_cruise+d_climb +else +c[#c+1]=c[#c]:Translate(d_climb,heading) +wp[#wp+1]=self:_Waypoint(#wp+1,"Begin of Cruise",RAT.wp.cruise,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="Begin of Cruise" +waypointstatus[#wp]=RAT.status.Cruise +end +else +c[#c+1]=c[#c]:Translate(d_climb/2,heading) +c[#c+1]=c[#c]:Translate(d_climb/2,heading) +wp[#wp+1]=self:_Waypoint(#wp+1,"Climb",RAT.wp.climb,c[#wp+1],VxClimb,H_departure+(FLcruise-H_departure)/2) +waypointdescriptions[#wp]="Climb" +waypointstatus[#wp]=RAT.status.Climb +wp[#wp+1]=self:_Waypoint(#wp+1,"Begin of Cruise",RAT.wp.cruise,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="Begin of Cruise" +waypointstatus[#wp]=RAT.status.Cruise +end +if self.returnzone then +c[#c+1]=Preturn +wp[#wp+1]=self:_Waypoint(#wp+1,"Return Zone",RAT.wp.cruise,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="Return Zone" +waypointstatus[#wp]=RAT.status.Uturn +end +if landing==RAT.wp.air then +c[#c+1]=Pdestination +wp[#wp+1]=self:_Waypoint(#wp+1,"Final Destination",RAT.wp.finalwp,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="Final Destination" +waypointstatus[#wp]=RAT.status.Destination +elseif self.returnzone then +c[#c+1]=c[#c]:Translate(d_cruise/2,heading-180) +wp[#wp+1]=self:_Waypoint(#wp+1,"End of Cruise",RAT.wp.cruise,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="End of Cruise" +waypointstatus[#wp]=RAT.status.Descent +else +c[#c+1]=c[#c]:Translate(d_cruise,heading) +wp[#wp+1]=self:_Waypoint(#wp+1,"End of Cruise",RAT.wp.cruise,c[#wp+1],VxCruise,FLcruise) +waypointdescriptions[#wp]="End of Cruise" +waypointstatus[#wp]=RAT.status.Descent +end +if landing==RAT.wp.landing then +if self.returnzone then +c[#c+1]=c[#c]:Translate(d_descent/2,heading-180) +wp[#wp+1]=self:_Waypoint(#wp+1,"Descent",RAT.wp.descent,c[#wp+1],VxDescent,FLcruise-(FLcruise-(h_holding+H_holding))/2) +waypointdescriptions[#wp]="Descent" +waypointstatus[#wp]=RAT.status.DescentHolding +else +c[#c+1]=c[#c]:Translate(d_descent/2,heading) +wp[#wp+1]=self:_Waypoint(#wp+1,"Descent",RAT.wp.descent,c[#wp+1],VxDescent,FLcruise-(FLcruise-(h_holding+H_holding))/2) +waypointdescriptions[#wp]="Descent" +waypointstatus[#wp]=RAT.status.DescentHolding +end +end +if landing==RAT.wp.landing then +c[#c+1]=Pdestination +wp[#wp+1]=self:_Waypoint(#wp+1,"Final Destination",landing,c[#wp+1],VxFinal,H_destination,destination) +waypointdescriptions[#wp]="Final Destination" +waypointstatus[#wp]=RAT.status.Destination +end +wpfinal=#wp +local waypoints={} +for _,p in ipairs(wp)do +table.insert(waypoints,p) +end +self:_Routeinfo(waypoints,"Waypoint info in set_route:",waypointdescriptions) +if self.returnzone then +return departure,destination_returnzone,waypoints,waypointdescriptions,waypointstatus +else +return departure,destination,waypoints,waypointdescriptions,waypointstatus +end +end +function RAT:_PickDeparture(takeoff) +local departures={} +if self.random_departure then +for _,_airport in pairs(self.airports)do +local airport=_airport +local name=airport:GetName() +if not self:_Excluded(name)then +if takeoff==RAT.wp.air then +table.insert(departures,airport:GetZone()) +else +local nspots=1 +if self.termtype~=nil then +nspots=airport:GetParkingSpotsNumber(self.termtype) +end +if nspots>0 then +table.insert(departures,airport) +end +end +end +end +else +for _,name in pairs(self.departure_ports)do +local dep=nil +if self:_AirportExists(name)then +if takeoff==RAT.wp.air then +dep=AIRBASE:FindByName(name):GetZone() +else +dep=AIRBASE:FindByName(name) +if self.termtype~=nil and dep~=nil then +local _dep=dep +local nspots=_dep:GetParkingSpotsNumber(self.termtype) +if nspots==0 then +dep=nil +end +end +end +elseif self:_ZoneExists(name)then +if takeoff==RAT.wp.air then +dep=ZONE:FindByName(name) +else +self:E(self.lid..string.format("ERROR! Takeoff is not in air. Cannot use %s as departure.",name)) +end +else +self:E(self.lid..string.format("ERROR: No airport or zone found with name %s.",name)) +end +if dep then +table.insert(departures,dep) +end +end +end +self:T(self.lid..string.format("Number of possible departures for %s= %d",self.alias,#departures)) +local departure=departures[math.random(#departures)] +local text +if departure and departure:GetName()then +if takeoff==RAT.wp.air then +text=string.format("%s: Chosen departure zone: %s",self.alias,departure:GetName()) +else +text=string.format("%s: Chosen departure airport: %s (ID %d)",self.alias,departure:GetName(),departure:GetID()) +end +self:T(self.lid..text) +else +self:E(self.lid..string.format("ERROR! No departure airport or zone found for %s.",self.alias)) +departure=nil +end +return departure +end +function RAT:_PickDestination(departure,q,minrange,maxrange,random,landing) +minrange=minrange or self.mindist +maxrange=maxrange or self.maxdist +local destinations={} +if random then +for _,_airport in pairs(self.airports)do +local airport=_airport +local name=airport:GetName() +if self:_IsFriendly(name)and not self:_Excluded(name)and name~=departure:GetName()then +local distance=q:Get2DDistance(airport:GetCoordinate()) +if distance>=minrange and distance<=maxrange then +if landing==RAT.wp.air then +table.insert(destinations,airport:GetZone()) +else +local nspot=1 +if self.termtype then +nspot=airport:GetParkingSpotsNumber(self.termtype) +end +if nspot>0 then +table.insert(destinations,airport) +end +end +end +end +end +else +for _,name in pairs(self.destination_ports)do +if name~=departure:GetName()then +local dest=nil +if self:_AirportExists(name)then +if landing==RAT.wp.air then +dest=AIRBASE:FindByName(name):GetZone() +else +dest=AIRBASE:FindByName(name) +local nspot=1 +if self.termtype then +nspot=dest:GetParkingSpotsNumber(self.termtype) +end +if nspot==0 then +dest=nil +end +end +elseif self:_ZoneExists(name)then +if landing==RAT.wp.air then +dest=ZONE:FindByName(name) +else +self:E(self.lid..string.format("ERROR! Landing is not in air. Cannot use zone %s as destination!",name)) +end +else +self:E(self.lid..string.format("ERROR! No airport or zone found with name %s",name)) +end +if dest then +local distance=q:Get2DDistance(dest:GetCoordinate()) +if distance>=minrange and distance<=maxrange then +table.insert(destinations,dest) +else +local text=string.format("Destination %s is ouside range. Distance = %5.1f km, min = %5.1f km, max = %5.1f km.",name,distance,minrange,maxrange) +self:T(self.lid..text) +end +end +end +end +end +self:T(self.lid..string.format("Number of possible destinations = %s.",#destinations)) +if#destinations>0 then +local function compare(a,b) +local qa=q:Get2DDistance(a:GetCoordinate()) +local qb=q:Get2DDistance(b:GetCoordinate()) +return qa<qb +end +table.sort(destinations,compare) +else +destinations=nil +end +local destination +if destinations and#destinations>0 then +destination=destinations[math.random(#destinations)] +local text +if landing==RAT.wp.air then +text=string.format("%s: Chosen destination zone: %s.",self.alias,destination:GetName()) +else +text=string.format("%s Chosen destination airport: %s (ID %d).",self.alias,destination:GetName(),destination:GetID()) +end +self:T(self.lid..text) +else +self:E(self.lid.."ERROR! No destination airport or zone found.") +destination=nil +end +return destination +end +function RAT:_GetAirportsInZone(zone) +local airports={} +for _,airport in pairs(self.airports)do +local name=airport:GetName() +local coord=airport:GetCoordinate() +if zone:IsPointVec3InZone(coord)then +table.insert(airports,name) +end +end +return airports +end +function RAT:_Excluded(port) +for _,name in pairs(self.excluded_ports)do +if name==port then +return true +end +end +return false +end +function RAT:_IsFriendly(port) +for _,airport in pairs(self.airports)do +local name=airport:GetName() +if name==port then +return true +end +end +return false +end +function RAT:_GetAirportsOfMap() +local _coalition +for i=0,2 do +if i==0 then +_coalition=coalition.side.NEUTRAL +elseif i==1 then +_coalition=coalition.side.RED +elseif i==2 then +_coalition=coalition.side.BLUE +end +local ab=coalition.getAirbases(i) +for _,airbase in pairs(ab)do +local _id=airbase:getID() +local _p=airbase:getPosition().p +local _name=airbase:getName() +local _myab=AIRBASE:FindByName(_name) +if _myab then +table.insert(self.airports_map,_myab) +local text="MOOSE: Airport ID = ".._myab:GetID().." and Name = ".._myab:GetName()..", Category = ".._myab:GetCategory()..", TypeName = ".._myab:GetTypeName() +self:T(self.lid..text) +else +self:E(self.lid..string.format("WARNING: Airbase %s does not exsist as MOOSE object!",tostring(_name))) +end +end +end +end +function RAT:_GetAirportsOfCoalition() +for _,coalition in pairs(self.ctable)do +for _,_airport in pairs(self.airports_map)do +local airport=_airport +local category=airport:GetAirbaseCategory() +if airport:GetCoalition()==coalition then +local condition1=self.category==RAT.cat.plane and category==Airbase.Category.HELIPAD +local condition2=self.category==RAT.cat.plane and category==Airbase.Category.SHIP +if not(condition1 or condition2)then +table.insert(self.airports,airport) +end +end +end +end +if#self.airports==0 then +local text=string.format("No possible departure/destination airports found for RAT %s.",tostring(self.alias)) +MESSAGE:New(text,10):ToAll() +self:E(self.lid..text) +end +end +function RAT:Status(message,forID) +self:T(self.lid.."Checking status") +local Tnow=timer.getTime() +local nalive=0 +for spawnindex,_ratcraft in pairs(self.ratcraft)do +local ratcraft=_ratcraft +self:T(self.lid..string.format("Ratcraft Index=%s",tostring(spawnindex))) +local group=ratcraft.group +if group and group:IsAlive()then +nalive=nalive+1 +self:T(self.lid..string.format("Ratcraft Index=%s is ALIVE",tostring(spawnindex))) +local prefix=self:_GetPrefixFromGroup(group) +local life=self:_GetLife(group) +local fuel=group:GetFuel()*100.0 +local airborne=group:InAir() +local coords=group:GetCoordinate() +local alt=coords~=nil and coords.y or 1000 +local departure=ratcraft.departure:GetName() +local destination=ratcraft.destination:GetName() +local type=self.aircraft.type +local status=ratcraft.status +local active=ratcraft.active +local Nunits=ratcraft.nunits +local N0units=group:GetInitialSize() +local Dtravel=0 +if coords and ratcraft.Pnow then +local Dtravel=coords:Get2DDistance(ratcraft.Pnow) +ratcraft.Pnow=coords +end +ratcraft.Distance=ratcraft.Distance+Dtravel +local Ddestination=-1 +if ratcraft.Pnow then +Ddestination=ratcraft.Pnow:Get2DDistance(ratcraft.destination:GetCoordinate()) +end +if(forID and spawnindex==forID)or(not forID)then +local text=string.format("ID %i of flight %s",spawnindex,prefix) +if N0units>1 then +text=text..string.format(" (%d/%d)\n",Nunits,N0units) +else +text=text.."\n" +end +if self.commute then +text=text..string.format("%s commuting between %s and %s\n",type,departure,destination) +elseif self.continuejourney then +text=text..string.format("%s travelling from %s to %s (and continueing form there)\n",type,departure,destination) +else +text=text..string.format("%s travelling from %s to %s\n",type,departure,destination) +end +text=text..string.format("Status: %s",status) +if airborne then +text=text.." [airborne]\n" +else +text=text.." [on ground]\n" +end +text=text..string.format("Fuel = %3.0f %%\n",fuel) +text=text..string.format("Life = %3.0f %%\n",life) +text=text..string.format("FL%03d = %i m ASL\n",alt/RAT.unit.FL2m,alt) +text=text..string.format("Distance travelled = %6.1f km\n",ratcraft["Distance"]/1000) +text=text..string.format("Distance to dest = %6.1f km",Ddestination/1000) +self:T(self.lid..text) +if message then +MESSAGE:New(text,20):ToAll() +end +end +if ratcraft.despawnme then +if self.norespawn or self.respawn_after_takeoff then +if self.despawnair then +self:T(self.lid..string.format("[STATUS despawnme] Flight %s will be despawned NOW and NO new group is created!",self.alias)) +self:_Despawn(group) +end +else +self:T(self.lid..string.format("[STATUS despawnme] Flight %s will be despawned NOW and a new group is respawned!",self.alias)) +self:_Respawn(group) +end +end +else +local text=string.format("Group does not exist in loop ratcraft status for spawn index=%d",spawnindex) +self:T2(self.lid..text) +self:T2(ratcraft) +end +end +local text=string.format("Alive groups of %s: %d, nalive=%d/%d",self.alias,self.alive,nalive,self.ngroups) +self:T(self.lid..text) +MESSAGE:New(text,20):ToAllIf(message and not forID) +end +function RAT:_RemoveRatcraft(ratcraft) +self.ratcraft[ratcraft.index]=nil +return self +end +function RAT:_GetRatcraftFromGroup(group) +local index=self:GetSpawnIndexFromGroup(group) +local ratcraft=self.ratcraft[index] +return ratcraft +end +function RAT:_GetLife(group) +local life=0.0 +if group and group:IsAlive()then +local unit=group:GetUnit(1) +if unit then +life=unit:GetLife()/unit:GetLife0()*100 +else +self:T2(self.lid.."ERROR! Unit does not exist in RAT_Getlife(). Returning zero.") +end +else +self:T2(self.lid.."ERROR! Group does not exist in RAT_Getlife(). Returning zero.") +end +return life +end +function RAT:_SetStatus(group,status) +if group and group:IsAlive()then +local ratcraft=self:_GetRatcraftFromGroup(group) +if ratcraft then +ratcraft.status=status +local no1=status==RAT.status.Departure +local no2=status==RAT.status.EventBirthAir +local no3=status==RAT.status.Holding +local text=string.format("Flight %s: %s",group:GetName(),status) +self:T(self.lid..text) +if not(no1 or no2 or no3)then +MESSAGE:New(text,10):ToAllIf(self.reportstatus) +end +end +end +end +function RAT:_GetRatcraftFromGroup(group) +if group then +local index=self:GetSpawnIndexFromGroup(group) +if self.ratcraft[index]then +return self.ratcraft[index] +end +end +return nil +end +function RAT:GetStatus(group) +if group and group:IsAlive()then +local ratcraft=self:_GetRatcraftFromGroup(group) +if ratcraft then +return ratcraft.status +end +end +return"nonexistant" +end +function RAT:_OnBirth(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event birth!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +local text="Event: Group "..SpawnGroup:GetName().." was born." +self:T(self.lid..text) +local status="unknown in birth" +if SpawnGroup:InAir()then +status=RAT.status.EventBirthAir +elseif self.uncontrolled then +status=RAT.status.Uncontrolled +else +status=RAT.status.EventBirth +end +self:_SetStatus(SpawnGroup,status) +local i=self:GetSpawnIndexFromGroup(SpawnGroup) +local ratcraft=self.ratcraft[i] +local _departure=ratcraft.departure:GetName() +local _destination=ratcraft.destination:GetName() +local _nrespawn=ratcraft.nrespawn +local _takeoff=ratcraft.takeoff +local _landing=ratcraft.landing +local _livery=ratcraft.livery +local _airbase=AIRBASE:FindByName(_departure) +local onrunway=false +if _airbase then +if self.checkonrunway and _takeoff~=RAT.wp.runway and _takeoff~=RAT.wp.air then +onrunway=_airbase:CheckOnRunWay(SpawnGroup,self.onrunwayradius,false) +end +end +if onrunway then +local text=string.format("ERROR: RAT group of %s was spawned on runway. Group #%d will be despawned immediately!",self.alias,i) +MESSAGE:New(text,30):ToAllIf(self.Debug) +self:E(self.lid..text) +if self.Debug then +SpawnGroup:FlareRed() +end +self:_Despawn(SpawnGroup) +if(self.Ndeparture_Airports>=2 or self.random_departure)and _nrespawn<self.onrunwaymaxretry then +_nrespawn=_nrespawn+1 +text=string.format("Try spawning new aircraft of group %s at another location. Attempt %d of max %d.",self.alias,_nrespawn,self.onrunwaymaxretry) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +self:_SpawnWithRoute(nil,nil,nil,nil,nil,nil,nil,_nrespawn) +else +if self.respawn_inair and not self.uncontrolled then +text=string.format("Spawning new aircraft of group %s in air since no parking slot is available at %s.",self.alias,_departure) +MESSAGE:New(text,10):ToAll() +self:T(self.lid..text) +self:_SpawnWithRoute(_departure,_destination,RAT.wp.air,_landing,_livery) +end +end +end +local ontop=false +if self.checkontop and(_airbase and _airbase:GetAirbaseCategory()==Airbase.Category.AIRDROME)then +ontop=self:_CheckOnTop(SpawnGroup,self.ontopradius) +end +if ontop then +local text=string.format("ERROR: Group of %s was spawned on top of another unit. Group #%d will be despawned immediately!",self.alias,i) +MESSAGE:New(text,30):ToAllIf(self.Debug) +self:T(self.lid..text) +if self.Debug then +SpawnGroup:FlareYellow() +end +self:_Despawn(SpawnGroup) +end +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_OnBirth().") +end +end +function RAT:_OnEngineStartup(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event EngineStartup!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +local text="Event: Group "..SpawnGroup:GetName().." started engines." +self:T(self.lid..text) +local status +if SpawnGroup:InAir()then +status=RAT.status.EventEngineStartAir +else +status=RAT.status.EventEngineStart +end +self:_SetStatus(SpawnGroup,status) +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_EngineStartup().") +end +end +function RAT:_OnTakeoff(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +local text="Event: Group "..SpawnGroup:GetName().." is airborne." +self:T(self.lid..text) +local status=RAT.status.EventTakeoff +self:_SetStatus(SpawnGroup,status) +if self.respawn_after_takeoff then +text="Event: Group "..SpawnGroup:GetName().." will be respawned after takeoff." +self:T(self.lid..text) +self:_SpawnWithRoute(nil,nil,nil,nil,nil,nil,nil,nil) +end +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_OnTakeoff().") +end +end +function RAT:_OnLand(EventData) +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +local text="Event: Group "..SpawnGroup:GetName().." landed" +self:T(self.lid..text) +local status=RAT.status.EventLand +self:_SetStatus(SpawnGroup,status) +if self.ATCswitch then +RAT._ATCFlightLanded(SpawnGroup:GetName()) +end +if self.respawn_at_landing and not self.norespawn then +text="Event: Group "..SpawnGroup:GetName().." will be respawned" +self:T(self.lid..text) +self:_Respawn(SpawnGroup) +end +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_OnLand()") +end +end +function RAT:_OnEngineShutdown(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event EngineShutdown!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +if not SpawnGroup:InAir()then +local currentstate=self:GetStatus(SpawnGroup) +local text=string.format("Event: Unit %s of group %s shut down its engines. Current state %s.",EventData.IniUnitName,SpawnGroup:GetName(),currentstate) +self:T(self.lid..text) +if currentstate~=RAT.status.EventEngineShutdown and currentstate~="Dead"then +local status=RAT.status.EventEngineShutdown +self:_SetStatus(SpawnGroup,status) +if not self.respawn_at_landing and not self.norespawn then +text=string.format("Event: Group %s will be respawned. Current state %s => new state %s.",SpawnGroup:GetName(),currentstate,status) +self:T(self.lid..text) +self:_Respawn(SpawnGroup,nil,3) +else +text="Event: Group "..SpawnGroup:GetName().." will be destroyed now" +self:T(self.lid..text) +self:_Despawn(SpawnGroup) +end +end +end +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_OnEngineShutdown().") +end +end +function RAT:_OnHit(EventData) +self:F3(EventData) +self:T(self.lid..string.format("Captured event Hit by %s! Initiator %s. Target %s",self.alias,tostring(EventData.IniUnitName),tostring(EventData.TgtUnitName))) +local SpawnGroup=EventData.TgtGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +self:T(self.lid..string.format("Event: Group %s was hit. Unit %s.",SpawnGroup:GetName(),tostring(EventData.TgtUnitName))) +local text=string.format("%s, unit %s was hit!",self.alias,EventData.TgtUnitName) +MESSAGE:New(text,10):ToAllIf(self.reportstatus or self.Debug) +end +end +end +function RAT:_OnDeadOrCrash(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event DeadOrCrash!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.alias then +self.alive=self.alive-1 +local text=string.format("Event: Group %s crashed or died. Alive counter = %d.",SpawnGroup:GetName(),self.alive) +self:T(self.lid..text) +if EventData.id==world.event.S_EVENT_CRASH then +self:_OnCrash(EventData) +elseif EventData.id==world.event.S_EVENT_DEAD then +self:_OnDead(EventData) +end +end +end +end +end +function RAT:_OnDead(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event Dead!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix then +if EventPrefix==self.alias then +local text=string.format("Event: Group %s died. Unit %s.",SpawnGroup:GetName(),EventData.IniUnitName) +self:T(self.lid..text) +local status=RAT.status.EventDead +self:_SetStatus(SpawnGroup,status) +end +end +else +self:T2(self.lid.."ERROR: Group does not exist in RAT:_OnDead().") +end +end +function RAT:_OnCrash(EventData) +self:F3(EventData) +self:T3(self.lid.."Captured event Crash!") +local SpawnGroup=EventData.IniGroup +if SpawnGroup then +local EventPrefix=self:_GetPrefixFromGroup(SpawnGroup) +if EventPrefix and EventPrefix==self.alias then +local ratcraft=self:_GetRatcraftFromGroup(SpawnGroup) +if ratcraft then +ratcraft.nunits=ratcraft.nunits-1 +local _n0=SpawnGroup:GetInitialSize() +local text=string.format("Event: Group %s crashed. Unit %s. Units still alive %d of %d.",SpawnGroup:GetName(),EventData.IniUnitName,ratcraft.nunits,_n0) +self:T(self.lid..text) +local status=RAT.status.EventCrash +self:_SetStatus(SpawnGroup,status) +if ratcraft.nunits==0 and self.respawn_after_crash and not self.norespawn then +self:T(self.lid..string.format("No units left of group %s. Group will be respawned now.",SpawnGroup:GetName())) +self:_Respawn(SpawnGroup) +end +else +self:E(self.lid..string.format("ERROR: Could not find ratcraft object for crashed group %s!",SpawnGroup:GetName())) +end +end +else +if self.Debug then +self:E(self.lid.."ERROR: Group does not exist in RAT:_OnCrash()!") +end +end +end +function RAT:_Waypoint(index,description,Type,Coord,Speed,Altitude,Airport) +local _Altitude=Altitude or Coord.y +local Hland=Coord:GetLandHeight() +local _Type=nil +local _Action=nil +local _alttype="RADIO" +if Type==RAT.wp.cold then +_Type="TakeOffParking" +_Action="From Parking Area" +_Altitude=10 +_alttype="RADIO" +elseif Type==RAT.wp.hot then +_Type="TakeOffParkingHot" +_Action="From Parking Area Hot" +_Altitude=10 +_alttype="RADIO" +elseif Type==RAT.wp.runway then +_Type="TakeOff" +_Action="From Parking Area" +_Altitude=10 +_alttype="RADIO" +elseif Type==RAT.wp.air then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +elseif Type==RAT.wp.climb then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +elseif Type==RAT.wp.cruise then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +elseif Type==RAT.wp.descent then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +elseif Type==RAT.wp.holding then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +elseif Type==RAT.wp.landing then +_Type="Land" +_Action="Landing" +_Altitude=10 +_alttype="RADIO" +elseif Type==RAT.wp.finalwp then +_Type="Turning Point" +_Action="Turning Point" +_alttype="BARO" +else +self:E(self.lid.."ERROR: Unknown waypoint type in RAT:Waypoint() function!") +_Type="Turning Point" +_Action="Turning Point" +_alttype="RADIO" +end +local text=string.format("\n******************************************************\n") +text=text..string.format("Waypoint = %d\n",index) +text=text..string.format("Template = %s\n",self.SpawnTemplatePrefix) +text=text..string.format("Alias = %s\n",self.alias) +text=text..string.format("Type: %i - %s\n",Type,_Type) +text=text..string.format("Action: %s\n",_Action) +text=text..string.format("Coord: x = %6.1f km, y = %6.1f km, alt = %6.1f m\n",Coord.x/1000,Coord.z/1000,Coord.y) +text=text..string.format("Speed = %6.1f m/s = %6.1f km/h = %6.1f knots\n",Speed,Speed*3.6,Speed*1.94384) +text=text..string.format("Land = %6.1f m ASL\n",Hland) +text=text..string.format("Altitude = %6.1f m (%s)\n",_Altitude,_alttype) +if Airport then +if Type==RAT.wp.air then +text=text..string.format("Zone = %s\n",Airport:GetName()) +else +text=text..string.format("Airport = %s\n",Airport:GetName()) +end +else +text=text..string.format("No airport/zone specified\n") +end +text=text.."******************************************************\n" +self:T2(self.lid..text) +local RoutePoint={} +RoutePoint.x=Coord.x +RoutePoint.y=Coord.z +RoutePoint.alt=_Altitude +RoutePoint.alt_type=_alttype +RoutePoint.type=_Type +RoutePoint.action=_Action +RoutePoint.speed=Speed +RoutePoint.speed_locked=true +RoutePoint.ETA=nil +RoutePoint.ETA_locked=false +RoutePoint.name=description +if(Airport~=nil)and(Type~=RAT.wp.air)then +local AirbaseID=Airport:GetID() +local AirbaseCategory=Airport:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP then +RoutePoint.linkUnit=AirbaseID +RoutePoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.HELIPAD then +RoutePoint.linkUnit=AirbaseID +RoutePoint.helipadId=AirbaseID +elseif AirbaseCategory==Airbase.Category.AIRDROME then +RoutePoint.airdromeId=AirbaseID +else +self:T(self.lid.."Unknown Airport category in _Waypoint()!") +end +end +return RoutePoint +end +function RAT:_Routeinfo(waypoints,comment,waypointdescriptions) +local text=string.format("\n******************************************************\n") +text=text..string.format("Template = %s\n",self.SpawnTemplatePrefix) +if comment then +text=text..comment.."\n" +end +text=text..string.format("Number of waypoints = %i\n",#waypoints) +for i=1,#waypoints do +local p=waypoints[i] +text=text..string.format("WP #%i: x = %6.1f km, y = %6.1f km, alt = %6.1f m %s\n",i-1,p.x/1000,p.y/1000,p.alt,waypointdescriptions[i]) +end +local total=0.0 +for i=1,#waypoints-1 do +local point1=waypoints[i] +local point2=waypoints[i+1] +local x1=point1.x +local y1=point1.y +local x2=point2.x +local y2=point2.y +local d=math.sqrt((x1-x2)^2+(y1-y2)^2) +local heading=self:_Course(point1,point2) +total=total+d +text=text..string.format("Distance from WP %i-->%i = %6.1f km. Heading = %03d : %s - %s\n",i-1,i,d/1000,heading,waypointdescriptions[i],waypointdescriptions[i+1]) +end +text=text..string.format("Total distance = %6.1f km\n",total/1000) +text=text..string.format("******************************************************\n") +self:T2(self.lid..text) +return total +end +function RAT:_AnticipatedGroupName(index) +local index=index or self.SpawnIndex+1 +return string.format("%s#%03d",self.alias,index) +end +function RAT:_ActivateUncontrolled() +local idx={} +local rat={} +local nactive=0 +for spawnindex,_ratcraft in pairs(self.ratcraft)do +local ratcraft=_ratcraft +local group=ratcraft.group +if group and group:IsAlive()then +local text=string.format("Uncontrolled: Group = %s (spawnindex = %d), active = %s",ratcraft.group:GetName(),spawnindex,tostring(ratcraft.active)) +self:T2(self.lid..text) +if ratcraft.active then +nactive=nactive+1 +else +table.insert(idx,spawnindex) +end +end +end +local text=string.format("Uncontrolled: Ninactive = %d, Nactive = %d (of max %d)",#idx,nactive,self.activate_max) +self:T(self.lid..text) +if#idx>0 and nactive<self.activate_max then +local index=idx[math.random(#idx)] +local ratcraft=self.ratcraft[index] +local group=ratcraft.group +local departureAirbase=self:_GetDepartureAirbase(ratcraft) +local departureFlightControl=nil +if departureAirbase then +departureFlightControl=_DATABASE:GetFlightControl(departureAirbase:GetName()) +end +if departureFlightControl then +self:T(self.lid..string.format("RAT group %s is ready for takeoff",group:GetName())) +ratcraft.flightgroup:SetReadyForTakeoff(true) +else +self:T(self.lid..string.format("RAT group %s is switching to controlled now",group:GetName())) +ratcraft.flightgroup:StartUncontrolled() +end +ratcraft.active=true +self:_SetStatus(group,RAT.status.EventBirth) +end +end +function RAT:_CommandInvisible(group,switch) +local SetInvisible={id='SetInvisible',params={value=switch}} +group:SetCommand(SetInvisible) +end +function RAT:_CommandImmortal(group,switch) +local SetImmortal={id='SetImmortal',params={value=switch}} +group:SetCommand(SetImmortal) +end +function RAT:_GetObjectSize(unit) +local DCSunit=unit:GetDCSObject() +if DCSunit then +local DCSdesc=DCSunit:getDesc() +local length=DCSdesc.box.max.x+math.abs(DCSdesc.box.min.x) +local height=DCSdesc.box.max.y+math.abs(DCSdesc.box.max.y) +local width=DCSdesc.box.max.z+math.abs(DCSdesc.box.min.z) +return math.max(length,width) +end +return nil +end +function RAT:_CheckOnTop(group,distmin) +distmin=distmin or 2 +for i,uniti in pairs(group:GetUnits())do +local uniti=uniti +if uniti then +local namei=uniti:GetName() +for j,unitj in pairs(_DATABASE.UNITS)do +if unitj then +local unitj=unitj +local namej=unitj:GetName() +if namei~=namej then +local DCSuniti=uniti:GetDCSObject() +local DCSunitj=unitj:GetDCSObject() +if DCSuniti and DCSuniti:isExist()and DCSunitj and DCSunitj:isExist()then +local _dist=uniti:GetCoordinate():Get3DDistance(unitj:GetCoordinate()) +if _dist<distmin then +if(not uniti:InAir())and(not unitj:InAir())then +self:T(self.lid..string.format("Unit %s is on top of unit %s. Distance %.2f m.",namei,namej,_dist)) +return true +end +end +end +end +end +end +end +end +return false +end +function RAT:_MinDistance(alpha,beta,ha,hb) +local d1=ha/math.tan(alpha) +local d2=hb/math.tan(beta) +return d1,d2,d1+d2 +end +function RAT:_AddFriendlyAirports(ports) +for _,airport in pairs(self.airports)do +if not self:_NameInList(ports,airport:GetName())then +table.insert(ports,airport:GetName()) +end +end +end +function RAT:_NameInList(liste,name) +for _,item in pairs(liste)do +if item==name then +return true +end +end +return false +end +function RAT:_GetDestinationAirbase(ratcraft) +if ratcraft and ratcraft.destination then +local airbase=AIRBASE:FindByName(ratcraft.destination) +return airbase +end +return nil +end +function RAT:_GetDepartureAirbase(ratcraft) +if ratcraft and ratcraft.departure then +local name=ratcraft.departure:GetName() +local airbase=AIRBASE:FindByName(name) +return airbase +end +return nil +end +function RAT:_AirportExists(name) +for _,airport in pairs(self.airports_map)do +if airport:GetName()==name then +return true +end +end +return false +end +function RAT:_ZoneExists(name) +local z=ZONE:FindByName(name) +if z then +return true +end +return false +end +function RAT:_SetROE(flightgroup,roe) +roe=roe or self.roe +self:T(self.lid.."Setting ROE to "..roe.." for group "..flightgroup:GetName()) +local _roe=ENUMS.ROE.WeaponHold +if roe==RAT.ROE.returnfire then +_roe=ENUMS.ROE.ReturnFire +elseif roe==RAT.ROE.weaponfree then +_roe=ENUMS.ROE.OpenFireWeaponFree +else +end +flightgroup:SetDefaultROE(_roe) +flightgroup:SwitchROE(_roe) +end +function RAT:_SetROT(flightgroup,rot) +rot=rot or self.rot +self:T(self.lid.."Setting ROT to "..rot.." for group "..flightgroup:GetName()) +local _rot=ENUMS.ROT.NoReaction +if rot==RAT.ROT.passive then +_rot=ENUMS.ROT.PassiveDefense +elseif rot==RAT.ROT.evade then +_rot=ENUMS.ROT.EvadeFire +else +end +flightgroup:SetDefaultROT(_rot) +flightgroup:SwitchROT(_rot) +end +function RAT:_SetCoalitionTable() +if self.friendly==RAT.coal.neutral then +self.ctable={coalition.side.NEUTRAL} +elseif self.friendly==RAT.coal.same then +self.ctable={self.coalition,coalition.side.NEUTRAL} +elseif self.friendly==RAT.coal.sameonly then +self.ctable={self.coalition} +else +self:E(self.lid.."ERROR: Unknown friendly coalition in _SetCoalitionTable(). Defaulting to NEUTRAL.") +self.ctable={self.coalition,coalition.side.NEUTRAL} +end +end +function RAT:_Course(a,b) +local dx=b.x-a.x +local ay +if a.alt then +ay=a.y +else +ay=a.z +end +local by +if b.alt then +by=b.y +else +by=b.z +end +local dy=by-ay +local angle=math.deg(math.atan2(dy,dx)) +if angle<0 then +angle=360+angle +end +return angle +end +function RAT:_Heading(course) +local h +if course<=180 then +h=math.rad(course) +else +h=-math.rad(360-course) +end +return h +end +function RAT:_Randomize(value,fac,lower,upper) +local min +if lower then +min=math.max(value-value*fac,lower) +else +min=value-value*fac +end +local max +if upper then +max=math.min(value+value*fac,upper) +else +max=value+value*fac +end +local r=math.random(min,max) +if self.Debug then +local text=string.format("Random: value = %6.2f, fac = %4.2f, min = %6.2f, max = %6.2f, r = %6.2f",value,fac,min,max,r) +self:T3(self.lid..text) +end +return r +end +function RAT:_PlaceMarkers(waypoints,waypointdescriptions,index) +for i=1,#waypoints do +self:_SetMarker(waypointdescriptions[i],waypoints[i],index) +if self.Debug then +local text=string.format("Marker at waypoint #%d: %s for flight #%d",i,waypointdescriptions[i],index) +self:T2(self.lid..text) +end +end +end +function RAT:_SetMarker(text,wp,index) +RAT.markerid=RAT.markerid+1 +self.markerids[#self.markerids+1]=RAT.markerid +if self.Debug then +local text2=string.format("%s: placing marker with ID %d and text %s",self.alias,RAT.markerid,text) +self:T2(self.lid..text2) +end +local vec={x=wp.x,y=wp.alt,z=wp.y} +local flight=self:GetGroupFromIndex(index):GetName() +local text1=string.format("%s:\n%s",flight,text) +trigger.action.markToAll(RAT.markerid,text1,vec,false,"") +end +function RAT:_DeleteMarkers() +for k,v in ipairs(self.markerids)do +trigger.action.removeMark(v) +end +for k,v in ipairs(self.markerids)do +self.markerids[k]=nil +end +end +function RAT:_ModifySpawnTemplate(waypoints,livery,spawnplace,departure,takeoff,parkingdata,uncontrolled) +self:F2({waypoints=waypoints,livery=livery,spawnplace=spawnplace,departure=departure,takeoff=takeoff,parking=parkingdata}) +local PointVec3=COORDINATE:New(waypoints[1].x,waypoints[1].alt,waypoints[1].y) +if spawnplace then +PointVec3=COORDINATE:NewFromCoordinate(spawnplace) +end +local TemplateGroup=GROUP:FindByName(self.SpawnTemplatePrefix) +local TemplateUnit=TemplateGroup:GetUnit(1) +local spawnonground=takeoff==RAT.wp.cold or takeoff==RAT.wp.hot or takeoff==RAT.wp.runway +local spawnonship=false +local spawnonfarp=false +local spawnonrunway=false +local spawnonairport=false +if spawnonground then +local AirbaseCategory=departure:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.SHIP then +spawnonship=true +elseif AirbaseCategory==Airbase.Category.HELIPAD then +spawnonfarp=true +elseif AirbaseCategory==Airbase.Category.AIRDROME then +spawnonairport=true +end +spawnonrunway=takeoff==RAT.wp.runway +end +local automatic=false +if automatic and spawnonground then +PointVec3=PointVec3:GetClosestParkingSpot(true,departure) +end +local course=self:_Course(waypoints[1],waypoints[2]) +local heading=self:_Heading(course) +if self:_GetSpawnIndex(self.SpawnIndex+1)then +local SpawnTemplate=self.SpawnGroups[self.SpawnIndex].SpawnTemplate +if SpawnTemplate then +self:T(SpawnTemplate) +if self.uncontrolled or uncontrolled then +SpawnTemplate.uncontrolled=true +end +local nunits=#SpawnTemplate.units +local parkingspots={} +local parkingindex={} +local spots +if spawnonground then +local nfree=0 +local termtype=self.termtype +if spawnonrunway then +termtype=AIRBASE.TerminalType.Runway +end +local scanradius=self.parkingscanradius +local scanunits=true +local scanstatics=true +local scanscenery=self.parkingscanscenery +local verysafe=self.parkingverysafe +if spawnonship or spawnonfarp or spawnonrunway then +self:T(self.lid..string.format("Group %s is spawned on farp/ship/runway %s.",self.alias,departure:GetName())) +nfree=departure:GetFreeParkingSpotsNumber(termtype,true) +spots=departure:GetFreeParkingSpotsTable(termtype,true) +self:T(self.lid..string.format("Free nfree=%d nspots=%d",nfree,#spots)) +elseif parkingdata~=nil then +self:T2("Spawning with explicit parking data") +nfree=#parkingdata +spots=parkingdata +else +if self.category==RAT.cat.heli then +if termtype==nil then +self:T(self.lid..string.format("Helo group %s is spawned at %s using terminal type %d.",self.alias,departure:GetName(),AIRBASE.TerminalType.HelicopterOnly)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterOnly,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +if nfree<nunits then +self:T(self.lid..string.format("Helo group %s is spawned at %s using terminal type %d.",self.alias,departure:GetName(),AIRBASE.TerminalType.HelicopterUsable)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.HelicopterUsable,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +end +else +self:T(self.lid..string.format("Helo group %s is at %s using terminal type %d.",self.alias,departure:GetName(),termtype)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +end +else +if termtype==nil then +local bomber=TemplateUnit:HasAttribute("Bombers") +local transport=TemplateUnit:HasAttribute("Transports") +if bomber or transport then +self:T(self.lid..string.format("Transport/bomber group %s is spawned at %s using terminal type %d.",self.alias,departure:GetName(),AIRBASE.TerminalType.OpenBig)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.OpenBig,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +if nfree<nunits then +self:T(self.lid..string.format("Transport/bomber group %s is at %s using terminal type %d.",self.alias,departure:GetName(),AIRBASE.TerminalType.OpenMed)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.OpenMed,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +end +else +self:T(self.lid..string.format("Fighter group %s is spawned at %s using terminal type %d.",self.alias,departure:GetName(),AIRBASE.TerminalType.FighterAircraft)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,AIRBASE.TerminalType.FighterAircraft,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +end +else +self:T(self.lid..string.format("Plane group %s is spawned at %s using terminal type %d.",self.alias,departure:GetName(),termtype)) +spots=departure:FindFreeParkingSpotForAircraft(TemplateGroup,termtype,scanradius,scanunits,scanstatics,scanscenery,verysafe,nunits) +nfree=#spots +end +end +end +if false then +local parkingdata=departure:GetParkingSpotsTable(termtype) +self:T2(self.lid..string.format("Parking at %s, terminal type %s:",departure:GetName(),tostring(termtype))) +for _,_spot in pairs(parkingdata)do +self:T2(self.lid..string.format("%s, Termin Index = %3d, Term Type = %03d, Free = %5s, TOAC = %5s, Term ID0 = %3d, Dist2Rwy = %4d", +departure:GetName(),_spot.TerminalID,_spot.TerminalType,tostring(_spot.Free),tostring(_spot.TOAC),_spot.TerminalID0,_spot.DistToRwy)) +end +self:T(self.lid..string.format("%s at %s: free parking spots = %d - number of units = %d",self.alias,departure:GetName(),nfree,nunits)) +end +local _notenough=false +if spawnonship or spawnonfarp or spawnonrunway then +if nfree>=1 then +for i=1,nunits do +table.insert(parkingspots,spots[1].Coordinate) +table.insert(parkingindex,spots[1].TerminalID) +end +PointVec3=spots[1].Coordinate +else +_notenough=true +end +elseif spawnonairport then +if nfree>=nunits then +for i=1,nunits do +table.insert(parkingspots,spots[i].Coordinate) +table.insert(parkingindex,spots[i].TerminalID) +end +else +_notenough=true +end +end +if _notenough then +if self.respawn_inair and not self.SpawnUnControlled then +self:E(self.lid..string.format("WARNING: Group %s has no parking spots at %s ==> air start!",self.SpawnTemplatePrefix,departure:GetName())) +spawnonground=false +spawnonship=false +spawnonfarp=false +spawnonrunway=false +waypoints[1].type=GROUPTEMPLATE.Takeoff[GROUP.Takeoff.Air][1] +waypoints[1].action=GROUPTEMPLATE.Takeoff[GROUP.Takeoff.Air][2] +PointVec3.x=PointVec3.x+math.random(-1500,1500) +PointVec3.z=PointVec3.z+math.random(-1500,1500) +if self.category==RAT.cat.heli then +PointVec3.y=PointVec3:GetLandHeight()+math.random(100,1000) +else +PointVec3.y=PointVec3:GetLandHeight()+math.random(500,3000) +end +else +self:E(self.lid..string.format("WARNING: Group %s has no parking spots at %s ==> No emergency air start or uncontrolled spawning ==> No spawn!",self.SpawnTemplatePrefix,departure:GetName())) +return nil +end +end +else +end +for UnitID=1,nunits do +local UnitTemplate=SpawnTemplate.units[UnitID] +local SX=UnitTemplate.x +local SY=UnitTemplate.y +local BX=SpawnTemplate.route.points[1].x +local BY=SpawnTemplate.route.points[1].y +local TX=PointVec3.x+(SX-BX) +local TY=PointVec3.z+(SY-BY) +if spawnonground then +if spawnonship or spawnonfarp or spawnonrunway or automatic then +self:T(self.lid..string.format("RAT group %s spawning at farp, ship or runway %s.",self.alias,departure:GetName())) +SpawnTemplate.units[UnitID].x=PointVec3.x +SpawnTemplate.units[UnitID].y=PointVec3.z +SpawnTemplate.units[UnitID].alt=PointVec3.y +else +self:T(self.lid..string.format("RAT group %s spawning at airbase %s on parking spot id %d",self.alias,departure:GetName(),parkingindex[UnitID])) +SpawnTemplate.units[UnitID].x=parkingspots[UnitID].x +SpawnTemplate.units[UnitID].y=parkingspots[UnitID].z +SpawnTemplate.units[UnitID].alt=parkingspots[UnitID].y +end +else +self:T(self.lid..string.format("RAT group %s spawning in air at %s.",self.alias,departure:GetName())) +SpawnTemplate.units[UnitID].x=TX +SpawnTemplate.units[UnitID].y=TY +SpawnTemplate.units[UnitID].alt=PointVec3.y +end +if self.Debug then +local unitspawn=COORDINATE:New(SpawnTemplate.units[UnitID].x,SpawnTemplate.units[UnitID].alt,SpawnTemplate.units[UnitID].y) +unitspawn:MarkToAll(string.format("RAT %s Spawnplace unit #%d",self.alias,UnitID)) +end +UnitTemplate.parking=nil +UnitTemplate.parking_id=nil +if parkingindex[UnitID]and not automatic then +UnitTemplate.parking=parkingindex[UnitID] +end +self:T2(self.lid..string.format("RAT group %s unit number %d: Parking = %s",self.alias,UnitID,tostring(UnitTemplate.parking))) +self:T2(self.lid..string.format("RAT group %s unit number %d: Parking ID = %s",self.alias,UnitID,tostring(UnitTemplate.parking_id))) +SpawnTemplate.units[UnitID].heading=heading +SpawnTemplate.units[UnitID].psi=-heading +if livery then +SpawnTemplate.units[UnitID].livery_id=livery +end +if self.actype then +SpawnTemplate.units[UnitID]["type"]=self.actype +end +SpawnTemplate.units[UnitID]["skill"]=self.skill +if self.onboardnum then +SpawnTemplate.units[UnitID]["onboard_num"]=string.format("%s%d%02d",self.onboardnum,(self.SpawnIndex-1)%10,(self.onboardnum0-1)+UnitID) +end +SpawnTemplate.CoalitionID=self.coalition +if self.country then +SpawnTemplate.CountryID=self.country +end +end +for i,wp in ipairs(waypoints)do +SpawnTemplate.route.points[i]=wp +end +SpawnTemplate.x=PointVec3.x +SpawnTemplate.y=PointVec3.z +if self.radio then +SpawnTemplate.communication=self.radio +end +if self.frequency then +SpawnTemplate.frequency=self.frequency +end +if self.modulation then +SpawnTemplate.modulation=self.modulation +end +self:T(SpawnTemplate) +end +end +return true +end +function RAT._ATCInit(airports_map) +if not RAT.ATC.init then +local text="Starting RAT ATC.\nSimultanious = "..RAT.ATC.Nclearance.."\n".."Delay = "..RAT.ATC.delay +BASE:I(RAT.id..text) +for _,ap in pairs(airports_map)do +local airbase=ap +local name=airbase:GetName() +local fc=_DATABASE:GetFlightControl(name) +if not fc then +local airport={} +airport.queue={} +airport.busy=false +airport.onfinal={} +airport.Nonfinal=0 +airport.traffic=0 +airport.Tlastclearance=nil +RAT.ATC.airport[name]=airport +end +end +SCHEDULER:New(nil,RAT._ATCCheck,{},5,15) +SCHEDULER:New(nil,RAT._ATCStatus,{},5,60) +RAT.ATC.T0=timer.getTime() +end +RAT.ATC.init=true +end +function RAT:_ATCAddFlight(name,dest) +BASE:I(RAT.id..string.format("ATC %s: Adding flight %s with destination %s.",dest,name,dest)) +local flight={} +flight.destination=dest +flight.Tarrive=-1 +flight.holding=-1 +flight.Tarrive=-1 +RAT.ATC.flight[name]=flight +end +function RAT._ATCDelFlight(t,entry) +for k,_ in pairs(t)do +if k==entry then +BASE:I(RAT.id..string.format("Removing flight %s from queue",entry)) +t[entry]=nil +end +end +end +function RAT._ATCRegisterFlight(name,time) +BASE:I(RAT.id..string.format("Flight %s registered at ATC for landing clearance.",name)) +RAT.ATC.flight[name].Tarrive=time +RAT.ATC.flight[name].holding=0 +end +function RAT._ATCStatus() +local Tnow=timer.getTime() +for name,_flight in pairs(RAT.ATC.flight)do +local flight=_flight +local hold=RAT.ATC.flight[name].holding +local dest=RAT.ATC.flight[name].destination +local airport=RAT.ATC.airport[dest] +if airport then +if hold>=0 then +local busy="Runway state is unknown" +if airport.Nonfinal>0 then +busy="Runway is occupied by "..airport.Nonfinal +else +busy="Runway is currently clear" +end +local text=string.format("ATC %s: Flight %s is holding for %i:%02d. %s.",dest,name,hold/60,hold%60,busy) +BASE:I(RAT.id..text) +elseif hold==RAT.ATC.onfinal then +local Tfinal=Tnow-flight.Tonfinal +local text=string.format("ATC %s: Flight %s is on final. Waiting %i:%02d for landing event.",dest,name,Tfinal/60,Tfinal%60) +BASE:I(RAT.id..text) +elseif hold==RAT.ATC.unregistered then +else +BASE:E(RAT.id.."ERROR: Unknown holding time in RAT:_ATCStatus().") +end +else +end +end +end +function RAT._ATCCheck() +RAT._ATCQueue() +local Tnow=timer.getTime() +for airportname,_airport in pairs(RAT.ATC.airport)do +local airport=_airport +for qID,flightname in pairs(airport.queue)do +local flight=RAT.ATC.flight[flightname] +local nqueue=#airport.queue +local landing1=false +if airport.Tlastclearance then +landing1=(Tnow-airport.Tlastclearance>RAT.ATC.delay)and airport.Nonfinal<RAT.ATC.Nclearance +end +local landing2=airport.Nonfinal==0 +if not landing1 and not landing2 then +flight.holding=Tnow-flight.Tarrive +local text=string.format("ATC %s: Flight %s runway is busy. You are #%d of %d in landing queue. Your holding time is %i:%02d.", +airportname,flightname,qID,nqueue,flight.holding/60,flight.holding%60) +BASE:I(RAT.id..text) +else +local text=string.format("ATC %s: Flight %s was cleared for landing. Your holding time was %i:%02d.", +airportname,flightname,flight.holding/60,flight.holding%60) +BASE:I(RAT.id..text) +RAT._ATCClearForLanding(airportname,flightname) +end +end +end +RAT._ATCQueue() +end +function RAT._ATCClearForLanding(airportname,flightname) +local flightgroup=_DATABASE:FindOpsGroup(flightname) +if flightgroup then +flightgroup:ClearToLand() +local flight=RAT.ATC.flight[flightname] +flight.holding=RAT.ATC.onfinal +flight.Tonfinal=timer.getTime() +local airport=RAT.ATC.airport[airportname] +airport.busy=true +airport.onfinal[flightname]=flight +airport.Nonfinal=airport.Nonfinal+1 +airport.Tlastclearance=timer.getTime() +BASE:I(RAT.id..string.format("ATC %s: Flight %s cleared for landing",airportname,flightname)) +if string.find(flightname,"#")then +flightname=string.match(flightname,"^(.+)#") +end +local text=string.format("ATC %s: Flight %s you are cleared for landing.",airportname,flightname) +MESSAGE:New(text,10):ToAllIf(RAT.ATC.messages) +else +BASE:E("Could not clear flight for landing!") +end +end +function RAT._ATCFlightLanded(name) +local flight=RAT.ATC.flight[name] +if flight then +local dest=flight.destination +local Tnow=timer.getTime() +local Tfinal=Tnow-flight.Tonfinal +local Thold=flight.Tonfinal-flight.Tarrive +local airport=RAT.ATC.airport[dest] +airport.busy=false +airport.onfinal[name]=nil +airport.Nonfinal=airport.Nonfinal-1 +RAT._ATCDelFlight(RAT.ATC.flight,name) +airport.traffic=airport.traffic+1 +local TrafficPerHour=airport.traffic/(timer.getTime()-RAT.ATC.T0)*3600 +BASE:I(RAT.id..string.format("ATC %s: Flight %s landed. Tholding = %i:%02d, Tfinal = %i:%02d.",dest,name,Thold/60,Thold%60,Tfinal/60,Tfinal%60)) +BASE:I(RAT.id..string.format("ATC %s: Number of flights still on final %d.",dest,airport.Nonfinal)) +BASE:I(RAT.id..string.format("ATC %s: Traffic report: Number of planes landed in total %d. Flights/hour = %3.2f.",dest,airport.traffic,TrafficPerHour)) +if string.find(name,"#")then +name=string.match(name,"^(.+)#") +end +local text=string.format("ATC %s: Flight %s landed. Welcome to %s.",dest,name,dest) +MESSAGE:New(text,10):ToAllIf(RAT.ATC.messages) +end +end +function RAT._ATCQueue() +local Tnow=timer.getTime() +for airport,_ in pairs(RAT.ATC.airport)do +local _queue={} +for name,_flight in pairs(RAT.ATC.flight)do +local flight=_flight +if flight.holding>=0 then +flight.holding=Tnow-flight.Tarrive +end +local hold=flight.holding +local dest=flight.destination +if hold>=0 and airport==dest then +_queue[#_queue+1]={name,hold} +end +end +local function compare(a,b) +return a[2]>b[2] +end +table.sort(_queue,compare) +RAT.ATC.airport[airport].queue={} +for k,v in ipairs(_queue)do +table.insert(RAT.ATC.airport[airport].queue,v[1]) +end +end +end +RATMANAGER={ +ClassName="RATMANAGER", +Debug=false, +rat={}, +name={}, +alive={}, +planned={}, +min={}, +nrat=0, +ntot=nil, +Tcheck=60, +dTspawn=1.0, +manager=nil, +managerid=nil, +} +RATMANAGER.id="RATMANAGER | " +function RATMANAGER:New(ntot) +local self=BASE:Inherit(self,BASE:New()) +self.ntot=ntot or 1 +self:I(RATMANAGER.id..string.format("Creating manager for %d groups",ntot)) +return self +end +function RATMANAGER:Add(ratobject,min) +ratobject.norespawn=true +ratobject.f10menu=false +self.nrat=self.nrat+1 +self.rat[self.nrat]=ratobject +self.alive[self.nrat]=0 +self.planned[self.nrat]=0 +self.name[self.nrat]=ratobject.alias +self.min[self.nrat]=min or 1 +self:T(RATMANAGER.id..string.format("Adding ratobject %s with min flights = %d",self.name[self.nrat],self.min[self.nrat])) +ratobject:Spawn(0) +return self +end +function RATMANAGER:Start(delay) +delay=delay or 5 +if delay and delay>0 then +local text=string.format(RATMANAGER.id.."RAT manager will be started in %d seconds.\n",delay) +text=text..string.format("Managed groups:\n") +for i=1,self.nrat do +text=text..string.format("- %s with min groups %d\n",self.name[i],self.min[i]) +end +text=text..string.format("Number of constantly alive groups %d",self.ntot) +self:E(text) +self:ScheduleOnce(delay,RATMANAGER.Start,self,0) +else +local n=0 +for i=1,self.nrat do +n=n+self.min[i] +end +self.ntot=math.max(self.ntot,n) +local N=self:_RollDice(self.nrat,self.ntot,self.min,self.alive) +local time=0.0 +for i=1,self.nrat do +for j=1,N[i]do +time=time+self.dTspawn +self:ScheduleOnce(time,RAT._SpawnWithRoute,self.rat[i]) +end +end +for i=1,self.nrat do +local rat=self.rat[i] +if rat.uncontrolled and rat.activate_uncontrolled then +local Tactivate=math.max(time+1,rat.activate_delay) +self:ScheduleRepeat(Tactivate,rat.activate_delta,rat.activate_frand,nil,rat._ActivateUncontrolled,rat) +end +end +local TstartManager=math.max(time+1,self.Tcheck) +self.manager,self.managerid=SCHEDULER:New(self,self._Manage,{self},TstartManager,self.Tcheck) +local text=string.format(RATMANAGER.id.."Starting RAT manager with scheduler ID %s in %d seconds. Repeat interval %d seconds.",self.managerid,TstartManager,self.Tcheck) +self:I(text) +end +return self +end +function RATMANAGER:Stop(delay) +delay=delay or 1 +if delay and delay>0 then +self:I(RATMANAGER.id..string.format("Manager will be stopped in %d seconds.",delay)) +self:ScheduleOnce(delay,RATMANAGER.Stop,self,0) +else +self:I(RATMANAGER.id..string.format("Stopping manager with scheduler ID %s",self.managerid)) +self.manager:Stop(self.managerid) +end +return self +end +function RATMANAGER:SetTcheck(dt) +self.Tcheck=dt or 60 +return self +end +function RATMANAGER:SetTspawn(dt) +self.dTspawn=dt or 1.0 +return self +end +function RATMANAGER:_Manage() +local ntot=self:_Count() +self:T(RATMANAGER.id..string.format("Number of alive groups %d. New groups to be spawned %d.",ntot,self.ntot-ntot)) +local N=self:_RollDice(self.nrat,self.ntot,self.min,self.alive) +local time=0.0 +for i=1,self.nrat do +for j=1,N[i]do +time=time+self.dTspawn +self.planned[i]=self.planned[i]+1 +self:ScheduleOnce(time,RATMANAGER._Spawn,self,i) +end +end +end +function RATMANAGER:_Spawn(i) +local rat=self.rat[i] +rat:_SpawnWithRoute() +self.planned[i]=self.planned[i]-1 +end +function RATMANAGER:_Count() +local ntotal=0 +for i=1,self.nrat do +local n=0 +local ratobject=self.rat[i] +for spawnindex,ratcraft in pairs(ratobject.ratcraft)do +local group=ratcraft.group +if group and group:IsAlive()then +n=n+1 +end +end +self.alive[i]=n +ntotal=ntotal+n +local text=string.format("Number of alive groups of %s = %d, planned=%d",self.name[i],n,self.planned[i]) +self:T(RATMANAGER.id..text) +end +return ntotal +end +function RATMANAGER:_RollDice(nrat,ntot,min,alive) +local function sum(A,index) +local summe=0 +for _,i in ipairs(index)do +summe=summe+A[i] +end +return summe +end +local N={} +local M={} +local P={} +for i=1,nrat do +local a=alive[i]+self.planned[i] +N[#N+1]=0 +M[#M+1]=math.max(a,min[i]) +P[#P+1]=math.max(min[i]-a,0) +end +local mini={} +local maxi={} +local rattab={} +for i=1,nrat do +table.insert(rattab,i) +end +local done={} +local nnew=ntot +for i=1,nrat do +nnew=nnew-alive[i]-self.planned[i] +end +for i=1,nrat-1 do +local r=math.random(#rattab) +local j=rattab[r] +table.remove(rattab,r) +table.insert(done,j) +local sN=sum(N,done) +local sP=sum(P,rattab) +maxi[j]=nnew-sN-sP +mini[j]=P[j] +if maxi[j]>=mini[j]then +N[j]=math.random(mini[j],maxi[j]) +else +N[j]=0 +end +self:T3(string.format("RATMANAGER: i=%d, alive=%d, planned=%d, min=%d, mini=%d, maxi=%d, add=%d, sumN=%d, sumP=%d",j,alive[j],self.planned[i],min[j],mini[j],maxi[j],N[j],sN,sP)) +end +local j=rattab[1] +N[j]=nnew-sum(N,done) +mini[j]=nnew-sum(N,done) +maxi[j]=nnew-sum(N,done) +table.remove(rattab,1) +table.insert(done,j) +local text=RATMANAGER.id.."\n" +for i=1,nrat do +text=text..string.format("%s: i=%d, alive=%d, planned=%d, min=%d, mini=%d, maxi=%d, add=%d\n",self.name[i],i,alive[i],self.planned[i],min[i],mini[i],maxi[i],N[i]) +end +text=text..string.format("Total # of groups to add = %d",sum(N,done)) +self:T(text) +return N +end +RANGE={ +ClassName="RANGE", +Debug=false, +verbose=0, +id=nil, +rangename=nil, +location=nil, +messages=true, +rangeradius=5000, +rangezone=nil, +strafeTargets={}, +bombingTargets={}, +nbombtargets=0, +nstrafetargets=0, +MenuAddedTo={}, +planes={}, +strafeStatus={}, +strafePlayerResults={}, +bombPlayerResults={}, +PlayerSettings={}, +dtBombtrack=0.005, +BombtrackThreshold=25000, +Tmsg=30, +examinergroupname=nil, +examinerexclusive=nil, +strafemaxalt=914, +ndisplayresult=10, +BombSmokeColor=SMOKECOLOR.Red, +StrafeSmokeColor=SMOKECOLOR.Green, +StrafePitSmokeColor=SMOKECOLOR.White, +illuminationminalt=500, +illuminationmaxalt=1000, +scorebombdistance=1000, +TdelaySmoke=3.0, +trackbombs=true, +trackrockets=true, +trackmissiles=true, +defaultsmokebomb=true, +autosave=false, +instructorfreq=nil, +instructor=nil, +rangecontrolfreq=nil, +rangecontrol=nil, +soundpath="Range Soundfiles/", +targetsheet=nil, +targetpath=nil, +targetprefix=nil, +Coalition=nil, +ceilingaltitude=20000, +ceilingenabled=false, +} +RANGE.Defaults={ +goodhitrange=25, +strafemaxalt=914, +dtBombtrack=0.005, +Tmsg=30, +ndisplayresult=10, +rangeradius=5000, +TdelaySmoke=3.0, +boxlength=3000, +boxwidth=300, +goodpass=20, +foulline=610 +} +RANGE.TargetType={ +UNIT="Unit", +STATIC="Static", +COORD="Coordinate", +SCENERY="Scenery" +} +RANGE.Sound={ +RC0={filename="RC-0.ogg",duration=0.60}, +RC1={filename="RC-1.ogg",duration=0.47}, +RC2={filename="RC-2.ogg",duration=0.43}, +RC3={filename="RC-3.ogg",duration=0.50}, +RC4={filename="RC-4.ogg",duration=0.58}, +RC5={filename="RC-5.ogg",duration=0.54}, +RC6={filename="RC-6.ogg",duration=0.61}, +RC7={filename="RC-7.ogg",duration=0.53}, +RC8={filename="RC-8.ogg",duration=0.34}, +RC9={filename="RC-9.ogg",duration=0.54}, +RCAccuracy={filename="RC-Accuracy.ogg",duration=0.67}, +RCDegrees={filename="RC-Degrees.ogg",duration=0.59}, +RCExcellentHit={filename="RC-ExcellentHit.ogg",duration=0.76}, +RCExcellentPass={filename="RC-ExcellentPass.ogg",duration=0.89}, +RCFeet={filename="RC-Feet.ogg",duration=0.49}, +RCFor={filename="RC-For.ogg",duration=0.64}, +RCGoodHit={filename="RC-GoodHit.ogg",duration=0.52}, +RCGoodPass={filename="RC-GoodPass.ogg",duration=0.62}, +RCHitsOnTarget={filename="RC-HitsOnTarget.ogg",duration=0.88}, +RCImpact={filename="RC-Impact.ogg",duration=0.61}, +RCIneffectiveHit={filename="RC-IneffectiveHit.ogg",duration=0.86}, +RCIneffectivePass={filename="RC-IneffectivePass.ogg",duration=0.99}, +RCInvalidHit={filename="RC-InvalidHit.ogg",duration=2.97}, +RCLeftStrafePitTooQuickly={filename="RC-LeftStrafePitTooQuickly.ogg",duration=3.09}, +RCPercent={filename="RC-Percent.ogg",duration=0.56}, +RCPoorHit={filename="RC-PoorHit.ogg",duration=0.54}, +RCPoorPass={filename="RC-PoorPass.ogg",duration=0.68}, +RCRollingInOnStrafeTarget={filename="RC-RollingInOnStrafeTarget.ogg",duration=1.38}, +RCTotalRoundsFired={filename="RC-TotalRoundsFired.ogg",duration=1.22}, +RCWeaponImpactedTooFar={filename="RC-WeaponImpactedTooFar.ogg",duration=3.73}, +IR0={filename="IR-0.ogg",duration=0.55}, +IR1={filename="IR-1.ogg",duration=0.41}, +IR2={filename="IR-2.ogg",duration=0.37}, +IR3={filename="IR-3.ogg",duration=0.41}, +IR4={filename="IR-4.ogg",duration=0.37}, +IR5={filename="IR-5.ogg",duration=0.43}, +IR6={filename="IR-6.ogg",duration=0.55}, +IR7={filename="IR-7.ogg",duration=0.43}, +IR8={filename="IR-8.ogg",duration=0.38}, +IR9={filename="IR-9.ogg",duration=0.55}, +IRDecimal={filename="IR-Decimal.ogg",duration=0.54}, +IRMegaHertz={filename="IR-MegaHertz.ogg",duration=0.87}, +IREnterRange={filename="IR-EnterRange.ogg",duration=4.83}, +IRExitRange={filename="IR-ExitRange.ogg",duration=3.10}, +} +RANGE.Names={} +RANGE.MenuF10={} +RANGE.MenuF10Root=nil +RANGE.version="2.8.1" +function RANGE:New(RangeName,Coalition) +local self=BASE:Inherit(self,FSM:New()) +self.rangename=RangeName or"Practice Range" +self.Coalition=Coalition +self.lid=string.format("RANGE %s | ",self.rangename) +local text=string.format("Script version %s - creating new RANGE object %s.",RANGE.version,self.rangename) +self:I(self.lid..text) +self:SetDefaultPlayerSmokeBomb() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Impact","*") +self:AddTransition("*","RollingIn","*") +self:AddTransition("*","StrafeResult","*") +self:AddTransition("*","EnterRange","*") +self:AddTransition("*","ExitRange","*") +self:AddTransition("*","Save","*") +self:AddTransition("*","Load","*") +return self +end +function RANGE:onafterStart() +local _location=nil +local _count=0 +for _,_target in pairs(self.bombingTargets)do +_count=_count+1 +if _location==nil then +_location=self:_GetBombTargetCoordinate(_target) +end +end +self.nbombtargets=_count +_count=0 +for _,_target in pairs(self.strafeTargets)do +_count=_count+1 +for _,_unit in pairs(_target.targets)do +if _location==nil then +_location=_unit:GetCoordinate() +end +end +end +self.nstrafetargets=_count +if self.location==nil then +self.location=_location +end +if self.location==nil then +local text=string.format("ERROR! No range location found. Number of strafe targets = %d. Number of bomb targets = %d.",self.nstrafetargets,self.nbombtargets) +self:E(self.lid..text) +return +end +if self.rangezone==nil then +self.rangezone=ZONE_RADIUS:New(self.rangename,{x=self.location.x,y=self.location.z},self.rangeradius) +end +local text=string.format("Starting RANGE %s. Number of strafe targets = %d. Number of bomb targets = %d.",self.rangename,self.nstrafetargets,self.nbombtargets) +self:I(self.lid..text) +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.Hit) +self:HandleEvent(EVENTS.Shot) +for _,_target in pairs(self.bombingTargets)do +local target=_target +if target.move and target.type==RANGE.TargetType.UNIT and target.speed>1 then +target.target:PatrolZones({self.rangezone},target.speed*0.75,ENUMS.Formation.Vehicle.OffRoad) +end +end +if self.rangecontrolfreq and not self.useSRS then +self.rangecontrol=RADIOQUEUE:New(self.rangecontrolfreq,nil,self.rangename) +self.rangecontrol.schedonce=true +self.rangecontrol:SetDigit(0,self.Sound.RC0.filename,self.Sound.RC0.duration,self.soundpath) +self.rangecontrol:SetDigit(1,self.Sound.RC1.filename,self.Sound.RC1.duration,self.soundpath) +self.rangecontrol:SetDigit(2,self.Sound.RC2.filename,self.Sound.RC2.duration,self.soundpath) +self.rangecontrol:SetDigit(3,self.Sound.RC3.filename,self.Sound.RC3.duration,self.soundpath) +self.rangecontrol:SetDigit(4,self.Sound.RC4.filename,self.Sound.RC4.duration,self.soundpath) +self.rangecontrol:SetDigit(5,self.Sound.RC5.filename,self.Sound.RC5.duration,self.soundpath) +self.rangecontrol:SetDigit(6,self.Sound.RC6.filename,self.Sound.RC6.duration,self.soundpath) +self.rangecontrol:SetDigit(7,self.Sound.RC7.filename,self.Sound.RC7.duration,self.soundpath) +self.rangecontrol:SetDigit(8,self.Sound.RC8.filename,self.Sound.RC8.duration,self.soundpath) +self.rangecontrol:SetDigit(9,self.Sound.RC9.filename,self.Sound.RC9.duration,self.soundpath) +self.rangecontrol:SetSenderCoordinate(self.location) +self.rangecontrol:SetSenderUnitName(self.rangecontrolrelayname) +self.rangecontrol:Start(1,0.1) +if self.instructorfreq and not self.useSRS then +self.instructor=RADIOQUEUE:New(self.instructorfreq,nil,self.rangename) +self.instructor.schedonce=true +self.instructor:SetDigit(0,self.Sound.IR0.filename,self.Sound.IR0.duration,self.soundpath) +self.instructor:SetDigit(1,self.Sound.IR1.filename,self.Sound.IR1.duration,self.soundpath) +self.instructor:SetDigit(2,self.Sound.IR2.filename,self.Sound.IR2.duration,self.soundpath) +self.instructor:SetDigit(3,self.Sound.IR3.filename,self.Sound.IR3.duration,self.soundpath) +self.instructor:SetDigit(4,self.Sound.IR4.filename,self.Sound.IR4.duration,self.soundpath) +self.instructor:SetDigit(5,self.Sound.IR5.filename,self.Sound.IR5.duration,self.soundpath) +self.instructor:SetDigit(6,self.Sound.IR6.filename,self.Sound.IR6.duration,self.soundpath) +self.instructor:SetDigit(7,self.Sound.IR7.filename,self.Sound.IR7.duration,self.soundpath) +self.instructor:SetDigit(8,self.Sound.IR8.filename,self.Sound.IR8.duration,self.soundpath) +self.instructor:SetDigit(9,self.Sound.IR9.filename,self.Sound.IR9.duration,self.soundpath) +self.instructor:SetSenderCoordinate(self.location) +self.instructor:SetSenderUnitName(self.instructorrelayname) +self.instructor:Start(1,0.1) +end +end +if self.autosave then +self:Load() +end +if self.Debug then +self:_MarkTargetsOnMap() +self:_SmokeBombTargets() +self:_SmokeStrafeTargets() +self:_SmokeStrafeTargetBoxes() +self.rangezone:SmokeZone(SMOKECOLOR.White) +end +self:__Status(-10) +end +function RANGE:SetMenuRoot(menu) +self.menuF10root=menu +return self +end +function RANGE:SetMaxStrafeAlt(maxalt) +self.strafemaxalt=maxalt or RANGE.Defaults.strafemaxalt +return self +end +function RANGE:SetBombtrackTimestep(dt) +self.dtBombtrack=dt or RANGE.Defaults.dtBombtrack +return self +end +function RANGE:SetMessageTimeDuration(time) +self.Tmsg=time or RANGE.Defaults.Tmsg +return self +end +function RANGE:SetAutosaveOn() +self.autosave=true +return self +end +function RANGE:SetAutosaveOff() +self.autosave=false +return self +end +function RANGE:SetTargetSheet(path,prefix) +if io then +self.targetsheet=true +self.targetpath=path +self.targetprefix=prefix +else +self:E(self.lid.."ERROR: io is not desanitized. Cannot save target sheet.") +end +return self +end +function RANGE:SetFunkManOn(Port,Host) +self.funkmanSocket=SOCKET:New(Port,Host) +return self +end +function RANGE:SetMessageToExaminer(examinergroupname,exclusively) +self.examinergroupname=examinergroupname +self.examinerexclusive=exclusively +return self +end +function RANGE:SetDisplayedMaxPlayerResults(nmax) +self.ndisplayresult=nmax or RANGE.Defaults.ndisplayresult +return self +end +function RANGE:SetRangeRadius(radius) +self.rangeradius=radius*1000 or RANGE.Defaults.rangeradius +return self +end +function RANGE:SetDefaultPlayerSmokeBomb(switch) +if switch==true or switch==nil then +self.defaultsmokebomb=true +else +self.defaultsmokebomb=false +end +return self +end +function RANGE:SetBombtrackThreshold(distance) +self.BombtrackThreshold=(distance or 25)*1000 +return self +end +function RANGE:SetRangeLocation(coordinate) +self.location=coordinate +return self +end +function RANGE:SetRangeZone(zone) +if zone and type(zone)=="string"then +zone=ZONE:FindByName(zone) +end +self.rangezone=zone +return self +end +function RANGE:SetRangeCeiling(altitude) +self:T(self.lid.."SetRangeCeiling") +if altitude and type(altitude)=="number"then +self.ceilingaltitude=altitude +else +self:E(self.lid.."Altitude either not provided or is not a number, using default setting (20000).") +self.ceilingaltitude=20000 +end +return self +end +function RANGE:EnableRangeCeiling(enabled) +self:T(self.lid.."EnableRangeCeiling") +if enabled and type(enabled)=="boolean"then +self.ceilingenabled=enabled +else +self:E(self.lid.."Enabled either not provide or is not a boolean, using default setting (false).") +self.ceilingenabled=false +end +return self +end +function RANGE:SetBombTargetSmokeColor(colorid) +self.BombSmokeColor=colorid or SMOKECOLOR.Red +return self +end +function RANGE:SetScoreBombDistance(distance) +self.scorebombdistance=distance or 1000 +return self +end +function RANGE:SetStrafeTargetSmokeColor(colorid) +self.StrafeSmokeColor=colorid or SMOKECOLOR.Green +return self +end +function RANGE:SetStrafePitSmokeColor(colorid) +self.StrafePitSmokeColor=colorid or SMOKECOLOR.White +return self +end +function RANGE:SetSmokeTimeDelay(delay) +self.TdelaySmoke=delay or RANGE.Defaults.TdelaySmoke +return self +end +function RANGE:DebugON() +self.Debug=true +return self +end +function RANGE:DebugOFF() +self.Debug=false +return self +end +function RANGE:SetMessagesOFF() +self.messages=false +return self +end +function RANGE:SetMessagesON() +self.messages=true +return self +end +function RANGE:TrackBombsON() +self.trackbombs=true +return self +end +function RANGE:TrackBombsOFF() +self.trackbombs=false +return self +end +function RANGE:TrackRocketsON() +self.trackrockets=true +return self +end +function RANGE:TrackRocketsOFF() +self.trackrockets=false +return self +end +function RANGE:TrackMissilesON() +self.trackmissiles=true +return self +end +function RANGE:TrackMissilesOFF() +self.trackmissiles=false +return self +end +function RANGE:SetSRS(PathToSRS,Port,Coalition,Frequency,Modulation,Volume,PathToGoogleKey) +if PathToSRS or MSRS.path then +self.useSRS=true +self.controlmsrs=MSRS:New(PathToSRS or MSRS.path,Frequency or 256,Modulation or radio.modulation.AM) +self.controlmsrs:SetPort(Port or MSRS.port) +self.controlmsrs:SetCoalition(Coalition or coalition.side.BLUE) +self.controlmsrs:SetLabel("RANGEC") +self.controlmsrs:SetVolume(Volume or 1.0) +self.controlsrsQ=MSRSQUEUE:New("CONTROL") +self.instructmsrs=MSRS:New(PathToSRS or MSRS.path,Frequency or 305,Modulation or radio.modulation.AM) +self.instructmsrs:SetPort(Port or MSRS.port) +self.instructmsrs:SetCoalition(Coalition or coalition.side.BLUE) +self.instructmsrs:SetLabel("RANGEI") +self.instructmsrs:SetVolume(Volume or 1.0) +self.instructsrsQ=MSRSQUEUE:New("INSTRUCT") +if PathToGoogleKey then +self.controlmsrs:SetProviderOptionsGoogle(PathToGoogleKey,PathToGoogleKey) +self.controlmsrs:SetProvider(MSRS.Provider.GOOGLE) +self.instructmsrs:SetProviderOptionsGoogle(PathToGoogleKey,PathToGoogleKey) +self.instructmsrs:SetProvider(MSRS.Provider.GOOGLE) +end +else +self:E(self.lid..string.format("ERROR: No SRS path specified!")) +end +return self +end +function RANGE:SetSRSRangeControl(frequency,modulation,voice,culture,gender,relayunitname) +if not self.instructmsrs then +self:E(self.lid.."Use myrange:SetSRS() once first before using myrange:SetSRSRangeControl!") +return self +end +self.rangecontrolfreq=frequency or 256 +self.controlmsrs:SetFrequencies(self.rangecontrolfreq) +self.controlmsrs:SetModulations(modulation or radio.modulation.AM) +self.controlmsrs:SetVoice(voice) +self.controlmsrs:SetCulture(culture or"en-US") +self.controlmsrs:SetGender(gender or"female") +self.rangecontrol=true +if relayunitname then +local unit=UNIT:FindByName(relayunitname) +local Coordinate=unit:GetCoordinate() +self.rangecontrolrelayname=relayunitname +end +return self +end +function RANGE:SetSRSRangeInstructor(frequency,modulation,voice,culture,gender,relayunitname) +if not self.instructmsrs then +self:E(self.lid.."Use myrange:SetSRS() once first before using myrange:SetSRSRangeInstructor!") +return self +end +self.instructorfreq=frequency or 305 +self.instructmsrs:SetFrequencies(self.instructorfreq) +self.instructmsrs:SetModulations(modulation or radio.modulation.AM) +self.instructmsrs:SetVoice(voice) +self.instructmsrs:SetCulture(culture or"en-US") +self.instructmsrs:SetGender(gender or"male") +self.instructor=true +if relayunitname then +local unit=UNIT:FindByName(relayunitname) +local Coordinate=unit:GetCoordinate() +self.instructmsrs:SetCoordinate(Coordinate) +self.instructorrelayname=relayunitname +end +return self +end +function RANGE:SetRangeControl(frequency,relayunitname) +self.rangecontrolfreq=frequency or 256 +self.rangecontrolrelayname=relayunitname +return self +end +function RANGE:SetInstructorRadio(frequency,relayunitname) +self.instructorfreq=frequency or 305 +self.instructorrelayname=relayunitname +return self +end +function RANGE:SetSoundfilesPath(path) +self.soundpath=tostring(path or"Range Soundfiles/") +self:T2(self.lid..string.format("Setting sound files path to %s",self.soundpath)) +return self +end +function RANGE:SetSoundfilesInfo(csvfile) +local function getSound(filename) +for key,_soundfile in pairs(self.Sound)do +local soundfile=_soundfile +if filename==soundfile.filename then +return soundfile +end +end +return nil +end +local data=UTILS.ReadCSV(csvfile) +if data then +for i,sound in pairs(data)do +local soundfile=getSound(sound.filename..".ogg") +if soundfile then +soundfile.duration=tonumber(sound.duration) +else +self:E(string.format("ERROR: Could not get info for sound file %s",sound.filename)) +end +end +else +self:E(string.format("ERROR: Could not read sound csv file!")) +end +return self +end +function RANGE:AddStrafePit(targetnames,boxlength,boxwidth,heading,inverseheading,goodpass,foulline) +self:F({targetnames=targetnames,boxlength=boxlength,boxwidth=boxwidth,heading=heading,inverseheading=inverseheading,goodpass=goodpass,foulline=foulline}) +if type(targetnames)~="table"then +targetnames={targetnames} +end +local _targets={} +local center=nil +local ntargets=0 +for _i,_name in ipairs(targetnames)do +local _isstatic=self:_CheckStatic(_name) +local unit=nil +if _isstatic==true then +self:T(self.lid..string.format("Adding STATIC object %s as strafe target #%d.",_name,_i)) +unit=STATIC:FindByName(_name,false) +elseif _isstatic==false then +self:T(self.lid..string.format("Adding UNIT object %s as strafe target #%d.",_name,_i)) +unit=UNIT:FindByName(_name) +else +local text=string.format("ERROR! Could not find ANY strafe target object with name %s.",_name) +self:E(self.lid..text) +end +if unit then +table.insert(_targets,unit) +if center==nil then +center=unit +end +ntargets=ntargets+1 +end +end +if ntargets==0 then +local text=string.format("ERROR! No strafe target could be found when calling RANGE:AddStrafePit() for range %s",self.rangename) +self:E(self.lid..text) +return +end +local l=boxlength or RANGE.Defaults.boxlength +local w=(boxwidth or RANGE.Defaults.boxwidth)/2 +local heading=heading or center:GetHeading() +if inverseheading~=nil then +if inverseheading then +heading=heading-180 +end +end +if heading<0 then +heading=heading+360 +end +if heading>360 then +heading=heading-360 +end +goodpass=goodpass or RANGE.Defaults.goodpass +foulline=foulline or RANGE.Defaults.foulline +local Ccenter=center:GetCoordinate() +local _name=center:GetName() +local p={} +p[#p+1]=Ccenter:Translate(w,heading+90) +p[#p+1]=p[#p]:Translate(l,heading) +p[#p+1]=p[#p]:Translate(2*w,heading-90) +p[#p+1]=p[#p]:Translate(-l,heading) +local pv2={} +for i,p in ipairs(p)do +pv2[i]={x=p.x,y=p.z} +end +local _polygon=ZONE_POLYGON_BASE:New(_name,pv2) +local st={} +st.name=_name +st.polygon=_polygon +st.coordinate=Ccenter +st.goodPass=goodpass +st.targets=_targets +st.foulline=foulline +st.smokepoints=p +st.heading=heading +table.insert(self.strafeTargets,st) +local text=string.format("Adding new strafe target %s with %d targets: heading = %03d, box_L = %.1f, box_W = %.1f, goodpass = %d, foul line = %.1f",_name,ntargets,heading,l,w,goodpass,foulline) +self:T(self.lid..text) +return self +end +function RANGE:AddStrafePitGroup(group,boxlength,boxwidth,heading,inverseheading,goodpass,foulline) +self:F({group=group,boxlength=boxlength,boxwidth=boxwidth,heading=heading,inverseheading=inverseheading,goodpass=goodpass,foulline=foulline}) +if group and group:IsAlive()then +local _units=group:GetUnits() +local _names={} +for _,_unit in ipairs(_units)do +local _unit=_unit +if _unit and _unit:IsAlive()then +local _name=_unit:GetName() +table.insert(_names,_name) +end +end +self:AddStrafePit(_names,boxlength,boxwidth,heading,inverseheading,goodpass,foulline) +end +return self +end +function RANGE:AddBombingTargets(targetnames,goodhitrange,randommove) +self:F({targetnames=targetnames,goodhitrange=goodhitrange,randommove=randommove}) +if type(targetnames)~="table"then +targetnames={targetnames} +end +goodhitrange=goodhitrange or RANGE.Defaults.goodhitrange +for _,name in pairs(targetnames)do +local _isstatic=self:_CheckStatic(name) +if _isstatic==true then +local _static=STATIC:FindByName(name) +self:T2(self.lid..string.format("Adding static bombing target %s with hit range %d.",name,goodhitrange,false)) +self:AddBombingTargetUnit(_static,goodhitrange) +elseif _isstatic==false then +local _unit=UNIT:FindByName(name) +self:T2(self.lid..string.format("Adding unit bombing target %s with hit range %d.",name,goodhitrange,randommove)) +self:AddBombingTargetUnit(_unit,goodhitrange,randommove) +else +self:E(self.lid..string.format("ERROR! Could not find bombing target %s.",name)) +end +end +return self +end +function RANGE:AddBombingTargetUnit(unit,goodhitrange,randommove) +self:F({unit=unit,goodhitrange=goodhitrange,randommove=randommove}) +local name=unit:GetName() +local _isstatic=self:_CheckStatic(name) +goodhitrange=goodhitrange or RANGE.Defaults.goodhitrange +if randommove==nil or _isstatic==true then +randommove=false +end +if _isstatic==true then +self:T(self.lid..string.format("Adding STATIC bombing target %s with good hit range %d. Random move = %s.",name,goodhitrange,tostring(randommove))) +elseif _isstatic==false then +self:T(self.lid..string.format("Adding UNIT bombing target %s with good hit range %d. Random move = %s.",name,goodhitrange,tostring(randommove))) +else +self:E(self.lid..string.format("ERROR! No bombing target with name %s could be found. Carefully check all UNIT and STATIC names defined in the mission editor!",name)) +end +local speed=0 +if _isstatic==false then +speed=self:_GetSpeed(unit) +end +local target={} +target.name=name +target.target=unit +target.goodhitrange=goodhitrange +target.move=randommove +target.speed=speed +target.coordinate=unit:GetCoordinate() +if _isstatic then +target.type=RANGE.TargetType.STATIC +else +target.type=RANGE.TargetType.UNIT +end +table.insert(self.bombingTargets,target) +return self +end +function RANGE:AddBombingTargetCoordinate(coord,name,goodhitrange) +local target={} +target.name=name or"Bomb Target" +target.target=nil +target.goodhitrange=goodhitrange or RANGE.Defaults.goodhitrange +target.move=false +target.speed=0 +target.coordinate=coord +target.type=RANGE.TargetType.COORD +table.insert(self.bombingTargets,target) +return self +end +function RANGE:AddBombingTargetScenery(scenery,goodhitrange) +local name=scenery:GetName() +goodhitrange=goodhitrange or RANGE.Defaults.goodhitrange +if name then +self:T(self.lid..string.format("Adding SCENERY bombing target %s with good hit range %d",name,goodhitrange)) +else +self:E(self.lid..string.format("ERROR! No bombing target with name %s could be found!",name)) +end +local target={} +target.name=name +target.target=scenery +target.goodhitrange=goodhitrange +target.move=false +target.speed=0 +target.coordinate=scenery:GetCoordinate() +target.type=RANGE.TargetType.SCENERY +table.insert(self.bombingTargets,target) +return self +end +function RANGE:AddBombingTargetGroup(group,goodhitrange,randommove) +self:F({group=group,goodhitrange=goodhitrange,randommove=randommove}) +if group and type(group)=="string"then +group=GROUP:FindByName(group) +end +if group then +local _units=group:GetUnits() +for _,_unit in pairs(_units)do +if _unit and _unit:IsAlive()then +self:AddBombingTargetUnit(_unit,goodhitrange,randommove) +end +end +end +return self +end +function RANGE:GetFoullineDistance(namepit,namefoulline) +self:F({namepit=namepit,namefoulline=namefoulline}) +local _staticpit=self:_CheckStatic(namepit) +local _staticfoul=self:_CheckStatic(namefoulline) +local pit=nil +if _staticpit==true then +pit=STATIC:FindByName(namepit,false) +elseif _staticpit==false then +pit=UNIT:FindByName(namepit) +else +self:E(self.lid..string.format("ERROR! Pit object %s could not be found in GetFoullineDistance function. Check the name in the ME.",namepit)) +end +local foul=nil +if _staticfoul==true then +foul=STATIC:FindByName(namefoulline,false) +elseif _staticfoul==false then +foul=UNIT:FindByName(namefoulline) +else +self:E(self.lid..string.format("ERROR! Foul line object %s could not be found in GetFoullineDistance function. Check the name in the ME.",namefoulline)) +end +local fouldist=0 +if pit~=nil and foul~=nil then +fouldist=pit:GetCoordinate():Get2DDistance(foul:GetCoordinate()) +else +self:E(self.lid..string.format("ERROR! Foul line distance could not be determined. Check pit object name %s and foul line object name %s in the ME.",namepit,namefoulline)) +end +self:T(self.lid..string.format("Foul line distance = %.1f m.",fouldist)) +return fouldist +end +function RANGE:OnEventBirth(EventData) +self:F({eventbirth=EventData}) +if not EventData.IniPlayerName then return end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName,EventData.IniPlayerName) +self:T3(self.lid.."BIRTH: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."BIRTH: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."BIRTH: player = "..tostring(_playername)) +if _unit and _playername then +local _uid=_unit:GetID() +local _group=_unit:GetGroup() +local _gid=_group:GetID() +local _callsign=_unit:GetCallsign() +local text=string.format("Player %s, callsign %s entered unit %s (UID %d) of group %s (GID %d)",_playername,_callsign,_unitName,_uid,_group:GetName(),_gid) +self:T(self.lid..text) +self.strafeStatus[_uid]=nil +if self.Coalition then +if EventData.IniCoalition==self.Coalition then +self:ScheduleOnce(0.1,self._AddF10Commands,self,_unitName) +end +else +self:ScheduleOnce(0.1,self._AddF10Commands,self,_unitName) +end +self.PlayerSettings[_playername]={} +self.PlayerSettings[_playername].smokebombimpact=self.defaultsmokebomb +self.PlayerSettings[_playername].flaredirecthits=false +self.PlayerSettings[_playername].smokecolor=SMOKECOLOR.Blue +self.PlayerSettings[_playername].flarecolor=FLARECOLOR.Red +self.PlayerSettings[_playername].delaysmoke=true +self.PlayerSettings[_playername].messages=true +self.PlayerSettings[_playername].client=CLIENT:FindByName(_unitName,nil,true) +self.PlayerSettings[_playername].unitname=_unitName +self.PlayerSettings[_playername].unit=_unit +self.PlayerSettings[_playername].playername=_playername +self.PlayerSettings[_playername].airframe=EventData.IniUnit:GetTypeName() +self.PlayerSettings[_playername].inzone=false +if self.planes[_uid]~=true then +self.timerCheckZone=TIMER:New(self._CheckInZone,self,EventData.IniUnitName):Start(1,1) +self.planes[_uid]=true +end +end +end +function RANGE:OnEventHit(EventData) +self:F({eventhit=EventData}) +self:T3(self.lid.."HIT: Ini unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."HIT: Ini group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."HIT: Tgt target = "..tostring(EventData.TgtUnitName)) +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit==nil or _playername==nil then +return +end +local _unitID=_unit:GetID() +local target=EventData.TgtUnit +local targetname=EventData.TgtUnitName +local _currentTarget=self.strafeStatus[_unitID] +if _currentTarget and target and target:IsAlive()then +local playerPos=_unit:GetCoordinate() +local targetPos=target:GetCoordinate() +for _,_target in pairs(_currentTarget.zone.targets)do +if _target and _target:IsAlive()and _target:GetName()==targetname then +local dist=playerPos:Get2DDistance(targetPos) +if dist>_currentTarget.zone.foulline then +_currentTarget.hits=_currentTarget.hits+1 +if _unit and _playername and self.PlayerSettings[_playername].flaredirecthits then +targetPos:Flare(self.PlayerSettings[_playername].flarecolor) +end +else +if _currentTarget.pastfoulline==false and _unit and _playername then +local _d=_currentTarget.zone.foulline +local text=string.format("%s, Invalid hit!\nYou already passed foul line distance of %d m for target %s.",self:_myname(_unitName),_d,targetname) +if self.useSRS then +local ttstext=string.format("%s, Invalid hit! You already passed foul line distance of %d meters for target %s.",self:_myname(_unitName),_d,targetname) +self.controlsrsQ:NewTransmission(ttstext,nil,self.controlmsrs,nil,2) +end +self:_DisplayMessageToGroup(_unit,text) +self:T2(self.lid..text) +_currentTarget.pastfoulline=true +end +end +end +end +end +for _,_bombtarget in pairs(self.bombingTargets)do +local _target=_bombtarget.target +if _target and _target:IsAlive()and _bombtarget.name==targetname then +if _unit and _playername then +if self.PlayerSettings[_playername].flaredirecthits then +local targetPos=_target:GetCoordinate() +targetPos:Flare(self.PlayerSettings[_playername].flarecolor) +end +end +end +end +end +function RANGE._OnImpact(weapon,self,playerData,attackHdg,attackAlt,attackVel) +if not playerData then return end +local _closetTarget=nil +local _distance=nil +local _closeCoord=nil +local _hitquality="POOR" +local _callsign=self:_myname(playerData.unitname) +local _playername=playerData.playername +local _unit=playerData.unit +local impactcoord=weapon:GetImpactCoordinate() +local insidezone=self.rangezone:IsCoordinateInZone(impactcoord) +if playerData and playerData.smokebombimpact and insidezone then +if playerData.delaysmoke then +impactcoord:Smoke(playerData.smokecolor,30,self.TdelaySmoke) +else +impactcoord:Smoke(playerData.smokecolor,30) +end +end +for _,_bombtarget in pairs(self.bombingTargets)do +local bombtarget=_bombtarget +local targetcoord=self:_GetBombTargetCoordinate(_bombtarget) +if targetcoord then +local _temp=impactcoord:Get2DDistance(targetcoord) +if _distance==nil or _temp<_distance then +_distance=_temp +_closetTarget=bombtarget +_closeCoord=targetcoord +if _distance<=1.53 then +_hitquality="SHACK" +elseif _distance<=0.5*bombtarget.goodhitrange then +_hitquality="EXCELLENT" +elseif _distance<=bombtarget.goodhitrange then +_hitquality="GOOD" +elseif _distance<=2*bombtarget.goodhitrange then +_hitquality="INEFFECTIVE" +else +_hitquality="POOR" +end +end +end +end +if _distance and _distance<=self.scorebombdistance then +if not self.bombPlayerResults[_playername]then +self.bombPlayerResults[_playername]={} +end +local _results=self.bombPlayerResults[_playername] +local result={} +result.command=SOCKET.DataType.BOMBRESULT +result.name=_closetTarget.name or"unknown" +result.distance=_distance +result.radial=_closeCoord:HeadingTo(impactcoord) +result.weapon=weapon:GetTypeName()or"unknown" +result.quality=_hitquality +result.player=playerData.playername +result.time=timer.getAbsTime() +result.clock=UTILS.SecondsToClock(result.time,true) +result.midate=UTILS.GetDCSMissionDate() +result.theatre=env.mission.theatre +result.airframe=playerData.airframe +result.roundsFired=0 +result.roundsHit=0 +result.roundsQuality="N/A" +result.rangename=self.rangename +result.attackHdg=attackHdg +result.attackVel=attackVel +result.attackAlt=attackAlt +if os and os.date then +result.date=os.date() +else +self:E(self.lid.."os or os.date() not available") +result.date="n/a" +end +table.insert(_results,result) +self:Impact(result,playerData) +elseif insidezone then +local _message=string.format("%s, weapon impacted too far from nearest range target (>%.1f km). No score!",_callsign,self.scorebombdistance/1000) +if self.useSRS then +local ttstext=string.format("%s, weapon impacted too far from nearest range target, mor than %.1f kilometer. No score!",_callsign,self.scorebombdistance/1000) +self.controlsrsQ:NewTransmission(ttstext,nil,self.controlmsrs,nil,2) +end +self:_DisplayMessageToGroup(_unit,_message,nil,false) +if self.rangecontrol then +if self.useSRS then +self.controlsrsQ:NewTransmission(_message,nil,self.controlmsrs,nil,1) +else +self.rangecontrol:NewTransmission(self.Sound.RCWeaponImpactedTooFar.filename,self.Sound.RCWeaponImpactedTooFar.duration,self.soundpath,nil,nil,_message,self.subduration) +end +end +else +self:T(self.lid.."Weapon impacted outside range zone.") +end +end +function RANGE:OnEventShot(EventData) +self:F({eventshot=EventData}) +if EventData.Weapon==nil or EventData.IniDCSUnit==nil or EventData.IniPlayerName==nil then +return +end +local weapon=WEAPON:New(EventData.weapon) +local _track=(weapon:IsBomb()and self.trackbombs)or(weapon:IsRocket()and self.trackrockets)or(weapon:IsMissile()and self.trackmissiles) +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName,EventData.IniPlayerName) +local dPR=self.BombtrackThreshold*2 +if _unit and _playername then +dPR=_unit:GetCoordinate():Get2DDistance(self.location) +self:T(self.lid..string.format("Range %s, player %s, player-range distance = %d km.",self.rangename,_playername,dPR/1000)) +end +if _track and dPR<=self.BombtrackThreshold and _unit and _playername and self.PlayerSettings[_playername]then +local playerData=self.PlayerSettings[_playername] +if not playerData then return end +local attackHdg=_unit:GetHeading() +local attackAlt=_unit:GetHeight() +attackAlt=UTILS.MetersToFeet(attackAlt) +local attackVel=_unit:GetVelocityKNOTS() +self:T(self.lid..string.format("RANGE %s: Tracking %s - %s.",self.rangename,weapon:GetTypeName(),weapon:GetName())) +weapon:SetFuncImpact(RANGE._OnImpact,self,playerData,attackHdg,attackAlt,attackVel) +self:T(self.lid..string.format("Range %s, player %s: Tracking of weapon starts in 0.1 seconds.",self.rangename,_playername)) +weapon:StartTrack(0.1) +end +end +function RANGE:onafterStatus(From,Event,To) +if self.verbose>0 then +local fsmstate=self:GetState() +local text=string.format("Range status: %s",fsmstate) +if self.instructor then +local alive="N/A" +if self.instructorrelayname then +local relay=UNIT:FindByName(self.instructorrelayname) +if relay then +alive=tostring(relay:IsAlive()) +end +end +text=text..string.format(", Instructor %.3f MHz (Relay=%s alive=%s)",self.instructorfreq,tostring(self.instructorrelayname),alive) +end +if self.rangecontrol then +local alive="N/A" +if self.rangecontrolrelayname then +local relay=UNIT:FindByName(self.rangecontrolrelayname) +if relay then +alive=tostring(relay:IsAlive()) +end +end +text=text..string.format(", Control %.3f MHz (Relay=%s alive=%s)",self.rangecontrolfreq,tostring(self.rangecontrolrelayname),alive) +end +self:T(self.lid..text) +end +self:_CheckPlayers() +self:__Status(-10) +end +function RANGE:onafterEnterRange(From,Event,To,player) +if self.instructor and self.rangecontrol then +if self.useSRS then +local text=string.format("You entered the bombing range. For hit assessment, contact the range controller at %.3f MHz",self.rangecontrolfreq) +local ttstext=string.format("You entered the bombing range. For hit assessment, contact the range controller at %.3f mega hertz.",self.rangecontrolfreq) +local group=player.client:GetGroup() +self.instructsrsQ:NewTransmission(ttstext,nil,self.instructmsrs,nil,1,{group},text,10) +else +local RF=UTILS.Split(string.format("%.3f",self.rangecontrolfreq),".") +self.instructor:NewTransmission(self.Sound.IREnterRange.filename,self.Sound.IREnterRange.duration,self.soundpath) +self.instructor:Number2Transmission(RF[1]) +if tonumber(RF[2])>0 then +self.instructor:NewTransmission(self.Sound.IRDecimal.filename,self.Sound.IRDecimal.duration,self.soundpath) +self.instructor:Number2Transmission(RF[2]) +end +self.instructor:NewTransmission(self.Sound.IRMegaHertz.filename,self.Sound.IRMegaHertz.duration,self.soundpath) +end +end +end +function RANGE:onafterExitRange(From,Event,To,player) +if self.instructor then +if self.useSRS then +local text="You left the bombing range zone. " +local r=math.random(5) +if r==1 then +text=text.."Have a nice day!" +elseif r==2 then +text=text.."Take care and bye bye!" +elseif r==3 then +text=text.."Talk to you soon!" +elseif r==4 then +text=text.."See you in two weeks!" +elseif r==5 then +text=text.."!" +end +self.instructsrsQ:NewTransmission(text,nil,self.instructmsrs,nil,1,{player.client:GetGroup()},text,10) +else +self.instructor:NewTransmission(self.Sound.IRExitRange.filename,self.Sound.IRExitRange.duration,self.soundpath) +end +end +end +function RANGE:onafterImpact(From,Event,To,result,player) +local targetname=nil +if#self.bombingTargets>1 then +targetname=result.name +end +local text=string.format("%s, impact %03d° for %d ft (%d m)",player.playername,result.radial,UTILS.MetersToFeet(result.distance),result.distance) +if targetname then +text=text..string.format(" from bulls of target %s.",targetname) +else +text=text.."." +end +text=text..string.format(" %s hit.",result.quality) +if self.rangecontrol then +if self.useSRS then +local group=player.client:GetGroup() +self.controlsrsQ:NewTransmission(text,nil,self.controlmsrs,nil,1,{group},text,10) +else +self.rangecontrol:NewTransmission(self.Sound.RCImpact.filename,self.Sound.RCImpact.duration,self.soundpath,nil,nil,text,self.subduration) +self.rangecontrol:Number2Transmission(string.format("%03d",result.radial),nil,0.1) +self.rangecontrol:NewTransmission(self.Sound.RCDegrees.filename,self.Sound.RCDegrees.duration,self.soundpath) +self.rangecontrol:NewTransmission(self.Sound.RCFor.filename,self.Sound.RCFor.duration,self.soundpath) +self.rangecontrol:Number2Transmission(string.format("%d",UTILS.MetersToFeet(result.distance))) +self.rangecontrol:NewTransmission(self.Sound.RCFeet.filename,self.Sound.RCFeet.duration,self.soundpath) +if result.quality=="POOR"then +self.rangecontrol:NewTransmission(self.Sound.RCPoorHit.filename,self.Sound.RCPoorHit.duration,self.soundpath,nil,0.5) +elseif result.quality=="INEFFECTIVE"then +self.rangecontrol:NewTransmission(self.Sound.RCIneffectiveHit.filename,self.Sound.RCIneffectiveHit.duration,self.soundpath,nil,0.5) +elseif result.quality=="GOOD"then +self.rangecontrol:NewTransmission(self.Sound.RCGoodHit.filename,self.Sound.RCGoodHit.duration,self.soundpath,nil,0.5) +elseif result.quality=="EXCELLENT"then +self.rangecontrol:NewTransmission(self.Sound.RCExcellentHit.filename,self.Sound.RCExcellentHit.duration,self.soundpath,nil,0.5) +end +end +end +if player.unitname and not self.useSRS then +local unit=UNIT:FindByName(player.unitname) +self:_DisplayMessageToGroup(unit,text,nil,true) +self:T(self.lid..text) +end +if self.autosave then +self:Save() +end +if self.funkmanSocket then +self.funkmanSocket:SendTable(result) +end +end +function RANGE:onafterStrafeResult(From,Event,To,player,result) +if self.funkmanSocket then +self.funkmanSocket:SendTable(result) +end +end +function RANGE:onbeforeSave(From,Event,To) +if io and lfs then +return true +else +self:E(self.lid..string.format("WARNING: io and/or lfs not desanitized. Cannot save player results.")) +return false +end +end +function RANGE:onafterSave(From,Event,To) +local function _savefile(filename,data) +local f=io.open(filename,"wb") +if f then +f:write(data) +f:close() +self:T(self.lid..string.format("Saving player results to file %s",tostring(filename))) +else +self:E(self.lid..string.format("ERROR: Could not save results to file %s",tostring(filename))) +end +end +local path=self.targetpath or lfs.writedir()..[[Logs\]] +local filename=path..string.format("RANGE-%s_BombingResults.csv",self.rangename) +local scores="Name,Pass,Target,Distance,Radial,Quality,Weapon,Airframe,Mission Time" +for playername,results in pairs(self.bombPlayerResults)do +for i,_result in pairs(results)do +local result=_result +local distance=result.distance +local weapon=result.weapon +local target=result.name +local radial=result.radial +local quality=result.quality +local time=UTILS.SecondsToClock(result.time,true) +local airframe=result.airframe +local date=result.date or"n/a" +scores=scores..string.format("\n%s,%d,%s,%.2f,%03d,%s,%s,%s,%s,%s",playername,i,target,distance,radial,quality,weapon,airframe,time,date) +end +end +_savefile(filename,scores) +end +function RANGE:onbeforeLoad(From,Event,To) +if io and lfs then +return true +else +self:E(self.lid..string.format("WARNING: io and/or lfs not desanitized. Cannot load player results.")) +return false +end +end +function RANGE:onafterLoad(From,Event,To) +local function _loadfile(filename) +local f=io.open(filename,"rb") +if f then +local data=f:read("*all") +f:close() +return data +else +self:E(self.lid..string.format("WARNING: Could not load player results from file %s. File might not exist just yet.",tostring(filename))) +return nil +end +end +local path=self.targetpath or lfs.writedir()..[[Logs\]] +local filename=path..string.format("RANGE-%s_BombingResults.csv",self.rangename) +local text=string.format("Loading player bomb results from file %s",filename) +self:T(self.lid..text) +local data=_loadfile(filename) +if data then +local results=UTILS.Split(data,"\n") +table.remove(results,1) +self.bombPlayerResults={} +for _,_result in pairs(results)do +local resultdata=UTILS.Split(_result,",") +local result={} +local playername=resultdata[1] +result.player=playername +result.name=tostring(resultdata[3]) +result.distance=tonumber(resultdata[4]) +result.radial=tonumber(resultdata[5]) +result.quality=tostring(resultdata[6]) +result.weapon=tostring(resultdata[7]) +result.airframe=tostring(resultdata[8]) +result.time=UTILS.ClockToSeconds(resultdata[9]or"00:00:00") +result.date=resultdata[10]or"n/a" +self.bombPlayerResults[playername]=self.bombPlayerResults[playername]or{} +table.insert(self.bombPlayerResults[playername],result) +end +end +end +function RANGE:_SaveTargetSheet(_playername,result) +local function _savefile(filename,data) +local f=io.open(filename,"wb") +if f then +f:write(data) +f:close() +else +env.info("RANGEBOSS EDIT - could not save target sheet to file") +end +end +local path=self.targetpath +if lfs then +path=path or lfs.writedir()..[[Logs\]] +end +local filename=nil +for i=1,9999 do +if self.targetprefix then +filename=string.format("%s_%s-%04d.csv",self.targetprefix,result.airframe,i) +else +local name=UTILS.ReplaceIllegalCharacters(_playername,"_") +filename=string.format("RANGERESULTS-%s_Targetsheet-%s-%04d.csv",self.rangename,name,i) +end +if path~=nil then +filename=path.."\\"..filename +end +local _exists=UTILS.FileExists(filename) +if not _exists then +break +end +end +local data="Name,Target,Rounds Fired,Rounds Hit,Rounds Quality,Airframe,Mission Time,OS Time\n" +local target=result.name +local airframe=result.airframe +local roundsFired=result.roundsFired +local roundsHit=result.roundsHit +local strafeResult=result.roundsQuality +local time=UTILS.SecondsToClock(result.time) +local date="n/a" +if os then +date=os.date() +end +data=data..string.format("%s,%s,%d,%d,%s,%s,%s,%s",_playername,target,roundsFired,roundsHit,strafeResult,airframe,time,date) +_savefile(filename,data) +end +function RANGE:_DisplayMyStrafePitResults(_unitName) +self:F(_unitName) +local _unit,_playername,_multiplayer=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local _message=string.format("My Top %d Strafe Pit Results:\n",self.ndisplayresult) +local _results=self.strafePlayerResults[_playername] +if _results==nil then +_message=string.format("%s: No Score yet.",_playername) +else +local _sort=function(a,b) +return a.roundsHit>b.roundsHit +end +table.sort(_results,_sort) +local _bestMsg="" +local _count=1 +for _,_result in pairs(_results)do +local result=_result +_message=_message..string.format("\n[%d] Hits %d - %s - %s",_count,result.roundsHit,result.name,result.roundsQuality) +if _bestMsg==""then +_bestMsg=string.format("Hits %d - %s - %s",result.roundsHit,result.name,result.roundsQuality) +end +if _count==self.ndisplayresult then +break +end +_count=_count+1 +end +_message=_message.."\n\nBEST: ".._bestMsg +end +self:_DisplayMessageToGroup(_unit,_message,nil,true,true,_multiplayer) +end +end +function RANGE:_DisplayStrafePitResults(_unitName) +self:F(_unitName) +local _unit,_playername,_multiplayer=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local _playerResults={} +local _message=string.format("Strafe Pit Results - Top %d Players:\n",self.ndisplayresult) +for _playerName,_results in pairs(self.strafePlayerResults)do +local _best=nil +for _,_result in pairs(_results)do +if _best==nil or _result.roundsHit>_best.roundsHit then +_best=_result +end +end +if _best~=nil then +local text=string.format("%s: Hits %i - %s - %s",_playerName,_best.roundsHit,_best.name,_best.roundsQuality) +table.insert(_playerResults,{msg=text,hits=_best.roundsHit}) +end +end +local _sort=function(a,b) +return a.hits>b.hits +end +table.sort(_playerResults,_sort) +for _i=1,math.min(#_playerResults,self.ndisplayresult)do +_message=_message..string.format("\n[%d] %s",_i,_playerResults[_i].msg) +end +if#_playerResults<1 then +_message=_message.."No player scored yet." +end +self:_DisplayMessageToGroup(_unit,_message,nil,true,true,_multiplayer) +end +end +function RANGE:_DisplayMyBombingResults(_unitName) +self:F(_unitName) +local _unit,_playername,_multiplayer=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local _message=string.format("My Top %d Bombing Results:\n",self.ndisplayresult) +local _results=self.bombPlayerResults[_playername] +if _results==nil then +_message=_playername..": No Score yet." +else +local _sort=function(a,b) +return a.distance<b.distance +end +table.sort(_results,_sort) +local _bestMsg="" +for i,_result in pairs(_results)do +local result=_result +_message=_message.."\n"..string.format("[%d] %d m %03d° - %s - %s - %s hit",i,result.distance,result.radial,result.name,result.weapon,result.quality) +if _bestMsg==""then +_bestMsg=string.format("%d m %03d° - %s - %s - %s hit",result.distance,result.radial,result.name,result.weapon,result.quality) +end +if i==self.ndisplayresult then +break +end +end +_message=_message.."\n\nBEST: ".._bestMsg +end +self:_DisplayMessageToGroup(_unit,_message,nil,true,true,_multiplayer) +end +end +function RANGE:_DisplayBombingResults(_unitName) +self:F(_unitName) +local _playerResults={} +local _unit,_player,_multiplayer=self:_GetPlayerUnitAndName(_unitName) +if _unit and _player then +local _message=string.format("Bombing Results - Top %d Players:\n",self.ndisplayresult) +for _playerName,_results in pairs(self.bombPlayerResults)do +local _best=nil +for _,_result in pairs(_results)do +if _best==nil or _result.distance<_best.distance then +_best=_result +end +end +if _best~=nil then +local bestres=string.format("%s: %d m - %s - %s - %s hit",_playerName,_best.distance,_best.name,_best.weapon,_best.quality) +table.insert(_playerResults,{msg=bestres,distance=_best.distance}) +end +end +local _sort=function(a,b) +return a.distance<b.distance +end +table.sort(_playerResults,_sort) +for _i=1,math.min(#_playerResults,self.ndisplayresult)do +_message=_message..string.format("\n[%d] %s",_i,_playerResults[_i].msg) +end +if#_playerResults<1 then +_message=_message.."No player scored yet." +end +self:_DisplayMessageToGroup(_unit,_message,nil,true,true,_multiplayer) +end +end +function RANGE:_DisplayRangeInfo(_unitname) +self:F(_unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local text="" +local coord=unit:GetCoordinate() +if self.location then +local settings=_DATABASE:GetPlayerSettings(playername)or _SETTINGS +local position=self.location +local bulls=position:ToStringBULLS(unit:GetCoalition(),settings) +local lldms=position:ToStringLLDMS(settings) +local llddm=position:ToStringLLDDM(settings) +local rangealt=position:GetLandHeight() +local vec3=coord:GetDirectionVec3(position) +local angle=coord:GetAngleDegrees(vec3) +local range=coord:Get2DDistance(position) +local Bs=string.format('%03d°',angle) +local texthit +if self.PlayerSettings[playername].flaredirecthits then +texthit=string.format("Flare direct hits: ON (flare color %s)\n",self:_flarecolor2text(self.PlayerSettings[playername].flarecolor)) +else +texthit=string.format("Flare direct hits: OFF\n") +end +local textbomb +if self.PlayerSettings[playername].smokebombimpact then +textbomb=string.format("Smoke bomb impact points: ON (smoke color %s)\n",self:_smokecolor2text(self.PlayerSettings[playername].smokecolor)) +else +textbomb=string.format("Smoke bomb impact points: OFF\n") +end +local textdelay +if self.PlayerSettings[playername].delaysmoke then +textdelay=string.format("Smoke bomb delay: ON (delay %.1f seconds)",self.TdelaySmoke) +else +textdelay=string.format("Smoke bomb delay: OFF") +end +local trange=string.format("%.1f km",range/1000) +local trangealt=string.format("%d m",rangealt) +local tstrafemaxalt=string.format("%d m",self.strafemaxalt) +if settings:IsImperial()then +trange=string.format("%.1f NM",UTILS.MetersToNM(range)) +trangealt=string.format("%d feet",UTILS.MetersToFeet(rangealt)) +tstrafemaxalt=string.format("%d feet",UTILS.MetersToFeet(self.strafemaxalt)) +end +text=text..string.format("Information on %s:\n",self.rangename) +text=text..string.format("-------------------------------------------------------\n") +text=text..string.format("Bearing %s, Range %s\n",Bs,trange) +text=text..string.format("%s\n",bulls) +text=text..string.format("%s\n",lldms) +text=text..string.format("%s\n",llddm) +text=text..string.format("Altitude ASL: %s\n",trangealt) +text=text..string.format("Max strafing alt AGL: %s\n",tstrafemaxalt) +text=text..string.format("# of strafe targets: %d\n",self.nstrafetargets) +text=text..string.format("# of bomb targets: %d\n",self.nbombtargets) +if self.instructor then +local alive="N/A" +if self.instructorrelayname then +local relay=UNIT:FindByName(self.instructorrelayname) +if relay then +alive=relay:IsAlive()and"ok"or"N/A" +end +end +text=text..string.format("Instructor %.3f MHz (Relay=%s)\n",self.instructorfreq,alive) +end +if self.rangecontrol then +local alive="N/A" +if self.rangecontrolrelayname then +local relay=UNIT:FindByName(self.rangecontrolrelayname) +if relay then +alive=tostring(relay:IsAlive()) +alive=relay:IsAlive()and"ok"or"N/A" +end +end +text=text..string.format("Control %.3f MHz (Relay=%s)\n",self.rangecontrolfreq,alive) +end +text=text..texthit +text=text..textbomb +text=text..textdelay +self:_DisplayMessageToGroup(unit,text,nil,true,true,_multiplayer) +self:T2(self.lid..text) +end +end +end +function RANGE:_DisplayBombTargets(_unitname) +self:F(_unitname) +local _unit,_playername,_multiplayer=self:_GetPlayerUnitAndName(_unitname) +if _unit and _playername then +local _settings=_DATABASE:GetPlayerSettings(_playername)or _SETTINGS +local _text="Bomb Target Locations:" +for _,_bombtarget in pairs(self.bombingTargets)do +local bombtarget=_bombtarget +local coord=self:_GetBombTargetCoordinate(bombtarget) +if coord then +local elevation=coord:GetLandHeight() +local eltxt=string.format("%d m",elevation) +if not _settings:IsMetric()then +elevation=UTILS.MetersToFeet(elevation) +eltxt=string.format("%d ft",elevation) +end +local ca2g=coord:ToStringA2G(_unit,_settings) +_text=_text..string.format("\n- %s:\n%s @ %s",bombtarget.name or"unknown",ca2g,eltxt) +end +end +self:_DisplayMessageToGroup(_unit,_text,150,true,true,_multiplayer) +end +end +function RANGE:_DisplayStrafePits(_unitname) +self:F(_unitname) +local _unit,_playername,_multiplayer=self:_GetPlayerUnitAndName(_unitname) +if _unit and _playername then +local _settings=_DATABASE:GetPlayerSettings(_playername)or _SETTINGS +local _text="Strafe Target Locations:" +for _,_strafepit in pairs(self.strafeTargets)do +local _target=_strafepit +local coord=_strafepit.coordinate +local heading=_strafepit.heading +if heading>180 then +heading=heading-180 +else +heading=heading+180 +end +local mycoord=coord:ToStringA2G(_unit,_settings) +_text=_text..string.format("\n- %s: heading %03d°\n%s",_strafepit.name,heading,mycoord) +end +self:_DisplayMessageToGroup(_unit,_text,nil,true,true,_multiplayer) +end +end +function RANGE:_DisplayRangeWeather(_unitname) +self:F(_unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local text="" +local coord=unit:GetCoordinate() +if self.location then +local position=self.location +local T=position:GetTemperature() +local P=position:GetPressure() +local Wd,Ws=position:GetWind() +local Bn,Bd=UTILS.BeaufortScale(Ws) +local WD=string.format('%03d°',Wd) +local Ts=string.format("%d°C",T) +local hPa2inHg=0.0295299830714 +local hPa2mmHg=0.7500615613030 +local settings=_DATABASE:GetPlayerSettings(playername)or _SETTINGS +local tT=string.format("%d°C",T) +local tW=string.format("%.1f m/s",Ws) +local tP=string.format("%.1f mmHg",P*hPa2mmHg) +if settings:IsImperial()then +tW=string.format("%.1f knots",UTILS.MpsToKnots(Ws)) +tP=string.format("%.2f inHg",P*hPa2inHg) +end +text=text..string.format("Weather Report at %s:\n",self.rangename) +text=text..string.format("--------------------------------------------------\n") +text=text..string.format("Temperature %s\n",tT) +text=text..string.format("Wind from %s at %s (%s)\n",WD,tW,Bd) +text=text..string.format("QFE %.1f hPa = %s",P,tP) +else +text=string.format("No range location defined for range %s.",self.rangename) +end +self:_DisplayMessageToGroup(unit,text,nil,true,true,_multiplayer) +self:T2(self.lid..text) +else +self:T(self.lid..string.format("ERROR! Could not find player unit in RangeInfo! Name = %s",_unitname)) +end +end +function RANGE:_CheckPlayers() +for playername,_playersettings in pairs(self.PlayerSettings)do +local playersettings=_playersettings +local unitname=playersettings.unitname +local unit=UNIT:FindByName(unitname) +if unit and unit:IsAlive()then +local unitalt=unit:GetAltitude(false) +local unitaltinfeet=UTILS.MetersToFeet(unitalt) +if unit:IsInZone(self.rangezone)and(not self.ceilingenabled or unitaltinfeet<self.ceilingaltitude)then +if not playersettings.inzone then +playersettings.inzone=true +self:EnterRange(playersettings) +end +else +if playersettings.inzone==true then +playersettings.inzone=false +self:ExitRange(playersettings) +end +end +end +end +end +function RANGE:_CheckInZone(_unitName) +self:F2(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +local unitheading=0 +if _unit and _playername then +local playerData=self.PlayerSettings[_playername] +local function checkme(targetheading,_zone) +local zone=_zone +local unitheading=_unit:GetHeading() +local pitheading=targetheading-180 +local deltaheading=unitheading-pitheading +local towardspit=math.abs(deltaheading)<=90 or math.abs(deltaheading-360)<=90 +if towardspit then +local vec3=_unit:GetVec3() +local vec2={x=vec3.x,y=vec3.z} +local landheight=land.getHeight(vec2) +local unitalt=vec3.y-landheight +if unitalt<=self.strafemaxalt then +local unitinzone=zone:IsVec2InZone(vec2) +return unitinzone +end +end +return false +end +local _unitID=_unit:GetID() +local _currentStrafeRun=self.strafeStatus[_unitID] +if _currentStrafeRun then +local zone=_currentStrafeRun.zone.polygon +local unitinzone=checkme(_currentStrafeRun.zone.heading,zone) +if unitinzone then +_currentStrafeRun.time=_currentStrafeRun.time+1 +else +_currentStrafeRun.time=_currentStrafeRun.time+1 +if _currentStrafeRun.time<=3 then +self.strafeStatus[_unitID]=nil +local _msg=string.format("%s left strafing zone %s too quickly. No Score.",_playername,_currentStrafeRun.zone.name) +self:_DisplayMessageToGroup(_unit,_msg,nil,true) +if self.rangecontrol then +if self.useSRS then +local group=_unit:GetGroup() +local text="You left the strafing zone too quickly! No score!" +self.controlsrsQ:NewTransmission(text,nil,self.controlmsrs,nil,1) +else +self.rangecontrol:NewTransmission(self.Sound.RCLeftStrafePitTooQuickly.filename,self.Sound.RCLeftStrafePitTooQuickly.duration,self.soundpath) +end +end +else +local _ammo=self:_GetAmmo(_unitName) +local _result=self.strafeStatus[_unitID] +local _sound=nil +local shots=_result.ammo-_ammo +local accur=0 +if shots>0 then +accur=_result.hits/shots*100 +if accur>100 then +accur=100 +end +end +local resulttext="" +if _result.pastfoulline==true then +resulttext="* INVALID - PASSED FOUL LINE *" +_sound=self.Sound.RCPoorPass +else +if accur>=90 then +resulttext="DEADEYE PASS" +_sound=self.Sound.RCExcellentPass +elseif accur>=75 then +resulttext="EXCELLENT PASS" +_sound=self.Sound.RCExcellentPass +elseif accur>=50 then +resulttext="GOOD PASS" +_sound=self.Sound.RCGoodPass +elseif accur>=25 then +resulttext="INEFFECTIVE PASS" +_sound=self.Sound.RCIneffectivePass +else +resulttext="POOR PASS" +_sound=self.Sound.RCPoorPass +end +end +local _text=string.format("%s, hits on target %s: %d",self:_myname(_unitName),_result.zone.name,_result.hits) +local ttstext=string.format("%s, hits on target %s: %d.",self:_myname(_unitName),_result.zone.name,_result.hits) +if shots and accur then +_text=_text..string.format("\nTotal rounds fired %d. Accuracy %.1f %%.",shots,accur) +ttstext=ttstext..string.format(". Total rounds fired %d. Accuracy %.1f percent.",shots,accur) +end +_text=_text..string.format("\n%s",resulttext) +ttstext=ttstext..string.format(" %s",resulttext) +self:_DisplayMessageToGroup(_unit,_text) +local result={} +result.command=SOCKET.DataType.STRAFERESULT +result.player=_playername +result.name=_result.zone.name or"unknown" +result.time=timer.getAbsTime() +result.clock=UTILS.SecondsToClock(result.time) +result.midate=UTILS.GetDCSMissionDate() +result.theatre=env.mission.theatre +result.roundsFired=shots +result.roundsHit=_result.hits +result.roundsQuality=resulttext +result.strafeAccuracy=accur +result.rangename=self.rangename +result.airframe=playerData.airframe +result.invalid=_result.pastfoulline +self:StrafeResult(playerData,result) +if playerData and playerData.targeton and self.targetsheet then +self:_SaveTargetSheet(_playername,result) +end +if self.rangecontrol then +if self.useSRS then +self.controlsrsQ:NewTransmission(ttstext,nil,self.controlmsrs,nil,1) +else +self.rangecontrol:NewTransmission(self.Sound.RCHitsOnTarget.filename,self.Sound.RCHitsOnTarget.duration,self.soundpath) +self.rangecontrol:Number2Transmission(string.format("%d",_result.hits)) +if shots and accur then +self.rangecontrol:NewTransmission(self.Sound.RCTotalRoundsFired.filename,self.Sound.RCTotalRoundsFired.duration,self.soundpath,nil,0.2) +self.rangecontrol:Number2Transmission(string.format("%d",shots),nil,0.2) +self.rangecontrol:NewTransmission(self.Sound.RCAccuracy.filename,self.Sound.RCAccuracy.duration,self.soundpath,nil,0.2) +self.rangecontrol:Number2Transmission(string.format("%d",UTILS.Round(accur,0))) +self.rangecontrol:NewTransmission(self.Sound.RCPercent.filename,self.Sound.RCPercent.duration,self.soundpath) +end +self.rangecontrol:NewTransmission(_sound.filename,_sound.duration,self.soundpath,nil,0.5) +end +end +self.strafeStatus[_unitID]=nil +local _stats=self.strafePlayerResults[_playername]or{} +table.insert(_stats,result) +self.strafePlayerResults[_playername]=_stats +end +end +else +for _,_targetZone in pairs(self.strafeTargets)do +local target=_targetZone +local zone=target.polygon +local unitinzone=checkme(target.heading,zone) +if unitinzone then +local _ammo=self:_GetAmmo(_unitName) +self.strafeStatus[_unitID]={hits=0,zone=target,time=1,ammo=_ammo,pastfoulline=false} +local _msg=string.format("%s, rolling in on strafe pit %s.",self:_myname(_unitName),target.name) +if self.rangecontrol then +if self.useSRS then +self.controlsrsQ:NewTransmission(_msg,nil,self.controlmsrs,nil,1) +else +self.rangecontrol:NewTransmission(self.Sound.RCRollingInOnStrafeTarget.filename,self.Sound.RCRollingInOnStrafeTarget.duration,self.soundpath) +end +end +self:_DisplayMessageToGroup(_unit,_msg,10,true) +self:RollingIn(playerData,target) +break +end +end +end +end +end +function RANGE:_AddF10Commands(_unitName) +self:F(_unitName) +local _unit,playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and playername then +local group=_unit:GetGroup() +local _gid=group:GetID() +if group and _gid then +if not self.MenuAddedTo[_gid]then +self.MenuAddedTo[_gid]=true +local _rootMenu=nil +if self.menuF10root then +_rootMenu=self.menuF10root +self:T2(self.lid..string.format("Creating F10 menu for group %s",group:GetName())) +elseif RANGE.MenuF10Root then +_rootMenu=RANGE.MenuF10Root +else +if RANGE.MenuF10[_gid]==nil then +self:T2(self.lid..string.format("Creating F10 menu 'On the Range' for group %s",group:GetName())) +else +self:T2(self.lid..string.format("F10 menu 'On the Range' already EXISTS for group %s",group:GetName())) +end +_rootMenu=RANGE.MenuF10[_gid]or MENU_GROUP:New(group,"On the Range") +end +local _rangePath=MENU_GROUP:New(group,self.rangename,_rootMenu) +local _infoPath=MENU_GROUP:New(group,"Range Info",_rangePath) +local _markPath=MENU_GROUP:New(group,"Mark Targets",_rangePath) +local _statsPath=MENU_GROUP:New(group,"Statistics",_rangePath) +local _settingsPath=MENU_GROUP:New(group,"My Settings",_rangePath) +local _mysmokePath=MENU_GROUP:New(group,"Smoke Color",_settingsPath) +local _myflarePath=MENU_GROUP:New(group,"Flare Color",_settingsPath) +local _MoMap=MENU_GROUP_COMMAND:New(group,"Mark On Map",_markPath,self._MarkTargetsOnMap,self,_unitName) +local _IllRng=MENU_GROUP_COMMAND:New(group,"Illuminate Range",_markPath,self._IlluminateBombTargets,self,_unitName) +local _SSpit=MENU_GROUP_COMMAND:New(group,"Smoke Strafe Pits",_markPath,self._SmokeStrafeTargetBoxes,self,_unitName) +local _SStgts=MENU_GROUP_COMMAND:New(group,"Smoke Strafe Tgts",_markPath,self._SmokeStrafeTargets,self,_unitName) +local _SBtgts=MENU_GROUP_COMMAND:New(group,"Smoke Bomb Tgts",_markPath,self._SmokeBombTargets,self,_unitName) +local _AllSR=MENU_GROUP_COMMAND:New(group,"All Strafe Results",_statsPath,self._DisplayStrafePitResults,self,_unitName) +local _AllBR=MENU_GROUP_COMMAND:New(group,"All Bombing Results",_statsPath,self._DisplayBombingResults,self,_unitName) +local _MySR=MENU_GROUP_COMMAND:New(group,"My Strafe Results",_statsPath,self._DisplayMyStrafePitResults,self,_unitName) +local _MyBR=MENU_GROUP_COMMAND:New(group,"My Bomb Results",_statsPath,self._DisplayMyBombingResults,self,_unitName) +local _ResetST=MENU_GROUP_COMMAND:New(group,"Reset All Stats",_statsPath,self._ResetRangeStats,self,_unitName) +local _BlueSM=MENU_GROUP_COMMAND:New(group,"Blue Smoke",_mysmokePath,self._playersmokecolor,self,_unitName,SMOKECOLOR.Blue) +local _GrSM=MENU_GROUP_COMMAND:New(group,"Green Smoke",_mysmokePath,self._playersmokecolor,self,_unitName,SMOKECOLOR.Green) +local _OrSM=MENU_GROUP_COMMAND:New(group,"Orange Smoke",_mysmokePath,self._playersmokecolor,self,_unitName,SMOKECOLOR.Orange) +local _ReSM=MENU_GROUP_COMMAND:New(group,"Red Smoke",_mysmokePath,self._playersmokecolor,self,_unitName,SMOKECOLOR.Red) +local _WhSm=MENU_GROUP_COMMAND:New(group,"White Smoke",_mysmokePath,self._playersmokecolor,self,_unitName,SMOKECOLOR.White) +local _GrFl=MENU_GROUP_COMMAND:New(group,"Green Flares",_myflarePath,self._playerflarecolor,self,_unitName,FLARECOLOR.Green) +local _ReFl=MENU_GROUP_COMMAND:New(group,"Red Flares",_myflarePath,self._playerflarecolor,self,_unitName,FLARECOLOR.Red) +local _WhFl=MENU_GROUP_COMMAND:New(group,"White Flares",_myflarePath,self._playerflarecolor,self,_unitName,FLARECOLOR.White) +local _YeFl=MENU_GROUP_COMMAND:New(group,"Yellow Flares",_myflarePath,self._playerflarecolor,self,_unitName,FLARECOLOR.Yellow) +local _SmDe=MENU_GROUP_COMMAND:New(group,"Smoke Delay On/Off",_settingsPath,self._SmokeBombDelayOnOff,self,_unitName) +local _SmIm=MENU_GROUP_COMMAND:New(group,"Smoke Impact On/Off",_settingsPath,self._SmokeBombImpactOnOff,self,_unitName) +local _FlHi=MENU_GROUP_COMMAND:New(group,"Flare Hits On/Off",_settingsPath,self._FlareDirectHitsOnOff,self,_unitName) +local _AlMeA=MENU_GROUP_COMMAND:New(group,"All Messages On/Off",_settingsPath,self._MessagesToPlayerOnOff,self,_unitName) +local _TrpSh=MENU_GROUP_COMMAND:New(group,"Targetsheet On/Off",_settingsPath,self._TargetsheetOnOff,self,_unitName) +local _WeIn=MENU_GROUP_COMMAND:New(group,"General Info",_infoPath,self._DisplayRangeInfo,self,_unitName) +local _WeRe=MENU_GROUP_COMMAND:New(group,"Weather Report",_infoPath,self._DisplayRangeWeather,self,_unitName) +local _BoTgtgs=MENU_GROUP_COMMAND:New(group,"Bombing Targets",_infoPath,self._DisplayBombTargets,self,_unitName) +local _StrPits=MENU_GROUP_COMMAND:New(group,"Strafe Pits",_infoPath,self._DisplayStrafePits,self,_unitName):Refresh() +end +else +self:E(self.lid.."Could not find group or group ID in AddF10Menu() function. Unit name: ".._unitName or"N/A") +end +else +self:E(self.lid.."Player unit does not exist in AddF10Menu() function. Unit name: ".._unitName or"N/A") +end +end +function RANGE:_GetBombTargetCoordinate(target) +local coord=nil +if target.type==RANGE.TargetType.UNIT then +if target.target and target.target:IsAlive()then +coord=target.target:GetCoordinate() +target.coordinate=coord +else +coord=target.coordinate +end +elseif target.type==RANGE.TargetType.STATIC then +coord=target.coordinate +elseif target.type==RANGE.TargetType.COORD then +coord=target.coordinate +elseif target.type==RANGE.TargetType.SCENERY then +coord=target.coordinate +else +self:E(self.lid.."ERROR: Unknown target type.") +end +return coord +end +function RANGE:_GetAmmo(unitname) +self:F2(unitname) +local ammo=0 +local unit,playername=self:_GetPlayerUnitAndName(unitname) +if unit and playername then +local has_ammo=false +local ammotable=unit:GetAmmo() +self:T2({ammotable=ammotable}) +if ammotable~=nil then +local weapons=#ammotable +self:T2(self.lid..string.format("Number of weapons %d.",weapons)) +for w=1,weapons do +local Nammo=ammotable[w]["count"] +local Tammo=ammotable[w]["desc"]["typeName"] +if string.match(Tammo,"shell")then +ammo=ammo+Nammo +local text=string.format("Player %s has %d rounds ammo of type %s",playername,Nammo,Tammo) +self:T(self.lid..text) +else +local text=string.format("Player %s has %d ammo of type %s",playername,Nammo,Tammo) +self:T(self.lid..text) +end +end +end +end +return ammo +end +function RANGE:_MarkTargetsOnMap(_unitName) +self:F(_unitName) +local group=nil +if _unitName then +group=UNIT:FindByName(_unitName):GetGroup() +end +for _,_bombtarget in pairs(self.bombingTargets)do +local bombtarget=_bombtarget +local coord=self:_GetBombTargetCoordinate(_bombtarget) +if group then +coord:MarkToGroup(string.format("Bomb target %s:\n%s\n%s",bombtarget.name,coord:ToStringLLDMS(),coord:ToStringBULLS(group:GetCoalition())),group) +else +coord:MarkToAll(string.format("Bomb target %s",bombtarget.name)) +end +end +for _,_strafepit in pairs(self.strafeTargets)do +for _,_target in pairs(_strafepit.targets)do +local _target=_target +if _target and _target:IsAlive()then +local coord=_target:GetCoordinate() +if group then +coord:MarkToGroup(string.format("Strafe target %s:\n%s\n%s",_target:GetName(),coord:ToStringLLDMS(),coord:ToStringBULLS(group:GetCoalition())),group) +else +coord:MarkToAll("Strafe target ".._target:GetName()) +end +end +end +end +if _unitName then +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +local text=string.format("%s, %s, range targets are now marked on F10 map.",self.rangename,_playername) +self:_DisplayMessageToGroup(_unit,text,5) +end +end +function RANGE:_IlluminateBombTargets(_unitName) +self:F(_unitName) +local bomb={} +for _,_bombtarget in pairs(self.bombingTargets)do +local _target=_bombtarget.target +local coord=self:_GetBombTargetCoordinate(_bombtarget) +if coord then +table.insert(bomb,coord) +end +end +if#bomb>0 then +local coord=bomb[math.random(#bomb)] +local c=COORDINATE:New(coord.x,coord.y+math.random(self.illuminationminalt,self.illuminationmaxalt),coord.z) +c:IlluminationBomb() +end +local strafe={} +for _,_strafepit in pairs(self.strafeTargets)do +for _,_target in pairs(_strafepit.targets)do +local _target=_target +if _target and _target:IsAlive()then +local coord=_target:GetCoordinate() +table.insert(strafe,coord) +end +end +end +if#strafe>0 then +local coord=strafe[math.random(#strafe)] +local c=COORDINATE:New(coord.x,coord.y+math.random(self.illuminationminalt,self.illuminationmaxalt),coord.z) +c:IlluminationBomb() +end +if _unitName then +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +local text=string.format("%s, %s, range targets are illuminated.",self.rangename,_playername) +self:_DisplayMessageToGroup(_unit,text,5) +end +end +function RANGE:_ResetRangeStats(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +self.strafePlayerResults[_playername]=nil +self.bombPlayerResults[_playername]=nil +local text=string.format("%s, %s, your range stats were cleared.",self.rangename,_playername) +self:DisplayMessageToGroup(_unit,text,5,false,true) +end +end +function RANGE:_DisplayMessageToGroup(_unit,_text,_time,_clear,display,_togroup) +self:F({unit=_unit,text=_text,time=_time,clear=_clear}) +_time=_time or self.Tmsg +if _clear==nil or _clear==false then +_clear=false +else +_clear=true +end +if self.messages==false then +return +end +if _unit and _unit:IsAlive()then +local _gid=_unit:GetGroup():GetID() +local _grp=_unit:GetGroup() +local _,playername=self:_GetPlayerUnitAndName(_unit:GetName()) +local playermessage=self.PlayerSettings[playername].messages +if _gid and(playermessage==true or display)and(not self.examinerexclusive)then +if _togroup and _grp then +local m=MESSAGE:New(_text,_time,nil,_clear):ToGroup(_grp) +else +local m=MESSAGE:New(_text,_time,nil,_clear):ToUnit(_unit) +end +end +if self.examinergroupname~=nil then +local _examinerid=GROUP:FindByName(self.examinergroupname) +if _examinerid then +local m=MESSAGE:New(_text,_time,nil,_clear):ToGroup(_examinerid) +end +end +end +end +function RANGE:_SmokeBombImpactOnOff(unitname) +self:F(unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(unitname) +if unit and playername then +local text +if self.PlayerSettings[playername].smokebombimpact==true then +self.PlayerSettings[playername].smokebombimpact=false +text=string.format("%s, %s, smoking impact points of bombs is now OFF.",self.rangename,playername) +else +self.PlayerSettings[playername].smokebombimpact=true +text=string.format("%s, %s, smoking impact points of bombs is now ON.",self.rangename,playername) +end +self:_DisplayMessageToGroup(unit,text,5,false,true) +end +end +function RANGE:_SmokeBombDelayOnOff(unitname) +self:F(unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(unitname) +if unit and playername then +local text +if self.PlayerSettings[playername].delaysmoke==true then +self.PlayerSettings[playername].delaysmoke=false +text=string.format("%s, %s, delayed smoke of bombs is now OFF.",self.rangename,playername) +else +self.PlayerSettings[playername].delaysmoke=true +text=string.format("%s, %s, delayed smoke of bombs is now ON.",self.rangename,playername) +end +self:_DisplayMessageToGroup(unit,text,5,false,true) +end +end +function RANGE:_MessagesToPlayerOnOff(unitname) +self:F(unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(unitname) +if unit and playername then +local text +if self.PlayerSettings[playername].messages==true then +text=string.format("%s, %s, display of ALL messages is now OFF.",self.rangename,playername) +else +text=string.format("%s, %s, display of ALL messages is now ON.",self.rangename,playername) +end +self:_DisplayMessageToGroup(unit,text,5,false,true) +self.PlayerSettings[playername].messages=not self.PlayerSettings[playername].messages +end +end +function RANGE:_TargetsheetOnOff(_unitname) +self:F2(_unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.PlayerSettings[playername] +if playerData then +local text="" +if self.targetsheet then +playerData.targeton=not playerData.targeton +if playerData and playerData.targeton==true then +text=string.format("Roger, your targetsheets are now SAVED.") +else +text=string.format("Affirm, your targetsheets are NOT SAVED.") +end +else +text="Negative, target sheet data recorder is broken on this range." +end +self:_DisplayMessageToGroup(unit,text,5,false,false) +end +end +end +function RANGE:_FlareDirectHitsOnOff(unitname) +self:F(unitname) +local unit,playername,_multiplayer=self:_GetPlayerUnitAndName(unitname) +if unit and playername then +local text +if self.PlayerSettings[playername].flaredirecthits==true then +self.PlayerSettings[playername].flaredirecthits=false +text=string.format("%s, %s, flaring direct hits is now OFF.",self.rangename,playername) +else +self.PlayerSettings[playername].flaredirecthits=true +text=string.format("%s, %s, flaring direct hits is now ON.",self.rangename,playername) +end +self:_DisplayMessageToGroup(unit,text,5,false,true) +end +end +function RANGE:_SmokeBombTargets(unitname) +self:F(unitname) +for _,_bombtarget in pairs(self.bombingTargets)do +local _target=_bombtarget.target +local coord=self:_GetBombTargetCoordinate(_bombtarget) +if coord then +coord:Smoke(self.BombSmokeColor) +end +end +if unitname then +local unit,playername=self:_GetPlayerUnitAndName(unitname) +local text=string.format("%s, %s, bombing targets are now marked with %s smoke.",self.rangename,playername,self:_smokecolor2text(self.BombSmokeColor)) +self:_DisplayMessageToGroup(unit,text,5) +end +end +function RANGE:_SmokeStrafeTargets(unitname) +self:F(unitname) +for _,_target in pairs(self.strafeTargets)do +_target.coordinate:Smoke(self.StrafeSmokeColor) +end +if unitname then +local unit,playername=self:_GetPlayerUnitAndName(unitname) +local text=string.format("%s, %s, strafing tragets are now marked with %s smoke.",self.rangename,playername,self:_smokecolor2text(self.StrafeSmokeColor)) +self:_DisplayMessageToGroup(unit,text,5) +end +end +function RANGE:_SmokeStrafeTargetBoxes(unitname) +self:F(unitname) +for _,_target in pairs(self.strafeTargets)do +local zone=_target.polygon +zone:SmokeZone(self.StrafePitSmokeColor,4) +for _,_point in pairs(_target.smokepoints)do +_point:SmokeOrange() +end +end +if unitname then +local unit,playername=self:_GetPlayerUnitAndName(unitname) +local text=string.format("%s, %s, strafing pit approach boxes are now marked with %s smoke.",self.rangename,playername,self:_smokecolor2text(self.StrafePitSmokeColor)) +self:_DisplayMessageToGroup(unit,text,5) +end +end +function RANGE:_playersmokecolor(_unitName,color) +self:F({unitname=_unitName,color=color}) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +self.PlayerSettings[_playername].smokecolor=color +local text=string.format("%s, %s, your bomb impacts are now smoked in %s.",self.rangename,_playername,self:_smokecolor2text(color)) +self:_DisplayMessageToGroup(_unit,text,5) +end +end +function RANGE:_playerflarecolor(_unitName,color) +self:F({unitname=_unitName,color=color}) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +self.PlayerSettings[_playername].flarecolor=color +local text=string.format("%s, %s, your direct hits are now flared in %s.",self.rangename,_playername,self:_flarecolor2text(color)) +self:_DisplayMessageToGroup(_unit,text,5) +end +end +function RANGE:_smokecolor2text(color) +self:F(color) +local txt="" +if color==SMOKECOLOR.Blue then +txt="blue" +elseif color==SMOKECOLOR.Green then +txt="green" +elseif color==SMOKECOLOR.Orange then +txt="orange" +elseif color==SMOKECOLOR.Red then +txt="red" +elseif color==SMOKECOLOR.White then +txt="white" +else +txt=string.format("unknown color (%s)",tostring(color)) +end +return txt +end +function RANGE:_flarecolor2text(color) +self:F(color) +local txt="" +if color==FLARECOLOR.Green then +txt="green" +elseif color==FLARECOLOR.Red then +txt="red" +elseif color==FLARECOLOR.White then +txt="white" +elseif color==FLARECOLOR.Yellow then +txt="yellow" +else +txt=string.format("unknown color (%s)",tostring(color)) +end +return txt +end +function RANGE:_CheckStatic(name) +self:F2(name) +local _DCSstatic=StaticObject.getByName(name) +if _DCSstatic and _DCSstatic:isExist()then +local _MOOSEstatic=STATIC:FindByName(name,false) +if not _MOOSEstatic then +self:T(self.lid..string.format("Adding DCS static to MOOSE database. Name = %s.",name)) +_DATABASE:AddStatic(name) +end +return true +else +self:T3(self.lid..string.format("No static object with name %s exists.",name)) +end +if UNIT:FindByName(name)then +return false +else +self:T3(self.lid..string.format("No unit object with name %s exists.",name)) +end +return nil +end +function RANGE:_GetSpeed(controllable) +self:F2(controllable) +local desc=controllable:GetDesc() +local speed=0 +if desc then +speed=desc.speedMax*3.6 +self:T({speed=speed}) +end +return speed +end +function RANGE:_GetPlayerUnitAndName(_unitName,PlayerName) +if _unitName~=nil then +local multiplayer=false +local DCSunit=Unit.getByName(_unitName) +if DCSunit and DCSunit.getPlayerName then +local playername=DCSunit:getPlayerName()or PlayerName or"None" +local unit=UNIT:Find(DCSunit) +self:T2({DCSunit=DCSunit,unit=unit,playername=playername}) +if DCSunit and unit and playername then +self:F2(playername) +local grp=unit:GetGroup() +if grp and grp:CountAliveUnits()>1 then +multiplayer=true +end +return unit,playername,multiplayer +end +end +end +return nil,nil,nil +end +function RANGE:_myname(unitname) +self:F2(unitname) +local pname="Ghost 1 1" +local unit=UNIT:FindByName(unitname) +if unit and unit:IsAlive()then +local grp=unit:GetGroup() +if grp and grp:IsAlive()then +pname=grp:GetCustomCallSign(true,true) +end +end +return pname +end +do +ZONE_GOAL={ +ClassName="ZONE_GOAL", +Goal=nil, +SmokeTime=nil, +SmokeScheduler=nil, +SmokeColor=nil, +SmokeZone=nil, +} +function ZONE_GOAL:New(Zone) +BASE:I({Zone=Zone}) +local self=BASE:Inherit(self,BASE:New()) +if type(Zone)=="string"then +self=BASE:Inherit(self,ZONE_POLYGON:NewFromGroupName(Zone)) +else +self=BASE:Inherit(self,ZONE_RADIUS:New(Zone:GetName(),Zone:GetVec2(),Zone:GetRadius())) +self:F({Zone=Zone}) +end +self.Goal=GOAL:New() +self.SmokeTime=nil +self:SetSmokeZone(true) +self:AddTransition("*","DestroyedUnit","*") +return self +end +function ZONE_GOAL:GetZone() +return self +end +function ZONE_GOAL:GetZoneName() +return self:GetName() +end +function ZONE_GOAL:SetSmokeZone(switch) +self.SmokeZone=switch +return self +end +function ZONE_GOAL:Smoke(SmokeColor) +self:F({SmokeColor=SmokeColor}) +self.SmokeColor=SmokeColor +end +function ZONE_GOAL:Flare(FlareColor) +self:FlareZone(FlareColor,30) +end +function ZONE_GOAL:onafterGuard() +self:F("Guard") +if self.SmokeZone and not self.SmokeScheduler then +self.SmokeScheduler=self:ScheduleRepeat(1,1,0.1,nil,self.StatusSmoke,self) +end +end +function ZONE_GOAL:StatusSmoke() +self:F({self.SmokeTime,self.SmokeColor}) +if self.SmokeZone then +local CurrentTime=timer.getTime() +if self.SmokeTime==nil or self.SmokeTime+300<=CurrentTime then +if self.SmokeColor then +self:GetCoordinate():Smoke(self.SmokeColor) +self.SmokeTime=CurrentTime +end +end +end +end +function ZONE_GOAL:__Destroyed(EventData) +self:F({"EventDead",EventData}) +self:F({EventData.IniUnit}) +if EventData.IniDCSUnit then +local Vec3=EventData.IniDCSUnit:getPosition().p +self:F({Vec3=Vec3}) +if Vec3 and self:IsVec3InZone(Vec3)then +local PlayerHits=_DATABASE.HITS[EventData.IniUnitName] +if PlayerHits then +for PlayerName,PlayerHit in pairs(PlayerHits.Players or{})do +self.Goal:AddPlayerContribution(PlayerName) +self:DestroyedUnit(EventData.IniUnitName,PlayerName) +end +end +end +end +end +function ZONE_GOAL:MonitorDestroyedUnits() +self:HandleEvent(EVENTS.Dead,self.__Destroyed) +self:HandleEvent(EVENTS.Crash,self.__Destroyed) +end +end +do +ZONE_GOAL_COALITION={ +ClassName="ZONE_GOAL_COALITION", +Coalition=nil, +PreviousCoalition=nil, +UnitCategories=nil, +ObjectCategories=nil, +} +ZONE_GOAL_COALITION.States={} +function ZONE_GOAL_COALITION:New(Zone,Coalition,UnitCategories) +if not Zone then +BASE:E("ERROR: No Zone specified in ZONE_GOAL_COALITION!") +return nil +end +local self=BASE:Inherit(self,ZONE_GOAL:New(Zone)) +self:F({Zone=Zone,Coalition=Coalition}) +self:SetCoalition(Coalition or coalition.side.NEUTRAL) +self:SetUnitCategories(UnitCategories) +self:SetObjectCategories() +return self +end +function ZONE_GOAL_COALITION:SetCoalition(Coalition) +self.PreviousCoalition=self.Coalition or Coalition +self.Coalition=Coalition +return self +end +function ZONE_GOAL_COALITION:SetUnitCategories(UnitCategories) +if UnitCategories and type(UnitCategories)~="table"then +UnitCategories={UnitCategories} +end +self.UnitCategories=UnitCategories or{Unit.Category.GROUND_UNIT} +return self +end +function ZONE_GOAL_COALITION:SetObjectCategories(ObjectCategories) +if ObjectCategories and type(ObjectCategories)~="table"then +ObjectCategories={ObjectCategories} +end +self.ObjectCategories=ObjectCategories or{Object.Category.UNIT,Object.Category.STATIC} +return self +end +function ZONE_GOAL_COALITION:GetCoalition() +return self.Coalition +end +function ZONE_GOAL_COALITION:GetPreviousCoalition() +return self.PreviousCoalition +end +function ZONE_GOAL_COALITION:GetCoalitionName() +return UTILS.GetCoalitionName(self.Coalition) +end +function ZONE_GOAL_COALITION:StatusZone() +local State=self:GetState() +local text=string.format("Zone state=%s, Owner=%s, Scanning...",State,self:GetCoalitionName()) +self:F(text) +self:Scan(self.ObjectCategories,self.UnitCategories) +return self +end +end +do +ZONE_CAPTURE_COALITION={ +ClassName="ZONE_CAPTURE_COALITION", +MarkBlue=nil, +MarkRed=nil, +StartInterval=nil, +RepeatInterval=nil, +HitsOn=nil, +HitTimeLast=nil, +HitTimeAttackOver=nil, +MarkOn=nil, +} +function ZONE_CAPTURE_COALITION:New(Zone,Coalition,UnitCategories,ObjectCategories) +local self=BASE:Inherit(self,ZONE_GOAL_COALITION:New(Zone,Coalition,UnitCategories)) +self:F({Zone=Zone,Coalition=Coalition,UnitCategories=UnitCategories,ObjectCategories=ObjectCategories}) +self:SetObjectCategories(ObjectCategories) +self:SetSmokeZone(false) +self:SetMarkZone(true) +self:SetStartState("Empty") +do +end +do +end +do +end +do +end +self:AddTransition("*","Guard","Guarded") +self:AddTransition("*","Empty","Empty") +self:AddTransition({"Guarded","Empty"},"Attack","Attacked") +self:AddTransition({"Guarded","Attacked","Empty"},"Capture","Captured") +_EVENTDISPATCHER:CreateEventNewZoneGoal(self) +return self +end +function ZONE_CAPTURE_COALITION:Start(StartInterval,RepeatInterval) +self.StartInterval=StartInterval or 1 +self.RepeatInterval=RepeatInterval or 15 +if self.ScheduleStatusZone then +self:ScheduleStop(self.ScheduleStatusZone) +end +self.ScheduleStatusZone=self:ScheduleRepeat(self.StartInterval,self.RepeatInterval,0.1,nil,self.StatusZone,self) +self:HandleEvent(EVENTS.Hit,self.OnEventHit) +self:Mark() +return self +end +function ZONE_CAPTURE_COALITION:Stop() +if self.ScheduleStatusZone then +self:ScheduleStop(self.ScheduleStatusZone) +end +if self.SmokeScheduler then +self:ScheduleStop(self.SmokeScheduler) +end +self:UnHandleEvent(EVENTS.Hit) +end +function ZONE_CAPTURE_COALITION:SetMonitorHits(Switch,TimeAttackOver) +self.HitsOn=Switch +self.HitTimeAttackOver=TimeAttackOver or 5*60 +return self +end +function ZONE_CAPTURE_COALITION:SetMarkZone(Switch) +if Switch==nil or Switch==true then +self.MarkOn=true +else +self.MarkOn=false +end +return self +end +function ZONE_CAPTURE_COALITION:OnEventHit(EventData) +if self.HitsOn then +local UnitHit=EventData.TgtUnit +if UnitHit and UnitHit.ClassName~="SCENERY"then +if UnitHit and UnitHit:IsInZone(self)and UnitHit:GetCoalition()==self.Coalition then +self.HitTimeLast=timer.getTime() +if self:GetState()~="Attacked"then +self:F2("Hit ==> Attack") +self:Attack() +end +end +end +end +end +function ZONE_CAPTURE_COALITION:onafterGuard() +self:F2("After Guard") +if self.SmokeZone and not self.SmokeScheduler then +self.SmokeScheduler=self:ScheduleRepeat(self.StartInterval,self.RepeatInterval,0.1,nil,self.StatusSmoke,self) +end +end +function ZONE_CAPTURE_COALITION:onenterGuarded() +self:F2("Enter Guarded") +self:Mark() +end +function ZONE_CAPTURE_COALITION:onenterCaptured() +self:F2("Enter Captured") +local NewCoalition=self:GetScannedCoalition() +self:F({NewCoalition=NewCoalition}) +self:SetCoalition(NewCoalition) +self:Mark() +self.Goal:Achieved() +end +function ZONE_CAPTURE_COALITION:onenterEmpty() +self:F2("Enter Empty") +self:Mark() +end +function ZONE_CAPTURE_COALITION:onenterAttacked() +self:F2("Enter Attacked") +self:Mark() +end +function ZONE_CAPTURE_COALITION:IsEmpty() +local IsEmpty=self:IsNoneInZone() +self:F({IsEmpty=IsEmpty}) +return IsEmpty +end +function ZONE_CAPTURE_COALITION:IsGuarded() +local IsGuarded=self:IsAllInZoneOfCoalition(self.Coalition) +self:F({IsGuarded=IsGuarded}) +return IsGuarded +end +function ZONE_CAPTURE_COALITION:IsCaptured() +local IsCaptured=self:IsAllInZoneOfOtherCoalition(self.Coalition) +self:F({IsCaptured=IsCaptured}) +return IsCaptured +end +function ZONE_CAPTURE_COALITION:IsAttacked() +local IsAttacked=self:IsSomeInZoneOfCoalition(self.Coalition) +self:F({IsAttacked=IsAttacked}) +return IsAttacked +end +function ZONE_CAPTURE_COALITION:StatusZone() +local State=self:GetState() +self:GetParent(self,ZONE_CAPTURE_COALITION).StatusZone(self) +local Tnow=timer.getTime() +if State~="Guarded"and self:IsGuarded()then +if self.HitTimeLast==nil or Tnow>=self.HitTimeLast+self.HitTimeAttackOver then +self:Guard() +self.HitTimeLast=nil +end +end +if State~="Empty"and self:IsEmpty()then +self:Empty() +end +if State~="Attacked"and self:IsAttacked()then +self:Attack() +end +if State~="Captured"and self:IsCaptured()then +self:Capture() +end +local unitset=self:GetScannedSetUnit() +local nRed=0 +local nBlue=0 +for _,object in pairs(unitset:GetSet())do +local coal=object:GetCoalition() +if object:IsAlive()then +if coal==coalition.side.RED then +nRed=nRed+1 +elseif coal==coalition.side.BLUE then +nBlue=nBlue+1 +end +end +end +if false then +local text=string.format("CAPTURE ZONE %s: Owner=%s (Previous=%s): #blue=%d, #red=%d, Status %s",self:GetZoneName(),self:GetCoalitionName(),UTILS.GetCoalitionName(self:GetPreviousCoalition()),nBlue,nRed,State) +local NewState=self:GetState() +if NewState~=State then +text=text..string.format(" --> %s",NewState) +end +self:I(text) +end +end +function ZONE_CAPTURE_COALITION:Mark() +if self.MarkOn then +local Coord=self:GetCoordinate() +local ZoneName=self:GetZoneName() +local State=self:GetState() +if self.MarkRed then +Coord:RemoveMark(self.MarkRed) +end +if self.MarkBlue then +Coord:RemoveMark(self.MarkBlue) +end +if self.Coalition==coalition.side.BLUE then +self.MarkBlue=Coord:MarkToCoalitionBlue("Coalition: Blue\nGuard Zone: "..ZoneName.."\nStatus: "..State) +self.MarkRed=Coord:MarkToCoalitionRed("Coalition: Blue\nCapture Zone: "..ZoneName.."\nStatus: "..State) +elseif self.Coalition==coalition.side.RED then +self.MarkRed=Coord:MarkToCoalitionRed("Coalition: Red\nGuard Zone: "..ZoneName.."\nStatus: "..State) +self.MarkBlue=Coord:MarkToCoalitionBlue("Coalition: Red\nCapture Zone: "..ZoneName.."\nStatus: "..State) +else +self.MarkRed=Coord:MarkToCoalitionRed("Coalition: Neutral\nCapture Zone: "..ZoneName.."\nStatus: "..State) +self.MarkBlue=Coord:MarkToCoalitionBlue("Coalition: Neutral\nCapture Zone: "..ZoneName.."\nStatus: "..State) +end +end +end +end +ARTY={ +ClassName="ARTY", +lid=nil, +Debug=false, +targets={}, +moves={}, +currentTarget=nil, +currentMove=nil, +Nammo0=0, +Nshells0=0, +Nrockets0=0, +Nmissiles0=0, +Nukes0=0, +Nillu0=0, +Nsmoke0=0, +StatusInterval=10, +WaitForShotTime=300, +DCSdesc=nil, +Type=nil, +DisplayName=nil, +groupname=nil, +alias=nil, +clusters={}, +ismobile=true, +iscargo=false, +cargogroup=nil, +IniGroupStrength=0, +IsArtillery=nil, +RearmingDistance=100, +RearmingGroup=nil, +RearmingGroupSpeed=nil, +RearmingGroupOnRoad=false, +RearmingGroupCoord=nil, +RearmingPlaceCoord=nil, +RearmingArtyOnRoad=false, +InitialCoord=nil, +report=true, +ammoshells={}, +ammorockets={}, +ammomissiles={}, +Nshots=0, +minrange=300, +maxrange=1000000, +nukewarhead=75000, +Nukes=nil, +nukefire=false, +nukefires=nil, +nukerange=nil, +Nillu=nil, +illuPower=1000000, +illuMinalt=500, +illuMaxalt=1000, +Nsmoke=nil, +smokeColor=SMOKECOLOR.Red, +relocateafterfire=false, +relocateRmin=300, +relocateRmax=800, +markallow=false, +markkey=nil, +markreadonly=false, +autorelocate=false, +autorelocatemaxdist=50000, +autorelocateonroad=false, +coalition=nil, +respawnafterdeath=false, +respawndelay=nil +} +ARTY.WeaponType={ +Auto=1073741822, +Cannon=805306368, +Rockets=30720, +CruiseMissile=2097152, +TacticalNukes=666, +IlluminationShells=667, +SmokeShells=668, +} +ARTY.db={ +["LeFH_18-40-105"]={ +displayname="FH LeFH-18 105mm", +minrange=500, +maxrange=10500, +reloadtime=nil, +}, +["M2A1-105"]={ +displayname="FH M2A1 105mm", +minrange=500, +maxrange=11500, +reloadtime=nil, +}, +["Pak40"]={ +displayname="FH Pak 40 75mm", +minrange=500, +maxrange=3000, +reloadtime=nil, +}, +["L118_Unit"]={ +displayname="L118 Light Artillery Gun", +minrange=500, +maxrange=17500, +reloadtime=nil, +}, +["Smerch"]={ +displayname="MLRS 9A52 Smerch CM 300mm", +minrange=20000, +maxrange=70000, +reloadtime=2160, +}, +["Smerch_HE"]={ +displayname="MLRS 9A52 Smerch HE 300mm", +minrange=20000, +maxrange=70000, +reloadtime=2160, +}, +["Uragan_BM-27"]={ +displayname="MLRS 9K57 Uragan BM-27 220mm", +minrange=11500, +maxrange=35800, +reloadtime=840, +}, +["Grad-URAL"]={ +displayname="MLRS BM-21 Grad 122mm", +minrange=5000, +maxrange=19000, +reloadtime=420, +}, +["HL_B8M1"]={ +displayname="MLRS HL with B8M1 80mm", +minrange=500, +maxrange=5000, +reloadtime=nil, +}, +["tt_B8M1"]={ +displayname="MLRS LC with B8M1 80mm", +minrange=500, +maxrange=5000, +reloadtime=nil, +}, +["MLRS"]={ +displayname="MLRS M270 227mm", +minrange=10000, +maxrange=32000, +reloadtime=540, +}, +["2B11 mortar"]={ +displayname="Mortar 2B11 120mm", +minrange=500, +maxrange=7000, +reloadtime=30, +}, +["PLZ05"]={ +displayname="PLZ-05", +minrange=500, +maxrange=23500, +reloadtime=nil, +}, +["SAU Gvozdika"]={ +displayname="SPH 2S1 Gvozdika 122mm", +minrange=300, +maxrange=15000, +reloadtime=nil, +}, +["SAU Msta"]={ +displayname="SPH 2S19 Msta 152mm", +minrange=300, +maxrange=23500, +reloadtime=nil, +}, +["SAU Akatsia"]={ +displayname="SPH 2S3 Akatsia 152mm", +minrange=300, +maxrange=17000, +reloadtime=nil, +}, +["SpGH_Dana"]={ +displayname="SPH Dana vz77 152mm", +minrange=300, +maxrange=18700, +reloadtime=nil, +}, +["M-109"]={ +displayname="SPH M109 Paladin 155mm", +minrange=300, +maxrange=22000, +reloadtime=nil, +}, +["M12_GMC"]={ +displayname="SPH M12 GMC 155mm", +minrange=300, +maxrange=18200, +reloadtime=nil, +}, +["Wespe124"]={ +displayname="SPH Sd.Kfz.124 Wespe 105mm", +minrange=300, +maxrange=7000, +reloadtime=nil, +}, +["T155_Firtina"]={ +displayname="SPH T155 Firtina 155mm", +minrange=300, +maxrange=41000, +reloadtime=nil, +}, +["SAU 2-C9"]={ +displayname="SPM 2S9 Nona 120mm M", +minrange=500, +maxrange=7000, +reloadtime=nil, +}, +} +ARTY.version="1.3.3" +function ARTY:New(group,alias) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +if type(group)=="string"then +self.groupname=group +group=GROUP:FindByName(group) +if not group then +self:E(string.format("ERROR: Requested ARTY group %s does not exist! (Has to be a MOOSE group.)",self.groupname)) +return nil +end +end +if group then +self:T(string.format("ARTY script version %s. Added group %s.",ARTY.version,group:GetName())) +else +self:E("ERROR: Requested ARTY group does not exist! (Has to be a MOOSE group.)") +return nil +end +if not(group:IsGround()or group:IsShip())then +self:E(string.format("ERROR: ARTY group %s has to be a GROUND or SHIP group!",group:GetName())) +return nil +end +self:SetControllable(group) +self.groupname=group:GetName() +self.coalition=group:GetCoalition() +if alias~=nil then +self.alias=tostring(alias) +else +self.alias=self.groupname +end +self.lid=string.format("ARTY %s | ",self.alias) +self.InitialCoord=group:GetCoordinate() +local DCSgroup=Group.getByName(group:GetName()) +local DCSunit=DCSgroup:getUnit(1) +self.DCSdesc=DCSunit:getDesc() +self:T3(self.lid.."DCS descriptors for group "..group:GetName()) +for id,desc in pairs(self.DCSdesc)do +self:T3({id=id,desc=desc}) +end +self.SpeedMax=group:GetSpeedMax() +if self.SpeedMax>3.6 then +self.ismobile=true +else +self.ismobile=false +end +self.dtTrack=0.2 +self.Speed=self.SpeedMax*0.7 +self.DisplayName=self.DCSdesc.displayName +self.IsArtillery=DCSunit:hasAttribute("Artillery") +self.Type=group:GetTypeName() +self.IniGroupStrength=#group:GetUnits() +self:AddTransition("*","Start","CombatReady") +self:AddTransition("CombatReady","OpenFire","Firing") +self:AddTransition("Firing","CeaseFire","CombatReady") +self:AddTransition("CombatReady","Winchester","OutOfAmmo") +self:AddTransition({"CombatReady","OutOfAmmo"},"Rearm","Rearming") +self:AddTransition("Rearming","Rearmed","Rearmed") +self:AddTransition("*","Move","Moving") +self:AddTransition("Moving","Arrived","Arrived") +self:AddTransition("*","NewTarget","*") +self:AddTransition("*","CombatReady","CombatReady") +self:AddTransition("*","Status","*") +self:AddTransition("*","NewMove","*") +self:AddTransition("*","Dead","*") +self:AddTransition("*","Respawn","CombatReady") +self:AddTransition("*","Loaded","InTransit") +self:AddTransition("InTransit","UnLoaded","CombatReady") +self:AddTransition("Rearming","Arrived","Rearming") +self:AddTransition("Rearming","Move","Rearming") +return self +end +function ARTY:NewFromCargoGroup(cargogroup,alias) +if cargogroup then +BASE:T(string.format("ARTY script version %s. Added CARGO group %s.",ARTY.version,cargogroup:GetName())) +else +BASE:E("ERROR: Requested ARTY CARGO GROUP does not exist! (Has to be a MOOSE CARGO(!) group.)") +return nil +end +local group=cargogroup:GetObject() +local arty=ARTY:New(group,alias) +arty.iscargo=true +arty.cargogroup=cargogroup +return arty +end +function ARTY:AssignTargetCoord(coord,prio,radius,nshells,maxengage,time,weapontype,name,unique) +self:F({coord=coord,prio=prio,radius=radius,nshells=nshells,maxengage=maxengage,time=time,weapontype=weapontype,name=name,unique=unique}) +nshells=nshells or 5 +radius=radius or 100 +maxengage=maxengage or 1 +prio=prio or 50 +prio=math.max(1,prio) +prio=math.min(100,prio) +if unique==nil then +unique=false +end +weapontype=weapontype or ARTY.WeaponType.Auto +local text=nil +if coord:IsInstanceOf("GROUP")then +text="WARNING: ARTY:AssignTargetCoordinate(coord, ...) needs a COORDINATE object as first parameter - you gave a GROUP. Converting to COORDINATE..." +coord=coord:GetCoordinate() +elseif coord:IsInstanceOf("UNIT")then +text="WARNING: ARTY:AssignTargetCoordinate(coord, ...) needs a COORDINATE object as first parameter - you gave a UNIT. Converting to COORDINATE..." +coord=coord:GetCoordinate() +elseif coord:IsInstanceOf("POSITIONABLE")then +text="WARNING: ARTY:AssignTargetCoordinate(coord, ...) needs a COORDINATE object as first parameter - you gave a POSITIONABLE. Converting to COORDINATE..." +coord=coord:GetCoordinate() +elseif coord:IsInstanceOf("COORDINATE")then +else +text="ERROR: ARTY:AssignTargetCoordinate(coord, ...) needs a COORDINATE object as first parameter!" +MESSAGE:New(text,30):ToAll() +self:E(self.lid..text) +return nil +end +if text~=nil then +self:E(self.lid..text) +end +local _name=name or coord:ToStringLLDMS() +local _unique=true +_name,_unique=self:_CheckName(self.targets,_name,not unique) +if unique==true and _unique==false then +self:T(self.lid..string.format("%s: target %s should have a unique name but name was already given. Rejecting target!",self.groupname,_name)) +return nil +end +local _time +if type(time)=="string"then +_time=self:_ClockToSeconds(time) +elseif type(time)=="number"then +_time=timer.getAbsTime()+time +else +_time=timer.getAbsTime() +end +local _target={name=_name,coord=coord,radius=radius,nshells=nshells,engaged=0,underfire=false,prio=prio,maxengage=maxengage,time=_time,weapontype=weapontype} +table.insert(self.targets,_target) +self:__NewTarget(1,_target) +return _name +end +function ARTY:AssignAttackGroup(group,prio,radius,nshells,maxengage,time,weapontype,name,unique) +nshells=nshells or 5 +radius=radius or 100 +maxengage=maxengage or 1 +prio=prio or 50 +prio=math.max(1,prio) +prio=math.min(100,prio) +if unique==nil then +unique=false +end +weapontype=weapontype or ARTY.WeaponType.Auto +if type(group)=="string"then +group=GROUP:FindByName(group) +end +if group and group:IsAlive()then +local coord=group:GetCoordinate() +local _name=group:GetName() +local _unique=true +_name,_unique=self:_CheckName(self.targets,_name,not unique) +if unique==true and _unique==false then +self:T(self.lid..string.format("%s: target %s should have a unique name but name was already given. Rejecting target!",self.groupname,_name)) +return nil +end +local _time +if type(time)=="string"then +_time=self:_ClockToSeconds(time) +elseif type(time)=="number"then +_time=timer.getAbsTime()+time +else +_time=timer.getAbsTime() +end +local target={} +target.attackgroup=true +target.name=_name +target.coord=coord +target.radius=radius +target.nshells=nshells +target.engaged=0 +target.underfire=false +target.prio=prio +target.time=_time +target.maxengage=maxengage +target.weapontype=weapontype +table.insert(self.targets,target) +self:__NewTarget(1,target) +return _name +else +self:E("ERROR: Group does not exist!") +end +return nil +end +function ARTY:AssignMoveCoord(coord,time,speed,onroad,cancel,name,unique) +self:F({coord=coord,time=time,speed=speed,onroad=onroad,cancel=cancel,name=name,unique=unique}) +if not self.ismobile then +self:T(self.lid..string.format("%s: group is immobile. Rejecting move request!",self.groupname)) +return nil +end +if unique==nil then +unique=false +end +local _name=name or coord:ToStringLLDMS() +local _unique=true +_name,_unique=self:_CheckName(self.moves,_name,not unique) +if unique==true and _unique==false then +self:T(self.lid..string.format("%s: move %s should have a unique name but name was already given. Rejecting move!",self.groupname,_name)) +return nil +end +if speed then +speed=math.min(speed,self.SpeedMax) +elseif self.Speed then +speed=self.Speed +else +speed=self.SpeedMax*0.7 +end +if onroad==nil then +onroad=false +end +if cancel==nil then +cancel=false +end +local _time +if type(time)=="string"then +_time=self:_ClockToSeconds(time) +elseif type(time)=="number"then +_time=timer.getAbsTime()+time +else +_time=timer.getAbsTime() +end +local _move={name=_name,coord=coord,time=_time,speed=speed,onroad=onroad,cancel=cancel} +table.insert(self.moves,_move) +return _name +end +function ARTY:SetAlias(alias) +self:F({alias=alias}) +self.alias=tostring(alias) +return self +end +function ARTY:AddToCluster(clusters) +self:F({clusters=clusters}) +local names +if type(clusters)=="table"then +names=clusters +elseif type(clusters)=="string"then +names={clusters} +else +self:E(self.lid.."ERROR: Input parameter must be a string or a table in ARTY:AddToCluster()!") +return +end +for _,cluster in pairs(names)do +table.insert(self.clusters,cluster) +end +return self +end +function ARTY:SetMinFiringRange(range) +self:F({range=range}) +self.minrange=range*1000 or 100 +return self +end +function ARTY:SetMaxFiringRange(range) +self:F({range=range}) +self.maxrange=range*1000 or 1000*1000 +return self +end +function ARTY:SetStatusInterval(interval) +self:F({interval=interval}) +self.StatusInterval=interval or 10 +return self +end +function ARTY:SetTrackInterval(interval) +self.dtTrack=interval or 0.2 +return self +end +function ARTY:SetWaitForShotTime(waittime) +self:F({waittime=waittime}) +self.WaitForShotTime=waittime or 300 +return self +end +function ARTY:SetRearmingDistance(distance) +self:F({distance=distance}) +self.RearmingDistance=distance or 100 +return self +end +function ARTY:SetRearmingGroup(group) +self:F({group=group}) +self.RearmingGroup=group +return self +end +function ARTY:SetRearmingGroupSpeed(speed) +self:F({speed=speed}) +self.RearmingGroupSpeed=speed +return self +end +function ARTY:SetRearmingGroupOnRoad(onroad) +self:F({onroad=onroad}) +if onroad==nil then +onroad=true +end +self.RearmingGroupOnRoad=onroad +return self +end +function ARTY:SetRearmingArtyOnRoad(onroad) +self:F({onroad=onroad}) +if onroad==nil then +onroad=true +end +self.RearmingArtyOnRoad=onroad +return self +end +function ARTY:SetRearmingPlace(coord) +self:F({coord=coord}) +self.RearmingPlaceCoord=coord +return self +end +function ARTY:SetAutoRelocateToFiringRange(maxdistance,onroad) +self:F({distance=maxdistance,onroad=onroad}) +self.autorelocate=true +self.autorelocatemaxdist=maxdistance or 50 +self.autorelocatemaxdist=self.autorelocatemaxdist*1000 +if onroad==nil then +onroad=false +end +self.autorelocateonroad=onroad +return self +end +function ARTY:SetAutoRelocateAfterEngagement(rmax,rmin) +self.relocateafterfire=true +self.relocateRmax=rmax or 800 +self.relocateRmin=rmin or 300 +self.relocateRmin=math.min(self.relocateRmin,self.relocateRmax) +return self +end +function ARTY:SetReportON() +self.report=true +return self +end +function ARTY:SetReportOFF() +self.report=false +return self +end +function ARTY:SetRespawnOnDeath(delay) +self.respawnafterdeath=true +self.respawndelay=delay +return self +end +function ARTY:SetDebugON() +self.Debug=true +return self +end +function ARTY:SetDebugOFF() +self.Debug=false +return self +end +function ARTY:SetSpeed(speed) +self.Speed=speed +return self +end +function ARTY:RemoveTarget(name) +self:F2(name) +local id=self:_GetTargetIndexByName(name) +if id then +self:T(self.lid..string.format("Group %s: Removing target %s (id=%d).",self.groupname,name,id)) +table.remove(self.targets,id) +if self.markallow then +local batteryname,markTargetID,markMoveID=self:_GetMarkIDfromName(name) +if batteryname==self.groupname and markTargetID~=nil then +COORDINATE:RemoveMark(markTargetID) +end +end +end +self:T(self.lid..string.format("Group %s: Number of targets = %d.",self.groupname,#self.targets)) +end +function ARTY:RemoveMove(name) +self:F2(name) +local id=self:_GetMoveIndexByName(name) +if id then +self:T(self.lid..string.format("Group %s: Removing move %s (id=%d).",self.groupname,name,id)) +table.remove(self.moves,id) +if self.markallow then +local batteryname,markTargetID,markMoveID=self:_GetMarkIDfromName(name) +if batteryname==self.groupname and markMoveID~=nil then +COORDINATE:RemoveMark(markMoveID) +end +end +end +self:T(self.lid..string.format("Group %s: Number of moves = %d.",self.groupname,#self.moves)) +end +function ARTY:RemoveAllTargets() +self:F2() +for _,target in pairs(self.targets)do +self:RemoveTarget(target.name) +end +end +function ARTY:SetShellTypes(tableofnames) +self:F2(tableofnames) +self.ammoshells={} +for _,_type in pairs(tableofnames)do +table.insert(self.ammoshells,_type) +end +return self +end +function ARTY:SetRocketTypes(tableofnames) +self:F2(tableofnames) +self.ammorockets={} +for _,_type in pairs(tableofnames)do +table.insert(self.ammorockets,_type) +end +return self +end +function ARTY:SetMissileTypes(tableofnames) +self:F2(tableofnames) +self.ammomissiles={} +for _,_type in pairs(tableofnames)do +table.insert(self.ammomissiles,_type) +end +return self +end +function ARTY:SetTacNukeShells(n) +self.Nukes=n +return self +end +function ARTY:SetTacNukeWarhead(strength) +self.nukewarhead=strength or 0.075 +self.nukewarhead=self.nukewarhead*1000*1000 +return self +end +function ARTY:SetIlluminationShells(n,power) +self.Nillu=n +self.illuPower=power or 1.0 +self.illuPower=self.illuPower*1000000 +return self +end +function ARTY:SetIlluminationMinMaxAlt(minalt,maxalt) +self.illuMinalt=minalt or 500 +self.illuMaxalt=maxalt or 1000 +if self.illuMinalt>self.illuMaxalt then +self.illuMinalt=self.illuMaxalt +end +return self +end +function ARTY:SetSmokeShells(n,color) +self.Nsmoke=n +self.smokeColor=color or SMOKECOLOR.Red +return self +end +function ARTY:SetTacNukeFires(nfires,range) +self.nukefire=true +self.nukefires=nfires +self.nukerange=range +return self +end +function ARTY:SetMarkAssignmentsOn(key,readonly) +self.markkey=key +self.markallow=true +if readonly==nil then +self.markreadonly=false +end +return self +end +function ARTY:SetMarkTargetsOff() +self.markallow=false +self.markkey=nil +return self +end +function ARTY:onafterStart(Controllable,From,Event,To) +self:_EventFromTo("onafterStart",Event,From,To) +local text=string.format("Started ARTY version %s for group %s.",ARTY.version,Controllable:GetName()) +self:I(self.lid..text) +MESSAGE:New(text,5):ToAllIf(self.Debug) +self.Nammo0,self.Nshells0,self.Nrockets0,self.Nmissiles0,self.Narty0=self:GetAmmo(self.Debug) +if self.nukerange==nil then +self.nukerange=1500/75000*self.nukewarhead +end +if self.nukefires==nil then +self.nukefires=20/1000/1000*self.nukerange*self.nukerange +end +if self.Nukes~=nil then +self.Nukes0=math.min(self.Nukes,self.Nshells0) +else +self.Nukes=0 +self.Nukes0=0 +end +if self.Nillu~=nil then +self.Nillu0=math.min(self.Nillu,self.Nshells0) +else +self.Nillu=0 +self.Nillu0=0 +end +if self.Nsmoke~=nil then +self.Nsmoke0=math.min(self.Nsmoke,self.Nshells0) +else +self.Nsmoke=0 +self.Nsmoke0=0 +end +local _dbproperties=self:_CheckDB(self.Type) +self:T({dbproperties=_dbproperties}) +if _dbproperties~=nil then +for property,value in pairs(_dbproperties)do +self:T({property=property,value=value}) +self[property]=value +end +end +if not self.ismobile then +self.RearmingPlaceCoord=nil +self.relocateafterfire=false +self.autorelocate=false +end +self.Speed=math.min(self.Speed,self.SpeedMax) +if self.RearmingGroup then +local speedmax=self.RearmingGroup:GetSpeedMax() +self:T(self.lid..string.format("%s, rearming group %s max speed = %.1f km/h.",self.groupname,self.RearmingGroup:GetName(),speedmax)) +if self.RearmingGroupSpeed==nil then +self.RearmingGroupSpeed=speedmax*0.5 +else +self.RearmingGroupSpeed=math.min(self.RearmingGroupSpeed,self.RearmingGroup:GetSpeedMax()) +end +else +self.RearmingGroupSpeed=23 +end +local text=string.format("\n******************************************************\n") +text=text..string.format("Arty group = %s\n",self.groupname) +text=text..string.format("Arty alias = %s\n",self.alias) +text=text..string.format("Artillery attribute = %s\n",tostring(self.IsArtillery)) +text=text..string.format("Type = %s\n",self.Type) +text=text..string.format("Display Name = %s\n",self.DisplayName) +text=text..string.format("Number of units = %d\n",self.IniGroupStrength) +text=text..string.format("Speed max = %.1f km/h\n",self.SpeedMax) +text=text..string.format("Speed default = %.1f km/h\n",self.Speed) +text=text..string.format("Is mobile = %s\n",tostring(self.ismobile)) +text=text..string.format("Is cargo = %s\n",tostring(self.iscargo)) +text=text..string.format("Min range = %.1f km\n",self.minrange/1000) +text=text..string.format("Max range = %.1f km\n",self.maxrange/1000) +text=text..string.format("Total ammo count = %d\n",self.Nammo0) +text=text..string.format("Number of shells = %d\n",self.Nshells0) +text=text..string.format("Number of rockets = %d\n",self.Nrockets0) +text=text..string.format("Number of missiles = %d\n",self.Nmissiles0) +text=text..string.format("Number of nukes = %d\n",self.Nukes0) +text=text..string.format("Nuclear warhead = %d tons TNT\n",self.nukewarhead/1000) +text=text..string.format("Nuclear demolition = %d m\n",self.nukerange) +text=text..string.format("Nuclear fires = %d (active=%s)\n",self.nukefires,tostring(self.nukefire)) +text=text..string.format("Number of illum. = %d\n",self.Nillu0) +text=text..string.format("Illuminaton Power = %.3f mcd\n",self.illuPower/1000000) +text=text..string.format("Illuminaton Minalt = %d m\n",self.illuMinalt) +text=text..string.format("Illuminaton Maxalt = %d m\n",self.illuMaxalt) +text=text..string.format("Number of smoke = %d\n",self.Nsmoke0) +text=text..string.format("Smoke color = %d\n",self.smokeColor) +if self.RearmingGroup or self.RearmingPlaceCoord then +text=text..string.format("Rearming safe dist. = %d m\n",self.RearmingDistance) +end +if self.RearmingGroup then +text=text..string.format("Rearming group = %s\n",self.RearmingGroup:GetName()) +text=text..string.format("Rearming group speed= %d km/h\n",self.RearmingGroupSpeed) +text=text..string.format("Rearming group roads= %s\n",tostring(self.RearmingGroupOnRoad)) +end +if self.RearmingPlaceCoord then +local dist=self.InitialCoord:Get2DDistance(self.RearmingPlaceCoord) +text=text..string.format("Rearming coord dist = %d m\n",dist) +text=text..string.format("Rearming ARTY roads = %s\n",tostring(self.RearmingArtyOnRoad)) +end +text=text..string.format("Relocate after fire = %s\n",tostring(self.relocateafterfire)) +text=text..string.format("Relocate min dist. = %d m\n",self.relocateRmin) +text=text..string.format("Relocate max dist. = %d m\n",self.relocateRmax) +text=text..string.format("Auto move in range = %s\n",tostring(self.autorelocate)) +text=text..string.format("Auto move dist. max = %.1f km\n",self.autorelocatemaxdist/1000) +text=text..string.format("Auto move on road = %s\n",tostring(self.autorelocateonroad)) +text=text..string.format("Marker assignments = %s\n",tostring(self.markallow)) +text=text..string.format("Marker auth. key = %s\n",tostring(self.markkey)) +text=text..string.format("Marker readonly = %s\n",tostring(self.markreadonly)) +text=text..string.format("Clusters:\n") +for _,cluster in pairs(self.clusters)do +text=text..string.format("- %s\n",tostring(cluster)) +end +text=text..string.format("******************************************************\n") +text=text..string.format("Targets:\n") +for _,target in pairs(self.targets)do +text=text..string.format("- %s\n",self:_TargetInfo(target)) +local possible=self:_CheckWeaponTypePossible(target) +if not possible then +self:E(self.lid..string.format("WARNING: Selected weapon type %s is not possible",self:_WeaponTypeName(target.weapontype))) +end +if self.Debug then +local zone=ZONE_RADIUS:New(target.name,target.coord:GetVec2(),target.radius) +zone:BoundZone(180,coalition.side.NEUTRAL) +end +end +text=text..string.format("Moves:\n") +for i=1,#self.moves do +text=text..string.format("- %s\n",self:_MoveInfo(self.moves[i])) +end +text=text..string.format("******************************************************\n") +text=text..string.format("Shell types:\n") +for _,_type in pairs(self.ammoshells)do +text=text..string.format("- %s\n",_type) +end +text=text..string.format("Rocket types:\n") +for _,_type in pairs(self.ammorockets)do +text=text..string.format("- %s\n",_type) +end +text=text..string.format("Missile types:\n") +for _,_type in pairs(self.ammomissiles)do +text=text..string.format("- %s\n",_type) +end +text=text..string.format("******************************************************") +if self.Debug then +self:I(self.lid..text) +else +self:T(self.lid..text) +end +self.Controllable:OptionROEHoldFire() +self:HandleEvent(EVENTS.Shot) +self:HandleEvent(EVENTS.Dead) +if self.markallow then +world.addEventHandler(self) +end +self:__Status(self.StatusInterval) +end +function ARTY:_CheckDB(displayname) +for _type,_properties in pairs(ARTY.db)do +self:T({type=_type,properties=_properties}) +if _type==displayname then +self:T({type=_type,properties=_properties}) +return _properties +end +end +return nil +end +function ARTY:_StatusReport(display) +if display==nil then +display=false +end +local Nammo,Nshells,Nrockets,Nmissiles,Narty=self:GetAmmo() +local Nnukes=self.Nukes +local Nillu=self.Nillu +local Nsmoke=self.Nsmoke +local Tnow=timer.getTime() +local Clock=self:_SecondsToClock(timer.getAbsTime()) +local text=string.format("\n******************* STATUS ***************************\n") +text=text..string.format("ARTY group = %s\n",self.groupname) +text=text..string.format("Clock = %s\n",Clock) +text=text..string.format("FSM state = %s\n",self:GetState()) +text=text..string.format("Total ammo count = %d\n",Nammo) +text=text..string.format("Number of shells = %d\n",Narty) +text=text..string.format("Number of rockets = %d\n",Nrockets) +text=text..string.format("Number of missiles = %d\n",Nmissiles) +text=text..string.format("Number of nukes = %d\n",Nnukes) +text=text..string.format("Number of illum. = %d\n",Nillu) +text=text..string.format("Number of smoke = %d\n",Nsmoke) +if self.currentTarget then +text=text..string.format("Current Target = %s\n",tostring(self.currentTarget.name)) +text=text..string.format("Curr. Tgt assigned = %d\n",Tnow-self.currentTarget.Tassigned) +else +text=text..string.format("Current Target = %s\n","none") +end +text=text..string.format("Nshots curr. Target = %d\n",self.Nshots) +text=text..string.format("Targets:\n") +for i=1,#self.targets do +text=text..string.format("- %s\n",self:_TargetInfo(self.targets[i])) +end +if self.currentMove then +text=text..string.format("Current Move = %s\n",tostring(self.currentMove.name)) +else +text=text..string.format("Current Move = %s\n","none") +end +text=text..string.format("Moves:\n") +for i=1,#self.moves do +text=text..string.format("- %s\n",self:_MoveInfo(self.moves[i])) +end +text=text..string.format("******************************************************") +env.info(self.lid..text) +MESSAGE:New(text,20):Clear():ToCoalitionIf(self.coalition,display) +end +function ARTY._FuncTrack(weapon,self,target) +local _coord=weapon.coordinate +local _dist=_coord:Get2DDistance(target.coord) +local _destroyweapon=false +self:T3(self.lid..string.format("ARTY %s weapon to target dist = %d m",self.groupname,_dist)) +if target.weapontype==ARTY.WeaponType.IlluminationShells then +if _dist<target.radius then +local _cr=target.coord:GetRandomCoordinateInRadius(target.radius) +local _alt=_cr:GetLandHeight()+math.random(self.illuMinalt,self.illuMaxalt) +local _ci=COORDINATE:New(_cr.x,_alt,_cr.z) +_ci:IlluminationBomb(self.illuPower) +_destroyweapon=true +end +elseif target.weapontype==ARTY.WeaponType.SmokeShells then +if _dist<target.radius then +local _cr=_coord:GetRandomCoordinateInRadius(_data.target.radius) +_cr:Smoke(self.smokeColor) +_destroyweapon=true +end +end +if _destroyweapon then +self:T2(self.lid..string.format("ARTY %s destroying shell, stopping timer.",self.groupname)) +weapon:Destroy() +weapon.tracking=false +end +end +function ARTY._FuncImpact(weapon,self,target) +self:I(self.lid..string.format("ARTY %s weapon NOT ALIVE any more.",self.groupname)) +local _impactcoord=weapon:GetImpactCoordinate() +if target.weapontype==ARTY.WeaponType.TacticalNukes then +self:T(self.lid..string.format("ARTY %s triggering nuclear explosion in one second.",self.groupname)) +self:ScheduleOnce(1.0,ARTY._NuclearBlast,self,_impactcoord) +end +end +function ARTY:OnEventShot(EventData) +self:F(EventData) +local _weapon=EventData.Weapon:getTypeName() +local _weaponStrArray=self:_split(_weapon,"%.") +local _weaponName=_weaponStrArray[#_weaponStrArray] +self:T3(self.lid.."EVENT SHOT: Ini unit = "..EventData.IniUnitName) +self:T3(self.lid.."EVENT SHOT: Ini group = "..EventData.IniGroupName) +self:T3(self.lid.."EVENT SHOT: Weapon type = ".._weapon) +self:T3(self.lid.."EVENT SHOT: Weapon name = ".._weaponName) +local group=EventData.IniGroup +if group and group:IsAlive()then +if EventData.IniGroupName==self.groupname then +if self.currentTarget then +self.Nshots=self.Nshots+1 +local text=string.format("%s, fired shot %d of %d with weapon %s on target %s.",self.alias,self.Nshots,self.currentTarget.nshells,_weaponName,self.currentTarget.name) +self:T(self.lid..text) +MESSAGE:New(text,5):Clear():ToAllIf(self.report or self.Debug) +local _tracknuke=self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes and self.Nukes>0 +local _trackillu=self.currentTarget.weapontype==ARTY.WeaponType.IlluminationShells and self.Nillu>0 +local _tracksmoke=self.currentTarget.weapontype==ARTY.WeaponType.SmokeShells and self.Nsmoke>0 +if _tracknuke or _trackillu or _tracksmoke then +self:T(self.lid..string.format("ARTY %s: Tracking of weapon starts in two seconds.",self.groupname)) +local weapon=WEAPON:New(EventData.weapon) +weapon:SetTimeStepTrack(self.dtTrack) +local target=UTILS.DeepCopy(self.currentTarget) +weapon:SetFuncTrack(ARTY._FuncTrack,self,target) +weapon:SetFuncImpact(ARTY._FuncImpact,self,target) +weapon:StartTrack(2) +end +local _nammo,_nshells,_nrockets,_nmissiles,_narty=self:GetAmmo() +if self.currentTarget.weapontype==ARTY.WeaponType.TacticalNukes then +self.Nukes=self.Nukes-1 +end +if self.currentTarget.weapontype==ARTY.WeaponType.IlluminationShells then +self.Nillu=self.Nillu-1 +end +if self.currentTarget.weapontype==ARTY.WeaponType.SmokeShells then +self.Nsmoke=self.Nsmoke-1 +end +local _outofammo=false +if _nammo==0 then +self:T(self.lid..string.format("Group %s completely out of ammo.",self.groupname)) +_outofammo=true +end +local _partlyoutofammo=self:_CheckOutOfAmmo({self.currentTarget}) +local _weapontype=self:_WeaponTypeName(self.currentTarget.weapontype) +self:T(self.lid..string.format("Group %s ammo: total=%d, shells=%d, rockets=%d, missiles=%d",self.groupname,_nammo,_narty,_nrockets,_nmissiles)) +self:T(self.lid..string.format("Group %s uses weapontype %s for current target.",self.groupname,_weapontype)) +local _ceasefire=false +local _relocate=false +if self.Nshots>=self.currentTarget.nshells then +local text=string.format("Group %s stop firing on target %s.",self.groupname,self.currentTarget.name) +self:T(self.lid..text) +MESSAGE:New(text,5):ToAllIf(self.Debug) +_ceasefire=true +_relocate=self.relocateafterfire +end +if _outofammo or _partlyoutofammo then +_ceasefire=true +end +if _relocate then +self:_Relocate() +end +if _ceasefire then +self:CeaseFire(self.currentTarget) +end +else +self:E(self.lid..string.format("WARNING: No current target for group %s?!",self.groupname)) +end +end +end +end +function ARTY:onEvent(Event) +if Event==nil or Event.idx==nil then +self:T3("Skipping onEvent. Event or Event.idx unknown.") +return true +end +self:T2(string.format("Event captured = %s",tostring(self.groupname))) +self:T2(string.format("Event id = %s",tostring(Event.id))) +self:T2(string.format("Event time = %s",tostring(Event.time))) +self:T2(string.format("Event idx = %s",tostring(Event.idx))) +self:T2(string.format("Event coalition = %s",tostring(Event.coalition))) +self:T2(string.format("Event group id = %s",tostring(Event.groupID))) +self:T2(string.format("Event text = %s",tostring(Event.text))) +if Event.initiator~=nil then +local _unitname=Event.initiator:getName() +self:T2(string.format("Event ini unit name = %s",tostring(_unitname))) +end +if Event.id==world.event.S_EVENT_MARK_ADDED then +self:T2({event="S_EVENT_MARK_ADDED",battery=self.groupname,vec3=Event.pos}) +elseif Event.id==world.event.S_EVENT_MARK_CHANGE then +self:T({event="S_EVENT_MARK_CHANGE",battery=self.groupname,vec3=Event.pos}) +self:_OnEventMarkChange(Event) +elseif Event.id==world.event.S_EVENT_MARK_REMOVED then +self:T2({event="S_EVENT_MARK_REMOVED",battery=self.groupname,vec3=Event.pos}) +self:_OnEventMarkRemove(Event) +end +end +function ARTY:_OnEventMarkRemove(Event) +local batterycoalition=self.coalition +if Event.text~=nil and Event.text:find("BATTERY")then +local _cancelmove=false +local _canceltarget=false +local _name="" +local _id=nil +if Event.text:find("Marked Relocation")then +_cancelmove=true +_name=self:_MarkMoveName(Event.idx) +_id=self:_GetMoveIndexByName(_name) +elseif Event.text:find("Marked Target")then +_canceltarget=true +_name=self:_MarkTargetName(Event.idx) +_id=self:_GetTargetIndexByName(_name) +else +return +end +if _id==nil then +return +end +if(batterycoalition==Event.coalition and self.markkey==nil)or self.markkey~=nil then +local _validkey=self:_MarkerKeyAuthentification(Event.text) +if _validkey then +if _cancelmove then +if self.currentMove and self.currentMove.name==_name then +self.Controllable:ClearTasks() +self:Arrived() +else +self:RemoveMove(_name) +end +elseif _canceltarget then +if self.currentTarget and self.currentTarget.name==_name then +self:CeaseFire(self.currentTarget) +self:RemoveTarget(_name) +else +self:RemoveTarget(_name) +end +end +end +end +end +end +function ARTY:_OnEventMarkChange(Event) +if Event.text~=nil and Event.text:lower():find("arty")then +local vec3={y=Event.pos.y,x=Event.pos.x,z=Event.pos.z} +local _coord=COORDINATE:NewFromVec3(vec3) +_coord.y=_coord:GetLandHeight() +local batterycoalition=self.coalition +local batteryname=self.groupname +if(batterycoalition==Event.coalition and self.markkey==nil)or self.markkey~=nil then +local _assign=self:_Markertext(Event.text) +if _assign==nil or not(_assign.engage or _assign.move or _assign.request or _assign.cancel or _assign.set)then +self:T(self.lid..string.format("WARNING: %s, no keyword ENGAGE, MOVE, REQUEST, CANCEL or SET in mark text! Command will not be executed. Text:\n%s",self.groupname,Event.text)) +return +end +local _assigned=false +if _assign.everyone then +_assigned=true +else +for _,bat in pairs(_assign.battery)do +if self.groupname==bat then +_assigned=true +end +end +for _,alias in pairs(_assign.aliases)do +if self.alias==alias then +_assigned=true +end +end +for _,bat in pairs(_assign.cluster)do +for _,cluster in pairs(self.clusters)do +if cluster==bat then +_assigned=true +end +end +end +end +if not _assigned then +self:T3(self.lid..string.format("INFO: ARTY group %s was not addressed! Mark text:\n%s",self.groupname,Event.text)) +return +else +if self.Controllable and self.Controllable:IsAlive()then +else +self:T3(self.lid..string.format("INFO: ARTY group %s was addressed but is NOT alive! Mark text:\n%s",self.groupname,Event.text)) +return +end +end +if _assign.coord then +_coord=_assign.coord +end +local _validkey=self:_MarkerKeyAuthentification(Event.text) +if _assign.request and _validkey then +if _assign.requestammo then +self:_MarkRequestAmmo() +end +if _assign.requestmoves then +self:_MarkRequestMoves() +end +if _assign.requesttargets then +self:_MarkRequestTargets() +end +if _assign.requeststatus then +self:_MarkRequestStatus() +end +if _assign.requestrearming then +self:Rearm() +end +return +end +if _assign.cancel and _validkey then +if _assign.cancelmove and self.currentMove then +self.Controllable:ClearTasks() +self:Arrived() +elseif _assign.canceltarget and self.currentTarget then +self.currentTarget.engaged=self.currentTarget.engaged+1 +self:CeaseFire(self.currentTarget) +elseif _assign.cancelrearm and self:is("Rearming")then +local nammo=self:GetAmmo() +if nammo>0 then +self:Rearmed() +else +self:Winchester() +end +end +return +end +if _assign.set and _validkey then +if _assign.setrearmingplace and self.ismobile then +self:SetRearmingPlace(_coord) +_coord:RemoveMark(Event.idx) +_coord:MarkToCoalition(string.format("Rearming place for battery %s",self.groupname),self.coalition,false,string.format("New rearming place for battery %s defined.",self.groupname)) +if self.Debug then +_coord:SmokeOrange() +end +end +if _assign.setrearminggroup then +_coord:RemoveMark(Event.idx) +local rearminggroupcoord=_assign.setrearminggroup:GetCoordinate() +rearminggroupcoord:MarkToCoalition(string.format("Rearming group for battery %s",self.groupname),self.coalition,false,string.format("New rearming group for battery %s defined.",self.groupname)) +self:SetRearmingGroup(_assign.setrearminggroup) +if self.Debug then +rearminggroupcoord:SmokeOrange() +end +end +return +end +if _validkey then +_coord:RemoveMark(Event.idx) +local _id=UTILS._MarkID+1 +if _assign.move then +local _name=self:_MarkMoveName(_id) +local text=string.format("%s, received new relocation assignment.",self.alias) +text=text..string.format("\nCoordinates %s",_coord:ToStringLLDMS()) +MESSAGE:New(text,10):ToCoalitionIf(batterycoalition,self.report or self.Debug) +local _movename=self:AssignMoveCoord(_coord,_assign.time,_assign.speed,_assign.onroad,_assign.movecanceltarget,_name,true) +if _movename~=nil then +local _mid=self:_GetMoveIndexByName(_movename) +local _move=self.moves[_mid] +local clock=tostring(self:_SecondsToClock(_move.time)) +local _markertext=_movename..string.format(", Time=%s, Speed=%d km/h, Use Roads=%s.",clock,_move.speed,tostring(_move.onroad)) +local _randomcoord=_coord:GetRandomCoordinateInRadius(100) +_randomcoord:MarkToCoalition(_markertext,batterycoalition,self.markreadonly or _assign.readonly) +else +local text=string.format("%s, relocation not possible.",self.alias) +MESSAGE:New(text,10):ToCoalitionIf(batterycoalition,self.report or self.Debug) +end +else +local _name=self:_MarkTargetName(_id) +local text=string.format("%s, received new target assignment.",self.alias) +text=text..string.format("\nCoordinates %s",_coord:ToStringLLDMS()) +if _assign.time then +text=text..string.format("\nTime %s",_assign.time) +end +if _assign.prio then +text=text..string.format("\nPrio %d",_assign.prio) +end +if _assign.radius then +text=text..string.format("\nRadius %d m",_assign.radius) +end +if _assign.nshells then +text=text..string.format("\nShots %d",_assign.nshells) +end +if _assign.maxengage then +text=text..string.format("\nEngagements %d",_assign.maxengage) +end +if _assign.weapontype then +text=text..string.format("\nWeapon %s",self:_WeaponTypeName(_assign.weapontype)) +end +MESSAGE:New(text,10):ToCoalitionIf(batterycoalition,self.report or self.Debug) +local _targetname=self:AssignTargetCoord(_coord,_assign.prio,_assign.radius,_assign.nshells,_assign.maxengage,_assign.time,_assign.weapontype,_name,true) +if _targetname~=nil then +local _tid=self:_GetTargetIndexByName(_targetname) +local _target=self.targets[_tid] +local clock=tostring(self:_SecondsToClock(_target.time)) +local weapon=self:_WeaponTypeName(_target.weapontype) +local _markertext=_targetname..string.format(", Priority=%d, Radius=%d m, Shots=%d, Engagements=%d, Weapon=%s, Time=%s",_target.prio,_target.radius,_target.nshells,_target.maxengage,weapon,clock) +local _randomcoord=_coord:GetRandomCoordinateInRadius(250) +_randomcoord:MarkToCoalition(_markertext,batterycoalition,self.markreadonly or _assign.readonly) +end +end +end +end +end +end +function ARTY:OnEventDead(EventData) +self:F(EventData) +local _name=self.groupname +if EventData and EventData.IniGroupName and EventData.IniGroupName==_name then +local unitname=tostring(EventData.IniUnitName) +self:T(self.lid..string.format("%s: Captured dead event for unit %s.",_name,unitname)) +self:Dead(unitname) +end +end +function ARTY:onafterStatus(Controllable,From,Event,To) +self:_EventFromTo("onafterStatus",Event,From,To) +local nammo,nshells,nrockets,nmissiles,narty=self:GetAmmo() +if self.iscargo and self.cargogroup then +if self.cargogroup:IsLoaded()and not self:is("InTransit")then +self:T(self.lid..string.format("Group %s has been loaded into a carrier and is now transported.",self.alias)) +self:Loaded() +elseif self.cargogroup:IsUnLoaded()then +self:T(self.lid..string.format("Group %s has been unloaded from the carrier.",self.alias)) +self:UnLoaded() +end +end +local fsmstate=self:GetState() +self:T(self.lid..string.format("Status %s, Ammo total=%d: shells=%d [smoke=%d, illu=%d, nukes=%d*%.3f kT], rockets=%d, missiles=%d",fsmstate,nammo,narty,self.Nsmoke,self.Nillu,self.Nukes,self.nukewarhead/1000000,nrockets,nmissiles)) +if self.Controllable and self.Controllable:IsAlive()then +if self.Debug then +self:_StatusReport() +end +if self:is("Moving")then +self:T2(self.lid..string.format("%s: Moving",Controllable:GetName())) +end +if self:is("Rearming")then +local _rearmed=self:_CheckRearmed() +if _rearmed then +self:T2(self.lid..string.format("%s: Rearming ==> Rearmed",Controllable:GetName())) +self:Rearmed() +end +end +if self:is("Rearmed")then +local distance=self.Controllable:GetCoordinate():Get2DDistance(self.InitialCoord) +self:T2(self.lid..string.format("%s: Rearmed. Distance ARTY to InitalCoord = %d m",Controllable:GetName(),distance)) +if distance<=self.RearmingDistance then +self:T2(self.lid..string.format("%s: Rearmed ==> CombatReady",Controllable:GetName())) +self:CombatReady() +end +end +if self:is("Arrived")then +self:T2(self.lid..string.format("%s: Arrived ==> CombatReady",Controllable:GetName())) +self:CombatReady() +end +if self:is("Firing")then +self:_CheckShootingStarted() +end +self:_CheckTargetsInRange() +local notpossible={} +for i=1,#self.targets do +local _target=self.targets[i] +local possible=self:_CheckWeaponTypePossible(_target) +if not possible then +table.insert(notpossible,_target.name) +end +end +for _,targetname in pairs(notpossible)do +self:E(self.lid..string.format("%s: Removing target %s because requested weapon is not possible with this type of unit.",self.groupname,targetname)) +self:RemoveTarget(targetname) +end +local _timedTarget=self:_CheckTimedTargets() +local _normalTarget=self:_CheckNormalTargets() +local _move=self:_CheckMoves() +if _move then +self:Move(_move) +elseif _timedTarget then +if self.currentTarget then +self:CeaseFire(self.currentTarget) +end +if self:is("CombatReady")then +self:OpenFire(_timedTarget) +end +elseif _normalTarget then +if self:is("CombatReady")then +self:OpenFire(_normalTarget) +end +end +local gotsome=false +if#self.targets>0 then +for i=1,#self.targets do +local _target=self.targets[i] +if self:_CheckWeaponTypeAvailable(_target)>0 then +gotsome=true +end +end +else +gotsome=true +end +if(nammo==0 or not gotsome)and not(self:is("Moving")or self:is("Rearming")or self:is("OutOfAmmo"))then +self:Winchester() +end +if self:is("OutOfAmmo")then +self:T2(self.lid..string.format("%s: OutOfAmmo ==> Rearm ==> Rearming",Controllable:GetName())) +self:Rearm() +end +self:__Status(self.StatusInterval) +elseif self.iscargo then +if self.cargogroup and self.cargogroup:IsAlive()then +if self:is("InTransit")then +self:__Status(-5) +end +end +else +self:E(self.lid..string.format("Arty group %s is not alive!",self.groupname)) +end +end +function ARTY:onbeforeLoaded(Controllable,From,Event,To) +if self.currentTarget then +self:CeaseFire(self.currentTarget) +end +return true +end +function ARTY:onafterUnLoaded(Controllable,From,Event,To) +self:CombatReady() +end +function ARTY:onenterCombatReady(Controllable,From,Event,To) +self:_EventFromTo("onenterCombatReady",Event,From,To) +self:T3(self.lid..string.format("onenterComabReady, from=%s, event=%s, to=%s",From,Event,To)) +end +function ARTY:onbeforeOpenFire(Controllable,From,Event,To,target) +self:_EventFromTo("onbeforeOpenFire",Event,From,To) +if self.currentTarget then +self:E(self.lid..string.format("ERROR: Group %s already has a target %s!",self.groupname,self.currentTarget.name)) +return false +end +if not self:_TargetInRange(target)then +self:E(self.lid..string.format("ERROR: Group %s, target %s is out of range!",self.groupname,self.currentTarget.name)) +return false +end +local nfire=self:_CheckWeaponTypeAvailable(target) +target.nshells=math.min(target.nshells,nfire) +if target.nshells<1 then +local text=string.format("%s, no ammo left to engage target %s with selected weapon type %s.") +return false +end +return true +end +function ARTY:onafterOpenFire(Controllable,From,Event,To,target) +self:_EventFromTo("onafterOpenFire",Event,From,To) +local id=self:_GetTargetIndexByName(target.name) +if id then +self.targets[id].underfire=true +self.currentTarget=target +self.currentTarget.Tassigned=timer.getTime() +end +local range=Controllable:GetCoordinate():Get2DDistance(target.coord) +local Nammo,Nshells,Nrockets,Nmissiles,Narty=self:GetAmmo() +local nfire=Narty +local _type="shots" +if target.weapontype==ARTY.WeaponType.Auto then +nfire=Nammo +_type="shots" +elseif target.weapontype==ARTY.WeaponType.Cannon then +nfire=Narty +_type="shells" +elseif target.weapontype==ARTY.WeaponType.TacticalNukes then +nfire=self.Nukes +_type="nuclear shells" +elseif target.weapontype==ARTY.WeaponType.IlluminationShells then +nfire=self.Nillu +_type="illumination shells" +elseif target.weapontype==ARTY.WeaponType.SmokeShells then +nfire=self.Nsmoke +_type="smoke shells" +elseif target.weapontype==ARTY.WeaponType.Rockets then +nfire=Nrockets +_type="rockets" +elseif target.weapontype==ARTY.WeaponType.CruiseMissile then +nfire=Nmissiles +_type="cruise missiles" +end +target.nshells=math.min(target.nshells,nfire) +local text=string.format("%s, opening fire on target %s with %d %s. Distance %.1f km.",Controllable:GetName(),target.name,target.nshells,_type,range/1000) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report) +if target.attackgroup then +self:_AttackGroup(target) +else +self:_FireAtCoord(target.coord,target.radius,target.nshells,target.weapontype) +end +end +function ARTY:onafterCeaseFire(Controllable,From,Event,To,target) +self:_EventFromTo("onafterCeaseFire",Event,From,To) +if target then +local text=string.format("%s, ceasing fire on target %s.",Controllable:GetName(),target.name) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report) +local id=self:_GetTargetIndexByName(target.name) +if id then +if self.Nshots>0 then +self.targets[id].engaged=self.targets[id].engaged+1 +self.targets[id].time=nil +end +self.targets[id].underfire=false +end +if target.engaged>=target.maxengage then +self:RemoveTarget(target.name) +end +self.Controllable:OptionROEHoldFire() +self.Controllable:ClearTasks() +else +self:E(self.lid..string.format("ERROR: No target in cease fire for group %s.",self.groupname)) +end +self.Nshots=0 +self.currentTarget=nil +end +function ARTY:onafterWinchester(Controllable,From,Event,To) +self:_EventFromTo("onafterWinchester",Event,From,To) +local text=string.format("%s, winchester!",Controllable:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +end +function ARTY:onbeforeRearm(Controllable,From,Event,To) +self:_EventFromTo("onbeforeRearm",Event,From,To) +local _rearmed=self:_CheckRearmed() +if _rearmed then +self:T(self.lid..string.format("%s, group is already armed to the teeth. Rearming request denied!",self.groupname)) +return false +else +self:T(self.lid..string.format("%s, group might be rearmed.",self.groupname)) +end +if self.RearmingGroup and self.RearmingGroup:IsAlive()then +return true +elseif self.RearmingPlaceCoord then +return true +else +return false +end +end +function ARTY:onafterRearm(Controllable,From,Event,To) +self:_EventFromTo("onafterRearm",Event,From,To) +local coordARTY=self.Controllable:GetCoordinate() +self.InitialCoord=coordARTY +local coordRARM=nil +if self.RearmingGroup then +coordRARM=self.RearmingGroup:GetCoordinate() +self.RearmingGroupCoord=coordRARM +end +if self.RearmingGroup and self.RearmingPlaceCoord and self.ismobile then +local text=string.format("%s, %s, request rearming at rearming place.",Controllable:GetName(),self.RearmingGroup:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +local dA=coordARTY:Get2DDistance(self.RearmingPlaceCoord) +local dR=coordRARM:Get2DDistance(self.RearmingPlaceCoord) +if dA>self.RearmingDistance then +local _tocoord=self:_VicinityCoord(self.RearmingPlaceCoord,self.RearmingDistance/4,self.RearmingDistance/2) +self:AssignMoveCoord(_tocoord,nil,nil,self.RearmingArtyOnRoad,false,"REARMING MOVE TO REARMING PLACE",true) +end +if dR>self.RearmingDistance then +local ToCoord=self:_VicinityCoord(self.RearmingPlaceCoord,self.RearmingDistance/4,self.RearmingDistance/2) +self:_Move(self.RearmingGroup,ToCoord,self.RearmingGroupSpeed,self.RearmingGroupOnRoad) +end +elseif self.RearmingGroup then +local text=string.format("%s, %s, request rearming.",Controllable:GetName(),self.RearmingGroup:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +local distance=coordARTY:Get2DDistance(coordRARM) +if distance>self.RearmingDistance then +self:_Move(self.RearmingGroup,self:_VicinityCoord(coordARTY),self.RearmingGroupSpeed,self.RearmingGroupOnRoad) +end +elseif self.RearmingPlaceCoord then +local text=string.format("%s, moving to rearming place.",Controllable:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +local dA=coordARTY:Get2DDistance(self.RearmingPlaceCoord) +if dA>self.RearmingDistance then +local _tocoord=self:_VicinityCoord(self.RearmingPlaceCoord) +self:AssignMoveCoord(_tocoord,nil,nil,self.RearmingArtyOnRoad,false,"REARMING MOVE TO REARMING PLACE",true) +end +end +end +function ARTY:onafterRearmed(Controllable,From,Event,To) +self:_EventFromTo("onafterRearmed",Event,From,To) +local text=string.format("%s, rearming complete.",Controllable:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +self.Nukes=self.Nukes0 +self.Nillu=self.Nillu0 +self.Nsmoke=self.Nsmoke0 +local dist=self.Controllable:GetCoordinate():Get2DDistance(self.InitialCoord) +if dist>self.RearmingDistance then +self:AssignMoveCoord(self.InitialCoord,nil,nil,self.RearmingArtyOnRoad,false,"REARMING MOVE REARMING COMPLETE",true) +end +if self.RearmingGroup and self.RearmingGroup:IsAlive()then +local d=self.RearmingGroup:GetCoordinate():Get2DDistance(self.RearmingGroupCoord) +if d>self.RearmingDistance then +self:_Move(self.RearmingGroup,self.RearmingGroupCoord,self.RearmingGroupSpeed,self.RearmingGroupOnRoad) +else +self.RearmingGroup:ClearTasks() +end +end +end +function ARTY:_CheckRearmed() +self:F2() +local nammo,nshells,nrockets,nmissiles,narty=self:GetAmmo() +local units=self.Controllable:GetUnits() +local nunits=0 +if units then +nunits=#units +end +local FullAmmo=self.Nammo0*nunits/self.IniGroupStrength +local _rearmpc=nammo/FullAmmo*100 +if _rearmpc>1 then +local text=string.format("%s, rearming %d %% complete.",self.alias,_rearmpc) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +end +if nammo>=FullAmmo then +return true +else +return false +end +end +function ARTY:onbeforeMove(Controllable,From,Event,To,move) +self:_EventFromTo("onbeforeMove",Event,From,To) +if not self.ismobile then +return false +end +if self.currentTarget then +if move.cancel then +self:CeaseFire(self.currentTarget) +else +return false +end +end +return true +end +function ARTY:onafterMove(Controllable,From,Event,To,move) +self:_EventFromTo("onafterMove",Event,From,To) +self.Controllable:OptionAlarmStateGreen() +self.Controllable:OptionROEHoldFire() +local _Speed=math.min(move.speed,self.SpeedMax) +if self.Debug then +move.coord:SmokeRed() +end +self.currentMove=move +self:_Move(self.Controllable,move.coord,move.speed,move.onroad) +end +function ARTY:onafterArrived(Controllable,From,Event,To) +self:_EventFromTo("onafterArrived",Event,From,To) +self.Controllable:OptionAlarmStateAuto() +local text=string.format("%s, arrived at destination.",Controllable:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +if self.currentMove then +self:RemoveMove(self.currentMove.name) +self.currentMove=nil +end +end +function ARTY:onafterNewTarget(Controllable,From,Event,To,target) +self:_EventFromTo("onafterNewTarget",Event,From,To) +local text=string.format("Adding new target %s.",target.name) +MESSAGE:New(text,5):ToAllIf(self.Debug) +self:T(self.lid..text) +end +function ARTY:onafterNewMove(Controllable,From,Event,To,move) +self:_EventFromTo("onafterNewTarget",Event,From,To) +local text=string.format("Adding new move %s.",move.name) +MESSAGE:New(text,5):ToAllIf(self.Debug) +self:T(self.lid..text) +end +function ARTY:onafterDead(Controllable,From,Event,To,Unitname) +self:_EventFromTo("onafterDead",Event,From,To) +local nunits=self.Controllable:CountAliveUnits() +local text=string.format("%s, our unit %s just died! %d units left.",self.groupname,Unitname,nunits) +MESSAGE:New(text,5):ToAllIf(self.Debug) +self:I(self.lid..text) +if nunits==0 then +if self.currentTarget then +self:CeaseFire(self.currentTarget) +end +if self.respawnafterdeath then +if not self.respawning then +self.respawning=true +self:__Respawn(self.respawndelay or 1) +end +else +self:Stop() +end +end +end +function ARTY:onafterRespawn(Controllable,From,Event,To) +self:_EventFromTo("onafterRespawn",Event,From,To) +self:I("Respawning arty group") +local group=self.Controllable +self.Controllable=group:Respawn() +self.respawning=false +self:__Status(-1) +end +function ARTY:onafterStop(Controllable,From,Event,To) +self:_EventFromTo("onafterStop",Event,From,To) +self:I(self.lid..string.format("Stopping ARTY FSM for group %s.",tostring(Controllable:GetName()))) +if self.currentTarget then +self:CeaseFire(self.currentTarget) +end +self:UnHandleEvent(EVENTS.Shot) +self:UnHandleEvent(EVENTS.Dead) +end +function ARTY:_FireAtCoord(coord,radius,nshells,weapontype) +self:F({coord=coord,radius=radius,nshells=nshells}) +local group=self.Controllable +if weapontype==ARTY.WeaponType.TacticalNukes or weapontype==ARTY.WeaponType.IlluminationShells or weapontype==ARTY.WeaponType.SmokeShells then +weapontype=ARTY.WeaponType.Cannon +end +if group:HasTask()then +group:ClearTasks() +end +group:OptionROEOpenFire() +local vec2=coord:GetVec2() +local fire=group:TaskFireAtPoint(vec2,radius,nshells,weapontype) +group:SetTask(fire,1) +end +function ARTY:_AttackGroup(target) +local group=self.Controllable +local weapontype=target.weapontype +if weapontype==ARTY.WeaponType.TacticalNukes or weapontype==ARTY.WeaponType.IlluminationShells or weapontype==ARTY.WeaponType.SmokeShells then +weapontype=ARTY.WeaponType.Cannon +end +if group:HasTask()then +group:ClearTasks() +end +group:OptionROEOpenFire() +local targetgroup=GROUP:FindByName(target.name) +local fire=group:TaskAttackGroup(targetgroup,weapontype,AI.Task.WeaponExpend.ONE,1) +group:SetTask(fire,1) +end +function ARTY:_NuclearBlast(_coord) +local S0=self.nukewarhead +local R0=self.nukerange +local N0=self.nukefires +_coord:Explosion(S0) +_coord:BigSmokeAndFireHuge() +local _fires={} +for i=1,N0 do +local _fire=_coord:GetRandomCoordinateInRadius(R0) +local _dist=_fire:Get2DDistance(_coord) +table.insert(_fires,{distance=_dist,coord=_fire}) +end +local _sort=function(a,b)return a.distance<b.distance end +table.sort(_fires,_sort) +local function _explosion(R) +local alpha=math.log(100) +local strength=S0*math.exp(-alpha*R/R0) +self:T2(self.lid..string.format("Nuclear explosion strength s(%.1f m) = %.5f (s/s0=%.1f %%), alpha=%.3f",R,strength,strength/S0*100,alpha)) +return strength +end +local function ignite(_fires) +for _,fire in pairs(_fires)do +local _fire=fire.coord +local R=_fire:Get2DDistance(_coord) +local S=_explosion(R) +self:T2(self.lid..string.format("Explosion r=%.1f, s=%.3f",R,S)) +local _preset=math.random(0,7) +local _density=S/S0 +_fire:BigSmokeAndFire(_preset,_density) +_fire:Explosion(S) +end +end +if self.nukefire==true then +ignite(_fires) +end +end +function ARTY:_Move(group,ToCoord,Speed,OnRoad) +self:F2({group=group:GetName(),Speed=Speed,OnRoad=OnRoad}) +group:ClearTasks() +group:OptionAlarmStateGreen() +group:OptionROEHoldFire() +local formation="Off Road" +local SpeedMax=group:GetSpeedMax() +Speed=Speed or SpeedMax*0.7 +Speed=math.min(Speed,SpeedMax) +local cpini=group:GetCoordinate() +local dist=cpini:Get2DDistance(ToCoord) +local path={} +local task={} +path[#path+1]=cpini:WaypointGround(Speed,formation) +task[#task+1]=group:TaskFunction("ARTY._PassingWaypoint",self,#path-1,false) +if OnRoad then +local _pathonroad=cpini:GetPathOnRoad(ToCoord) +if _pathonroad then +local _first=_pathonroad[1] +local _last=_pathonroad[#_pathonroad] +if self.Debug then +_first:SmokeGreen() +_last:SmokeGreen() +end +path[#path+1]=_first:WaypointGround(Speed,"On Road") +task[#task+1]=group:TaskFunction("ARTY._PassingWaypoint",self,#path-1,false) +path[#path+1]=_last:WaypointGround(Speed,"On Road") +task[#task+1]=group:TaskFunction("ARTY._PassingWaypoint",self,#path-1,false) +end +end +path[#path+1]=ToCoord:WaypointGround(Speed,formation) +task[#task+1]=group:TaskFunction("ARTY._PassingWaypoint",self,#path-1,true) +local Waypoints={} +for i=1,#path do +table.insert(Waypoints,i,path[i]) +end +for i=1,#Waypoints do +group:SetTaskWaypoint(Waypoints[i],task[i]) +end +group:Route(Waypoints) +end +function ARTY._PassingWaypoint(group,arty,i,final) +if group and group:IsAlive()then +local groupname=tostring(group:GetName()) +local text=string.format("%s, passing waypoint %d.",groupname,i) +if final then +text=string.format("%s, arrived at destination.",groupname) +end +arty:T(arty.lid..text) +if final and arty.groupname==groupname then +arty:Arrived() +end +end +end +function ARTY:_Relocate() +local _pos=self.Controllable:GetCoordinate() +local _new=nil +local _gotit=false +local _n=0 +local _nmax=1000 +repeat +_new=_pos:GetRandomCoordinateInRadius(self.relocateRmax,self.relocateRmin) +local _surface=_new:GetSurfaceType() +if _surface~=land.SurfaceType.WATER and _surface~=land.SurfaceType.SHALLOW_WATER then +_gotit=true +end +_n=_n+1 +until _gotit or _n>_nmax +if _gotit then +self:AssignMoveCoord(_new,nil,nil,false,false,"RELOCATION MOVE AFTER FIRING") +end +end +function ARTY:GetAmmo(display) +self:F3({display=display}) +if display==nil then +display=false +end +local nammo=0 +local nshells=0 +local nrockets=0 +local nmissiles=0 +local nartyshells=0 +local units=self.Controllable:GetUnits() +if units==nil then +return nammo,nshells,nrockets,nmissiles +end +for _,_unit in pairs(units)do +local unit=_unit +if unit then +local text=string.format("ARTY group %s - unit %s:\n",self.groupname,unit:GetName()) +local ammotable=unit:GetAmmo() +if ammotable~=nil then +local weapons=#ammotable +if display then +self:I(self.lid..string.format("Number of weapons %d.",weapons)) +self:I({ammotable=ammotable}) +self:I(self.lid.."Ammotable:") +for id,bla in pairs(ammotable)do +self:I({id=id,ammo=bla}) +end +end +for w=1,weapons do +local Nammo=ammotable[w]["count"] +local Tammo=ammotable[w]["desc"]["typeName"] +local _weaponString=self:_split(Tammo,"%.") +local _weaponName=_weaponString[#_weaponString] +local Category=ammotable[w].desc.category +local MissileCategory=nil +if Category==Weapon.Category.MISSILE then +MissileCategory=ammotable[w].desc.missileCategory +end +local _gotshell=false +if#self.ammoshells>0 then +for _,_type in pairs(self.ammoshells)do +if string.match(Tammo,_type)and Category==Weapon.Category.SHELL then +_gotshell=true +end +end +else +if Category==Weapon.Category.SHELL then +_gotshell=true +end +end +local _gotrocket=false +if#self.ammorockets>0 then +for _,_type in pairs(self.ammorockets)do +if string.match(Tammo,_type)and Category==Weapon.Category.ROCKET then +_gotrocket=true +end +end +else +if Category==Weapon.Category.ROCKET then +_gotrocket=true +end +end +local _gotmissile=false +if#self.ammomissiles>0 then +for _,_type in pairs(self.ammomissiles)do +if string.match(Tammo,_type)and Category==Weapon.Category.MISSILE then +_gotmissile=true +end +end +else +if Category==Weapon.Category.MISSILE then +_gotmissile=true +end +end +if _gotshell then +nshells=nshells+Nammo +local _,_,_,_,_,shells=unit:GetAmmunition() +nartyshells=nartyshells+shells +text=text..string.format("- %d shells of type %s\n",Nammo,_weaponName) +elseif _gotrocket then +nrockets=nrockets+Nammo +text=text..string.format("- %d rockets of type %s\n",Nammo,_weaponName) +elseif _gotmissile then +if MissileCategory==Weapon.MissileCategory.CRUISE then +nmissiles=nmissiles+Nammo +end +text=text..string.format("- %d %s missiles of type %s\n",Nammo,self:_MissileCategoryName(MissileCategory),_weaponName) +else +text=text..string.format("- %d unknown ammo of type %s (category=%d, missile category=%s)\n",Nammo,Tammo,Category,tostring(MissileCategory)) +end +end +end +if display then +self:I(self.lid..text) +else +self:T3(self.lid..text) +end +MESSAGE:New(text,10):ToAllIf(display) +end +end +nammo=nshells+nrockets+nmissiles +return nammo,nshells,nrockets,nmissiles,nartyshells +end +function ARTY:_MissileCategoryName(categorynumber) +local cat="unknown" +if categorynumber==Weapon.MissileCategory.AAM then +cat="air-to-air" +elseif categorynumber==Weapon.MissileCategory.SAM then +cat="surface-to-air" +elseif categorynumber==Weapon.MissileCategory.BM then +cat="ballistic" +elseif categorynumber==Weapon.MissileCategory.ANTI_SHIP then +cat="anti-ship" +elseif categorynumber==Weapon.MissileCategory.CRUISE then +cat="cruise" +elseif categorynumber==Weapon.MissileCategory.OTHER then +cat="other" +end +return cat +end +function ARTY:_MarkerKeyAuthentification(text) +local batterycoalition=self.coalition +local mykey=nil +if self.markkey~=nil then +local keywords=self:_split(text,",") +for _,key in pairs(keywords)do +local s=self:_split(key," ") +local val=s[2] +if key:lower():find("key")then +mykey=tonumber(val) +self:T(self.lid..string.format("Authorisation Key=%s.",val)) +end +end +end +local _validkey=true +if self.markkey~=nil then +_validkey=false +if mykey~=nil then +_validkey=self.markkey==mykey +end +self:T2(self.lid..string.format("%s, authkey=%s == %s=playerkey ==> valid=%s",self.groupname,tostring(self.markkey),tostring(mykey),tostring(_validkey))) +local text="" +if mykey==nil then +text=string.format("%s, authorization required but did not receive a key!",self.alias) +elseif _validkey==false then +text=string.format("%s, authorization required but did receive an incorrect key (key=%s)!",self.alias,tostring(mykey)) +elseif _validkey==true then +text=string.format("%s, authentification successful!",self.alias) +end +MESSAGE:New(text,10):ToCoalitionIf(batterycoalition,self.report or self.Debug) +end +return _validkey +end +function ARTY:_Markertext(text) +self:F(text) +local assignment={} +assignment.battery={} +assignment.aliases={} +assignment.cluster={} +assignment.everyone=false +assignment.move=false +assignment.engage=false +assignment.request=false +assignment.cancel=false +assignment.set=false +assignment.readonly=false +assignment.movecanceltarget=false +assignment.cancelmove=false +assignment.canceltarget=false +assignment.cancelrearm=false +assignment.setrearmingplace=false +assignment.setrearminggroup=false +if text:lower():find("arty engage")or text:lower():find("arty attack")then +assignment.engage=true +elseif text:lower():find("arty move")or text:lower():find("arty relocate")then +assignment.move=true +elseif text:lower():find("arty request")then +assignment.request=true +elseif text:lower():find("arty cancel")then +assignment.cancel=true +elseif text:lower():find("arty set")then +assignment.set=true +else +self:E(self.lid..'ERROR: Neither "ARTY ENGAGE" nor "ARTY MOVE" nor "ARTY RELOCATE" nor "ARTY REQUEST" nor "ARTY CANCEL" nor "ARTY SET" keyword specified!') +return nil +end +local keywords=self:_split(text,",") +self:T({keywords=keywords}) +for _,keyphrase in pairs(keywords)do +local str=self:_split(keyphrase," ") +local key=str[1] +local val=str[2] +self:T3(self.lid..string.format("%s, keyphrase = %s, key = %s, val = %s",self.groupname,tostring(keyphrase),tostring(key),tostring(val))) +if key:lower():find("battery")then +local v=self:_split(keyphrase,'"') +for i=2,#v,2 do +table.insert(assignment.battery,v[i]) +self:T2(self.lid..string.format("Key Battery=%s.",v[i])) +end +elseif key:lower():find("alias")then +local v=self:_split(keyphrase,'"') +for i=2,#v,2 do +table.insert(assignment.aliases,v[i]) +self:T2(self.lid..string.format("Key Aliases=%s.",v[i])) +end +elseif key:lower():find("cluster")then +local v=self:_split(keyphrase,'"') +for i=2,#v,2 do +table.insert(assignment.cluster,v[i]) +self:T2(self.lid..string.format("Key Cluster=%s.",v[i])) +end +elseif keyphrase:lower():find("everyone")or keyphrase:lower():find("all batteries")or keyphrase:lower():find("allbatteries")then +assignment.everyone=true +self:T(self.lid..string.format("Key Everyone=true.")) +elseif keyphrase:lower():find("irrevocable")or keyphrase:lower():find("readonly")then +assignment.readonly=true +self:T2(self.lid..string.format("Key Readonly=true.")) +elseif(assignment.engage or assignment.move)and key:lower():find("time")then +if val:lower():find("now")then +assignment.time=self:_SecondsToClock(timer.getTime0()+2) +else +assignment.time=val +end +self:T2(self.lid..string.format("Key Time=%s.",val)) +elseif assignment.engage and key:lower():find("shot")then +assignment.nshells=tonumber(val) +self:T(self.lid..string.format("Key Shot=%s.",val)) +elseif assignment.engage and key:lower():find("prio")then +assignment.prio=tonumber(val) +self:T2(string.format("Key Prio=%s.",val)) +elseif assignment.engage and key:lower():find("maxengage")then +assignment.maxengage=tonumber(val) +self:T2(self.lid..string.format("Key Maxengage=%s.",val)) +elseif assignment.engage and key:lower():find("radius")then +assignment.radius=tonumber(val) +self:T2(self.lid..string.format("Key Radius=%s.",val)) +elseif assignment.engage and key:lower():find("weapon")then +if val:lower():find("cannon")then +assignment.weapontype=ARTY.WeaponType.Cannon +elseif val:lower():find("rocket")then +assignment.weapontype=ARTY.WeaponType.Rockets +elseif val:lower():find("missile")then +assignment.weapontype=ARTY.WeaponType.CruiseMissile +elseif val:lower():find("nuke")then +assignment.weapontype=ARTY.WeaponType.TacticalNukes +elseif val:lower():find("illu")then +assignment.weapontype=ARTY.WeaponType.IlluminationShells +elseif val:lower():find("smoke")then +assignment.weapontype=ARTY.WeaponType.SmokeShells +else +assignment.weapontype=ARTY.WeaponType.Auto +end +self:T2(self.lid..string.format("Key Weapon=%s.",val)) +elseif(assignment.move or assignment.set)and key:lower():find("speed")then +assignment.speed=tonumber(val) +self:T2(self.lid..string.format("Key Speed=%s.",val)) +elseif(assignment.move or assignment.set)and(keyphrase:lower():find("on road")or keyphrase:lower():find("onroad")or keyphrase:lower():find("use road"))then +assignment.onroad=true +self:T2(self.lid..string.format("Key Onroad=true.")) +elseif assignment.move and(keyphrase:lower():find("cancel target")or keyphrase:lower():find("canceltarget"))then +assignment.movecanceltarget=true +self:T2(self.lid..string.format("Key Cancel Target (before move)=true.")) +elseif assignment.request and keyphrase:lower():find("rearm")then +assignment.requestrearming=true +self:T2(self.lid..string.format("Key Request Rearming=true.")) +elseif assignment.request and keyphrase:lower():find("ammo")then +assignment.requestammo=true +self:T2(self.lid..string.format("Key Request Ammo=true.")) +elseif assignment.request and keyphrase:lower():find("target")then +assignment.requesttargets=true +self:T2(self.lid..string.format("Key Request Targets=true.")) +elseif assignment.request and keyphrase:lower():find("status")then +assignment.requeststatus=true +self:T2(self.lid..string.format("Key Request Status=true.")) +elseif assignment.request and(keyphrase:lower():find("move")or keyphrase:lower():find("relocation"))then +assignment.requestmoves=true +self:T2(self.lid..string.format("Key Request Moves=true.")) +elseif assignment.cancel and(keyphrase:lower():find("engagement")or keyphrase:lower():find("attack")or keyphrase:lower():find("target"))then +assignment.canceltarget=true +self:T2(self.lid..string.format("Key Cancel Target=true.")) +elseif assignment.cancel and(keyphrase:lower():find("move")or keyphrase:lower():find("relocation"))then +assignment.cancelmove=true +self:T2(self.lid..string.format("Key Cancel Move=true.")) +elseif assignment.cancel and keyphrase:lower():find("rearm")then +assignment.cancelrearm=true +self:T2(self.lid..string.format("Key Cancel Rearm=true.")) +elseif assignment.set and keyphrase:lower():find("rearming place")then +assignment.setrearmingplace=true +self:T(self.lid..string.format("Key Set Rearming Place=true.")) +elseif assignment.set and keyphrase:lower():find("rearming group")then +local v=self:_split(keyphrase,'"') +local groupname=v[2] +local group=GROUP:FindByName(groupname) +if group and group:IsAlive()then +assignment.setrearminggroup=group +end +self:T2(self.lid..string.format("Key Set Rearming Group = %s.",tostring(groupname))) +elseif key:lower():find("lldms")then +local _flat="%d+:%d+:%d+%s*[N,S]" +local _flon="%d+:%d+:%d+%s*[W,E]" +local _lat=keyphrase:match(_flat) +local _lon=keyphrase:match(_flon) +self:T2(self.lid..string.format("Key LLDMS: lat=%s, long=%s format=DMS",_lat,_lon)) +if _lat and _lon then +local _latitude,_longitude=self:_LLDMS2DD(_lat,_lon) +self:T2(self.lid..string.format("Key LLDMS: lat=%.3f, long=%.3f format=DD",_latitude,_longitude)) +if _latitude and _longitude then +assignment.coord=COORDINATE:NewFromLLDD(_latitude,_longitude) +end +end +end +end +return assignment +end +function ARTY:_MarkRequestAmmo() +self:GetAmmo(true) +end +function ARTY:_MarkRequestStatus() +self:_StatusReport(true) +end +function ARTY:_MarkRequestMoves() +local text=string.format("%s, relocations:",self.groupname) +if#self.moves>0 then +for _,move in pairs(self.moves)do +if self.currentMove and move.name==self.currentMove.name then +text=text..string.format("\n- %s (current)",self:_MoveInfo(move)) +else +text=text..string.format("\n- %s",self:_MoveInfo(move)) +end +end +else +text=text..string.format("\n- no queued relocations") +end +MESSAGE:New(text,20):Clear():ToCoalition(self.coalition) +end +function ARTY:_MarkRequestTargets() +local text=string.format("%s, targets:",self.groupname) +if#self.targets>0 then +for _,target in pairs(self.targets)do +if self.currentTarget and target.name==self.currentTarget.name then +text=text..string.format("\n- %s (current)",self:_TargetInfo(target)) +else +text=text..string.format("\n- %s",self:_TargetInfo(target)) +end +end +else +text=text..string.format("\n- no queued targets") +end +MESSAGE:New(text,20):Clear():ToCoalition(self.coalition) +end +function ARTY:_MarkTargetName(markerid) +return string.format("BATTERY=%s, Marked Target ID=%d",self.groupname,markerid) +end +function ARTY:_MarkMoveName(markerid) +return string.format("BATTERY=%s, Marked Relocation ID=%d",self.groupname,markerid) +end +function ARTY:_GetMarkIDfromName(name) +local keywords=self:_split(name,",") +local battery=nil +local markTID=nil +local markMID=nil +for _,key in pairs(keywords)do +local str=self:_split(key,"=") +local par=str[1] +local val=str[2] +if par:find("BATTERY")then +battery=val +end +if par:find("Marked Target ID")then +markTID=tonumber(val) +end +if par:find("Marked Relocation ID")then +markMID=tonumber(val) +end +end +return battery,markTID,markMID +end +function ARTY:_SortTargetQueuePrio() +self:F2() +local function _sort(a,b) +return(a.engaged<b.engaged)or(a.engaged==b.engaged and a.prio<b.prio) +end +table.sort(self.targets,_sort) +self:T3(self.lid.."Sorted targets wrt prio and number of engagements:") +for i=1,#self.targets do +local _target=self.targets[i] +self:T3(self.lid..string.format("Target %s",self:_TargetInfo(_target))) +end +end +function ARTY:_SortQueueTime(queue) +self:F3({queue=queue}) +local function _sort(a,b) +if a.time==nil and b.time==nil then +return false +end +if a.time==nil then +return false +end +if b.time==nil then +return true +end +return a.time<b.time +end +table.sort(queue,_sort) +self:T3(self.lid.."Sorted queue wrt time:") +for i=1,#queue do +local _queue=queue[i] +local _time=tostring(_queue.time) +local _clock=tostring(self:_SecondsToClock(_queue.time)) +self:T3(self.lid..string.format("%s: time=%s, clock=%s",_queue.name,_time,_clock)) +end +end +function ARTY:_GetHeading(a,b) +local dx=b.x-a.x +local dy=b.z-a.z +local angle=math.deg(math.atan2(dy,dx)) +if angle<0 then +angle=360+angle +end +return angle +end +function ARTY:_CheckTargetsInRange() +local targets2delete={} +for i=1,#self.targets do +local _target=self.targets[i] +self:T3(self.lid..string.format("Before: Target %s - in range = %s",_target.name,tostring(_target.inrange))) +local _inrange,_toofar,_tooclose,_remove=self:_TargetInRange(_target) +self:T3(self.lid..string.format("Inbetw: Target %s - in range = %s, toofar = %s, tooclose = %s",_target.name,tostring(_target.inrange),tostring(_toofar),tostring(_tooclose))) +if _remove then +table.insert(targets2delete,_target.name) +else +local _movetowards=false +local _moveaway=false +if _target.inrange==nil then +_target.inrange,_toofar,_tooclose=self:_TargetInRange(_target,self.report or self.Debug) +if _toofar then +_movetowards=true +elseif _tooclose then +_moveaway=true +end +elseif _target.inrange==true then +if _toofar then +_movetowards=true +elseif _tooclose then +_moveaway=true +end +elseif _target.inrange==false then +if _inrange then +local text=string.format("%s, target %s is now in range.",self.alias,_target.name) +self:T(self.lid..text) +MESSAGE:New(text,10):ToCoalitionIf(self.coalition,self.report or self.Debug) +end +end +if self.autorelocate and(_movetowards or _moveaway)then +local _from=self.Controllable:GetCoordinate() +local _dist=_from:Get2DDistance(_target.coord) +if _dist<=self.autorelocatemaxdist then +local _tocoord +local _name="" +local _safetymargin=500 +if _movetowards then +local _waytogo=_dist-self.maxrange+_safetymargin +local _heading=self:_GetHeading(_from,_target.coord) +_tocoord=_from:Translate(_waytogo,_heading) +_name=string.format("%s, relocation to within max firing range of target %s",self.alias,_target.name) +elseif _moveaway then +local _waytogo=_dist-self.minrange+_safetymargin +local _heading=self:_GetHeading(_target.coord,_from) +_tocoord=_from:Translate(_waytogo,_heading) +_name=string.format("%s, relocation to within min firing range of target %s",self.alias,_target.name) +end +MESSAGE:New(_name.." assigned.",10):ToCoalitionIf(self.coalition,self.report or self.Debug) +self:AssignMoveCoord(_tocoord,nil,nil,self.autorelocateonroad,false,_name,true) +end +end +_target.inrange=_inrange +self:T3(self.lid..string.format("After: Target %s - in range = %s",_target.name,tostring(_target.inrange))) +end +end +for _,targetname in pairs(targets2delete)do +self:RemoveTarget(targetname) +end +end +function ARTY:_CheckNormalTargets() +self:F3() +self:_SortTargetQueuePrio() +if self:is("Rearming")then +return nil +end +for i=1,#self.targets do +local _target=self.targets[i] +self:T3(self.lid..string.format("Check NORMAL target %d: %s",i,self:_TargetInfo(_target))) +if _target.underfire==false and _target.time==nil and _target.maxengage>_target.engaged and self:_TargetInRange(_target)and self:_CheckWeaponTypeAvailable(_target)>0 then +self:T2(self.lid..string.format("Found NORMAL target %s",self:_TargetInfo(_target))) +return _target +end +end +return nil +end +function ARTY:_CheckTimedTargets() +self:F3() +local Tnow=timer.getAbsTime() +self:_SortQueueTime(self.targets) +if self:is("Rearming")then +return nil +end +for i=1,#self.targets do +local _target=self.targets[i] +self:T3(self.lid..string.format("Check TIMED target %d: %s",i,self:_TargetInfo(_target))) +if _target.time and Tnow>=_target.time and _target.underfire==false and self:_TargetInRange(_target)and self:_CheckWeaponTypeAvailable(_target)>0 then +if self.currentTarget then +if self.currentTarget.prio>_target.prio then +self:T2(self.lid..string.format("Found TIMED HIGH PRIO target %s.",self:_TargetInfo(_target))) +return _target +end +else +self:T2(self.lid..string.format("Found TIMED target %s.",self:_TargetInfo(_target))) +return _target +end +end +end +return nil +end +function ARTY:_CheckMoves() +self:F3() +local Tnow=timer.getAbsTime() +self:_SortQueueTime(self.moves) +local firing=false +if self.currentTarget then +firing=true +end +for i=1,#self.moves do +local _move=self.moves[i] +if string.find(_move.name,"REARMING MOVE")and((self.currentMove and self.currentMove.name~=_move.name)or self.currentMove==nil)then +return _move +elseif(Tnow>=_move.time)and(firing==false or _move.cancel)and(not self.currentMove)and(not self:is("Rearming"))then +return _move +end +end +return nil +end +function ARTY:_CheckShootingStarted() +self:F2() +if self.currentTarget then +local Tnow=timer.getTime() +local name=self.currentTarget.name +local dt=Tnow-self.currentTarget.Tassigned +if self.Nshots==0 then +self:T(self.lid..string.format("%s, waiting for %d seconds for first shot on target %s.",self.groupname,dt,name)) +end +self:T(string.format("dt = %d WaitTime = %d | shots = %d TargetShells = %d",dt,self.WaitForShotTime,self.Nshots,self.currentTarget.nshells)) +if(dt>self.WaitForShotTime and self.Nshots==0)or(self.currentTarget.nshells<=self.Nshots)then +self:T(self.lid..string.format("%s, no shot event after %d seconds. Removing current target %s from list.",self.groupname,self.WaitForShotTime,name)) +self:CeaseFire(self.currentTarget) +self:RemoveTarget(name) +end +end +end +function ARTY:_GetTargetIndexByName(name) +self:F2(name) +for i=1,#self.targets do +local targetname=self.targets[i].name +self:T3(self.lid..string.format("Have target with name %s. Index = %d",targetname,i)) +if targetname==name then +self:T2(self.lid..string.format("Found target with name %s. Index = %d",name,i)) +return i +end +end +self:T2(self.lid..string.format("WARNING: Target with name %s could not be found. (This can happen.)",name)) +return nil +end +function ARTY:_GetMoveIndexByName(name) +self:F2(name) +for i=1,#self.moves do +local movename=self.moves[i].name +self:T3(self.lid..string.format("Have move with name %s. Index = %d",movename,i)) +if movename==name then +self:T2(self.lid..string.format("Found move with name %s. Index = %d",name,i)) +return i +end +end +self:T2(self.lid..string.format("WARNING: Move with name %s could not be found. (This can happen.)",name)) +return nil +end +function ARTY:_CheckOutOfAmmo(targets) +local _nammo,_nshells,_nrockets,_nmissiles,_narty=self:GetAmmo() +local _partlyoutofammo=false +for _,Target in pairs(targets)do +if Target.weapontype==ARTY.WeaponType.Auto and _nammo==0 then +self:T(self.lid..string.format("Group %s, auto weapon requested for target %s but all ammo is empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.Cannon and _narty==0 then +self:T(self.lid..string.format("Group %s, cannons requested for target %s but shells empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.TacticalNukes and self.Nukes<=0 then +self:T(self.lid..string.format("Group %s, tactical nukes requested for target %s but nukes empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.IlluminationShells and self.Nillu<=0 then +self:T(self.lid..string.format("Group %s, illumination shells requested for target %s but illumination shells empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.SmokeShells and self.Nsmoke<=0 then +self:T(self.lid..string.format("Group %s, smoke shells requested for target %s but smoke shells empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.Rockets and _nrockets==0 then +self:T(self.lid..string.format("Group %s, rockets requested for target %s but rockets empty.",self.groupname,Target.name)) +_partlyoutofammo=true +elseif Target.weapontype==ARTY.WeaponType.CruiseMissile and _nmissiles==0 then +self:T(self.lid..string.format("Group %s, cruise missiles requested for target %s but all missiles empty.",self.groupname,Target.name)) +_partlyoutofammo=true +end +end +return _partlyoutofammo +end +function ARTY:_CheckWeaponTypeAvailable(target) +local Nammo,Nshells,Nrockets,Nmissiles,Narty=self:GetAmmo() +local nfire=Nammo +if target.weapontype==ARTY.WeaponType.Auto then +nfire=Nammo +elseif target.weapontype==ARTY.WeaponType.Cannon then +nfire=Narty +elseif target.weapontype==ARTY.WeaponType.TacticalNukes then +nfire=self.Nukes +elseif target.weapontype==ARTY.WeaponType.IlluminationShells then +nfire=self.Nillu +elseif target.weapontype==ARTY.WeaponType.SmokeShells then +nfire=self.Nsmoke +elseif target.weapontype==ARTY.WeaponType.Rockets then +nfire=Nrockets +elseif target.weapontype==ARTY.WeaponType.CruiseMissile then +nfire=Nmissiles +end +return nfire +end +function ARTY:_CheckWeaponTypePossible(target) +local possible=false +if target.weapontype==ARTY.WeaponType.Auto then +possible=self.Nammo0>0 +elseif target.weapontype==ARTY.WeaponType.Cannon then +possible=self.Nshells0>0 +elseif target.weapontype==ARTY.WeaponType.TacticalNukes then +possible=self.Nukes0>0 +elseif target.weapontype==ARTY.WeaponType.IlluminationShells then +possible=self.Nillu0>0 +elseif target.weapontype==ARTY.WeaponType.SmokeShells then +possible=self.Nsmoke0>0 +elseif target.weapontype==ARTY.WeaponType.Rockets then +possible=self.Nrockets0>0 +elseif target.weapontype==ARTY.WeaponType.CruiseMissile then +possible=self.Nmissiles0>0 +end +return possible +end +function ARTY:_CheckName(givennames,name,makeunique) +self:F2({givennames=givennames,name=name}) +local newname=name +local counter=1 +local n=1 +local nmax=100 +if makeunique==nil then +makeunique=true +end +repeat +local _unique=true +for _,_target in pairs(givennames)do +local _givenname=_target.name +if _givenname==newname then +_unique=false +end +self:T3(self.lid..string.format("%d: givenname = %s, newname=%s, unique = %s, makeunique = %s",n,tostring(_givenname),newname,tostring(_unique),tostring(makeunique))) +end +if _unique==false and makeunique==true then +newname=string.format("%s #%02d",name,counter) +counter=counter+1 +end +if _unique==false and makeunique==false then +self:T3(self.lid..string.format("Name %s is not unique. Return false.",tostring(newname))) +return name,false +end +n=n+1 +until(_unique or n==nmax) +self:T3(self.lid..string.format("Original name %s, new name = %s",name,newname)) +return newname,true +end +function ARTY:_TargetInRange(target,message) +self:F3(target) +if message==nil then +message=false +end +self:T3({controllable=self.Controllable,targetcoord=target.coord}) +local _dist=self.Controllable:GetCoordinate():Get2DDistance(target.coord) +local _inrange=true +local _tooclose=false +local _toofar=false +local text="" +if _dist<self.minrange then +_inrange=false +_tooclose=true +text=string.format("%s, target is out of range. Distance of %.1f km is below min range of %.1f km.",self.alias,_dist/1000,self.minrange/1000) +elseif _dist>self.maxrange then +_inrange=false +_toofar=true +text=string.format("%s, target is out of range. Distance of %.1f km is greater than max range of %.1f km.",self.alias,_dist/1000,self.maxrange/1000) +end +if not _inrange then +self:T(self.lid..text) +MESSAGE:New(text,5):ToCoalitionIf(self.coalition,(self.report and message)or(self.Debug and message)) +end +local _remove=false +if not(self.ismobile or self.iscargo)and _inrange==false then +_remove=true +end +return _inrange,_toofar,_tooclose,_remove +end +function ARTY:_WeaponTypeName(tnumber) +self:F2(tnumber) +local name="unknown" +if tnumber==ARTY.WeaponType.Auto then +name="Auto" +elseif tnumber==ARTY.WeaponType.Cannon then +name="Cannons" +elseif tnumber==ARTY.WeaponType.Rockets then +name="Rockets" +elseif tnumber==ARTY.WeaponType.CruiseMissile then +name="Cruise Missiles" +elseif tnumber==ARTY.WeaponType.TacticalNukes then +name="Tactical Nukes" +elseif tnumber==ARTY.WeaponType.IlluminationShells then +name="Illumination Shells" +elseif tnumber==ARTY.WeaponType.SmokeShells then +name="Smoke Shells" +end +return name +end +function ARTY:_VicinityCoord(coord,rmin,rmax) +self:F2({coord=coord,rmin=rmin,rmax=rmax}) +rmin=rmin or 20 +rmax=rmax or 80 +local vec2=coord:GetRandomVec2InRadius(rmax,rmin) +local pops=COORDINATE:NewFromVec2(vec2) +self:T3(self.lid..string.format("Vicinity distance = %d (rmin=%d, rmax=%d)",pops:Get2DDistance(coord),rmin,rmax)) +return pops +end +function ARTY:_EventFromTo(BA,Event,From,To) +local text=string.format("%s: %s EVENT %s: %s --> %s",BA,self.groupname,Event,From,To) +self:T3(self.lid..text) +end +function ARTY:_split(str,sep) +self:F3({str=str,sep=sep}) +local result={} +local regex=("([^%s]+)"):format(sep) +for each in str:gmatch(regex)do +table.insert(result,each) +end +return result +end +function ARTY:_TargetInfo(target) +local clock=tostring(self:_SecondsToClock(target.time)) +local weapon=self:_WeaponTypeName(target.weapontype) +local _underfire=tostring(target.underfire) +return string.format("%s: prio=%d, radius=%d, nshells=%d, engaged=%d/%d, weapontype=%s, time=%s, underfire=%s, attackgroup=%s", +target.name,target.prio,target.radius,target.nshells,target.engaged,target.maxengage,weapon,clock,_underfire,tostring(target.attackgroup)) +end +function ARTY:_MoveInfo(move) +self:F3(move) +local _clock=self:_SecondsToClock(move.time) +return string.format("%s: time=%s, speed=%d, onroad=%s, cancel=%s",move.name,_clock,move.speed,tostring(move.onroad),tostring(move.cancel)) +end +function ARTY:_LLDMS2DD(l1,l2) +self:F2(l1,l2) +local _latlong={l1,l2} +local _latitude=nil +local _longitude=nil +for _,ll in pairs(_latlong)do +local _format="%d+:%d+:%d+" +local _ldms=ll:match(_format) +if _ldms then +local _dms=self:_split(_ldms,":") +local _deg=tonumber(_dms[1]) +local _min=tonumber(_dms[2]) +local _sec=tonumber(_dms[3]) +local function DMS2DD(d,m,s) +return d+m/60+s/3600 +end +if ll:match("N")then +_latitude=DMS2DD(_deg,_min,_sec) +elseif ll:match("S")then +_latitude=-DMS2DD(_deg,_min,_sec) +elseif ll:match("W")then +_longitude=-DMS2DD(_deg,_min,_sec) +elseif ll:match("E")then +_longitude=DMS2DD(_deg,_min,_sec) +end +local text=string.format("DMS %02d Deg %02d min %02d sec",_deg,_min,_sec) +self:T2(self.lid..text) +end +end +local text=string.format("\nLatitude %s",tostring(_latitude)) +text=text..string.format("\nLongitude %s",tostring(_longitude)) +self:T2(self.lid..text) +return _latitude,_longitude +end +function ARTY:_SecondsToClock(seconds) +self:F3({seconds=seconds}) +if seconds==nil then +return nil +end +local seconds=tonumber(seconds) +local _seconds=seconds%(60*60*24) +if seconds<=0 then +return nil +else +local hours=string.format("%02.f",math.floor(_seconds/3600)) +local mins=string.format("%02.f",math.floor(_seconds/60-(hours*60))) +local secs=string.format("%02.f",math.floor(_seconds-hours*3600-mins*60)) +local days=string.format("%d",seconds/(60*60*24)) +return hours..":"..mins..":"..secs.."+"..days +end +end +function ARTY:_ClockToSeconds(clock) +self:F3({clock=clock}) +if clock==nil then +return nil +end +local seconds=0 +local dsplit=self:_split(clock,"+") +if#dsplit>1 then +seconds=seconds+tonumber(dsplit[2])*60*60*24 +end +local tsplit=self:_split(dsplit[1],":") +local i=1 +for _,time in ipairs(tsplit)do +if i==1 then +seconds=seconds+tonumber(time)*60*60 +elseif i==2 then +seconds=seconds+tonumber(time)*60 +elseif i==3 then +seconds=seconds+tonumber(time) +end +i=i+1 +end +self:T3(self.lid..string.format("Clock %s = %d seconds",clock,seconds)) +return seconds +end +SUPPRESSION={ +ClassName="SUPPRESSION", +Debug=false, +lid=nil, +flare=false, +smoke=false, +DCSdesc=nil, +Type=nil, +IsInfantry=nil, +SpeedMax=nil, +Tsuppress_ave=15, +Tsuppress_min=5, +Tsuppress_max=25, +TsuppressOver=nil, +IniGroupStrength=nil, +Nhit=0, +Formation="Off road", +Speed=4, +MenuON=false, +FallbackON=false, +FallbackWait=60, +FallbackDist=100, +FallbackHeading=nil, +TakecoverON=false, +TakecoverWait=120, +TakecoverRange=300, +hideout=nil, +PminFlee=10, +PmaxFlee=90, +RetreatZone=nil, +RetreatDamage=nil, +RetreatWait=7200, +CurrentAlarmState="unknown", +CurrentROE="unknown", +DefaultAlarmState="Auto", +DefaultROE="Weapon Free", +eventmoose=true, +waypoints={}, +} +SUPPRESSION.ROE={ +Hold="Weapon Hold", +Free="Weapon Free", +Return="Return Fire", +} +SUPPRESSION.AlarmState={ +Auto="Auto", +Green="Green", +Red="Red", +} +SUPPRESSION.MenuF10=nil +SUPPRESSION.version="0.9.4" +function SUPPRESSION:New(group) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +if group then +self.lid=string.format("SUPPRESSION %s | ",tostring(group:GetName())) +self:T(self.lid..string.format("SUPPRESSION version %s. Activating suppressive fire for group %s",SUPPRESSION.version,group:GetName())) +else +self:E("SUPPRESSION | Requested group does not exist! (Has to be a MOOSE group)") +return nil +end +if group:IsGround()==false then +self:E(self.lid..string.format("SUPPRESSION fire group %s has to be a GROUND group!",group:GetName())) +return nil +end +self:SetControllable(group) +self.DCSdesc=group:GetDCSDesc(1) +self.SpeedMax=group:GetSpeedMax() +self.Speed=self.SpeedMax +self.IsInfantry=group:GetUnit(1):HasAttribute("Infantry") +self.Type=group:GetTypeName() +self.IniGroupStrength=#group:GetUnits() +self:SetDefaultROE("Free") +self:SetDefaultAlarmState("Auto") +self:AddTransition("*","Start","CombatReady") +self:AddTransition("*","Status","*") +self:AddTransition("CombatReady","Hit","Suppressed") +self:AddTransition("Suppressed","Hit","Suppressed") +self:AddTransition("Suppressed","Recovered","CombatReady") +self:AddTransition("Suppressed","TakeCover","TakingCover") +self:AddTransition("Suppressed","FallBack","FallingBack") +self:AddTransition("*","Retreat","Retreating") +self:AddTransition("TakingCover","FightBack","CombatReady") +self:AddTransition("FallingBack","FightBack","CombatReady") +self:AddTransition("Retreating","Retreated","Retreated") +self:AddTransition("*","OutOfAmmo","*") +self:AddTransition("*","Dead","*") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("TakingCover","Hit","TakingCover") +self:AddTransition("FallingBack","Hit","FallingBack") +return self +end +function SUPPRESSION:SetSuppressionTime(Tave,Tmin,Tmax) +self:F({Tave=Tave,Tmin=Tmin,Tmax=Tmax}) +self.Tsuppress_min=Tmin or self.Tsuppress_min +self.Tsuppress_min=math.max(self.Tsuppress_min,1) +self.Tsuppress_max=Tmax or self.Tsuppress_max +self.Tsuppress_max=math.max(self.Tsuppress_max,self.Tsuppress_min) +self.Tsuppress_ave=Tave or self.Tsuppress_ave +self.Tsuppress_ave=math.max(self.Tsuppress_min) +self.Tsuppress_ave=math.min(self.Tsuppress_max) +self:T(self.lid..string.format("Set ave suppression time to %d seconds.",self.Tsuppress_ave)) +self:T(self.lid..string.format("Set min suppression time to %d seconds.",self.Tsuppress_min)) +self:T(self.lid..string.format("Set max suppression time to %d seconds.",self.Tsuppress_max)) +end +function SUPPRESSION:SetRetreatZone(zone) +self:F({zone=zone}) +self.RetreatZone=zone +end +function SUPPRESSION:DebugOn() +self:F() +self.Debug=true +end +function SUPPRESSION:FlareOn() +self:F() +self.flare=true +end +function SUPPRESSION:SmokeOn() +self:F() +self.smoke=true +end +function SUPPRESSION:SetFormation(formation) +self:F(formation) +self.Formation=formation or"Vee" +end +function SUPPRESSION:SetSpeed(speed) +self:F(speed) +self.Speed=speed or self.SpeedMax +self.Speed=math.min(self.Speed,self.SpeedMax) +end +function SUPPRESSION:Fallback(switch) +self:F(switch) +if switch==nil then +switch=true +end +self.FallbackON=switch +end +function SUPPRESSION:SetFallbackDistance(distance) +self:F(distance) +self.FallbackDist=distance +end +function SUPPRESSION:SetFallbackWait(time) +self:F(time) +self.FallbackWait=time +end +function SUPPRESSION:Takecover(switch) +self:F(switch) +if switch==nil then +switch=true +end +self.TakecoverON=switch +end +function SUPPRESSION:SetTakecoverWait(time) +self:F(time) +self.TakecoverWait=time +end +function SUPPRESSION:SetTakecoverRange(range) +self:F(range) +self.TakecoverRange=range +end +function SUPPRESSION:SetTakecoverPlace(Hideout) +self.hideout=Hideout +end +function SUPPRESSION:SetMinimumFleeProbability(probability) +self:F(probability) +self.PminFlee=probability or 10 +end +function SUPPRESSION:SetMaximumFleeProbability(probability) +self:F(probability) +self.PmaxFlee=probability or 90 +end +function SUPPRESSION:SetRetreatDamage(damage) +self:F(damage) +self.RetreatDamage=damage or 50 +end +function SUPPRESSION:SetRetreatWait(time) +self:F(time) +self.RetreatWait=time or 7200 +end +function SUPPRESSION:SetDefaultAlarmState(alarmstate) +self:F(alarmstate) +if alarmstate:lower()=="auto"then +self.DefaultAlarmState=SUPPRESSION.AlarmState.Auto +elseif alarmstate:lower()=="green"then +self.DefaultAlarmState=SUPPRESSION.AlarmState.Green +elseif alarmstate:lower()=="red"then +self.DefaultAlarmState=SUPPRESSION.AlarmState.Red +else +self.DefaultAlarmState=SUPPRESSION.AlarmState.Auto +end +end +function SUPPRESSION:SetDefaultROE(roe) +self:F(roe) +if roe:lower()=="free"then +self.DefaultROE=SUPPRESSION.ROE.Free +elseif roe:lower()=="hold"then +self.DefaultROE=SUPPRESSION.ROE.Hold +elseif roe:lower()=="return"then +self.DefaultROE=SUPPRESSION.ROE.Return +else +self.DefaultROE=SUPPRESSION.ROE.Free +end +end +function SUPPRESSION:MenuOn(switch) +self:F(switch) +if switch==nil then +switch=true +end +self.MenuON=switch +end +function SUPPRESSION:_CreateMenuGroup() +local SubMenuName=self.Controllable:GetName() +local MenuGroup=MENU_MISSION:New(SubMenuName,SUPPRESSION.MenuF10) +MENU_MISSION_COMMAND:New("Fallback!",MenuGroup,self.OrderFallBack,self) +MENU_MISSION_COMMAND:New("Take Cover!",MenuGroup,self.OrderTakeCover,self) +MENU_MISSION_COMMAND:New("Retreat!",MenuGroup,self.OrderRetreat,self) +MENU_MISSION_COMMAND:New("Report Status",MenuGroup,self.Status,self,true) +end +function SUPPRESSION:OrderFallBack() +local group=self.Controllable +local vicinity=group:GetCoordinate():GetRandomVec2InRadius(150,100) +local coord=COORDINATE:NewFromVec2(vicinity) +self:FallBack(self.Controllable) +end +function SUPPRESSION:OrderTakeCover() +local Hideout=self.hideout +if self.hideout==nil then +Hideout=self:_SearchHideout() +end +self:TakeCover(Hideout) +end +function SUPPRESSION:OrderRetreat() +self:Retreat() +end +function SUPPRESSION:StatusReport(message) +local group=self.Controllable +local nunits=group:CountAliveUnits() +local roe=self.CurrentROE +local state=self.CurrentAlarmState +local life_min,life_max,life_ave,life_ave0,groupstrength=self:_GetLife() +local ammotot=group:GetAmmunition() +local detectedG=group:GetDetectedGroupSet():CountAlive() +local detectedU=group:GetDetectedUnitSet():Count() +local text=string.format("State %s, Units=%d/%d, ROE=%s, AlarmState=%s, Hits=%d, Life(min/max/ave/ave0)=%d/%d/%d/%d, Total Ammo=%d, Detected=%d/%d", +self:GetState(),nunits,self.IniGroupStrength,self.CurrentROE,self.CurrentAlarmState,self.Nhit,life_min,life_max,life_ave,life_ave0,ammotot,detectedG,detectedU) +MESSAGE:New(text,10):ToAllIf(message or self.Debug) +self:I(self.lid..text) +end +function SUPPRESSION:onafterStart(Controllable,From,Event,To) +self:_EventFromTo("onafterStart",Event,From,To) +local text=string.format("Started SUPPRESSION for group %s.",Controllable:GetName()) +self:I(self.lid..text) +MESSAGE:New(text,10):ToAllIf(self.Debug) +local rzone="not defined" +if self.RetreatZone then +rzone=self.RetreatZone:GetName() +end +if self.RetreatDamage==nil then +if self.RetreatZone then +if self.IniGroupStrength==1 then +self.RetreatDamage=60.0 +elseif self.IniGroupStrength==2 then +self.RetreatDamage=50.0 +else +self.RetreatDamage=66.5 +end +else +self.RetreatDamage=100 +end +end +if self.MenuON then +if not SUPPRESSION.MenuF10 then +SUPPRESSION.MenuF10=MENU_MISSION:New("Suppression") +end +self:_CreateMenuGroup() +end +self:_SetAlarmState(self.DefaultAlarmState) +self:_SetROE(self.DefaultROE) +local text=string.format("\n******************************************************\n") +text=text..string.format("Suppressed group = %s\n",Controllable:GetName()) +text=text..string.format("Type = %s\n",self.Type) +text=text..string.format("IsInfantry = %s\n",tostring(self.IsInfantry)) +text=text..string.format("Group strength = %d\n",self.IniGroupStrength) +text=text..string.format("Average time = %5.1f seconds\n",self.Tsuppress_ave) +text=text..string.format("Minimum time = %5.1f seconds\n",self.Tsuppress_min) +text=text..string.format("Maximum time = %5.1f seconds\n",self.Tsuppress_max) +text=text..string.format("Default ROE = %s\n",self.DefaultROE) +text=text..string.format("Default AlarmState = %s\n",self.DefaultAlarmState) +text=text..string.format("Fall back ON = %s\n",tostring(self.FallbackON)) +text=text..string.format("Fall back distance = %5.1f m\n",self.FallbackDist) +text=text..string.format("Fall back wait = %5.1f seconds\n",self.FallbackWait) +text=text..string.format("Fall back heading = %s degrees\n",tostring(self.FallbackHeading)) +text=text..string.format("Take cover ON = %s\n",tostring(self.TakecoverON)) +text=text..string.format("Take cover search = %5.1f m\n",self.TakecoverRange) +text=text..string.format("Take cover wait = %5.1f seconds\n",self.TakecoverWait) +text=text..string.format("Min flee probability = %5.1f\n",self.PminFlee) +text=text..string.format("Max flee probability = %5.1f\n",self.PmaxFlee) +text=text..string.format("Retreat zone = %s\n",rzone) +text=text..string.format("Retreat damage = %5.1f %%\n",self.RetreatDamage) +text=text..string.format("Retreat wait = %5.1f seconds\n",self.RetreatWait) +text=text..string.format("Speed = %5.1f km/h\n",self.Speed) +text=text..string.format("Speed max = %5.1f km/h\n",self.SpeedMax) +text=text..string.format("Formation = %s\n",self.Formation) +text=text..string.format("******************************************************\n") +self:T(self.lid..text) +if self.eventmoose then +self:HandleEvent(EVENTS.Hit,self._OnEventHit) +self:HandleEvent(EVENTS.Dead,self._OnEventDead) +else +world.addEventHandler(self) +end +self:__Status(-1) +end +function SUPPRESSION:onafterStatus(Controllable,From,Event,To) +local group=self.Controllable +if group then +local nunits=group:CountAliveUnits() +if nunits>0 then +local nammo=group:GetAmmunition() +if nammo==0 then +self:OutOfAmmo() +end +self:StatusReport(false) +if self:GetState()~="Stopped"then +self:__Status(-30) +end +else +self:Stop() +end +else +self:Stop() +end +end +function SUPPRESSION:onafterHit(Controllable,From,Event,To,Unit,AttackUnit) +self:_EventFromTo("onafterHit",Event,From,To) +if From=="CombatReady"or From=="Suppressed"then +self:_Suppress() +end +local life_min,life_max,life_ave,life_ave0,groupstrength=self:_GetLife() +local Damage=100-life_ave0 +local RetreatCondition=Damage>=self.RetreatDamage-0.01 and self.RetreatZone +local Pflee=(self.PmaxFlee-self.PminFlee)/self.RetreatDamage*math.min(Damage,self.RetreatDamage)+self.PminFlee +local P=math.random(0,100) +local FleeCondition=P<Pflee +local text +text=string.format("\nGroup %s: Life min=%5.1f, max=%5.1f, ave=%5.1f, ave0=%5.1f group=%5.1f\n",Controllable:GetName(),life_min,life_max,life_ave,life_ave0,groupstrength) +text=string.format("Group %s: Damage = %8.4f (%8.4f retreat threshold).\n",Controllable:GetName(),Damage,self.RetreatDamage) +text=string.format("Group %s: P_Flee = %5.1f %5.1f=P_rand (P_Flee > Prand ==> Flee)\n",Controllable:GetName(),Pflee,P) +self:T(self.lid..text) +if Damage>=99.9 then +return +end +if RetreatCondition then +self:Retreat() +elseif FleeCondition then +if self.FallbackON and AttackUnit:IsGround()then +self:FallBack(AttackUnit) +elseif self.TakecoverON then +local Hideout=self.hideout +if self.hideout==nil then +Hideout=self:_SearchHideout() +end +self:TakeCover(Hideout) +end +end +end +function SUPPRESSION:onbeforeRecovered(Controllable,From,Event,To) +self:_EventFromTo("onbeforeRecovered",Event,From,To) +local Tnow=timer.getTime() +self:T(self.lid..string.format("onbeforeRecovered: Time now: %d - Time over: %d",Tnow,self.TsuppressionOver)) +if Tnow>=self.TsuppressionOver then +return true +else +return false +end +end +function SUPPRESSION:onafterRecovered(Controllable,From,Event,To) +self:_EventFromTo("onafterRecovered",Event,From,To) +if Controllable and Controllable:IsAlive()then +local text=string.format("Group %s has recovered!",Controllable:GetName()) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +self:_SetROE() +if self.flare or self.Debug then +Controllable:FlareGreen() +end +end +end +function SUPPRESSION:onafterFightBack(Controllable,From,Event,To) +self:_EventFromTo("onafterFightBack",Event,From,To) +self:_SetROE() +self:_SetAlarmState() +local group=Controllable +local Waypoints=group:GetTemplateRoutePoints() +group:Route(Waypoints,5) +end +function SUPPRESSION:onbeforeFallBack(Controllable,From,Event,To,AttackUnit) +self:_EventFromTo("onbeforeFallBack",Event,From,To) +if From=="FallingBack"then +return false +else +return true +end +end +function SUPPRESSION:onafterFallBack(Controllable,From,Event,To,AttackUnit) +self:_EventFromTo("onafterFallback",Event,From,To) +self:T(self.lid..string.format("Group %s is falling back after %d hits.",Controllable:GetName(),self.Nhit)) +local ACoord=AttackUnit:GetCoordinate() +local DCoord=Controllable:GetCoordinate() +local heading=self:_Heading(ACoord,DCoord) +if self.FallbackHeading then +heading=self.FallbackHeading +end +local Coord=DCoord:Translate(self.FallbackDist,heading) +if self.Debug then +local MarkerID=Coord:MarkToAll("Fall back position for group "..Controllable:GetName()) +end +if self.smoke or self.Debug then +Coord:SmokeBlue() +end +self:_SetROE(SUPPRESSION.ROE.Hold) +self:_SetAlarmState(SUPPRESSION.AlarmState.Auto) +self:_Run(Coord,self.Speed,self.Formation,self.FallbackWait) +end +function SUPPRESSION:onbeforeTakeCover(Controllable,From,Event,To,Hideout) +self:_EventFromTo("onbeforeTakeCover",Event,From,To) +if From=="TakingCover"then +return false +end +if Hideout~=nil then +return true +else +return false +end +end +function SUPPRESSION:onafterTakeCover(Controllable,From,Event,To,Hideout) +self:_EventFromTo("onafterTakeCover",Event,From,To) +if self.Debug then +local MarkerID=Hideout:MarkToAll(string.format("Hideout for group %s",Controllable:GetName())) +end +if self.smoke or self.Debug then +Hideout:SmokeBlue() +end +self:_SetROE(SUPPRESSION.ROE.Hold) +self:_SetAlarmState(SUPPRESSION.AlarmState.Green) +self:_Run(Hideout,self.Speed,self.Formation,self.TakecoverWait) +end +function SUPPRESSION:onafterOutOfAmmo(Controllable,From,Event,To) +self:_EventFromTo("onafterOutOfAmmo",Event,From,To) +self:I(self.lid..string.format("Out of ammo!")) +if self.RetreatZone then +self:Retreat() +end +end +function SUPPRESSION:onbeforeRetreat(Controllable,From,Event,To) +self:_EventFromTo("onbeforeRetreat",Event,From,To) +if From=="Retreating"then +local text=string.format("Group %s is already retreating.",tostring(Controllable:GetName())) +self:T2(self.lid..text) +return false +else +return true +end +end +function SUPPRESSION:onafterRetreat(Controllable,From,Event,To) +self:_EventFromTo("onafterRetreat",Event,From,To) +local text=string.format("Group %s is retreating! Alarm state green.",Controllable:GetName()) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +local ZoneCoord=self.RetreatZone:GetRandomCoordinate() +local ZoneVec2=ZoneCoord:GetVec2() +if self.smoke or self.Debug then +ZoneCoord:SmokeBlue() +end +if self.Debug then +self.RetreatZone:SmokeZone(SMOKECOLOR.Red,12) +end +self:_SetROE(SUPPRESSION.ROE.Hold) +self:_SetAlarmState(SUPPRESSION.AlarmState.Green) +self:_Run(ZoneCoord,self.Speed,self.Formation,self.RetreatWait) +end +function SUPPRESSION:onbeforeRetreated(Controllable,From,Event,To) +self:_EventFromTo("onbeforeRetreated",Event,From,To) +local inzone=self.RetreatZone:IsVec3InZone(Controllable:GetVec3()) +return inzone +end +function SUPPRESSION:onafterRetreated(Controllable,From,Event,To) +self:_EventFromTo("onafterRetreated",Event,From,To) +self:_SetROE(SUPPRESSION.ROE.Return) +self:_SetAlarmState(SUPPRESSION.AlarmState.Auto) +end +function SUPPRESSION:onafterDead(Controllable,From,Event,To) +self:_EventFromTo("onafterDead",Event,From,To) +local group=self.Controllable +if group then +local nunits=group:CountAliveUnits() +local text=string.format("Group %s: One of our units just died! %d units left.",self.Controllable:GetName(),nunits) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +if nunits==0 then +self:Stop() +end +else +self:Stop() +end +end +function SUPPRESSION:onafterStop(Controllable,From,Event,To) +self:_EventFromTo("onafterStop",Event,From,To) +local text=string.format("Stopping SUPPRESSION for group %s",self.Controllable:GetName()) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:I(self.lid..text) +self.CallScheduler:Clear() +if self.mooseevents then +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Hit) +else +world.removeEventHandler(self) +end +end +function SUPPRESSION:onEvent(Event) +if Event==nil or Event.initiator==nil or Unit.getByName(Event.initiator:getName())==nil then +return true +end +local EventData={} +if Event.initiator then +EventData.IniDCSUnit=Event.initiator +EventData.IniUnitName=Event.initiator:getName() +EventData.IniDCSGroup=Event.initiator:getGroup() +EventData.IniGroupName=Event.initiator:getGroup():getName() +EventData.IniGroup=GROUP:FindByName(EventData.IniGroupName) +EventData.IniUnit=UNIT:FindByName(EventData.IniUnitName) +end +if Event.target then +EventData.TgtDCSUnit=Event.target +EventData.TgtUnitName=Event.target:getName() +EventData.TgtDCSGroup=Event.target:getGroup() +EventData.TgtGroupName=Event.target:getGroup():getName() +EventData.TgtGroup=GROUP:FindByName(EventData.TgtGroupName) +EventData.TgtUnit=UNIT:FindByName(EventData.TgtUnitName) +end +if Event.id==world.event.S_EVENT_HIT then +self:_OnEventHit(EventData) +end +if Event.id==world.event.S_EVENT_DEAD then +self:_OnEventDead(EventData) +end +end +function SUPPRESSION:_OnEventHit(EventData) +self:F3(EventData) +local GroupNameSelf=self.Controllable:GetName() +local GroupNameTgt=EventData.TgtGroupName +local TgtUnit=EventData.TgtUnit +local tgt=EventData.TgtDCSUnit +local IniUnit=EventData.IniUnit +if GroupNameTgt==GroupNameSelf then +self:T(self.lid..string.format("Hit event at t = %5.1f",timer.getTime())) +if self.flare or self.Debug then +TgtUnit:FlareRed() +end +self.Nhit=self.Nhit+1 +self:T(self.lid..string.format("Group %s has just been hit %d times.",self.Controllable:GetName(),self.Nhit)) +local life=tgt:getLife()/(tgt:getLife0()+1)*100 +self:T2(self.lid..string.format("Target unit life = %5.1f",life)) +self:__Hit(3,TgtUnit,IniUnit) +end +end +function SUPPRESSION:_OnEventDead(EventData) +local GroupNameSelf=self.Controllable:GetName() +local GroupNameIni=EventData.IniGroupName +if GroupNameIni==GroupNameSelf then +local IniUnit=EventData.IniUnit +local IniUnitName=EventData.IniUnitName +if EventData.IniUnit then +self:T2(self.lid..string.format("Group %s: Dead MOOSE unit DOES exist! Unit name %s.",GroupNameIni,IniUnitName)) +else +self:T2(self.lid..string.format("Group %s: Dead MOOSE unit DOES NOT not exist! Unit name %s.",GroupNameIni,IniUnitName)) +end +if EventData.IniDCSUnit then +self:T2(self.lid..string.format("Group %s: Dead DCS unit DOES exist! Unit name %s.",GroupNameIni,IniUnitName)) +else +self:T2(self.lid..string.format("Group %s: Dead DCS unit DOES NOT exist! Unit name %s.",GroupNameIni,IniUnitName)) +end +if IniUnit and(self.flare or self.Debug)then +IniUnit:FlareWhite() +self:T(self.lid..string.format("Flare Dead MOOSE unit.")) +end +if EventData.IniDCSUnit and(self.flare or self.Debug)then +local p=EventData.IniDCSUnit:getPosition().p +trigger.action.signalFlare(p,trigger.flareColor.Yellow,0) +self:T(self.lid..string.format("Flare Dead DCS unit.")) +end +self:Status() +self:__Dead(0.1) +end +end +function SUPPRESSION:_Suppress() +local Tnow=timer.getTime() +local Controllable=self.Controllable +self:_SetROE(SUPPRESSION.ROE.Hold) +local sigma=(self.Tsuppress_max-self.Tsuppress_min)/4 +local Tsuppress=self:_Random_Gaussian(self.Tsuppress_ave,sigma,self.Tsuppress_min,self.Tsuppress_max) +local renew=true +if self.TsuppressionOver~=nil then +if Tsuppress+Tnow>self.TsuppressionOver then +self.TsuppressionOver=Tnow+Tsuppress +else +renew=false +end +else +self.TsuppressionOver=Tnow+Tsuppress +end +if renew then +self:__Recovered(self.TsuppressionOver-Tnow) +end +local text=string.format("Group %s is suppressed for %d seconds. Suppression ends at %d:%02d.",Controllable:GetName(),Tsuppress,self.TsuppressionOver/60,self.TsuppressionOver%60) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:T(self.lid..text) +end +function SUPPRESSION:_Run(fin,speed,formation,wait) +speed=speed or 20 +formation=formation or ENUMS.Formation.Vehicle.OffRoad +wait=wait or 30 +local group=self.Controllable +if group and group:IsAlive()then +local ini=group:GetCoordinate() +local dist=ini:Get2DDistance(fin) +local heading=self:_Heading(ini,fin) +local wp={} +local tasks={} +wp[1]=ini:WaypointGround(speed,formation) +if self.Debug then +local MarkerID=ini:MarkToAll(string.format("Waypoing %d of group %s (initial)",#wp,self.Controllable:GetName())) +end +local ConditionWait=group:TaskCondition(nil,nil,nil,nil,wait,nil) +local TaskHold=group:TaskHold() +local TaskComboFin={} +TaskComboFin[#TaskComboFin+1]=group:TaskFunction("SUPPRESSION._Passing_Waypoint",self,#wp,true) +TaskComboFin[#TaskComboFin+1]=group:TaskControlled(TaskHold,ConditionWait) +wp[#wp+1]=fin:WaypointGround(speed,formation,TaskComboFin) +if self.Debug then +local MarkerID=fin:MarkToAll(string.format("Waypoing %d of group %s (final)",#wp,self.Controllable:GetName())) +end +group:Route(wp) +else +self:E(self.lid..string.format("ERROR: Group is not alive!")) +end +end +function SUPPRESSION._Passing_Waypoint(group,Fsm,i,final) +local text=string.format("Group %s passing waypoint %d (final=%s)",group:GetName(),i,tostring(final)) +MESSAGE:New(text,10):ToAllIf(Fsm.Debug) +if Fsm.Debug then +env.info(Fsm.lid..text) +end +if final then +if Fsm:is("Retreating")then +Fsm:Retreated() +else +Fsm:FightBack() +end +end +end +function SUPPRESSION:_SearchHideout() +local Zone=ZONE_GROUP:New("Zone_Hiding",self.Controllable,self.TakecoverRange) +local gpos=self.Controllable:GetCoordinate() +Zone:Scan(Object.Category.SCENERY) +local hideouts={} +for SceneryTypeName,SceneryData in pairs(Zone:GetScannedScenery())do +for SceneryName,SceneryObject in pairs(SceneryData)do +local SceneryObject=SceneryObject +local spos=SceneryObject:GetCoordinate() +local distance=spos:Get2DDistance(gpos) +if self.Debug then +local MarkerID=SceneryObject:GetCoordinate():MarkToAll(string.format("%s scenery object %s",self.Controllable:GetName(),SceneryObject:GetTypeName())) +local text=string.format("%s scenery: %s, Coord %s",self.Controllable:GetName(),SceneryObject:GetTypeName(),SceneryObject:GetCoordinate():ToStringLLDMS()) +self:T2(self.lid..text) +end +table.insert(hideouts,{object=SceneryObject,distance=distance}) +end +end +local Hideout=nil +if#hideouts>0 then +self:T(self.lid.."Number of hideouts "..#hideouts) +local _sort=function(a,b)return a.distance<b.distance end +table.sort(hideouts,_sort) +Hideout=hideouts[1].object:GetCoordinate() +else +self:E(self.lid.."No hideouts found!") +end +return Hideout +end +function SUPPRESSION:_GetLife() +local group=self.Controllable +if group and group:IsAlive()then +local units=group:GetUnits() +local life_min=nil +local life_max=nil +local life_ave=0 +local life_ave0=0 +local n=0 +local groupstrength=#units/self.IniGroupStrength*100 +self:T2(self.lid..string.format("Group %s _GetLife nunits = %d",self.Controllable:GetName(),#units)) +for _,unit in pairs(units)do +local unit=unit +if unit and unit:IsAlive()then +n=n+1 +local life=unit:GetLife()/(unit:GetLife0()+1)*100 +if life_min==nil or life<life_min then +life_min=life +end +if life_max==nil or life>life_max then +life_max=life +end +life_ave=life_ave+life +if self.Debug then +local text=string.format("n=%02d: Life = %3.1f, Life0 = %3.1f, min=%3.1f, max=%3.1f, ave=%3.1f, group=%3.1f",n,unit:GetLife(),unit:GetLife0(),life_min,life_max,life_ave/n,groupstrength) +self:T2(self.lid..text) +end +end +end +if n==0 then +return 0,0,0,0,0 +end +life_ave0=life_ave/self.IniGroupStrength +life_ave=life_ave/n +return life_min,life_max,life_ave,life_ave0,groupstrength +else +return 0,0,0,0,0 +end +end +function SUPPRESSION:_Heading(a,b) +local dx=b.x-a.x +local dy=b.z-a.z +local angle=math.deg(math.atan2(dy,dx)) +if angle<0 then +angle=360+angle +end +return angle +end +function SUPPRESSION:_Random_Gaussian(x0,sigma,xmin,xmax) +sigma=sigma or 5 +local r +local gotit=false +local i=0 +while not gotit do +local x1=math.random() +local x2=math.random() +r=math.sqrt(-2*sigma*sigma*math.log(x1))*math.cos(2*math.pi*x2)+x0 +i=i+1 +if(r>=xmin and r<=xmax)or i>100 then +gotit=true +end +end +return r +end +function SUPPRESSION:_SetROE(roe) +local group=self.Controllable +roe=roe or self.DefaultROE +self.CurrentROE=roe +if roe==SUPPRESSION.ROE.Free then +group:OptionROEOpenFire() +elseif roe==SUPPRESSION.ROE.Hold then +group:OptionROEHoldFire() +elseif roe==SUPPRESSION.ROE.Return then +group:OptionROEReturnFire() +else +self:E(self.lid.."Unknown ROE requested: "..tostring(roe)) +group:OptionROEOpenFire() +self.CurrentROE=SUPPRESSION.ROE.Free +end +local text=string.format("Group %s now has ROE %s.",self.Controllable:GetName(),self.CurrentROE) +self:T(self.lid..text) +end +function SUPPRESSION:_SetAlarmState(state) +local group=self.Controllable +state=state or self.DefaultAlarmState +self.CurrentAlarmState=state +if state==SUPPRESSION.AlarmState.Auto then +group:OptionAlarmStateAuto() +elseif state==SUPPRESSION.AlarmState.Green then +group:OptionAlarmStateGreen() +elseif state==SUPPRESSION.AlarmState.Red then +group:OptionAlarmStateRed() +else +self:E(self.lid.."Unknown alarm state requested: "..tostring(state)) +group:OptionAlarmStateAuto() +self.CurrentAlarmState=SUPPRESSION.AlarmState.Auto +end +local text=string.format("Group %s now has Alarm State %s.",self.Controllable:GetName(),self.CurrentAlarmState) +self:T(self.lid..text) +end +function SUPPRESSION:_EventFromTo(BA,Event,From,To) +local text=string.format("\n%s: %s EVENT %s: %s --> %s",BA,self.Controllable:GetName(),Event,From,To) +self:T2(self.lid..text) +end +PSEUDOATC={ +ClassName="PSEUDOATC", +group={}, +Debug=false, +mdur=30, +mrefresh=120, +talt=3, +chatty=true, +eventsmoose=true, +reportplayername=false, +} +PSEUDOATC.id="PseudoATC | " +PSEUDOATC.version="0.10.5" +function PSEUDOATC:New() +local self=BASE:Inherit(self,BASE:New()) +self:E(PSEUDOATC.id..string.format("PseudoATC version %s",PSEUDOATC.version)) +return self +end +function PSEUDOATC:Start() +self:F() +self:I(PSEUDOATC.id.."Starting PseudoATC") +self:HandleEvent(EVENTS.Birth,self._OnBirth) +self:HandleEvent(EVENTS.Land,self._PlayerLanded) +self:HandleEvent(EVENTS.Takeoff,self._PlayerTakeOff) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._PlayerLeft) +self:HandleEvent(EVENTS.Crash,self._PlayerLeft) +end +function PSEUDOATC:DebugOn() +self.Debug=true +end +function PSEUDOATC:DebugOff() +self.Debug=false +end +function PSEUDOATC:ChattyOn() +self.chatty=true +end +function PSEUDOATC:ChattyOff() +self.chatty=false +end +function PSEUDOATC:SetMessageDuration(duration) +self.mdur=duration or 30 +end +function PSEUDOATC:SetReportPlayername() +self.reportplayername=true +return self +end +function PSEUDOATC:SetMenuRefresh(interval) +self.mrefresh=interval or 120 +end +function PSEUDOATC:SetEventsMoose(switch) +self.eventsmoose=switch +end +function PSEUDOATC:SetReportAltInterval(interval) +self.talt=interval or 3 +end +function PSEUDOATC:_OnBirth(EventData) +self:F({EventData=EventData}) +local _unitName=EventData.IniUnitName +local _unit=EventData.IniUnit +local _playername=EventData.IniPlayerName +if _unit and _playername then +self:PlayerEntered(_unit) +end +end +function PSEUDOATC:_PlayerLeft(EventData) +self:F({EventData=EventData}) +local _unitName=EventData.IniUnitName +local _unit=EventData.IniUnit +local _playername=EventData.IniPlayerName +if _unit and _playername then +self:PlayerLeft(_unit) +end +end +function PSEUDOATC:_PlayerLanded(EventData) +self:F({EventData=EventData}) +local _unitName=EventData.IniUnitName +local _unit=EventData.IniUnit +local _playername=EventData.IniPlayerName +local _base=nil +local _baseName=nil +if EventData.place then +_base=EventData.place +_baseName=EventData.place:getName() +end +if _unit and _playername and _base then +self:PlayerLanded(_unit,_baseName) +end +end +function PSEUDOATC:_PlayerTakeOff(EventData) +self:F({EventData=EventData}) +local _unitName=EventData.IniUnitName +local _unit=EventData.IniUnit +local _playername=EventData.IniPlayerName +local _base=nil +local _baseName=nil +if EventData.place then +_base=EventData.place +_baseName=EventData.place:getName() +end +if _unit and _playername and _base then +self:PlayerTakeOff(_unit,_baseName) +end +end +function PSEUDOATC:PlayerEntered(unit) +self:F2({unit=unit}) +local group=unit:GetGroup() +local GID=group:GetID() +local GroupName=group:GetName() +local PlayerName=unit:GetPlayerName() +local UnitName=unit:GetName() +local CallSign=unit:GetCallsign() +local UID=unit:GetDCSObject():getID() +if not self.group[GID]then +self.group[GID]={} +self.group[GID].player={} +end +self.group[GID].player[UID]={} +self.group[GID].player[UID].group=group +self.group[GID].player[UID].unit=unit +self.group[GID].player[UID].groupname=GroupName +self.group[GID].player[UID].unitname=UnitName +self.group[GID].player[UID].playername=PlayerName +self.group[GID].player[UID].callsign=CallSign +self.group[GID].player[UID].waypoints=group:GetTaskRoute() +local text=string.format("Player %s entered unit %s of group %s (id=%d).",PlayerName,UnitName,GroupName,GID) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +local countPlayerInGroup=0 +for _ in pairs(self.group[GID].player)do countPlayerInGroup=countPlayerInGroup+1 end +if countPlayerInGroup<=1 then +self.group[GID].menu_main=missionCommands.addSubMenuForGroup(GID,"Pseudo ATC") +end +self:MenuCreatePlayer(GID,UID) +self:LocalAirports(GID,UID) +self:MenuAirports(GID,UID) +self:MenuWaypoints(GID,UID) +self.group[GID].player[UID].scheduler,self.group[GID].player[UID].schedulerid=SCHEDULER:New(nil,self.MenuRefresh,{self,GID,UID},self.mrefresh,self.mrefresh) +end +function PSEUDOATC:PlayerLanded(unit,place) +self:F2({unit=unit,place=place}) +local group=unit:GetGroup() +local GID=group:GetID() +local UID=unit:GetDCSObject():getID() +local PlayerName=unit:GetPlayerName()or"Ghost" +local UnitName=unit:GetName()or"Ghostplane" +local GroupName=group:GetName()or"Ghostgroup" +if self.Debug then +local text=string.format("Player %s in unit %s of group %s landed at %s.",PlayerName,UnitName,GroupName,place) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +end +self:AltitudeTimerStop(GID,UID) +if place and self.chatty then +local text=string.format("Touchdown! Welcome to %s pilot %s. Have a nice day!",place,PlayerName) +MESSAGE:New(text,self.mdur):ToGroup(group) +end +end +function PSEUDOATC:PlayerTakeOff(unit,place) +self:F2({unit=unit,place=place}) +local group=unit:GetGroup() +local PlayerName=unit:GetPlayerName()or"Ghost" +local UnitName=unit:GetName()or"Ghostplane" +local GroupName=group:GetName()or"Ghostgroup" +local CallSign=unit:GetCallsign()or"Ghost11" +if self.Debug then +local text=string.format("Player %s in unit %s of group %s took off at %s.",PlayerName,UnitName,GroupName,place) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +end +if place and self.chatty then +local text=string.format("%s, %s, you are airborne. Have a safe trip!",place,CallSign) +if self.reportplayername then +text=string.format("%s, %s, you are airborne. Have a safe trip!",place,PlayerName) +end +MESSAGE:New(text,self.mdur):ToGroup(group) +end +end +function PSEUDOATC:PlayerLeft(unit) +self:F({unit=unit}) +local group=unit:GetGroup() +local GID=group:GetID() +local UID=unit:GetDCSObject():getID() +if self.group[GID]and self.group[GID].player and self.group[GID].player[UID]then +local PlayerName=self.group[GID].player[UID].playername +local CallSign=self.group[GID].player[UID].callsign +local UnitName=self.group[GID].player[UID].unitname +local GroupName=self.group[GID].player[UID].groupname +local text=string.format("Player %s (callsign %s) of group %s just left unit %s.",PlayerName,CallSign,GroupName,UnitName) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +if self.group[GID].player[UID].schedulerid then +self.group[GID].player[UID].scheduler:Stop(self.group[GID].player[UID].schedulerid) +end +self:AltitudeTimerStop(GID,UID) +if self.group[GID].player[UID].menu_own then +missionCommands.removeItemForGroup(GID,self.group[GID].player[UID].menu_own) +end +local countPlayerInGroup=0 +for _ in pairs(self.group[GID].player)do countPlayerInGroup=countPlayerInGroup+1 end +if self.group[GID].menu_main and countPlayerInGroup==1 then +missionCommands.removeItemForGroup(GID,self.group[GID].menu_main) +end +self.group[GID].player[UID]=nil +end +end +function PSEUDOATC:MenuRefresh(GID,UID) +self:F({GID=GID,UID=UID}) +local text=string.format("Refreshing menues for player %s in group %s.",self.group[GID].player[UID].playername,self.group[GID].player[UID].groupname) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +self:MenuClear(GID,UID) +self:LocalAirports(GID,UID) +self:MenuAirports(GID,UID) +self:MenuWaypoints(GID,UID) +end +function PSEUDOATC:MenuCreatePlayer(GID,UID) +self:F({GID=GID,UID=UID}) +local PlayerName=self.group[GID].player[UID].playername +self.group[GID].player[UID].menu_own=missionCommands.addSubMenuForGroup(GID,PlayerName,self.group[GID].menu_main) +end +function PSEUDOATC:MenuClear(GID,UID) +self:F({GID=GID,UID=UID}) +local text=string.format("Clearing menus for player %s in group %s.",self.group[GID].player[UID].playername,self.group[GID].player[UID].groupname) +self:T(PSEUDOATC.id..text) +MESSAGE:New(text,30):ToAllIf(self.Debug) +if self.group[GID].player[UID].menu_airports then +missionCommands.removeItemForGroup(GID,self.group[GID].player[UID].menu_airports) +self.group[GID].player[UID].menu_airports=nil +else +self:T2(PSEUDOATC.id.."No airports to clear menus.") +end +if self.group[GID].player[UID].menu_waypoints then +missionCommands.removeItemForGroup(GID,self.group[GID].player[UID].menu_waypoints) +self.group[GID].player[UID].menu_waypoints=nil +end +if self.group[GID].player[UID].menu_reportalt then +missionCommands.removeItemForGroup(GID,self.group[GID].player[UID].menu_reportalt) +self.group[GID].player[UID].menu_reportalt=nil +end +if self.group[GID].player[UID].menu_requestalt then +missionCommands.removeItemForGroup(GID,self.group[GID].player[UID].menu_requestalt) +self.group[GID].player[UID].menu_requestalt=nil +end +end +function PSEUDOATC:MenuAirports(GID,UID) +self:F({GID=GID,UID=UID}) +self.group[GID].player[UID].menu_airports=missionCommands.addSubMenuForGroup(GID,"Local Airports",self.group[GID].player[UID].menu_own) +local i=0 +for _,airport in pairs(self.group[GID].player[UID].airports)do +i=i+1 +if i>10 then +break +end +local name=airport.name +local d=airport.distance +local pos=AIRBASE:FindByName(name):GetCoordinate() +local submenu=missionCommands.addSubMenuForGroup(GID,name,self.group[GID].player[UID].menu_airports) +missionCommands.addCommandForGroup(GID,"Weather Report",submenu,self.ReportWeather,self,GID,UID,pos,name) +missionCommands.addCommandForGroup(GID,"Request BR",submenu,self.ReportBR,self,GID,UID,pos,name) +self:T(string.format(PSEUDOATC.id.."Creating airport menu item %s for ID %d",name,GID)) +end +end +function PSEUDOATC:MenuWaypoints(GID,UID) +self:F({GID=GID,UID=UID}) +local callsign=self.group[GID].player[UID].callsign +self:T(PSEUDOATC.id..string.format("Creating waypoint menu for %s (ID %d).",callsign,GID)) +if#self.group[GID].player[UID].waypoints>0 then +self.group[GID].player[UID].menu_waypoints=missionCommands.addSubMenuForGroup(GID,"Waypoints",self.group[GID].player[UID].menu_own) +local j=0 +for i,wp in pairs(self.group[GID].player[UID].waypoints)do +j=j+1 +if j>10 then +break +end +local pos=COORDINATE:New(wp.x,wp.alt,wp.y) +local name=string.format("Waypoint %d",i-1) +if wp.name and wp.name~=""then +name=string.format("Waypoint %s",wp.name) +end +local submenu=missionCommands.addSubMenuForGroup(GID,name,self.group[GID].player[UID].menu_waypoints) +missionCommands.addCommandForGroup(GID,"Weather Report",submenu,self.ReportWeather,self,GID,UID,pos,name) +missionCommands.addCommandForGroup(GID,"Request BR",submenu,self.ReportBR,self,GID,UID,pos,name) +end +end +self.group[GID].player[UID].menu_reportalt=missionCommands.addCommandForGroup(GID,"Talk me down",self.group[GID].player[UID].menu_own,self.AltidudeTimerToggle,self,GID,UID) +self.group[GID].player[UID].menu_requestalt=missionCommands.addCommandForGroup(GID,"Request altitude",self.group[GID].player[UID].menu_own,self.ReportHeight,self,GID,UID) +end +function PSEUDOATC:ReportWeather(GID,UID,position,location) +self:F({GID=GID,UID=UID,position=position,location=location}) +local settings=_DATABASE:GetPlayerSettings(self.group[GID].player[UID].playername)or _SETTINGS +local text=string.format("Local weather at %s:\n",location) +local Pqnh=position:GetPressure(0) +local Pqfe=position:GetPressure() +local hPa2inHg=0.0295299830714 +local hPa2mmHg=0.7500615613030 +local _Pqnh=string.format("%.2f inHg",Pqnh*hPa2inHg) +local _Pqfe=string.format("%.2f inHg",Pqfe*hPa2inHg) +if settings:IsMetric()then +_Pqnh=string.format("%.1f mmHg",Pqnh*hPa2mmHg) +_Pqfe=string.format("%.1f mmHg",Pqfe*hPa2mmHg) +end +text=text..string.format("QFE %.1f hPa = %s.\n",Pqfe,_Pqfe) +text=text..string.format("QNH %.1f hPa = %s.\n",Pqnh,_Pqnh) +local T=position:GetTemperature() +local _T=string.format('%d°F',UTILS.CelsiusToFahrenheit(T)) +if settings:IsMetric()then +_T=string.format('%d°C',T) +end +local text=text..string.format("Temperature %s\n",_T) +local Dir,Vel=position:GetWind() +local Bn,Bd=UTILS.BeaufortScale(Vel) +local Ds=string.format('%03d°',Dir) +local Vs=string.format("%.1f knots",UTILS.MpsToKnots(Vel)) +if settings:IsMetric()then +Vs=string.format('%.1f m/s',Vel) +end +local text=text..string.format("%s, Wind from %s at %s (%s).",self.group[GID].player[UID].playername,Ds,Vs,Bd) +self:_DisplayMessageToGroup(self.group[GID].player[UID].unit,text,self.mdur,true) +end +function PSEUDOATC:ReportBR(GID,UID,position,location) +self:F({GID=GID,UID=UID,position=position,location=location}) +local unit=self.group[GID].player[UID].unit +local coord=unit:GetCoordinate() +local angle=coord:HeadingTo(position) +local range=coord:Get2DDistance(position) +local Bs=string.format('%03d°',angle) +local settings=_DATABASE:GetPlayerSettings(self.group[GID].player[UID].playername)or _SETTINGS +local Rs=string.format("%.1f NM",UTILS.MetersToNM(range)) +if settings:IsMetric()then +Rs=string.format("%.1f km",range/1000) +end +local text=string.format("%s: Bearing %s, Range %s.",location,Bs,Rs) +self:_DisplayMessageToGroup(self.group[GID].player[UID].unit,text,self.mdur,true) +end +function PSEUDOATC:ReportHeight(GID,UID,dt,_clear) +self:F({GID=GID,UID=UID,dt=dt}) +local dt=dt or self.mdur +if _clear==nil then +_clear=false +end +local function get_AGL(p) +local agl=0 +local vec2={x=p.x,y=p.z} +local ground=land.getHeight(vec2) +local agl=p.y-ground +return agl +end +local unit=self.group[GID].player[UID].unit +if unit and unit:IsAlive()then +local position=unit:GetCoordinate() +local height=get_AGL(position) +local callsign=unit:GetCallsign() +local PlayerName=self.group[GID].player[UID].playername +local settings=_DATABASE:GetPlayerSettings(self.group[GID].player[UID].playername)or _SETTINGS +local Hs=string.format("%d ft",UTILS.MetersToFeet(height)) +if settings:IsMetric()then +Hs=string.format("%d m",height) +end +local _text=string.format("%s, your altitude is %s AGL.",callsign,Hs) +if self.reportplayername then +_text=string.format("%s, your altitude is %s AGL.",PlayerName,Hs) +end +if _clear==false then +_text=_text..string.format(" FL%03d.",position.y/30.48) +end +self:_DisplayMessageToGroup(self.group[GID].player[UID].unit,_text,dt,_clear) +return height +end +return 0 +end +function PSEUDOATC:AltidudeTimerToggle(GID,UID) +self:F({GID=GID,UID=UID}) +if self.group[GID].player[UID].altimerid then +self:AltitudeTimerStop(GID,UID) +else +self:AltitudeTimeStart(GID,UID) +end +end +function PSEUDOATC:AltitudeTimeStart(GID,UID) +self:F({GID=GID,UID=UID}) +self:T(PSEUDOATC.id..string.format("Starting altitude report timer for player ID %d.",UID)) +self.group[GID].player[UID].altimer,self.group[GID].player[UID].altimerid=SCHEDULER:New(nil,self.ReportHeight,{self,GID,UID,1,true},1,3) +end +function PSEUDOATC:AltitudeTimerStop(GID,UID) +self:F({GID=GID,UID=UID}) +self:T(PSEUDOATC.id..string.format("Stopping altitude report timer for player ID %d.",UID)) +if self.group[GID].player[UID].altimerid then +self.group[GID].player[UID].altimer:Stop(self.group[GID].player[UID].altimerid) +end +self.group[GID].player[UID].altimer=nil +self.group[GID].player[UID].altimerid=nil +end +function PSEUDOATC:LocalAirports(GID,UID) +self:F({GID=GID,UID=UID}) +self.group[GID].player[UID].airports=nil +self.group[GID].player[UID].airports={} +local pos=self.group[GID].player[UID].unit:GetCoordinate() +for i=0,2 do +local airports=coalition.getAirbases(i) +for _,airbase in pairs(airports)do +local name=airbase:getName() +local a=AIRBASE:FindByName(name) +if a then +local q=a:GetCoordinate() +local d=q:Get2DDistance(pos) +table.insert(self.group[GID].player[UID].airports,{distance=d,name=name}) +end +end +end +local function compare(a,b) +return a.distance<b.distance +end +table.sort(self.group[GID].player[UID].airports,compare) +end +function PSEUDOATC:_GetPlayerUnitAndName(_unitName) +self:F(_unitName) +if _unitName~=nil then +local DCSunit=Unit.getByName(_unitName) +if DCSunit then +local playername=DCSunit:getPlayerName() +local unit=UNIT:Find(DCSunit) +self:T2({DCSunit=DCSunit,unit=unit,playername=playername}) +if unit and playername then +return unit,playername +end +end +end +return nil,nil +end +function PSEUDOATC:_DisplayMessageToGroup(_unit,_text,_time,_clear) +self:F({unit=_unit,text=_text,time=_time,clear=_clear}) +_time=_time or self.Tmsg +if _clear==nil then +_clear=false +end +local _gid=_unit:GetGroup():GetID() +if _gid then +if _clear==true then +trigger.action.outTextForGroup(_gid,_text,_time,_clear) +else +trigger.action.outTextForGroup(_gid,_text,_time) +end +end +end +function PSEUDOATC:_myname(unitname) +self:F2(unitname) +local unit=UNIT:FindByName(unitname) +local pname=unit:GetPlayerName() +local csign=unit:GetCallsign() +return string.format("%s (%s)",csign,pname) +end +WAREHOUSE={ +ClassName="WAREHOUSE", +Debug=false, +verbosity=0, +lid=nil, +Report=true, +warehouse=nil, +alias=nil, +zone=nil, +airbase=nil, +airbasename=nil, +road=nil, +rail=nil, +spawnzone=nil, +uid=nil, +dTstatus=30, +queueid=0, +stock={}, +queue={}, +pending={}, +transporting={}, +delivered={}, +defending={}, +portzone=nil, +harborzone=nil, +shippinglanes={}, +offroadpaths={}, +autodefence=false, +spawnzonemaxdist=5000, +autosave=false, +autosavepath=nil, +autosavefile=nil, +saveparking=false, +isUnit=false, +isShip=false, +lowfuelthresh=0.15, +respawnafterdestroyed=false, +respawndelay=nil, +} +WAREHOUSE.Descriptor={ +GROUPNAME="templatename", +UNITTYPE="unittype", +ATTRIBUTE="attribute", +CATEGORY="category", +ASSIGNMENT="assignment", +ASSETLIST="assetlist," +} +WAREHOUSE.Attribute={ +AIR_TRANSPORTPLANE="Air_TransportPlane", +AIR_AWACS="Air_AWACS", +AIR_FIGHTER="Air_Fighter", +AIR_BOMBER="Air_Bomber", +AIR_TANKER="Air_Tanker", +AIR_TRANSPORTHELO="Air_TransportHelo", +AIR_ATTACKHELO="Air_AttackHelo", +AIR_UAV="Air_UAV", +AIR_OTHER="Air_OtherAir", +GROUND_APC="Ground_APC", +GROUND_TRUCK="Ground_Truck", +GROUND_INFANTRY="Ground_Infantry", +GROUND_IFV="Ground_IFV", +GROUND_ARTILLERY="Ground_Artillery", +GROUND_TANK="Ground_Tank", +GROUND_TRAIN="Ground_Train", +GROUND_EWR="Ground_EWR", +GROUND_AAA="Ground_AAA", +GROUND_SAM="Ground_SAM", +GROUND_OTHER="Ground_OtherGround", +NAVAL_AIRCRAFTCARRIER="Naval_AircraftCarrier", +NAVAL_WARSHIP="Naval_WarShip", +NAVAL_ARMEDSHIP="Naval_ArmedShip", +NAVAL_UNARMEDSHIP="Naval_UnarmedShip", +NAVAL_OTHER="Naval_OtherNaval", +OTHER_UNKNOWN="Other_Unknown", +} +WAREHOUSE.TransportType={ +AIRPLANE="Air_TransportPlane", +HELICOPTER="Air_TransportHelo", +APC="Ground_APC", +TRAIN="Ground_Train", +SHIP="Naval_UnarmedShip", +AIRCRAFTCARRIER="Naval_AircraftCarrier", +WARSHIP="Naval_WarShip", +ARMEDSHIP="Naval_ArmedShip", +SELFPROPELLED="Selfpropelled", +} +WAREHOUSE.Quantity={ +ALL="all", +THREEQUARTERS="3/4", +HALF="1/2", +THIRD="1/3", +QUARTER="1/4", +} +_WAREHOUSEDB={ +AssetID=0, +Assets={}, +WarehouseID=0, +Warehouses={} +} +WAREHOUSE.version="1.0.2a" +function WAREHOUSE:New(warehouse,alias) +local self=BASE:Inherit(self,FSM:New()) +if type(warehouse)=="string"then +local warehousename=warehouse +warehouse=UNIT:FindByName(warehousename) +if warehouse==nil then +warehouse=STATIC:FindByName(warehousename,true) +end +end +if warehouse==nil then +env.error("ERROR: Warehouse does not exist!") +return nil +end +if warehouse:IsInstanceOf("STATIC")then +self.isUnit=false +elseif warehouse:IsInstanceOf("UNIT")then +self.isUnit=true +if warehouse:IsShip()then +self.isShip=true +end +else +env.error("ERROR: Warehouse is neither STATIC nor UNIT object!") +return nil +end +self.alias=alias or warehouse:GetName() +self.lid=string.format("WAREHOUSE %s | ",self.alias) +self:I(self.lid..string.format("Adding warehouse v%s for structure %s [isUnit=%s, isShip=%s]",WAREHOUSE.version,warehouse:GetName(),tostring(self:IsUnit()),tostring(self:IsShip()))) +self.warehouse=warehouse +_WAREHOUSEDB.WarehouseID=_WAREHOUSEDB.WarehouseID+1 +self.uid=_WAREHOUSEDB.WarehouseID +self.coalition=self.warehouse:GetCoalition() +self.countryid=self.warehouse:GetCountry() +local _airbase=self:GetCoordinate():GetClosestAirbase(nil,self:GetCoalition()) +if _airbase and _airbase:GetCoordinate():Get2DDistance(self:GetCoordinate())<=5000 then +self:SetAirbase(_airbase) +end +if self.isShip then +self.zone=ZONE_AIRBASE:New(self.warehouse:GetName(),1000) +self.spawnzone=ZONE_AIRBASE:New(self.warehouse:GetName(),1000) +else +self.zone=ZONE_RADIUS:New(string.format("Warehouse zone %s",self.warehouse:GetName()),warehouse:GetVec2(),500) +self.spawnzone=ZONE_RADIUS:New(string.format("Warehouse %s spawn zone",self.warehouse:GetName()),warehouse:GetVec2(),250) +end +self:SetMarker(true) +self:SetReportOff() +self:SetRunwayRepairtime() +self.allowSpawnOnClientSpots=false +_WAREHOUSEDB.Warehouses[self.uid]=self +self:SetStartState("NotReadyYet") +self:AddTransition("NotReadyYet","Load","Loaded") +self:AddTransition("Stopped","Load","Loaded") +self:AddTransition("NotReadyYet","Start","Running") +self:AddTransition("Loaded","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","AddAsset","*") +self:AddTransition("*","NewAsset","*") +self:AddTransition("*","AddRequest","*") +self:AddTransition("Running","Request","*") +self:AddTransition("Running","RequestSpawned","*") +self:AddTransition("Attacked","Request","*") +self:AddTransition("*","Unloaded","*") +self:AddTransition("*","AssetSpawned","*") +self:AddTransition("*","AssetLowFuel","*") +self:AddTransition("*","Arrived","*") +self:AddTransition("*","Delivered","*") +self:AddTransition("Running","SelfRequest","*") +self:AddTransition("Attacked","SelfRequest","*") +self:AddTransition("Running","Pause","Paused") +self:AddTransition("Paused","Unpause","Running") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("Stopped","Restart","Running") +self:AddTransition("Loaded","Restart","Running") +self:AddTransition("*","Save","*") +self:AddTransition("*","Attacked","Attacked") +self:AddTransition("Attacked","Defeated","Running") +self:AddTransition("*","ChangeCountry","*") +self:AddTransition("Attacked","Captured","Running") +self:AddTransition("*","AirbaseCaptured","*") +self:AddTransition("*","AirbaseRecaptured","*") +self:AddTransition("*","RunwayDestroyed","*") +self:AddTransition("*","RunwayRepaired","*") +self:AddTransition("*","AssetDead","*") +self:AddTransition("*","Destroyed","Destroyed") +self:AddTransition("Destroyed","Respawn","Running") +return self +end +function WAREHOUSE:SetDebugOn() +self.Debug=true +return self +end +function WAREHOUSE:SetDebugOff() +self.Debug=false +return self +end +function WAREHOUSE:SetReportOn() +self.Report=true +return self +end +function WAREHOUSE:SetReportOff() +self.Report=false +return self +end +function WAREHOUSE:SetSafeParkingOn() +self.safeparking=true +return self +end +function WAREHOUSE:SetSafeParkingOff() +self.safeparking=false +return self +end +function WAREHOUSE:SetAllowSpawnOnClientParking() +self.allowSpawnOnClientSpots=true +return self +end +function WAREHOUSE:SetLowFuelThreshold(threshold) +self.lowfuelthresh=threshold or 0.15 +return self +end +function WAREHOUSE:SetStatusUpdate(timeinterval) +self.dTstatus=timeinterval +return self +end +function WAREHOUSE:SetVerbosityLevel(VerbosityLevel) +self.verbosity=VerbosityLevel or 0 +return self +end +function WAREHOUSE:SetSpawnZone(zone,maxdist) +self.spawnzone=zone +self.spawnzonemaxdist=maxdist or 5000 +return self +end +function WAREHOUSE:GetSpawnZone() +return self.spawnzone +end +function WAREHOUSE:SetWarehouseZone(zone) +self.zone=zone +return self +end +function WAREHOUSE:GetWarehouseZone() +return self.zone +end +function WAREHOUSE:SetAutoDefenceOn() +self.autodefence=true +return self +end +function WAREHOUSE:SetAutoDefenceOff() +self.autodefence=false +return self +end +function WAREHOUSE:SetParkingIDs(ParkingIDs) +if type(ParkingIDs)~="table"then +ParkingIDs={ParkingIDs} +end +self.parkingIDs=ParkingIDs +return self +end +function WAREHOUSE:_CheckParkingValid(spot) +if self.parkingIDs==nil then +return true +end +for _,id in pairs(self.parkingIDs or{})do +if spot.TerminalID==id then +return true +end +end +return false +end +function WAREHOUSE:_CheckParkingAsset(spot,asset) +if asset.parkingIDs==nil then +return true +end +for _,id in pairs(asset.parkingIDs or{})do +if spot.TerminalID==id then +return true +end +end +return false +end +function WAREHOUSE:SetSaveOnMissionEnd(path,filename) +self.autosave=true +self.autosavepath=path +self.autosavefile=filename +return self +end +function WAREHOUSE:SetMarker(switch) +if switch==false then +self.markerOn=false +else +self.markerOn=true +end +return self +end +function WAREHOUSE:SetRespawnAfterDestroyed(delay) +self.respawnafterdestroyed=true +self.respawndelay=delay +return self +end +function WAREHOUSE:SetAirbase(airbase) +self.airbase=airbase +if airbase~=nil then +self.airbasename=airbase:GetName() +else +self.airbasename=nil +end +return self +end +function WAREHOUSE:SetRoadConnection(coordinate) +if coordinate then +self.road=coordinate:GetClosestPointToRoad() +else +self.road=false +end +return self +end +function WAREHOUSE:SetRailConnection(coordinate) +if coordinate then +self.rail=coordinate:GetClosestPointToRoad(true) +else +self.rail=false +end +return self +end +function WAREHOUSE:SetPortZone(zone) +self.portzone=zone +return self +end +function WAREHOUSE:SetHarborZone(zone) +self.harborzone=zone +return self +end +function WAREHOUSE:AddShippingLane(remotewarehouse,group,oneway) +if self.portzone==nil or remotewarehouse.portzone==nil then +local text=string.format("ERROR: Sending or receiving warehouse does not have a port zone defined. Adding shipping lane not possible!") +self:_ErrorMessage(text,5) +return self +end +local startcoord=self.portzone:GetRandomCoordinate() +local finalcoord=remotewarehouse.portzone:GetRandomCoordinate() +local lane=self:_NewLane(group,startcoord,finalcoord) +if self.Debug then +for i=1,#lane do +local coord=lane[i] +local text=string.format("Shipping lane %s to %s. Point %d.",self.alias,remotewarehouse.alias,i) +coord:MarkToCoalition(text,self:GetCoalition()) +end +end +local remotename=remotewarehouse.warehouse:GetName() +if self.shippinglanes[remotename]==nil then +self.shippinglanes[remotename]={} +end +table.insert(self.shippinglanes[remotename],lane) +if not oneway then +remotewarehouse:AddShippingLane(self,group,true) +end +return self +end +function WAREHOUSE:AddOffRoadPath(remotewarehouse,group,oneway) +local startcoord=self.spawnzone:GetRandomCoordinate() +local finalcoord=remotewarehouse.spawnzone:GetRandomCoordinate() +local path=self:_NewLane(group,startcoord,finalcoord) +if path==nil then +self:E(self.lid.."ERROR: Offroad path could not be added. Group present in ME?") +return +end +if path and self.Debug then +for i=1,#path do +local coord=path[i] +local text=string.format("Off road path from %s to %s. Point %d.",self.alias,remotewarehouse.alias,i) +coord:MarkToCoalition(text,self:GetCoalition()) +end +end +local remotename=remotewarehouse.warehouse:GetName() +if self.offroadpaths[remotename]==nil then +self.offroadpaths[remotename]={} +end +table.insert(self.offroadpaths[remotename],path) +if not oneway then +remotewarehouse:AddOffRoadPath(self,group,true) +end +return self +end +function WAREHOUSE:_NewLane(group,startcoord,finalcoord) +local lane=nil +if group then +local lanepoints=group:GetTemplateRoutePoints() +local laneF=lanepoints[1] +local laneL=lanepoints[#lanepoints] +local coordF=COORDINATE:New(laneF.x,0,laneF.y) +local coordL=COORDINATE:New(laneL.x,0,laneL.y) +local distF=startcoord:Get2DDistance(coordF) +local distL=startcoord:Get2DDistance(coordL) +lane={} +if distF<distL then +for i=1,#lanepoints do +local point=lanepoints[i] +local coord=COORDINATE:New(point.x,0,point.y) +table.insert(lane,coord) +end +else +for i=#lanepoints,1,-1 do +local point=lanepoints[i] +local coord=COORDINATE:New(point.x,0,point.y) +table.insert(lane,coord) +end +end +table.insert(lane,#lane,finalcoord) +end +return lane +end +function WAREHOUSE:IsNotReadyYet() +return self:is("NotReadyYet") +end +function WAREHOUSE:IsLoaded() +return self:is("Loaded") +end +function WAREHOUSE:IsRunning() +return self:is("Running") +end +function WAREHOUSE:IsPaused() +return self:is("Paused") +end +function WAREHOUSE:IsAttacked() +return self:is("Attacked") +end +function WAREHOUSE:IsDestroyed() +return self:is("Destroyed") +end +function WAREHOUSE:IsStopped() +return self:is("Stopped") +end +function WAREHOUSE:HasConnectionRoad(warehouse,markpath,smokepath) +if warehouse then +if self.road and warehouse.road then +local _,length,gotpath=self.road:GetPathOnRoad(warehouse.road,false,false,markpath,smokepath) +return gotpath,length or-1 +else +return false,-1 +end +end +return nil,-1 +end +function WAREHOUSE:HasConnectionRail(warehouse,markpath,smokepath) +if warehouse then +if self.rail and warehouse.rail then +local _,length,gotpath=self.road:GetPathOnRoad(warehouse.road,false,true,markpath,smokepath) +return gotpath,length or-1 +else +return false,-1 +end +end +return nil,-1 +end +function WAREHOUSE:HasConnectionNaval(warehouse,markpath,smokepath) +if warehouse then +if warehouse.warehouse:GetName()==self.warehouse:GetName()then +return true,1 +end +local shippinglane=self.shippinglanes[warehouse.warehouse:GetName()] +if shippinglane then +return true,1 +else +self:T2(string.format("No shipping lane defined between warehouse %s and %s!",self.alias,warehouse.alias)) +end +end +return nil,-1 +end +function WAREHOUSE:HasConnectionOffRoad(warehouse,markpath,smokepath) +if warehouse then +if warehouse.warehouse:GetName()==self.warehouse:GetName()then +return true,1 +end +local offroadpath=self.offroadpaths[warehouse.warehouse:GetName()] +if offroadpath~=nil then +return true,1 +else +self:T2(string.format("No off-road path defined between warehouse %s and %s!",self.alias,warehouse.alias)) +end +end +return nil,-1 +end +function WAREHOUSE:GetNumberOfAssets(Descriptor,DescriptorValue,OnlyMobile) +if Descriptor==nil or DescriptorValue==nil then +return#self.stock +else +local _stock,_nstock=self:_FilterStock(self.stock,Descriptor,DescriptorValue,nil,OnlyMobile) +return _nstock +end +end +function WAREHOUSE:GetCoordinate() +return self.warehouse:GetCoord() +end +function WAREHOUSE:GetVec3() +local vec3=self.warehouse:GetVec3() +return vec3 +end +function WAREHOUSE:GetVec2() +local vec2=self.warehouse:GetVec2() +return vec2 +end +function WAREHOUSE:GetCoalition() +return self.warehouse:GetCoalition() +end +function WAREHOUSE:GetCoalitionName() +return self.warehouse:GetCoalitionName() +end +function WAREHOUSE:GetCountry() +return self.warehouse:GetCountry() +end +function WAREHOUSE:GetCountryName() +return self.warehouse:GetCountryName() +end +function WAREHOUSE:GetAirbase() +return self.airbase +end +function WAREHOUSE:GetAirbaseName() +local name="none" +if self.airbase then +name=self.airbase:GetName() +end +return name +end +function WAREHOUSE:GetAirbaseCategory() +local category=-1 +if self.airbase then +category=self.airbase:GetAirbaseCategory() +end +return category +end +function WAREHOUSE:GetAssignment(request) +return tostring(request.assignment) +end +function WAREHOUSE:FindWarehouseInDB(uid) +return _WAREHOUSEDB.Warehouses[uid] +end +function WAREHOUSE:FindNearestWarehouse(MinAssets,Descriptor,DescriptorValue,Coalition,RefCoordinate) +if Descriptor~=nil and DescriptorValue~=nil then +MinAssets=MinAssets or 1 +else +MinAssets=MinAssets or 0 +end +local anycoalition=nil +if Coalition~=nil then +if Coalition==false then +anycoalition=true +else +end +else +if self~=nil then +Coalition=self:GetCoalition() +else +anycoalition=true +end +end +local coord=RefCoordinate or self:GetCoordinate() +local nearest=nil +local distmin=nil +for wid,warehouse in pairs(_WAREHOUSEDB.Warehouses)do +local warehouse=warehouse +local dist=coord:Get2DDistance(warehouse:GetCoordinate()) +if dist>0 then +local samecoalition=anycoalition or Coalition==warehouse:GetCoalition() +if samecoalition and not(warehouse:IsNotReadyYet()or warehouse:IsStopped()or warehouse:IsDestroyed())then +local nassets=warehouse:GetNumberOfAssets(Descriptor,DescriptorValue) +local enough=true +if Descriptor and DescriptorValue then +enough=nassets>=MinAssets +end +if enough and(distmin==nil or dist<distmin)then +distmin=dist +nearest=warehouse +end +end +end +end +return nearest,distmin +end +function WAREHOUSE:FindAssetInDB(group) +local wid,aid,rid=self:_GetIDsFromGroup(group) +if aid~=nil then +local asset=_WAREHOUSEDB.Assets[aid] +self:T2({asset=asset}) +if asset==nil then +self:_ErrorMessage(string.format("ERROR: Asset for group %s not found in the data base!",group:GetName()),0) +end +return asset +end +self:_ErrorMessage(string.format("ERROR: Group %s does not contain an asset ID in its name!",group:GetName()),0) +return nil +end +function WAREHOUSE:IsRunwayOperational() +if self.airbase then +if self.runwaydestroyed then +return false +else +return true +end +end +return nil +end +function WAREHOUSE:SetRunwayRepairtime(RepairTime) +self.runwayrepairtime=RepairTime or 3600 +return self +end +function WAREHOUSE:GetRunwayRepairtime() +if self.runwaydestroyed then +local Tnow=timer.getAbsTime() +local Tsince=Tnow-self.runwaydestroyed +local Trepair=math.max(self.runwayrepairtime-Tsince,0) +return Trepair +end +return 0 +end +function WAREHOUSE:IsUnit() +return self.isUnit +end +function WAREHOUSE:IsStatic() +return not self.isUnit +end +function WAREHOUSE:IsShip() +return self.isShip +end +function WAREHOUSE:onafterStart(From,Event,To) +local text=string.format("Starting warehouse %s alias %s:\n",self.warehouse:GetName(),self.alias) +text=text..string.format("Coalition = %s\n",self:GetCoalitionName()) +text=text..string.format("Country = %s\n",self:GetCountryName()) +text=text..string.format("Airbase = %s (category=%d)\n",self:GetAirbaseName(),self:GetAirbaseCategory()) +env.info(text) +self.warehouse:SetState(self.warehouse,"WAREHOUSE",self) +local _road=self.spawnzone:GetCoordinate():GetClosestPointToRoad() +if _road and self.road==nil then +local _Droad=_road:Get2DDistance(self.spawnzone:GetCoordinate()) +if _Droad<3000 then +self.road=_road +end +end +if self.road and self.markerOn then +self.markroad=self.road:MarkToCoalition(string.format("%s road connection.",self.alias),self:GetCoalition(),true) +end +local _rail=self.spawnzone:GetCoordinate():GetClosestPointToRoad(true) +if _rail and self.rail==nil then +local _Drail=_rail:Get2DDistance(self.spawnzone:GetCoordinate()) +if _Drail<3000 then +self.rail=_rail +end +end +if self.rail and self.markerOn then +self.markrail=self.rail:MarkToCoalition(string.format("%s rail connection.",self.alias),self:GetCoalition(),true) +end +self:HandleEvent(EVENTS.Birth,self._OnEventBirth) +self:HandleEvent(EVENTS.EngineStartup,self._OnEventEngineStartup) +self:HandleEvent(EVENTS.Takeoff,self._OnEventTakeOff) +self:HandleEvent(EVENTS.Land,self._OnEventLanding) +self:HandleEvent(EVENTS.EngineShutdown,self._OnEventEngineShutdown) +self:HandleEvent(EVENTS.Crash,self._OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self._OnEventCrashOrDead) +self:HandleEvent(EVENTS.BaseCaptured,self._OnEventBaseCaptured) +self:HandleEvent(EVENTS.MissionEnd,self._OnEventMissionEnd) +self:HandleEvent(EVENTS.EngineShutdown,self._OnEventArrived) +self:__Status(-1) +end +function WAREHOUSE:onafterRestart(From,Event,To) +self:I(self.lid..string.format("Restarting Warehouse %s.",self.alias)) +self:HandleEvent(EVENTS.Birth,self._OnEventBirth) +self:HandleEvent(EVENTS.EngineStartup,self._OnEventEngineStartup) +self:HandleEvent(EVENTS.Takeoff,self._OnEventTakeOff) +self:HandleEvent(EVENTS.Land,self._OnEventLanding) +self:HandleEvent(EVENTS.EngineShutdown,self._OnEventEngineShutdown) +self:HandleEvent(EVENTS.Crash,self._OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self._OnEventCrashOrDead) +self:HandleEvent(EVENTS.BaseCaptured,self._OnEventBaseCaptured) +self:HandleEvent(EVENTS.EngineShutdown,self._OnEventArrived) +self:__Status(-1) +end +function WAREHOUSE:onafterStop(From,Event,To) +self:_InfoMessage(string.format("Warehouse %s stopped!",self.alias)) +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.EngineStartup) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.BaseCaptured) +self.pending=nil +self.pending={} +self.queue=nil +self.queue={} +self.stock=nil +self.stock={} +self:_UpdateWarehouseMarkText() +self.CallScheduler:Clear() +end +function WAREHOUSE:onafterPause(From,Event,To) +self:I(self.lid..string.format("Warehouse %s paused! Queued requests are not processed in this state.",self.alias)) +end +function WAREHOUSE:onafterUnpause(From,Event,To) +self:I(self.lid..string.format("Warehouse %s unpaused! Processing of requests is resumed.",self.alias)) +end +function WAREHOUSE:onafterStatus(From,Event,To) +if self.verbosity>=1 then +local FSMstate=self:GetState() +local coalition=self:GetCoalitionName() +local country=self:GetCountryName() +self:I(self.lid..string.format("State=%s %s [%s]: Assets=%d, Requests: waiting=%d, pending=%d",FSMstate,country,coalition,#self.stock,#self.queue,#self.pending)) +end +self:_JobDone() +self:_DisplayStatus() +self:_CheckConquered() +if self:IsRunwayOperational()==false then +local Trepair=self:GetRunwayRepairtime() +self:I(self.lid..string.format("Runway destroyed! Will be repaired in %d sec",Trepair)) +if Trepair==0 then +self.runwaydestroyed=nil +self:RunwayRepaired() +end +end +self:_CheckRequestConsistancy(self.queue) +if self:IsRunning()or self:IsAttacked()then +local request=self:_CheckQueue() +if request then +self:Request(request) +end +end +if self.verbosity>2 then +self:_PrintQueue(self.queue,"Queue waiting") +self:_PrintQueue(self.pending,"Queue pending") +end +self:_UpdateWarehouseMarkText() +if self.Debug then +self:_DisplayStockItems(self.stock) +end +self:__Status(-self.dTstatus) +end +function WAREHOUSE:_JobDone() +local done={} +for _,request in pairs(self.pending)do +local request=request +if request.born then +local ncargo=0 +if request.cargogroupset then +ncargo=request.cargogroupset:Count() +end +local ntransport=0 +if request.transportgroupset then +ntransport=request.transportgroupset:Count() +end +local ncargotot=request.nasset +local ncargodelivered=request.ndelivered +local ncargodead=ncargotot-ncargodelivered-ncargo +local ntransporttot=request.ntransport +local ntransporthome=request.ntransporthome +local ntransportdead=ntransporttot-ntransporthome-ntransport +local text=string.format("Request id=%d: Cargo: Ntot=%d, Nalive=%d, Ndelivered=%d, Ndead=%d | Transport: Ntot=%d, Nalive=%d, Nhome=%d, Ndead=%d", +request.uid,ncargotot,ncargo,ncargodelivered,ncargodead,ntransporttot,ntransport,ntransporthome,ntransportdead) +self:T(self.lid..text) +if ncargo==0 then +if not self.delivered[request.uid]then +self:Delivered(request) +end +if ntransport==0 then +if self.verbosity>=1 then +local text=string.format("Warehouse %s: Job on request id=%d for warehouse %s done!\n",self.alias,request.uid,request.warehouse.alias) +text=text..string.format("- %d of %d assets delivered. Casualties %d.",ncargodelivered,ncargotot,ncargodead) +if request.ntransport>0 then +text=text..string.format("\n- %d of %d transports returned home. Casualties %d.",ntransporthome,ntransporttot,ntransportdead) +end +self:_InfoMessage(text,20) +end +table.insert(done,request) +else +for _,_group in pairs(request.transportgroupset:GetSetObjects())do +local group=_group +if group and group:IsAlive()then +local category=group:GetCategory() +local speed=group:GetVelocityKMH() +local notmoving=speed<1 +local airbase=group:GetCoordinate():GetClosestAirbase():GetName() +local athomebase=self.airbase and self.airbase:GetName()==airbase +local onground=not group:InAir() +local inspawnzone=group:IsPartlyOrCompletelyInZone(self.spawnzone) +local ishome=false +if category==Group.Category.GROUND or category==Group.Category.HELICOPTER then +ishome=inspawnzone and onground and notmoving +elseif category==Group.Category.AIRPLANE then +ishome=athomebase and onground and notmoving +end +local text=string.format("Group %s: speed=%d km/h, onground=%s , airbase=%s, spawnzone=%s ==> ishome=%s",group:GetName(),speed,tostring(onground),airbase,tostring(inspawnzone),tostring(ishome)) +self:T(self.lid..text) +if ishome then +local text=string.format("Warehouse %s: Transport group arrived back home and no cargo left for request id=%d.\nSending transport group %s back to stock.",self.alias,request.uid,group:GetName()) +self:T(self.lid..text) +if self.Debug then +group:SmokeRed() +end +self:Arrived(group) +end +end +end +end +else +if ntransport==0 and request.ntransport>0 then +local ncargoalive=0 +for _,_group in pairs(request.cargogroupset:GetSetObjects())do +local groupname=_group:GetName() +local group=GROUP:FindByName(groupname.."#CARGO") +if group and group:IsAlive()then +if group:IsPartlyOrCompletelyInZone(self.spawnzone)then +if self.Debug then +group:SmokeBlue() +end +self:AddAsset(group) +ncargoalive=ncargoalive+1 +end +end +end +self:_InfoMessage(string.format("Warehouse %s: All transports of request id=%s dead! Putting remaining %s cargo assets back into warehouse!",self.alias,request.uid,ncargoalive)) +end +end +end +end +for _,request in pairs(done)do +self:_DeleteQueueItem(request,self.pending) +end +end +function WAREHOUSE:_CheckAssetStatus() +local function _CheckGroup(_request,_group) +local request=_request +local group=_group +if group and group:IsAlive()then +local category=group:GetCategory() +for _,_unit in pairs(group:GetUnits())do +local unit=_unit +if unit and unit:IsAlive()then +local unitid=unit:GetID() +local life9=unit:GetLife() +local life0=unit:GetLife0() +local life=life9/life0*100 +local speed=unit:GetVelocityMPS() +local onground=unit:InAir() +local problem=false +if life<10 then +self:T(string.format("Unit %s is heavily damaged!",unit:GetName())) +end +if speed<1 and unit:GetSpeedMax()>1 and onground then +self:T(string.format("Unit %s is not moving!",unit:GetName())) +problem=true +end +if problem then +if request.assetproblem[unitid]then +local deltaT=timer.getAbsTime()-request.assetproblem[unitid] +if deltaT>300 then +unit:Destroy() +end +else +request.assetproblem[unitid]=timer.getAbsTime() +end +end +end +end +end +end +for _,request in pairs(self.pending)do +local request=request +if request.cargogroupset then +for _,_group in pairs(request.cargogroupset:GetSet())do +local group=_group +_CheckGroup(request,group) +end +end +if request.transportgroupset then +for _,group in pairs(request.transportgroupset:GetSet())do +_CheckGroup(request,group) +end +end +end +end +function WAREHOUSE:onafterAddAsset(From,Event,To,group,ngroups,forceattribute,forcecargobay,forceweight,loadradius,skill,liveries,assignment,other) +self:T({group=group,ngroups=ngroups,forceattribute=forceattribute,forcecargobay=forcecargobay,forceweight=forceweight}) +local n=ngroups or 1 +if type(group)=="string"then +group=GROUP:FindByName(group) +end +if liveries and type(liveries)=="string"then +liveries={liveries} +end +if group then +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid and aid and rid then +local warehouse=self:FindWarehouseInDB(wid) +if warehouse then +local request=warehouse:_GetRequestOfGroup(group,warehouse.pending) +if request then +local istransport=warehouse:_GroupIsTransport(group,request) +if istransport==true then +request.ntransporthome=request.ntransporthome+1 +request.transportgroupset:Remove(group:GetName(),true) +local ntrans=request.transportgroupset:Count() +self:T2(warehouse.lid..string.format("Transport %d of %s returned home. TransportSet=%d",request.ntransporthome,tostring(request.ntransport),ntrans)) +elseif istransport==false then +request.ndelivered=request.ndelivered+1 +local namewo=self:_GetNameWithOut(group) +request.cargogroupset:Remove(namewo,true) +local ncargo=request.cargogroupset:Count() +self:T2(warehouse.lid..string.format("Cargo %s: %d of %s delivered. CargoSet=%d",namewo,request.ndelivered,tostring(request.nasset),ncargo)) +else +self:E(warehouse.lid..string.format("WARNING: Group %s is neither cargo nor transport! Need to investigate...",group:GetName())) +end +if assignment==nil and request.assignment~=nil then +assignment=request.assignment +end +end +end +local asset=self:FindAssetInDB(group) +if asset~=nil then +self:_DebugMessage(string.format("Warehouse %s: Adding KNOWN asset uid=%d with attribute=%s to stock.",self.alias,asset.uid,asset.attribute),5) +if liveries then +if type(liveries)=="table"then +asset.livery=liveries[math.random(#liveries)] +else +asset.livery=liveries +end +end +asset.skill=skill or asset.skill +asset.wid=self.uid +asset.rid=nil +asset.spawned=false +asset.requested=false +asset.isReserved=false +asset.iscargo=nil +asset.arrived=nil +if group:IsAlive()==true then +asset.damage=asset.life0-group:GetLife() +end +table.insert(self.stock,asset) +self:__NewAsset(0.1,asset,assignment or"") +else +self:_ErrorMessage(string.format("ERROR: Known asset could not be found in global warehouse db!"),0) +end +else +self:_DebugMessage(string.format("Warehouse %s: Adding %d NEW assets of group %s to stock",self.alias,n,tostring(group:GetName())),5) +local assets=self:_RegisterAsset(group,n,forceattribute,forcecargobay,forceweight,loadradius,liveries,skill,assignment) +for _,asset in pairs(assets)do +asset.wid=self.uid +asset.rid=nil +table.insert(self.stock,asset) +self:__NewAsset(0.1,asset,assignment or"") +end +end +if group:IsAlive()==true then +self:_DebugMessage(string.format("Removing group %s",group:GetName()),5) +local opsgroup=_DATABASE:GetOpsGroup(group:GetName()) +if opsgroup then +opsgroup:Despawn(0,true) +opsgroup:__Stop(-0.01) +else +group:Destroy() +end +else +local opsgroup=_DATABASE:GetOpsGroup(group:GetName()) +if opsgroup then +opsgroup:Stop() +end +end +else +self:E(self.lid.."ERROR: Unknown group added as asset!") +self:E({unknowngroup=group}) +end +end +function WAREHOUSE:_RegisterAsset(group,ngroups,forceattribute,forcecargobay,forceweight,loadradius,liveries,skill,assignment) +self:F({groupname=group:GetName(),ngroups=ngroups,forceattribute=forceattribute,forcecargobay=forcecargobay,forceweight=forceweight}) +local n=ngroups or 1 +local function _GetObjectSize(DCSdesc) +if DCSdesc.box then +local x=DCSdesc.box.max.x-DCSdesc.box.min.x +local y=DCSdesc.box.max.y-DCSdesc.box.min.y +local z=DCSdesc.box.max.z-DCSdesc.box.min.z +return math.max(x,z),x,y,z +end +return 0,0,0,0 +end +local templategroupname=group:GetName() +local Descriptors=group:GetUnit(1):GetDesc() +local Category=group:GetCategory() +local TypeName=group:GetTypeName() +local SpeedMax=group:GetSpeedMax() +local RangeMin=group:GetRange() +local smax,sx,sy,sz=_GetObjectSize(Descriptors) +local weight=0 +local cargobay={} +local cargobaytot=0 +local cargobaymax=0 +local weights={} +for _i,_unit in pairs(group:GetUnits())do +local unit=_unit +local Desc=unit:GetDesc() +local unitweight=forceweight or Desc.massEmpty +if unitweight then +weight=weight+unitweight +weights[_i]=unitweight +end +local cargomax=0 +local massfuel=Desc.fuelMassMax or 0 +local massempty=Desc.massEmpty or 0 +local massmax=Desc.massMax or 0 +cargomax=massmax-massfuel-massempty +self:T3(self.lid..string.format("Unit name=%s: mass empty=%.1f kg, fuel=%.1f kg, max=%.1f kg ==> cargo=%.1f kg",unit:GetName(),unitweight,massfuel,massmax,cargomax)) +local bay=forcecargobay or unit:GetCargoBayFreeWeight() +table.insert(cargobay,bay) +cargobaytot=cargobaytot+bay +if bay>cargobaymax then +cargobaymax=bay +end +end +local attribute=forceattribute or self:_GetAttribute(group) +local assets={} +for i=1,n do +local asset={} +_WAREHOUSEDB.AssetID=_WAREHOUSEDB.AssetID+1 +asset.uid=_WAREHOUSEDB.AssetID +asset.templatename=templategroupname +asset.template=UTILS.DeepCopy(_DATABASE.Templates.Groups[templategroupname].Template) +asset.category=Category +asset.unittype=TypeName +asset.nunits=#asset.template.units +asset.range=RangeMin +asset.speedmax=SpeedMax +asset.size=smax +asset.weight=weight +asset.weights=weights +asset.DCSdesc=Descriptors +asset.attribute=attribute +asset.cargobay=cargobay +asset.cargobaytot=cargobaytot +asset.cargobaymax=cargobaymax +asset.loadradius=loadradius +if liveries then +asset.livery=liveries[math.random(#liveries)] +end +asset.skill=skill +asset.assignment=assignment +asset.spawned=false +asset.requested=false +asset.isReserved=false +asset.life0=group:GetLife0() +asset.damage=0 +asset.spawngroupname=string.format("%s_AID-%d",templategroupname,asset.uid) +if i==1 then +self:_AssetItemInfo(asset) +end +_WAREHOUSEDB.Assets[asset.uid]=asset +table.insert(assets,asset) +end +return assets +end +function WAREHOUSE:_AssetItemInfo(asset) +local text=string.format("\nNew asset with id=%d for warehouse %s:\n",asset.uid,self.alias) +text=text..string.format("Spawngroup name= %s\n",asset.spawngroupname) +text=text..string.format("Template name = %s\n",asset.templatename) +text=text..string.format("Unit type = %s\n",asset.unittype) +text=text..string.format("Attribute = %s\n",asset.attribute) +text=text..string.format("Category = %d\n",asset.category) +text=text..string.format("Units # = %d\n",asset.nunits) +text=text..string.format("Speed max = %5.2f km/h\n",asset.speedmax) +text=text..string.format("Range max = %5.2f km\n",asset.range/1000) +text=text..string.format("Size max = %5.2f m\n",asset.size) +text=text..string.format("Weight total = %5.2f kg\n",asset.weight) +text=text..string.format("Cargo bay tot = %5.2f kg\n",asset.cargobaytot) +text=text..string.format("Cargo bay max = %5.2f kg\n",asset.cargobaymax) +text=text..string.format("Load radius = %s m\n",tostring(asset.loadradius)) +text=text..string.format("Skill = %s\n",tostring(asset.skill)) +text=text..string.format("Livery = %s",tostring(asset.livery)) +self:I(self.lid..text) +self:T({DCSdesc=asset.DCSdesc}) +self:T3({Template=asset.template}) +end +function WAREHOUSE:SetValidateAndRepositionGroundUnits(Enabled) +self.ValidateAndRepositionGroundUnits=Enabled +end +function WAREHOUSE:onafterNewAsset(From,Event,To,asset,assignment) +self:T(self.lid..string.format("New asset %s id=%d with assignment %s.",tostring(asset.templatename),asset.uid,tostring(assignment))) +end +function WAREHOUSE:onbeforeAddRequest(From,Event,To,warehouse,AssetDescriptor,AssetDescriptorValue,nAsset,TransportType,nTransport,Assignment,Prio) +local okay=true +if AssetDescriptor==WAREHOUSE.Descriptor.ATTRIBUTE then +local gotit=false +for _,attribute in pairs(WAREHOUSE.Attribute)do +if AssetDescriptorValue==attribute then +gotit=true +end +end +if not gotit then +self:_ErrorMessage("ERROR: Invalid request. Asset attribute is unknown!",5) +okay=false +end +elseif AssetDescriptor==WAREHOUSE.Descriptor.CATEGORY then +local gotit=false +for _,category in pairs(Group.Category)do +if AssetDescriptorValue==category then +gotit=true +end +end +if not gotit then +self:_ErrorMessage("ERROR: Invalid request. Asset category is unknown!",5) +okay=false +end +elseif AssetDescriptor==WAREHOUSE.Descriptor.GROUPNAME then +if type(AssetDescriptorValue)~="string"then +self:_ErrorMessage("ERROR: Invalid request. Asset template name must be passed as a string!",5) +okay=false +end +elseif AssetDescriptor==WAREHOUSE.Descriptor.UNITTYPE then +if type(AssetDescriptorValue)~="string"then +self:_ErrorMessage("ERROR: Invalid request. Asset unit type must be passed as a string!",5) +okay=false +end +elseif AssetDescriptor==WAREHOUSE.Descriptor.ASSIGNMENT then +if type(AssetDescriptorValue)~="string"then +self:_ErrorMessage("ERROR: Invalid request. Asset assignment type must be passed as a string!",5) +okay=false +end +elseif AssetDescriptor==WAREHOUSE.Descriptor.ASSETLIST then +if type(AssetDescriptorValue)~="table"then +self:_ErrorMessage("ERROR: Invalid request. Asset assignment type must be passed as a table!",5) +okay=false +end +else +self:_ErrorMessage("ERROR: Invalid request. Asset descriptor is not ATTRIBUTE, CATEGORY, GROUPNAME, UNITTYPE or ASSIGNMENT!",5) +okay=false +end +if self:IsStopped()then +self:_ErrorMessage("ERROR: Invalid request. Warehouse is stopped!",0) +okay=false +end +if self:IsDestroyed()and not self.respawnafterdestroyed then +self:_ErrorMessage("ERROR: Invalid request. Warehouse is destroyed!",0) +okay=false +end +return okay +end +function WAREHOUSE:onafterAddRequest(From,Event,To,warehouse,AssetDescriptor,AssetDescriptorValue,nAsset,TransportType,nTransport,Prio,Assignment) +nAsset=nAsset or 1 +TransportType=TransportType or WAREHOUSE.TransportType.SELFPROPELLED +Prio=Prio or 50 +if nTransport==nil then +if TransportType==WAREHOUSE.TransportType.SELFPROPELLED then +nTransport=0 +else +nTransport=1 +end +end +local toself=false +if self.warehouse:GetName()==warehouse.warehouse:GetName()then +toself=true +end +self.queueid=self.queueid+1 +local request={ +uid=self.queueid, +prio=Prio, +warehouse=warehouse, +assetdesc=AssetDescriptor, +assetdescval=AssetDescriptorValue, +nasset=nAsset, +transporttype=TransportType, +ntransport=nTransport, +assignment=tostring(Assignment), +airbase=warehouse:GetAirbase(), +category=warehouse:GetAirbaseCategory(), +ndelivered=0, +ntransporthome=0, +assets={}, +toself=toself, +} +table.insert(self.queue,request) +local descval="assetlist" +if request.assetdesc==WAREHOUSE.Descriptor.ASSETLIST then +else +descval=tostring(request.assetdescval) +end +local text=string.format("Warehouse %s: New request from warehouse %s.\nDescriptor %s=%s, #assets=%s; Transport=%s, #transports=%s.", +self.alias,warehouse.alias,request.assetdesc,descval,tostring(request.nasset),request.transporttype,tostring(request.ntransport)) +self:_DebugMessage(text,5) +end +function WAREHOUSE:onbeforeRequest(From,Event,To,Request) +self:T3({warehouse=self.alias,request=Request}) +local distance=self:GetCoordinate():Get2DDistance(Request.warehouse:GetCoordinate()) +local _assets=Request.cargoassets +if Request.nasset==0 then +local text=string.format("Warehouse %s: Request denied! Zero assets were requested.",self.alias) +self:_InfoMessage(text,10) +return false +end +for _,_asset in pairs(_assets)do +local asset=_asset +if asset.range<distance then +local text=string.format("Request denied! Destination %s is out of range for asset %s.",Request.airbase:GetName(),asset.templatename) +self:_InfoMessage(text,10) +if not(self.isUnit or Request.warehouse.isUnit)then +self:_DeleteQueueItem(Request,self.queue) +end +return false +end +end +return true +end +function WAREHOUSE:onafterRequest(From,Event,To,Request) +if self.verbosity>=1 then +local text=string.format("Warehouse %s: Processing request id=%d from warehouse %s.\n",self.alias,Request.uid,Request.warehouse.alias) +text=text..string.format("Requested %s assets of %s=%s.\n",tostring(Request.nasset),Request.assetdesc,Request.assetdesc==WAREHOUSE.Descriptor.ASSETLIST and"Asset list"or Request.assetdescval) +text=text..string.format("Transports %s of type %s.",tostring(Request.ntransport),tostring(Request.transporttype)) +self:_InfoMessage(text,5) +end +Request.timestamp=timer.getAbsTime() +self:_SpawnAssetRequest(Request) +local _assetstock=Request.transportassets +local Parking={} +if Request.transportcategory==Group.Category.AIRPLANE or Request.transportcategory==Group.Category.HELICOPTER then +Parking=self:_FindParkingForAssets(self.airbase,_assetstock) +end +local _transportassets={} +for i=1,Request.ntransport do +local _assetitem=_assetstock[i] +local _alias=_assetitem.spawngroupname +_assetitem.rid=Request.uid +_assetitem.spawned=false +_assetitem.iscargo=false +_assetitem.arrived=false +local spawngroup=nil +Request.assets[_assetitem.uid]=_assetitem +if Request.transporttype==WAREHOUSE.TransportType.AIRPLANE then +spawngroup=self:_SpawnAssetAircraft(_alias,_assetitem,Request,Parking[_assetitem.uid],true) +elseif Request.transporttype==WAREHOUSE.TransportType.HELICOPTER then +spawngroup=self:_SpawnAssetAircraft(_alias,_assetitem,Request,Parking[_assetitem.uid],false) +elseif Request.transporttype==WAREHOUSE.TransportType.APC then +spawngroup=self:_SpawnAssetGroundNaval(_alias,_assetitem,Request,self.spawnzone) +elseif Request.transporttype==WAREHOUSE.TransportType.TRAIN then +self:_ErrorMessage("ERROR: Cargo transport by train not supported yet!") +return +elseif Request.transporttype==WAREHOUSE.TransportType.SHIP or Request.transporttype==WAREHOUSE.TransportType.NAVALCARRIER +or Request.transporttype==WAREHOUSE.TransportType.ARMEDSHIP or Request.transporttype==WAREHOUSE.TransportType.WARSHIP then +spawngroup=self:_SpawnAssetGroundNaval(_alias,_assetitem,Request,self.portzone) +elseif Request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then +self:_ErrorMessage("ERROR: Transport type selfpropelled was already handled above. We should not get here!") +return +else +self:_ErrorMessage("ERROR: Unknown transport type!") +return +end +if spawngroup then +self:__AssetSpawned(0.01,spawngroup,_assetitem,Request) +end +end +Request.assetproblem={} +table.insert(self.pending,Request) +self:_DeleteQueueItem(Request,self.queue) +end +function WAREHOUSE:onafterRequestSpawned(From,Event,To,Request,CargoGroupSet,TransportGroupSet) +local _cargotype=Request.cargoattribute +local _cargocategory=Request.cargocategory +if Request.toself then +self:_DebugMessage(string.format("Selfrequest! Current status %s",self:GetState())) +self:__SelfRequest(1,CargoGroupSet,Request) +return +end +if Request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then +self:T2(self.lid..string.format("Got selfpropelled request for %d assets.",CargoGroupSet:Count())) +for _,_group in pairs(CargoGroupSet:GetSetObjects())do +local group=_group +if _cargocategory==Group.Category.GROUND then +self:T2(self.lid..string.format("Route ground group %s.",group:GetName())) +local ToCoordinate=Request.warehouse.spawnzone:GetRandomCoordinate() +if self.Debug then +ToCoordinate:MarkToAll(string.format("Destination of group %s",group:GetName())) +end +self:_RouteGround(group,Request) +elseif _cargocategory==Group.Category.AIRPLANE or _cargocategory==Group.Category.HELICOPTER then +self:T2(self.lid..string.format("Route airborne group %s.",group:GetName())) +self:_RouteAir(group) +elseif _cargocategory==Group.Category.SHIP then +self:T2(self.lid..string.format("Route naval group %s.",group:GetName())) +self:_RouteNaval(group,Request) +elseif _cargocategory==Group.Category.TRAIN then +self:T2(self.lid..string.format("Route train group %s.",group:GetName())) +self:_RouteTrain(group,Request.warehouse.rail) +else +self:E(self.lid..string.format("ERROR: unknown category %s for self propelled cargo %s!",tostring(_cargocategory),tostring(group:GetName()))) +end +end +Request.transportgroupset=TransportGroupSet +return +end +local _boardradius=500 +if Request.transporttype==WAREHOUSE.TransportType.AIRPLANE then +_boardradius=5000 +elseif Request.transporttype==WAREHOUSE.TransportType.HELICOPTER then +elseif Request.transporttype==WAREHOUSE.TransportType.APC then +elseif Request.transporttype==WAREHOUSE.TransportType.SHIP or Request.transporttype==WAREHOUSE.TransportType.AIRCRAFTCARRIER +or Request.transporttype==WAREHOUSE.TransportType.ARMEDSHIP or Request.transporttype==WAREHOUSE.TransportType.WARSHIP then +_boardradius=6000 +end +local CargoGroups=SET_CARGO:New() +for _,_group in pairs(CargoGroupSet:GetSetObjects())do +local asset=self:FindAssetInDB(_group) +local cargogroup=CARGO_GROUP:New(_group,_cargotype,_group:GetName(),_boardradius,asset.loadradius) +cargogroup:SetWeight(asset.weight) +CargoGroups:AddCargo(cargogroup) +end +local CargoTransport +if Request.transporttype==WAREHOUSE.TransportType.AIRPLANE then +local PickupAirbaseSet=SET_ZONE:New():AddZone(ZONE_AIRBASE:New(self.airbase:GetName())) +local DeployAirbaseSet=SET_ZONE:New():AddZone(ZONE_AIRBASE:New(Request.airbase:GetName())) +CargoTransport=AI_CARGO_DISPATCHER_AIRPLANE:New(TransportGroupSet,CargoGroups,PickupAirbaseSet,DeployAirbaseSet) +CargoTransport:SetHomeZone(ZONE_AIRBASE:New(self.airbase:GetName())) +elseif Request.transporttype==WAREHOUSE.TransportType.HELICOPTER then +local PickupZoneSet=SET_ZONE:New():AddZone(self.spawnzone) +local DeployZoneSet=SET_ZONE:New():AddZone(Request.warehouse.spawnzone) +CargoTransport=AI_CARGO_DISPATCHER_HELICOPTER:New(TransportGroupSet,CargoGroups,PickupZoneSet,DeployZoneSet) +CargoTransport:SetHomeZone(self.spawnzone) +elseif Request.transporttype==WAREHOUSE.TransportType.APC then +local PickupZoneSet=SET_ZONE:New():AddZone(self.spawnzone) +local DeployZoneSet=SET_ZONE:New():AddZone(Request.warehouse.spawnzone) +CargoTransport=AI_CARGO_DISPATCHER_APC:New(TransportGroupSet,CargoGroups,PickupZoneSet,DeployZoneSet,0) +CargoTransport:SetHomeZone(self.spawnzone) +elseif Request.transporttype==WAREHOUSE.TransportType.SHIP or Request.transporttype==WAREHOUSE.TransportType.AIRCRAFTCARRIER +or Request.transporttype==WAREHOUSE.TransportType.ARMEDSHIP or Request.transporttype==WAREHOUSE.TransportType.WARSHIP then +local PickupZoneSet=SET_ZONE:New():AddZone(self.portzone) +PickupZoneSet:AddZone(self.harborzone) +local DeployZoneSet=SET_ZONE:New():AddZone(Request.warehouse.harborzone) +local remotename=Request.warehouse.warehouse:GetName() +local ShippingLane=self.shippinglanes[remotename][math.random(#self.shippinglanes[remotename])] +CargoTransport=AI_CARGO_DISPATCHER_SHIP:New(TransportGroupSet,CargoGroups,PickupZoneSet,DeployZoneSet,ShippingLane) +CargoTransport:SetHomeZone(self.portzone) +else +self:E(self.lid.."ERROR: Unknown transporttype!") +end +local pickupouter=200 +local pickupinner=0 +local deployouter=200 +local deployinner=0 +if Request.transporttype==WAREHOUSE.TransportType.SHIP or Request.transporttype==WAREHOUSE.TransportType.AIRCRAFTCARRIER +or Request.transporttype==WAREHOUSE.TransportType.ARMEDSHIP or Request.transporttype==WAREHOUSE.TransportType.WARSHIP then +pickupouter=1000 +pickupinner=20 +deployouter=1000 +deployinner=0 +else +pickupouter=200 +pickupinner=0 +if self.spawnzone.Radius~=nil then +pickupouter=self.spawnzone.Radius +pickupinner=20 +end +deployouter=200 +deployinner=0 +if self.spawnzone.Radius~=nil then +deployouter=Request.warehouse.spawnzone.Radius +deployinner=20 +end +end +CargoTransport:SetPickupRadius(pickupouter,pickupinner) +CargoTransport:SetDeployRadius(deployouter,deployinner) +Request.carriercargo={} +for _,carriergroup in pairs(TransportGroupSet:GetSetObjects())do +local asset=self:FindAssetInDB(carriergroup) +for _i,_carrierunit in pairs(carriergroup:GetUnits())do +local carrierunit=_carrierunit +Request.carriercargo[carrierunit:GetName()]={} +local cargobay=asset.cargobay[_i] +carrierunit:SetCargoBayWeightLimit(cargobay) +self:T2(self.lid..string.format("Cargo bay weight limit of carrier unit %s: %.1f kg.",carrierunit:GetName(),carrierunit:GetCargoBayFreeWeight())) +end +end +function CargoTransport:OnAfterPickedUp(From,Event,To,Carrier,PickupZone) +local warehouse=Carrier:GetState(Carrier,"WAREHOUSE") +local text=string.format("Carrier group %s picked up at pickup zone %s.",Carrier:GetName(),PickupZone:GetName()) +warehouse:T(warehouse.lid..text) +end +function CargoTransport:OnAfterDeployed(From,Event,To,Carrier,DeployZone) +local warehouse=Carrier:GetState(Carrier,"WAREHOUSE") +end +function CargoTransport:OnAfterHome(From,Event,To,Carrier,Coordinate,Speed,Height,HomeZone) +local warehouse=Carrier:GetState(Carrier,"WAREHOUSE") +local text=string.format("Carrier group %s going home to zone %s.",Carrier:GetName(),HomeZone:GetName()) +warehouse:T(warehouse.lid..text) +end +function CargoTransport:OnAfterLoaded(From,Event,To,Carrier,Cargo,CarrierUnit,PickupZone) +local warehouse=Carrier:GetState(Carrier,"WAREHOUSE") +local text=string.format("Carrier group %s loaded cargo %s into unit %s in pickup zone %s",Carrier:GetName(),Cargo:GetName(),CarrierUnit:GetName(),PickupZone:GetName()) +warehouse:T(warehouse.lid..text) +local group=Cargo:GetObject() +local request=warehouse:_GetRequestOfGroup(group,warehouse.pending) +table.insert(request.carriercargo[CarrierUnit:GetName()],warehouse:_GetNameWithOut(Cargo:GetName())) +end +function CargoTransport:OnAfterUnloaded(From,Event,To,Carrier,Cargo,CarrierUnit,DeployZone) +local warehouse=Carrier:GetState(Carrier,"WAREHOUSE") +local group=Cargo:GetObject() +local text=string.format("Cargo group %s was unloaded from carrier unit %s.",tostring(group:GetName()),tostring(CarrierUnit:GetName())) +warehouse:T(warehouse.lid..text) +warehouse:Arrived(group) +end +function CargoTransport:OnAfterBackHome(From,Event,To,Carrier) +local carrier=Carrier +local warehouse=carrier:GetState(carrier,"WAREHOUSE") +carrier:SmokeWhite() +local text=string.format("Carrier %s is back home at warehouse %s.",tostring(Carrier:GetName()),tostring(warehouse.warehouse:GetName())) +MESSAGE:New(text,5):ToAllIf(warehouse.Debug) +warehouse:I(warehouse.lid..text) +warehouse:__Arrived(1,Carrier) +end +CargoTransport:__Start(5) +end +function WAREHOUSE:onafterUnloaded(From,Event,To,group) +self:_DebugMessage(string.format("Cargo %s unloaded!",tostring(group:GetName())),5) +if group and group:IsAlive()then +if self.Debug then +group:SmokeWhite() +end +local speedmax=group:GetSpeedMax() +if group:IsGround()then +if speedmax>1 then +group:RouteGroundTo(self.spawnzone:GetRandomCoordinate(),speedmax*0.5,AI.Task.VehicleFormation.RANK,3) +else +self:Arrived(group) +end +elseif group:IsAir()then +self:Arrived(group) +elseif group:IsShip()then +self:Arrived(group) +end +else +self:E(self.lid..string.format("ERROR unloaded Cargo group is not alive!")) +end +end +function WAREHOUSE:onbeforeArrived(From,Event,To,group) +local asset=self:FindAssetInDB(group) +if asset then +if asset.flightgroup and not asset.arrived then +asset.arrived=true +return false +end +if asset.arrived==true then +return false +else +asset.arrived=true +return true +end +end +end +function WAREHOUSE:onafterArrived(From,Event,To,group) +if self.Debug then +group:SmokeOrange() +end +local request=self:_GetRequestOfGroup(group,self.pending) +if request then +local warehouse=request.warehouse +local istransport=self:_GroupIsTransport(group,request) +if istransport==true then +warehouse=self +elseif istransport==false then +warehouse=request.warehouse +else +self:E(self.lid..string.format("ERROR: Group %s is neither cargo nor transport",group:GetName())) +return +end +self:_DebugMessage(string.format("Group %s arrived at warehouse %s!",tostring(group:GetName()),warehouse.alias),5) +if group:IsGround()and group:GetSpeedMax()>1 then +group:RouteGroundTo(warehouse:GetCoordinate(),group:GetSpeedMax()*0.3,"Off Road") +end +self:T(self.lid.."Asset arrived at warehouse adding in 60 sec") +warehouse:__AddAsset(60,group) +end +end +function WAREHOUSE:onafterDelivered(From,Event,To,request) +if self.verbosity>=1 then +local text=string.format("Warehouse %s: All assets delivered to warehouse %s!",self.alias,request.warehouse.alias) +self:_InfoMessage(text,5) +end +if self.Debug then +self:_Fireworks(request.warehouse:GetCoordinate()) +end +self.delivered[request.uid]=true +end +function WAREHOUSE:onafterSelfRequest(From,Event,To,groupset,request) +self:_DebugMessage(string.format("Assets spawned at warehouse %s after self request!",self.alias)) +for _,_group in pairs(groupset:GetSetObjects())do +local group=_group +if self.Debug then +group:FlareGreen() +end +end +if self:IsAttacked()then +if self.autodefence then +for _,_group in pairs(groupset:GetSetObjects())do +local group=_group +local speedmax=group:GetSpeedMax() +if group:IsGround()and speedmax>1 and group:IsNotInZone(self.zone)then +group:RouteGroundTo(self.zone:GetRandomCoordinate(),0.8*speedmax,"Off Road") +end +end +end +table.insert(self.defending,request) +end +end +function WAREHOUSE:onafterAttacked(From,Event,To,Coalition,Country) +local text=string.format("Warehouse %s: We are under attack!",self.alias) +self:_InfoMessage(text) +if self.Debug then +self:GetCoordinate():SmokeOrange() +end +if self.autodefence then +local nground=self:GetNumberOfAssets(WAREHOUSE.Descriptor.CATEGORY,Group.Category.GROUND) +local text=string.format("Warehouse auto defence activated.\n") +if nground>0 then +text=text..string.format("Deploying all %d ground assets.",nground) +self:AddRequest(self,WAREHOUSE.Descriptor.CATEGORY,Group.Category.GROUND,WAREHOUSE.Quantity.ALL,nil,nil,0,"AutoDefence") +else +text=text..string.format("No ground assets currently available.") +end +self:_InfoMessage(text) +else +local text=string.format("Warehouse auto defence inactive.") +self:I(self.lid..text) +end +end +function WAREHOUSE:onafterDefeated(From,Event,To) +local text=string.format("Warehouse %s: Enemy attack was defeated!",self.alias) +self:_InfoMessage(text) +if self.Debug then +self:GetCoordinate():SmokeGreen() +end +if self.autodefence then +for _,request in pairs(self.defending)do +for _,_group in pairs(request.cargogroupset:GetSetObjects())do +local group=_group +local speed=group:GetSpeedMax() +if group:IsGround()and speed>1 then +group:RouteGroundTo(self:GetCoordinate(),speed*0.3) +end +self:__AddAsset(60,group) +end +end +self.defending=nil +self.defending={} +end +end +function WAREHOUSE:onafterRespawn(From,Event,To) +local text=string.format("Respawning warehouse %s",self.alias) +self:_InfoMessage(text) +self.warehouse:ReSpawn() +end +function WAREHOUSE:onbeforeChangeCountry(From,Event,To,Country) +local currentCountry=self:GetCountry() +local text=string.format("Warehouse %s: request to change country %d-->%d",self.alias,currentCountry,Country) +self:_DebugMessage(text,10) +if currentCountry~=Country then +return true +end +return false +end +function WAREHOUSE:onafterChangeCountry(From,Event,To,Country) +local CoalitionOld=self:GetCoalition() +self.warehouse:ReSpawn(Country) +local CoalitionNew=self:GetCoalition() +self.queue=nil +self.queue={} +if self.airbasename then +local airbase=AIRBASE:FindByName(self.airbasename) +local airbaseCoalition=airbase:GetCoalition() +if CoalitionNew==airbaseCoalition then +self.airbase=airbase +else +self.airbase=nil +end +end +if self.Debug then +if CoalitionNew==coalition.side.RED then +self:GetCoordinate():SmokeRed() +elseif CoalitionNew==coalition.side.BLUE then +self:GetCoordinate():SmokeBlue() +end +end +end +function WAREHOUSE:onbeforeCaptured(From,Event,To,Coalition,Country) +self:ChangeCountry(Country) +end +function WAREHOUSE:onafterCaptured(From,Event,To,Coalition,Country) +local text=string.format("Warehouse %s: We were captured by enemy coalition (side=%d)!",self.alias,Coalition) +self:_InfoMessage(text) +end +function WAREHOUSE:onafterAirbaseCaptured(From,Event,To,Coalition) +local text=string.format("Warehouse %s: Our airbase %s was captured by the enemy (coalition=%d)!",self.alias,self.airbasename,Coalition) +self:_InfoMessage(text) +if self.Debug then +if Coalition==coalition.side.RED then +self.airbase:GetCoordinate():SmokeRed() +elseif Coalition==coalition.side.BLUE then +self.airbase:GetCoordinate():SmokeBlue() +end +end +self.airbase=nil +end +function WAREHOUSE:onafterAirbaseRecaptured(From,Event,To,Coalition) +local text=string.format("Warehouse %s: We recaptured our airbase %s from the enemy (coalition=%d)!",self.alias,self.airbasename,Coalition) +self:_InfoMessage(text) +self.airbase=AIRBASE:FindByName(self.airbasename) +if self.Debug then +if Coalition==coalition.side.RED then +self.airbase:GetCoordinate():SmokeRed() +elseif Coalition==coalition.side.BLUE then +self.airbase:GetCoordinate():SmokeBlue() +end +end +end +function WAREHOUSE:onafterRunwayDestroyed(From,Event,To) +local text=string.format("Warehouse %s: Runway %s destroyed!",self.alias,self.airbasename) +self:_InfoMessage(text) +self.runwaydestroyed=timer.getAbsTime() +return self +end +function WAREHOUSE:onafterRunwayRepaired(From,Event,To) +local text=string.format("Warehouse %s: Runway %s repaired!",self.alias,self.airbasename) +self:_InfoMessage(text) +self.runwaydestroyed=nil +return self +end +function WAREHOUSE:onafterAssetSpawned(From,Event,To,group,asset,request) +local text=string.format("Asset %s from request id=%d was spawned!",asset.spawngroupname,request.uid) +self:T(self.lid..text) +asset.spawned=true +asset.spawngroupname=group:GetName() +self:_DeleteStockItem(asset) +if asset.iscargo==true then +request.cargogroupset=request.cargogroupset or SET_GROUP:New() +request.cargogroupset:AddGroup(group) +else +request.transportgroupset=request.transportgroupset or SET_GROUP:New() +request.transportgroupset:AddGroup(group) +end +group:SetState(group,"WAREHOUSE",self) +local n=0 +for _,_asset in pairs(request.assets)do +local assetitem=_asset +self:T(self.lid..string.format("Asset %s spawned %s as %s",assetitem.templatename,tostring(assetitem.spawned),tostring(assetitem.spawngroupname))) +if assetitem.spawned then +n=n+1 +else +end +end +if n==request.nasset+request.ntransport then +self:T(self.lid..string.format("All assets %d (ncargo=%d + ntransport=%d) of request rid=%d spawned. Calling RequestSpawned",n,request.nasset,request.ntransport,request.uid)) +self:RequestSpawned(request,request.cargogroupset,request.transportgroupset) +else +self:T(self.lid..string.format("Not all assets %d (ncargo=%d + ntransport=%d) of request rid=%d spawned YET",n,request.nasset,request.ntransport,request.uid)) +end +end +function WAREHOUSE:onafterAssetDead(From,Event,To,asset,request) +if asset and request then +local text=string.format("Asset %s from request id=%d is dead!",asset.templatename,request.uid) +self:T(self.lid..text) +local groupname=asset.spawngroupname +local NoTriggerEvent=true +if request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then +if request.cargogroupset then +request.cargogroupset:Remove(groupname,NoTriggerEvent) +self:T(self.lid..string.format("Removed selfpropelled cargo %s: ncargo=%d.",groupname,request.cargogroupset:Count())) +else +self:E(self.lid..string.format("ERROR: cargogroupset is nil for request ID=%s!",tostring(request.uid))) +end +else +local istransport=not asset.iscargo +if istransport==true then +request.transportgroupset:Remove(groupname,NoTriggerEvent) +self:T(self.lid..string.format("Removed transport %s: ntransport=%d",groupname,request.transportgroupset:Count())) +elseif istransport==false then +request.cargogroupset:Remove(groupname,NoTriggerEvent) +self:T(self.lid..string.format("Removed transported cargo %s outside carrier: ncargo=%d",groupname,request.cargogroupset:Count())) +else +end +end +else +self:E(self.lid.."ERROR: Asset and/or Request is nil in onafterAssetDead") +end +end +function WAREHOUSE:onafterDestroyed(From,Event,To) +local text=string.format("Warehouse %s was destroyed! Assets lost %d. Respawn=%s",self.alias,#self.stock,tostring(self.respawnafterdestroyed)) +self:_InfoMessage(text) +if self.respawnafterdestroyed then +if self.respawndelay then +self:Pause() +self:__Respawn(self.respawndelay) +else +self:Respawn() +end +else +for k,_ in pairs(self.queue)do +self.queue[k]=nil +end +for k,_ in pairs(self.stock)do +end +for k=#self.stock,1,-1 do +self.stock[k]=nil +end +end +end +function WAREHOUSE:onafterSave(From,Event,To,path,filename) +local function _savefile(filename,data) +local f=assert(io.open(filename,"wb")) +f:write(data) +f:close() +end +filename=filename or string.format("WAREHOUSE-%d_%s.txt",self.uid,self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local text=string.format("Saving warehouse assets to file %s",filename) +MESSAGE:New(text,30):ToAllIf(self.Debug or self.Report) +self:I(self.lid..text) +local warehouseassets="" +warehouseassets=warehouseassets..string.format("coalition=%d\n",self:GetCoalition()) +warehouseassets=warehouseassets..string.format("country=%d\n",self:GetCountry()) +for _,_asset in pairs(self.stock)do +local asset=_asset +local assetstring="" +for key,value in pairs(asset)do +if key=="templatename"or key=="attribute"or key=="cargobay"or key=="weight"or key=="loadradius"or key=="livery"or key=="skill"or key=="assignment"then +local name +if type(value)=="table"then +name=string.format("%s=%s;",key,value[1]) +else +name=string.format("%s=%s;",key,value) +end +assetstring=assetstring..name +end +self:I(string.format("Loaded asset: %s",assetstring)) +end +warehouseassets=warehouseassets..assetstring.."\n" +end +_savefile(filename,warehouseassets) +end +function WAREHOUSE:onbeforeLoad(From,Event,To,path,filename) +local function _fileexists(name) +local f=io.open(name,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +end +filename=filename or string.format("WAREHOUSE-%d_%s.txt",self.uid,self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local exists=_fileexists(filename) +if exists then +return true +else +self:_ErrorMessage(string.format("ERROR: file %s does not exist! Cannot load assets.",filename),60) +return false +end +end +function WAREHOUSE:onafterLoad(From,Event,To,path,filename) +local function _loadfile(filename) +local f=assert(io.open(filename,"rb")) +local data=f:read("*all") +f:close() +return data +end +filename=filename or string.format("WAREHOUSE-%d_%s.txt",self.uid,self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local text=string.format("Loading warehouse assets from file %s",filename) +MESSAGE:New(text,30):ToAllIf(self.Debug or self.Report) +self:I(self.lid..text) +local data=_loadfile(filename) +local assetdata=UTILS.Split(data,"\n") +local Coalition +local Country +local assets={} +for _,asset in pairs(assetdata)do +local descriptors=UTILS.Split(asset,";") +local asset={} +local isasset=false +for _,descriptor in pairs(descriptors)do +local keyval=UTILS.Split(descriptor,"=") +if#keyval==2 then +if keyval[1]=="coalition"then +Coalition=tonumber(keyval[2]) +elseif keyval[1]=="country"then +Country=tonumber(keyval[2]) +else +isasset=true +local key=keyval[1] +local val=keyval[2] +if val=="nil"then +val=nil +end +if key=="cargobay"or key=="weight"or key=="loadradius"then +asset[key]=tonumber(val) +else +asset[key]=val +end +end +end +end +if isasset then +table.insert(assets,asset) +end +end +if Country~=self:GetCountry()then +self:T(self.lid..string.format("Changing warehouse country %d-->%d on loading assets.",self:GetCountry(),Country)) +self:ChangeCountry(Country) +end +for _,_asset in pairs(assets)do +local asset=_asset +local group=GROUP:FindByName(asset.templatename) +if group then +self:AddAsset(group,1,asset.attribute,asset.cargobay,asset.weight,asset.loadradius,asset.skill,asset.livery,asset.assignment) +else +self:E(string.format("ERROR: Group %s doest not exit. Cannot be loaded as asset.",tostring(asset.templatename))) +end +end +end +function WAREHOUSE:_SpawnAssetRequest(Request) +self:F2({requestUID=Request.uid}) +local cargoassets=Request.cargoassets +local Parking={} +if Request.cargocategory==Group.Category.AIRPLANE or Request.cargocategory==Group.Category.HELICOPTER then +Parking=self:_FindParkingForAssets(self.airbase,cargoassets)or{} +end +local UnControlled=true +for i=1,#cargoassets do +local asset=cargoassets[i] +if not asset.spawned then +asset.iscargo=true +asset.rid=Request.uid +local _alias=asset.spawngroupname +Request.assets[asset.uid]=asset +local _group=nil +if asset.category==Group.Category.GROUND then +_group=self:_SpawnAssetGroundNaval(_alias,asset,Request,self.spawnzone,Request.lateActivation) +elseif asset.category==Group.Category.AIRPLANE or asset.category==Group.Category.HELICOPTER then +if Parking[asset.uid]then +_group=self:_SpawnAssetAircraft(_alias,asset,Request,Parking[asset.uid],UnControlled,Request.lateActivation) +else +_group=self:_SpawnAssetAircraft(_alias,asset,Request,nil,UnControlled,Request.lateActivation) +end +elseif asset.category==Group.Category.TRAIN then +if self.rail then +_group=self:_SpawnAssetGroundNaval(_alias,asset,Request,self.spawnzone,Request.lateActivation) +end +elseif asset.category==Group.Category.SHIP then +_group=self:_SpawnAssetGroundNaval(_alias,asset,Request,self.portzone,Request.lateActivation) +else +self:E(self.lid.."ERROR: Unknown asset category!") +end +if _group then +self:__AssetSpawned(0.01,_group,asset,Request) +end +end +end +end +function WAREHOUSE:_SpawnAssetGroundNaval(alias,asset,request,spawnzone,lateactivated) +if asset and(asset.category==Group.Category.GROUND or asset.category==Group.Category.SHIP or asset.category==Group.Category.TRAIN)then +local template=self:_SpawnAssetPrepareTemplate(asset,alias) +template.route.points[1]={} +local coord=spawnzone:GetRandomCoordinate() +if asset.category==Group.Category.TRAIN then +coord=self.rail +end +for i=1,#template.units do +local unit=template.units[i] +local SX=unit.x or 0 +local SY=unit.y or 0 +local BX=asset.template.route.points[1].x +local BY=asset.template.route.points[1].y +local TX=coord.x+(SX-BX) +local TY=coord.z+(SY-BY) +template.units[i].x=TX +template.units[i].y=TY +if asset.livery then +unit.livery_id=asset.livery +end +if asset.skill then +unit.skill=asset.skill +end +end +template.lateActivation=lateactivated +template.route.points[1].x=coord.x +template.route.points[1].y=coord.z +template.x=coord.x +template.y=coord.z +template.alt=coord.y +if self.ValidateAndRepositionGroundUnits then +UTILS.ValidateAndRepositionGroundUnits(template.units) +end +local group=_DATABASE:Spawn(template) +return group +end +return nil +end +function WAREHOUSE:_SpawnAssetAircraft(alias,asset,request,parking,uncontrolled,lateactivated) +if asset and asset.category==Group.Category.AIRPLANE or asset.category==Group.Category.HELICOPTER then +local template=self:_SpawnAssetPrepareTemplate(asset,alias) +local _type=COORDINATE.WaypointType.TakeOffParking +local _action=COORDINATE.WaypointAction.FromParkingArea +if asset.takeoffType and asset.takeoffType==COORDINATE.WaypointType.TakeOffParkingHot then +_type=COORDINATE.WaypointType.TakeOffParkingHot +_action=COORDINATE.WaypointAction.FromParkingAreaHot +uncontrolled=false +end +local airstart=asset.takeoffType and asset.takeoffType==COORDINATE.WaypointType.TurningPoint or false +if airstart then +_type=COORDINATE.WaypointType.TurningPoint +_action=COORDINATE.WaypointAction.TurningPoint +uncontrolled=false +end +if request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then +if request.toself then +local coord=self.airbase:GetCoordinate() +if airstart then +coord:SetAltitude(math.random(1000,2000)) +end +local wp=coord:WaypointAir("RADIO",_type,_action,0,false,self.airbase,{},"Parking") +template.route.points={wp} +else +template.route.points=self:_GetFlightplan(asset,self.airbase,request.warehouse.airbase) +end +else +template.route.points[1]=self.airbase:GetCoordinate():WaypointAir("BARO",_type,_action,0,true,self.airbase,nil,"Spawnpoint") +end +local AirbaseID=self.airbase:GetID() +local AirbaseCategory=self:GetAirbaseCategory() +if AirbaseCategory==Airbase.Category.HELIPAD or AirbaseCategory==Airbase.Category.SHIP then +else +if parking and#parking<#template.units and not airstart then +local text=string.format("ERROR: Not enough parking! Free parking = %d < %d aircraft to be spawned.",#parking,#template.units) +self:_DebugMessage(text) +return nil +end +end +for i=1,#template.units do +local unit=template.units[i] +if AirbaseCategory==Airbase.Category.HELIPAD or AirbaseCategory==Airbase.Category.SHIP then +local coord=self.airbase:GetCoordinate() +unit.x=coord.x +unit.y=coord.z +unit.alt=coord.y +if airstart then +unit.alt=math.random(1000,2000) +end +unit.parking_id=nil +unit.parking=nil +else +local coord=nil +local terminal=nil +if airstart then +coord=self.airbase:GetCoordinate():SetAltitude(math.random(1000,2000)) +else +coord=parking[i].Coordinate +terminal=parking[i].TerminalID +end +if self.Debug and terminal then +local text=string.format("Spawnplace unit %s terminal %d.",unit.name,terminal) +coord:MarkToAll(text) +env.info(text) +end +unit.x=coord.x +unit.y=coord.z +unit.alt=coord.y +unit.parking_id=nil +unit.parking=terminal +end +if asset.livery then +unit.livery_id=asset.livery +end +if asset.skill then +unit.skill=asset.skill +end +if asset.payload then +unit.payload=asset.payload.pylons +end +if asset.modex then +unit.onboard_num=asset.modex[i] +end +if asset.callsign then +unit.callsign=asset.callsign[i] +end +end +template.x=template.units[1].x +template.y=template.units[1].y +template.uncontrolled=uncontrolled +self:T2({airtemplate=template}) +local group=_DATABASE:Spawn(template) +return group +end +return nil +end +function WAREHOUSE:_SpawnAssetPrepareTemplate(asset,alias) +local template=UTILS.DeepCopy(asset.template) +template.name=alias +template.CoalitionID=self:GetCoalition() +template.CountryID=self:GetCountry() +template.groupId=nil +template.lateActivation=false +if asset.missionTask then +self:T(self.lid..string.format("Setting mission task to %s",tostring(asset.missionTask))) +template.task=asset.missionTask +end +template.route={} +template.route.routeRelativeTOT=true +template.route.points={} +for i=1,#template.units do +local unit=template.units[i] +unit.unitId=nil +unit.name=string.format("%s-%02d",template.name,i) +end +return template +end +function WAREHOUSE:_RouteGround(group,request) +if group and group:IsAlive()then +local _speed=group:GetSpeedMax()*0.7 +local Waypoints={} +local hasoffroad=self:HasConnectionOffRoad(request.warehouse,self.Debug) +if hasoffroad then +local remotename=request.warehouse.warehouse:GetName() +local path=self.offroadpaths[remotename][math.random(#self.offroadpaths[remotename])] +for i=1,#path do +local coord=path[i] +local Waypoint=coord:WaypointGround(_speed,"Off Road") +table.insert(Waypoints,Waypoint) +end +else +Waypoints=group:TaskGroundOnRoad(request.warehouse.road,_speed,"Off Road",false,self.road) +local FromWP=group:GetCoordinate():WaypointGround(_speed,"Off Road") +table.insert(Waypoints,1,FromWP) +end +for n,wp in ipairs(Waypoints)do +local tf=self:_SimpleTaskFunctionWP("warehouse:_PassingWaypoint",group,n,#Waypoints) +group:SetTaskWaypoint(wp,tf) +end +group:Route(Waypoints,1) +group:OptionROEReturnFire() +group:OptionAlarmStateGreen() +end +end +function WAREHOUSE:_RouteNaval(group,request) +if group and group:IsAlive()then +local _speed=group:GetSpeedMax()*0.8 +local remotename=request.warehouse.warehouse:GetName() +local lane=self.shippinglanes[remotename][math.random(#self.shippinglanes[remotename])] +if lane then +local Waypoints={} +for i=1,#lane do +local coord=lane[i] +local Waypoint=coord:WaypointGround(_speed) +table.insert(Waypoints,Waypoint) +end +local TaskFunction=self:_SimpleTaskFunction("warehouse:_Arrived",group) +local Waypoint=Waypoints[#Waypoints] +group:SetTaskWaypoint(Waypoint,TaskFunction) +group:Route(Waypoints,1) +group:OptionROEReturnFire() +else +self:E(self.lid..string.format("ERROR: No shipping lane defined for Naval asset!")) +end +end +end +function WAREHOUSE:_RouteAir(aircraft) +if aircraft and aircraft:IsAlive()~=nil then +self:T2(self.lid..string.format("RouteAir aircraft group %s alive=%s",aircraft:GetName(),tostring(aircraft:IsAlive()))) +if self.flightcontrol then +local fg=FLIGHTGROUP:New(aircraft) +fg:SetReadyForTakeoff(true) +else +aircraft:StartUncontrolled(math.random(60)) +end +self:T2(self.lid..string.format("RouteAir aircraft group %s alive=%s (after start command)",aircraft:GetName(),tostring(aircraft:IsAlive()))) +aircraft:OptionROEReturnFire() +aircraft:OptionROTPassiveDefense() +else +self:E(string.format("ERROR: aircraft %s cannot be routed since it does not exist or is not alive %s!",tostring(aircraft:GetName()),tostring(aircraft:IsAlive()))) +end +end +function WAREHOUSE:_RouteTrain(Group,Coordinate,Speed) +if Group and Group:IsAlive()then +local _speed=Speed or Group:GetSpeedMax()*0.6 +local Waypoints=Group:TaskGroundOnRailRoads(Coordinate,Speed) +local TaskFunction=self:_SimpleTaskFunction("warehouse:_Arrived",Group) +local Waypoint=Waypoints[#Waypoints] +Group:SetTaskWaypoint(Waypoint,TaskFunction) +Group:Route(Waypoints,1) +end +end +function WAREHOUSE:_Arrived(group) +self:_DebugMessage(string.format("Group %s arrived!",tostring(group:GetName()))) +if group then +self:__Arrived(1,group) +end +end +function WAREHOUSE:_PassingWaypoint(group,n,N) +self:T(self.lid..string.format("Group %s passing waypoint %d of %d!",tostring(group:GetName()),n,N)) +if n==N then +self:__Arrived(1,group) +end +end +function WAREHOUSE:GetAssetByID(id) +if id then +return _WAREHOUSEDB.Assets[id] +else +return nil +end +end +function WAREHOUSE:GetAssetByName(GroupName) +local name=self:_GetNameWithOut(GroupName) +local _,aid,_=self:_GetIDsFromGroup(GROUP:FindByName(name)) +if aid then +return _WAREHOUSEDB.Assets[aid] +else +return nil +end +end +function WAREHOUSE:GetRequestByID(id) +if id then +for _,_request in pairs(self.queue)do +local request=_request +if request.uid==id then +return request,true +end +end +for _,_request in pairs(self.pending)do +local request=_request +if request.uid==id then +return request,false +end +end +end +return nil,nil +end +function WAREHOUSE:_OnEventBirth(EventData) +self:T3(self.lid..string.format("Warehouse %s (id=%s) captured event birth!",self.alias,self.uid)) +if EventData and EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid==self.uid then +local asset=self:GetAssetByID(aid) +local request=self:GetRequestByID(rid) +if asset and request then +self:T(self.lid..string.format("Warehouse %s captured event birth of request ID=%d, asset ID=%d, unit %s spawned=%s",self.alias,request.uid,asset.uid,EventData.IniUnitName,tostring(asset.spawned))) +request.born=true +else +self:E(self.lid..string.format("ERROR: Either asset AID=%s or request RID=%s are nil in event birth of unit %s",tostring(aid),tostring(rid),tostring(EventData.IniUnitName))) +end +else +end +end +end +function WAREHOUSE:_OnEventEngineStartup(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event engine startup!",self.alias)) +if EventData and EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid==self.uid then +self:T(self.lid..string.format("Warehouse %s captured event engine startup of its asset unit %s.",self.alias,EventData.IniUnitName)) +end +end +end +function WAREHOUSE:_OnEventTakeOff(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event takeoff!",self.alias)) +if EventData and EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid==self.uid then +self:T(self.lid..string.format("Warehouse %s captured event takeoff of its asset unit %s.",self.alias,EventData.IniUnitName)) +end +end +end +function WAREHOUSE:_OnEventLanding(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event landing!",self.alias)) +if EventData and EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid~=nil and wid==self.uid then +self:T(self.lid..string.format("Warehouse %s captured event landing of its asset unit %s.",self.alias,EventData.IniUnitName)) +end +end +end +function WAREHOUSE:_OnEventEngineShutdown(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event engine shutdown!",self.alias)) +if EventData and EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid==self.uid then +self:T(self.lid..string.format("Warehouse %s captured event engine shutdown of its asset unit %s.",self.alias,EventData.IniUnitName)) +end +end +end +function WAREHOUSE:_OnEventArrived(EventData) +if EventData and EventData.IniUnit then +local unit=EventData.IniUnit +if unit and unit:IsAlive()==true and unit:InAir()==false then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid~=nil and aid~=nil and rid~=nil then +if self.uid==wid then +local request=self:_GetRequestOfGroup(group,self.pending) +if request then +local istransport=self:_GroupIsTransport(group,request) +local closest=group:GetCoordinate():GetClosestAirbase() +local rightairbase=closest:GetName()==request.warehouse:GetAirbase():GetName() +if istransport==false and rightairbase then +local nunits=#group:GetUnits() +local dt=10*(nunits-1)+1 +if self.verbosity>=1 then +local text=string.format("Air asset group %s from warehouse %s arrived at its destination. Trigger Arrived event in %d sec",group:GetName(),self.alias,dt) +self:_InfoMessage(text) +end +self:__Arrived(dt,group) +end +end +end +else +self:T3(string.format("Group that arrived did not belong to a warehouse. Warehouse ID=%s, Asset ID=%s, Request ID=%s.",tostring(wid),tostring(aid),tostring(rid))) +end +end +end +end +function WAREHOUSE:_OnEventCrashOrDead(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event dead or crash!",self.alias)) +if EventData then +if EventData.IniUnitName then +local warehousename=self.warehouse:GetName() +if EventData.IniUnitName==warehousename then +self:_DebugMessage(string.format("Warehouse %s alias %s was destroyed!",warehousename,self.alias)) +self:Destroyed() +end +if self.airbase and self.airbasename and self.airbasename==EventData.IniUnitName then +if self:IsRunwayOperational()then +self:RunwayDestroyed() +else +self.runwaydestroyed=timer.getAbsTime() +end +end +end +self:T2(self.lid..string.format("Warehouse %s captured event dead or crash or unit %s",self.alias,tostring(EventData.IniUnitName))) +if EventData.IniGroup then +local group=EventData.IniGroup +local wid,aid,rid=self:_GetIDsFromGroup(group) +if wid==self.uid then +self:T(self.lid..string.format("Warehouse %s captured event dead or crash of its asset unit %s",self.alias,EventData.IniUnitName)) +for _,request in pairs(self.pending)do +local request=request +if request.uid==rid then +self:_UnitDead(EventData.IniUnit,EventData.IniGroup,request) +end +end +end +end +end +end +function WAREHOUSE:_UnitDead(deadunit,deadgroup,request) +local opsgroup=_DATABASE:FindOpsGroup(deadgroup) +if opsgroup then +return nil +end +local nalive=deadgroup:CountAliveUnits() +local groupdead=false +if nalive>0 then +groupdead=false +else +groupdead=true +end +local asset=self:FindAssetInDB(deadgroup) +local unitname=self:_GetNameWithOut(deadunit) +local groupname=self:_GetNameWithOut(deadgroup) +if groupdead then +self:T(self.lid..string.format("Group %s (transport=%s) is dead!",groupname,tostring(self:_GroupIsTransport(deadgroup,request)))) +if self.Debug then +deadgroup:SmokeWhite() +end +self:AssetDead(asset,request) +end +local NoTriggerEvent=true +if request.transporttype~=WAREHOUSE.TransportType.SELFPROPELLED then +if not asset.iscargo then +local cargogroupnames=request.carriercargo[unitname] +if cargogroupnames then +for _,cargoname in pairs(cargogroupnames)do +request.cargogroupset:Remove(cargoname,NoTriggerEvent) +self:T(self.lid..string.format("Removed transported cargo %s inside dead carrier %s: ncargo=%d",cargoname,unitname,request.cargogroupset:Count())) +end +end +else +self:E(self.lid..string.format("ERROR: Group %s is neither cargo nor transport!",deadgroup:GetName())) +end +end +end +function WAREHOUSE:_OnEventBaseCaptured(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event base captured!",self.alias)) +if self.airbasename==nil then +return +end +if EventData and EventData.Place then +local airbase=EventData.Place +if EventData.PlaceName==self.airbasename then +local NewCoalitionAirbase=airbase:GetCoalition() +self:T(self.lid..string.format("Airbase of warehouse %s (coalition ID=%d) was captured! New owner coalition ID=%d.",self.alias,self:GetCoalition(),NewCoalitionAirbase)) +if self.airbase==nil then +if NewCoalitionAirbase==self:GetCoalition()then +self:AirbaseRecaptured(NewCoalitionAirbase) +end +else +if NewCoalitionAirbase~=self:GetCoalition()then +self:AirbaseCaptured(NewCoalitionAirbase) +end +end +end +end +end +function WAREHOUSE:_OnEventMissionEnd(EventData) +self:T3(self.lid..string.format("Warehouse %s captured event mission end!",self.alias)) +if self.autosave then +self:Save(self.autosavepath,self.autosavefile) +end +end +function WAREHOUSE:_CheckConquered() +local coord=self.zone:GetCoordinate() +local radius=self.zone:GetRadius() +local gotunits,_,_,units,_,_=coord:ScanObjects(radius,true,false,false) +local Nblue=0 +local Nred=0 +local Nneutral=0 +local CountryBlue=nil +local CountryRed=nil +local CountryNeutral=nil +if gotunits then +for _,_unit in pairs(units)do +local unit=_unit +local distance=coord:Get2DDistance(unit:GetCoord()) +if unit:IsGround()and unit:IsAlive()and distance<=radius then +local _coalition=unit:GetCoalition() +local _country=unit:GetCountry() +self:T2(self.lid..string.format("Unit %s in warehouse zone of radius=%d m. Coalition=%d, country=%d. Distance = %d m.",unit:GetName(),radius,_coalition,_country,distance)) +if _coalition==coalition.side.BLUE then +Nblue=Nblue+1 +CountryBlue=_country +elseif _coalition==coalition.side.RED then +Nred=Nred+1 +CountryRed=_country +else +Nneutral=Nneutral+1 +CountryNeutral=_country +end +end +end +end +self:T(self.lid..string.format("Ground troops in warehouse zone: blue=%d, red=%d, neutral=%d",Nblue,Nred,Nneutral)) +local newcoalition=self:GetCoalition() +local newcountry=self:GetCountry() +if Nblue>0 and Nred==0 and Nneutral==0 then +newcoalition=coalition.side.BLUE +newcountry=CountryBlue +elseif Nblue==0 and Nred>0 and Nneutral==0 then +newcoalition=coalition.side.RED +newcountry=CountryRed +elseif Nblue==0 and Nred==0 and Nneutral>0 then +end +if self:IsAttacked()and newcoalition~=self:GetCoalition()then +self:Captured(newcoalition,newcountry) +return +end +if self:GetCoalition()==coalition.side.BLUE then +if self:IsRunning()and Nred>0 then +self:Attacked(coalition.side.RED,CountryRed) +end +if self:IsAttacked()and Nred==0 then +self:Defeated() +end +elseif self:GetCoalition()==coalition.side.RED then +if self:IsRunning()and Nblue>0 then +self:Attacked(coalition.side.BLUE,CountryBlue) +end +if self:IsAttacked()and Nblue==0 then +self:Defeated() +end +elseif self:GetCoalition()==coalition.side.NEUTRAL then +if self:IsRunning()and Nred>0 then +self:Attacked(coalition.side.RED,CountryRed) +elseif self:IsRunning()and Nblue>0 then +self:Attacked(coalition.side.BLUE,CountryBlue) +end +end +end +function WAREHOUSE:_CheckAirbaseOwner() +if self.airbasename then +local airbase=AIRBASE:FindByName(self.airbasename) +local airbasecurrentcoalition=airbase:GetCoalition() +if self.airbase then +if self:GetCoalition()~=airbasecurrentcoalition then +self.airbase=nil +end +else +if self:GetCoalition()==airbasecurrentcoalition then +self.airbase=airbase +end +end +end +end +function WAREHOUSE:_CheckRequestConsistancy(queue) +self:T3(self.lid..string.format("Number of queued requests = %d",#queue)) +local invalid={} +for _,_request in pairs(queue)do +local request=_request +self:T2(self.lid..string.format("Checking request id=%d.",request.uid)) +local valid=true +if request.nasset==0 then +self:E(self.lid..string.format("ERROR: INVALID request. Request for zero assets not possible. Can happen when, e.g. \"all\" ground assets are requests but none in stock.")) +valid=false +end +if self:GetCoalition()~=request.warehouse:GetCoalition()then +self:E(self.lid..string.format("ERROR: INVALID request. Requesting warehouse is of wrong coalition! Own coalition %s != %s of requesting warehouse.",self:GetCoalitionName(),request.warehouse:GetCoalitionName())) +valid=false +end +if request.warehouse:IsStopped()then +self:E(self.lid..string.format("ERROR: INVALID request. Requesting warehouse is stopped!")) +valid=false +end +if request.warehouse:IsDestroyed()and not self.respawnafterdestroyed then +self:E(self.lid..string.format("ERROR: INVALID request. Requesting warehouse is destroyed!")) +valid=false +end +if valid==false then +self:E(self.lid..string.format("Got invalid request id=%d.",request.uid)) +table.insert(invalid,request) +else +self:T3(self.lid..string.format("Got valid request id=%d.",request.uid)) +end +end +for _,_request in pairs(invalid)do +self:E(self.lid..string.format("Deleting INVALID request id=%d.",_request.uid)) +self:_DeleteQueueItem(_request,self.queue) +end +end +function WAREHOUSE:_CheckRequestValid(request) +local _assets,_nassets,_enough=self:_FilterStock(self.stock,request.assetdesc,request.assetdescval,request.nasset) +if#_assets==0 then +return true +end +local nasset=request.nasset +if type(request.nasset)=="string"then +nasset=self:_QuantityRel2Abs(request.nasset,_nassets) +end +local text=string.format("Request valid? Number of assets: requested=%s=%d, selected=%d, total=%d, enough=%s.",tostring(request.nasset),nasset,#_assets,_nassets,tostring(_enough)) +self:T(text) +local asset=_assets[1] +local asset_plane=asset.category==Group.Category.AIRPLANE +local asset_helo=asset.category==Group.Category.HELICOPTER +local asset_ground=asset.category==Group.Category.GROUND +local asset_train=asset.category==Group.Category.TRAIN +local asset_naval=asset.category==Group.Category.SHIP +local asset_air=asset_helo or asset_plane +local valid=true +local requestcategory=request.warehouse:GetAirbaseCategory() +if request.transporttype==WAREHOUSE.TransportType.SELFPROPELLED then +if asset_air then +if asset_plane then +if requestcategory==Airbase.Category.HELIPAD or self:GetAirbaseCategory()==Airbase.Category.HELIPAD then +self:E("ERROR: Incorrect request. Asset airplane requested but warehouse or requestor is HELIPAD/FARP!") +valid=false +end +elseif asset_helo then +if self:GetAirbaseCategory()==-1 or requestcategory==-1 then +self:E("ERROR: Incorrect request. Helos need a AIRBASE/HELIPAD/SHIP as home/destination base!") +valid=false +end +end +if self.airbase==nil or request.airbase==nil then +self:E("ERROR: Incorrect request. Either warehouse or requesting warehouse does not have any kind of airbase!") +valid=false +else +local termtype_dep=asset.terminalType or self:_GetTerminal(asset.attribute,self:GetAirbaseCategory()) +local termtype_des=asset.terminalType or self:_GetTerminal(asset.attribute,request.warehouse:GetAirbaseCategory()) +local np_departure=self.airbase:GetParkingSpotsNumber(termtype_dep) +local np_destination=request.airbase:GetParkingSpotsNumber(termtype_des) +self:T(string.format("Asset attribute = %s, DEPARTURE: terminal type = %d, spots = %d, DESTINATION: terminal type = %d, spots = %d",asset.attribute,termtype_dep,np_departure,termtype_des,np_destination)) +if np_departure<nasset then +self:E(string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at warehouse. Available spots %d < %d necessary.",termtype_dep,np_departure,nasset)) +valid=false +end +if np_destination==0 then +self:E(string.format("ERROR: Incorrect request. No parking spots of terminal type %d at requesting warehouse. Available spots = %d!",termtype_des,np_destination)) +valid=false +end +end +elseif asset_ground then +local inwater=self.spawnzone:GetCoordinate():IsSurfaceTypeWater()or request.warehouse.spawnzone:GetCoordinate():IsSurfaceTypeWater() +if inwater and not request.lateActivation then +self:E("ERROR: Incorrect request. Ground asset requested but at least one spawn zone is in water!") +return false +end +if asset_train then +local hasrail=self:HasConnectionRail(request.warehouse) +if not hasrail then +self:E("ERROR: Incorrect request. No valid path on rail for train assets!") +valid=false +end +else +if self.warehouse:GetName()~=request.warehouse.warehouse:GetName()then +local hasroad=self:HasConnectionRoad(request.warehouse) +local hasoffroad=self:HasConnectionOffRoad(request.warehouse) +if not(hasroad or hasoffroad)then +self:E("ERROR: Incorrect request. No valid path on or off road for ground assets!") +valid=false +end +end +end +elseif asset_naval then +local shippinglane=self:HasConnectionNaval(request.warehouse) +if not shippinglane then +self:E("ERROR: Incorrect request. No shipping lane has been defined between warehouses!") +valid=false +end +end +else +if request.transporttype==WAREHOUSE.TransportType.AIRPLANE then +if self:GetAirbaseCategory()~=Airbase.Category.AIRDROME or requestcategory~=Airbase.Category.AIRDROME then +self:E("ERROR: Incorrect request. Warehouse or requestor does not have an airdrome. No transport by plane possible!") +valid=false +end +elseif request.transporttype==WAREHOUSE.TransportType.APC then +if self:GetAirbaseCategory()==Airbase.Category.SHIP or requestcategory==Airbase.Category.SHIP then +self:E("ERROR: Incorrect request. Warehouse or requestor is SHIP. No transport by APC possible!") +valid=false +end +local hasroad=self:HasConnectionRoad(request.warehouse) +if not hasroad then +self:E("ERROR: Incorrect request. No valid path on road for ground transport assets!") +valid=false +end +elseif request.transporttype==WAREHOUSE.TransportType.HELICOPTER then +if self:GetAirbaseCategory()==-1 then +self:E("ERROR: Incorrect request. Warehouse has no airbase. Transport by helicopter not possible!") +valid=false +end +elseif request.transporttype==WAREHOUSE.TransportType.SHIP or request.transporttype==WAREHOUSE.TransportType.AIRCRAFTCARRIER +or request.transporttype==WAREHOUSE.TransportType.ARMEDSHIP or request.transporttype==WAREHOUSE.TransportType.WARSHIP then +local shippinglane=self:HasConnectionNaval(request.warehouse) +if not shippinglane then +self:E("ERROR: Incorrect request. No shipping lane has been defined between warehouses!") +valid=false +end +elseif request.transporttype==WAREHOUSE.TransportType.TRAIN then +self:E("ERROR: Incorrect request. Transport by TRAIN not implemented yet!") +valid=false +else +self:E("ERROR: Incorrect request. Transport type unknown!") +valid=false +end +if request.transporttype==WAREHOUSE.TransportType.AIRPLANE or request.transporttype==WAREHOUSE.TransportType.HELICOPTER then +local _assets,_nassets,_enough=self:_FilterStock(self.stock,WAREHOUSE.Descriptor.ATTRIBUTE,request.transporttype,request.ntransport,true) +local nasset=request.ntransport +if type(request.ntransport)=="string"then +nasset=self:_QuantityRel2Abs(request.ntransport,_nassets) +end +local text=string.format("Request valid? Number of transports: requested=%s=%d, selected=%d, total=%d, enough=%s.",tostring(request.ntransport),nasset,#_assets,_nassets,tostring(_enough)) +self:T(text) +local termtype=self:_GetTerminal(request.transporttype,self:GetAirbaseCategory()) +local np_departure=self.airbase:GetParkingSpotsNumber(termtype) +self:T(self.lid..string.format("Transport attribute = %s, terminal type = %d, spots at departure = %d.",request.transporttype,termtype,np_departure)) +if np_departure<nasset then +self:E(self.lid..string.format("ERROR: Incorrect request. Not enough parking spots of terminal type %d at warehouse. Available spots %d < %d necessary.",termtype,np_departure,nasset)) +valid=false +end +if request.transporttype==WAREHOUSE.TransportType.AIRPLANE then +termtype=self:_GetTerminal(request.transporttype,request.warehouse:GetAirbaseCategory()) +local np_destination=request.airbase:GetParkingSpotsNumber(termtype) +self:T(self.lid..string.format("Transport attribute = %s: total # of spots (type=%d) at destination = %d.",asset.attribute,termtype,np_destination)) +if np_destination==0 then +self:E(string.format("ERROR: Incorrect request. No parking spots of terminal type %d at requesting warehouse for transports. Available spots = %d!",termtype,np_destination)) +valid=false +end +end +end +end +if valid==false then +self:E(self.lid..string.format("ERROR: Got invalid request id=%d.",request.uid)) +else +self:T3(self.lid..string.format("Request id=%d valid :)",request.uid)) +end +return valid +end +function WAREHOUSE:_CheckRequestNow(request) +if(request.warehouse:IsRunning()==false)and not(request.toself and self:IsAttacked())then +local text=string.format("Warehouse %s: Request denied! Receiving warehouse %s is not running. Current state %s.",self.alias,request.warehouse.alias,request.warehouse:GetState()) +self:_InfoMessage(text,5) +return false +end +local onlymobile=false +if type(request.ntransport)=="number"and request.ntransport==0 and not request.toself then +onlymobile=true +end +local _assets,_nassets,_enough=self:_FilterStock(self.stock,request.assetdesc,request.assetdescval,request.nasset,onlymobile) +if not _enough then +local text=string.format("Warehouse %s: Request ID=%d denied! Not enough (cargo) assets currently available.",self.alias,request.uid) +self:_InfoMessage(text,5) +text=string.format("Enough=%s, #assets=%d, nassets=%d, request.nasset=%s",tostring(_enough),#_assets,_nassets,tostring(request.nasset)) +self:T(self.lid..text) +return false +end +local _transports +local _assetattribute +local _assetcategory +local _assetairstart=false +if _nassets>0 then +local asset=_assets[1] +_assetattribute=_assets[1].attribute +_assetcategory=_assets[1].category +_assetairstart=_assets[1].takeoffType and _assets[1].takeoffType==COORDINATE.WaypointType.TurningPoint or false +if _assetcategory==Group.Category.AIRPLANE or _assetcategory==Group.Category.HELICOPTER then +if self.airbase and self.airbase:GetCoalition()==self:GetCoalition()then +if self.airbase.storage then +local nS=self.airbase.storage:GetAmount(asset.unittype) +local nA=asset.nunits*request.nasset +if nS<nA then +local text=string.format("Warehouse %s: Request denied! DCS Warehouse has only %d assets of type %s ==> NOT enough to spawn the requested %d asset units (%d groups)", +self.alias,nS,asset.unittype,nA,request.nasset) +self:_InfoMessage(text,5) +return false +end +end +if self:IsRunwayOperational()or _assetairstart then +if _assetairstart then +else +local Parking=self:_FindParkingForAssets(self.airbase,_assets) +if Parking==nil then +local text=string.format("Warehouse %s: Request denied! Not enough free parking spots for all requested assets at the moment.",self.alias) +self:_InfoMessage(text,5) +return false +end +end +else +local text=string.format("Warehouse %s: Request denied! Runway is still destroyed",self.alias) +self:_InfoMessage(text,5) +return false +end +else +local text=string.format("Warehouse %s: Request denied! No airbase",self.alias) +self:_InfoMessage(text,5) +return false +end +end +request.cargoassets=_assets +end +if request.transporttype~=WAREHOUSE.TransportType.SELFPROPELLED then +_transports=self:_GetTransportsForAssets(request) +if#_transports>0 then +local _transportattribute=_transports[1].attribute +local _transportcategory=_transports[1].category +if _transportcategory==Group.Category.AIRPLANE or _transportcategory==Group.Category.HELICOPTER then +if self.airbase and self.airbase:GetCoalition()==self:GetCoalition()then +if self:IsRunwayOperational()then +local Parking=self:_FindParkingForAssets(self.airbase,_transports) +if Parking==nil then +local text=string.format("Warehouse %s: Request denied! Not enough free parking spots for all transports at the moment.",self.alias) +self:_InfoMessage(text,5) +return false +end +else +local text=string.format("Warehouse %s: Request denied! Runway is still destroyed",self.alias) +self:_InfoMessage(text,5) +return false +end +else +local text=string.format("Warehouse %s: Request denied! No airbase currently!",self.alias) +self:_InfoMessage(text,5) +return false +end +end +else +local text=string.format("Warehouse %s: Request denied! Not enough transport carriers available at the moment.",self.alias) +self:_InfoMessage(text,5) +return false +end +else +if _assetcategory==Group.Category.GROUND then +local dist=self.warehouse:GetCoordinate():Get2DDistance(self.spawnzone:GetCoordinate()) +if dist>self.spawnzonemaxdist then +local text=string.format("Warehouse %s: Request denied! Not close enough to spawn zone. Distance = %d m. We need to be at least within %d m range to spawn.",self.alias,dist,self.spawnzonemaxdist) +self:_InfoMessage(text,5) +return false +end +elseif _assetcategory==Group.Category.AIRPLANE or _assetcategory==Group.Category.HELICOPTER then +end +end +request.cargoassets=_assets +request.cargoattribute=_assets[1].attribute +request.cargocategory=_assets[1].category +request.nasset=#_assets +local text=string.format("Selected cargo assets, attibute=%s, category=%d:\n",request.cargoattribute,request.cargocategory) +for _i,_asset in pairs(_assets)do +local asset=_asset +text=text..string.format("%d) name=%s, type=%s, category=%d, #units=%d",_i,asset.templatename,asset.unittype,asset.category,asset.nunits) +end +self:T(self.lid..text) +if request.transporttype~=WAREHOUSE.TransportType.SELFPROPELLED then +request.transportassets=_transports +request.transportattribute=_transports[1].attribute +request.transportcategory=_transports[1].category +request.ntransport=#_transports +local text=string.format("Selected transport assets, attibute=%s, category=%d:\n",request.transportattribute,request.transportcategory) +for _i,_asset in pairs(_transports)do +local asset=_asset +text=text..string.format("%d) name=%s, type=%s, category=%d, #units=%d\n",_i,asset.templatename,asset.unittype,asset.category,asset.nunits) +end +self:T(self.lid..text) +end +return true +end +function WAREHOUSE:_GetTransportsForAssets(request) +local transports=self:_FilterStock(self.stock,WAREHOUSE.Descriptor.ATTRIBUTE,request.transporttype,nil,true) +local cargoassets=UTILS.DeepCopy(request.cargoassets) +local cargoset=request.transportcargoset +local function sort_transports(a,b) +return a.cargobaymax>b.cargobaymax +end +local function sort_cargoassets(a,b) +return a.weight>b.weight +end +table.sort(transports,sort_transports) +table.sort(cargoassets,sort_cargoassets) +self:T2(self.lid.."Transport capability:") +local totalbay=0 +for i=1,#transports do +local transport=transports[i] +for j=1,transport.nunits do +totalbay=totalbay+transport.cargobay[j] +self:T2(self.lid..string.format("Cargo bay = %d (unit=%d)",transport.cargobay[j],j)) +end +end +self:T2(self.lid..string.format("Total capacity = %d",totalbay)) +self:T2(self.lid.."Cargo weight:") +local totalcargoweight=0 +for i=1,#cargoassets do +local asset=cargoassets[i] +totalcargoweight=totalcargoweight+asset.weight +self:T2(self.lid..string.format("weight = %d",asset.weight)) +end +self:T2(self.lid..string.format("Total weight = %d",totalcargoweight)) +local used_transports={} +for i=1,#transports do +local transport=transports[i] +local putintocarrier={} +local used=false +for k=1,transport.nunits do +local cargobay=transport.cargobay[k] +for j,asset in pairs(cargoassets)do +local asset=asset +local delta=cargobay-asset.weight +if delta>=0 then +cargobay=cargobay-asset.weight +self:T3(self.lid..string.format("%s unit %d loads cargo uid=%d: bayempty=%02d, bayloaded = %02d - weight=%02d",transport.templatename,k,asset.uid,transport.cargobay[k],cargobay,asset.weight)) +table.insert(putintocarrier,j) +used=true +else +self:T2(self.lid..string.format("Carrier unit %s too small for cargo asset %s ==> cannot be used! Cargo bay - asset weight = %d kg",transport.templatename,asset.templatename,delta)) +end +end +end +for j=#putintocarrier,1,-1 do +local nput=putintocarrier[j] +local cargo=cargoassets[nput] +if cargo then +self:T2(self.lid..string.format("Cargo id=%d assigned for carrier id=%d",cargo.uid,transport.uid)) +table.remove(cargoassets,nput) +end +end +if used then +table.insert(used_transports,transport) +end +local ntrans=self:_QuantityRel2Abs(request.ntransport,#transports) +if#used_transports>=ntrans then +request.ntransport=#used_transports +break +end +end +local text=string.format("Used Transports for request %d to warehouse %s:\n",request.uid,request.warehouse.alias) +local totalcargobay=0 +for _i,_transport in pairs(used_transports)do +local transport=_transport +text=text..string.format("%d) %s: cargobay tot = %d kg, cargobay max = %d kg, nunits=%d\n",_i,transport.unittype,transport.cargobaytot,transport.cargobaymax,transport.nunits) +totalcargobay=totalcargobay+transport.cargobaytot +end +text=text..string.format("Total cargo bay capacity = %.1f kg\n",totalcargobay) +text=text..string.format("Total cargo weight = %.1f kg\n",totalcargoweight) +text=text..string.format("Minimum number of runs = %.1f",totalcargoweight/totalcargobay) +self:_DebugMessage(text) +return used_transports +end +function WAREHOUSE:_QuantityRel2Abs(relative,ntot) +local nabs=0 +if type(relative)=="string"then +if relative==WAREHOUSE.Quantity.ALL then +nabs=ntot +elseif relative==WAREHOUSE.Quantity.THREEQUARTERS then +nabs=UTILS.Round(ntot*3/4) +elseif relative==WAREHOUSE.Quantity.HALF then +nabs=UTILS.Round(ntot/2) +elseif relative==WAREHOUSE.Quantity.THIRD then +nabs=UTILS.Round(ntot/3) +elseif relative==WAREHOUSE.Quantity.QUARTER then +nabs=UTILS.Round(ntot/4) +else +nabs=math.min(1,ntot) +end +else +nabs=relative +end +self:T2(self.lid..string.format("Relative %s: tot=%d, abs=%.2f",tostring(relative),ntot,nabs)) +return nabs +end +function WAREHOUSE:_CheckQueue() +self:_SortQueue() +local request=nil +local invalid={} +local gotit=false +for _,_qitem in ipairs(self.queue)do +local qitem=_qitem +local valid=self:_CheckRequestValid(qitem) +local okay=false +if valid then +okay=self:_CheckRequestNow(qitem) +else +table.insert(invalid,qitem) +end +if okay and valid and not gotit then +request=qitem +gotit=true +break +end +end +for _,_request in pairs(invalid)do +self:T(self.lid..string.format("Deleting invalid request id=%d.",_request.uid)) +self:_DeleteQueueItem(_request,self.queue) +end +return request +end +function WAREHOUSE:_SimpleTaskFunction(Function,group) +self:F2({Function}) +local warehouse=self.warehouse:GetName() +local groupname=group:GetName() +local DCSScript={} +DCSScript[#DCSScript+1]=string.format('local mygroup = GROUP:FindByName(\"%s\") ',groupname) +if self.isUnit then +DCSScript[#DCSScript+1]=string.format("local mywarehouse = UNIT:FindByName(\"%s\") ",warehouse) +else +DCSScript[#DCSScript+1]=string.format("local mywarehouse = STATIC:FindByName(\"%s\") ",warehouse) +end +DCSScript[#DCSScript+1]=string.format('local warehouse = mywarehouse:GetState(mywarehouse, \"WAREHOUSE\") ') +DCSScript[#DCSScript+1]=string.format('%s(mygroup)',Function) +local DCSTask=CONTROLLABLE.TaskWrappedAction(self,CONTROLLABLE.CommandDoScript(self,table.concat(DCSScript))) +return DCSTask +end +function WAREHOUSE:_SimpleTaskFunctionWP(Function,group,n,N) +self:F2({Function}) +local warehouse=self.warehouse:GetName() +local groupname=group:GetName() +local DCSScript={} +DCSScript[#DCSScript+1]=string.format('local mygroup = GROUP:FindByName(\"%s\") ',groupname) +if self.isUnit then +DCSScript[#DCSScript+1]=string.format("local mywarehouse = UNIT:FindByName(\"%s\") ",warehouse) +else +DCSScript[#DCSScript+1]=string.format("local mywarehouse = STATIC:FindByName(\"%s\") ",warehouse) +end +DCSScript[#DCSScript+1]=string.format('local warehouse = mywarehouse:GetState(mywarehouse, \"WAREHOUSE\") ') +DCSScript[#DCSScript+1]=string.format('%s(mygroup, %d, %d)',Function,n,N) +local DCSTask=CONTROLLABLE.TaskWrappedAction(self,CONTROLLABLE.CommandDoScript(self,table.concat(DCSScript))) +return DCSTask +end +function WAREHOUSE:_GetTerminal(_attribute,_category) +local _terminal=AIRBASE.TerminalType.OpenBig +if _attribute==WAREHOUSE.Attribute.AIR_FIGHTER or _attribute==WAREHOUSE.Attribute.AIR_UAV then +_terminal=AIRBASE.TerminalType.FighterAircraft +elseif _attribute==WAREHOUSE.Attribute.AIR_BOMBER or _attribute==WAREHOUSE.Attribute.AIR_TRANSPORTPLANE or _attribute==WAREHOUSE.Attribute.AIR_TANKER or _attribute==WAREHOUSE.Attribute.AIR_AWACS then +_terminal=AIRBASE.TerminalType.OpenBig +elseif _attribute==WAREHOUSE.Attribute.AIR_TRANSPORTHELO or _attribute==WAREHOUSE.Attribute.AIR_ATTACKHELO then +_terminal=AIRBASE.TerminalType.HelicopterUsable +else +end +if _category==Airbase.Category.SHIP then +if not(_attribute==WAREHOUSE.Attribute.AIR_TRANSPORTHELO or _attribute==WAREHOUSE.Attribute.AIR_ATTACKHELO)then +_terminal=AIRBASE.TerminalType.OpenMedOrBig +end +end +return _terminal +end +function WAREHOUSE:_FindParkingForAssets(airbase,assets) +local scanradius=25 +local scanunits=true +local scanstatics=true +local scanscenery=false +local verysafe=false +local function _overlap(l1,l2,dist) +local safedist=(l1/2+l2/2)*1.05 +local safe=(dist>safedist) +self:T3(string.format("l1=%.1f l2=%.1f s=%.1f d=%.1f ==> safe=%s",l1,l2,safedist,dist,tostring(safe))) +return safe +end +local function _clients() +local coords={} +if not self.allowSpawnOnClientSpots then +local clients=_DATABASE.CLIENTS +for clientname,client in pairs(clients)do +local template=_DATABASE:GetGroupTemplateFromUnitName(clientname) +if template then +local units=template.units +for i,unit in pairs(units)do +local coord=COORDINATE:New(unit.x,unit.alt,unit.y) +coords[unit.name]=coord +end +end +end +end +return coords +end +local parkingdata=airbase.parking +local obstacles={} +self.clientcoords=self.clientcoords or _clients() +for clientname,_coord in pairs(self.clientcoords)do +table.insert(obstacles,{coord=_coord,size=15,name=clientname,type="client"}) +end +for _,parkingspot in pairs(parkingdata)do +local _spot=parkingspot.Coordinate +local _termid=parkingspot.TerminalID +local _,_,_,_units,_statics,_sceneries=_spot:ScanObjects(scanradius,scanunits,scanstatics,scanscenery) +for _,_unit in pairs(_units)do +local unit=_unit +local _coord=unit:GetVec3() +local _size=self:_GetObjectSize(unit:GetDCSObject()) +local _name=unit:GetName() +if unit and unit:IsAlive()then +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="unit"}) +end +end +for _,static in pairs(_statics)do +local _coord=static:getPoint() +local _name=static:getName() +local _size=self:_GetObjectSize(static) +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="static"}) +end +for _,scenery in pairs(_sceneries)do +local _coord=scenery:getPoint() +local _name=scenery:getTypeName() +local _size=self:_GetObjectSize(scenery) +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="scenery"}) +end +end +local parking={} +for _,asset in pairs(assets)do +local _asset=asset +if not _asset.spawned then +local terminaltype=asset.terminalType or self:_GetTerminal(asset.attribute,self:GetAirbaseCategory()) +parking[_asset.uid]={} +for i=1,_asset.nunits do +local assetname=_asset.spawngroupname.."-"..tostring(i) +local gotit=false +for _,_parkingspot in pairs(parkingdata)do +local parkingspot=_parkingspot +local valid=true +if asset.parkingIDs then +valid=self:_CheckParkingAsset(parkingspot,asset) +else +local validTerminal=AIRBASE._CheckTerminalType(parkingspot.TerminalType,terminaltype) +local validParking=self:_CheckParkingValid(parkingspot) +local validBWlist=airbase:_CheckParkingLists(parkingspot.TerminalID) +valid=validTerminal and validParking and validBWlist +end +if valid then +local _spot=parkingspot.Coordinate +local _termid=parkingspot.TerminalID +local free=true +local problem=nil +for _,obstacle in pairs(obstacles)do +local dist=_spot:Get2DDistance(obstacle.coord) +local safe=_overlap(_asset.size,obstacle.size,dist) +if not safe then +self:T3(self.lid..string.format("FF asset=%s (id=%d): spot id=%d dist=%.1fm is NOT SAFE",assetname,_asset.uid,_termid,dist)) +free=false +problem=obstacle +problem.dist=dist +break +else +end +end +if free then +table.insert(parking[_asset.uid],parkingspot) +self:T(self.lid..string.format("Parking spot %d is free for asset %s [id=%d]!",_termid,assetname,_asset.uid)) +table.insert(obstacles,{coord=_spot,size=_asset.size,name=assetname,type="asset"}) +gotit=true +break +else +if self.Debug then +local coord=problem.coord +if coord then +local text=string.format("Obstacle %s [type=%s] blocking spot=%d! Size=%.1f m and distance=%.1f m.",problem.name,problem.type,_termid,problem.size,problem.dist) +self:I(self.lid..text) +coord:MarkToAll(text) +end +else +self:T(self.lid..string.format("Parking spot %d is occupied or not big enough!",_termid)) +end +end +else +self:T2(self.lid..string.format("Terminal ID=%d: type=%s not supported",parkingspot.TerminalID,parkingspot.TerminalType)) +end +end +if not gotit then +self:I(self.lid..string.format("WARNING: No free parking spot for asset %s [id=%d]",assetname,_asset.uid)) +return nil +end +end +end +end +return parking +end +function WAREHOUSE:_GetRequestOfGroup(group,queue) +local wid,aid,rid=self:_GetIDsFromGroup(group) +for _,_request in pairs(queue)do +local request=_request +if request.uid==rid then +return request +end +end +end +function WAREHOUSE:_GroupIsTransport(group,request) +local asset=self:FindAssetInDB(group) +if asset and asset.iscargo~=nil then +return not asset.iscargo +else +local groupname=self:_GetNameWithOut(group) +if request.transportgroupset then +local transporters=request.transportgroupset:GetSetObjects() +for _,transport in pairs(transporters)do +if transport:GetName()==groupname then +return true +end +end +end +if request.cargogroupset then +local cargos=request.cargogroupset:GetSetObjects() +for _,cargo in pairs(cargos)do +if self:_GetNameWithOut(cargo)==groupname then +return false +end +end +end +end +return nil +end +function WAREHOUSE:_GetNameWithOut(group) +local groupname=type(group)=="string"and group or group:GetName() +if groupname:find("CARGO")then +local name=groupname:gsub("#CARGO","") +return name +else +return groupname +end +end +function WAREHOUSE:_GetIDsFromGroup(group) +if group then +local groupname=group:GetName() +local wid,aid,rid=self:_GetIDsFromGroupName(groupname) +return wid,aid,rid +else +self:E("WARNING: Group not found in GetIDsFromGroup() function!") +end +end +function WAREHOUSE:_GetIDsFromGroupName(groupname) +local function analyse(text) +local unspawned=UTILS.Split(text,"#")[1] +local keywords=UTILS.Split(unspawned,"_") +local _wid=nil +local _aid=nil +local _rid=nil +for _,keys in pairs(keywords)do +local str=UTILS.Split(keys,"-") +local key=str[1] +local val=str[2] +if key:find("WID")then +_wid=tonumber(val) +elseif key:find("AID")then +_aid=tonumber(val) +elseif key:find("RID")then +_rid=tonumber(val) +end +end +return _wid,_aid,_rid +end +local wid,aid,rid=analyse(groupname) +local asset=self:GetAssetByID(aid) +if asset then +wid=asset.wid +rid=asset.rid +end +self:T3(self.lid..string.format("Group Name = %s",tostring(groupname))) +self:T3(self.lid..string.format("Warehouse ID = %s",tostring(wid))) +self:T3(self.lid..string.format("Asset ID = %s",tostring(aid))) +self:T3(self.lid..string.format("Request ID = %s",tostring(rid))) +return wid,aid,rid +end +function WAREHOUSE:FilterStock(descriptor,attribute,nmax,mobile) +return self:_FilterStock(self.stock,descriptor,attribute,nmax,mobile) +end +function WAREHOUSE:_FilterStock(stock,descriptor,attribute,nmax,mobile) +nmax=nmax or WAREHOUSE.Quantity.ALL +if mobile==nil then +mobile=false +end +local filtered={} +if descriptor==WAREHOUSE.Descriptor.ASSETLIST then +local ntot=0 +for _,_rasset in pairs(attribute)do +local rasset=_rasset +for _,_asset in ipairs(stock)do +local asset=_asset +if rasset.uid==asset.uid then +table.insert(filtered,asset) +break +end +end +end +return filtered,#filtered,#filtered>=#attribute +end +local ntot=0 +for _,_asset in ipairs(stock)do +local asset=_asset +local ismobile=asset.speedmax>0 +if asset[descriptor]==attribute then +if(mobile==true and ismobile)or mobile==false then +ntot=ntot+1 +end +end +end +if ntot==0 then +return filtered,ntot,false +end +nmax=self:_QuantityRel2Abs(nmax,ntot) +for _i,_asset in ipairs(stock)do +local asset=_asset +if asset[descriptor]==attribute then +if(mobile and asset.speedmax>0)or(not mobile)then +table.insert(filtered,asset) +if nmax~=nil and#filtered>=nmax then +return filtered,ntot,true +end +end +end +end +return filtered,ntot,ntot>=nmax +end +function WAREHOUSE:_HasAttribute(group,attribute) +if group then +local groupattribute=self:_GetAttribute(group) +return groupattribute==attribute +end +return false +end +function WAREHOUSE:_GetAttribute(group) +local attribute=WAREHOUSE.Attribute.OTHER_UNKNOWN +if group then +local groupCat=group:GetCategory() +local transportplane=group:HasAttribute("Transports")and group:HasAttribute("Planes")and groupCat==Group.Category.AIRPLANE +local awacs=group:HasAttribute("AWACS") +local fighter=group:HasAttribute("Fighters")or group:HasAttribute("Interceptors")or group:HasAttribute("Multirole fighters")or(group:HasAttribute("Bombers")and not group:HasAttribute("Strategic bombers")) +local bomber=group:HasAttribute("Strategic bombers") +local tanker=group:HasAttribute("Tankers") +local uav=group:HasAttribute("UAVs") +local transporthelo=group:HasAttribute("Transport helicopters") +local attackhelicopter=group:HasAttribute("Attack helicopters") +local apc=group:HasAttribute("APC") +local truck=group:HasAttribute("Trucks")and group:GetCategory()==Group.Category.GROUND +local infantry=group:HasAttribute("Infantry") +local ifv=group:HasAttribute("IFV") +local artillery=group:HasAttribute("Artillery") +local tank=group:HasAttribute("Old Tanks")or group:HasAttribute("Modern Tanks") +local aaa=group:HasAttribute("AAA") +local ewr=group:HasAttribute("EWR") +local sam=group:HasAttribute("SAM elements")and(not group:HasAttribute("AAA")) +local train=group:GetCategory()==Group.Category.TRAIN +local aircraftcarrier=group:HasAttribute("Aircraft Carriers") +local warship=group:HasAttribute("Heavy armed ships") +local armedship=group:HasAttribute("Armed ships")or group:HasAttribute("Armed Ship") +local unarmedship=group:HasAttribute("Unarmed ships") +if transportplane then +attribute=WAREHOUSE.Attribute.AIR_TRANSPORTPLANE +elseif awacs then +attribute=WAREHOUSE.Attribute.AIR_AWACS +elseif fighter then +attribute=WAREHOUSE.Attribute.AIR_FIGHTER +elseif bomber then +attribute=WAREHOUSE.Attribute.AIR_BOMBER +elseif tanker then +attribute=WAREHOUSE.Attribute.AIR_TANKER +elseif transporthelo then +attribute=WAREHOUSE.Attribute.AIR_TRANSPORTHELO +elseif attackhelicopter then +attribute=WAREHOUSE.Attribute.AIR_ATTACKHELO +elseif uav then +attribute=WAREHOUSE.Attribute.AIR_UAV +elseif apc then +attribute=WAREHOUSE.Attribute.GROUND_APC +elseif ifv then +attribute=WAREHOUSE.Attribute.GROUND_IFV +elseif infantry then +attribute=WAREHOUSE.Attribute.GROUND_INFANTRY +elseif artillery then +attribute=WAREHOUSE.Attribute.GROUND_ARTILLERY +elseif tank then +attribute=WAREHOUSE.Attribute.GROUND_TANK +elseif aaa then +attribute=WAREHOUSE.Attribute.GROUND_AAA +elseif ewr then +attribute=WAREHOUSE.Attribute.GROUND_EWR +elseif sam then +attribute=WAREHOUSE.Attribute.GROUND_SAM +elseif truck then +attribute=WAREHOUSE.Attribute.GROUND_TRUCK +elseif train then +attribute=WAREHOUSE.Attribute.GROUND_TRAIN +elseif aircraftcarrier then +attribute=WAREHOUSE.Attribute.NAVAL_AIRCRAFTCARRIER +elseif warship then +attribute=WAREHOUSE.Attribute.NAVAL_WARSHIP +elseif armedship then +attribute=WAREHOUSE.Attribute.NAVAL_ARMEDSHIP +elseif unarmedship then +attribute=WAREHOUSE.Attribute.NAVAL_UNARMEDSHIP +else +if group:IsGround()then +attribute=WAREHOUSE.Attribute.GROUND_OTHER +elseif group:IsShip()then +attribute=WAREHOUSE.Attribute.NAVAL_OTHER +elseif group:IsAir()then +attribute=WAREHOUSE.Attribute.AIR_OTHER +else +attribute=WAREHOUSE.Attribute.OTHER_UNKNOWN +end +end +end +return attribute +end +function WAREHOUSE:_GetObjectSize(DCSobject) +local DCSdesc=DCSobject:getDesc() +if DCSdesc.box then +local x=DCSdesc.box.max.x+math.abs(DCSdesc.box.min.x) +local y=DCSdesc.box.max.y+math.abs(DCSdesc.box.min.y) +local z=DCSdesc.box.max.z+math.abs(DCSdesc.box.min.z) +return math.max(x,z),x,y,z +end +return 0,0,0,0 +end +function WAREHOUSE:GetStockInfo(stock) +local _data={} +for _j,_attribute in pairs(WAREHOUSE.Attribute)do +local n=0 +for _i,_item in pairs(stock)do +local _ite=_item +if _ite.attribute==_attribute then +n=n+1 +end +end +_data[_attribute]=n +end +return _data +end +function WAREHOUSE:_DeleteStockItem(stockitem) +for i=1,#self.stock do +local item=self.stock[i] +if item.uid==stockitem.uid then +table.remove(self.stock,i) +break +end +end +end +function WAREHOUSE:_DeleteQueueItem(qitem,queue) +for i=1,#queue do +local _item=queue[i] +if _item.uid==qitem.uid then +self:T(self.lid..string.format("Deleting queue item id=%d.",qitem.uid)) +table.remove(queue,i) +break +end +end +end +function WAREHOUSE:_DeleteQueueItemByID(qitemID,queue) +for i=1,#queue do +local _item=queue[i] +if _item.uid==qitemID then +self:T(self.lid..string.format("Deleting queue item id=%d.",qitemID)) +table.remove(queue,i) +break +end +end +end +function WAREHOUSE:_SortQueue() +self:F3() +local function _sort(a,b) +return(a.prio<b.prio)or(a.prio==b.prio and a.uid<b.uid) +end +table.sort(self.queue,_sort) +end +function WAREHOUSE:_CheckFuel() +for i,qitem in ipairs(self.pending)do +local qitem=qitem +if qitem.transportgroupset then +for _,_group in pairs(qitem.transportgroupset:GetSet())do +local group=_group +if group and group:IsAlive()then +local fuel=group:GetFuelMin() +self:T2(self.lid..string.format("Transport group %s min fuel state = %.2f",group:GetName(),fuel)) +if fuel<self.lowfuelthresh and not qitem.lowfuel then +self:I(self.lid..string.format("Transport group %s is low on fuel! Min fuel state = %.2f",group:GetName(),fuel)) +qitem.lowfuel=true +local asset=self:FindAssetInDB(group) +self:AssetLowFuel(asset,qitem) +break +end +end +end +end +if qitem.cargogroupset then +for _,_group in pairs(qitem.cargogroupset:GetSet())do +local group=_group +if group and group:IsAlive()then +local fuel=group:GetFuelMin() +self:T2(self.lid..string.format("Cargo group %s min fuel state = %.2f. Threshold = %.2f",group:GetName(),fuel,self.lowfuelthresh)) +if fuel<self.lowfuelthresh and not qitem.lowfuel then +self:I(self.lid..string.format("Cargo group %s is low on fuel! Min fuel state = %.2f",group:GetName(),fuel)) +qitem.lowfuel=true +local asset=self:FindAssetInDB(group) +self:AssetLowFuel(asset,qitem) +break +end +end +end +end +end +end +function WAREHOUSE:_PrintQueue(queue,name) +if self.verbosity>=2 then +local total="Empty" +if#queue>0 then +total=string.format("Total = %d",#queue) +end +local text=string.format("%s at %s: %s",name,self.alias,total) +for i,qitem in ipairs(queue)do +local qitem=qitem +local uid=qitem.uid +local prio=qitem.prio +local clock="N/A" +if qitem.timestamp then +clock=tostring(UTILS.SecondsToClock(qitem.timestamp)) +end +local assignment=tostring(qitem.assignment) +local requestor=qitem.warehouse.alias +local airbasename=qitem.warehouse:GetAirbaseName() +local requestorAirbaseCat=qitem.warehouse:GetAirbaseCategory() +local assetdesc=qitem.assetdesc +local assetdescval=qitem.assetdescval +if assetdesc==WAREHOUSE.Descriptor.ASSETLIST then +assetdescval="Asset list" +end +local nasset=tostring(qitem.nasset) +local ndelivered=tostring(qitem.ndelivered) +local ncargogroupset="N/A" +if qitem.cargogroupset then +ncargogroupset=tostring(qitem.cargogroupset:Count()) +end +local transporttype="N/A" +if qitem.transporttype then +transporttype=qitem.transporttype +end +local ntransport="N/A" +if qitem.ntransport then +ntransport=tostring(qitem.ntransport) +end +local ntransportalive="N/A" +if qitem.transportgroupset then +ntransportalive=tostring(qitem.transportgroupset:Count()) +end +local ntransporthome="N/A" +if qitem.ntransporthome then +ntransporthome=tostring(qitem.ntransporthome) +end +text=text..string.format( +"\n%d) UID=%d, Prio=%d, Clock=%s, Assignment=%s | Requestor=%s [Airbase=%s, category=%d] | Assets(%s)=%s: #requested=%s / #alive=%s / #delivered=%s | Transport=%s: #requested=%s / #alive=%s / #home=%s", +i,uid,prio,clock,assignment,requestor,airbasename,requestorAirbaseCat,assetdesc,assetdescval,nasset,ncargogroupset,ndelivered,transporttype,ntransport,ntransportalive,ntransporthome) +end +if#queue==0 then +self:I(self.lid..text) +else +if total~="Empty"then +self:I(self.lid..text) +end +end +end +end +function WAREHOUSE:_DisplayStatus() +if self.verbosity>=3 then +local text=string.format("\n------------------------------------------------------\n") +text=text..string.format("Warehouse %s status: %s\n",self.alias,self:GetState()) +text=text..string.format("------------------------------------------------------\n") +text=text..string.format("Coalition name = %s\n",self:GetCoalitionName()) +text=text..string.format("Country name = %s\n",self:GetCountryName()) +text=text..string.format("Airbase name = %s (category=%d)\n",self:GetAirbaseName(),self:GetAirbaseCategory()) +text=text..string.format("Queued requests = %d\n",#self.queue) +text=text..string.format("Pending requests = %d\n",#self.pending) +text=text..string.format("------------------------------------------------------\n") +text=text..self:_GetStockAssetsText() +self:I(text) +end +end +function WAREHOUSE:_GetStockAssetsText(messagetoall) +local _data=self:GetStockInfo(self.stock) +local text="Stock:\n" +local total=0 +for _attribute,_count in pairs(_data)do +if _count>0 then +local attribute=tostring(UTILS.Split(_attribute,"_")[2]) +text=text..string.format("%s = %d\n",attribute,_count) +total=total+_count +end +end +text=text..string.format("===================\n") +text=text..string.format("Total = %d\n",total) +text=text..string.format("------------------------------------------------------\n") +MESSAGE:New(text,10):ToAllIf(messagetoall) +return text +end +function WAREHOUSE:_UpdateWarehouseMarkText() +if self.markerOn then +local text=string.format("Warehouse state: %s\nTotal assets in stock %d:\n",self:GetState(),#self.stock) +for _attribute,_count in pairs(self:GetStockInfo(self.stock)or{})do +if _count>0 then +local attribute=tostring(UTILS.Split(_attribute,"_")[2]) +text=text..string.format("%s=%d, ",attribute,_count) +end +end +local coordinate=self:GetCoordinate() +local coalition=self:GetCoalition() +if not self.markerWarehouse then +self.markerWarehouse=MARKER:New(coordinate,text):ToCoalition(coalition) +else +local refresh=false +if self.markerWarehouse.text~=text then +self.markerWarehouse.text=text +refresh=true +end +if self.markerWarehouse.coordinate~=coordinate then +self.markerWarehouse.coordinate=coordinate +refresh=true +end +if self.markerWarehouse.coalition~=coalition then +self.markerWarehouse.coalition=coalition +refresh=true +end +if refresh then +self.markerWarehouse:Refresh() +end +end +end +end +function WAREHOUSE:_DisplayStockItems(stock) +local text=self.lid..string.format("Warehouse %s stock assets:",self.alias) +for _i,_stock in pairs(stock)do +local mystock=_stock +local name=mystock.templatename +local category=mystock.category +local cargobaymax=mystock.cargobaymax +local cargobaytot=mystock.cargobaytot +local nunits=mystock.nunits +local range=mystock.range +local size=mystock.size +local speed=mystock.speedmax +local uid=mystock.uid +local unittype=mystock.unittype +local weight=mystock.weight +local attribute=mystock.attribute +text=text..string.format("\n%02d) uid=%d, name=%s, unittype=%s, category=%d, attribute=%s, nunits=%d, speed=%.1f km/h, range=%.1f km, size=%.1f m, weight=%.1f kg, cargobax max=%.1f kg tot=%.1f kg", +_i,uid,name,unittype,category,attribute,nunits,speed,range/1000,size,weight,cargobaymax,cargobaytot) +end +self:T3(text) +end +function WAREHOUSE:_Fireworks(coord) +coord=coord or self:GetCoordinate() +for i=1,91 do +local color=math.random(0,3) +coord:Flare(color,i-1) +end +end +function WAREHOUSE:_InfoMessage(text,duration) +duration=duration or 20 +if duration>0 and self.Debug or self.Report then +MESSAGE:New(text,duration):ToCoalition(self:GetCoalition()) +end +self:I(self.lid..text) +end +function WAREHOUSE:_DebugMessage(text,duration) +duration=duration or 20 +if self.Debug and duration>0 then +MESSAGE:New(text,duration):ToAllIf(self.Debug) +end +self:T(self.lid..text) +end +function WAREHOUSE:_ErrorMessage(text,duration) +duration=duration or 20 +if duration>0 then +MESSAGE:New(text,duration):ToAll() +end +self:E(self.lid..text) +end +function WAREHOUSE:_GetMaxHeight(D,alphaC,alphaD,Hdep,Hdest,Deltahhold) +local Hhold=Hdest+Deltahhold +local hdest=Hdest-Hdep +local hhold=hdest+Deltahhold +local Dp=math.sqrt(D^2+hhold^2) +local alphaS=math.atan(hdest/D) +local alphaH=math.atan(hhold/D) +local alphaCp=alphaC-alphaH +local alphaDp=alphaD+alphaH +local gammap=math.pi-alphaCp-alphaDp +local sCp=Dp*math.sin(alphaDp)/math.sin(gammap) +local sDp=Dp*math.sin(alphaCp)/math.sin(gammap) +local hmax=sCp*math.sin(alphaC) +if self.Debug then +env.info(string.format("Hdep = %.3f km",Hdep/1000)) +env.info(string.format("Hdest = %.3f km",Hdest/1000)) +env.info(string.format("DetaHold= %.3f km",Deltahhold/1000)) +env.info() +env.info(string.format("D = %.3f km",D/1000)) +env.info(string.format("Dp = %.3f km",Dp/1000)) +env.info() +env.info(string.format("alphaC = %.3f Deg",math.deg(alphaC))) +env.info(string.format("alphaCp = %.3f Deg",math.deg(alphaCp))) +env.info() +env.info(string.format("alphaD = %.3f Deg",math.deg(alphaD))) +env.info(string.format("alphaDp = %.3f Deg",math.deg(alphaDp))) +env.info() +env.info(string.format("alphaS = %.3f Deg",math.deg(alphaS))) +env.info(string.format("alphaH = %.3f Deg",math.deg(alphaH))) +env.info() +env.info(string.format("sCp = %.3f km",sCp/1000)) +env.info(string.format("sDp = %.3f km",sDp/1000)) +env.info() +env.info(string.format("hmax = %.3f km",hmax/1000)) +env.info() +local hdescent=hmax-hhold +local dClimb=hmax/math.tan(alphaC) +local dDescent=(hmax-hhold)/math.tan(alphaD) +local dCruise=D-dClimb-dDescent +env.info(string.format("hmax = %.3f km",hmax/1000)) +env.info(string.format("hdescent = %.3f km",hdescent/1000)) +env.info(string.format("Dclimb = %.3f km",dClimb/1000)) +env.info(string.format("Dcruise = %.3f km",dCruise/1000)) +env.info(string.format("Ddescent = %.3f km",dDescent/1000)) +env.info() +end +return hmax +end +function WAREHOUSE:_GetFlightplan(asset,departure,destination) +local Vmax=asset.speedmax/3.6 +local Range=asset.range +local category=asset.category +local ceiling=asset.DCSdesc.Hmax +local Vymax=asset.DCSdesc.VyMax +local VxCruiseMax=0.90*Vmax +local VxCruiseMin=math.min(VxCruiseMax*0.70,166) +local VxCruise=UTILS.RandomGaussian((VxCruiseMax-VxCruiseMin)/2+VxCruiseMin,(VxCruiseMax-VxCruiseMax)/4,VxCruiseMin,VxCruiseMax) +local VxClimb=math.min(Vmax*0.90,200) +local VxDescent=math.min(Vmax*0.60,140) +local VxHolding=VxDescent*0.9 +local VxFinal=VxHolding*0.9 +local VyClimb=math.min(7.6,Vymax) +local AlphaClimb=math.rad(4) +local AlphaDescent=math.rad(4) +local FLcruise_expect=150*RAT.unit.FL2m +if category==Group.Category.HELICOPTER then +FLcruise_expect=1000 +end +local Pdeparture=departure:GetCoordinate() +local H_departure=Pdeparture.y +local Pdestination=destination:GetCoordinate() +local H_destination=Pdestination.y +local Rhmin=5000 +local Rhmax=10000 +if category==Group.Category.HELICOPTER then +Rhmin=500 +Rhmax=1000 +end +local Pholding=Pdestination:GetRandomCoordinateInRadius(Rhmax,Rhmin) +local d_holding=Pholding:Get2DDistance(Pdestination) +local H_holding=Pholding.y +local heading=Pdeparture:HeadingTo(Pholding) +local d_total=Pdeparture:Get2DDistance(Pholding) +local h_holding=1200 +if category==Group.Category.HELICOPTER then +h_holding=150 +end +h_holding=UTILS.Randomize(h_holding,0.2) +local DeltaholdingMax=self:_GetMaxHeight(d_total,AlphaClimb,AlphaDescent,H_departure,H_holding,0) +if h_holding>DeltaholdingMax then +h_holding=math.abs(DeltaholdingMax) +end +local Hh_holding=H_holding+h_holding +local h_max=self:_GetMaxHeight(d_total,AlphaClimb,AlphaDescent,H_departure,H_holding,h_holding) +local FLmax=h_max+H_departure +local FLmin=math.max(H_departure,Hh_holding) +FLmax=math.min(FLmax,ceiling) +if FLmin>FLmax then +FLmin=FLmax +end +if FLcruise_expect<FLmin then +FLcruise_expect=FLmin +end +if FLcruise_expect>FLmax then +FLcruise_expect=FLmax +end +local FLcruise=UTILS.RandomGaussian(FLcruise_expect,math.abs(FLmax-FLmin)/4,FLmin,FLmax) +local h_climb=FLcruise-H_departure +local h_descent=FLcruise-Hh_holding +local d_climb=h_climb/math.tan(AlphaClimb) +local d_descent=h_descent/math.tan(AlphaDescent) +local d_cruise=d_total-d_climb-d_descent +local text=string.format("Flight plan:\n") +text=text..string.format("Vx max = %.2f km/h\n",Vmax*3.6) +text=text..string.format("Vx climb = %.2f km/h\n",VxClimb*3.6) +text=text..string.format("Vx cruise = %.2f km/h\n",VxCruise*3.6) +text=text..string.format("Vx descent = %.2f km/h\n",VxDescent*3.6) +text=text..string.format("Vx holding = %.2f km/h\n",VxHolding*3.6) +text=text..string.format("Vx final = %.2f km/h\n",VxFinal*3.6) +text=text..string.format("Vy max = %.2f m/s\n",Vymax) +text=text..string.format("Vy climb = %.2f m/s\n",VyClimb) +text=text..string.format("Alpha Climb = %.2f Deg\n",math.deg(AlphaClimb)) +text=text..string.format("Alpha Descent = %.2f Deg\n",math.deg(AlphaDescent)) +text=text..string.format("Dist climb = %.3f km\n",d_climb/1000) +text=text..string.format("Dist cruise = %.3f km\n",d_cruise/1000) +text=text..string.format("Dist descent = %.3f km\n",d_descent/1000) +text=text..string.format("Dist total = %.3f km\n",d_total/1000) +text=text..string.format("h_climb = %.3f km\n",h_climb/1000) +text=text..string.format("h_desc = %.3f km\n",h_descent/1000) +text=text..string.format("h_holding = %.3f km\n",h_holding/1000) +text=text..string.format("h_max = %.3f km\n",h_max/1000) +text=text..string.format("FL min = %.3f km\n",FLmin/1000) +text=text..string.format("FL expect = %.3f km\n",FLcruise_expect/1000) +text=text..string.format("FL cruise * = %.3f km\n",FLcruise/1000) +text=text..string.format("FL max = %.3f km\n",FLmax/1000) +text=text..string.format("Ceiling = %.3f km\n",ceiling/1000) +text=text..string.format("Max range = %.3f km\n",Range/1000) +self:T(self.lid..text) +if d_cruise<0 then +d_cruise=100 +end +local wp={} +local c={} +local _type=COORDINATE.WaypointType.TakeOffParking +local _action=COORDINATE.WaypointAction.FromParkingArea +if asset.takeoffType and asset.takeoffType==COORDINATE.WaypointType.TakeOffParkingHot then +_type=COORDINATE.WaypointType.TakeOffParkingHot +_action=COORDINATE.WaypointAction.FromParkingAreaHot +else +end +c[#c+1]=Pdeparture +wp[#wp+1]=Pdeparture:WaypointAir("RADIO",_type,_action,VxClimb*3.6,true,departure,nil,"Departure") +local Pcruise=Pdeparture:Translate(d_climb,heading) +Pcruise.y=FLcruise +c[#c+1]=Pcruise +wp[#wp+1]=Pcruise:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,VxCruise*3.6,true,nil,nil,"Cruise") +local Pdescent=Pcruise:Translate(d_cruise,heading) +Pdescent.y=FLcruise +c[#c+1]=Pdescent +wp[#wp+1]=Pdescent:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,VxDescent*3.6,true,nil,nil,"Descent") +Pholding.y=H_holding+h_holding +c[#c+1]=Pholding +wp[#wp+1]=Pholding:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,VxHolding*3.6,true,nil,nil,"Holding") +c[#c+1]=Pdestination +wp[#wp+1]=Pdestination:WaypointAir("RADIO",COORDINATE.WaypointType.Land,COORDINATE.WaypointAction.Landing,VxFinal*3.6,true,destination,nil,"Final Destination") +if self.Debug then +for i,coord in pairs(c)do +local coord=coord +local dist=0 +if i>1 then +dist=coord:Get2DDistance(c[i-1]) +end +coord:MarkToAll(string.format("Waypoint %i, distance = %.2f km",i,dist/1000)) +end +end +return wp,c +end +FOX={ +ClassName="FOX", +verbose=0, +Debug=false, +lid=nil, +menuadded={}, +menudisabled=nil, +destroy=nil, +launchalert=nil, +marklaunch=nil, +missiles={}, +players={}, +safezones={}, +launchzones={}, +protectedset=nil, +explosionpower=0.1, +explosiondist=200, +explosiondist2=500, +bigmissilemass=50, +dt50=5, +dt10=1, +dt05=0.5, +dt01=0.1, +dt00=0.01, +} +FOX.MenuF10={} +FOX.MenuF10Root=nil +FOX.version="0.8.0" +function FOX:New() +self.lid="FOX | " +local self=BASE:Inherit(self,FSM:New()) +self:SetDefaultMissileDestruction(true) +self:SetDefaultLaunchAlerts(true) +self:SetDefaultLaunchMarks(true) +self:SetExplosionDistance() +self:SetExplosionDistanceBigMissiles() +self:SetExplosionPower() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","MissileLaunch","*") +self:AddTransition("*","MissileDestroyed","*") +self:AddTransition("*","EnterSafeZone","*") +self:AddTransition("*","ExitSafeZone","*") +self:AddTransition("Running","Stop","Stopped") +return self +end +function FOX:onafterStart(From,Event,To) +local text=string.format("Starting FOX Missile Trainer %s",FOX.version) +env.info(text) +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.Shot) +if self.Debug then +self:HandleEvent(EVENTS.Hit) +end +if self.Debug then +self:TraceClass(self.ClassName) +self:TraceLevel(2) +end +self:__Status(-20) +end +function FOX:onafterStop(From,Event,To) +local text=string.format("Stopping FOX Missile Trainer %s",FOX.version) +env.info(text) +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Shot) +if self.Debug then +self:UnhandleEvent(EVENTS.Hit) +end +end +function FOX:AddSafeZone(zone) +table.insert(self.safezones,zone) +return self +end +function FOX:AddLaunchZone(zone) +table.insert(self.launchzones,zone) +return self +end +function FOX:SetProtectedGroupSet(groupset) +self.protectedset=groupset +return self +end +function FOX:AddProtectedGroup(group) +if not self.protectedset then +self.protectedset=SET_GROUP:New() +end +self.protectedset:AddGroup(group) +return self +end +function FOX:SetExplosionPower(power) +self.explosionpower=power or 0.1 +return self +end +function FOX:SetExplosionDistance(distance) +self.explosiondist=distance or 200 +return self +end +function FOX:SetExplosionDistanceBigMissiles(distance,explosivemass) +self.explosiondist2=distance or 500 +self.bigmissilemass=explosivemass or 50 +return self +end +function FOX:SetDisableF10Menu() +self.menudisabled=true +return self +end +function FOX:SetEnableF10Menu() +self.menudisabled=false +return self +end +function FOX:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function FOX:SetDefaultMissileDestruction(switch) +if switch==nil then +self.destroy=false +else +self.destroy=switch +end +return self +end +function FOX:SetDefaultLaunchAlerts(switch) +if switch==nil then +self.launchalert=false +else +self.launchalert=switch +end +return self +end +function FOX:SetDefaultLaunchMarks(switch) +if switch==nil then +self.marklaunch=false +else +self.marklaunch=switch +end +return self +end +function FOX:SetDebugOnOff(switch) +if switch==nil then +self.Debug=false +else +self.Debug=switch +end +return self +end +function FOX:SetDebugOn() +self:SetDebugOnOff(true) +return self +end +function FOX:SetDebugOff() +self:SetDebugOff(false) +return self +end +function FOX:onafterStatus(From,Event,To) +local fsmstate=self:GetState() +local time=timer.getAbsTime() +local clock=UTILS.SecondsToClock(time) +if self.verbose>=1 then +self:I(self.lid..string.format("Missile trainer status %s: %s",clock,fsmstate)) +end +self:_CheckMissileStatus() +self:_CheckPlayers() +if fsmstate=="Running"then +self:__Status(-10) +end +end +function FOX:_CheckPlayers() +for playername,_playersettings in pairs(self.players)do +local playersettings=_playersettings +local unitname=playersettings.unitname +local unit=UNIT:FindByName(unitname) +if unit and unit:IsAlive()then +local coord=unit:GetCoordinate() +local issafe=self:_CheckCoordSafe(coord) +if issafe then +if not playersettings.inzone then +self:EnterSafeZone(playersettings) +playersettings.inzone=true +end +else +if playersettings.inzone==true then +self:ExitSafeZone(playersettings) +playersettings.inzone=false +end +end +end +end +end +function FOX:_RemoveMissile(missile) +if missile then +for i,_missile in pairs(self.missiles)do +local m=_missile +if missile.missileName==m.missileName then +table.remove(self.missiles,i) +return +end +end +end +end +function FOX:_CheckMissileStatus() +local text="Missiles:" +local inactive={} +for i,_missile in pairs(self.missiles)do +local missile=_missile +local targetname="unkown" +if missile.targetUnit then +targetname=missile.targetUnit:GetName() +end +local playername="none" +if missile.targetPlayer then +playername=missile.targetPlayer.name +end +local active=tostring(missile.active) +local mtype=missile.missileType +local dtype=missile.missileType +local range=UTILS.MetersToNM(missile.missileRange) +if not active then +table.insert(inactive,i) +end +local heading=self:_GetWeapongHeading(missile.weapon) +text=text..string.format("\n[%d] %s: active=%s, range=%.1f NM, heading=%03d, target=%s, player=%s, missilename=%s",i,mtype,active,range,heading,targetname,playername,missile.missileName) +end +if#self.missiles==0 then +text=text.." none" +end +if self.verbose>=2 then +self:I(self.lid..text) +end +for i=#self.missiles,1,-1 do +local missile=self.missiles[i] +if missile and not missile.active then +table.remove(self.missiles,i) +end +end +end +function FOX:_IsProtected(targetunit) +if not self.protectedset then +return false +end +if targetunit and targetunit:IsAlive()then +local targetgroup=targetunit:GetGroup() +if targetgroup then +local targetname=targetgroup:GetName() +for _,_group in pairs(self.protectedset:GetSet())do +local group=_group +if group then +local groupname=group:GetName() +if targetname==groupname then +return true +end +end +end +end +end +return false +end +function FOX._FuncTrack(weapon,self,missile) +local missileCoord=missile.missileCoord:UpdateFromVec3(weapon.vec3) +local missileVelocity=weapon:GetSpeed() +self:GetMissileTarget(missile) +local target=nil +if missile.targetUnit then +if missile.targetPlayer then +if missile.targetPlayer.destroy==true then +target=missile.targetUnit +end +else +if self:_IsProtected(missile.targetUnit)then +target=missile.targetUnit +end +end +else +local function _GetTarget(_unit) +local unit=_unit +local playerCoord=unit:GetCoordinate() +local dist=missileCoord:Get3DDistance(playerCoord) +if dist<=self.explosiondist then +return unit +end +end +local mindist=nil +for _,_player in pairs(self.players)do +local player=_player +if player.unitname~=missile.shooterName then +local playerCoord=player.unit:GetCoordinate() +local dist=missileCoord:Get3DDistance(playerCoord) +local Dshooter2player=playerCoord:Get3DDistance(missile.shotCoord) +if(mindist==nil or dist<mindist)and(Dshooter2player<=missile.missileRange*1.5 or dist<=self.explosiondist)then +mindist=dist +target=player.unit +end +end +end +if self.protectedset then +mindist=nil +for _,_group in pairs(self.protectedset:GetSet())do +local group=_group +for _,_unit in pairs(group:GetUnits())do +local unit=_unit +if unit and unit:IsAlive()then +if unit:GetName()~=missile.shooterName then +local playerVec3=unit:GetVec3() +local dist=missileCoord:Get3DDistance(playerVec3) +local Dshooter2player=missile.shotCoord:Get3DDistance(playerVec3) +if(mindist==nil or dist<mindist)and(Dshooter2player<=missile.missileRange*1.5 or dist<=self.explosiondist)then +mindist=dist +target=unit +end +end +end +end +end +end +if target then +self:T(self.lid..string.format("Missile %s with NO explicit target got closest unit to missile as target %s. Dist=%s m",missile.missileType,target:GetName(),tostring(mindist))) +end +end +if target then +local targetVec3=target:GetVec3() +local distance=missileCoord:Get3DDistance(targetVec3) +local distShooter=nil +if missile.shooterUnit and missile.shooterUnit:IsAlive()then +distShooter=missileCoord:Get3DDistance(missile.shooterUnit:GetVec3()) +end +if self.Debug then +local bearing=missileCoord:HeadingTo(targetVec3) +local eta=distance/missileVelocity +self:I(self.lid..string.format("Missile %s Target %s: Distance = %.1f m, v=%.1f m/s, bearing=%03d°, ETA=%.1f sec",missile.missileType,target:GetName(),distance,missileVelocity,bearing,eta)) +end +local destroymissile=distance<=self.explosiondist +if self.explosiondist2 and distance<=self.explosiondist2 and not destroymissile then +destroymissile=missile.explosive>=self.bigmissilemass +end +if destroymissile and self:_CheckCoordSafe(targetVec3)then +self:I(self.lid..string.format("Destroying missile %s(%s) fired by %s aimed at %s [player=%s] at distance %.1f m", +missile.missileType,missile.missileName,missile.shooterName,target:GetName(),tostring(missile.targetPlayer~=nil),distance)) +weapon:Destroy() +missile.active=false +if self.Debug then +missileCoord:SmokeRed() +end +self:MissileDestroyed(missile) +if self.explosionpower>0 and distance>50 and(distShooter==nil or(distShooter and distShooter>50))then +missileCoord:Explosion(self.explosionpower) +end +if missile.targetPlayer then +local text=string.format("Destroying missile. %s",self:_DeadText()) +MESSAGE:New(text,10):ToGroup(target:GetGroup()) +missile.targetPlayer.dead=missile.targetPlayer.dead+1 +end +else +local dt=1.0 +if distance>50000 then +dt=self.dt50 +elseif distance>10000 then +dt=self.dt10 +elseif distance>5000 then +dt=self.dt05 +elseif distance>1000 then +dt=self.dt01 +else +dt=self.dt00 +end +weapon:SetTimeStepTrack(dt) +end +else +self:T(self.lid..string.format("Missile %s(%s) fired by %s has no current target. Checking back in 0.1 sec.",missile.missileType,missile.missileName,missile.shooterName)) +weapon:SetTimeStepTrack(0.1) +end +end +function FOX._FuncImpact(weapon,self,missile) +if missile.targetPlayer then +local player=missile.targetPlayer +if player and player.unit:IsAlive()then +local text=string.format("Missile defeated. Well done, %s!",player.name) +MESSAGE:New(text,10):ToClient(player.client) +player.defeated=player.defeated+1 +end +end +missile.active=false +self:T(FOX.lid..string.format("Terminating missile track timer.")) +weapon.tracking=false +end +function FOX:onafterMissileLaunch(From,Event,To,missile) +local text=string.format("FOX: Tracking missile %s(%s) - target %s - shooter %s",missile.missileType,missile.missileName,tostring(missile.targetName),missile.shooterName) +self:T(FOX.lid..text) +MESSAGE:New(text,10):ToAllIf(self.Debug) +for _,_player in pairs(self.players)do +local player=_player +local playerUnit=player.unit +if playerUnit and playerUnit:IsAlive()and player.coalition~=missile.shooterCoalition then +local distance=playerUnit:GetCoordinate():Get3DDistance(missile.shotCoord) +local bearing=playerUnit:GetCoordinate():HeadingTo(missile.shotCoord) +if player.launchalert then +if(missile.targetPlayer and player.unitname==missile.targetPlayer.unitname)or(distance<missile.missileRange)then +local text=string.format("Missile launch detected! Distance %.1f NM, bearing %03d°.",UTILS.MetersToNM(distance),bearing) +self:ScheduleOnce(5,FOX._SayNotchingHeadings,self,player,missile.weapon) +MESSAGE:New(text,5,"ALERT"):ToClient(player.client) +end +end +if player.marklaunch then +local text=string.format("Missile launch coordinates:\n%s\n%s",missile.shotCoord:ToStringLLDMS(),missile.shotCoord:ToStringBULLS(player.coalition)) +missile.shotCoord:MarkToGroup(text,player.group) +end +end +end +missile.Weapon:SetFuncTrack(FOX._FuncTrack,self,missile) +missile.Weapon:SetFuncImpact(FOX._FuncImpact,self,missile) +self:T(FOX.lid..string.format("Tracking of missile starts in 0.0001 seconds.")) +missile.Weapon:StartTrack(0.0001) +end +function FOX:OnEventPlayerEnterAircraft(EventData) +end +function FOX:OnEventBirth(EventData) +self:F3({eventbirth=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event BIRTH!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event BIRTH!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local playerunit,playername=self:_GetPlayerUnitAndName(_unitName) +self:T(self.lid.."BIRTH: unit = "..tostring(EventData.IniUnitName)) +self:T(self.lid.."BIRTH: group = "..tostring(EventData.IniGroupName)) +self:T(self.lid.."BIRTH: player = "..tostring(playername)) +if playerunit and playername then +local _uid=playerunit:GetID() +local _group=playerunit:GetGroup() +local _callsign=playerunit:GetCallsign() +local text=string.format("Pilot %s, callsign %s entered unit %s of group %s.",playername,_callsign,_unitName,_group:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,5):ToAllIf(self.Debug) +if not self.menudisabled then +self:ScheduleOnce(0.1,self._AddF10Commands,self,_unitName) +end +local playerData={} +playerData.unit=playerunit +playerData.unitname=_unitName +playerData.group=_group +playerData.groupname=_group:GetName() +playerData.name=playername +playerData.callsign=playerData.unit:GetCallsign() +playerData.client=CLIENT:FindByName(_unitName,nil,true) +playerData.coalition=_group:GetCoalition() +playerData.destroy=playerData.destroy or self.destroy +playerData.launchalert=playerData.launchalert or self.launchalert +playerData.marklaunch=playerData.marklaunch or self.marklaunch +playerData.defeated=playerData.defeated or 0 +playerData.dead=playerData.dead or 0 +self.players[playername]=playerData +end +end +function FOX:GetMissileTarget(missile) +local target=nil +local targetName="unknown" +local targetUnit=nil +if missile.weapon and missile.weapon:isExist()then +target=missile.weapon:getTarget() +if target then +self:T2({missiletarget=target}) +targetUnit=UNIT:Find(target) +if targetUnit then +targetName=targetUnit:GetName() +missile.targetUnit=targetUnit +missile.targetPlayer=self:_GetPlayerFromUnit(missile.targetUnit) +end +end +end +if missile.targetName and missile.targetName~=targetName then +self:I(self.lid..string.format("Missile %s(%s) changed target to %s. Previous target was %s.",missile.missileType,missile.missileName,targetName,missile.targetName)) +end +missile.targetName=targetName +end +function FOX:OnEventShot(EventData) +self:T2({eventshot=EventData}) +if EventData.Weapon==nil or EventData.IniDCSUnit==nil or EventData.weapon==nil then +return +end +local weapon=WEAPON:New(EventData.weapon) +local _weapon=weapon:GetTypeName() +local _target=EventData.Weapon:getTarget() +local _targetName="unknown" +local _targetUnit=nil +local desc=weapon.desc +self:T2({desc=desc}) +local missilecategory=desc.missileCategory +local missilerange=nil +if missilecategory then +missilerange=desc.rangeMaxAltMax +end +self:T2(FOX.lid.."EVENT SHOT: FOX") +self:T2(FOX.lid..string.format("EVENT SHOT: Ini unit = %s",tostring(EventData.IniUnitName))) +self:T2(FOX.lid..string.format("EVENT SHOT: Ini group = %s",tostring(EventData.IniGroupName))) +self:T2(FOX.lid..string.format("EVENT SHOT: Weapon type = %s",tostring(weapon:GetTypeName()))) +self:T2(FOX.lid..string.format("EVENT SHOT: Weapon categ = %s",tostring(weapon:GetCategory()))) +self:T2(FOX.lid..string.format("EVENT SHOT: Missil categ = %s",tostring(missilecategory))) +self:T2(FOX.lid..string.format("EVENT SHOT: Missil range = %s",tostring(missilerange))) +if not self:_CheckCoordLaunch(EventData.IniUnit:GetCoordinate())then +self:T(self.lid.."Missile was not fired in launch zone. No tracking!") +return +end +local _track=weapon:IsMissile()and missilecategory and(missilecategory==1 or missilecategory==2 or missilecategory==6) +if _track then +local missile={} +missile.active=true +missile.weapon=EventData.weapon +missile.Weapon=weapon +missile.missileType=_weapon +missile.missileRange=missilerange +missile.missileName=EventData.weapon:getName() +missile.shooterUnit=EventData.IniUnit +missile.shooterGroup=EventData.IniGroup +missile.shooterCoalition=EventData.IniUnit:GetCoalition() +missile.shooterName=EventData.IniUnitName +missile.shotTime=timer.getAbsTime() +missile.shotCoord=EventData.IniUnit:GetCoordinate() +missile.fuseDist=desc.fuseDist +missile.explosive=desc.warhead.explosiveMass or desc.warhead.shapedExplosiveMass +missile.targetOrig=missile.targetName +missile.missileCoord=COORDINATE:New(0,0,0) +self:GetMissileTarget(missile) +self:I(FOX.lid..string.format("EVENT SHOT: Shooter=%s %s(%s) ==> Target=%s, fuse dist=%s, explosive=%s", +tostring(missile.shooterName),tostring(missile.missileType),tostring(missile.missileName),tostring(missile.targetName),tostring(missile.fuseDist),tostring(missile.explosive))) +if missile.targetPlayer or self:_IsProtected(missile.targetUnit)or missile.targetName=="unknown"then +table.insert(self.missiles,missile) +self:__MissileLaunch(0.1,missile) +end +end +end +function FOX:OnEventHit(EventData) +self:T({eventhit=EventData}) +if EventData.Weapon==nil then +return +end +if EventData.IniUnit==nil then +return +end +if EventData.TgtUnit==nil then +return +end +local weapon=EventData.Weapon +local weaponname=weapon:getName() +for i,_missile in pairs(self.missiles)do +local missile=_missile +if missile.missileName==weaponname then +self:I(self.lid..string.format("WARNING: Missile %s (%s) hit target %s. Missile trainer target was %s.",missile.missileType,missile.missileName,EventData.TgtUnitName,missile.targetName)) +self:I({missile=missile}) +return +end +end +end +function FOX:_AddF10Commands(_unitName) +self:F(_unitName) +local _unit,playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and playername then +local group=_unit:GetGroup() +local gid=group:GetID() +if group and gid then +if not self.menuadded[gid]then +self.menuadded[gid]=true +local _rootPath=nil +if FOX.MenuF10Root then +_rootPath=FOX.MenuF10Root +else +if FOX.MenuF10[gid]==nil then +FOX.MenuF10[gid]=missionCommands.addSubMenuForGroup(gid,"FOX") +end +_rootPath=FOX.MenuF10[gid] +end +missionCommands.addCommandForGroup(gid,"Destroy Missiles On/Off",_rootPath,self._ToggleDestroyMissiles,self,_unitName) +missionCommands.addCommandForGroup(gid,"Launch Alerts On/Off",_rootPath,self._ToggleLaunchAlert,self,_unitName) +missionCommands.addCommandForGroup(gid,"Mark Launch On/Off",_rootPath,self._ToggleLaunchMark,self,_unitName) +missionCommands.addCommandForGroup(gid,"My Status",_rootPath,self._MyStatus,self,_unitName) +end +else +self:E(self.lid..string.format("ERROR: Could not find group or group ID in AddF10Menu() function. Unit name: %s.",_unitName or"unknown")) +end +else +self:E(self.lid..string.format("ERROR: Player unit does not exist in AddF10Menu() function. Unit name: %s.",_unitName or"unknown")) +end +end +function FOX:_MyStatus(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +local m,mtext=self:_GetTargetMissiles(playerData.name) +local text=string.format("Status of player %s:\n",playerData.name) +local safe=self:_CheckCoordSafe(playerData.unit:GetCoordinate()) +text=text..string.format("Destroy missiles? %s\n",tostring(playerData.destroy)) +text=text..string.format("Launch alert? %s\n",tostring(playerData.launchalert)) +text=text..string.format("Launch marks? %s\n",tostring(playerData.marklaunch)) +text=text..string.format("Am I safe? %s\n",tostring(safe)) +text=text..string.format("Missiles defeated: %d\n",playerData.defeated) +text=text..string.format("Missiles destroyed: %d\n",playerData.dead) +text=text..string.format("Me target: %d\n%s",m,mtext) +MESSAGE:New(text,10,nil,true):ToClient(playerData.client) +end +end +end +function FOX:_GetTargetMissiles(playername) +local text="" +local n=0 +for _,_missile in pairs(self.missiles)do +local missile=_missile +if missile.targetPlayer and missile.targetPlayer.name==playername then +n=n+1 +text=text..string.format("Type %s: active %s\n",missile.missileType,tostring(missile.active)) +end +end +return n,text +end +function FOX:_ToggleLaunchAlert(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.launchalert=not playerData.launchalert +local text="" +if playerData.launchalert==true then +text=string.format("%s, missile launch alerts are now ENABLED.",playerData.name) +else +text=string.format("%s, missile launch alerts are now DISABLED.",playerData.name) +end +MESSAGE:New(text,5):ToClient(playerData.client) +end +end +end +function FOX:_ToggleLaunchMark(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.marklaunch=not playerData.marklaunch +local text="" +if playerData.marklaunch==true then +text=string.format("%s, missile launch marks are now ENABLED.",playerData.name) +else +text=string.format("%s, missile launch marks are now DISABLED.",playerData.name) +end +MESSAGE:New(text,5):ToClient(playerData.client) +end +end +end +function FOX:_ToggleDestroyMissiles(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.destroy=not playerData.destroy +local text="" +if playerData.destroy==true then +text=string.format("%s, incoming missiles will be DESTROYED.",playerData.name) +else +text=string.format("%s, incoming missiles will NOT be DESTROYED.",playerData.name) +end +MESSAGE:New(text,5):ToClient(playerData.client) +end +end +end +function FOX:_DeadText() +local texts={} +texts[1]="You're dead!" +texts[2]="Meet your maker!" +texts[3]="Time to meet your maker!" +texts[4]="Well, I guess that was it!" +texts[5]="Bye, bye!" +texts[6]="Cheers buddy, was nice knowing you!" +local r=math.random(#texts) +return texts[r] +end +function FOX:_CheckCoordSafe(coord) +if#self.safezones==0 then +return true +end +for _,_zone in pairs(self.safezones)do +local zone=_zone +local Vec2={x=coord.x,y=coord.z} +local inzone=zone:IsVec2InZone(Vec2) +if inzone then +return true +end +end +return false +end +function FOX:_CheckCoordLaunch(coord) +if#self.launchzones==0 then +return true +end +for _,_zone in pairs(self.launchzones)do +local zone=_zone +local Vec2={x=coord.x,y=coord.z} +local inzone=zone:IsVec2InZone(Vec2) +if inzone then +return true +end +end +return false +end +function FOX:_GetWeapongHeading(weapon) +if weapon and weapon:isExist()then +local wp=weapon:getPosition() +local wph=math.atan2(wp.x.z,wp.x.x) +if wph<0 then +wph=wph+2*math.pi +end +wph=math.deg(wph) +return wph +end +return-1 +end +function FOX:_SayNotchingHeadings(playerData,weapon) +if playerData and playerData.unit and playerData.unit:IsAlive()then +local nr,nl=self:_GetNotchingHeadings(weapon) +if nr and nl then +local text=string.format("Notching heading %03d° or %03d°",nr,nl) +MESSAGE:New(text,5,"FOX"):ToClient(playerData.client) +end +end +end +function FOX:_GetNotchingHeadings(weapon) +if weapon then +local hdg=self:_GetWeapongHeading(weapon) +local hdg1=hdg+90 +if hdg1>360 then +hdg1=hdg1-360 +end +local hdg2=hdg-90 +if hdg2<0 then +hdg2=hdg2+360 +end +return hdg1,hdg2 +end +return nil,nil +end +function FOX:_GetPlayerFromUnitname(unitName) +for _,_player in pairs(self.players)do +local player=_player +if player.unitname==unitName then +return player +end +end +return nil +end +function FOX:_GetPlayerFromUnit(unit) +if unit and unit:IsAlive()then +local unitname=unit:GetName() +for _,_player in pairs(self.players)do +local player=_player +if player.unitname==unitname then +return player +end +end +end +return nil +end +function FOX:_GetPlayerUnitAndName(_unitName) +self:F2(_unitName) +if _unitName~=nil then +local DCSunit=Unit.getByName(_unitName) +if DCSunit then +local playername=DCSunit:getPlayerName() +local unit=UNIT:Find(DCSunit) +self:T2({DCSunit=DCSunit,unit=unit,playername=playername}) +if DCSunit and unit and playername then +self:T(self.lid..string.format("Found DCS unit %s with player %s.",tostring(_unitName),tostring(playername))) +return unit,playername +end +end +end +return nil,nil +end +MANTIS={ +ClassName="MANTIS", +name="mymantis", +version="0.9.34", +SAM_Templates_Prefix="", +SAM_Group=nil, +EWR_Templates_Prefix="", +EWR_Group=nil, +Adv_EWR_Group=nil, +HQ_Template_CC="", +HQ_CC=nil, +SAM_Table={}, +SAM_Table_Long={}, +SAM_Table_Medium={}, +SAM_Table_Short={}, +SAM_Table_PointDef={}, +lid="", +Detection=nil, +AWACS_Detection=nil, +debug=false, +checkradius=25000, +grouping=5000, +acceptrange=80000, +detectinterval=30, +engagerange=95, +autorelocate=false, +advanced=false, +adv_ratio=100, +adv_state=0, +AWACS_Prefix="", +advAwacs=false, +verbose=false, +awacsrange=250000, +Shorad=nil, +ShoradLink=false, +ShoradTime=600, +ShoradActDistance=25000, +UseEmOnOff=false, +TimeStamp=0, +state2flag=false, +SamStateTracker={}, +DLink=false, +DLTimeStamp=0, +Padding=10, +SuppressedGroups={}, +automode=true, +autoshorad=true, +ShoradGroupSet=nil, +checkforfriendlies=false, +SmokeDecoy=false, +SmokeDecoyColor=SMOKECOLOR.White, +checkcounter=1, +DLinkCacheTime=120, +logsamstatus=false, +} +MANTIS.AdvancedState={ +GREEN=0, +AMBER=1, +RED=2, +} +MANTIS.SamType={ +SHORT="Short", +MEDIUM="Medium", +LONG="Long", +POINT="Point", +} +MANTIS.radiusscale={} +MANTIS.radiusscale[MANTIS.SamType.LONG]=1.1 +MANTIS.radiusscale[MANTIS.SamType.MEDIUM]=1.2 +MANTIS.radiusscale[MANTIS.SamType.SHORT]=1.75 +MANTIS.radiusscale[MANTIS.SamType.POINT]=3 +MANTIS.SamData={ +["Hawk"]={Range=35,Blindspot=0,Height=12,Type="Medium",Radar="Hawk"}, +["NASAMS"]={Range=14,Blindspot=0,Height=7,Type="Short",Radar="NSAMS"}, +["Patriot"]={Range=99,Blindspot=0,Height=25,Type="Long",Radar="Patriot str"}, +["Rapier"]={Range=10,Blindspot=0,Height=3,Type="Short",Radar="rapier"}, +["SA-2"]={Range=40,Blindspot=7,Height=25,Type="Medium",Radar="S_75M_Volhov"}, +["SA-3"]={Range=18,Blindspot=6,Height=18,Type="Short",Radar="5p73 s-125 ln"}, +["SA-5"]={Range=250,Blindspot=7,Height=40,Type="Long",Radar="5N62V"}, +["SA-6"]={Range=25,Blindspot=0,Height=8,Type="Medium",Radar="1S91"}, +["SA-10"]={Range=119,Blindspot=0,Height=18,Type="Long",Radar="S-300PS 4"}, +["SA-11"]={Range=35,Blindspot=0,Height=20,Type="Medium",Radar="SA-11"}, +["Roland"]={Range=6,Blindspot=0,Height=5,Type="Short",Radar="Roland"}, +["Gepard"]={Range=5,Blindspot=0,Height=4,Type="Point",Radar="Gepard"}, +["HQ-7"]={Range=12,Blindspot=0,Height=3,Type="Short",Radar="HQ-7"}, +["SA-9"]={Range=4,Blindspot=0,Height=3,Type="Point",Radar="Strela",Point="true"}, +["SA-8"]={Range=10,Blindspot=0,Height=5,Type="Short",Radar="Osa 9A33"}, +["SA-19"]={Range=8,Blindspot=0,Height=3,Type="Short",Radar="Tunguska"}, +["SA-15"]={Range=11,Blindspot=0,Height=6,Type="Point",Radar="Tor 9A331",Point="true"}, +["SA-13"]={Range=5,Blindspot=0,Height=3,Type="Point",Radar="Strela",Point="true"}, +["Avenger"]={Range=4,Blindspot=0,Height=3,Type="Short",Radar="Avenger"}, +["Chaparral"]={Range=8,Blindspot=0,Height=3,Type="Short",Radar="Chaparral"}, +["Linebacker"]={Range=4,Blindspot=0,Height=3,Type="Point",Radar="Linebacker",Point="true"}, +["Silkworm"]={Range=90,Blindspot=1,Height=0.2,Type="Long",Radar="Silkworm"}, +["C-RAM"]={Range=2,Blindspot=0,Height=2,Type="Point",Radar="HEMTT_C-RAM_Phalanx",Point="true"}, +["SA-10B"]={Range=75,Blindspot=0,Height=18,Type="Medium",Radar="SA-10B"}, +["SA-17"]={Range=50,Blindspot=3,Height=50,Type="Medium",Radar="SA-17"}, +["SA-20A"]={Range=150,Blindspot=5,Height=27,Type="Long",Radar="S-300PMU1"}, +["SA-20B"]={Range=200,Blindspot=4,Height=27,Type="Long",Radar="S-300PMU2"}, +["HQ-2"]={Range=50,Blindspot=6,Height=35,Type="Medium",Radar="HQ_2_Guideline_LN"}, +["TAMIR IDFA"]={Range=20,Blindspot=0.6,Height=12.3,Type="Short",Radar="IRON_DOME_LN"}, +["STUNNER IDFA"]={Range=250,Blindspot=1,Height=45,Type="Long",Radar="DAVID_SLING_LN"}, +["NIKE"]={Range=155,Blindspot=6,Height=30,Type="Long",Radar="HIPAR"}, +["Dog Ear"]={Range=11,Blindspot=0,Height=9,Type="Point",Radar="Dog Ear",Point="true"}, +["Pantsir S1"]={Range=20,Blindspot=1.2,Height=15,Type="Point",Radar="PantsirS1",Point="true"}, +["Tor M2"]={Range=12,Blindspot=1,Height=10,Type="Point",Radar="TorM2",Point="true"}, +["IRIS-T SLM"]={Range=40,Blindspot=0.5,Height=20,Type="Medium",Radar="CH_IRIST_SLM"}, +} +MANTIS.SamDataHDS={ +["SA-2 HDS"]={Range=56,Blindspot=7,Height=30,Type="Medium",Radar="V759"}, +["SA-3 HDS"]={Range=20,Blindspot=6,Height=30,Type="Short",Radar="V-601P"}, +["SA-10B HDS"]={Range=90,Blindspot=5,Height=25,Type="Long",Radar="5P85CE ln"}, +["SA-10C HDS"]={Range=75,Blindspot=5,Height=25,Type="Long",Radar="5P85SE ln"}, +["SA-17 HDS"]={Range=50,Blindspot=3,Height=50,Type="Medium",Radar="SA-17 "}, +["SA-12 HDS 2"]={Range=100,Blindspot=13,Height=30,Type="Long",Radar="S-300V 9A82 l"}, +["SA-12 HDS 1"]={Range=75,Blindspot=6,Height=25,Type="Long",Radar="S-300V 9A83 l"}, +["SA-23 HDS 2"]={Range=200,Blindspot=5,Height=37,Type="Long",Radar="S-300VM 9A82ME"}, +["SA-23 HDS 1"]={Range=100,Blindspot=1,Height=50,Type="Long",Radar="S-300VM 9A83ME"}, +["HQ-2 HDS"]={Range=50,Blindspot=6,Height=35,Type="Medium",Radar="HQ_2_Guideline_LN"}, +["SAMPT Block 1 HDS"]={Range=120,Blindspot=1,Height=20,Type="long",Radar="SAMPT_MLT_Blk1"}, +["SAMPT Block 1INT HDS"]={Range=150,Blindspot=1,Height=25,Type="long",Radar="SAMPT_MLT_Blk1NT"}, +["SAMPT Block 2 HDS"]={Range=200,Blindspot=10,Height=70,Type="long",Radar="SAMPT_MLT_Blk2"}, +} +MANTIS.SamDataSMA={ +["RBS98M SMA"]={Range=20,Blindspot=0.2,Height=8,Type="Short",Radar="RBS-98"}, +["RBS70 SMA"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="RBS-70"}, +["RBS70M SMA"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="BV410_RBS70"}, +["RBS90 SMA"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="RBS-90"}, +["RBS90M SMA"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="BV410_RBS90"}, +["RBS103A SMA"]={Range=160,Blindspot=1,Height=36,Type="Long",Radar="LvS-103_Lavett103_Rb103A"}, +["RBS103B SMA"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="LvS-103_Lavett103_Rb103B"}, +["RBS103AM SMA"]={Range=160,Blindspot=1,Height=36,Type="Long",Radar="LvS-103_Lavett103_HX_Rb103A"}, +["RBS103BM SMA"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="LvS-103_Lavett103_HX_Rb103B"}, +["Lvkv9040M SMA"]={Range=2,Blindspot=0.1,Height=1.2,Type="Point",Radar="LvKv9040",Point="true"}, +} +MANTIS.SamDataCH={ +["2S38 CHM"]={Range=6,Blindspot=0.1,Height=4.5,Type="Short",Radar="2S38"}, +["PantsirS1 CHM"]={Range=20,Blindspot=1.2,Height=15,Type="Point",Radar="PantsirS1",Point="true"}, +["PantsirS2 CHM"]={Range=30,Blindspot=1.2,Height=18,Type="Medium",Radar="PantsirS2"}, +["PGL-625 CHM"]={Range=10,Blindspot=1,Height=5,Type="Short",Radar="PGL_625"}, +["HQ-17A CHM"]={Range=15,Blindspot=1.5,Height=10,Type="Short",Radar="HQ17A"}, +["M903PAC2 CHM"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="MIM104_M903_PAC2"}, +["M903PAC3 CHM"]={Range=160,Blindspot=1,Height=40,Type="Long",Radar="MIM104_M903_PAC3"}, +["TorM2 CHM"]={Range=12,Blindspot=1,Height=10,Type="Point",Radar="TorM2",Point="true"}, +["TorM2K CHM"]={Range=12,Blindspot=1,Height=10,Type="Point",Radar="TorM2K",Point="true"}, +["TorM2M CHM"]={Range=16,Blindspot=1,Height=10,Type="Point",Radar="TorM2M",Point="true"}, +["NASAMS3-AMRAAMER CHM"]={Range=50,Blindspot=2,Height=35.7,Type="Medium",Radar="CH_NASAMS3_LN_AMRAAM_ER"}, +["NASAMS3-AIM9X2 CHM"]={Range=20,Blindspot=0.2,Height=18,Type="Short",Radar="CH_NASAMS3_LN_AIM9X2"}, +["C-RAM CHM"]={Range=2,Blindspot=0,Height=2,Type="Point",Radar="CH_Centurion_C_RAM",Point="true"}, +["PGZ-09 CHM"]={Range=4,Blindspot=0.5,Height=3,Type="Point",Radar="CH_PGZ09",Point="true"}, +["S350-9M100 CHM"]={Range=15,Blindspot=1,Height=8,Type="Short",Radar="CH_S350_50P6_9M100"}, +["S350-9M96D CHM"]={Range=150,Blindspot=2.5,Height=30,Type="Long",Radar="CH_S350_50P6_9M96D"}, +["LAV-AD CHM"]={Range=8,Blindspot=0.16,Height=4.8,Type="Short",Radar="CH_LAVAD"}, +["HQ-22 CHM"]={Range=170,Blindspot=5,Height=27,Type="Long",Radar="CH_HQ22_LN"}, +["PGZ-95 CHM"]={Range=2.5,Blindspot=0.5,Height=2,Type="Point",Radar="CH_PGZ95",Point="true"}, +["LD-3000 CHM"]={Range=2.5,Blindspot=0.1,Height=3,Type="Point",Radar="CH_LD3000_stationary",Point="true"}, +["LD-3000M CHM"]={Range=2.5,Blindspot=0.1,Height=3,Type="Point",Radar="CH_LD3000",Point="true"}, +["FlaRakRad CHM"]={Range=8,Blindspot=1.5,Height=6,Type="Short",Radar="CH_FlaRakRad"}, +["IRIS-T SLM CHM"]={Range=40,Blindspot=0.5,Height=20,Type="Medium",Radar="CH_IRIST_SLM"}, +["M903PAC2KAT1 CHM"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="CH_MIM104_M903_PAC2_KAT1"}, +["Skynex CHM"]={Range=3.5,Blindspot=0.1,Height=3.5,Type="Point",Radar="CH_SkynexHX",Point="true"}, +["Skyshield CHM"]={Range=3.5,Blindspot=0.1,Height=3.5,Type="Point",Radar="CH_Skyshield_Gun",Point="true"}, +["WieselOzelot CHM"]={Range=8,Blindspot=0.16,Height=4.8,Type="Short",Radar="CH_Wiesel2Ozelot"}, +["BukM3-9M317M CHM"]={Range=70,Blindspot=0.25,Height=35,Type="Medium",Radar="CH_BukM3_9A317M"}, +["BukM3-9M317MA CHM"]={Range=70,Blindspot=0.25,Height=35,Type="Medium",Radar="CH_BukM3_9A317MA"}, +["SkySabre CHM"]={Range=30,Blindspot=0.5,Height=10,Type="Medium",Radar="CH_SkySabreLN"}, +["Stormer CHM"]={Range=7.5,Blindspot=0.3,Height=7,Type="Short",Radar="CH_StormerHVM"}, +["THAAD CHM"]={Range=200,Blindspot=40,Height=150,Type="Long",Radar="CH_THAAD_M1120"}, +["USInfantryFIM92K CHM"]={Range=8,Blindspot=0.16,Height=4.8,Type="Short",Radar="CH_USInfantry_FIM92"}, +["RBS98M CHM"]={Range=20,Blindspot=0.2,Height=8,Type="Short",Radar="RBS-98"}, +["RBS70 CHM"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="RBS-70"}, +["RBS70M CHM"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="BV410_RBS70"}, +["RBS90 CHM"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="RBS-90"}, +["RBS90M CHM"]={Range=8,Blindspot=0.25,Height=6,Type="Short",Radar="BV410_RBS90"}, +["RBS103A CHM"]={Range=160,Blindspot=1,Height=36,Type="Long",Radar="LvS-103_Lavett103_Rb103A"}, +["RBS103B CHM"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="LvS-103_Lavett103_Rb103B"}, +["RBS103AM CHM"]={Range=160,Blindspot=1,Height=36,Type="Long",Radar="LvS-103_Lavett103_HX_Rb103A"}, +["RBS103BM CHM"]={Range=120,Blindspot=3,Height=24.5,Type="Long",Radar="LvS-103_Lavett103_HX_Rb103B"}, +["Lvkv9040M CHM"]={Range=2,Blindspot=0.1,Height=1.2,Type="Point",Radar="LvKv9040",Point="true"}, +} +do +function MANTIS:New(name,samprefix,ewrprefix,hq,coalition,dynamic,awacs,EmOnOff,Padding,Zones) +local self=BASE:Inherit(self,FSM:New()) +self.name=name or"mymantis" +self.SAM_Templates_Prefix=samprefix or"Red SAM" +self.EWR_Templates_Prefix=ewrprefix or"Red EWR" +self.HQ_Template_CC=hq or nil +self.Coalition=coalition or"red" +self.SAM_Table={} +self.SAM_Table_Long={} +self.SAM_Table_Medium={} +self.SAM_Table_Short={} +self.SAM_Table_PointDef={} +self.dynamic=dynamic or false +self.checkradius=25000 +self.grouping=5000 +self.acceptrange=80000 +self.detectinterval=30 +self.engagerange=95 +self.autorelocate=false +self.autorelocateunits={HQ=false,EWR=false} +self.advanced=false +self.adv_ratio=100 +self.adv_state=0 +self.verbose=false +self.Adv_EWR_Group=nil +self.AWACS_Prefix=awacs or nil +self.awacsrange=250000 +self.Shorad=nil +self.ShoradLink=false +self.ShoradTime=600 +self.ShoradActDistance=25000 +self.TimeStamp=timer.getAbsTime() +self.relointerval=math.random(1800,3600) +self.state2flag=false +self.SamStateTracker={} +self.DLink=false +self.Padding=Padding or 10 +self.SuppressedGroups={} +self.automode=true +self.usezones=false +self.AcceptZones={} +self.RejectZones={} +self.ConflictZones={} +self.maxlongrange=1 +self.maxmidrange=2 +self.maxshortrange=2 +self.maxpointdefrange=6 +self.maxclassic=6 +self.autoshorad=true +self.ShoradGroupSet=SET_GROUP:New() +self.FilterZones=Zones +self.SkateZones=nil +self.SkateNumber=3 +self.shootandscoot=false +self.SmokeDecoy=false +self.SmokeDecoyColor=SMOKECOLOR.White +self.UseEmOnOff=true +if EmOnOff==false then +self.UseEmOnOff=false +end +if type(awacs)=="string"then +self.advAwacs=true +else +self.advAwacs=false +end +self:SetDLinkCacheTime() +self.lid=string.format("MANTIS %s | ",self.name) +if self.debug then +BASE:TraceOnOff(true) +BASE:TraceClass(self.ClassName) +BASE:TraceLevel(1) +end +self.ewr_templates={} +if type(samprefix)~="table"then +self.SAM_Templates_Prefix={samprefix} +end +if type(ewrprefix)~="table"then +self.EWR_Templates_Prefix={ewrprefix} +end +for _,_group in pairs(self.SAM_Templates_Prefix)do +table.insert(self.ewr_templates,_group) +end +for _,_group in pairs(self.EWR_Templates_Prefix)do +table.insert(self.ewr_templates,_group) +end +if self.advAwacs then +table.insert(self.ewr_templates,awacs) +end +self.logsamstatus=false +self:T({self.ewr_templates}) +self.SAM_Group=SET_GROUP:New():FilterPrefixes(self.SAM_Templates_Prefix):FilterCoalitions(self.Coalition) +self.EWR_Group=SET_GROUP:New():FilterPrefixes(self.ewr_templates):FilterCoalitions(self.Coalition) +if self.FilterZones then +self.SAM_Group:FilterZones(self.FilterZones) +end +if self.dynamic then +self.SAM_Group:FilterStart() +self.EWR_Group:FilterStart() +else +self.SAM_Group:FilterOnce() +self.EWR_Group:FilterOnce() +end +if self.HQ_Template_CC then +self.HQ_CC=GROUP:FindByName(self.HQ_Template_CC) +end +self.checkcounter=1 +self:I(string.format("***** Starting MANTIS Version %s *****",self.version)) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Relocating","*") +self:AddTransition("*","GreenState","*") +self:AddTransition("*","RedState","*") +self:AddTransition("*","AdvStateChange","*") +self:AddTransition("*","ShoradActivated","*") +self:AddTransition("*","SeadSuppressionStart","*") +self:AddTransition("*","SeadSuppressionEnd","*") +self:AddTransition("*","SeadSuppressionPlanned","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function MANTIS:_GetSAMTable() +self:T(self.lid.."GetSAMTable") +return self.SAM_Table +end +function MANTIS:_SetSAMTable(table) +self:T(self.lid.."SetSAMTable") +self.SAM_Table=table +return self +end +function MANTIS:SetEWRGrouping(radius) +self:T(self.lid.."SetEWRGrouping") +local radius=radius or 5000 +self.grouping=radius +return self +end +function MANTIS:AddScootZones(ZoneSet,Number,Random,Formation) +self:T(self.lid.." AddScootZones") +self.SkateZones=ZoneSet +self.SkateNumber=Number or 3 +self.shootandscoot=true +self.ScootRandom=Random +self.ScootFormation=Formation or"Cone" +return self +end +function MANTIS:AddZones(AcceptZones,RejectZones,ConflictZones) +self:T(self.lid.."AddZones") +self.AcceptZones=AcceptZones or{} +self.RejectZones=RejectZones or{} +self.ConflictZones=ConflictZones or{} +self.AcceptZonesNo=UTILS.TableLength(self.AcceptZones) +self.RejectZonesNo=UTILS.TableLength(self.RejectZones) +self.ConflictZonesNo=UTILS.TableLength(self.ConflictZones) +self:T(string.format("AcceptZonesNo = %d | RejectZonesNo = %d | ConflictZonesNo = %d",self.AcceptZonesNo,self.RejectZonesNo,self.ConflictZonesNo)) +if self.AcceptZonesNo>0 or self.RejectZonesNo>0 or self.ConflictZonesNo>0 then +self.usezones=true +end +return self +end +function MANTIS:SetEWRRange(radius) +self:T(self.lid.."SetEWRRange") +return self +end +function MANTIS:SetSAMRadius(radius) +self:T(self.lid.."SetSAMRadius") +local radius=radius or 25000 +self.checkradius=radius +return self +end +function MANTIS:SetSAMRange(range) +self:T(self.lid.."SetSAMRange") +local range=range or 95 +if range<0 or range>100 then +range=95 +end +self.engagerange=range +return self +end +function MANTIS:SetSmokeDecoy(Onoff,Color) +self.SmokeDecoy=Onoff +self.SmokeDecoyColor=Color or SMOKECOLOR.White +return self +end +function MANTIS:SetMaxActiveSAMs(Short,Mid,Long,Classic,Point) +self:T(self.lid.."SetMaxActiveSAMs") +self.maxclassic=Classic or 6 +self.maxlongrange=Long or 1 +self.maxmidrange=Mid or 2 +self.maxshortrange=Short or 2 +self.maxpointdefrange=Point or 6 +return self +end +function MANTIS:SetNewSAMRangeWhileRunning(range) +self:T(self.lid.."SetNewSAMRangeWhileRunning") +local range=range or 95 +if range<0 or range>100 then +range=95 +end +self.engagerange=range +self:_RefreshSAMTable() +self.mysead.EngagementRange=range +return self +end +function MANTIS:Debug(onoff) +self:T(self.lid.."SetDebug") +local onoff=onoff or false +self.debug=onoff +if onoff then +BASE:TraceOn() +BASE:TraceClass("MANTIS") +BASE:TraceLevel(1) +else +BASE:TraceOff() +end +return self +end +function MANTIS:GetCommandCenter() +self:T(self.lid.."GetCommandCenter") +if self.HQ_CC then +return self.HQ_CC +else +return nil +end +end +function MANTIS:SetAwacs(prefix) +self:T(self.lid.."SetAwacs") +if prefix~=nil then +if type(prefix)=="string"then +self.AWACS_Prefix=prefix +self.advAwacs=true +end +end +return self +end +function MANTIS:SetAwacsRange(range) +self:T(self.lid.."SetAwacsRange") +local range=range or 250000 +self.awacsrange=range +return self +end +function MANTIS:SetCommandCenter(group) +self:T(self.lid.."SetCommandCenter") +local group=group or nil +if group~=nil then +if type(group)=="string"then +self.HQ_CC=GROUP:FindByName(group) +self.HQ_Template_CC=group +else +self.HQ_CC=group +self.HQ_Template_CC=group:GetName() +end +end +return self +end +function MANTIS:SetDLinkCacheTime(seconds) +self.DLinkCacheTime=math.abs(seconds or 120) +if self.DLinkCacheTime<5 then self.DLinkCacheTime=5 end +return self +end +function MANTIS:SetDetectInterval(interval) +self:T(self.lid.."SetDetectInterval") +local interval=interval or 30 +self.detectinterval=interval +return self +end +function MANTIS:SetAdvancedMode(onoff,ratio) +self:T(self.lid.."SetAdvancedMode") +local onoff=onoff or false +local ratio=ratio or 100 +if(type(self.HQ_Template_CC)=="string")and onoff and self.dynamic then +self.adv_ratio=ratio +self.advanced=true +self.adv_state=0 +self.Adv_EWR_Group=SET_GROUP:New():FilterPrefixes(self.EWR_Templates_Prefix):FilterCoalitions(self.Coalition):FilterStart() +self:I(string.format("***** Starting Advanced Mode MANTIS Version %s *****",self.version)) +else +local text=self.lid.." Advanced Mode requires a HQ and dynamic to be set. Revisit your MANTIS:New() statement to add both." +local m=MESSAGE:New(text,10,"MANTIS",true):ToAll() +self:E(text) +end +return self +end +function MANTIS:SetUsingEmOnOff(switch) +self:T(self.lid.."SetUsingEmOnOff") +self.UseEmOnOff=switch or false +return self +end +function MANTIS:SetUsingDLink(DLink) +self:T(self.lid.."SetUsingDLink") +self.DLink=true +self.Detection=DLink +self.DLTimeStamp=timer.getAbsTime() +return self +end +function MANTIS:_CheckHQState() +self:T(self.lid.."CheckHQState") +local text=self.lid.." Checking HQ State" +local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug) +if self.verbose then self:I(text)end +if self.advanced then +local hq=self.HQ_Template_CC +local hqgrp=GROUP:FindByName(hq) +if hqgrp then +if hqgrp:IsAlive()then +return true +else +return false +end +end +end +return self +end +function MANTIS:_CheckEWRState() +self:T(self.lid.."CheckEWRState") +local text=self.lid.." Checking EWR State" +local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug) +if self.verbose then self:I(text)end +if self.advanced then +local EWR_Group=self.Adv_EWR_Group +local nalive=EWR_Group:CountAlive() +if self.advAwacs then +local awacs=GROUP:FindByName(self.AWACS_Prefix) +if awacs~=nil then +if awacs:IsAlive()then +nalive=nalive+1 +end +end +end +if nalive>0 then +return true +else +return false +end +end +return self +end +function MANTIS:_CheckAnyEWRAlive() +self:T(self.lid.."_CheckAnyEWRAlive") +local alive=false +if self.EWR_Group:CountAlive()>0 then +alive=true +end +if not alive and self.AWACS_Prefix then +local awacs=GROUP:FindByName(self.AWACS_Prefix) +if awacs and awacs:IsAlive()then +alive=true +end +end +return alive +end +function MANTIS:_CalcAdvState() +self:T(self.lid.."CalcAdvState") +local m=MESSAGE:New(self.lid.." Calculating Advanced State",10,"MANTIS"):ToAllIf(self.debug) +if self.verbose then self:I(self.lid.." Calculating Advanced State")end +local currstate=self.adv_state +local EWR_State=self:_CheckEWRState() +local HQ_State=self:_CheckHQState() +if EWR_State and HQ_State then +self.adv_state=0 +elseif EWR_State or HQ_State then +self.adv_state=1 +else +self.adv_state=2 +end +local interval=self.detectinterval +local ratio=self.adv_ratio/100 +ratio=ratio*self.adv_state +local newinterval=interval+(interval*ratio) +if self.debug or self.verbose then +local text=self.lid..string.format(" Calculated OldState/NewState/Interval: %d / %d / %d",currstate,self.adv_state,newinterval) +local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug) +if self.verbose then self:I(text)end +end +return newinterval,currstate +end +function MANTIS:SetAutoRelocate(hq,ewr) +self:T(self.lid.."SetAutoRelocate") +local hqrel=hq or false +local ewrel=ewr or false +if hqrel or ewrel then +self.autorelocate=true +self.autorelocateunits={HQ=hqrel,EWR=ewrel} +end +return self +end +function MANTIS:_RelocateGroups() +self:T(self.lid.."RelocateGroups") +local text=self.lid.." Relocating Groups" +local m=MESSAGE:New(text,10,"MANTIS",true):ToAllIf(self.debug) +if self.verbose then self:I(text)end +if self.autorelocate then +local HQGroup=self.HQ_CC +if self.autorelocateunits.HQ and self.HQ_CC and HQGroup:IsAlive()then +local _hqgrp=self.HQ_CC +local text=self.lid.." Relocating HQ" +_hqgrp:RelocateGroundRandomInRadius(20,500,true,true,nil,true) +end +if self.autorelocateunits.EWR then +local EWR_GRP=SET_GROUP:New():FilterPrefixes(self.EWR_Templates_Prefix):FilterCoalitions(self.Coalition):FilterOnce() +local EWR_Grps=EWR_GRP.Set +for _,_grp in pairs(EWR_Grps)do +if _grp:IsAlive()and _grp:IsGround()then +local text=self.lid.." Relocating EWR ".._grp:GetName() +local m=MESSAGE:New(text,10,"MANTIS"):ToAllIf(self.debug) +if self.verbose then self:I(text)end +_grp:RelocateGroundRandomInRadius(20,500,true,true,nil,true) +end +end +end +end +return self +end +function MANTIS:_CheckCoordinateInZones(coord) +self:T(self.lid.."_CheckCoordinateInZones") +local inzone=false +self:T(string.format("AcceptZonesNo = %d | RejectZonesNo = %d | ConflictZonesNo = %d",self.AcceptZonesNo,self.RejectZonesNo,self.ConflictZonesNo)) +if self.AcceptZonesNo>0 then +for _,_zone in pairs(self.AcceptZones)do +local zone=_zone +if zone:IsCoordinateInZone(coord)then +inzone=true +self:T(self.lid.."Target coord in Accept Zone!") +break +end +end +end +if self.RejectZonesNo>0 then +for _,_zone in pairs(self.RejectZones)do +local zone=_zone +if zone:IsCoordinateInZone(coord)then +inzone=false +self:T(self.lid.."Target coord in Reject Zone!") +break +end +end +end +if self.ConflictZonesNo>0 then +for _,_zone in pairs(self.ConflictZones)do +local zone=_zone +if zone:IsCoordinateInZone(coord)then +inzone=true +self:T(self.lid.."Target coord in Conflict Zone!") +break +end +end +end +return inzone +end +function MANTIS:_PreFilterHeight(height) +self:T(self.lid.."_PreFilterHeight") +local set={} +local dlink=self.Detection +local detectedgroups=dlink:GetContactTable() +for _,_contact in pairs(detectedgroups)do +local contact=_contact +local grp=contact.group +if grp:IsAlive()then +if grp:GetHeight(true)<height then +local coord=grp:GetCoordinate() +table.insert(set,coord) +end +end +end +return set +end +function MANTIS:_CheckObjectInZone(dectset,samcoordinate,radius,height,dlink) +self:T(self.lid.."_CheckObjectInZone") +local rad=radius or self.checkradius +local set=dectset +if dlink then +set=self:_PreFilterHeight(height) +end +if self.checkforfriendlies==true and self.friendlyset==nil then +self.friendlyset=SET_GROUP:New():FilterCoalitions(self.Coalition):FilterCategories({"plane","helicopter"}):FilterFunction(function(grp)if grp and grp:InAir()then return true else return false end end):FilterStart() +end +for _,_coord in pairs(set)do +local coord=_coord +local targetdistance=samcoordinate:DistanceFromPointVec2(coord) +if not targetdistance then +targetdistance=samcoordinate:Get2DDistance(coord) +end +local zonecheck=true +self:T("self.usezones = "..tostring(self.usezones)) +if self.usezones then +zonecheck=self:_CheckCoordinateInZones(coord) +end +if self.verbose and self.debug then +local samstring=samcoordinate:ToStringMGRS({MGRS_Accuracy=0}) +samstring=string.gsub(samstring,"%s","") +local inrange="false" +if targetdistance<=rad then +inrange="true" +end +local text=string.format("Checking SAM at %s | Tgtdist %.1fkm | Rad %.1fkm | Inrange %s",samstring,targetdistance/1000,rad/1000,inrange) +local m=MESSAGE:New(text,10,"Check"):ToAllIf(self.debug) +self:T(self.lid..text) +end +local nofriendlies=true +if self.checkforfriendlies==true then +local closestfriend,distance=self.friendlyset:GetClosestGroup(samcoordinate) +if closestfriend and distance and distance<rad then +nofriendlies=false +end +end +if targetdistance<=rad and zonecheck==true and nofriendlies==true then +return true,targetdistance +end +end +return false,0 +end +function MANTIS:StartDetection() +self:T(self.lid.."Starting Detection") +local groupset=self.EWR_Group +local grouping=self.grouping or 5000 +local interval=self.detectinterval or 20 +local MANTISdetection=DETECTION_AREAS:New(groupset,grouping) +MANTISdetection:FilterCategories({Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +MANTISdetection:SetRefreshTimeInterval(interval) +MANTISdetection:__Start(2) +return MANTISdetection +end +function MANTIS:StartIntelDetection() +self:T(self.lid.."Starting Intel Detection") +local groupset=self.EWR_Group +local samset=self.SAM_Group +self.intelset={} +local IntelOne=INTEL:New(groupset,self.Coalition,self.name.." IntelOne") +IntelOne:Start() +local IntelTwo=INTEL:New(samset,self.Coalition,self.name.." IntelTwo") +IntelTwo:Start() +local CacheTime=self.DLinkCacheTime or 120 +local IntelDlink=INTEL_DLINK:New({IntelOne,IntelTwo},self.name.." DLINK",22,CacheTime) +IntelDlink:__Start(1) +self:SetUsingDLink(IntelDlink) +table.insert(self.intelset,IntelOne) +table.insert(self.intelset,IntelTwo) +return IntelDlink +end +function MANTIS:StartAwacsDetection() +self:T(self.lid.."Starting Awacs Detection") +local group=self.AWACS_Prefix +local groupset=SET_GROUP:New():FilterPrefixes(group):FilterCoalitions(self.Coalition):FilterStart() +local grouping=self.grouping or 5000 +local interval=self.detectinterval or 60 +local MANTISAwacs=DETECTION_AREAS:New(groupset,grouping) +MANTISAwacs:FilterCategories({Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +MANTISAwacs:SetAcceptRange(self.awacsrange) +MANTISAwacs:SetRefreshTimeInterval(interval) +MANTISAwacs:Start() +return MANTISAwacs +end +function MANTIS:_GetSAMDataFromUnits(grpname,mod,sma,chm) +self:T(self.lid.."_GetSAMDataFromUnits") +local found=false +local range=self.checkradius +local height=3000 +local type=MANTIS.SamType.MEDIUM +local radiusscale=self.radiusscale[type] +local blind=0 +local group=GROUP:FindByName(grpname) +local units=group:GetUnits() +local SAMData=self.SamData +if mod then +SAMData=self.SamDataHDS +elseif sma then +SAMData=self.SamDataSMA +elseif chm then +SAMData=self.SamDataCH +end +for _,_unit in pairs(units)do +local unit=_unit +local type=string.lower(unit:GetTypeName()) +for idx,entry in pairs(SAMData)do +local _entry=entry +local _radar=string.lower(_entry.Radar) +if string.find(type,_radar,1,true)then +type=_entry.Type +radiusscale=self.radiusscale[type] +range=_entry.Range*1000*radiusscale +height=_entry.Height*1000 +blind=_entry.Blindspot*100 +found=true +break +end +end +if found then break end +end +if not found then +local grp=GROUP:FindByName(grpname) +if(grp and grp:IsAlive()and grp:IsAAA())or string.find(grpname,"AAA",1,true)then +range=2000 +height=2000 +blind=50 +type=MANTIS.SamType.POINT +found=true +end +end +if not found then +self:E(self.lid..string.format("*****Could not match radar data for %s! Will default to midrange values!",grpname)) +end +return range,height,type,blind +end +function MANTIS:_GetSAMRange(grpname) +self:T(self.lid.."_GetSAMRange for "..tostring(grpname)) +local range=self.checkradius +local height=3000 +local type=MANTIS.SamType.MEDIUM +local radiusscale=self.radiusscale[type] +local blind=0 +local found=false +local HDSmod=false +local SMAMod=false +local CHMod=false +if string.find(grpname,"HDS",1,true)then +HDSmod=true +elseif string.find(grpname,"SMA",1,true)then +SMAMod=true +elseif string.find(grpname,"CHM",1,true)then +CHMod=true +end +for idx,entry in pairs(self.SamData)do +self:T2("ID = "..idx) +if string.find(grpname,idx,1,true)then +local _entry=entry +type=_entry.Type +radiusscale=self.radiusscale[type] +range=_entry.Range*1000*radiusscale +height=_entry.Height*1000 +blind=_entry.Blindspot +self:T("Matching Groupname = "..grpname.." Range= "..range) +found=true +break +end +end +if not found then +local grp=GROUP:FindByName(grpname) +if(grp and grp:IsAlive()and grp:IsAAA())or string.find(grpname,"AAA",1,true)then +range=2000 +height=2000 +blind=50 +type=MANTIS.SamType.POINT +found=true +end +end +if(not found)or HDSmod or SMAMod or CHMod then +range,height,type=self:_GetSAMDataFromUnits(grpname,HDSmod,SMAMod,CHMod) +elseif not found then +self:E(self.lid..string.format("*****Could not match radar data for %s! Will default to midrange values!",grpname)) +end +if found and string.find(grpname,"SHORAD",1,true)then +type=MANTIS.SamType.POINT +end +return range,height,type,blind +end +function MANTIS:SetSAMStartState() +self:T(self.lid.."Setting SAM Start States") +local SAM_SET=self.SAM_Group +local SAM_Grps=SAM_SET.Set +local SAM_Tbl={} +local SAM_Tbl_lg={} +local SAM_Tbl_md={} +local SAM_Tbl_sh={} +local SAM_Tbl_pt={} +local SEAD_Grps={} +local engagerange=self.engagerange +for _i,_group in pairs(SAM_Grps)do +if _group:IsGround()and _group:IsAlive()then +local group=_group +if self.UseEmOnOff then +group:OptionAlarmStateRed() +group:EnableEmission(false) +else +group:OptionAlarmStateGreen() +end +group:OptionEngageRange(engagerange) +local grpname=group:GetName() +local grpcoord=group:GetCoordinate() +local grprange,grpheight,type,blind=self:_GetSAMRange(grpname) +table.insert(SAM_Tbl,{grpname,grpcoord,grprange,grpheight,blind,type}) +if type==MANTIS.SamType.LONG then +table.insert(SAM_Tbl_lg,{grpname,grpcoord,grprange,grpheight,blind,type}) +table.insert(SEAD_Grps,grpname) +self:T("SAM "..grpname.." is type LONG") +elseif type==MANTIS.SamType.MEDIUM then +table.insert(SAM_Tbl_md,{grpname,grpcoord,grprange,grpheight,blind,type}) +table.insert(SEAD_Grps,grpname) +self:T("SAM "..grpname.." is type MEDIUM") +elseif type==MANTIS.SamType.SHORT then +table.insert(SAM_Tbl_sh,{grpname,grpcoord,grprange,grpheight,blind,type}) +table.insert(SEAD_Grps,grpname) +self:T("SAM "..grpname.." is type SHORT") +elseif type==MANTIS.SamType.POINT then +table.insert(SAM_Tbl_pt,{grpname,grpcoord,grprange,grpheight,blind,type}) +self:T("SAM "..grpname.." is type POINT") +self.ShoradGroupSet:Add(grpname,group) +if not self.autoshorad then +table.insert(SEAD_Grps,grpname) +end +end +self.SamStateTracker[grpname]="GREEN" +end +end +self.SAM_Table=SAM_Tbl +self.SAM_Table_Long=SAM_Tbl_lg +self.SAM_Table_Medium=SAM_Tbl_md +self.SAM_Table_Short=SAM_Tbl_sh +self.SAM_Table_PointDef=SAM_Tbl_pt +local mysead=SEAD:New(SEAD_Grps,self.Padding) +mysead:SetEngagementRange(engagerange) +mysead:AddCallBack(self) +if self.UseEmOnOff then +mysead:SwitchEmissions(true) +end +self.mysead=mysead +return self +end +function MANTIS:_RefreshSAMTable() +self:T(self.lid.."RefreshSAMTable") +local SAM_SET=self.SAM_Group +local SAM_Grps=SAM_SET.Set +local SAM_Tbl={} +local SAM_Tbl_lg={} +local SAM_Tbl_md={} +local SAM_Tbl_sh={} +local SAM_Tbl_pt={} +local SEAD_Grps={} +local engagerange=self.engagerange +for _i,_group in pairs(SAM_Grps)do +local group=_group +group:OptionEngageRange(engagerange) +if group:IsGround()and group:IsAlive()then +local grpname=group:GetName() +local grpcoord=group:GetCoordinate() +local grprange,grpheight,type,blind=self:_GetSAMRange(grpname) +local radaralive=true +table.insert(SAM_Tbl,{grpname,grpcoord,grprange,grpheight,blind,type}) +table.insert(SEAD_Grps,grpname) +if type==MANTIS.SamType.LONG and radaralive then +table.insert(SAM_Tbl_lg,{grpname,grpcoord,grprange,grpheight,blind,type}) +self:T({grpname,grprange,grpheight}) +elseif type==MANTIS.SamType.MEDIUM and radaralive then +table.insert(SAM_Tbl_md,{grpname,grpcoord,grprange,grpheight,blind,type}) +self:T({grpname,grprange,grpheight}) +elseif type==MANTIS.SamType.SHORT and radaralive then +table.insert(SAM_Tbl_sh,{grpname,grpcoord,grprange,grpheight,blind,type}) +self:T({grpname,grprange,grpheight}) +elseif type==MANTIS.SamType.POINT or(not radaralive)then +table.insert(SAM_Tbl_pt,{grpname,grpcoord,grprange,grpheight,blind,type}) +self:T({grpname,grprange,grpheight}) +self.ShoradGroupSet:Add(grpname,group) +if self.autoshorad then +self.Shorad.Groupset=self.ShoradGroupSet +end +end +end +end +self.SAM_Table=SAM_Tbl +self.SAM_Table_Long=SAM_Tbl_lg +self.SAM_Table_Medium=SAM_Tbl_md +self.SAM_Table_Short=SAM_Tbl_sh +self.SAM_Table_PointDef=SAM_Tbl_pt +if self.mysead~=nil then +local mysead=self.mysead +mysead:UpdateSet(SEAD_Grps) +end +return self +end +function MANTIS:AddShorad(Shorad,Shoradtime) +self:T(self.lid.."AddShorad") +local Shorad=Shorad or nil +local ShoradTime=Shoradtime or 600 +local ShoradLink=true +if Shorad:IsInstanceOf("SHORAD")then +self.ShoradLink=ShoradLink +self.Shorad=Shorad +self.ShoradTime=Shoradtime +end +return self +end +function MANTIS:RemoveShorad() +self:T(self.lid.."RemoveShorad") +self.ShoradLink=false +return self +end +function MANTIS:_CheckLoop(samset,detset,dlink,limit) +self:T(self.lid.."CheckLoop "..#detset.." Coordinates") +local switchedon=0 +local instatusred=0 +local instatusgreen=0 +local activeshorads=0 +local SEADactive=0 +for _,_data in pairs(samset)do +local samcoordinate=_data[2] +local name=_data[1] +local radius=_data[3] +local height=_data[4] +local blind=_data[5]*1.25+1 +local shortsam=(_data[6]==MANTIS.SamType.SHORT)and true or false +if not shortsam then +shortsam=(_data[6]==MANTIS.SamType.POINT)and true or false +end +local samgroup=GROUP:FindByName(name) +local IsInZone,Distance=self:_CheckObjectInZone(detset,samcoordinate,radius,height,dlink) +local suppressed=self.SuppressedGroups[name]or false +local activeshorad=false +if self.Shorad and self.Shorad.ActiveGroups and self.Shorad.ActiveGroups[name]then +activeshorad=true +end +if IsInZone and(not suppressed)and(not activeshorad)then +if samgroup:IsAlive()then +local switch=false +if self.UseEmOnOff and switchedon<limit then +samgroup:EnableEmission(true) +switchedon=switchedon+1 +switch=true +elseif(not self.UseEmOnOff)and switchedon<limit then +samgroup:OptionAlarmStateRed() +switchedon=switchedon+1 +switch=true +end +if self.SamStateTracker[name]~="RED"and switch then +self:__RedState(1,samgroup) +self.SamStateTracker[name]="RED" +end +if shortsam==true and self.SmokeDecoy==true then +self:T("Smoking") +local units=samgroup:GetUnits()or{} +local smoke=self.SmokeDecoyColor or SMOKECOLOR.White +for _,unit in pairs(units)do +if unit and unit:IsAlive()then +unit:GetCoordinate():Smoke(smoke) +end +end +end +if self.ShoradLink and(Distance<self.ShoradActDistance or Distance<blind)then +local Shorad=self.Shorad +local radius=self.checkradius +local ontime=self.ShoradTime +Shorad:WakeUpShorad(name,radius,ontime) +self:__ShoradActivated(1,name,radius,ontime) +end +if(self.debug or self.verbose)and switch then +local text=string.format("SAM %s in alarm state RED!",name) +if self.verbose then self:I(self.lid..text)end +end +end +else +if samgroup:IsAlive()and not suppressed and not activeshorad then +if self.UseEmOnOff then +samgroup:EnableEmission(false) +else +samgroup:OptionAlarmStateGreen() +end +if self.SamStateTracker[name]~="GREEN"then +self:__GreenState(1,samgroup) +self.SamStateTracker[name]="GREEN" +end +if self.debug or self.verbose then +local text=string.format("SAM %s in alarm state GREEN!",name) +if self.verbose then self:I(self.lid..text)end +end +end +end +end +if self.debug or self.verbose or self.logsamstatus then +for _,_status in pairs(self.SamStateTracker)do +if _status=="GREEN"then +instatusgreen=instatusgreen+1 +elseif _status=="RED"then +instatusred=instatusred+1 +end +end +if self.Shorad then +for _,_name in pairs(self.Shorad.ActiveGroups or{})do +activeshorads=activeshorads+1 +end +end +end +return instatusred,instatusgreen,activeshorads +end +function MANTIS:_Check(detection,dlink,reporttolog) +self:T(self.lid.."Check") +local detset=detection:GetDetectedItemCoordinates() +if self.checkcounter%3==0 then +self:_RefreshSAMTable() +end +self.checkcounter=self.checkcounter+1 +local instatusred=0 +local instatusgreen=0 +local activeshorads=0 +if self.automode then +local samset=self.SAM_Table_Long +local instatusredl,instatusgreenl,activeshoradsl=self:_CheckLoop(samset,detset,dlink,self.maxlongrange) +local samset=self.SAM_Table_Medium +local instatusredm,instatusgreenm,activeshoradsm=self:_CheckLoop(samset,detset,dlink,self.maxmidrange) +local samset=self.SAM_Table_Short +local instatusreds,instatusgreens,activeshoradss=self:_CheckLoop(samset,detset,dlink,self.maxshortrange) +local samset=self.SAM_Table_PointDef +instatusred,instatusgreen,activeshorads=self:_CheckLoop(samset,detset,dlink,self.maxpointdefrange) +else +local samset=self:_GetSAMTable() +instatusred,instatusgreen,activeshorads=self:_CheckLoop(samset,detset,dlink,self.maxclassic) +end +local function GetReport() +local statusreport=REPORT:New("\nMANTIS Status "..self.name) +statusreport:Add("+-----------------------------+") +statusreport:Add(string.format("+ SAM in RED State: %2d",instatusred)) +statusreport:Add(string.format("+ SAM in GREEN State: %2d",instatusgreen)) +if self.Shorad then +statusreport:Add(string.format("+ SHORAD active: %2d",activeshorads)) +end +statusreport:Add("+-----------------------------+") +return statusreport +end +if self.debug or self.verbose then +local statusreport=GetReport() +MESSAGE:New(statusreport:Text(),10):ToAll():ToLog() +elseif reporttolog==true then +local statusreport=GetReport() +MESSAGE:New(statusreport:Text(),10):ToLog() +end +return self +end +function MANTIS:_Relocate() +self:T(self.lid.."Relocate") +self:_RelocateGroups() +return self +end +function MANTIS:_CheckAdvState() +self:T(self.lid.."CheckAdvSate") +local interval,oldstate=self:_CalcAdvState() +local newstate=self.adv_state +if newstate~=oldstate then +self:__AdvStateChange(1,oldstate,newstate,interval) +if newstate==2 then +self.state2flag=true +local samset=self:_GetSAMTable() +for _,_data in pairs(samset)do +local name=_data[1] +local samgroup=GROUP:FindByName(name) +if samgroup:IsAlive()then +if self.UseEmOnOff then +samgroup:EnableEmission(true) +else +samgroup:OptionAlarmStateRed() +end +end +end +elseif newstate<=1 then +self.detectinterval=interval +self.state2flag=false +end +end +return self +end +function MANTIS:_CheckDLinkState() +self:T(self.lid.."_CheckDLinkState") +local dlink=self.Detection +local TS=timer.getAbsTime() +if not dlink:Is("Running")and(TS-self.DLTimeStamp>29)then +self.DLink=false +self.Detection=self:StartDetection() +self:I(self.lid.."Intel DLink not running - switching back to single detection!") +end +end +function MANTIS:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid.."Starting MANTIS") +self:SetSAMStartState() +if not INTEL then +self.Detection=self:StartDetection() +else +self.Detection=self:StartIntelDetection() +end +if self.autoshorad then +self.Shorad=SHORAD:New(self.name.."-SHORAD","SHORAD",self.SAM_Group,self.ShoradActDistance,self.ShoradTime,self.coalition,self.UseEmOnOff) +self.Shorad:SetDefenseLimits(80,95) +self.ShoradLink=true +self.Shorad.Groupset=self.ShoradGroupSet +self.Shorad.debug=self.debug +end +if self.shootandscoot and self.SkateZones and self.Shorad then +self.Shorad:AddScootZones(self.SkateZones,self.SkateNumber or 3,self.ScootRandom,self.ScootFormation) +end +self:__Status(-math.random(1,10)) +return self +end +function MANTIS:onbeforeStatus(From,Event,To) +self:T({From,Event,To}) +if not self.state2flag then +self:_Check(self.Detection,self.DLink,self.logsamstatus) +end +local EWRAlive=self:_CheckAnyEWRAlive() +local function FindSAMSRTR() +for i=1,1000 do +local randomsam=self.SAM_Group:GetRandom() +if randomsam and randomsam:IsAlive()then +if randomsam:IsSAM()then return randomsam end +end +end +end +if not EWRAlive then +local randomsam=FindSAMSRTR() +if randomsam and randomsam:IsAlive()then +if self.UseEmOnOff then +randomsam:EnableEmission(true) +else +randomsam:OptionAlarmStateRed() +end +local name=randomsam:GetName() +if self.SamStateTracker[name]~="RED"then +self:__RedState(1,randomsam) +self.SamStateTracker[name]="RED" +end +end +end +if self.autorelocate then +local relointerval=self.relointerval +local thistime=timer.getAbsTime() +local timepassed=thistime-self.TimeStamp +local halfintv=math.floor(timepassed/relointerval) +if halfintv>=1 then +self.TimeStamp=timer.getAbsTime() +self:_Relocate() +self:__Relocating(1) +end +end +if self.advanced then +self:_CheckAdvState() +end +if self.DLink then +self:_CheckDLinkState() +end +return self +end +function MANTIS:onafterStatus(From,Event,To) +self:T({From,Event,To}) +if self.debug and self.verbose then +self:I(self.lid.."Status Report") +for _name,_state in pairs(self.SamStateTracker)do +self:I(string.format("Site %s | Status %s",_name,_state)) +end +end +local interval=self.detectinterval*-1 +self:__Status(interval) +return self +end +function MANTIS:onafterStop(From,Event,To) +self:T({From,Event,To}) +return self +end +function MANTIS:onafterRelocating(From,Event,To) +self:T({From,Event,To}) +return self +end +function MANTIS:onafterGreenState(From,Event,To,Group) +self:T({From,Event,To,Group:GetName()}) +return self +end +function MANTIS:onafterRedState(From,Event,To,Group) +self:T({From,Event,To,Group:GetName()}) +return self +end +function MANTIS:onafterAdvStateChange(From,Event,To,Oldstate,Newstate,Interval) +self:T({From,Event,To,Oldstate,Newstate,Interval}) +return self +end +function MANTIS:onafterShoradActivated(From,Event,To,Name,Radius,Ontime) +self:T({From,Event,To,Name,Radius,Ontime}) +return self +end +function MANTIS:onafterSeadSuppressionStart(From,Event,To,Group,Name,Attacker) +self:T({From,Event,To,Name}) +self.SuppressedGroups[Name]=true +if self.ShoradLink then +local Shorad=self.Shorad +local radius=self.checkradius +local ontime=self.ShoradTime +Shorad:WakeUpShorad(Name,radius,ontime,nil,true) +self:__ShoradActivated(1,Name,radius,ontime) +end +return self +end +function MANTIS:onafterSeadSuppressionEnd(From,Event,To,Group,Name) +self:T({From,Event,To,Name}) +self.SuppressedGroups[Name]=false +return self +end +function MANTIS:onafterSeadSuppressionPlanned(From,Event,To,Group,Name,SuppressionStartTime,SuppressionEndTime,Attacker) +self:T({From,Event,To,Name}) +return self +end +end +SHORAD={ +ClassName="SHORAD", +name="MyShorad", +debug=false, +Prefixes="", +Radius=20000, +Groupset=nil, +Samset=nil, +Coalition=nil, +ActiveTimer=600, +ActiveGroups={}, +lid="", +DefendHarms=true, +DefendMavs=true, +DefenseLowProb=70, +DefenseHighProb=90, +UseEmOnOff=true, +shootandscoot=false, +SkateNumber=3, +SkateZones=nil, +minscootdist=100, +maxscootdist=3000, +scootrandomcoord=false, +} +do +SHORAD.Harms={ +["AGM_88"]="AGM_88", +["AGM_122"]="AGM_122", +["AGM_84"]="AGM_84", +["AGM_45"]="AGM_45", +["ALARM"]="ALARM", +["LD-10"]="LD-10", +["X_58"]="X_58", +["X_28"]="X_28", +["X_25"]="X_25", +["X_31"]="X_31", +["Kh25"]="Kh25", +["HY-2"]="HY-2", +["ADM_141A"]="ADM_141A", +} +SHORAD.Mavs={ +["AGM"]="AGM", +["C-701"]="C-701", +["Kh25"]="Kh25", +["Kh29"]="Kh29", +["Kh31"]="Kh31", +["Kh66"]="Kh66", +} +function SHORAD:New(Name,ShoradPrefix,Samset,Radius,ActiveTimer,Coalition,UseEmOnOff) +local self=BASE:Inherit(self,FSM:New()) +self:T({Name,ShoradPrefix,Samset,Radius,ActiveTimer,Coalition}) +local GroupSet=SET_GROUP:New():FilterPrefixes(ShoradPrefix):FilterCoalitions(Coalition):FilterCategoryGround():FilterStart() +self.name=Name or"MyShorad" +self.Prefixes=ShoradPrefix or"SAM SHORAD" +self.Radius=Radius or 20000 +self.Coalition=Coalition or"blue" +self.Samset=Samset or GroupSet +self.ActiveTimer=ActiveTimer or 600 +self.ActiveGroups={} +self.Groupset=GroupSet +self.DefendHarms=true +self.DefendMavs=true +self.DefenseLowProb=70 +self.DefenseHighProb=90 +self.UseEmOnOff=true +if UseEmOnOff==false then self.UseEmOnOff=UseEmOnOff end +self:I("*** SHORAD - Started Version 0.3.4") +self.lid=string.format("SHORAD %s | ",self.name) +self:_InitState() +self:HandleEvent(EVENTS.Shot,self.HandleEventShot) +self:SetStartState("Running") +self:AddTransition("*","WakeUpShorad","*") +self:AddTransition("*","CalculateHitZone","*") +self:AddTransition("*","ShootAndScoot","*") +return self +end +function SHORAD:_InitState() +self:T(self.lid.." _InitState") +local table={} +local set=self.Groupset +self:T({set=set}) +local aliveset=set:GetAliveSet() +for _,_group in pairs(aliveset)do +if self.UseEmOnOff then +_group:EnableEmission(false) +_group:OptionAlarmStateRed() +else +_group:OptionAlarmStateGreen() +end +_group:OptionDisperseOnAttack(30) +end +for i=1,100 do +math.random() +end +return self +end +function SHORAD:AddScootZones(ZoneSet,Number,Random,Formation) +self:T(self.lid.." AddScootZones") +self.SkateZones=ZoneSet +self.SkateNumber=Number or 3 +self.shootandscoot=true +self.scootrandomcoord=Random +self.scootformation=Formation or"Cone" +return self +end +function SHORAD:SwitchDebug(onoff) +self:T({onoff}) +if onoff then +self:SwitchDebugOn() +else +self:SwitchDebugOff() +end +return self +end +function SHORAD:SwitchDebugOn() +self.debug=true +BASE:TraceOn() +BASE:TraceClass("SHORAD") +return self +end +function SHORAD:SwitchDebugOff() +self.debug=false +BASE:TraceOff() +return self +end +function SHORAD:SwitchHARMDefense(onoff) +self:T({onoff}) +local onoff=onoff or true +self.DefendHarms=onoff +return self +end +function SHORAD:SwitchAGMDefense(onoff) +self:T({onoff}) +local onoff=onoff or true +self.DefendMavs=onoff +return self +end +function SHORAD:SetDefenseLimits(low,high) +self:T({low,high}) +local low=low or 70 +local high=high or 90 +if(low<0)or(low>100)or(low>high)then +low=70 +end +if(high<0)or(high>100)or(high<low)then +high=90 +end +self.DefenseLowProb=low +self.DefenseHighProb=high +return self +end +function SHORAD:SetActiveTimer(seconds) +self:T(self.lid.." SetActiveTimer") +local timer=seconds or 600 +if timer<0 then +timer=600 +end +self.ActiveTimer=timer +return self +end +function SHORAD:SetDefenseRadius(meters) +self:T(self.lid.." SetDefenseRadius") +local radius=meters or 20000 +if radius<0 then +radius=20000 +end +self.Radius=radius +return self +end +function SHORAD:SetUsingEmOnOff(switch) +self:T(self.lid.." SetUsingEmOnOff") +self.UseEmOnOff=switch or false +return self +end +function SHORAD:_CheckHarms(WeaponName) +self:T(self.lid.." _CheckHarms") +self:T({WeaponName}) +local hit=false +if self.DefendHarms then +for _,_name in pairs(SHORAD.Harms)do +if string.find(WeaponName,_name,1,true)then hit=true end +end +end +return hit +end +function SHORAD:_CheckMavs(WeaponName) +self:T(self.lid.." _CheckMavs") +self:T({WeaponName}) +local hit=false +if self.DefendMavs then +for _,_name in pairs(SHORAD.Mavs)do +if string.find(WeaponName,_name,1,true)then hit=true end +end +end +return hit +end +function SHORAD:_CheckCoalition(Coalition) +self:T(self.lid.." _CheckCoalition") +local owncoalition=self.Coalition +local othercoalition="" +if Coalition==0 then +othercoalition="neutral" +elseif Coalition==1 then +othercoalition="red" +else +othercoalition="blue" +end +self:T({owncoalition=owncoalition,othercoalition=othercoalition}) +if owncoalition~=othercoalition then +return true +else +return false +end +end +function SHORAD:_CheckShotAtShorad(TargetGroupName) +self:T(self.lid.." _CheckShotAtShorad") +local tgtgrp=TargetGroupName +local shorad=self.Groupset +local shoradset=shorad:GetAliveSet() +local returnname=false +for _,_groups in pairs(shoradset)do +local groupname=_groups:GetName() +if string.find(groupname,tgtgrp,1,true)then +returnname=true +end +end +return returnname +end +function SHORAD:_CheckShotAtSams(TargetGroupName) +self:T(self.lid.." _CheckShotAtSams") +local tgtgrp=TargetGroupName +local shorad=self.Samset +local shoradset=shorad:GetSet() +local returnname=false +for _,_groups in pairs(shoradset)do +local groupname=_groups:GetName() +if string.find(groupname,tgtgrp,1,true)then +if _groups:IsSAM()then +returnname=true +end +end +end +return returnname +end +function SHORAD:_ShotIsDetected() +self:T(self.lid.." _ShotIsDetected") +if self.debug then return true end +local IsDetected=false +local DetectionProb=math.random(self.DefenseLowProb,self.DefenseHighProb) +local ActualDetection=math.random(1,100) +if ActualDetection<=DetectionProb then +IsDetected=true +end +return IsDetected +end +function SHORAD:onafterWakeUpShorad(From,Event,To,TargetGroup,Radius,ActiveTimer,TargetCat,ShotAt) +self:T(self.lid.." WakeUpShorad") +self:T({TargetGroup,Radius,ActiveTimer,TargetCat}) +local targetcat=TargetCat or Object.Category.UNIT +local targetgroup=TargetGroup +local targetvec2=nil +if targetcat==Object.Category.UNIT then +targetvec2=GROUP:FindByName(targetgroup):GetVec2() +elseif targetcat==Object.Category.STATIC then +targetvec2=STATIC:FindByName(targetgroup,false):GetVec2() +else +local samset=self.Samset +local sam=samset:GetRandom() +targetvec2=sam:GetVec2() +end +local targetzone=ZONE_RADIUS:New("Shorad",targetvec2,Radius) +local groupset=self.Groupset +local shoradset=groupset:GetAliveSet() +local function SleepShorad(group) +if group and group:IsAlive()then +local groupname=group:GetName() +self.ActiveGroups[groupname]=nil +if self.UseEmOnOff then +group:EnableEmission(false) +else +group:OptionAlarmStateGreen() +end +local text=string.format("Sleeping SHORAD %s",group:GetName()) +self:T(text) +local m=MESSAGE:New(text,10,"SHORAD"):ToAllIf(self.debug) +if self.shootandscoot then +self:__ShootAndScoot(1,group) +end +end +end +local TDiff=4 +for _,_group in pairs(shoradset)do +local groupname=_group:GetName() +if groupname==TargetGroup and ShotAt==true then +if self.UseEmOnOff then +_group:EnableEmission(false) +end +_group:OptionAlarmStateGreen() +self.ActiveGroups[groupname]=nil +local text=string.format("Shot at SHORAD %s! Evading!",_group:GetName()) +self:T(text) +local m=MESSAGE:New(text,10,"SHORAD"):ToAllIf(self.debug) +if self.shootandscoot then +self:__ShootAndScoot(1,_group) +end +elseif _group:IsAnyInZone(targetzone)or groupname==TargetGroup then +local text=string.format("Waking up SHORAD %s",_group:GetName()) +self:T(text) +local m=MESSAGE:New(text,10,"SHORAD"):ToAllIf(self.debug) +if self.UseEmOnOff then +_group:EnableEmission(true) +end +_group:OptionAlarmStateRed() +if self.ActiveGroups[groupname]==nil then +self.ActiveGroups[groupname]={Timing=ActiveTimer} +local endtime=timer.getTime()+(ActiveTimer*math.random(75,100)/100) +self.ActiveGroups[groupname].Timer=TIMER:New(SleepShorad,_group):Start(endtime) +if self.shootandscoot then +self:__ShootAndScoot(TDiff,_group) +TDiff=TDiff+1 +end +end +end +end +return self +end +function SHORAD:onafterCalculateHitZone(From,Event,To,SEADWeapon,pos0,height,SEADGroup) +self:T("**** Calculating hit zone") +if SEADWeapon and SEADWeapon:isExist()then +local position=SEADWeapon:getPosition() +local mheight=height +local wph=math.atan2(position.x.z,position.x.x) +if wph<0 then +wph=wph+2*math.pi +end +wph=math.deg(wph) +local wpndata=SEAD.HarmData["AGM_88"] +local mveloc=math.floor(wpndata[2]*340.29) +local c1=(2*mheight*9.81)/(mveloc^2) +local c2=(mveloc^2)/9.81 +local Ropt=c2*math.sqrt(c1+1) +if height<=5000 then +Ropt=Ropt*0.72 +elseif height<=7500 then +Ropt=Ropt*0.82 +elseif height<=10000 then +Ropt=Ropt*0.87 +elseif height<=12500 then +Ropt=Ropt*0.98 +end +for n=1,3 do +local dist=Ropt-((n-1)*20000) +local predpos=pos0:Translate(dist,wph) +if predpos then +local targetzone=ZONE_RADIUS:New("Target Zone",predpos:GetVec2(),20000) +if self.debug then +predpos:MarkToAll(string.format("height=%dm | heading=%d | velocity=%ddeg | Ropt=%dm",mheight,wph,mveloc,Ropt),false) +targetzone:DrawZone(coalition.side.BLUE,{0,0,1},0.2,nil,nil,3,true) +end +local seadset=self.Groupset +local tgtcoord=targetzone:GetRandomPointVec2() +local tgtgrp=seadset:FindNearestGroupFromPointVec2(tgtcoord) +local _targetgroup=nil +local _targetgroupname="none" +local _targetskill="Random" +if tgtgrp and tgtgrp:IsAlive()then +_targetgroup=tgtgrp +_targetgroupname=tgtgrp:GetName() +_targetskill=tgtgrp:GetUnit(1):GetSkill() +self:T("*** Found Target = ".._targetgroupname) +self:WakeUpShorad(_targetgroupname,self.Radius,self.ActiveTimer,Object.Category.UNIT,true) +end +end +end +end +return self +end +function SHORAD:onafterShootAndScoot(From,Event,To,Shorad) +self:T({From,Event,To}) +local possibleZones={} +local mindist=self.minscootdist or 100 +local maxdist=self.maxscootdist or 3000 +if Shorad and Shorad:IsAlive()then +local NowCoord=Shorad:GetCoordinate() +for _,_zone in pairs(self.SkateZones.Set)do +local zone=_zone +local dist=NowCoord:Get2DDistance(zone:GetCoordinate()) +if dist>=mindist and dist<=maxdist then +possibleZones[#possibleZones+1]=zone +if#possibleZones==self.SkateNumber then break end +end +end +if#possibleZones>0 and Shorad:GetVelocityKMH()<2 then +local rand=math.floor(math.random(1,#possibleZones*1000)/1000+0.5) +if rand==0 then rand=1 end +self:T(self.lid.." ShootAndScoot to zone "..rand) +local ToCoordinate=possibleZones[rand]:GetCoordinate() +if self.scootrandomcoord then +ToCoordinate=possibleZones[rand]:GetRandomCoordinate(nil,nil,{land.SurfaceType.LAND,land.SurfaceType.ROAD}) +end +local formation=self.scootformation or"Cone" +Shorad:RouteGroundTo(ToCoordinate,20,formation,1) +end +end +return self +end +function SHORAD:HandleEventShot(EventData) +self:T({EventData}) +self:T(self.lid.." HandleEventShot") +local ShootingWeapon=EventData.Weapon +local ShootingWeaponName=EventData.WeaponName +local weaponcoalition=EventData.IniGroup:GetCoalition() +if self:_CheckCoalition(weaponcoalition)then +local IsDetected=self:_ShotIsDetected() +local DetectedText="false" +if IsDetected then +DetectedText="true" +end +local text=string.format("%s Missile Launched = %s | Detected probability state is %s",self.lid,ShootingWeaponName,DetectedText) +self:T(text) +local m=MESSAGE:New(text,10,"Info"):ToAllIf(self.debug) +if(self:_CheckHarms(ShootingWeaponName)or self:_CheckMavs(ShootingWeaponName))and IsDetected then +local targetdata=EventData.Weapon:getTarget() +if not targetdata or self.debug then +if string.find(ShootingWeaponName,"AGM_88",1,true)then +self:I("**** Tracking AGM-88 with no target data.") +local pos0=EventData.IniUnit:GetCoordinate() +local fheight=EventData.IniUnit:GetHeight() +self:__CalculateHitZone(20,ShootingWeapon,pos0,fheight,EventData.IniGroup) +end +return self +end +local targetcat=Object.getCategory(targetdata) +self:T(string.format("Target Category (3=STATIC, 1=UNIT)= %s",tostring(targetcat))) +self:T({targetdata}) +local targetunit=nil +if targetcat==Object.Category.UNIT then +targetunit=UNIT:Find(targetdata) +elseif targetcat==Object.Category.STATIC then +local tgtcoord=COORDINATE:NewFromVec3(targetdata:getPoint()) +local tgtgrp1=self.Samset:FindNearestGroupFromPointVec2(tgtcoord) +local tgtcoord1=tgtgrp1:GetCoordinate() +local tgtgrp2=self.Groupset:FindNearestGroupFromPointVec2(tgtcoord) +local tgtcoord2=tgtgrp2:GetCoordinate() +local dist1=tgtcoord:Get2DDistance(tgtcoord1) +local dist2=tgtcoord:Get2DDistance(tgtcoord2) +if dist1<dist2 then +targetunit=tgtgrp1 +targetcat=Object.Category.UNIT +else +targetunit=tgtgrp2 +targetcat=Object.Category.UNIT +end +end +if targetunit and targetunit:IsAlive()then +local targetunitname=targetunit:GetName() +local targetgroup=nil +local targetgroupname="none" +if targetcat==Object.Category.UNIT then +if targetunit.ClassName=="UNIT"then +targetgroup=targetunit:GetGroup() +elseif targetunit.ClassName=="GROUP"then +targetgroup=targetunit +end +targetgroupname=targetgroup:GetName() +elseif targetcat==Object.Category.STATIC then +targetgroup=targetunit +targetgroupname=targetunitname +end +local text=string.format("%s Missile Target = %s",self.lid,tostring(targetgroupname)) +self:T(text) +local m=MESSAGE:New(text,10,"Info"):ToAllIf(self.debug) +local shotatus=self:_CheckShotAtShorad(targetgroupname) +local shotatsams=self:_CheckShotAtSams(targetgroupname) +if shotatsams or shotatus then +self:T({shotatsams=shotatsams,shotatus=shotatus}) +self:WakeUpShorad(targetgroupname,self.Radius,self.ActiveTimer,targetcat,true) +end +end +end +end +return self +end +end +AICSAR={ +ClassName="AICSAR", +version="0.1.18", +lid="", +coalition=coalition.side.BLUE, +template="", +helotemplate="", +alias="", +farp=nil, +farpzone=nil, +maxdistance=UTILS.NMToMeters(50), +pilotqueue={}, +pilotindex=0, +helos={}, +verbose=false, +rescuezoneradius=200, +rescued={}, +autoonoff=true, +playerset=nil, +Messages={}, +SRS=nil, +SRSRadio=false, +SRSFrequency=243, +SRSPath="\\", +SRSModulation=radio.modulation.AM, +SRSSoundPath=nil, +SRSPort=5002, +DCSRadio=false, +DCSFrequency=243, +DCSModulation=radio.modulation.AM, +DCSRadioGroup=nil, +limithelos=true, +helonumber=3, +gettext=nil, +locale="en", +SRSTTSRadio=false, +SRSGoogle=false, +SRSQ=nil, +SRSPilot=nil, +SRSPilotVoice=false, +SRSOperator=nil, +SRSOperatorVoice=false, +PilotStore=nil, +Speed=100, +Altitude=1500, +UseEventEject=false, +Delay=100, +UseRescueZone=false, +RescueZone=nil, +} +AICSAR.Messages={ +EN={ +INITIALOK="Roger, Pilot, we hear you. Stay where you are, a helo is on the way!", +INITIALNOTOK="Sorry, Pilot. You're behind maximum operational distance! Good Luck!", +PILOTDOWN="Mayday, mayday, mayday! Pilot down at ", +PILOTKIA="Pilot KIA!", +HELODOWN="CSAR Helo Down!", +PILOTRESCUED="Pilot rescued!", +PILOTINHELO="Pilot picked up!", +}, +DE={ +INITIALOK="Copy, Pilot, wir hören Sie. Bleiben Sie, wo Sie sind!\nEin Hubschrauber sammelt Sie auf!", +INITIALNOTOK="Verstehe, Pilot. Sie sind zu weit weg von uns.\nViel Glück!", +PILOTDOWN="Mayday, mayday, mayday! Pilot abgestürzt: ", +PILOTKIA="Pilot gefallen!", +HELODOWN="CSAR Hubschrauber verloren!", +PILOTRESCUED="Pilot gerettet!", +PILOTINHELO="Pilot an Bord geholt!", +}, +} +AICSAR.RadioMessages={ +EN={ +INITIALOK="initialok.ogg", +INITIALNOTOK="initialnotok.ogg", +PILOTDOWN="pilotdown.ogg", +PILOTKIA="pilotkia.ogg", +HELODOWN="helodown.ogg", +PILOTRESCUED="pilotrescued.ogg", +PILOTINHELO="pilotinhelo.ogg", +}, +} +AICSAR.RadioLength={ +EN={ +INITIALOK=4.1, +INITIALNOTOK=4.6, +PILOTDOWN=2.6, +PILOTKIA=1.1, +HELODOWN=2.1, +PILOTRESCUED=3.5, +PILOTINHELO=2.6, +}, +} +function AICSAR:New(Alias,Coalition,Pilottemplate,Helotemplate,FARP,MASHZone,Helonumber) +local self=BASE:Inherit(self,FSM:New()) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +self.coalitiontxt=Coalition +elseif Coalition=="red"then +self.coalition=coalition.side.RED +self.coalitiontxt=Coalition +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +self.coalitiontxt=Coalition +else +self:E("ERROR: Unknown coalition in AICSAR!") +end +else +self.coalition=Coalition +self.coalitiontxt=string.lower(UTILS.GetCoalitionName(self.coalition)) +end +if Alias then +self.alias=tostring(Alias) +else +self.alias="Red Cross" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="IFRC" +elseif self.coalition==coalition.side.BLUE then +self.alias="CSAR" +end +end +end +self.template=Pilottemplate +self.helotemplate=Helotemplate +self.farp=FARP +self.farpzone=MASHZone +self.playerset=SET_CLIENT:New():FilterActive(true):FilterCategories("helicopter"):FilterStart() +self.UseEventEject=false +self.Delay=300 +self.SRS=nil +self.SRSRadio=false +self.SRSTTSRadio=false +self.SRSGoogle=false +self.SRSQ=nil +self.SRSFrequency=243 +self.SRSPath="\\" +self.SRSModulation=radio.modulation.AM +self.SRSSoundPath=nil +self.SRSPort=5002 +self.DCSRadio=false +self.DCSFrequency=243 +self.DCSModulation=radio.modulation.AM +self.DCSRadioGroup=nil +self.DCSRadioQueue=nil +self.MGRS_Accuracy=2 +self.limithelos=true +self.helonumber=Helonumber or 3 +self:InitLocalization() +self.lid=string.format("%s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self.PilotStore=FIFO:New() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","PilotDown","*") +self:AddTransition("*","PilotPickedUp","*") +self:AddTransition("*","PilotUnloaded","*") +self:AddTransition("*","PilotRescued","*") +self:AddTransition("*","PilotKIA","*") +self:AddTransition("*","HeloDown","*") +self:AddTransition("*","HeloOnDuty","*") +self:AddTransition("*","Stop","Stopped") +self:HandleEvent(EVENTS.LandingAfterEjection,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EjectEventHandler) +self:__Start(math.random(2,5)) +local text=string.format("%sAICSAR Version %s Starting",self.lid,self.version) +self:I(text) +return self +end +function AICSAR:InitLocalization() +self:T(self.lid.."InitLocalization") +self.gettext=TEXTANDSOUND:New(self.ClassName,"en") +self.gettext:AddEntry("en","INITIALOK",AICSAR.Messages.EN.INITIALOK,AICSAR.RadioMessages.EN.INITIALOK,AICSAR.RadioLength.INITIALOK) +self.gettext:AddEntry("en","INITIALNOTOK",AICSAR.Messages.EN.INITIALNOTOK,AICSAR.RadioMessages.EN.INITIALNOTOK,AICSAR.RadioLength.EN.INITIALNOTOK) +self.gettext:AddEntry("en","HELODOWN",AICSAR.Messages.EN.HELODOWN,AICSAR.RadioMessages.EN.HELODOWN,AICSAR.RadioLength.EN.HELODOWN) +self.gettext:AddEntry("en","PILOTDOWN",AICSAR.Messages.EN.PILOTDOWN,AICSAR.RadioMessages.EN.PILOTDOWN,AICSAR.RadioLength.EN.PILOTDOWN) +self.gettext:AddEntry("en","PILOTINHELO",AICSAR.Messages.EN.PILOTINHELO,AICSAR.RadioMessages.EN.PILOTINHELO,AICSAR.RadioLength.EN.PILOTINHELO) +self.gettext:AddEntry("en","PILOTKIA",AICSAR.Messages.EN.PILOTKIA,AICSAR.RadioMessages.EN.PILOTKIA,AICSAR.RadioLength.EN.PILOTKIA) +self.gettext:AddEntry("en","PILOTRESCUED",AICSAR.Messages.EN.PILOTRESCUED,AICSAR.RadioMessages.EN.PILOTRESCUED,AICSAR.RadioLength.EN.PILOTRESCUED) +self.gettext:AddEntry("de","INITIALOK",AICSAR.Messages.DE.INITIALOK,AICSAR.RadioMessages.EN.INITIALOK,AICSAR.RadioLength.INITIALOK) +self.gettext:AddEntry("de","INITIALNOTOK",AICSAR.Messages.DE.INITIALNOTOK,AICSAR.RadioMessages.EN.INITIALNOTOK,AICSAR.RadioLength.EN.INITIALNOTOK) +self.gettext:AddEntry("de","HELODOWN",AICSAR.Messages.DE.HELODOWN,AICSAR.RadioMessages.EN.HELODOWN,AICSAR.RadioLength.EN.HELODOWN) +self.gettext:AddEntry("de","PILOTDOWN",AICSAR.Messages.DE.PILOTDOWN,AICSAR.RadioMessages.EN.PILOTDOWN,AICSAR.RadioLength.EN.PILOTDOWN) +self.gettext:AddEntry("de","PILOTINHELO",AICSAR.Messages.DE.PILOTINHELO,AICSAR.RadioMessages.EN.PILOTINHELO,AICSAR.RadioLength.EN.PILOTINHELO) +self.gettext:AddEntry("de","PILOTKIA",AICSAR.Messages.DE.PILOTKIA,AICSAR.RadioMessages.EN.PILOTKIA,AICSAR.RadioLength.EN.PILOTKIA) +self.gettext:AddEntry("de","PILOTRESCUED",AICSAR.Messages.DE.PILOTRESCUED,AICSAR.RadioMessages.EN.PILOTRESCUED,AICSAR.RadioLength.EN.PILOTRESCUED) +self.locale="en" +return self +end +function AICSAR:SetUsingRescueZone(Zone) +self.UseRescueZone=true +self.RescueZone=Zone +return self +end +function AICSAR:SetSRSRadio(OnOff,Path,Frequency,Modulation,SoundPath,Port) +self:T(self.lid.."SetSRSRadio") +self.SRSRadio=OnOff and true +self.SRSTTSRadio=false +self.SRSFrequency=Frequency or 243 +self.SRSPath=Path or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.SRS:SetLabel("ACSR") +self.SRS:SetCoalition(self.coalition) +self.SRSModulation=Modulation or radio.modulation.AM +local soundpath=os.getenv('TMP').."\\DCS\\Mission\\l10n\\DEFAULT" +self.SRSSoundPath=SoundPath or soundpath +self.SRSPort=Port or MSRS.port or 5002 +if OnOff then +self.SRS=MSRS:New(Path,Frequency,Modulation) +self.SRS:SetPort(self.SRSPort) +end +return self +end +function AICSAR:SetSRSTTSRadio(OnOff,Path,Frequency,Modulation,Port,Voice,Culture,Gender,GoogleCredentials) +self:T(self.lid.."SetSRSTTSRadio") +self.SRSTTSRadio=OnOff and true +self.SRSRadio=false +self.SRSFrequency=Frequency or 243 +self.SRSPath=Path or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.SRSModulation=Modulation or radio.modulation.AM +self.SRSPort=Port or MSRS.port or 5002 +if OnOff then +self.SRS=MSRS:New(self.SRSPath,Frequency,Modulation) +self.SRS:SetPort(self.SRSPort) +self.SRS:SetCoalition(self.coalition) +self.SRS:SetLabel("ACSR") +self.SRS:SetVoice(Voice) +self.SRS:SetCulture(Culture) +self.SRS:SetGender(Gender) +if GoogleCredentials then +self.SRS:SetProviderOptionsGoogle(GoogleCredentials,GoogleCredentials) +self.SRS:SetProvider(MSRS.Provider.GOOGLE) +self.SRSGoogle=true +end +self.SRSQ=MSRSQUEUE:New(self.alias) +end +return self +end +function AICSAR:SetPilotTTSVoice(Voice,Culture,Gender) +self:T(self.lid.."SetPilotTTSVoice") +self.SRSPilotVoice=true +self.SRSPilot=MSRS:New(self.SRSPath,self.SRSFrequency,self.SRSModulation) +self.SRSPilot:SetCoalition(self.coalition) +self.SRSPilot:SetVoice(Voice) +self.SRSPilot:SetCulture(Culture or"en-US") +self.SRSPilot:SetGender(Gender or"male") +self.SRSPilot:SetLabel("PILOT") +if self.SRSGoogle then +local poptions=self.SRS:GetProviderOptions(MSRS.Provider.GOOGLE) +self.SRSPilot:SetProviderOptionsGoogle(poptions.credentials,poptions.key) +self.SRSPilot:SetProvider(MSRS.Provider.GOOGLE) +end +return self +end +function AICSAR:SetOperatorTTSVoice(Voice,Culture,Gender) +self:T(self.lid.."SetOperatorTTSVoice") +self.SRSOperatorVoice=true +self.SRSOperator=MSRS:New(self.SRSPath,self.SRSFrequency,self.SRSModulation) +self.SRSOperator:SetCoalition(self.coalition) +self.SRSOperator:SetVoice(Voice) +self.SRSOperator:SetCulture(Culture or"en-GB") +self.SRSOperator:SetGender(Gender or"female") +self.SRSOperator:SetLabel("RESCUE") +if self.SRSGoogle then +local poptions=self.SRS:GetProviderOptions(MSRS.Provider.GOOGLE) +self.SRSOperator:SetProviderOptionsGoogle(poptions.credentials,poptions.key) +self.SRSOperator:SetProvider(MSRS.Provider.GOOGLE) +end +return self +end +function AICSAR:SetDCSRadio(OnOff,Frequency,Modulation,Group) +self:T(self.lid.."SetDCSRadio") +self:T(self.lid.."SetDCSRadio to "..tostring(OnOff)) +self.DCSRadio=OnOff and true +self.DCSFrequency=Frequency or 243 +self.DCSModulation=Modulation or radio.modulation.AM +self.DCSRadioGroup=Group +if self.DCSRadio then +self.DCSRadioQueue=RADIOQUEUE:New(Frequency,Modulation,"AI-CSAR") +self.DCSRadioQueue:Start(5,5) +self.DCSRadioQueue:SetRadioPower(1000) +self.DCSRadioQueue:SetSenderCoordinate(Group:GetCoordinate()) +else +if self.DCSRadioQueue then +self.DCSRadioQueue:Stop() +end +end +return self +end +function AICSAR:DCSRadioBroadcast(Soundfile,Duration,Subtitle) +self:T(self.lid.."DCSRadioBroadcast") +local radioqueue=self.DCSRadioQueue +radioqueue:NewTransmission(Soundfile,Duration,nil,2,nil,Subtitle,10) +return self +end +function AICSAR:_EjectEventHandler(EventData) +local _event=EventData +if _event.IniPlayerName then +self.PilotStore:Push(_event.IniPlayerName) +self:T(self.lid.."Pilot Ejected: ".._event.IniPlayerName) +if self.UseEventEject then +local _LandingPos=COORDINATE:NewFromVec3(_event.initiator:getPosition().p) +local _country=_event.initiator:getCountry() +local _coalition=coalition.getCountryCoalition(_country) +Unit.destroy(_event.initiator) +self:ScheduleOnce(self.Delay,self._DelayedSpawnPilot,self,_LandingPos,_coalition) +end +end +return self +end +function AICSAR:_DelayedSpawnPilot(_LandingPos,_coalition) +local distancetofarp=_LandingPos:Get2DDistance(self.farp:GetCoordinate()) +if self.UseRescueZone==true and self.RescueZone~=nil then +if self.RescueZone:IsCoordinateInZone(_LandingPos)then +distancetofarp=self.maxdistance-10 +else +distancetofarp=self.maxdistance+10 +end +end +local Text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("PILOTDOWN",self.locale) +local text="" +local setting={} +setting.MGRS_Accuracy=self.MGRS_Accuracy +local location=_LandingPos:ToStringMGRS(setting) +local msgtxt=Text..location.."!" +location=string.gsub(location,"MGRS ","") +location=string.gsub(location,"%s+","") +location=string.gsub(location,"([%a%d])","%1;") +location=string.gsub(location,"0","zero") +location=string.gsub(location,"9","niner") +location="MGRS;"..location +if self.SRSGoogle then +location=string.format("<say-as interpret-as='characters'>%s</say-as>",location) +end +text=Text..location.."!" +local ttstext=Text..location.."! Repeat! "..location +if _coalition==self.coalition then +if self.verbose then +MESSAGE:New(msgtxt,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +if self.SRSPilotVoice then +self.SRSQ:NewTransmission(ttstext,nil,self.SRSPilot,nil,1) +else +self.SRSQ:NewTransmission(ttstext,nil,self.SRS,nil,1) +end +end +end +if _coalition==self.coalition and distancetofarp<=self.maxdistance then +self:T(self.lid.."Spawning new Pilot") +self.pilotindex=self.pilotindex+1 +local newpilot=SPAWN:NewWithAlias(self.template,string.format("%s-AICSAR-%d",self.template,self.pilotindex)) +newpilot:InitDelayOff() +newpilot:OnSpawnGroup( +function(grp) +self.pilotqueue[self.pilotindex]=grp +end +) +newpilot:SpawnFromCoordinate(_LandingPos) +self:__PilotDown(2,_LandingPos,true) +elseif _coalition==self.coalition and distancetofarp>self.maxdistance then +self:T(self.lid.."Pilot out of reach") +self:__PilotDown(2,_LandingPos,false) +end +return self +end +function AICSAR:_EventHandler(EventData,FromEject) +self:T(self.lid.."OnEventLandingAfterEjection ID="..EventData.id) +if self.autoonoff then +if self.playerset:CountAlive()>0 then +return self +end +end +if self.UseEventEject and(not FromEject)then return self end +local _event=EventData +local _LandingPos=COORDINATE:NewFromVec3(_event.initiator:getPosition().p) +local _country=_event.initiator:getCountry() +local _coalition=coalition.getCountryCoalition(_country) +local distancetofarp=_LandingPos:Get2DDistance(self.farp:GetCoordinate()) +if self.UseRescueZone==true and self.RescueZone~=nil then +if self.RescueZone:IsCoordinateInZone(_LandingPos)then +distancetofarp=self.maxdistance-10 +else +distancetofarp=self.maxdistance+10 +end +end +local Text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("PILOTDOWN",self.locale) +local text="" +local setting={} +setting.MGRS_Accuracy=self.MGRS_Accuracy +local location=_LandingPos:ToStringMGRS(setting) +local msgtxt=Text..location.."!" +location=string.gsub(location,"MGRS ","") +location=string.gsub(location,"%s+","") +location=string.gsub(location,"([%a%d])","%1;") +location=string.gsub(location,"0","zero") +location=string.gsub(location,"9","niner") +location="MGRS;"..location +if self.SRSGoogle then +location=string.format("<say-as interpret-as='characters'>%s</say-as>",location) +end +text=Text..location.."!" +local ttstext=Text..location.."! Repeat! "..location +if _coalition==self.coalition then +if self.verbose then +MESSAGE:New(msgtxt,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +if self.SRSPilotVoice then +self.SRSQ:NewTransmission(ttstext,nil,self.SRSPilot,nil,1) +else +self.SRSQ:NewTransmission(ttstext,nil,self.SRS,nil,1) +end +end +end +if _coalition==self.coalition and distancetofarp<=self.maxdistance then +self:T(self.lid.."Spawning new Pilot") +self.pilotindex=self.pilotindex+1 +local newpilot=SPAWN:NewWithAlias(self.template,string.format("%s-AICSAR-%d",self.template,self.pilotindex)) +newpilot:InitDelayOff() +newpilot:OnSpawnGroup( +function(grp) +self.pilotqueue[self.pilotindex]=grp +end +) +newpilot:SpawnFromCoordinate(_LandingPos) +Unit.destroy(_event.initiator) +self:__PilotDown(2,_LandingPos,true) +elseif _coalition==self.coalition and distancetofarp>self.maxdistance then +self:T(self.lid.."Pilot out of reach") +self:__PilotDown(2,_LandingPos,false) +end +return self +end +function AICSAR:_GetFlight() +self:T(self.lid.."_GetFlight") +local newhelo=SPAWN:NewWithAlias(self.helotemplate,self.helotemplate..math.random(1,10000)) +:InitDelayOff() +:InitUnControlled(true) +:OnSpawnGroup( +function(Group) +Group:OptionPreferVerticalLanding() +self:__HeloOnDuty(1,Group) +end +) +:Spawn() +local nhelo=FLIGHTGROUP:New(newhelo) +nhelo:SetHomebase(self.farp) +nhelo:Activate() +return nhelo +end +function AICSAR:_InitMission(Pilot,Index) +self:T(self.lid.."_InitMission") +local pickupzone=ZONE_GROUP:New(Pilot:GetName(),Pilot,self.rescuezoneradius) +local opstransport=OPSTRANSPORT:New(Pilot,pickupzone,self.farpzone) +local helo=self:_GetFlight() +helo.AICSARReserved=true +helo:SetDefaultAltitude(self.Altitude or 1500) +helo:SetDefaultSpeed(self.Speed or 100) +helo:AddOpsTransport(opstransport) +local function AICPickedUp(Helo,Cargo,Index) +self:__PilotPickedUp(2,Helo,Cargo,Index) +end +local function AICHeloDead(Helo,Index) +self:__HeloDown(2,Helo,Index) +end +local function AICHeloUnloaded(Helo,OpsGroup) +self:__PilotUnloaded(2,Helo,OpsGroup) +end +function helo:OnAfterLoading(From,Event,To) +AICPickedUp(helo,helo:GetCargoGroups(),Index) +helo:__LoadingDone(5) +end +function helo:OnAfterDead(From,Event,To) +AICHeloDead(helo,Index) +end +function helo:OnAfterUnloaded(From,Event,To,OpsGroupCargo) +AICHeloUnloaded(helo,OpsGroupCargo) +helo:__UnloadingDone(5) +end +function helo:OnAfterLandAtAirbase(From,Event,To,airbase) +helo:Despawn(2) +end +self.helos[Index]=helo +return self +end +function AICSAR:_CheckInMashZone(Pilot) +self:T(self.lid.."_CheckInMashZone") +if Pilot:IsInZone(self.farpzone)then +return true +else +return false +end +end +function AICSAR:SetDefaultSpeed(Knots) +self:T(self.lid.."SetDefaultSpeed") +self.Speed=Knots or 100 +return self +end +function AICSAR:SetDefaultAltitude(Feet) +self:T(self.lid.."SetDefaultAltitude") +self.Altitude=Feet or 1500 +return self +end +function AICSAR:_CheckHelos() +self:T(self.lid.."_CheckHelos") +for _index,_helo in pairs(self.helos)do +local helo=_helo +if helo and helo.ClassName=="FLIGHTGROUP"then +local state=helo:GetState() +local name=helo:GetName() +self:T("Helo group "..name.." in state "..state) +if state=="Arrived"then +helo.OnAfterDead=nil +helo:Despawn(35) +self.helos[_index]=nil +end +else +self.helos[_index]=nil +end +end +return self +end +function AICSAR:_CountHelos() +self:T(self.lid.."_CountHelos") +local count=0 +for _index,_helo in pairs(self.helos)do +count=count+1 +end +return count +end +function AICSAR:_CheckQueue(OpsGroup) +self:T(self.lid.."_CheckQueue") +for _index,_pilot in pairs(self.pilotqueue)do +local classname=_pilot.ClassName and _pilot.ClassName or"NONE" +local name=_pilot.GroupName and _pilot.GroupName or"NONE" +local playername="John Doe" +local helocount=self:_CountHelos() +if _pilot and _pilot.ClassName and _pilot.ClassName=="GROUP"then +local flightgroup=self.helos[_index] +if self:_CheckInMashZone(_pilot)then +self:T("Pilot".._pilot.GroupName.." rescued!") +if OpsGroup then +else +_pilot:Destroy(true,10) +end +self.pilotqueue[_index]=nil +self.rescued[_index]=true +if self.PilotStore:Count()>0 then +playername=self.PilotStore:Pull() +end +self:__PilotRescued(2,playername) +if flightgroup then +flightgroup.AICSARReserved=false +end +end +if not _pilot.AICSAR then +if self.limithelos and helocount>=self.helonumber then +break +end +_pilot.AICSAR={} +_pilot.AICSAR.Status="Initiated" +_pilot.AICSAR.Boarded=false +self:_InitMission(_pilot,_index) +break +else +if flightgroup then +local state=flightgroup:GetState() +_pilot.AICSAR.Status=state +end +end +end +end +return self +end +function AICSAR:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:__Status(3) +return self +end +function AICSAR:onafterStatus(From,Event,To) +self:T({From,Event,To}) +self:_CheckHelos() +self:__Status(30) +return self +end +function AICSAR:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:UnHandleEvent(EVENTS.LandingAfterEjection) +if self.DCSRadioQueue then +self.DCSRadioQueue:Stop() +end +return self +end +function AICSAR:onafterPilotDown(From,Event,To,Coordinate,InReach) +self:T({From,Event,To}) +local CoordinateText=Coordinate:ToStringMGRS() +local inreach=tostring(InReach) +if InReach then +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("INITIALOK",self.locale) +self:T(text) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +if self.SRSOperatorVoice then +self.SRSQ:NewTransmission(text,nil,self.SRSOperator,nil,1) +else +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +end +else +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("INITIALNOTOK",self.locale) +self:T(text) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +if self.SRSOperatorVoice then +self.SRSQ:NewTransmission(text,nil,self.SRSOperator,nil,1) +else +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +end +end +self:_CheckQueue() +return self +end +function AICSAR:onafterPilotKIA(From,Event,To) +self:T({From,Event,To}) +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("PILOTKIA",self.locale) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +return self +end +function AICSAR:onafterHeloDown(From,Event,To,Helo,Index) +self:T({From,Event,To}) +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("HELODOWN",self.locale) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +if self.SRSOperatorVoice then +self.SRSQ:NewTransmission(text,nil,self.SRSOperator,nil,1) +else +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +end +local findex=0 +local fhname=Helo:GetName() +if Index and Index>0 then +findex=Index +else +for _index,_helo in pairs(self.helos)do +local helo=_helo +local hname=helo:GetName() +if fhname==hname then +findex=_index +break +end +end +end +if findex>0 and not self.rescued[findex]then +local pilot=self.pilotqueue[findex] +self.helos[findex]=nil +if pilot.AICSAR.Boarded then +self:T("Helo Down: Found DEAD Pilot ID "..findex.." with name "..pilot:GetName()) +self:__PilotKIA(2) +self.pilotqueue[findex]=nil +else +self:T("Helo Down: Found ALIVE Pilot ID "..findex.." with name "..pilot:GetName()) +self:_InitMission(pilot,findex) +end +end +return self +end +function AICSAR:onafterPilotRescued(From,Event,To,PilotName) +self:T({From,Event,To}) +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("PILOTRESCUED",self.locale) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +return self +end +function AICSAR:onafterPilotUnloaded(From,Event,To,Helo,OpsGroup) +self:T({From,Event,To}) +self:_CheckQueue(OpsGroup) +return self +end +function AICSAR:onafterPilotPickedUp(From,Event,To,Helo,CargoTable,Index) +self:T({From,Event,To}) +local text,Soundfile,Soundlength,Subtitle=self.gettext:GetEntry("PILOTINHELO",self.locale) +if self.verbose then +MESSAGE:New(text,15,"AICSAR"):ToCoalition(self.coalition) +end +if self.SRSRadio then +local sound=SOUNDFILE:New(Soundfile,self.SRSSoundPath,Soundlength) +sound:SetPlayWithSRS(true) +self.SRS:PlaySoundFile(sound,2) +elseif self.DCSRadio then +self:DCSRadioBroadcast(Soundfile,Soundlength,text) +elseif self.SRSTTSRadio then +self.SRSQ:NewTransmission(text,nil,self.SRS,nil,1) +end +local findex=0 +local fhname=Helo:GetName() +if Index and Index>0 then +findex=Index +else +for _index,_helo in pairs(self.helos)do +local helo=_helo +local hname=helo:GetName() +if fhname==hname then +findex=_index +break +end +end +end +if findex>0 then +local pilot=self.pilotqueue[findex] +self:T("Boarded: Found Pilot ID "..findex.." with name "..pilot:GetName()) +pilot.AICSAR.Boarded=true +end +return self +end +AMMOTRUCK={ +ClassName="AMMOTRUCK", +lid="", +version="0.0.12", +alias="", +debug=false, +trucklist={}, +targetlist={}, +coalition=nil, +truckset=nil, +targetset=nil, +remunitionqueue={}, +waitingtargets={}, +ammothreshold=5, +remunidist=20000, +monitor=-60, +unloadtime=600, +waitingtime=1800, +routeonroad=true, +reloads=5, +} +AMMOTRUCK.State={ +IDLE="idle", +DRIVING="driving", +ARRIVED="arrived", +UNLOADING="unloading", +RETURNING="returning", +WAITING="waiting", +RELOADING="reloading", +OUTOFAMMO="outofammo", +REQUESTED="requested", +} +function AMMOTRUCK:New(Truckset,Targetset,Coalition,Alias,Homezone) +local self=BASE:Inherit(self,FSM:New()) +self.truckset=Truckset +self.targetset=Targetset +self.coalition=Coalition +self.alias=Alias +self.debug=false +self.remunitionqueue={} +self.trucklist={} +self.targetlist={} +self.ammothreshold=5 +self.remunidist=20000 +self.homezone=Homezone +self.waitingtime=1800 +self.usearmygroup=false +self.hasarmygroup=false +self.lid=string.format("AMMOTRUCK %s | %s | ",self.version,self.alias) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Monitor","*") +self:AddTransition("*","RouteTruck","*") +self:AddTransition("*","TruckArrived","*") +self:AddTransition("*","TruckUnloading","*") +self:AddTransition("*","TruckReturning","*") +self:AddTransition("*","TruckHome","*") +self:AddTransition("*","Stop","Stopped") +self:__Start(math.random(5,10)) +self:I(self.lid.."Started") +return self +end +function AMMOTRUCK:CheckDrivingTrucks(dataset) +self:T(self.lid.." CheckDrivingTrucks") +local data=dataset +for _,_data in pairs(data)do +local truck=_data +local coord=truck.group:GetCoordinate() +local tgtcoord=truck.targetcoordinate +local dist=coord:Get2DDistance(tgtcoord) +if dist<=150 then +truck.statusquo=AMMOTRUCK.State.ARRIVED +truck.timestamp=timer.getAbsTime() +truck.coordinate=coord +self:__TruckArrived(1,truck) +end +local Tnow=timer.getAbsTime() +if Tnow-truck.timestamp>30 then +local group=truck.group +if self.usearmygroup then +group=truck.group:GetGroup() +end +local currspeed=group:GetVelocityKMH() +if truck.lastspeed then +if truck.lastspeed==0 and currspeed==0 then +self:T(truck.group:GetName().." Is not moving!") +truck.timestamp=timer.getAbsTime() +if self.routeonroad then +group:RouteGroundOnRoad(truck.targetcoordinate,30,2,"Vee") +else +group:RouteGroundTo(truck.targetcoordinate,30,"Vee",2) +end +end +truck.lastspeed=currspeed +else +truck.lastspeed=currspeed +truck.timestamp=timer.getAbsTime() +end +self:I({truck=truck.group:GetName(),currspeed=currspeed,lastspeed=truck.lastspeed}) +end +end +return self +end +function AMMOTRUCK:GetAmmoStatus(Group) +local ammotot,shells,rockets,bombs,missiles,narti=Group:GetAmmunition() +return rockets+missiles+narti +end +function AMMOTRUCK:CheckWaitingTargets(dataset) +self:T(self.lid.." CheckWaitingTargets") +local data=dataset +for _,_data in pairs(data)do +local truck=_data +local Tnow=timer.getAbsTime() +local Tdiff=Tnow-truck.timestamp +if Tdiff>self.waitingtime then +local hasammo=self:GetAmmoStatus(truck.group) +if hasammo<=self.ammothreshold then +truck.statusquo=AMMOTRUCK.State.OUTOFAMMO +else +truck.statusquo=AMMOTRUCK.State.IDLE +end +end +end +return self +end +function AMMOTRUCK:CheckReturningTrucks(dataset) +self:T(self.lid.." CheckReturningTrucks") +local data=dataset +local tgtcoord=self.homezone:GetCoordinate() +local radius=self.homezone:GetRadius() +for _,_data in pairs(data)do +local truck=_data +local coord=truck.group:GetCoordinate() +local dist=coord:Get2DDistance(tgtcoord) +self:T({name=truck.name,radius=radius,distance=dist}) +if dist<=radius then +truck.statusquo=AMMOTRUCK.State.IDLE +truck.timestamp=timer.getAbsTime() +truck.coordinate=coord +truck.reloads=self.reloads or 5 +self:__TruckHome(1,truck) +end +end +return self +end +function AMMOTRUCK:FindTarget(name) +self:T(self.lid.." FindTarget") +local data=nil +local dataset=self.targetlist +for _,_entry in pairs(dataset)do +local entry=_entry +if entry.name==name then +data=entry +break +end +end +return data +end +function AMMOTRUCK:FindTruck(name) +self:T(self.lid.." FindTruck") +local data=nil +local dataset=self.trucklist +for _,_entry in pairs(dataset)do +local entry=_entry +if entry.name==name then +data=entry +break +end +end +return data +end +function AMMOTRUCK:CheckArrivedTrucks(dataset) +self:T(self.lid.." CheckArrivedTrucks") +local data=dataset +for _,_data in pairs(data)do +local truck=_data +truck.statusquo=AMMOTRUCK.State.UNLOADING +truck.timestamp=timer.getAbsTime() +self:__TruckUnloading(2,truck) +local aridata=self:FindTarget(truck.targetname) +if aridata then +aridata.statusquo=AMMOTRUCK.State.RELOADING +aridata.timestamp=timer.getAbsTime() +end +end +return self +end +function AMMOTRUCK:CheckUnloadingTrucks(dataset) +self:T(self.lid.." CheckUnloadingTrucks") +local data=dataset +for _,_data in pairs(data)do +local truck=_data +local Tnow=timer.getAbsTime() +local Tpassed=Tnow-truck.timestamp +local hasammo=self:GetAmmoStatus(truck.targetgroup) +if Tpassed>self.unloadtime and hasammo>self.ammothreshold then +truck.statusquo=AMMOTRUCK.State.RETURNING +truck.timestamp=timer.getAbsTime() +self:__TruckReturning(2,truck) +local aridata=self:FindTarget(truck.targetname) +if aridata then +aridata.statusquo=AMMOTRUCK.State.IDLE +aridata.timestamp=timer.getAbsTime() +end +end +end +return self +end +function AMMOTRUCK:CheckTargetsAlive() +self:T(self.lid.." CheckTargetsAlive") +local arilist=self.targetlist +for _,_ari in pairs(arilist)do +local ari=_ari +if ari.group and ari.group:IsAlive()then +else +self.targetlist[ari.name]=nil +end +end +local aritable=self.targetset:GetSetObjects() +for _,_ari in pairs(aritable)do +local ari=_ari +if ari and ari:IsAlive()and not self.targetlist[ari:GetName()]then +local name=ari:GetName() +local newari={} +newari.name=name +newari.group=ari +newari.statusquo=AMMOTRUCK.State.IDLE +newari.timestamp=timer.getAbsTime() +newari.coordinate=ari:GetCoordinate() +local hasammo=self:GetAmmoStatus(ari) +newari.ammo=hasammo +self.targetlist[name]=newari +end +end +return self +end +function AMMOTRUCK:CheckTrucksAlive() +self:T(self.lid.." CheckTrucksAlive") +local trucklist=self.trucklist +for _,_truck in pairs(trucklist)do +local truck=_truck +if truck.group and truck.group:IsAlive()then +else +local tgtname=truck.targetname +local targetdata=self:FindTarget(tgtname) +if targetdata then +if targetdata.statusquo~=AMMOTRUCK.State.IDLE then +targetdata.statusquo=AMMOTRUCK.State.IDLE +end +end +self.trucklist[truck.name]=nil +end +end +local trucktable=self.truckset:GetSetObjects() +for _,_truck in pairs(trucktable)do +local truck=_truck +if truck and truck:IsAlive()and not self.trucklist[truck:GetName()]then +local name=truck:GetName() +local newtruck={} +newtruck.name=name +newtruck.group=truck +if self.hasarmygroup then +if truck.ClassName and truck.ClassName=="GROUP"then +local trucker=ARMYGROUP:New(truck) +trucker:Activate() +newtruck.group=trucker +end +end +newtruck.statusquo=AMMOTRUCK.State.IDLE +newtruck.timestamp=timer.getAbsTime() +newtruck.coordinate=truck:GetCoordinate() +newtruck.reloads=self.reloads or 5 +self.trucklist[name]=newtruck +end +end +return self +end +function AMMOTRUCK:onafterStart(From,Event,To) +self:T({From,Event,To}) +if ARMYGROUP and self.usearmygroup then +self.hasarmygroup=true +else +self.hasarmygroup=false +end +if self.debug then +BASE:TraceOn() +BASE:TraceClass("AMMOTRUCK") +end +self:CheckTargetsAlive() +self:CheckTrucksAlive() +self:__Monitor(-30) +return self +end +function AMMOTRUCK:onafterMonitor(From,Event,To) +self:T({From,Event,To}) +self:CheckTargetsAlive() +self:CheckTrucksAlive() +local remunition=false +local remunitionqueue={} +local waitingtargets={} +for _,_ari in pairs(self.targetlist)do +local data=_ari +if data.group and data.group:IsAlive()then +data.ammo=self:GetAmmoStatus(data.group) +data.timestamp=timer.getAbsTime() +local text=string.format("Ari %s | Ammo %d | State %s",data.name,data.ammo,data.statusquo) +self:T(text) +if data.ammo<=self.ammothreshold and(data.statusquo==AMMOTRUCK.State.IDLE or data.statusquo==AMMOTRUCK.State.OUTOFAMMO)then +data.statusquo=AMMOTRUCK.State.OUTOFAMMO +remunitionqueue[#remunitionqueue+1]=data +remunition=true +elseif data.statusquo==AMMOTRUCK.State.WAITING then +waitingtargets[#waitingtargets+1]=data +end +else +self.targetlist[data.name]=nil +end +end +local idletrucks={} +local drivingtrucks={} +local unloadingtrucks={} +local arrivedtrucks={} +local returningtrucks={} +local found=false +for _,_truckdata in pairs(self.trucklist)do +local data=_truckdata +if data.group and data.group:IsAlive()then +local text=string.format("Truck %s | State %s",data.name,data.statusquo) +self:T(text) +if data.statusquo==AMMOTRUCK.State.IDLE then +idletrucks[#idletrucks+1]=data +found=true +elseif data.statusquo==AMMOTRUCK.State.DRIVING then +drivingtrucks[#drivingtrucks+1]=data +elseif data.statusquo==AMMOTRUCK.State.ARRIVED then +arrivedtrucks[#arrivedtrucks+1]=data +elseif data.statusquo==AMMOTRUCK.State.UNLOADING then +unloadingtrucks[#unloadingtrucks+1]=data +elseif data.statusquo==AMMOTRUCK.State.RETURNING then +returningtrucks[#returningtrucks+1]=data +if data.reloads>0 or data.reloads==-1 then +idletrucks[#idletrucks+1]=data +found=true +end +end +else +self.truckset[data.name]=nil +end +end +local n=0 +if found and remunition then +for _,_truckdata in pairs(idletrucks)do +local truckdata=_truckdata +local truckcoord=truckdata.group:GetCoordinate() +for _,_aridata in pairs(remunitionqueue)do +local aridata=_aridata +local aricoord=aridata.coordinate +local distance=truckcoord:Get2DDistance(aricoord) +if distance<=self.remunidist and aridata.statusquo==AMMOTRUCK.State.OUTOFAMMO and n<=#idletrucks then +n=n+1 +aridata.statusquo=AMMOTRUCK.State.REQUESTED +self:__RouteTruck(n*5,truckdata,aridata) +break +end +end +end +end +if#drivingtrucks>0 then +self:CheckDrivingTrucks(drivingtrucks) +end +if#arrivedtrucks>0 then +self:CheckArrivedTrucks(arrivedtrucks) +end +if#unloadingtrucks>0 then +self:CheckUnloadingTrucks(unloadingtrucks) +end +if#returningtrucks>0 then +self:CheckReturningTrucks(returningtrucks) +end +if#waitingtargets>0 then +self:CheckWaitingTargets(waitingtargets) +end +self:__Monitor(self.monitor) +return self +end +function AMMOTRUCK:onafterRouteTruck(From,Event,To,Truckdata,Aridata) +self:T({From,Event,To,Truckdata.name,Aridata.name}) +local truckdata=Truckdata +local aridata=Aridata +local tgtgrp=aridata.group +local tgtzone=ZONE_GROUP:New(aridata.name,tgtgrp,30) +local tgtcoord=tgtzone:GetRandomCoordinate(15) +if self.hasarmygroup then +local mission=AUFTRAG:NewONGUARD(tgtcoord) +local oldmission=truckdata.group:GetMissionCurrent() +if oldmission then oldmission:Cancel()end +mission:SetTime(5) +mission:SetTeleport(false) +truckdata.group:AddMission(mission) +elseif self.routeonroad then +truckdata.group:RouteGroundOnRoad(tgtcoord,30) +else +truckdata.group:RouteGroundTo(tgtcoord,30) +end +truckdata.statusquo=AMMOTRUCK.State.DRIVING +truckdata.targetgroup=tgtgrp +truckdata.targetname=aridata.name +truckdata.targetcoordinate=tgtcoord +aridata.statusquo=AMMOTRUCK.State.WAITING +aridata.timestamp=timer.getAbsTime() +return self +end +function AMMOTRUCK:onafterTruckUnloading(From,Event,To,Truckdata) +local m=MESSAGE:New("Truck "..Truckdata.name.." unloading!",15,"AmmoTruck"):ToCoalitionIf(self.coalition,self.debug) +local truck=Truckdata +local coord=truck.group:GetCoordinate() +local heading=truck.group:GetHeading() +heading=heading<180 and(360-heading)or(heading-180) +local cid=self.coalition==coalition.side.BLUE and country.id.USA or country.id.RUSSIA +cid=self.coalition==coalition.side.NEUTRAL and country.id.UN_PEACEKEEPERS or cid +local ammo={} +for i=1,5 do +ammo[i]=SPAWNSTATIC:NewFromType("ammo_cargo","Cargos",cid) +:InitCoordinate(coord:Translate((15+((i-1)*4)),heading)) +:Spawn(0,"AmmoCrate-"..math.random(1,10000)) +end +local function destroyammo(ammo) +for _,_crate in pairs(ammo)do +_crate:Destroy(false) +end +end +local scheduler=SCHEDULER:New(nil,destroyammo,{ammo},self.waitingtime) +if truck.reloads~=-1 then +truck.reloads=truck.reloads-1 +end +return self +end +function AMMOTRUCK:onafterTruckReturning(From,Event,To,Truck) +self:T({From,Event,To,Truck.name}) +local truckdata=Truck +local tgtzone=self.homezone +local tgtcoord=tgtzone:GetRandomCoordinate() +if self.hasarmygroup then +local mission=AUFTRAG:NewONGUARD(tgtcoord) +local oldmission=truckdata.group:GetMissionCurrent() +if oldmission then oldmission:Cancel()end +mission:SetTime(5) +mission:SetTeleport(false) +truckdata.group:AddMission(mission) +elseif self.routeonroad then +truckdata.group:RouteGroundOnRoad(tgtcoord,30,1,"Cone") +else +truckdata.group:RouteGroundTo(tgtcoord,30,"Cone",1) +end +return self +end +function AMMOTRUCK:onafterStop(From,Event,To) +self:T({From,Event,To}) +return self +end +AUTOLASE={ +ClassName="AUTOLASE", +lid="", +verbose=0, +alias="", +debug=false, +smokemenu=true, +RoundingPrecision=0, +increasegroundawareness=false, +MonitorFrequency=30, +} +AUTOLASE.version="0.1.31" +function AUTOLASE:New(RecceSet,Coalition,Alias,PilotSet) +BASE:T({RecceSet,Coalition,Alias,PilotSet}) +local self=BASE:Inherit(self,BASE:New()) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +elseif Coalition=="red"then +self.coalition=coalition.side.RED +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +else +self:E("ERROR: Unknown coalition in AUTOLASE!") +end +end +if Alias then +self.alias=tostring(Alias) +else +self.alias="Lion" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="Wolf" +elseif self.coalition==coalition.side.BLUE then +self.alias="Fox" +end +end +end +local self=BASE:Inherit(self,INTEL:New(RecceSet,Coalition,Alias)) +self.RecceSet=RecceSet +self.DetectVisual=true +self.DetectOptical=true +self.DetectRadar=true +self.DetectIRST=true +self.DetectRWR=true +self.DetectDLINK=true +self.LaserCodes=UTILS.GenerateLaserCodes() +self.LaseDistance=5000 +self.LaseDuration=300 +self.GroupsByThreat={} +self.UnitsByThreat={} +self.RecceNames={} +self.RecceLaserCode={} +self.RecceSmokeColor={} +self.RecceUnitNames={} +self.maxlasing=4 +self.CurrentLasing={} +self.lasingindex=0 +self.deadunitnotes={} +self.usepilotset=false +self.reporttimeshort=10 +self.reporttimelong=30 +self.smoketargets=false +self.smokecolor=SMOKECOLOR.Red +self.smokeoffset=nil +self.notifypilots=true +self.targetsperrecce={} +self.RecceUnits={} +self.forcecooldown=true +self.cooldowntime=60 +self.useSRS=false +self.SRSPath="" +self.SRSFreq=251 +self.SRSMod=radio.modulation.AM +self.NoMenus=false +self.minthreatlevel=0 +self.blacklistattributes={} +self:SetLaserCodes({1688,1130,4785,6547,1465,4578}) +self.playermenus={} +self.smokemenu=true +self.threatmenu=true +self.RoundingPrecision=0 +self.increasegroundawareness=false +self.MonitorFrequency=30 +self:EnableSmokeMenu({Angle=math.random(0,359),Distance=math.random(10,20)}) +self.lid=string.format("AUTOLASE %s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:AddTransition("*","Monitor","*") +self:AddTransition("*","Lasing","*") +self:AddTransition("*","TargetLost","*") +self:AddTransition("*","TargetDestroyed","*") +self:AddTransition("*","RecceKIA","*") +self:AddTransition("*","LaserTimeout","*") +self:AddTransition("*","Cancel","*") +if PilotSet then +self.usepilotset=true +self.pilotset=PilotSet +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +end +self:SetClusterAnalysis(false,false) +self:__Start(2) +self:__Monitor(math.random(5,10)) +return self +end +function AUTOLASE:SetMonitorFrequency(Seconds) +self.MonitorFrequency=Seconds or 30 +return self +end +function AUTOLASE:SetLaserCodes(LaserCodes) +self.LaserCodes=(type(LaserCodes)=="table")and LaserCodes or{LaserCodes} +return self +end +function AUTOLASE:EnableImproveGroundUnitsDetection() +self.increasegroundawareness=true +return self +end +function AUTOLASE:DisableImproveGroundUnitsDetection() +self.increasegroundawareness=false +return self +end +function AUTOLASE:SetPilotMenu() +if self.usepilotset then +local pilottable=self.pilotset:GetSetObjects()or{} +local grouptable={} +for _,_unit in pairs(pilottable)do +local Unit=_unit +if Unit and Unit:IsAlive()then +local Group=Unit:GetGroup() +local GroupName=Group:GetName()or"none" +local unitname=Unit:GetName() +if not grouptable[GroupName]==true then +if self.playermenus[unitname]then self.playermenus[unitname]:Remove()end +local lasetopm=MENU_GROUP:New(Group,"Autolase",nil) +self.playermenus[unitname]=lasetopm +local lasemenu=MENU_GROUP_COMMAND:New(Group,"Status",lasetopm,self.ShowStatus,self,Group,Unit) +if self.smokemenu then +local smoke=(self.smoketargets==true)and"off"or"on" +local smoketext=string.format("Switch smoke targets to %s",smoke) +local smokemenu=MENU_GROUP_COMMAND:New(Group,smoketext,lasetopm,self.SetSmokeTargets,self,(not self.smoketargets)) +end +if self.threatmenu then +local threatmenutop=MENU_GROUP:New(Group,"Set min lasing threat",lasetopm) +for i=0,10,2 do +local text="Threatlevel "..tostring(i) +local threatmenu=MENU_GROUP_COMMAND:New(Group,text,threatmenutop,self.SetMinThreatLevel,self,i) +end +end +for _,_grp in pairs(self.RecceSet.Set)do +local grp=_grp +local unit=grp:GetUnit(1) +if unit and unit:IsAlive()then +local name=unit:GetName() +local mname=string.gsub(name,".%d+.%d+$","") +local code=self:GetLaserCode(name) +local unittop=MENU_GROUP:New(Group,"Change laser code for "..mname,lasetopm) +for _,_code in pairs(self.LaserCodes)do +local text=tostring(_code) +if _code==code then text=text.."(*)"end +local changemenu=MENU_GROUP_COMMAND:New(Group,text,unittop,self.SetRecceLaserCode,self,name,_code,true) +end +end +end +grouptable[GroupName]=true +end +end +end +else +if not self.NoMenus then +self.Menu=MENU_COALITION_COMMAND:New(self.coalition,"Autolase",nil,self.ShowStatus,self) +end +end +return self +end +function AUTOLASE:_EventHandler(EventData) +self:SetPilotMenu() +return self +end +function AUTOLASE:SetMinThreatLevel(Level) +local level=Level or 0 +if level<0 or level>10 then level=0 end +self.minthreatlevel=level +return self +end +function AUTOLASE:AddBlackListAttributes(Attributes) +local attributes=Attributes +if type(attributes)~="table"then +attributes={attributes} +end +for _,_attr in pairs(attributes)do +table.insert(self.blacklistattributes,_attr) +end +return self +end +function AUTOLASE:GetLaserCode(RecceName) +local code=1688 +if self.RecceLaserCode[RecceName]==nil then +code=self.LaserCodes[math.random(#self.LaserCodes)] +self.RecceLaserCode[RecceName]=code +else +code=self.RecceLaserCode[RecceName] +end +return code +end +function AUTOLASE:GetSmokeColor(RecceName) +local color=self.smokecolor +if self.RecceSmokeColor[RecceName]==nil then +self.RecceSmokeColor[RecceName]=color +else +color=self.RecceSmokeColor[RecceName] +end +return color +end +function AUTOLASE:SetUsingSRS(OnOff,Path,Frequency,Modulation,Label,Gender,Culture,Port,Voice,Volume,PathToGoogleKey) +if OnOff then +self.useSRS=true +self.SRSPath=Path or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.SRSFreq=Frequency or 271 +self.SRSMod=Modulation or radio.modulation.AM +self.Gender=Gender or MSRS.gender or"male" +self.Culture=Culture or MSRS.culture or"en-US" +self.Port=Port or MSRS.port or 5002 +self.Voice=Voice +self.PathToGoogleKey=PathToGoogleKey +self.Volume=Volume or 1.0 +self.Label=Label +self.SRS=MSRS:New(self.SRSPath,self.SRSFreq,self.SRSMod) +self.SRS:SetCoalition(self.coalition) +self.SRS:SetLabel(self.MenuName or self.Name) +self.SRS:SetGender(self.Gender) +self.SRS:SetCulture(self.Culture) +self.SRS:SetPort(self.Port) +self.SRS:SetVoice(self.Voice) +self.SRS:SetCoalition(self.coalition) +self.SRS:SetVolume(self.Volume) +if self.PathToGoogleKey then +self.SRS:SetProviderOptionsGoogle(PathToGoogleKey,PathToGoogleKey) +self.SRS:SetProvider(MSRS.Provider.GOOGLE) +end +self.SRSQueue=MSRSQUEUE:New(self.alias) +else +self.useSRS=false +self.SRS=nil +self.SRSQueue=nil +end +return self +end +function AUTOLASE:SetMaxLasingTargets(Number) +self.maxlasing=Number or 4 +return self +end +function AUTOLASE:SetNotifyPilots(OnOff) +self.notifypilots=OnOff and true +return self +end +function AUTOLASE:SetRecceLaserCode(RecceName,Code,Refresh) +local code=Code or 1688 +self.RecceLaserCode[RecceName]=code +if Refresh then +self:SetPilotMenu() +if self.notifypilots then +if string.find(RecceName,"#")then +RecceName=string.match(RecceName,"^(.*)#") +end +self:NotifyPilots(string.format("Code for %s set to: %d",RecceName,Code),15) +end +end +return self +end +function AUTOLASE:SetRecceSmokeColor(RecceName,Color) +local color=Color or self.smokecolor +self.RecceSmokeColor[RecceName]=color +return self +end +function AUTOLASE:SetLaserCoolDown(OnOff,Seconds) +self.forcecooldown=OnOff and true +self.cooldowntime=Seconds or 60 +return self +end +function AUTOLASE:SetReportingTimes(long,short) +self.reporttimeshort=short or 10 +self.reporttimelong=long or 30 +return self +end +function AUTOLASE:SetLasingParameters(Distance,Duration) +self.LaseDistance=Distance or 5000 +self.LaseDuration=Duration or 300 +return self +end +function AUTOLASE:SetSmokeTargets(OnOff,Color) +self.smoketargets=OnOff +self.smokecolor=Color or SMOKECOLOR.Red +local smktxt=OnOff==true and"on"or"off" +local Message="Smoking targets is now "..smktxt.."!" +self:NotifyPilots(Message,10) +return self +end +function AUTOLASE:SetRoundingPrecsion(IDP) +self.RoundingPrecision=IDP or 0 +return self +end +function AUTOLASE:EnableSmokeMenu(Offset) +self.smokemenu=true +if Offset then +self.smokeoffset={} +self.smokeoffset.Distance=Offset.Distance or math.random(10,20) +self.smokeoffset.Angle=Offset.Angle or math.random(0,359) +end +return self +end +function AUTOLASE:DisableSmokeMenu() +self.smokemenu=false +self.smokeoffset=nil +return self +end +function AUTOLASE:EnableThreatLevelMenu() +self.threatmenu=true +return self +end +function AUTOLASE:DisableThreatLevelMenu() +self.threatmenu=false +return self +end +function AUTOLASE:GetLosFromUnit(Unit) +local lasedistance=self.LaseDistance +local unitheight=Unit:GetHeight() +local coord=Unit:GetCoordinate() +local landheight=coord:GetLandHeight() +local asl=unitheight-landheight +if asl>100 then +local absquare=lasedistance^2+asl^2 +lasedistance=math.sqrt(absquare) +end +return lasedistance +end +function AUTOLASE:CleanCurrentLasing() +local lasingtable=self.CurrentLasing +local newtable={} +local newreccecount={} +local lasing=0 +for _ind,_entry in pairs(lasingtable)do +local entry=_entry +if not newreccecount[entry.reccename]then +newreccecount[entry.reccename]=0 +end +end +for _,_recce in pairs(self.RecceSet:GetSetObjects())do +local recce=_recce +if recce and recce:IsAlive()then +local unit=recce:GetUnit(1) +local name=unit:GetName() +if not self.RecceUnits[name]then +local isground=(unit and unit.IsGround)and unit:IsGround()or false +self.RecceUnits[name]={name=name,unit=unit,cooldown=false,timestamp=timer.getAbsTime(),isground=isground} +end +end +end +for _ind,_entry in pairs(lasingtable)do +local entry=_entry +local valid=0 +local reccedead=false +local unitdead=false +local lostsight=false +local timeout=false +local Tnow=timer.getAbsTime() +local recce=entry.lasingunit +if recce and recce:IsAlive()then +valid=valid+1 +else +reccedead=true +self:__RecceKIA(2,entry.reccename) +end +local unit=entry.lasedunit +if unit and unit:IsAlive()==true then +valid=valid+1 +else +unitdead=true +if not self.deadunitnotes[entry.unitname]then +self.deadunitnotes[entry.unitname]=true +self:__TargetDestroyed(2,entry.unitname,entry.reccename) +end +end +if not reccedead and not unitdead then +if self:CanLase(recce,unit)then +valid=valid+1 +else +lostsight=true +entry.laserspot:LaseOff() +self:__TargetLost(2,entry.unitname,entry.reccename) +end +end +local timestamp=entry.timestamp +if Tnow-timestamp<self.LaseDuration and not lostsight then +valid=valid+1 +else +timeout=true +entry.laserspot:LaseOff() +self.RecceUnits[entry.reccename].cooldown=true +self.RecceUnits[entry.reccename].timestamp=timer.getAbsTime() +if not lostsight then +self:__LaserTimeout(2,entry.unitname,entry.reccename) +end +end +if valid==4 then +self.lasingindex=self.lasingindex+1 +newtable[self.lasingindex]=entry +newreccecount[entry.reccename]=newreccecount[entry.reccename]+1 +lasing=lasing+1 +end +end +self.CurrentLasing=newtable +self.targetsperrecce=newreccecount +return lasing +end +function AUTOLASE:ShowStatus(Group,Unit) +local report=REPORT:New("Autolase") +local reccetable=self.RecceSet:GetSetObjects() +for _,_recce in pairs(reccetable)do +if _recce and _recce:IsAlive()then +local unit=_recce:GetUnit(1) +local name=unit:GetName() +if string.find(name,"#")then +name=string.match(name,"^(.*)#") +end +local code=self:GetLaserCode(unit:GetName()) +report:Add(string.format("Recce %s has code %d",name,code)) +report:Add("---------------") +end +end +report:Add(string.format("Lasing min threat level %d",self.minthreatlevel)) +report:Add("---------------") +local lines=0 +for _ind,_entry in pairs(self.CurrentLasing)do +local entry=_entry +local reccename=entry.reccename +if string.find(reccename,"#")then +reccename=string.match(reccename,"^(.*)#") +end +local typename=entry.unittype +local code=entry.lasercode +local locationstring=entry.location +local playername=nil +if Unit and Unit:IsAlive()then +playername=Unit:GetPlayerName() +elseif Group and Group:IsAlive()then +playername=Group:GetPlayerName() +end +if playername then +local settings=_DATABASE:GetPlayerSettings(playername) +if settings then +self:T("Get Settings ok!") +if settings:IsA2G_MGRS()then +locationstring=entry.coordinate:ToStringMGRS(settings) +elseif settings:IsA2G_LL_DMS()then +locationstring=entry.coordinate:ToStringLLDMS(settings) +elseif settings:IsA2G_LL_DDM()then +locationstring=entry.coordinate:ToStringLLDDM(settings) +elseif settings:IsA2G_BR()then +local startcoordinate=Unit:GetCoordinate()or Group:GetCoordinate() +locationstring=entry.coordinate:ToStringBR(startcoordinate,settings,false,self.RoundingPrecision) +end +end +end +local text=string.format("+ %s lasing %s code %d\nat %s",reccename,typename,code,locationstring) +report:Add(text) +report:Add("---------------") +lines=lines+1 +end +if lines==0 then +report:Add("No targets!") +report:Add("---------------") +end +local reporttime=self.reporttimelong +if lines==0 then reporttime=self.reporttimeshort end +if Unit and Unit:IsAlive()then +local m=MESSAGE:New(report:Text(),reporttime,"Info"):ToUnit(Unit) +elseif Group and Group:IsAlive()then +local m=MESSAGE:New(report:Text(),reporttime,"Info"):ToGroup(Group) +else +local m=MESSAGE:New(report:Text(),reporttime,"Info"):ToCoalition(self.coalition) +end +return self +end +function AUTOLASE:NotifyPilots(Message,Duration) +if self.usepilotset then +local pilotset=self.pilotset:GetSetObjects() +for _,_pilot in pairs(pilotset)do +local pilot=_pilot +if pilot and pilot:IsAlive()then +local Group=pilot:GetGroup() +local m=MESSAGE:New(Message,Duration,"Autolase"):ToGroup(Group) +end +end +elseif not self.debug then +local m=MESSAGE:New(Message,Duration,"Autolase"):ToCoalition(self.coalition) +else +local m=MESSAGE:New(Message,Duration,"Autolase"):ToAll() +end +if self.debug then self:I(Message)end +return self +end +function AUTOLASE:NotifyPilotsWithSRS(Message) +if self.useSRS then +self.SRSQueue:NewTransmission(Message,nil,self.SRS,nil,2) +end +if self.debug then self:I(Message)end +return self +end +function AUTOLASE:CheckIsLased(unitname) +local outcome=false +for _,_laserspot in pairs(self.CurrentLasing)do +local spot=_laserspot +if spot.unitname==unitname then +outcome=true +break +end +end +return outcome +end +function AUTOLASE:CanLase(Recce,Unit) +local function HasNoBlackListAttribute(Unit) +local nogos=self.blacklistattributes or{} +local having=true +local unit=Unit +for _,_attribute in pairs(nogos)do +if unit:HasAttribute(_attribute)then +having=false +break +end +end +return having +end +local canlase=false +if Recce and Recce:IsAlive()==true then +local name=Recce:GetName() +local cooldown=self.RecceUnits[name].cooldown and self.forcecooldown +if cooldown then +local Tdiff=timer.getAbsTime()-self.RecceUnits[name].timestamp +if Tdiff<self.cooldowntime then +return false +else +self.RecceUnits[name].cooldown=false +end +end +local reccecoord=Recce:GetCoordinate() +local unitcoord=Unit:GetCoordinate() +local islos=reccecoord:IsLOS(unitcoord,2.5) +local distance=math.floor(reccecoord:Get3DDistance(unitcoord)) +local lasedistance=self:GetLosFromUnit(Recce) +if distance<=lasedistance and islos and HasNoBlackListAttribute(Unit)then +canlase=true +end +end +return canlase +end +function AUTOLASE:_Prescient() +for _,_data in pairs(self.RecceUnits)do +if _data.isground and _data.unit and _data.unit:IsAlive()then +local unit=_data.unit +local position=unit:GetCoordinate() +local needsinit=false +if position then +local lastposition=unit:GetProperty("lastposition") +if not lastposition then +unit:SetProperty("lastposition",position) +lastposition=position +needsinit=true +end +local dist=position:Get2DDistance(lastposition) +local TNow=timer.getAbsTime() +if dist>10 or needsinit==true or TNow-_data.timestamp>29 then +local hasunits,hasstatics,_,Units,Statics=position:ScanObjects(self.LaseDistance,true,true,false) +if hasunits then +self:T(self.lid.."Checking possibly visible UNITs for Recce "..unit:GetName()) +for _,_target in pairs(Units)do +local target=_target +if target and target:GetCoalition()~=self.coalition then +if unit:IsLOS(target)and(not target:IsUnitDetected(unit))then +unit:KnowUnit(target,true,true) +end +end +end +end +if hasstatics then +self:T(self.lid.."Checking possibly visible STATICs for Recce "..unit:GetName()) +for _,_static in pairs(Statics)do +local static=STATIC:Find(_static) +if static and static:GetCoalition()~=self.coalition and static:GetCoordinate()then +local IsLOS=position:IsLOS(static:GetCoordinate()) +if IsLOS then +unit:KnowUnit(static,true,true) +end +end +end +end +end +end +end +end +return self +end +function AUTOLASE:onbeforeMonitor(From,Event,To) +self:T({From,Event,To}) +if self.increasegroundawareness then +self:_Prescient() +end +self:UpdateIntel() +return self +end +function AUTOLASE:onafterMonitor(From,Event,To) +self:T({From,Event,To}) +local countlases=self:CleanCurrentLasing() +self:SetPilotMenu() +local detecteditems=self.Contacts or{} +local groupsbythreat={} +local report=REPORT:New("Detections") +local lines=0 +for _,_contact in pairs(detecteditems)do +local contact=_contact +local grp=contact.group +local coord=contact.position +local reccename=contact.recce or"none" +local threat=contact.threatlevel or 0 +local reccegrp=UNIT:FindByName(reccename) +if reccegrp then +local reccecoord=reccegrp:GetCoordinate() +local distance=math.floor(reccecoord:Get3DDistance(coord)) +local text=string.format("%s of %s | Distance %d km | Threatlevel %d",contact.attribute,contact.groupname,math.floor(distance/1000),contact.threatlevel) +report:Add(text) +self:T(text) +if self.debug then self:I(text)end +lines=lines+1 +local lasedistance=self:GetLosFromUnit(reccegrp) +if grp:IsGround()and lasedistance>=distance and threat>=self.minthreatlevel then +table.insert(groupsbythreat,{contact.group,contact.threatlevel}) +self.RecceNames[contact.groupname]=contact.recce +end +end +end +self.GroupsByThreat=groupsbythreat +if self.verbose>2 and lines>0 then +local m=MESSAGE:New(report:Text(),self.reporttimeshort,"Autolase"):ToAll() +end +table.sort(self.GroupsByThreat,function(a,b) +local aNum=a[2] +local bNum=b[2] +return aNum>bNum +end) +local unitsbythreat={} +for _,_entry in pairs(self.GroupsByThreat)do +local group=_entry[1] +if group and group:IsAlive()then +local units=group:GetUnits() +local reccename=self.RecceNames[group:GetName()] +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()then +local threat=unit:GetThreatLevel() +local coord=unit:GetCoordinate() +if threat>=self.minthreatlevel then +local unitname=unit:GetName() +if unit:HasAttribute("RADAR_BAND1_FOR_ARM")or unit:HasAttribute("RADAR_BAND2_FOR_ARM")or unit:HasAttribute("Optical Tracker")then +threat=11 +end +table.insert(unitsbythreat,{unit,threat}) +self.RecceUnitNames[unitname]=reccename +end +end +end +end +end +self.UnitsByThreat=unitsbythreat +table.sort(self.UnitsByThreat,function(a,b) +local aNum=a[2] +local bNum=b[2] +return aNum>bNum +end) +local unitreport=REPORT:New("Detected Units") +local lines=0 +for _,_entry in pairs(self.UnitsByThreat)do +local threat=_entry[2] +local unit=_entry[1] +local unitname=unit:GetName() +local text=string.format("Unit %s | Threatlevel %d | Detected by %s",unitname,threat,self.RecceUnitNames[unitname]) +unitreport:Add(text) +lines=lines+1 +self:T(text) +if self.debug then self:I(text)end +end +if self.verbose>2 and lines>0 then +local m=MESSAGE:New(unitreport:Text(),self.reporttimeshort,"Autolase"):ToAll() +end +for _,_detectingunit in pairs(self.RecceUnits)do +local reccename=_detectingunit.name +local recce=_detectingunit.unit +local reccecount=self.targetsperrecce[reccename]or 0 +local targets=0 +for _,_entry in pairs(self.UnitsByThreat)do +local unit=_entry[1] +local unitname=unit:GetName() +local canlase=self:CanLase(recce,unit) +if targets+reccecount<self.maxlasing and not self:CheckIsLased(unitname)and unit:IsAlive()and canlase then +targets=targets+1 +local code=self:GetLaserCode(reccename) +local spot=SPOT:New(recce) +spot:LaseOn(unit,code,self.LaseDuration) +local locationstring=unit:GetCoordinate():ToStringLLDDM() +if _SETTINGS:IsA2G_MGRS()then +local precision=_SETTINGS:GetMGRS_Accuracy() +local settings={} +settings.MGRS_Accuracy=precision +locationstring=unit:GetCoordinate():ToStringMGRS(settings) +elseif _SETTINGS:IsA2G_LL_DMS()then +locationstring=unit:GetCoordinate():ToStringLLDMS(_SETTINGS) +elseif _SETTINGS:IsA2G_BR()then +locationstring=unit:GetCoordinate():ToStringBULLS(self.coalition,_SETTINGS) +end +local laserspot={ +laserspot=spot, +lasedunit=unit, +lasingunit=recce, +lasercode=code, +location=locationstring, +timestamp=timer.getAbsTime(), +unitname=unitname, +reccename=reccename, +unittype=unit:GetTypeName(), +coordinate=unit:GetCoordinate(), +} +if self.smoketargets then +local coord=unit:GetCoordinate() +if self.smokeoffset then +coord:Translate(self.smokeoffset.Distance,self.smokeoffset.Angle,true,true) +end +local color=self:GetSmokeColor(reccename) +coord:Smoke(color) +end +self.lasingindex=self.lasingindex+1 +self.CurrentLasing[self.lasingindex]=laserspot +self:__Lasing(2,laserspot) +end +end +end +local nextloop=-self.MonitorFrequency or-30 +self:__Monitor(nextloop) +return self +end +function AUTOLASE:onbeforeRecceKIA(From,Event,To,RecceName) +self:T({From,Event,To,RecceName}) +if self.notifypilots or self.debug then +if string.find(RecceName,"#")then +RecceName=string.match(RecceName,"^(.*)#") +end +local text=string.format("Recce %s KIA!",RecceName) +self:NotifyPilots(text,self.reporttimeshort) +end +return self +end +function AUTOLASE:onbeforeTargetDestroyed(From,Event,To,UnitName,RecceName) +self:T({From,Event,To,UnitName,RecceName}) +if self.notifypilots or self.debug then +local text=string.format("Unit %s destroyed! Good job!",UnitName) +self:NotifyPilots(text,self.reporttimeshort) +end +return self +end +function AUTOLASE:onbeforeTargetLost(From,Event,To,UnitName,RecceName) +self:T({From,Event,To,UnitName,RecceName}) +if self.notifypilots or self.debug then +if string.find(RecceName,"#")then +RecceName=string.match(RecceName,"^(.*)#") +end +local text=string.format("%s lost sight of unit %s.",RecceName,UnitName) +self:NotifyPilots(text,self.reporttimeshort) +end +return self +end +function AUTOLASE:onbeforeLaserTimeout(From,Event,To,UnitName,RecceName) +self:T({From,Event,To,UnitName,RecceName}) +if self.notifypilots or self.debug then +if string.find(RecceName,"#")then +RecceName=string.match(RecceName,"^(.*)#") +end +local text=string.format("%s laser timeout on unit %s.",RecceName,UnitName) +self:NotifyPilots(text,self.reporttimeshort) +end +return self +end +function AUTOLASE:onbeforeLasing(From,Event,To,LaserSpot) +self:T({From,Event,To,LaserSpot.unittype}) +if self.notifypilots or self.debug then +local laserspot=LaserSpot +local name=laserspot.reccename if string.find(name,"#")then +name=string.match(name,"^(.*)#") +end +local text=string.format("%s is lasing %s code %d\nat %s",name,laserspot.unittype,laserspot.lasercode,laserspot.location) +self:NotifyPilots(text,self.reporttimeshort+5) +end +return self +end +function AUTOLASE:onbeforeCancel(From,Event,To) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self:__Stop(2) +return self +end +do +ZONE_GOAL_CARGO={ +ClassName="ZONE_GOAL_CARGO", +} +ZONE_GOAL_CARGO.States={} +function ZONE_GOAL_CARGO:New(Zone,Coalition) +local self=BASE:Inherit(self,ZONE_GOAL:New(Zone)) +self:F({Zone=Zone,Coalition=Coalition}) +self:SetCoalition(Coalition) +do +end +do +end +do +end +do +end +self:AddTransition("*","Guard","Guarded") +self:AddTransition("*","Empty","Empty") +self:AddTransition({"Guarded","Empty"},"Attack","Attacked") +self:AddTransition({"Guarded","Attacked","Empty"},"Capture","Captured") +return self +end +function ZONE_GOAL_CARGO:SetCoalition(Coalition) +self.Coalition=Coalition +end +function ZONE_GOAL_CARGO:GetCoalition() +return self.Coalition +end +function ZONE_GOAL_CARGO:GetCoalitionName() +if self.Coalition==coalition.side.BLUE then +return"Blue" +end +if self.Coalition==coalition.side.RED then +return"Red" +end +if self.Coalition==coalition.side.NEUTRAL then +return"Neutral" +end +return"" +end +function ZONE_GOAL_CARGO:IsGuarded() +local IsGuarded=self.Zone:IsAllInZoneOfCoalition(self.Coalition) +self:F({IsGuarded=IsGuarded}) +return IsGuarded +end +function ZONE_GOAL_CARGO:IsEmpty() +local IsEmpty=self.Zone:IsNoneInZone() +self:F({IsEmpty=IsEmpty}) +return IsEmpty +end +function ZONE_GOAL_CARGO:IsCaptured() +local IsCaptured=self.Zone:IsAllInZoneOfOtherCoalition(self.Coalition) +self:F({IsCaptured=IsCaptured}) +return IsCaptured +end +function ZONE_GOAL_CARGO:IsAttacked() +local IsAttacked=self.Zone:IsSomeInZoneOfCoalition(self.Coalition) +self:F({IsAttacked=IsAttacked}) +return IsAttacked +end +function ZONE_GOAL_CARGO:Mark() +local Coord=self.Zone:GetCoordinate() +local ZoneName=self:GetZoneName() +local State=self:GetState() +if self.MarkRed and self.MarkBlue then +self:F({MarkRed=self.MarkRed,MarkBlue=self.MarkBlue}) +Coord:RemoveMark(self.MarkRed) +Coord:RemoveMark(self.MarkBlue) +end +if self.Coalition==coalition.side.BLUE then +self.MarkBlue=Coord:MarkToCoalitionBlue("Guard Zone: "..ZoneName.."\nStatus: "..State) +self.MarkRed=Coord:MarkToCoalitionRed("Capture Zone: "..ZoneName.."\nStatus: "..State) +else +self.MarkRed=Coord:MarkToCoalitionRed("Guard Zone: "..ZoneName.."\nStatus: "..State) +self.MarkBlue=Coord:MarkToCoalitionBlue("Capture Zone: "..ZoneName.."\nStatus: "..State) +end +end +function ZONE_GOAL_CARGO:onenterGuarded() +if self.Coalition==coalition.side.BLUE then +else +end +self:Mark() +end +function ZONE_GOAL_CARGO:onenterCaptured() +local NewCoalition=self.Zone:GetCoalition() +self:F({NewCoalition=NewCoalition}) +self:SetCoalition(NewCoalition) +self:Mark() +end +function ZONE_GOAL_CARGO:onenterEmpty() +self:Mark() +end +function ZONE_GOAL_CARGO:onenterAttacked() +self:Mark() +end +function ZONE_GOAL_CARGO:onafterGuard() +if not self.SmokeScheduler then +self.SmokeScheduler=self:ScheduleRepeat(1,1,0.1,nil,self.StatusSmoke,self) +end +if not self.ScheduleStatusZone then +self.ScheduleStatusZone=self:ScheduleRepeat(15,15,0.1,nil,self.StatusZone,self) +end +end +function ZONE_GOAL_CARGO:IsCaptured() +local IsCaptured=self.Zone:IsAllInZoneOfOtherCoalition(self.Coalition) +self:F({IsCaptured=IsCaptured}) +return IsCaptured +end +function ZONE_GOAL_CARGO:IsAttacked() +local IsAttacked=self.Zone:IsSomeInZoneOfCoalition(self.Coalition) +self:F({IsAttacked=IsAttacked}) +return IsAttacked +end +function ZONE_GOAL_CARGO:StatusZone() +local State=self:GetState() +self:F({State=self:GetState()}) +self.Zone:Scan() +if State~="Guarded"and self:IsGuarded()then +self:Guard() +end +if State~="Empty"and self:IsEmpty()then +self:Empty() +end +if State~="Attacked"and self:IsAttacked()then +self:Attack() +end +if State~="Captured"and self:IsCaptured()then +self:Capture() +end +end +end +TIRESIAS={ +ClassName="TIRESIAS", +debug=false, +version=" 0.0.8", +Interval=20, +GroundSet=nil, +VehicleSet=nil, +AAASet=nil, +SAMSet=nil, +ExceptionSet=nil, +AAARange=60, +HeloSwitchRange=10, +PlaneSwitchRange=25, +SwitchAAA=true, +_cached_zones={}, +_cached_groupsets={}, +} +function TIRESIAS:New() +local self=BASE:Inherit(self,FSM:New()) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self.ExceptionSet=SET_GROUP:New() +self._cached_zones={} +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self.lid="TIRESIAS "..self.version.." | " +self:I(self.lid.."Managing ground groups!") +self:__Start(1) +return self +end +function TIRESIAS:SetActivationRanges(HeloMiles,PlaneMiles) +self.HeloSwitchRange=HeloMiles or 10 +self.PlaneSwitchRange=PlaneMiles or 25 +self._cached_zones={} +return self +end +function TIRESIAS:SetAAARanges(FiringRange,SwitchAAA) +self.AAARange=FiringRange or 60 +self.SwitchAAA=(SwitchAAA==false)and false or true +return self +end +function TIRESIAS:AddExceptionSet(Set) +self:T(self.lid.." AddExceptionSet") +if not self.ExceptionSet then +self.ExceptionSet=SET_GROUP:New() +end +local exceptions=self.ExceptionSet +local exception_data={ +type=" Exception", +exception=true, +} +Set:ForEachGroupAlive( +function(grp) +if grp:IsGround()and(not grp.Tiresias)then +grp.Tiresias=exception_data +exceptions:AddGroup(grp,true) +BASE:T(" TIRESIAS: Added exception group: "..grp:GetName()) +end +end +) +return self +end +function TIRESIAS._FilterNotAAA(Group) +local grp=Group +local is_air=grp:IsAir() +local is_ship=grp:IsShip() +local is_AAA=grp:IsAAA() +if is_air or grp:IsShip()then +return true +end +return not is_AAA +end +function TIRESIAS._FilterNotSAM(Group) +local grp=Group +local is_air=grp:IsGround() +local is_ship=grp:IsShip() +local is_SAM=grp:IsSAM() +if is_air or grp:IsShip()then +return true +end +return not is_SAM +end +function TIRESIAS._FilterAAA(Group) +local grp=Group +local is_ground=grp:IsGround() +if(not is_ground)or grp:IsShip()then +return false +end +return grp:IsAAA() +end +function TIRESIAS._FilterSAM(Group) +local grp=Group +local is_ground=grp:IsGround() +if(not is_ground)or grp:IsShip()then +return false +end +return grp:IsSAM() +end +function TIRESIAS:_InitGroups() +self:T(self.lid.." _InitGroups") +local EngageRange=self.AAARange +local SwitchAAA=self.SwitchAAA +local aaa_data_template={ +type=" AAA", +invisible=true, +range=EngageRange, +exception=false, +AIOff=SwitchAAA, +} +local vehicle_data_template={ +type=" Vehicle", +invisible=true, +AIOff=true, +exception=false, +} +local sam_data_template={ +type=" SAM", +invisible=true, +exception=false, +} +self.AAASet:ForEachGroupAlive( +function(grp) +local tiresias_data=grp.Tiresias +if not tiresias_data then +grp:OptionEngageRange(EngageRange) +grp:SetCommandInvisible(true) +if SwitchAAA then +grp:SetAIOff() +grp:EnableEmission(false) +end +grp.Tiresias=aaa_data_template +elseif not tiresias_data.exception==true then +if not tiresias_data.invisible==true then +grp:SetCommandInvisible(true) +tiresias_data.invisible=true +if SwitchAAA==true then +grp:SetAIOff() +grp:EnableEmission(false) +tiresias_data.AIOff=true +end +end +end +end +) +self.VehicleSet:ForEachGroupAlive( +function(grp) +local tiresias_data=grp.Tiresias +if not tiresias_data then +grp:SetAIOff() +grp:SetCommandInvisible(true) +grp.Tiresias=vehicle_data_template +elseif not tiresias_data.exception==true then +if not tiresias_data.invisible then +grp:SetCommandInvisible(true) +grp:SetAIOff() +tiresias_data.invisible=true +tiresias_data.AIOff=true +end +end +end +) +self.SAMSet:ForEachGroupAlive( +function(grp) +local tiresias_data=grp.Tiresias +if not tiresias_data then +grp:SetCommandInvisible(true) +grp.Tiresias=sam_data_template +elseif not tiresias_data.exception==true then +if not tiresias_data.invisible then +grp:SetCommandInvisible(true) +tiresias_data.invisible=true +end +end +end +) +return self +end +function TIRESIAS:_EventHandler(EventData) +self:T(string.format(" %s Event = %d",self.lid,EventData.id)) +local event=EventData +if event.id==EVENTS.PlayerEnterAircraft or event.id==EVENTS.PlayerEnterUnit then +local _group=event.IniGroup +if _group and _group:IsAlive()then +local radius=_group:IsHelicopter()and self.HeloSwitchRange or self.PlaneSwitchRange +self:_SwitchOnGroups(_group,radius) +end +end +return self +end +function TIRESIAS:_SwitchOnGroups(group,radius) +self:T(self.lid.." _SwitchOnGroups "..group:GetName().." Radius "..radius.." NM") +local group_name=group:GetName() +local cache_key=group_name.." _"..radius +local zone=self._cached_zones[cache_key] +if not zone then +zone=ZONE_GROUP:New(" Zone-"..group_name,group,UTILS.NMToMeters(radius)) +self._cached_zones[cache_key]=zone +else +zone:UpdateFromGroup(group) +end +zone:Scan({Object.Category.UNIT},{Unit.Category.GROUND_UNIT}) +local ground=zone:GetScannedSetGroup() +local count=ground:CountAlive() +if self.debug then +self:I(string.format(" There are %d groups around this plane or helo!",count)) +end +if count>0 then +local SwitchAAA=self.SwitchAAA +local group_coalition=group:GetCoalition() +ground:ForEachGroupAlive( +function(grp) +local tiresias_data=grp.Tiresias +if grp:GetCoalition()~=group_coalition +and tiresias_data +and tiresias_data.type +and not tiresias_data.exception==true then +if tiresias_data.invisible==true then +grp:SetCommandInvisible(false) +tiresias_data.invisible=false +end +local grp_type=tiresias_data.type +if grp_type=="Vehicle"and tiresias_data.AIOff==true then +grp:SetAIOn() +tiresias_data.AIOff=false +elseif SwitchAAA==true and grp_type=="AAA"and tiresias_data.AIOff==true then +grp:SetAIOn() +grp:EnableEmission(true) +tiresias_data.AIOff=false +end +else +BASE:T("TIRESIAS - This group "..tostring(grp:GetName()).." has not been initialized or is an exception!") +end +end +) +end +return self +end +function TIRESIAS:onafterStart(From,Event,To) +self:T({From,Event,To}) +local VehicleSet=SET_GROUP:New():FilterCategoryGround():FilterFunction(TIRESIAS._FilterNotAAA):FilterFunction(TIRESIAS._FilterNotSAM):FilterStart() +local AAASet=SET_GROUP:New():FilterCategoryGround():FilterFunction(TIRESIAS._FilterAAA):FilterStart() +local SAMSet=SET_GROUP:New():FilterCategoryGround():FilterFunction(TIRESIAS._FilterSAM):FilterStart() +local OpsGroupSet=SET_OPSGROUP:New():FilterActive(true):FilterStart() +self.FlightSet=SET_GROUP:New():FilterCategories({" plane"," helicopter"}):FilterStart() +local EngageRange=self.AAARange +local SwitchAAA=self.SwitchAAA +local ExceptionSet=self.ExceptionSet +local exception_data={ +type=" Exception", +exception=true, +} +local vehicle_data={ +type=" Vehicle", +invisible=true, +AIOff=true, +exception=false, +} +local aaa_data={ +type=" AAA", +invisible=true, +range=EngageRange, +exception=false, +AIOff=SwitchAAA, +} +local sam_data={ +type=" SAM", +invisible=true, +exception=false, +} +if ExceptionSet then +function ExceptionSet:OnAfterAdded(From,Event,To,ObjectName,Object) +BASE:I(" TIRESIAS: EXCEPTION Object Added: "..Object:GetName()) +if Object and Object:IsAlive()then +Object.Tiresias=exception_data +Object:SetAIOn() +Object:SetCommandInvisible(false) +Object:EnableEmission(true) +end +end +local OGS=OpsGroupSet:GetAliveSet() +for _,_OG in pairs(OGS or{})do +local OG=_OG +local grp=OG:GetGroup() +ExceptionSet:AddGroup(grp,true) +end +function OpsGroupSet:OnAfterAdded(From,Event,To,ObjectName,Object) +local grp=Object:GetGroup() +ExceptionSet:AddGroup(grp,true) +end +end +function VehicleSet:OnAfterAdded(From,Event,To,ObjectName,Object) +BASE:T(" TIRESIAS: VEHICLE Object Added: "..Object:GetName()) +if Object and Object:IsAlive()then +Object:SetAIOff() +Object:SetCommandInvisible(true) +Object.Tiresias=vehicle_data +end +end +function AAASet:OnAfterAdded(From,Event,To,ObjectName,Object) +if Object and Object:IsAlive()then +BASE:I(" TIRESIAS: AAA Object Added: "..Object:GetName()) +Object:OptionEngageRange(EngageRange) +Object:SetCommandInvisible(true) +if SwitchAAA then +Object:SetAIOff() +Object:EnableEmission(false) +end +Object.Tiresias=aaa_data +end +end +function SAMSet:OnAfterAdded(From,Event,To,ObjectName,Object) +if Object and Object:IsAlive()then +BASE:T(" TIRESIAS: SAM Object Added: "..Object:GetName()) +Object:SetCommandInvisible(true) +Object.Tiresias=sam_data +end +end +self.VehicleSet=VehicleSet +self.AAASet=AAASet +self.SAMSet=SAMSet +self.OpsGroupSet=OpsGroupSet +self:_InitGroups() +self:__Status(1) +return self +end +function TIRESIAS:onbeforeStatus(From,Event,To) +self:T({From,Event,To}) +return self:GetState()~=" Stopped" +end +function TIRESIAS:onafterStatus(From,Event,To) +self:T({From,Event,To}) +if self.debug then +local count=self.VehicleSet:CountAlive() +local AAAcount=self.AAASet:CountAlive() +local SAMcount=self.SAMSet:CountAlive() +self:I(string.format(" Overall: %d | Vehicles: %d | AAA: %d | SAM: %d", +count+AAAcount+SAMcount,count,AAAcount,SAMcount)) +end +self:_InitGroups() +local flight_count=self.FlightSet:CountAlive() +if flight_count>0 then +local Set=self.FlightSet:GetAliveSet() +local helo_range=self.HeloSwitchRange +local plane_range=self.PlaneSwitchRange +for _,_plane in pairs(Set or{})do +local plane=_plane +local radius=plane:IsHelicopter()and helo_range or plane_range +self:_SwitchOnGroups(plane,radius) +end +end +if self:GetState()~=" Stopped"then +self:__Status(self.Interval) +end +return self +end +function TIRESIAS:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self._cached_zones={} +return self +end +STRATEGO={ +ClassName="STRATEGO", +debug=false, +drawzone=false, +markzone=false, +version="0.3.1", +portweight=3, +POIweight=1, +maxrunways=3, +coalition=nil, +colors=nil, +airbasetable={}, +nonconnectedab={}, +easynames={}, +maxdist=150, +disttable={}, +routexists={}, +routefactor=5, +OpsZones={}, +NeutralBenefit=100, +Budget=0, +usebudget=false, +CaptureUnits=3, +CaptureThreatlevel=1, +CaptureObjectCategories={Object.Category.UNIT}, +ExcludeShips=true, +} +STRATEGO.Type={ +AIRBASE="AIRBASE", +PORT="PORT", +POI="POI", +FARP="FARP", +SHIP="SHIP", +} +function STRATEGO:New(Name,Coalition,MaxDist) +local self=BASE:Inherit(self,FSM:New()) +self.coalition=Coalition +self.coalitiontext=UTILS.GetCoalitionName(Coalition) +self.name=Name or"Hannibal" +self.maxdist=MaxDist or 150 +self.disttable={} +self.routexists={} +self.ExcludeShips=true +self.lid=string.format("STRATEGO %s %s | ",self.name,self.version) +self.bases=SET_AIRBASE:New():FilterOnce() +self.ports=SET_ZONE:New():FilterPrefixes("Port"):FilterOnce() +self.POIs=SET_ZONE:New():FilterPrefixes("POI"):FilterOnce() +self.colors={ +[1]={0,1,0}, +[2]={1,0,0}, +[3]={0,0,1}, +[4]={1,0.65,0}, +} +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Update","*") +self:AddTransition("*","NodeEvent","*") +self:AddTransition("Running","Stop","Stopped") +return self +end +function STRATEGO:onafterStart(From,Event,To) +self:T(self.lid.."Start") +self:AnalyseBases() +self:AnalysePOIs(self.ports,self.portweight,"PORT") +self:AnalysePOIs(self.POIs,self.POIweight,"POI") +for i=self.maxrunways,1,-1 do +self:AnalyseRoutes(i,i*self.routefactor,self.colors[(i%3)+1],i) +end +self:AnalyseUnconnected(self.colors[4]) +self:I(self.lid.."Advisory ready.") +self:__Update(180) +return self +end +function STRATEGO:onafterUpdate(From,Event,To) +self:T(self.lid.."Update") +self:UpdateNodeCoalitions() +if self:GetState()=="Running"then +self:__Update(180) +end +return self +end +function STRATEGO:SetUsingBudget(Usebudget,StartBudget) +self:T(self.lid.."SetUsingBudget") +self.usebudget=Usebudget +self.Budget=StartBudget +return self +end +function STRATEGO:SetDebug(Debug,DrawZones,MarkZones) +self:T(self.lid.."SetDebug") +self.debug=Debug +self.drawzone=DrawZones +self.markzone=MarkZones +return self +end +function STRATEGO:SetStrategoZone(Zone) +self.StrategoZone=Zone +return self +end +function STRATEGO:SetWeights(MaxRunways,PortWeight,POIWeight,RouteFactor) +self:T(self.lid.."SetWeights") +self.portweight=PortWeight or 3 +self.POIweight=POIWeight or 1 +self.maxrunways=MaxRunways or 3 +self.routefactor=RouteFactor or 5 +return self +end +function STRATEGO:SetNeutralBenefit(NeutralBenefit) +self:T(self.lid.."SetNeutralBenefit") +self.NeutralBenefit=NeutralBenefit or 100 +return self +end +function STRATEGO:SetCaptureOptions(CaptureUnits,CaptureThreatlevel,CaptureCategories) +self:T(self.lid.."SetCaptureOptions") +self.CaptureUnits=CaptureUnits or 3 +self.CaptureThreatlevel=CaptureThreatlevel or 1 +self.CaptureObjectCategories=CaptureCategories or{Object.Category.UNIT} +return self +end +function STRATEGO:AnalyseBases() +self:T(self.lid.."AnalyseBases") +local colors=self.colors +local debug=self.debug +local airbasetable=self.airbasetable +local nonconnectedab=self.nonconnectedab +local easynames=self.easynames +local zone=self.StrategoZone +self.bases:ForEach( +function(afb) +local ab=afb +local abvec2=ab:GetVec2() +if self.ExcludeShips and ab:IsShip()then return end +if zone~=nil then +if not zone:IsVec2InZone(abvec2)then +return +end +end +local abname=ab:GetName() +local runways=ab:GetRunways() +local numrwys=#runways +if numrwys>=1 then numrwys=numrwys*0.5 end +local abzone=ab:GetZone() +if not abzone then +abzone=ZONE_RADIUS:New(abname,ab:GetVec2(),500) +end +local coa=ab:GetCoalition() +if coa==nil then return end +coa=coa+1 +local abtype=STRATEGO.Type.AIRBASE +if ab:IsShip()then +numrwys=1 +abtype=STRATEGO.Type.SHIP +end +if ab:IsHelipad()then +numrwys=1 +abtype=STRATEGO.Type.FARP +end +local coord=ab:GetCoordinate() +if debug then +abzone:DrawZone(-1,colors[coa],1,colors[coa],0.3,1) +coord:TextToAll(tostring(numrwys),-1,{0,0,0},1,colors[coa],0.3,20) +end +local opszone=self:GetNewOpsZone(abname,coa-1) +local tbl={ +name=abname, +baseweight=numrwys, +weight=0, +coalition=coa-1, +port=false, +zone=abzone, +coord=coord, +type=abtype, +opszone=opszone, +connections=0, +} +airbasetable[abname]=tbl +nonconnectedab[abname]=true +local name=string.gsub(abname,"[%p%s]",".") +easynames[name]=abname +end +) +return self +end +function STRATEGO:UpdateNodeCoalitions() +self:T(self.lid.."UpdateNodeCoalitions") +local newtable={} +for _id,_data in pairs(self.airbasetable)do +local data=_data +if data.type==STRATEGO.Type.AIRBASE or data.type==STRATEGO.Type.FARP or data.type==STRATEGO.Type.SHIP then +data.coalition=AIRBASE:FindByName(data.name):GetCoalition()or 0 +else +data.coalition=data.opszone:GetOwner()or 0 +end +newtable[_id]=_data +end +self.airbasetable=nil +self.airbasetable=newtable +return self +end +function STRATEGO:GetNewOpsZone(Zone,Coalition) +self:T(self.lid.."GetNewOpsZone") +local opszone=OPSZONE:New(Zone,Coalition or 0) +opszone:SetCaptureNunits(self.CaptureUnits) +opszone:SetCaptureThreatlevel(self.CaptureThreatlevel) +opszone:SetObjectCategories(self.CaptureObjectCategories) +opszone:SetDrawZone(self.drawzone) +opszone:SetMarkZone(self.markzone) +opszone:Start() +local function Captured(opszone,coalition) +self:__NodeEvent(1,opszone,coalition) +end +function opszone:OnBeforeCaptured(From,Event,To,Coalition) +Captured(opszone,Coalition) +end +return opszone +end +function STRATEGO:AnalysePOIs(Set,Weight,Key) +self:T(self.lid.."AnalysePOIs") +local colors=self.colors +local debug=self.debug +local airbasetable=self.airbasetable +local nonconnectedab=self.nonconnectedab +local easynames=self.easynames +Set:ForEach( +function(port) +local zone=port +local zname=zone:GetName() +local coord=zone:GetCoordinate() +if debug then +zone:DrawZone(-1,colors[1],1,colors[1],0.3,1) +coord:TextToAll(tostring(Weight),-1,{0,0,0},1,colors[1],0.3,20) +end +local opszone=self:GetNewOpsZone(zone) +local tbl={ +name=zname, +baseweight=Weight, +weight=0, +coalition=coalition.side.NEUTRAL, +port=true, +zone=zone, +coord=coord, +type=Key, +opszone=opszone, +connections=0, +} +airbasetable[zname]=tbl +nonconnectedab[zname]=true +local name=string.gsub(zname,"[%p%s]",".") +easynames[name]=zname +end +) +return self +end +function STRATEGO:GetToFrom(StartPoint,EndPoint) +self:T(self.lid.."GetToFrom "..tostring(StartPoint).." "..tostring(EndPoint)) +local pstart=string.gsub(StartPoint,"[%p%s]",".") +local pend=string.gsub(EndPoint,"[%p%s]",".") +local fromto=pstart..";"..pend +local tofrom=pend..";"..pstart +return fromto,tofrom +end +function STRATEGO:GetRoutesFromNode(StartPoint) +self:T(self.lid.."GetRoutesFromNode") +local pstart=string.gsub(StartPoint,"[%p%s]",".") +local found=false +pstart=pstart..";" +local routes={} +local listed={} +for _,_data in pairs(self.routexists)do +if string.find(_data,pstart,1,true)and not listed[_data]then +local target=string.gsub(_data,pstart,"") +local fname=self.easynames[target] +table.insert(routes,fname) +found=true +listed[_data]=true +end +end +return found,routes +end +function STRATEGO:AddRoutesManually(Startpoint,Endpoint,Color,Linetype,Draw) +self:T(self.lid.."AddRoutesManually") +local fromto,tofrom=self:GetToFrom(Startpoint,Endpoint) +local startcoordinate=self.airbasetable[Startpoint].coord +local targetcoordinate=self.airbasetable[Endpoint].coord +local dist=UTILS.Round(targetcoordinate:Get2DDistance(startcoordinate),-2)/1000 +local color=Color or{136/255,0,1} +local linetype=Linetype or 5 +local data={ +start=Startpoint, +target=Endpoint, +dist=dist, +} +self.disttable[fromto]=data +self.disttable[tofrom]=data +table.insert(self.routexists,fromto) +table.insert(self.routexists,tofrom) +self.nonconnectedab[Endpoint]=false +self.nonconnectedab[Startpoint]=false +local factor=self.airbasetable[Startpoint].baseweight*self.routefactor +self.airbasetable[Startpoint].weight=self.airbasetable[Startpoint].weight+factor +self.airbasetable[Endpoint].weight=self.airbasetable[Endpoint].weight+factor +self.airbasetable[Endpoint].connections=self.airbasetable[Endpoint].connections+2 +self.airbasetable[Startpoint].connections=self.airbasetable[Startpoint].connections+2 +if self.debug or Draw then +startcoordinate:LineToAll(targetcoordinate,-1,color,1,linetype,nil,string.format("%dkm",dist)) +end +return self +end +function STRATEGO:AnalyseRoutes(tgtrwys,factor,color,linetype) +self:T(self.lid.."AnalyseRoutes") +for _,_ab in pairs(self.airbasetable)do +if _ab.baseweight>=1 then +local startpoint=_ab.name +local startcoord=_ab.coord +for _,_data in pairs(self.airbasetable)do +local fromto,tofrom=self:GetToFrom(startpoint,_data.name) +if _data.name==startpoint then +elseif _data.baseweight==tgtrwys and not(self.routexists[fromto]or self.routexists[tofrom])then +local tgtc=_data.coord +local dist=UTILS.Round(tgtc:Get2DDistance(startcoord),-2)/1000 +if dist<=self.maxdist then +local data={ +start=startpoint, +target=_data.name, +dist=dist, +} +self.disttable[fromto]=data +self.disttable[tofrom]=data +table.insert(self.routexists,fromto) +table.insert(self.routexists,tofrom) +self.nonconnectedab[_data.name]=false +self.nonconnectedab[startpoint]=false +self.airbasetable[startpoint].weight=self.airbasetable[startpoint].weight+factor +self.airbasetable[_data.name].weight=self.airbasetable[_data.name].weight+factor +self.airbasetable[startpoint].connections=self.airbasetable[startpoint].connections+1 +self.airbasetable[_data.name].connections=self.airbasetable[_data.name].connections+1 +if self.debug then +startcoord:LineToAll(tgtc,-1,color,1,linetype,nil,string.format("%dkm",dist)) +end +end +end +end +end +end +return self +end +function STRATEGO:AnalyseUnconnected(Color) +self:T(self.lid.."AnalyseUnconnected") +for _name,_noconnect in pairs(self.nonconnectedab)do +if _noconnect then +local startpoint=_name +local startcoord=self.airbasetable[_name].coord +local shortest=1000*1000 +local closest=nil +local closestcoord=nil +for _,_data in pairs(self.airbasetable)do +if _name~=_data.name then +local tgtc=_data.coord +local dist=UTILS.Round(tgtc:Get2DDistance(startcoord),-2)/1000 +if dist<shortest and self.nonconnectedab[_data.name]==false then +shortest=dist +closest=_data.name +closestcoord=tgtc +end +end +end +if closest then +if self.debug then +startcoord:LineToAll(closestcoord,-1,Color,1,3,nil,string.format("%dkm",shortest)) +end +self.airbasetable[startpoint].weight=self.airbasetable[startpoint].weight+1 +self.airbasetable[closest].weight=self.airbasetable[closest].weight+1 +self.airbasetable[startpoint].connections=self.airbasetable[startpoint].connections+2 +self.airbasetable[closest].connections=self.airbasetable[closest].connections+2 +local data={ +start=startpoint, +target=closest, +dist=shortest, +} +local fromto,tofrom=self:GetToFrom(startpoint,closest) +self.disttable[fromto]=data +self.disttable[tofrom]=data +table.insert(self.routexists,fromto) +table.insert(self.routexists,tofrom) +end +end +end +return self +end +function STRATEGO:GetHighestWeightNodes(Coalition) +self:T(self.lid.."GetHighestWeightNodes") +local weight=0 +local highest=0 +local highname=nil +local airbases={} +for _name,_data in pairs(self.airbasetable)do +local okay=true +if Coalition then +if _data.coalition~=Coalition then +okay=false +end +end +if _data.weight>=weight and okay then +weight=_data.weight +if not airbases[weight]then airbases[weight]={}end +table.insert(airbases[weight],_name) +end +if _data.weight>highest and okay then +highest=_data.weight +highname=_name +end +end +return airbases[weight],weight,highest,highname +end +function STRATEGO:GetNextHighestWeightNodes(Weight,Coalition) +self:T(self.lid.."GetNextHighestWeightNodes") +local weight=0 +local airbases={} +for _name,_data in pairs(self.airbasetable)do +local okay=true +if Coalition then +if _data.coalition~=Coalition then +okay=false +end +end +if _data.weight>=weight and _data.weight<Weight and okay then +weight=_data.weight +if not airbases[weight]then airbases[weight]={}end +table.insert(airbases[weight],_name) +end +end +return airbases[weight],weight +end +function STRATEGO:SetNodeWeight(Name,Weight) +self:T(self.lid.."SetNodeWeight") +if Name and Weight and self.airbasetable[Name]then +self.airbasetable[Name].weight=Weight or 0 +return true +else +return false +end +end +function STRATEGO:SetNodeBaseWeight(Name,Weight) +self:T(self.lid.."SetNodeBaseWeight") +if Name and Weight and self.airbasetable[Name]then +self.airbasetable[Name].baseweight=Weight or 0 +return true +else +return false +end +end +function STRATEGO:GetNodeWeight(Name) +self:T(self.lid.."GetNodeWeight") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].weight or 0 +else +return 0 +end +end +function STRATEGO:GetNodeBaseWeight(Name) +self:T(self.lid.."GetNodeBaseWeight") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].baseweight or 0 +else +return 0 +end +end +function STRATEGO:GetNodeCoalition(Name) +self:T(self.lid.."GetNodeCoalition") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].coalition or coalition.side.NEUTRAL +else +return coalition.side.NEUTRAL +end +end +function STRATEGO:GetNodeType(Name) +self:T(self.lid.."GetNodeType") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type +else +return nil +end +end +function STRATEGO:GetNodeZone(Name) +self:T(self.lid.."GetNodeZone") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].zone +else +return nil +end +end +function STRATEGO:GetNodeOpsZone(Name) +self:T(self.lid.."GetNodeOpsZone") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].opszone +else +return nil +end +end +function STRATEGO:GetNodeCoordinate(Name) +self:T(self.lid.."GetNodeCoordinate") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].coord +else +return nil +end +end +function STRATEGO:IsAirbase(Name) +self:T(self.lid.."IsAirbase") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type==STRATEGO.Type.AIRBASE +else +return false +end +end +function STRATEGO:IsPort(Name) +self:T(self.lid.."IsPort") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type==STRATEGO.Type.PORT +else +return false +end +end +function STRATEGO:IsPOI(Name) +self:T(self.lid.."IsPOI") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type==STRATEGO.Type.POI +else +return false +end +end +function STRATEGO:IsFARP(Name) +self:T(self.lid.."IsFARP") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type==STRATEGO.Type.FARP +else +return false +end +end +function STRATEGO:IsShip(Name) +self:T(self.lid.."IsShip") +if Name and self.airbasetable[Name]then +return self.airbasetable[Name].type==STRATEGO.Type.SHIP +else +return false +end +end +function STRATEGO:FindClosestConsolidationTarget(Startpoint,BaseWeight) +self:T(self.lid.."FindClosestConsolidationTarget for "..Startpoint.." Weight "..BaseWeight or 0) +local shortest=1000*1000 +local target=nil +local weight=0 +local coa=nil +if not BaseWeight then BaseWeight=self.maxrunways-1 end +local startpoint=string.gsub(Startpoint,"[%p%s]",".") +for _,_route in pairs(self.routexists)do +if string.find(_route,startpoint,1,true)then +local dist=self.disttable[_route].dist +local tname=string.gsub(_route,startpoint,"") +local tname=string.gsub(tname,";","") +local cname=self.easynames[tname] +local targetweight=self.airbasetable[cname].baseweight +coa=self.airbasetable[cname].coalition +if(dist<shortest)and(coa~=self.coalition)and(BaseWeight>=targetweight)then +self:T("Found Consolidation Target: "..cname) +shortest=dist +target=cname +weight=self.airbasetable[cname].weight +coa=coa +end +end +end +return shortest,target,weight,coa +end +function STRATEGO:FindClosestStrategicTarget(Startpoint,Weight) +self:T(self.lid.."FindClosestStrategicTarget for "..Startpoint.." Weight "..Weight or 0) +local shortest=1000*1000 +local target=nil +local weight=0 +local coa=nil +if not Weight then Weight=self.maxrunways end +local startpoint=string.gsub(Startpoint,"[%p%s]",".") +for _,_route in pairs(self.routexists)do +if string.find(_route,startpoint,1,true)then +local dist=self.disttable[_route].dist +local tname=string.gsub(_route,startpoint,"") +local tname=string.gsub(tname,";","") +local cname=self.easynames[tname] +local coa=self.airbasetable[cname].coalition +local tweight=self.airbasetable[cname].baseweight +local ttweight=self.airbasetable[cname].weight +if(dist<shortest)and(coa~=self.coalition)and(tweight>=Weight)then +self:T("Found Strategic Target: "..cname) +shortest=dist +target=cname +weight=self.airbasetable[cname].weight +coa=self.airbasetable[cname].coalition +end +end +end +return shortest,target,weight,coa +end +function STRATEGO:FindStrategicTargets() +self:T(self.lid.."FindStrategicTargets") +local targets={} +for _,_data in pairs(self.airbasetable)do +local data=_data +if data.coalition==self.coalition then +local dist,name,points,coa=self:FindClosestStrategicTarget(data.name,data.weight) +if points>0 then +self:T({dist=dist,name=name,points=points,coa=coa}) +end +if points~=0 then +local enemycoa=self.coalition==coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE +self:T("Enemycoa = "..enemycoa) +if coa==coalition.side.NEUTRAL then +local tdata={} +tdata.name=name +tdata.dist=dist +tdata.points=points+self.NeutralBenefit +tdata.coalition=coa +tdata.coalitionname=UTILS.GetCoalitionName(coa) +tdata.coordinate=self.airbasetable[name].coord +table.insert(targets,tdata) +else +local tdata={} +tdata.name=name +tdata.dist=dist +tdata.points=points +tdata.coalition=coa +tdata.coalitionname=UTILS.GetCoalitionName(coa) +tdata.coordinate=self.airbasetable[name].coord +table.insert(targets,tdata) +end +end +end +end +return targets +end +function STRATEGO:FindConsolidationTargets() +self:T(self.lid.."FindConsolidationTargets") +local targets={} +for _,_data in pairs(self.airbasetable)do +local data=_data +if data.coalition==self.coalition then +local dist,name,points,coa=self:FindClosestConsolidationTarget(data.name,self.maxrunways-1) +if points>0 then +self:T({dist=dist,name=name,points=points,coa=coa}) +end +if points~=0 then +local enemycoa=self.coalition==coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE +self:T("Enemycoa = "..enemycoa) +if coa==coalition.side.NEUTRAL then +local tdata={} +tdata.name=name +tdata.dist=dist +tdata.points=points+self.NeutralBenefit +tdata.coalition=coa +tdata.coalitionname=UTILS.GetCoalitionName(coa) +tdata.coordinate=self.airbasetable[name].coord +table.insert(targets,tdata) +else +local tdata={} +tdata.name=name +tdata.dist=dist +tdata.points=points +tdata.coalition=coa +tdata.coalitionname=UTILS.GetCoalitionName(coa) +tdata.coordinate=self.airbasetable[name].coord +table.insert(targets,tdata) +end +end +end +end +return targets +end +function STRATEGO:FindNeighborNodes(Name,Enemies,Friends) +self:T(self.lid.."FindNeighborNodes") +local neighbors={} +local name=string.gsub(Name,"[%p%s]",".") +local shortestdist=1000*1000 +local nearest=nil +for _route,_data in pairs(self.disttable)do +if string.find(_route,name,1,true)then +local dist=self.disttable[_route] +local tname=string.gsub(_route,name,"") +local tname=string.gsub(tname,";","") +local cname=self.easynames[tname] +if cname then +local encoa=self.coalition==coalition.side.BLUE and coalition.side.RED or coalition.side.BLUE +if Enemies==true then +if self.airbasetable[cname].coalition==encoa then +neighbors[cname]=dist +end +elseif Friends==true then +if self.airbasetable[cname].coalition~=encoa then +neighbors[cname]=dist +end +else +neighbors[cname]=dist +end +if neighbors[cname]and dist.dist<shortestdist then +shortestdist=dist.dist +nearest=cname +end +end +end +end +return neighbors,nearest,shortestdist +end +function STRATEGO:_GetNextClosest(Start,End,InRoute) +local ecoord=self.airbasetable[End].coord +local nodes,nearest=self:FindNeighborNodes(Start) +local closest=nil +local closedist=1000*1000 +for _name,_dist in pairs(nodes)do +local kcoord=self.airbasetable[_name].coord +local nnodes=self.airbasetable[_name].connections>2 and true or false +if _name==End then nnodes=true end +if kcoord~=nil and ecoord~=nil and nnodes==true and InRoute[_name]~=true then +local dist=math.floor((kcoord:Get2DDistance(ecoord)/1000)+0.5) +if(dist<closedist)then +closedist=dist +closest=_name +end +end +end +return closest +end +function STRATEGO:FindRoute(Start,End,Hops,Draw,Color,LineType,NoOptimize) +self:T(self.lid.."FindRoute") +local Route={} +local InRoute={} +local hops=Hops or 4 +local routecomplete=false +local reverse=false +local function Checker(neighbors) +for _name,_data in pairs(neighbors)do +if _name==End then +return End +end +end +return nil +end +local function DrawRoute(Route) +for i=1,#Route-1 do +local p1=Route[i] +local p2=Route[i+1] +local c1=self.airbasetable[p1].coord +local c2=self.airbasetable[p2].coord +local line=LineType or 6 +local color=Color or{0,0,0} +c1:LineToAll(c2,-1,color,1,line) +end +end +Route[#Route+1]=Start +InRoute[Start]=true +local nodes=self:FindNeighborNodes(Start) +local endpoint=Checker(nodes) +if endpoint then +Route[#Route+1]=endpoint +routecomplete=true +else +local spoint=Start +for i=1,hops do +local Next=self:_GetNextClosest(spoint,End,InRoute) +if Next~=nil then +Route[#Route+1]=Next +InRoute[Next]=true +local nodes=self:FindNeighborNodes(Next) +local endpoint=Checker(nodes) +if endpoint then +Route[#Route+1]=endpoint +routecomplete=true +break +else +spoint=Next +end +else +break +end +end +end +local function OptimizeRoute(Route) +local foundcut=false +local largestcut=0 +local cut={} +for i=1,#Route do +local found,nodes=self:GetRoutesFromNode(Route[i]) +for _,_name in pairs(nodes or{})do +for j=i+2,#Route do +if _name==Route[j]then +if j-i>largestcut then +largestcut=j-i +cut={i=i,j=j} +foundcut=true +end +end +end +end +end +if foundcut then +local newroute={} +for i=1,#Route do +if i<=cut.i or i>=cut.j then +table.insert(newroute,Route[i]) +end +end +return newroute +end +return Route,foundcut +end +if routecomplete==true and NoOptimize~=true then +local foundcut=true +while foundcut~=false do +Route,foundcut=OptimizeRoute(Route) +end +else +Route,routecomplete=self:FindRoute(End,Start,Hops,Draw,Color,LineType) +reverse=true +end +if(self.debug or Draw)then DrawRoute(Route)end +return Route,routecomplete,reverse +end +function STRATEGO:AddBudget(Number) +self:T(self.lid.."AddBudget") +self.Budget=self.Budget+Number +return self +end +function STRATEGO:SubtractBudget(Number) +self:T(self.lid.."SubtractBudget") +self.Budget=self.Budget-Number +return self +end +function STRATEGO:GetBudget() +self:T(self.lid.."GetBudget") +return self.Budget +end +function STRATEGO:FindAffordableStrategicTarget() +self:T(self.lid.."FindAffordableStrategicTarget") +local Stargets=self:FindStrategicTargets() +local budget=self.Budget +local ftarget=nil +local Targets={} +for _,_data in pairs(Stargets)do +local data=_data +self:T("Considering Strategic Target "..data.name) +if data.points<=budget then +table.insert(Targets,data) +self:T(self.lid.."Affordable strategic target: "..data.name) +end +end +if#Targets==0 then +self:T(self.lid.."No suitable target found!") +return nil +end +if#Targets>1 then +ftarget=Targets[math.random(1,#Targets)] +else +ftarget=Targets[1] +end +if ftarget then +self:T(self.lid.."Final affordable strategic target: "..ftarget.name) +return ftarget +else +return nil +end +end +function STRATEGO:FindAffordableConsolidationTarget() +self:T(self.lid.."FindAffordableConsolidationTarget") +local Ctargets=self:FindConsolidationTargets() +local budget=self.Budget +local ftarget=nil +local Targets={} +for _,_data in pairs(Ctargets)do +local data=_data +self:T("Considering Consolidation Target "..data.name) +if data.points<=budget then +table.insert(Targets,data) +self:T(self.lid.."Affordable consolidation target: "..data.name) +end +end +if#Targets==0 then +self:T(self.lid.."No suitable target found!") +return nil +end +if#Targets>1 then +ftarget=Targets[math.random(1,#Targets)] +else +ftarget=Targets[1] +end +if ftarget then +self:T(self.lid.."Final affordable consolidation target: "..ftarget.name) +return ftarget +else +return nil +end +end +function STRATEGO:_FloodNext(next,filled,unfilled) +local start=self:FindNeighborNodes(next) +for _name,_ in pairs(start)do +if filled[_name]~=true then +self:T("Flooding ".._name) +filled[_name]=true +unfilled[_name]=nil +self:_FloodNext(_name,filled,unfilled) +end +end +return self +end +function STRATEGO:_FloodFill(Start,ABTable) +self:T("Start = "..tostring(Start)) +if Start==nil then return end +local filled={} +local unfilled={} +if ABTable then +unfilled=ABTable +else +for _name,_ in pairs(self.airbasetable)do +unfilled[_name]=true +end +end +filled[Start]=true +unfilled[Start]=nil +local start=self:FindNeighborNodes(Start) +for _name,_ in pairs(start)do +if filled[_name]~=true then +self:T("Flooding ".._name) +filled[_name]=true +unfilled[_name]=nil +self:_FloodNext(_name,filled,unfilled) +end +end +return filled,unfilled +end +function STRATEGO:_FloodTest(connect,draw) +local function GetElastic(bases) +local vec2table={} +for _name,_ in pairs(bases)do +local coord=self.airbasetable[_name].coord +local vec2=coord:GetVec2() +table.insert(vec2table,vec2) +end +local zone=ZONE_ELASTIC:New("STRATEGO-Floodtest-"..math.random(1,10000),vec2table) +return zone +end +local function DrawElastic(filled,drawit) +local zone=GetElastic(filled) +if drawit then +zone:SetColor({1,1,1},1) +zone:SetDrawCoalition(-1) +zone:Update(1,true) +end +return zone +end +local _,_,weight,name=self:GetHighestWeightNodes() +local filled,unfilled=self:_FloodFill(name) +local allin=true +if table.length(unfilled)>0 then +MESSAGE:New("There is at least one node island!",15,"STRATEGO"):ToAllIf(self.debug):ToLog() +allin=false +if self.debug==true then +local zone1=DrawElastic(filled,draw) +local zone2=DrawElastic(unfilled,draw) +local vertices1=zone1:GetVerticiesVec2() +local vertices2=zone2:GetVerticiesVec2() +local corner1=nil +local corner2=nil +local mindist=math.huge +local found=false +for _,_edge in pairs(vertices1)do +for _,_edge2 in pairs(vertices2)do +local dist=UTILS.VecDist2D(_edge,_edge2) +if dist<mindist then +mindist=dist +corner1=_edge +corner2=_edge2 +found=true +end +end +end +if found then +local Corner=COORDINATE:NewFromVec2(corner1) +local Corner2=COORDINATE:NewFromVec2(corner2) +Corner:LineToAll(Corner2,-1,{1,1,1},1,1,true,"Island2Island") +local cornername +local cornername2 +for _name,_data in pairs(self.airbasetable)do +local zone=_data.zone +if zone:IsVec2InZone(corner1)then +cornername=_name +self:T("Corner1 = ".._name) +end +if zone:IsVec2InZone(corner2)then +cornername2=_name +self:T("Corner2 = ".._name) +end +if cornername and cornername2 and connect==true then +self:AddRoutesManually(cornername,cornername2,Color,Linetype,self.debug) +end +end +end +end +end +return allin,filled,unfilled +end +CLIENTWATCH={} +CLIENTWATCH.ClassName="CLIENTWATCH" +CLIENTWATCH.Debug=false +CLIENTWATCH.DebugEventData=false +CLIENTWATCH.lid=nil +CLIENTWATCHTools={} +CLIENTWATCH.version="1.0.1" +function CLIENTWATCH:New(client) +local self=BASE:Inherit(self,FSM:New()) +self:SetStartState("Idle") +self:AddTransition("*","Spawn","*") +self.FilterCoalition=nil +self.FilterCategory=nil +if not client then +if self.Debug then self:I({"New client instance created. ClientType = All clients"})end +self:HandleEvent(EVENTS.Birth) +function self:OnEventBirth(eventdata) +if(eventdata.IniCategory==0 or eventdata.IniCategory==1)and eventdata.IniPlayerName +and(not self.FilterCoalition or self.FilterCoalition==eventdata.IniCoalition) +and(not self.FilterCategory or self.FilterCategory==eventdata.IniCategory)then +if self.Debug then +self:I({"Client spawned in.",IniCategory=eventdata.IniCategory}) +end +local clientWatchDebug=self.Debug +local clientObject=CLIENTWATCHTools:_newClient(clientWatchDebug,eventdata) +self:Spawn(clientObject,eventdata) +end +end +elseif type(client)=="table"or type(client)=="string"then +if type(client)=="table"then +if client.ClassName=="CLIENT"then +if self.Debug then self:I({"New client instance created. ClientType = Wrapper.CLIENT",client})end +self.ClientName=client:GetName() +self:HandleEvent(EVENTS.Birth) +function self:OnEventBirth(eventdata) +if(eventdata.IniCategory==0 or eventdata.IniCategory==1)and eventdata.IniPlayerName +and(not self.FilterCoalition or self.FilterCoalition==eventdata.IniCoalition) +and(not self.FilterCategory or self.FilterCategory==eventdata.IniCategory)then +if self.ClientName==eventdata.IniUnitName then +if self.Debug then +self:I({"Client spawned in.",IniCategory=eventdata.IniCategory}) +end +local clientWatchDebug=self.Debug +local clientObject=CLIENTWATCHTools:_newClient(clientWatchDebug,eventdata) +self:Spawn(clientObject,eventdata) +end +end +end +else +if self.Debug then self:I({"New client instance created. ClientType = Multiple Prefixes",client})end +local tableValid=true +for _,entry in pairs(client)do +if type(entry)~="string"then +tableValid=false +self:E({"The base handler failed to start because at least one entry in param1's table is not a string!",InvalidEntry=entry}) +return nil +end +end +if tableValid then +self:HandleEvent(EVENTS.Birth) +function self:OnEventBirth(eventdata) +for _,entry in pairs(client)do +if(eventdata.IniCategory==0 or eventdata.IniCategory==1)and eventdata.IniPlayerName +and(not self.FilterCoalition or self.FilterCoalition==eventdata.IniCoalition) +and(not self.FilterCategory or self.FilterCategory==eventdata.IniCategory)then +if string.match(eventdata.IniUnitName,entry)or string.match(eventdata.IniGroupName,entry)then +if self.Debug then +self:I({"Client spawned in.",IniCategory=eventdata.IniCategory}) +end +local clientWatchDebug=self.Debug +local clientObject=CLIENTWATCHTools:_newClient(clientWatchDebug,eventdata) +self:Spawn(clientObject,eventdata) +break +end +end +end +end +end +end +else +if self.Debug then self:I({"New client instance created. ClientType = Single Prefix",client})end +self:HandleEvent(EVENTS.Birth) +function self:OnEventBirth(eventdata) +if(eventdata.IniCategory==0 or eventdata.IniCategory==1)and eventdata.IniPlayerName +and(not self.FilterCoalition or self.FilterCoalition==eventdata.IniCoalition) +and(not self.FilterCategory or self.FilterCategory==eventdata.IniCategory)then +if string.match(eventdata.IniUnitName,client)or string.match(eventdata.IniGroupName,client)then +if self.Debug then +self:I({"Client spawned in.",IniCategory=eventdata.IniCategory}) +end +local clientWatchDebug=self.Debug +local clientObject=CLIENTWATCHTools:_newClient(clientWatchDebug,eventdata) +self:Spawn(clientObject,eventdata) +end +end +end +end +else +self:E({"The base handler failed to start because param1 is not a CLIENT object or a prefix string!",param1=client}) +return nil +end +return self +end +function CLIENTWATCH:FilterByCoalition(value) +if value==1 or value=="red"then +self.FilterCoalition=1 +else +self.FilterCoalition=2 +end +return self +end +function CLIENTWATCH:FilterByCategory(value) +if value==1 or value=="helicopter"then +self.FilterCategory=1 +else +self.FilterCategory=0 +end +return self +end +function CLIENTWATCHTools:_newClient(clientWatchDebug,eventdata) +local self=BASE:Inherit(self,FSM:New()) +self:SetStartState("Alive") +self:AddTransition("Alive","Despawn","Dead") +self.Unit=eventdata.IniUnit +self.Group=self.Unit:GetGroup() +self.Client=self.Unit:GetClient() +self.PlayerName=self.Unit:GetPlayerName() +self.UnitName=self.Unit:GetName() +self.GroupName=self.Group:GetName() +self:AddTransition("*","Hit","*") +self:AddTransition("*","Kill","*") +self:AddTransition("*","Score","*") +self:AddTransition("*","Shot","*") +self:AddTransition("*","ShootingStart","*") +self:AddTransition("*","ShootingEnd","*") +self:AddTransition("*","Land","*") +self:AddTransition("*","Takeoff","*") +self:AddTransition("*","RunwayTakeoff","*") +self:AddTransition("*","RunwayTouch","*") +self:AddTransition("*","Refueling","*") +self:AddTransition("*","RefuelingStop","*") +self:AddTransition("*","PlayerLeaveUnit","*") +self:AddTransition("*","Crash","*") +self:AddTransition("*","Dead","*") +self:AddTransition("*","PilotDead","*") +self:AddTransition("*","UnitLost","*") +self:AddTransition("*","Ejection","*") +self:AddTransition("*","HumanFailure","*") +self:AddTransition("*","HumanAircraftRepairFinish","*") +self:AddTransition("*","HumanAircraftRepairStart","*") +self:AddTransition("*","EngineShutdown","*") +self:AddTransition("*","EngineStartup","*") +self:AddTransition("*","WeaponAdd","*") +self:AddTransition("*","WeaponDrop","*") +self:AddTransition("*","WeaponRearm","*") +self:HandleEvent(EVENTS.Hit) +self:HandleEvent(EVENTS.Kill) +self:HandleEvent(EVENTS.Score) +self:HandleEvent(EVENTS.Shot) +self:HandleEvent(EVENTS.ShootingStart) +self:HandleEvent(EVENTS.ShootingEnd) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.Takeoff) +self:HandleEvent(EVENTS.RunwayTakeoff) +self:HandleEvent(EVENTS.RunwayTouch) +self:HandleEvent(EVENTS.Refueling) +self:HandleEvent(EVENTS.RefuelingStop) +self:HandleEvent(EVENTS.PlayerLeaveUnit) +self:HandleEvent(EVENTS.Crash) +self:HandleEvent(EVENTS.Dead) +self:HandleEvent(EVENTS.PilotDead) +self:HandleEvent(EVENTS.UnitLost) +self:HandleEvent(EVENTS.Ejection) +self:HandleEvent(EVENTS.HumanFailure) +self:HandleEvent(EVENTS.HumanAircraftRepairFinish) +self:HandleEvent(EVENTS.HumanAircraftRepairStart) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.EngineStartup) +self:HandleEvent(EVENTS.WeaponAdd) +self:HandleEvent(EVENTS.WeaponDrop) +self:HandleEvent(EVENTS.WeaponRearm) +function self:OnEventHit(EventData) +if EventData.TgtUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered hit event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Hit(EventData) +end +end +function self:OnEventKill(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered kill event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Kill(EventData) +end +end +function self:OnEventScore(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered score event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Score(EventData) +end +end +function self:OnEventShot(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered shot event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Shot(EventData) +end +end +function self:OnEventShootingStart(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered shooting start event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:ShootingStart(EventData) +end +end +function self:OnEventShootingEnd(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered shooting end event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:ShootingEnd(EventData) +end +end +function self:OnEventLand(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered land event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Land(EventData) +end +end +function self:OnEventTakeoff(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered takeoff event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Takeoff(EventData) +end +end +function self:OnEventRunwayTakeoff(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered runway takeoff event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:RunwayTakeoff(EventData) +end +end +function self:OnEventRunwayTouch(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered runway touch event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:RunwayTouch(EventData) +end +end +function self:OnEventRefueling(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered refueling event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Refueling(EventData) +end +end +function self:OnEventRefuelingStop(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered refueling event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:RefuelingStop(EventData) +end +end +function self:OnEventPlayerLeaveUnit(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered leave unit event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:PlayerLeaveUnit(EventData) +self._deadRoutine() +end +end +function self:OnEventCrash(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered crash event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Crash(EventData) +self._deadRoutine() +end +end +function self:OnEventDead(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered dead event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Dead(EventData) +self._deadRoutine() +end +end +function self:OnEventPilotDead(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered pilot dead event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:PilotDead(EventData) +self._deadRoutine() +end +end +function self:OnEventUnitLost(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered unit lost event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:UnitLost(EventData) +self._deadRoutine() +end +end +function self:OnEventEjection(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered ejection event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:Ejection(EventData) +self._deadRoutine() +end +end +function self:OnEventHumanFailure(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered human failure event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:HumanFailure(EventData) +if not self.Unit:IsAlive()then +self._deadRoutine() +end +end +end +function self:OnEventHumanAircraftRepairFinish(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered repair finished event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:HumanAircraftRepairFinish(EventData) +end +end +function self:OnEventHumanAircraftRepairStart(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered repair start event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:HumanAircraftRepairStart(EventData) +end +end +function self:OnEventEngineShutdown(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered engine shutdown event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:EngineShutdown(EventData) +end +end +function self:OnEventEngineStartup(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered engine startup event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:EngineStartup(EventData) +end +end +function self:OnEventWeaponAdd(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered weapon add event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:WeaponAdd(EventData) +end +end +function self:OnEventWeaponDrop(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered weapon drop event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:WeaponDrop(EventData) +end +end +function self:OnEventWeaponRearm(EventData) +if EventData.IniUnitName==self.UnitName then +if clientWatchDebug then +self:I({"Client triggered weapon rearm event.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self:WeaponRearm(EventData) +end +end +self.FallbackTimer=TIMER:New(function() +if not self.Unit:IsAlive()then +if clientWatchDebug then +self:I({"Client is registered as dead without an event trigger. Running fallback dead routine.",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName}) +end +self._deadRoutine() +end +end) +self.FallbackTimer:Start(5,5) +function self._deadRoutine() +if clientWatchDebug then self:I({"Client dead routine triggered. Shutting down tracking...",Player=self.PlayerName,Group=self.GroupName,Unit=self.UnitName})end +self:UnHandleEvent(EVENTS.Hit) +self:UnHandleEvent(EVENTS.Kill) +self:UnHandleEvent(EVENTS.Score) +self:UnHandleEvent(EVENTS.Shot) +self:UnHandleEvent(EVENTS.ShootingStart) +self:UnHandleEvent(EVENTS.ShootingEnd) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.RunwayTakeoff) +self:UnHandleEvent(EVENTS.RunwayTouch) +self:UnHandleEvent(EVENTS.Refueling) +self:UnHandleEvent(EVENTS.RefuelingStop) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.UnitLost) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.HumanFailure) +self:UnHandleEvent(EVENTS.HumanAircraftRepairFinish) +self:UnHandleEvent(EVENTS.HumanAircraftRepairStart) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.EngineStartup) +self:UnHandleEvent(EVENTS.WeaponAdd) +self:UnHandleEvent(EVENTS.WeaponDrop) +self:UnHandleEvent(EVENTS.WeaponRearm) +self.FallbackTimer:Stop() +self:Despawn() +end +self:I({"Detected client spawn and applied internal functions and events.",PlayerName=self.PlayerName,UnitName=self.UnitName,GroupName=self.GroupName}) +return self +end +AIRBOSS={ +ClassName="AIRBOSS", +Debug=false, +lid=nil, +theatre=nil, +carrier=nil, +carriertype=nil, +carrierparam={}, +alias=nil, +airbase=nil, +waypoints={}, +currentwp=nil, +beacon=nil, +TACANon=nil, +TACANchannel=nil, +TACANmode=nil, +TACANmorse=nil, +ICLSon=nil, +ICLSchannel=nil, +ICLSmorse=nil, +LSORadio=nil, +LSOFreq=nil, +LSOModu=nil, +MarshalRadio=nil, +MarshalFreq=nil, +MarshalModu=nil, +TowerFreq=nil, +radiotimer=nil, +zoneCCA=nil, +zoneCCZ=nil, +players={}, +menuadded={}, +BreakEntry={}, +BreakEarly={}, +BreakLate={}, +Abeam={}, +Ninety={}, +Wake={}, +Final={}, +Groove={}, +Platform={}, +DirtyUp={}, +Bullseye={}, +defaultcase=nil, +case=nil, +defaultoffset=nil, +holdingoffset=nil, +recoverytimes={}, +flights={}, +Qpattern={}, +Qmarshal={}, +Qwaiting={}, +Qspinning={}, +RQMarshal={}, +RQLSO={}, +TQMarshal=0, +TQLSO=0, +Nmaxpattern=nil, +Nmaxmarshal=nil, +NmaxSection=nil, +NmaxStack=nil, +handleai=nil, +xtVoiceOvers=nil, +xtVoiceOversAI=nil, +tanker=nil, +Corientation=nil, +Corientlast=nil, +Cposition=nil, +defaultskill=nil, +adinfinitum=nil, +magvar=nil, +Tcollapse=nil, +recoverywindow=nil, +usersoundradio=nil, +Tqueue=nil, +dTqueue=nil, +dTstatus=nil, +menumarkzones=nil, +menusmokezones=nil, +playerscores=nil, +autosave=nil, +autosavefile=nil, +autosavepath=nil, +marshalradius=nil, +airbossnice=nil, +staticweather=nil, +windowcount=0, +LSOdT=nil, +senderac=nil, +radiorelayLSO=nil, +radiorelayMSH=nil, +turnintowind=nil, +detour=nil, +squadsetAI=nil, +excludesetAI=nil, +menusingle=nil, +collisiondist=nil, +holdtimestamp=nil, +Tmessage=nil, +soundfolder=nil, +soundfolderLSO=nil, +soundfolderMSH=nil, +despawnshutdown=nil, +dTbeacon=nil, +Tbeacon=nil, +LSOCall=nil, +MarshalCall=nil, +lowfuelAI=nil, +emergency=nil, +respawnAI=nil, +gle={}, +lue={}, +trapsheet=nil, +trappath=nil, +trapprefix=nil, +initialmaxalt=nil, +welcome=nil, +skipperMenu=nil, +skipperSpeed=nil, +skipperTime=nil, +skipperOffset=nil, +skipperUturn=nil, +} +AIRBOSS.AircraftCarrier={ +AV8B="AV8BNA", +HORNET="FA-18C_hornet", +A4EC="A-4E-C", +F14A="F-14A-135-GR", +F14B="F-14B", +F14A_AI="F-14A", +FA18C="F/A-18C", +T45C="T-45", +S3B="S-3B", +S3BTANKER="S-3B Tanker", +E2D="E-2C", +C2A="C2A_Greyhound", +RHINOE="FA-18E", +RHINOF="FA-18F", +GROWLER="EA-18G", +CORSAIR="F4U-1D", +CORSAIR_CW="F4U-1D CW", +} +AIRBOSS.CarrierType={ +ROOSEVELT="CVN_71", +LINCOLN="CVN_72", +WASHINGTON="CVN_73", +TRUMAN="CVN_75", +STENNIS="Stennis", +FORRESTAL="Forrestal", +ENTERPRISE66="USS Enterprise 1966", +ENTERPRISEMODERN="cvn-65", +VINSON="VINSON", +ESSEX="Essex", +BONHOMMERICHARD="USS Bon Homme Richard", +ESSEXSCB125="essex_scb125", +HERMES="HERMES81", +INVINCIBLE="hms_invincible", +TARAWA="LHA_Tarawa", +AMERICA="USS America LHA-6", +JCARLOS="L61", +CANBERRA="L02", +KUZNETSOV="KUZNECOW", +} +AIRBOSS.PatternStep={ +UNDEFINED="Undefined", +REFUELING="Refueling", +SPINNING="Spinning", +COMMENCING="Commencing", +HOLDING="Holding", +WAITING="Waiting for free Marshal stack", +PLATFORM="Platform", +ARCIN="Arc Turn In", +ARCOUT="Arc Turn Out", +DIRTYUP="Dirty Up", +BULLSEYE="Bullseye", +INITIAL="Initial", +BREAKENTRY="Break Entry", +EARLYBREAK="Early Break", +LATEBREAK="Late Break", +ABEAM="Abeam", +NINETY="Ninety", +WAKE="Wake", +FINAL="Turn Final", +GROOVE_XX="Groove X", +GROOVE_IM="Groove In the Middle", +GROOVE_IC="Groove In Close", +GROOVE_AR="Groove At the Ramp", +GROOVE_IW="Groove In the Wires", +GROOVE_IWs="Groove In the Wires stopped?", +GROOVE_AL="Groove Abeam Landing Spot", +GROOVE_LC="Groove Level Cross", +BOLTER="Bolter Pattern", +EMERGENCY="Emergency Landing", +DEBRIEF="Debrief", +} +AIRBOSS.GroovePos={ +X0="X0", +XX="XX", +IM="IM", +IC="IC", +AR="AR", +AL="AL", +LC="LC", +IW="IW", +} +AIRBOSS.Difficulty={ +EASY="Flight Student", +NORMAL="Naval Aviator", +HARD="TOPGUN Graduate", +} +AIRBOSS.MenuF10={} +AIRBOSS.MenuF10Root=nil +AIRBOSS.version="1.4.2" +function AIRBOSS:New(carriername,alias) +local self=BASE:Inherit(self,FSM:New()) +self:F2({carriername=carriername,alias=alias}) +self.carrier=UNIT:FindByName(carriername) +if self.carrier==nil then +local text=string.format("ERROR: Carrier unit %s could not be found! Make sure this UNIT is defined in the mission editor and check the spelling of the unit name carefully.",carriername) +MESSAGE:New(text,120):ToAll() +self:E(text) +return nil +end +self.lid=string.format("AIRBOSS %s | ",carriername) +self.theatre=env.mission.theatre +self:T2(self.lid..string.format("Theatre = %s.",tostring(self.theatre))) +self.carriertype=self.carrier:GetTypeName() +self.alias=alias or carriername +self.airbase=AIRBASE:FindByName(carriername) +self.beacon=BEACON:New(self.carrier) +self:_GetTowerFrequency() +self.playerscores={} +self:_InitWaypoints() +self.currentwp=1 +self:_PatrolRoute() +self:SetMarshalRadio() +self:SetAirbossRadio() +self:SetLSORadio() +self:SetLSOCallInterval() +self.radiotimer=SCHEDULER:New() +self:SetMagneticDeclination() +self:SetICLS() +self:SetTACAN() +self:SetBeaconRefresh() +self:SetMaxLandingPattern() +self:SetMaxMarshalStacks() +self:SetMaxSectionSize() +self:SetMaxSectionDistance() +self:SetMaxFlightsPerStack() +self:SetHandleAION() +self:SetExtraVoiceOvers(false) +self:SetExtraVoiceOversAI(false) +self:SetAirbossNiceGuy() +self:SetEmergencyLandings() +self:SetDespawnOnEngineShutdown(false) +self:SetRespawnAI(false) +self:SetStaticWeather() +self:SetRecoveryCase() +self:SetRecoveryTurnTime() +self:SetHoldingOffsetAngle() +self:SetMarshalRadius() +self:SetInitialMaxAlt() +self:SetDefaultPlayerSkill(AIRBOSS.Difficulty.EASY) +self:SetGlideslopeErrorThresholds() +self:SetLineupErrorThresholds() +self:SetCarrierControlledArea() +self:SetCarrierControlledZone() +self:SetPatrolAdInfinitum(true) +self:SetCollisionDistance() +self:SetQueueUpdateTime() +self:SetStatusUpdateTime() +self:SetDefaultMessageDuration() +self:SetMenuMarkZones() +self:SetMenuSmokeZones() +self:SetMenuSingleCarrier(false) +self:SetWelcomePlayers(true) +self.landingcoord=COORDINATE:New(0,0,0) +self.sterncoord=COORDINATE:New(0,0,0) +self.landingspotcoord=COORDINATE:New(0,0,0) +if self.carriertype==AIRBOSS.CarrierType.STENNIS then +self:_InitNimitz() +elseif self.carriertype==AIRBOSS.CarrierType.ROOSEVELT then +self:_InitNimitz() +elseif self.carriertype==AIRBOSS.CarrierType.LINCOLN then +self:_InitNimitz() +elseif self.carriertype==AIRBOSS.CarrierType.WASHINGTON then +self:_InitNimitz() +elseif self.carriertype==AIRBOSS.CarrierType.TRUMAN then +self:_InitNimitz() +elseif self.carriertype==AIRBOSS.CarrierType.FORRESTAL then +self:_InitForrestal() +elseif self.carriertype==AIRBOSS.CarrierType.ENTERPRISE66 then +self:_InitEnterprise() +elseif self.carriertype==AIRBOSS.CarrierType.ENTERPRISEMODERN then +self:_InitEnterprise() +elseif self.carriertype==AIRBOSS.CarrierType.VINSON then +self:_InitStennis() +elseif self.carriertype==AIRBOSS.CarrierType.ESSEX then +self:_InitEssex() +elseif self.carriertype==AIRBOSS.CarrierType.BONHOMMERICHARD then +self:_InitBonHommeRichard() +elseif self.carriertype==AIRBOSS.CarrierType.ESSEXSCB125 then +self:_InitEssexSCB125() +elseif self.carriertype==AIRBOSS.CarrierType.HERMES then +self:_InitHermes() +elseif self.carriertype==AIRBOSS.CarrierType.INVINCIBLE then +self:_InitInvincible() +elseif self.carriertype==AIRBOSS.CarrierType.TARAWA then +self:_InitTarawa() +elseif self.carriertype==AIRBOSS.CarrierType.AMERICA then +self:_InitAmerica() +elseif self.carriertype==AIRBOSS.CarrierType.JCARLOS then +self:_InitJcarlos() +elseif self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self:_InitCanberra() +elseif self.carriertype==AIRBOSS.CarrierType.KUZNETSOV then +self:_InitStennis() +else +self:E(self.lid..string.format("ERROR: Unknown carrier type %s!",tostring(self.carriertype))) +return nil +end +self:_InitVoiceOvers() +if false then +self.Debug=true +BASE:TraceOnOff(true) +BASE:TraceClass(self.ClassName) +BASE:TraceLevel(3) +end +if false then +local case=3 +self.holdingoffset=30 +self:_GetZoneGroove():SmokeZone(SMOKECOLOR.Red,5) +self:_GetZoneLineup():SmokeZone(SMOKECOLOR.Green,5) +self:_GetZoneBullseye(case):SmokeZone(SMOKECOLOR.White,45) +self:_GetZoneDirtyUp(case):SmokeZone(SMOKECOLOR.Orange,45) +self:_GetZoneArcIn(case):SmokeZone(SMOKECOLOR.Blue,45) +self:_GetZoneArcOut(case):SmokeZone(SMOKECOLOR.Blue,45) +self:_GetZonePlatform(case):SmokeZone(SMOKECOLOR.Blue,45) +self:_GetZoneCorridor(case):SmokeZone(SMOKECOLOR.Green,45) +self:_GetZoneHolding(case,1):SmokeZone(SMOKECOLOR.White,45) +self:_GetZoneHolding(case,2):SmokeZone(SMOKECOLOR.White,45) +self:_GetZoneInitial(case):SmokeZone(SMOKECOLOR.Orange,45) +self:_GetZoneCommence(case,1):SmokeZone(SMOKECOLOR.Red,45) +self:_GetZoneCommence(case,2):SmokeZone(SMOKECOLOR.Red,45) +self:_GetZoneAbeamLandingSpot():SmokeZone(SMOKECOLOR.Red,5) +self:_GetZoneLandingSpot():SmokeZone(SMOKECOLOR.Red,5) +end +if false then +local FB=self:GetFinalBearing(false) +local hdg=self:GetHeading(false) +local stern=self:_GetSternCoord() +local bow=stern:Translate(self.carrierparam.totlength,hdg,true) +local rwy=stern:Translate(self.carrierparam.rwylength,FB,true) +local function flareme() +self:GetCoordinate():FlareYellow() +stern:FlareYellow() +bow:FlareYellow() +local r1=stern:Translate(self.carrierparam.rwywidth*0.5,FB+90,true) +local r2=stern:Translate(self.carrierparam.rwywidth*0.5,FB-90,true) +rwy:FlareRed() +local cR=stern:Translate(self.carrierparam.totwidthstarboard,hdg+90,true) +local cL=stern:Translate(self.carrierparam.totwidthport,hdg-90,true) +if self.carrier:GetTypeName()~=AIRBOSS.CarrierType.INVINCIBLE or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.HERMES or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.TARAWA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.AMERICA or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.JCARLOS or self.carrier:GetTypeName()~=AIRBOSS.CarrierType.CANBERRA then +local w1=stern:Translate(self.carrierparam.wire1,FB,true) +local w2=stern:Translate(self.carrierparam.wire2,FB,true) +local w3=stern:Translate(self.carrierparam.wire3,FB,true) +local w4=stern:Translate(self.carrierparam.wire4,FB,true) +w1:FlareWhite() +w2:FlareYellow() +w3:FlareWhite() +w4:FlareYellow() +else +local ALSPT=self:_GetZoneAbeamLandingSpot() +ALSPT:FlareZone(FLARECOLOR.Red,5,nil,UTILS.FeetToMeters(120)) +local LSPT=self:_GetZoneLandingSpot() +LSPT:FlareZone(FLARECOLOR.Green,5,nil,self.carrierparam.deckheight) +local PLSC=self:_GetLandingSpotCoordinate() +PLSC:FlareWhite() +end +local cbox=self:_GetZoneCarrierBox() +local rbox=self:_GetZoneRunwayBox() +cbox:FlareZone(FLARECOLOR.Green,5,nil,self.carrierparam.deckheight) +rbox:FlareZone(FLARECOLOR.White,5,nil,self.carrierparam.deckheight) +end +SCHEDULER:New(nil,flareme,{},1,3,nil,180) +end +self:SetStartState("Stopped") +self:AddTransition("Stopped","Load","Stopped") +self:AddTransition("Stopped","Start","Idle") +self:AddTransition("*","Idle","Idle") +self:AddTransition("Idle","RecoveryStart","Recovering") +self:AddTransition("Recovering","RecoveryStop","Idle") +self:AddTransition("Recovering","RecoveryPause","Paused") +self:AddTransition("Paused","RecoveryUnpause","Recovering") +self:AddTransition("*","Status","*") +self:AddTransition("*","RecoveryCase","*") +self:AddTransition("*","PassingWaypoint","*") +self:AddTransition("*","LSOGrade","*") +self:AddTransition("*","Marshal","*") +self:AddTransition("*","Save","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function AIRBOSS:SetCarrierIllumination(Mode) +self.carrier:SetCarrierIlluminationMode(Mode) +return self +end +function AIRBOSS:SetWelcomePlayers(Switch) +self.welcome=Switch +return self +end +function AIRBOSS:SetCarrierControlledArea(Radius) +Radius=UTILS.NMToMeters(Radius or 50) +self.zoneCCA=ZONE_UNIT:New("Carrier Controlled Area",self.carrier,Radius) +return self +end +function AIRBOSS:SetCarrierControlledZone(Radius) +Radius=UTILS.NMToMeters(Radius or 5) +self.zoneCCZ=ZONE_UNIT:New("Carrier Controlled Zone",self.carrier,Radius) +return self +end +function AIRBOSS:SetCollisionDistance(Distance) +self.collisiondist=UTILS.NMToMeters(Distance or 5) +return self +end +function AIRBOSS:SetRecoveryCase(Case) +self.defaultcase=Case or 1 +self.case=self.defaultcase +return self +end +function AIRBOSS:SetHoldingOffsetAngle(Offset) +self.defaultoffset=Offset or 0 +self.holdingoffset=self.defaultoffset +return self +end +function AIRBOSS:SetMenuRecovery(Duration,WindOnDeck,Uturn,Offset) +self.skipperMenu=true +self.skipperTime=Duration or 30 +self.skipperSpeed=WindOnDeck or 25 +self.skipperOffset=Offset or 30 +if Uturn then +self.skipperUturn=true +else +self.skipperUturn=false +end +return self +end +function AIRBOSS:AddRecoveryWindow(starttime,stoptime,case,holdingoffset,turnintowind,speed,uturn) +local Tnow=timer.getAbsTime() +if starttime and type(starttime)=="number"then +starttime=UTILS.SecondsToClock(Tnow+starttime) +end +if stoptime and type(stoptime)=="number"then +stoptime=UTILS.SecondsToClock(Tnow+stoptime) +end +starttime=starttime or UTILS.SecondsToClock(Tnow) +local Tstart=UTILS.ClockToSeconds(starttime) +local Tstop=stoptime and UTILS.ClockToSeconds(stoptime)or Tstart+90*60 +if Tstart>Tstop then +self:E(string.format("ERROR: Recovery stop time %s lies before recovery start time %s! Recovery window rejected.",UTILS.SecondsToClock(Tstart),UTILS.SecondsToClock(Tstop))) +return self +end +if Tstop<=Tnow then +string.format("WARNING: Recovery stop time %s already over. Tnow=%s! Recovery window rejected.",UTILS.SecondsToClock(Tstop),UTILS.SecondsToClock(Tnow)) +return self +end +case=case or self.defaultcase +holdingoffset=holdingoffset or self.defaultoffset +if case==1 then +holdingoffset=0 +end +self.windowcount=self.windowcount+1 +local recovery={} +recovery.START=Tstart +recovery.STOP=Tstop +recovery.CASE=case +recovery.OFFSET=holdingoffset +recovery.OPEN=false +recovery.OVER=false +recovery.WIND=turnintowind +recovery.SPEED=speed or 20 +recovery.ID=self.windowcount +if uturn==nil or uturn==true then +recovery.UTURN=true +else +recovery.UTURN=false +end +table.insert(self.recoverytimes,recovery) +return recovery +end +function AIRBOSS:SetSquadronAI(SetGroup) +self.squadsetAI=SetGroup +return self +end +function AIRBOSS:SetExcludeAI(SetGroup) +self.excludesetAI=SetGroup +return self +end +function AIRBOSS:AddExcludeAI(Group) +self.excludesetAI=self.excludesetAI or SET_GROUP:New() +self.excludesetAI:AddGroup(Group) +return self +end +function AIRBOSS:CloseCurrentRecoveryWindow(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,self.CloseCurrentRecoveryWindow,self) +else +if self:IsRecovering()and self.recoverywindow and self.recoverywindow.OPEN then +self:RecoveryStop() +self.recoverywindow.OPEN=false +self.recoverywindow.OVER=true +self:DeleteRecoveryWindow(self.recoverywindow) +end +end +end +function AIRBOSS:DeleteAllRecoveryWindows(Delay) +for _,recovery in pairs(self.recoverytimes)do +self:I(self.lid..string.format("Deleting recovery window ID %s",tostring(recovery.ID))) +self:DeleteRecoveryWindow(recovery,Delay) +end +return self +end +function AIRBOSS:GetRecoveryWindowByID(id) +if id then +for _,_window in pairs(self.recoverytimes)do +local window=_window +if window and window.ID==id then +return window +end +end +end +return nil +end +function AIRBOSS:DeleteRecoveryWindow(Window,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,self.DeleteRecoveryWindow,self,Window) +else +for i,_recovery in pairs(self.recoverytimes)do +local recovery=_recovery +if Window and Window.ID==recovery.ID then +if Window.OPEN then +self:RecoveryStop() +else +table.remove(self.recoverytimes,i) +end +end +end +end +end +function AIRBOSS:SetRecoveryTurnTime(Interval) +self.dTturn=Interval or 300 +return self +end +function AIRBOSS:SetMPWireCorrection(Dcorr) +self.mpWireCorrection=Dcorr or 12 +return self +end +function AIRBOSS:SetQueueUpdateTime(TimeInterval) +self.dTqueue=TimeInterval or 30 +return self +end +function AIRBOSS:SetLSOCallInterval(TimeInterval) +self.LSOdT=TimeInterval or 4 +return self +end +function AIRBOSS:SetIntoWindLegacy(SwitchOn) +if SwitchOn==nil then +SwitchOn=true +end +self.intowindold=SwitchOn +return self +end +function AIRBOSS:SetAirbossNiceGuy(Switch) +if Switch==true or Switch==nil then +self.airbossnice=true +else +self.airbossnice=false +end +return self +end +function AIRBOSS:SetEmergencyLandings(Switch) +if Switch==true or Switch==nil then +self.emergency=true +else +self.emergency=false +end +return self +end +function AIRBOSS:SetDespawnOnEngineShutdown(Switch) +if Switch==true or Switch==nil then +self.despawnshutdown=true +else +self.despawnshutdown=false +end +return self +end +function AIRBOSS:SetRespawnAI(Switch) +if Switch==true or Switch==nil then +self.respawnAI=true +else +self.respawnAI=false +end +return self +end +function AIRBOSS:SetRefuelAI(LowFuelThreshold) +self.lowfuelAI=LowFuelThreshold or 10 +return self +end +function AIRBOSS:SetInitialMaxAlt(MaxAltitude) +self.initialmaxalt=UTILS.FeetToMeters(MaxAltitude or 1300) +return self +end +function AIRBOSS:SetSoundfilesFolder(FolderPath) +if FolderPath then +local lastchar=string.sub(FolderPath,-1) +if lastchar~="/"then +FolderPath=FolderPath.."/" +end +end +self.soundfolder=FolderPath +self:I(self.lid..string.format("Setting sound files folder to: %s",self.soundfolder)) +return self +end +function AIRBOSS:SetStatusUpdateTime(TimeInterval) +self.dTstatus=TimeInterval or 0.5 +return self +end +function AIRBOSS:SetDefaultMessageDuration(Duration) +self.Tmessage=Duration or 10 +return self +end +function AIRBOSS:SetGlideslopeErrorThresholds(_max,_min,High,HIGH,Low,LOW) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or +self.carriertype==AIRBOSS.CarrierType.HERMES or +self.carriertype==AIRBOSS.CarrierType.TARAWA or +self.carriertype==AIRBOSS.CarrierType.AMERICA or +self.carriertype==AIRBOSS.CarrierType.JCARLOS or +self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self.gle._max=_max or 0.7 +self.gle.High=High or 1.4 +self.gle.HIGH=HIGH or 1.9 +self.gle._min=_min or-0.5 +self.gle.Low=Low or-1.2 +self.gle.LOW=LOW or-1.5 +else +self.gle._max=_max or 0.4 +self.gle.High=High or 0.8 +self.gle.HIGH=HIGH or 1.5 +self.gle._min=_min or-0.3 +self.gle.Low=Low or-0.6 +self.gle.LOW=LOW or-0.9 +end +return self +end +function AIRBOSS:SetLineupErrorThresholds(_max,_min,Left,LeftMed,LEFT,Right,RightMed,RIGHT) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self.lue._max=_max or 1.8 +self.lue._min=_min or-1.8 +self.lue.Left=Left or-2.8 +self.lue.LeftMed=LeftMed or-3.8 +self.lue.LEFT=LEFT or-4.5 +self.lue.Right=Right or 2.8 +self.lue.RightMed=RightMed or 3.8 +self.lue.RIGHT=RIGHT or 4.5 +else +self.lue._max=_max or 0.5 +self.lue._min=_min or-0.5 +self.lue.Left=Left or-1.0 +self.lue.LeftMed=LeftMed or-2.0 +self.lue.LEFT=LEFT or-3.0 +self.lue.Right=Right or 1.0 +self.lue.RightMed=RightMed or 2.0 +self.lue.RIGHT=RIGHT or 3.0 +end +return self +end +function AIRBOSS:SetMarshalRadius(Radius) +self.marshalradius=UTILS.NMToMeters(Radius or 2.8) +return self +end +function AIRBOSS:SetMenuSingleCarrier(Switch) +if Switch==true or Switch==nil then +self.menusingle=true +else +self.menusingle=false +end +return self +end +function AIRBOSS:SetMenuMarkZones(Switch) +if Switch==nil or Switch==true then +self.menumarkzones=true +else +self.menumarkzones=false +end +return self +end +function AIRBOSS:SetMenuSmokeZones(Switch) +if Switch==nil or Switch==true then +self.menusmokezones=true +else +self.menusmokezones=false +end +return self +end +function AIRBOSS:SetTrapSheet(Path,Prefix) +if io then +self.trapsheet=true +self.trappath=Path +self.trapprefix=Prefix +else +self:E(self.lid.."ERROR: io is not desanitized. Cannot save trap sheet.") +end +return self +end +function AIRBOSS:SetStaticWeather(Switch) +if Switch==nil or Switch==true then +self.staticweather=true +else +self.staticweather=false +end +return self +end +function AIRBOSS:SetTACANoff() +self.TACANon=false +return self +end +function AIRBOSS:SetTACAN(Channel,Mode,MorseCode) +self.TACANchannel=Channel or 74 +self.TACANmode=Mode or"X" +self.TACANmorse=MorseCode or"STN" +self.TACANon=true +return self +end +function AIRBOSS:SetICLSoff() +self.ICLSon=false +return self +end +function AIRBOSS:SetICLS(Channel,MorseCode) +self.ICLSchannel=Channel or 1 +self.ICLSmorse=MorseCode or"STN" +self.ICLSon=true +return self +end +function AIRBOSS:SetBeaconRefresh(TimeInterval) +self.dTbeacon=TimeInterval or(20*60) +return self +end +function AIRBOSS:EnableSRS(PathToSRS,Port,Culture,Gender,Voice,GoogleCreds,Volume,AltBackend) +local Frequency=self.AirbossRadio.frequency +local Modulation=self.AirbossRadio.modulation +self.SRS=MSRS:New(PathToSRS,Frequency,Modulation,AltBackend) +self.SRS:SetCoalition(self:GetCoalition()) +self.SRS:SetCoordinate(self:GetCoordinate()) +self.SRS:SetCulture(Culture or"en-US") +self.SRS:SetGender(Gender or"male") +self.SRS:SetPort(Port or MSRS.port or 5002) +self.SRS:SetLabel(self.AirbossRadio.alias or"AIRBOSS") +self.SRS:SetCoordinate(self.carrier:GetCoordinate()) +self.SRS:SetVolume(Volume or 1) +if GoogleCreds then +self.SRS:SetGoogle(GoogleCreds) +end +if Voice then +self.SRS:SetVoice(Voice) +end +if(not Voice)and self.SRS and self.SRS:GetProvider()==MSRS.Provider.GOOGLE then +self.SRS.voice=MSRS.poptions["gcloud"].voice or MSRS.Voices.Google.Standard.en_US_Standard_B +end +self.SRSQ=MSRSQUEUE:New("AIRBOSS") +self.SRSQ:SetTransmitOnlyWithPlayers(true) +if not self.PilotRadio then +self:SetSRSPilotVoice() +end +return self +end +function AIRBOSS:SetLSORadio(Frequency,Modulation,Voice,Gender,Culture) +self.LSOFreq=(Frequency or 264) +Modulation=Modulation or"AM" +if Modulation=="FM"then +self.LSOModu=radio.modulation.FM +else +self.LSOModu=radio.modulation.AM +end +self.LSORadio={} +self.LSORadio.frequency=self.LSOFreq +self.LSORadio.modulation=self.LSOModu +self.LSORadio.alias="LSO" +self.LSORadio.voice=Voice +self.LSORadio.gender=Gender or"male" +self.LSORadio.culture=Culture or"en-US" +return self +end +function AIRBOSS:SetAirbossRadio(Frequency,Modulation,Voice,Gender,Culture) +self.AirbossFreq=Frequency or self:_GetTowerFrequency()or 127.5 +Modulation=Modulation or"AM" +if type(Modulation)=="table"then +self.AirbossModu=Modulation +else +if Modulation=="FM"then +self.AirbossModu=radio.modulation.FM +else +self.AirbossModu=radio.modulation.AM +end +end +self.AirbossRadio={} +self.AirbossRadio.frequency=self.AirbossFreq +self.AirbossRadio.modulation=self.AirbossModu +self.AirbossRadio.alias="AIRBOSS" +self.AirbossRadio.voice=Voice +self.AirbossRadio.gender=Gender or"male" +self.AirbossRadio.culture=Culture or"en-US" +return self +end +function AIRBOSS:SetMarshalRadio(Frequency,Modulation,Voice,Gender,Culture) +self.MarshalFreq=Frequency or 305 +Modulation=Modulation or"AM" +if Modulation=="FM"then +self.MarshalModu=radio.modulation.FM +else +self.MarshalModu=radio.modulation.AM +end +self.MarshalRadio={} +self.MarshalRadio.frequency=self.MarshalFreq +self.MarshalRadio.modulation=self.MarshalModu +self.MarshalRadio.alias="MARSHAL" +self.MarshalRadio.voice=Voice +self.MarshalRadio.gender=Gender or"male" +self.MarshalRadio.culture=Culture or"en-US" +return self +end +function AIRBOSS:SetRadioUnitName(unitname) +self.senderac=unitname +return self +end +function AIRBOSS:SetRadioRelayLSO(unitname) +self.radiorelayLSO=unitname +return self +end +function AIRBOSS:SetRadioRelayMarshal(unitname) +self.radiorelayMSH=unitname +return self +end +function AIRBOSS:SetUserSoundRadio() +self.usersoundradio=true +return self +end +function AIRBOSS:SoundCheckLSO(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,AIRBOSS.SoundCheckLSO,self) +else +local text="Playing LSO sound files:" +for _name,_call in pairs(self.LSOCall)do +local call=_call +text=text..string.format("\nFile=%s.%s, duration=%.2f sec, loud=%s, subtitle=\"%s\".",call.file,call.suffix,call.duration,tostring(call.loud),call.subtitle) +self:RadioTransmission(self.LSORadio,call,false) +if call.loud then +self:RadioTransmission(self.LSORadio,call,true) +end +end +self:T(self.lid..text) +end +end +function AIRBOSS:SoundCheckMarshal(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,AIRBOSS.SoundCheckMarshal,self) +else +local text="Playing Marshal sound files:" +for _name,_call in pairs(self.MarshalCall)do +local call=_call +text=text..string.format("\nFile=%s.%s, duration=%.2f sec, loud=%s, subtitle=\"%s\".",call.file,call.suffix,call.duration,tostring(call.loud),call.subtitle) +self:RadioTransmission(self.MarshalRadio,call,false) +if call.loud then +self:RadioTransmission(self.MarshalRadio,call,true) +end +end +self:T(self.lid..text) +end +end +function AIRBOSS:SetMaxLandingPattern(nmax) +nmax=nmax or 4 +nmax=math.max(nmax,1) +nmax=math.min(nmax,6) +self.Nmaxpattern=nmax +return self +end +function AIRBOSS:SetMaxMarshalStacks(nmax) +self.Nmaxmarshal=nmax or 3 +self.Nmaxmarshal=math.max(self.Nmaxmarshal,1) +return self +end +function AIRBOSS:SetMaxSectionSize(nmax) +nmax=nmax or 2 +nmax=math.max(nmax,1) +nmax=math.min(nmax,4) +self.NmaxSection=nmax-1 +return self +end +function AIRBOSS:SetMaxSectionDistance(dmax) +if dmax then +if dmax<10 then +dmax=10 +elseif dmax>5000 then +dmax=5000 +end +end +self.maxsectiondistance=dmax or 100 +return self +end +function AIRBOSS:SetMaxFlightsPerStack(nmax) +nmax=nmax or 2 +nmax=math.max(nmax,1) +nmax=math.min(nmax,4) +self.NmaxStack=nmax +return self +end +function AIRBOSS:SetHandleAION() +self.handleai=true +return self +end +function AIRBOSS:SetExtraVoiceOvers(status) +self.xtVoiceOvers=status +return self +end +function AIRBOSS:SetExtraVoiceOversAI(status) +self.xtVoiceOversAI=status +return self +end +function AIRBOSS:SetHandleAIOFF() +self.handleai=false +return self +end +function AIRBOSS:SetRecoveryTanker(recoverytanker) +self.tanker=recoverytanker +return self +end +function AIRBOSS:SetAWACS(awacs) +self.awacs=awacs +return self +end +function AIRBOSS:SetDefaultPlayerSkill(skill) +self.defaultskill=skill or AIRBOSS.Difficulty.NORMAL +local gotit=false +for _,_skill in pairs(AIRBOSS.Difficulty)do +if _skill==self.defaultskill then +gotit=true +end +end +if not gotit then +self.defaultskill=AIRBOSS.Difficulty.NORMAL +self:E(self.lid..string.format("ERROR: Invalid default skill = %s. Resetting to Naval Aviator.",tostring(skill))) +end +return self +end +function AIRBOSS:SetAutoSave(path,filename) +self.autosave=true +self.autosavepath=path +self.autosavefile=filename +return self +end +function AIRBOSS:SetDebugModeON() +self.Debug=true +return self +end +function AIRBOSS:SetPatrolAdInfinitum(switch) +if switch==false then +self.adinfinitum=false +else +self.adinfinitum=true +end +return self +end +function AIRBOSS:SetMagneticDeclination(declination) +self.magvar=declination or UTILS.GetMagneticDeclination() +return self +end +function AIRBOSS:SetDebugModeOFF() +self.Debug=false +return self +end +function AIRBOSS:SetFunkManOn(Port,Host) +self.funkmanSocket=SOCKET:New(Port,Host) +return self +end +function AIRBOSS:GetNextRecoveryTime(InSeconds) +if self.recoverywindow then +if InSeconds then +return self.recoverywindow.START,self.recoverywindow.STOP +else +return UTILS.SecondsToClock(self.recoverywindow.START),UTILS.SecondsToClock(self.recoverywindow.STOP) +end +else +if InSeconds then +return-1,-1 +else +return"?","?" +end +end +end +function AIRBOSS:IsRecovering() +return self:is("Recovering") +end +function AIRBOSS:IsIdle() +return self:is("Idle") +end +function AIRBOSS:IsPaused() +return self:is("Paused") +end +function AIRBOSS:_ActivateBeacons() +self:T(self.lid..string.format("Activating Beacons (TACAN=%s, ICLS=%s)",tostring(self.TACANon),tostring(self.ICLSon))) +if self.TACANon then +self:I(self.lid..string.format("Activating TACAN Channel %d%s (%s)",self.TACANchannel,self.TACANmode,self.TACANmorse)) +self.beacon:ActivateTACAN(self.TACANchannel,self.TACANmode,self.TACANmorse,true) +end +if self.ICLSon then +self:I(self.lid..string.format("Activating ICLS Channel %d (%s)",self.ICLSchannel,self.ICLSmorse)) +self.beacon:ActivateICLS(self.ICLSchannel,self.ICLSmorse) +end +self.Tbeacon=timer.getTime() +end +function AIRBOSS:onafterStart(From,Event,To) +self:I(self.lid..string.format("Starting AIRBOSS v%s for carrier unit %s of type %s on map %s",AIRBOSS.version,self.carrier:GetName(),self.carriertype,self.theatre)) +self:_ActivateBeacons() +self.Cposition=self:GetCoordinate() +self.Corientation=self.carrier:GetOrientationX() +self.Corientlast=self.Corientation +self.Tpupdate=timer.getTime() +if#self.recoverytimes==0 and false then +local Topen=timer.getAbsTime()+15*60 +local Tclose=Topen+3*60*60 +self:AddRecoveryWindow(UTILS.SecondsToClock(Topen),UTILS.SecondsToClock(Tclose)) +end +self:_CheckRecoveryTimes() +self.Tqueue=timer.getTime()-60 +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.RunwayTouch) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.Takeoff) +self:HandleEvent(EVENTS.Crash) +self:HandleEvent(EVENTS.Ejection) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._PlayerLeft) +self:HandleEvent(EVENTS.MissionEnd) +self:HandleEvent(EVENTS.RemoveUnit) +self.StatusTimer=TIMER:New(self._Status,self):Start(2,0.5) +self:__Status(1) +end +function AIRBOSS:onafterStatus(From,Event,To) +local time=timer.getTime() +if time-self.Tqueue>self.dTqueue then +local clock=UTILS.SecondsToClock(timer.getAbsTime()) +local eta=UTILS.SecondsToClock(self:_GetETAatNextWP()) +local hdg=self:GetHeading() +local pos=self:GetCoordinate() +local speed=self.carrier:GetVelocityKNOTS() +if require then +self.magvar=pos:GetMagneticDeclination() +end +local collision=false +local holdtime=0 +if self.holdtimestamp then +holdtime=timer.getTime()-self.holdtimestamp +end +local NextWP=self:_GetNextWaypoint() +local ExpectedSpeed=UTILS.MpsToKnots(NextWP:GetVelocity()) +if speed<0.5 and ExpectedSpeed>0 and not(self.detour or self.turnintowind)then +if not self.holdtimestamp then +self:E(self.lid..string.format("Carrier came to an unexpected standstill. Trying to re-route in 3 min. Speed=%.1f knots, expected=%.1f knots",speed,ExpectedSpeed)) +self.holdtimestamp=timer.getTime() +else +if holdtime>3*60 then +local coord=self:GetCoordinate():Translate(500,hdg+10) +self:CarrierResumeRoute(coord) +self.holdtimestamp=nil +end +end +end +local text=string.format("Time %s - Status %s (case=%d) - Speed=%.1f kts - Heading=%d - WP=%d - ETA=%s - Turning=%s - Collision Warning=%s - Detour=%s - Turn Into Wind=%s - Holdtime=%d sec",clock,self:GetState(),self.case,speed,hdg,self.currentwp,eta,tostring(self.turning),tostring(collision),tostring(self.detour),tostring(self.turnintowind),holdtime) +self:T(self.lid..text) +text="Players:" +local i=0 +for _name,_player in pairs(self.players)do +i=i+1 +local player=_player +text=text..string.format("\n%d.) %s: Step=%s, Unit=%s, Airframe=%s",i,tostring(player.name),tostring(player.step),tostring(player.unitname),tostring(player.actype)) +end +if i==0 then +text=text.." none" +end +self:T(self.lid..text) +if collision then +if self.turnintowind then +self:CarrierResumeRoute(self.Creturnto) +if self:IsRecovering()and self.recoverywindow and self.recoverywindow.WIND then +self.recoverywindow.WIND=false +end +end +end +self:_CheckRecoveryTimes() +self:_ScanCarrierZone() +self:_CheckQueue() +self:_CheckCarrierTurning() +self:_CheckPatternUpdate() +self.Tqueue=time +end +if time-self.Tbeacon>self.dTbeacon then +self:_ActivateBeacons() +end +self:__Status(-30) +end +function AIRBOSS:_Status() +self:_CheckPlayerStatus() +self:_CheckAIStatus() +end +function AIRBOSS:_CheckAIStatus() +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +if flight.ai then +local fuel=flight.group:GetFuelMin()*100 +local text=string.format("Group %s fuel=%.1f %%",flight.groupname,fuel) +self:T3(self.lid..text) +if self.lowfuelAI and fuel<self.lowfuelAI and not flight.refueling then +self:_RefuelAI(flight) +self:_RemoveFlightFromMarshalQueue(flight,true) +end +end +end +for _,_flight in pairs(self.Qpattern)do +local flight=_flight +if flight.ai then +for _,_element in pairs(flight.elements)do +local element=_element +local unit=element.unit +local lineup=self:_Lineup(unit,true) +local unitcoord=unit:GetCoord() +local dist=unitcoord:Get2DDistance(self:GetCoord()) +local distance=UTILS.MetersToNM(dist) +local alt=UTILS.MetersToFeet(unitcoord.y) +if lineup<2 and distance<=0.75 and alt<500 and not element.ballcall then +self:RadioTransmission(self.LSORadio,self.LSOCall.CALLTHEBALL,nil,nil,nil,true) +self:_LSOCallAircraftBall(element.onboard,self:_GetACNickname(unit:GetTypeName()),self:_GetFuelState(unit)/1000) +self:RadioTransmission(self.LSORadio,self.LSOCall.ROGERBALL,nil,nil,0.5,true) +element.ballcall=true +flight.ballcall=true +end +end +end +end +end +function AIRBOSS:_CheckPlayerPatternDistance(player) +if player.step==AIRBOSS.PatternStep.INITIAL or +player.step==AIRBOSS.PatternStep.BREAKENTRY or +player.step==AIRBOSS.PatternStep.EARLYBREAK or +player.step==AIRBOSS.PatternStep.LATEBREAK or +player.step==AIRBOSS.PatternStep.ABEAM or +player.step==AIRBOSS.PatternStep.GROOVE_XX or +player.step==AIRBOSS.PatternStep.GROOVE_IM then +return +else +return +end +if#self.Qpattern==0 then +return +end +local function _checkclose(_unit1,_unit2) +local unit1=_unit1 +local unit2=_unit2 +if(not unit1)or(not unit2)then +return false +end +if unit1:GetName()==unit2:GetName()then +return false +end +if not unit2:InAir()then +return false +end +local c1=unit1:GetCoordinate() +local c2=unit2:GetCoordinate() +local vec12={x=c2.x-c1.x,y=0,z=c2.z-c1.z} +local dist=UTILS.VecNorm(vec12) +local vec1=unit1:GetOrientationX() +vec1.y=0 +local rhdg=math.deg(math.acos(UTILS.VecDot(vec12,vec1)/UTILS.VecNorm(vec12)/UTILS.VecNorm(vec1))) +local dalt=math.abs(c2.y-c1.y) +local dcrit=UTILS.FeetToMeters(650) +if math.abs(rhdg)<10 and dist<dcrit and dalt<50 then +return true +else +return false +end +end +for _,_flight in pairs(self.Qpattern)do +local flight=_flight +for _,_element in pairs(flight.elements)do +local element=_element +local tooclose=_checkclose(player.unit,element.unit) +if tooclose then +local text=string.format("Player %s too close (<200 meters) to aircraft %s!",player.name,element.unit:GetName()) +self:T2(self.lid..text) +end +end +end +end +function AIRBOSS:_CheckRecoveryTimes() +local time=timer.getAbsTime() +local Cnow=UTILS.SecondsToClock(time) +local text=string.format(self.lid.."Recovery time windows:") +if#self.recoverytimes==0 then +text=text.." none!" +end +local _sort=function(a,b) +return a.START<b.START +end +table.sort(self.recoverytimes,_sort) +local nextwindow=nil +local currwindow=nil +for _,_recovery in pairs(self.recoverytimes)do +local recovery=_recovery +local Cstart=UTILS.SecondsToClock(recovery.START) +local Cstop=UTILS.SecondsToClock(recovery.STOP) +local state="" +if time>=recovery.START then +if time<recovery.STOP then +if self:IsRecovering()then +state="in progress" +else +self:RecoveryStart(recovery.CASE,recovery.OFFSET) +state="starting now" +recovery.OPEN=true +end +currwindow=recovery +else +if self:IsRecovering()and not recovery.OVER then +local _,npattern=self:_GetQueueInfo(self.Qpattern) +if npattern>0 then +local extmin=5*npattern +recovery.STOP=recovery.STOP+extmin*60 +local text=string.format("We still got flights in the pattern.\nRecovery time prolonged by %d minutes.\nNow get your act together and no more bolters!",extmin) +self:MessageToPattern(text,"AIRBOSS","99",10,false,nil) +else +self:RecoveryStop() +state="closing now" +recovery.OPEN=false +recovery.OVER=true +end +else +state="closed" +end +end +else +state="in the future" +if nextwindow==nil then +nextwindow=recovery +state="next in line" +end +end +text=text..string.format("\n- Start=%s Stop=%s Case=%d Offset=%d Open=%s Closed=%s Status=\"%s\"",Cstart,Cstop,recovery.CASE,recovery.OFFSET,tostring(recovery.OPEN),tostring(recovery.OVER),state) +end +self:T(self.lid..text) +self.recoverywindow=nil +if self:IsIdle()then +if nextwindow then +self:RecoveryCase(nextwindow.CASE,nextwindow.OFFSET) +if nextwindow.WIND and nextwindow.START-time<self.dTturn and not self.turnintowind then +local hdg=self:GetHeading() +local wind=self:GetHeadingIntoWind(nextwindow.SPEED) +local delta=self:_GetDeltaHeading(hdg,wind) +local uturn=delta>5 +local _,vwind=self:GetWind() +if vwind<0.1 then +uturn=false +end +if not nextwindow.UTURN then +uturn=false +end +self:T(self.lid..string.format("Heading=%03d°, Wind=%03d° %.1f kts, Delta=%03d° ==> U-turn=%s",hdg,wind,UTILS.MpsToKnots(vwind),delta,tostring(uturn))) +local t=math.max(nextwindow.STOP-nextwindow.START+self.dTturn,60*60*24) +local v=UTILS.KnotsToMps(nextwindow.SPEED) +local vmax=self.carrier:GetSpeedMax()/3.6 +v=math.min(v,vmax) +self:CarrierTurnIntoWind(t,v,uturn) +end +self.recoverywindow=nextwindow +else +self:RecoveryCase() +end +else +if currwindow then +self.recoverywindow=currwindow +else +self.recoverywindow=nextwindow +end +end +self:T2({"FF",recoverywindow=self.recoverywindow}) +end +function AIRBOSS:_GetFlightLead(flight) +if flight.name~=flight.seclead then +local lead=self.players[flight.seclead] +return lead,false +else +return flight,true +end +end +function AIRBOSS:onbeforeRecoveryCase(From,Event,To,Case,Offset) +Case=Case or self.defaultcase +Offset=Offset or self.defaultoffset +if Case==self.case and Offset==self.holdingoffset then +return false +end +return true +end +function AIRBOSS:onafterRecoveryCase(From,Event,To,Case,Offset) +Case=Case or self.defaultcase +Offset=Offset or self.defaultoffset +local text=string.format("Switching recovery case %d ==> %d",self.case,Case) +if Case>1 then +text=text..string.format(" Holding offset angle %d degrees.",Offset) +end +MESSAGE:New(text,20,self.alias):ToAllIf(self.Debug) +self:T(self.lid..text) +self.case=Case +self.holdingoffset=Offset +for _,_flight in pairs(self.flights)do +local flight=_flight +if not(self:_InQueue(self.Qmarshal,flight.group)or self:_InQueue(self.Qpattern,flight.group))then +if flight.name~=flight.seclead then +local lead=self.players[flight.seclead] +if lead and not(self:_InQueue(self.Qmarshal,lead.group)or self:_InQueue(self.Qpattern,lead.group))then +flight.case=self.case +end +else +flight.case=self.case +end +end +end +end +function AIRBOSS:onafterRecoveryStart(From,Event,To,Case,Offset) +Case=Case or self.defaultcase +Offset=Offset or self.defaultoffset +self:_MarshalCallRecoveryStart(Case) +self:RecoveryCase(Case,Offset) +end +function AIRBOSS:onafterRecoveryStop(From,Event,To) +self:T(self.lid..string.format("Stopping aircraft recovery.")) +self:_MarshalCallRecoveryStopped(self.case) +if self.turnintowind then +local coord=self.Creturnto +if self.recoverywindow and self.recoverywindow.UTURN==false then +coord=nil +end +self:CarrierResumeRoute(coord) +end +if self.recoverywindow and self.recoverywindow.OPEN==true then +self.recoverywindow.OPEN=false +self.recoverywindow.OVER=true +self:DeleteRecoveryWindow(self.recoverywindow) +end +self:_CheckRecoveryTimes() +end +function AIRBOSS:onafterRecoveryPause(From,Event,To,duration) +self:T(self.lid..string.format("Pausing aircraft recovery.")) +if duration then +self:__RecoveryUnpause(duration) +local clock=UTILS.SecondsToClock(timer.getAbsTime()+duration) +self:_MarshalCallRecoveryPausedResumedAt(clock) +else +local text=string.format("aircraft recovery is paused until further notice.") +self:_MarshalCallRecoveryPausedNotice() +end +end +function AIRBOSS:onafterRecoveryUnpause(From,Event,To) +self:T(self.lid..string.format("Unpausing aircraft recovery.")) +self:_MarshalCallResumeRecovery() +end +function AIRBOSS:onafterPassingWaypoint(From,Event,To,n) +self:I(self.lid..string.format("Carrier passed waypoint %d.",n)) +end +function AIRBOSS:onafterIdle(From,Event,To) +self:T(self.lid..string.format("Carrier goes to idle.")) +end +function AIRBOSS:onafterStop(From,Event,To) +self:I(self.lid..string.format("Stopping airboss script.")) +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.RunwayTouch) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.MissionEnd) +self.CallScheduler:Clear() +end +function AIRBOSS:_InitStennis() +self.carrierparam.sterndist=-153 +self.carrierparam.deckheight=18.30 +self.carrierparam.totlength=310 +self.carrierparam.totwidthport=40 +self.carrierparam.totwidthstarboard=30 +self.carrierparam.rwyangle=-9.1359 +self.carrierparam.rwylength=225 +self.carrierparam.rwywidth=20 +self.carrierparam.wire1=46 +self.carrierparam.wire2=46+12 +self.carrierparam.wire3=46+24 +self.carrierparam.wire4=46+35 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3 +self.Platform.name="Platform 5k" +self.Platform.Xmin=-UTILS.NMToMeters(22) +self.Platform.Xmax=nil +self.Platform.Zmin=-UTILS.NMToMeters(30) +self.Platform.Zmax=UTILS.NMToMeters(30) +self.Platform.LimitXmin=nil +self.Platform.LimitXmax=nil +self.Platform.LimitZmin=nil +self.Platform.LimitZmax=nil +self.DirtyUp.name="Dirty Up" +self.DirtyUp.Xmin=-UTILS.NMToMeters(21) +self.DirtyUp.Xmax=nil +self.DirtyUp.Zmin=-UTILS.NMToMeters(30) +self.DirtyUp.Zmax=UTILS.NMToMeters(30) +self.DirtyUp.LimitXmin=nil +self.DirtyUp.LimitXmax=nil +self.DirtyUp.LimitZmin=nil +self.DirtyUp.LimitZmax=nil +self.Bullseye.name="Bullseye" +self.Bullseye.Xmin=-UTILS.NMToMeters(11) +self.Bullseye.Xmax=nil +self.Bullseye.Zmin=-UTILS.NMToMeters(30) +self.Bullseye.Zmax=UTILS.NMToMeters(30) +self.Bullseye.LimitXmin=nil +self.Bullseye.LimitXmax=nil +self.Bullseye.LimitZmin=nil +self.Bullseye.LimitZmax=nil +self.BreakEntry.name="Break Entry" +self.BreakEntry.Xmin=-UTILS.NMToMeters(4) +self.BreakEntry.Xmax=nil +self.BreakEntry.Zmin=-UTILS.NMToMeters(0.5) +self.BreakEntry.Zmax=UTILS.NMToMeters(1.5) +self.BreakEntry.LimitXmin=0 +self.BreakEntry.LimitXmax=nil +self.BreakEntry.LimitZmin=nil +self.BreakEntry.LimitZmax=nil +self.BreakEarly.name="Early Break" +self.BreakEarly.Xmin=-UTILS.NMToMeters(1) +self.BreakEarly.Xmax=UTILS.NMToMeters(7) +self.BreakEarly.Zmin=-UTILS.NMToMeters(2) +self.BreakEarly.Zmax=UTILS.NMToMeters(1) +self.BreakEarly.LimitXmin=0 +self.BreakEarly.LimitXmax=nil +self.BreakEarly.LimitZmin=-UTILS.NMToMeters(0.2) +self.BreakEarly.LimitZmax=nil +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(7) +self.BreakLate.Zmin=-UTILS.NMToMeters(2) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.8) +self.BreakLate.LimitZmax=nil +self.Abeam.name="Abeam Position" +self.Abeam.Xmin=-UTILS.NMToMeters(5) +self.Abeam.Xmax=UTILS.NMToMeters(7) +self.Abeam.Zmin=-UTILS.NMToMeters(2) +self.Abeam.Zmax=500 +self.Abeam.LimitXmin=-200 +self.Abeam.LimitXmax=nil +self.Abeam.LimitZmin=nil +self.Abeam.LimitZmax=nil +self.Ninety.name="Ninety" +self.Ninety.Xmin=-UTILS.NMToMeters(4) +self.Ninety.Xmax=0 +self.Ninety.Zmin=-UTILS.NMToMeters(2) +self.Ninety.Zmax=nil +self.Ninety.LimitXmin=nil +self.Ninety.LimitXmax=nil +self.Ninety.LimitZmin=nil +self.Ninety.LimitZmax=-UTILS.NMToMeters(0.6) +self.Wake.name="Wake" +self.Wake.Xmin=-UTILS.NMToMeters(4) +self.Wake.Xmax=0 +self.Wake.Zmin=-2000 +self.Wake.Zmax=nil +self.Wake.LimitXmin=nil +self.Wake.LimitXmax=nil +self.Wake.LimitZmin=0 +self.Wake.LimitZmax=nil +self.Final.name="Final" +self.Final.Xmin=-UTILS.NMToMeters(4) +self.Final.Xmax=0 +self.Final.Zmin=-2000 +self.Final.Zmax=nil +self.Final.LimitXmin=nil +self.Final.LimitXmax=nil +self.Final.LimitZmin=nil +self.Final.LimitZmax=nil +self.Groove.name="Groove" +self.Groove.Xmin=-UTILS.NMToMeters(4) +self.Groove.Xmax=nil +self.Groove.Zmin=-UTILS.NMToMeters(2) +self.Groove.Zmax=UTILS.NMToMeters(2) +self.Groove.LimitXmin=nil +self.Groove.LimitXmax=nil +self.Groove.LimitZmin=nil +self.Groove.LimitZmax=nil +end +function AIRBOSS:_InitNimitz() +self:_InitStennis() +self.carrierparam.sterndist=-164 +self.carrierparam.deckheight=20.1494 +self.carrierparam.totlength=332.8 +self.carrierparam.totwidthport=45 +self.carrierparam.totwidthstarboard=35 +self.carrierparam.rwyangle=-9.1359 +self.carrierparam.rwylength=250 +self.carrierparam.rwywidth=25 +self.carrierparam.wire1=55 +self.carrierparam.wire2=67 +self.carrierparam.wire3=79 +self.carrierparam.wire4=96 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3 +end +function AIRBOSS:_InitForrestal() +self:_InitNimitz() +self.carrierparam.sterndist=-135.5 +self.carrierparam.deckheight=20 +self.carrierparam.totlength=315 +self.carrierparam.totwidthport=45 +self.carrierparam.totwidthstarboard=35 +self.carrierparam.rwyangle=-9.1359 +self.carrierparam.rwylength=212 +self.carrierparam.rwywidth=25 +self.carrierparam.wire1=44 +self.carrierparam.wire2=54 +self.carrierparam.wire3=64 +self.carrierparam.wire4=74 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3 +end +function AIRBOSS:_InitEnterprise() +self:_InitForrestal() +self.carrierparam.sterndist=-164.30 +self.carrierparam.deckheight=19.52 +self.carrierparam.totlength=335 +self.carrierparam.rwylength=223 +self.carrierparam.wire1=57.7 +self.carrierparam.wire2=69.6 +self.carrierparam.wire3=79.5 +self.carrierparam.wire4=90.0 +end +function AIRBOSS:_InitEssex() +self:_InitNimitz() +self.carrierparam.sterndist=-126 +self.carrierparam.deckheight=19.27 +self.carrierparam.totlength=268 +self.carrierparam.totwidthport=23 +self.carrierparam.totwidthstarboard=23 +self.carrierparam.rwyangle=0.0 +self.carrierparam.rwylength=265 +self.carrierparam.rwywidth=20 +self.carrierparam.wire1=21.9 +self.carrierparam.wire2=28.3 +self.carrierparam.wire3=34.7 +self.carrierparam.wire4=41.1 +self.carrierparam.wire5=47.4 +self.carrierparam.wire6=53.7 +self.carrierparam.wire7=59.0 +self.carrierparam.wire8=64.1 +self.carrierparam.wire9=72.7 +self.carrierparam.wire10=78.0 +self.carrierparam.wire11=85.5 +self.carrierparam.wire12=105.9 +self.carrierparam.wire13=113.3 +self.carrierparam.wire14=121.0 +self.carrierparam.wire15=128.5 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.wire3 +end +function AIRBOSS:_InitBonHommeRichard() +self:_InitEssex() +self.carrierparam.deckheight=16.95 +self.carrierparam.rwyangle=-11.4 +self.carrierparam.rwylength=97 +self.carrierparam.rwywidth=20 +self.carrierparam.wire1=40.4 +self.carrierparam.wire2=45 +self.carrierparam.wire3=51 +self.carrierparam.wire4=58.1 +end +function AIRBOSS:_InitEssexSCB125() +self:_InitBonHommeRichard() +end +function AIRBOSS:_InitHermes() +self:_InitStennis() +self.carrierparam.sterndist=-105 +self.carrierparam.deckheight=12 +self.carrierparam.totlength=228.19 +self.carrierparam.totwidthport=20.5 +self.carrierparam.totwidthstarboard=24.5 +self.carrierparam.rwyangle=0 +self.carrierparam.rwylength=215 +self.carrierparam.rwywidth=13 +self.carrierparam.wire1=nil +self.carrierparam.wire2=nil +self.carrierparam.wire3=nil +self.carrierparam.wire4=nil +self.carrierparam.landingspot=69 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.landingspot +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(5) +self.BreakLate.Zmin=-UTILS.NMToMeters(1.6) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.5) +self.BreakLate.LimitZmax=nil +end +function AIRBOSS:_InitInvincible() +self:_InitStennis() +self.carrierparam.sterndist=-105 +self.carrierparam.deckheight=12 +self.carrierparam.totlength=228.19 +self.carrierparam.totwidthport=20.5 +self.carrierparam.totwidthstarboard=24.5 +self.carrierparam.rwyangle=0 +self.carrierparam.rwylength=215 +self.carrierparam.rwywidth=13 +self.carrierparam.wire1=nil +self.carrierparam.wire2=nil +self.carrierparam.wire3=nil +self.carrierparam.wire4=nil +self.carrierparam.landingspot=69 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.landingspot +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(5) +self.BreakLate.Zmin=-UTILS.NMToMeters(1.6) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.5) +self.BreakLate.LimitZmax=nil +end +function AIRBOSS:_InitTarawa() +self:_InitStennis() +self.carrierparam.sterndist=-125 +self.carrierparam.deckheight=21 +self.carrierparam.totlength=245 +self.carrierparam.totwidthport=10 +self.carrierparam.totwidthstarboard=25 +self.carrierparam.rwyangle=0 +self.carrierparam.rwylength=225 +self.carrierparam.rwywidth=15 +self.carrierparam.wire1=nil +self.carrierparam.wire2=nil +self.carrierparam.wire3=nil +self.carrierparam.wire4=nil +self.carrierparam.landingspot=57 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.landingspot +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(5) +self.BreakLate.Zmin=-UTILS.NMToMeters(1.6) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.5) +self.BreakLate.LimitZmax=nil +end +function AIRBOSS:_InitAmerica() +self:_InitStennis() +self.carrierparam.sterndist=-125 +self.carrierparam.deckheight=20 +self.carrierparam.totlength=257 +self.carrierparam.totwidthport=11 +self.carrierparam.totwidthstarboard=25 +self.carrierparam.rwyangle=0 +self.carrierparam.rwylength=240 +self.carrierparam.rwywidth=15 +self.carrierparam.wire1=nil +self.carrierparam.wire2=nil +self.carrierparam.wire3=nil +self.carrierparam.wire4=nil +self.carrierparam.landingspot=59 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.landingspot +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(5) +self.BreakLate.Zmin=-UTILS.NMToMeters(1.6) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.5) +self.BreakLate.LimitZmax=nil +end +function AIRBOSS:_InitJcarlos() +self:_InitStennis() +self.carrierparam.sterndist=-125 +self.carrierparam.deckheight=20 +self.carrierparam.totlength=231 +self.carrierparam.totwidthport=10 +self.carrierparam.totwidthstarboard=22 +self.carrierparam.rwyangle=0 +self.carrierparam.rwylength=202 +self.carrierparam.rwywidth=14 +self.carrierparam.wire1=nil +self.carrierparam.wire2=nil +self.carrierparam.wire3=nil +self.carrierparam.wire4=nil +self.carrierparam.landingspot=89 +self.carrierparam.landingdist=self.carrierparam.sterndist+self.carrierparam.landingspot +self.BreakLate.name="Late Break" +self.BreakLate.Xmin=-UTILS.NMToMeters(1) +self.BreakLate.Xmax=UTILS.NMToMeters(5) +self.BreakLate.Zmin=-UTILS.NMToMeters(1.6) +self.BreakLate.Zmax=UTILS.NMToMeters(1) +self.BreakLate.LimitXmin=0 +self.BreakLate.LimitXmax=nil +self.BreakLate.LimitZmin=-UTILS.NMToMeters(0.5) +self.BreakLate.LimitZmax=nil +end +function AIRBOSS:_InitCanberra() +self:_InitJcarlos() +end +function AIRBOSS:SetVoiceOversMarshalByGabriella(mizfolder) +if mizfolder then +local lastchar=string.sub(mizfolder,-1) +if lastchar~="/"then +mizfolder=mizfolder.."/" +end +self.soundfolderMSH=mizfolder +else +self.soundfolderMSH=self.soundfolder +end +self:I(self.lid..string.format("Marshal Gabriella reporting for duty! Soundfolder=%s",tostring(self.soundfolderMSH))) +self.MarshalCall.AFFIRMATIVE.duration=0.65 +self.MarshalCall.ALTIMETER.duration=0.60 +self.MarshalCall.BRC.duration=0.67 +self.MarshalCall.CARRIERTURNTOHEADING.duration=1.62 +self.MarshalCall.CASE.duration=0.30 +self.MarshalCall.CHARLIETIME.duration=0.77 +self.MarshalCall.CLEAREDFORRECOVERY.duration=0.93 +self.MarshalCall.DECKCLOSED.duration=0.73 +self.MarshalCall.DEGREES.duration=0.48 +self.MarshalCall.EXPECTED.duration=0.50 +self.MarshalCall.FLYNEEDLES.duration=0.89 +self.MarshalCall.HOLDATANGELS.duration=0.81 +self.MarshalCall.HOURS.duration=0.41 +self.MarshalCall.MARSHALRADIAL.duration=0.95 +self.MarshalCall.N0.duration=0.41 +self.MarshalCall.N1.duration=0.30 +self.MarshalCall.N2.duration=0.34 +self.MarshalCall.N3.duration=0.31 +self.MarshalCall.N4.duration=0.34 +self.MarshalCall.N5.duration=0.30 +self.MarshalCall.N6.duration=0.33 +self.MarshalCall.N7.duration=0.38 +self.MarshalCall.N8.duration=0.35 +self.MarshalCall.N9.duration=0.35 +self.MarshalCall.NEGATIVE.duration=0.60 +self.MarshalCall.NEWFB.duration=0.95 +self.MarshalCall.OPS.duration=0.23 +self.MarshalCall.POINT.duration=0.38 +self.MarshalCall.RADIOCHECK.duration=1.27 +self.MarshalCall.RECOVERY.duration=0.60 +self.MarshalCall.RECOVERYOPSSTOPPED.duration=1.25 +self.MarshalCall.RECOVERYPAUSEDNOTICE.duration=2.55 +self.MarshalCall.RECOVERYPAUSEDRESUMED.duration=2.55 +self.MarshalCall.REPORTSEEME.duration=0.87 +self.MarshalCall.RESUMERECOVERY.duration=1.55 +self.MarshalCall.ROGER.duration=0.50 +self.MarshalCall.SAYNEEDLES.duration=0.82 +self.MarshalCall.STACKFULL.duration=5.70 +self.MarshalCall.STARTINGRECOVERY.duration=1.61 +end +function AIRBOSS:SetVoiceOversMarshalByRaynor(mizfolder) +if mizfolder then +local lastchar=string.sub(mizfolder,-1) +if lastchar~="/"then +mizfolder=mizfolder.."/" +end +self.soundfolderMSH=mizfolder +else +self.soundfolderMSH=self.soundfolder +end +self:I(self.lid..string.format("Marshal Raynor reporting for duty! Soundfolder=%s",tostring(self.soundfolderMSH))) +self.MarshalCall.AFFIRMATIVE.duration=0.70 +self.MarshalCall.ALTIMETER.duration=0.60 +self.MarshalCall.BRC.duration=0.60 +self.MarshalCall.CARRIERTURNTOHEADING.duration=1.87 +self.MarshalCall.CASE.duration=0.60 +self.MarshalCall.CHARLIETIME.duration=0.81 +self.MarshalCall.CLEAREDFORRECOVERY.duration=1.21 +self.MarshalCall.DECKCLOSED.duration=0.86 +self.MarshalCall.DEGREES.duration=0.55 +self.MarshalCall.EXPECTED.duration=0.61 +self.MarshalCall.FLYNEEDLES.duration=0.90 +self.MarshalCall.HOLDATANGELS.duration=0.91 +self.MarshalCall.HOURS.duration=0.54 +self.MarshalCall.MARSHALRADIAL.duration=0.80 +self.MarshalCall.N0.duration=0.38 +self.MarshalCall.N1.duration=0.30 +self.MarshalCall.N2.duration=0.30 +self.MarshalCall.N3.duration=0.30 +self.MarshalCall.N4.duration=0.32 +self.MarshalCall.N5.duration=0.41 +self.MarshalCall.N6.duration=0.48 +self.MarshalCall.N7.duration=0.51 +self.MarshalCall.N8.duration=0.38 +self.MarshalCall.N9.duration=0.34 +self.MarshalCall.NEGATIVE.duration=0.60 +self.MarshalCall.NEWFB.duration=1.10 +self.MarshalCall.OPS.duration=0.46 +self.MarshalCall.POINT.duration=0.21 +self.MarshalCall.RADIOCHECK.duration=0.95 +self.MarshalCall.RECOVERY.duration=0.63 +self.MarshalCall.RECOVERYOPSSTOPPED.duration=1.36 +self.MarshalCall.RECOVERYPAUSEDNOTICE.duration=2.8 +self.MarshalCall.RECOVERYPAUSEDRESUMED.duration=2.75 +self.MarshalCall.REPORTSEEME.duration=1.06 +self.MarshalCall.RESUMERECOVERY.duration=1.41 +self.MarshalCall.ROGER.duration=0.41 +self.MarshalCall.SAYNEEDLES.duration=0.79 +self.MarshalCall.STACKFULL.duration=4.70 +self.MarshalCall.STARTINGRECOVERY.duration=2.06 +end +function AIRBOSS:SetVoiceOversLSOByRaynor(mizfolder) +if mizfolder then +local lastchar=string.sub(mizfolder,-1) +if lastchar~="/"then +mizfolder=mizfolder.."/" +end +self.soundfolderLSO=mizfolder +else +self.soundfolderLSO=self.soundfolder +end +self:I(self.lid..string.format("LSO Raynor reporting for duty! Soundfolder=%s",tostring(self.soundfolderLSO))) +self.LSOCall.BOLTER.duration=0.75 +self.LSOCall.CALLTHEBALL.duration=0.625 +self.LSOCall.CHECK.duration=0.40 +self.LSOCall.CLEAREDTOLAND.duration=0.85 +self.LSOCall.COMELEFT.duration=0.60 +self.LSOCall.DEPARTANDREENTER.duration=1.10 +self.LSOCall.EXPECTHEAVYWAVEOFF.duration=1.30 +self.LSOCall.EXPECTSPOT75.duration=1.85 +self.LSOCall.EXPECTSPOT5.duration=1.3 +self.LSOCall.FAST.duration=0.75 +self.LSOCall.FOULDECK.duration=0.75 +self.LSOCall.HIGH.duration=0.65 +self.LSOCall.IDLE.duration=0.40 +self.LSOCall.LONGINGROOVE.duration=1.25 +self.LSOCall.LOW.duration=0.60 +self.LSOCall.N0.duration=0.38 +self.LSOCall.N1.duration=0.30 +self.LSOCall.N2.duration=0.30 +self.LSOCall.N3.duration=0.30 +self.LSOCall.N4.duration=0.32 +self.LSOCall.N5.duration=0.41 +self.LSOCall.N6.duration=0.48 +self.LSOCall.N7.duration=0.51 +self.LSOCall.N8.duration=0.38 +self.LSOCall.N9.duration=0.34 +self.LSOCall.PADDLESCONTACT.duration=0.91 +self.LSOCall.POWERsoft.duration=0.9 +self.LSOCall.POWER.duration=0.45 +self.LSOCall.RADIOCHECK.duration=0.90 +self.LSOCall.RIGHTFORLINEUP.duration=0.70 +self.LSOCall.ROGERBALL.duration=0.72 +self.LSOCall.SLOW.duration=0.63 +self.LSOCall.STABILIZED.duration=0.75 +self.LSOCall.WAVEOFF.duration=0.55 +self.LSOCall.WELCOMEABOARD.duration=0.80 +end +function AIRBOSS:SetVoiceOversLSOByFF(mizfolder) +if mizfolder then +local lastchar=string.sub(mizfolder,-1) +if lastchar~="/"then +mizfolder=mizfolder.."/" +end +self.soundfolderLSO=mizfolder +else +self.soundfolderLSO=self.soundfolder +end +self:I(self.lid..string.format("LSO FF reporting for duty! Soundfolder=%s",tostring(self.soundfolderLSO))) +self.LSOCall.BOLTER.duration=0.75 +self.LSOCall.CALLTHEBALL.duration=0.60 +self.LSOCall.CHECK.duration=0.45 +self.LSOCall.CLEAREDTOLAND.duration=1.00 +self.LSOCall.COMELEFT.duration=0.60 +self.LSOCall.DEPARTANDREENTER.duration=1.10 +self.LSOCall.EXPECTHEAVYWAVEOFF.duration=1.20 +self.LSOCall.EXPECTSPOT75.duration=2.00 +self.LSOCall.EXPECTSPOT5.duration=1.3 +self.LSOCall.FAST.duration=0.70 +self.LSOCall.FOULDECK.duration=0.62 +self.LSOCall.HIGH.duration=0.65 +self.LSOCall.IDLE.duration=0.45 +self.LSOCall.LONGINGROOVE.duration=1.20 +self.LSOCall.LOW.duration=0.50 +self.LSOCall.N0.duration=0.40 +self.LSOCall.N1.duration=0.25 +self.LSOCall.N2.duration=0.37 +self.LSOCall.N3.duration=0.37 +self.LSOCall.N4.duration=0.39 +self.LSOCall.N5.duration=0.39 +self.LSOCall.N6.duration=0.40 +self.LSOCall.N7.duration=0.40 +self.LSOCall.N8.duration=0.37 +self.LSOCall.N9.duration=0.40 +self.LSOCall.PADDLESCONTACT.duration=1.00 +self.LSOCall.POWER.duration=0.50 +self.LSOCall.POWERsoft.duration=0.9 +self.LSOCall.RADIOCHECK.duration=1.10 +self.LSOCall.RIGHTFORLINEUP.duration=0.80 +self.LSOCall.ROGERBALL.duration=1.00 +self.LSOCall.SLOW.duration=0.65 +self.LSOCall.SLOW.duration=0.59 +self.LSOCall.STABILIZED.duration=0.90 +self.LSOCall.WAVEOFF.duration=0.60 +self.LSOCall.WELCOMEABOARD.duration=1.00 +end +function AIRBOSS:SetVoiceOversMarshalByFF(mizfolder) +if mizfolder then +local lastchar=string.sub(mizfolder,-1) +if lastchar~="/"then +mizfolder=mizfolder.."/" +end +self.soundfolderMSH=mizfolder +else +self.soundfolderMSH=self.soundfolder +end +self:I(self.lid..string.format("Marshal FF reporting for duty! Soundfolder=%s",tostring(self.soundfolderMSH))) +self.MarshalCall.AFFIRMATIVE.duration=0.90 +self.MarshalCall.ALTIMETER.duration=0.85 +self.MarshalCall.BRC.duration=0.80 +self.MarshalCall.CARRIERTURNTOHEADING.duration=2.48 +self.MarshalCall.CASE.duration=0.40 +self.MarshalCall.CHARLIETIME.duration=0.90 +self.MarshalCall.CLEAREDFORRECOVERY.duration=1.25 +self.MarshalCall.DECKCLOSED.duration=1.10 +self.MarshalCall.DEGREES.duration=0.60 +self.MarshalCall.EXPECTED.duration=0.55 +self.MarshalCall.FLYNEEDLES.duration=0.90 +self.MarshalCall.HOLDATANGELS.duration=1.10 +self.MarshalCall.HOURS.duration=0.60 +self.MarshalCall.MARSHALRADIAL.duration=1.10 +self.MarshalCall.N0.duration=0.40 +self.MarshalCall.N1.duration=0.25 +self.MarshalCall.N2.duration=0.37 +self.MarshalCall.N3.duration=0.37 +self.MarshalCall.N4.duration=0.39 +self.MarshalCall.N5.duration=0.39 +self.MarshalCall.N6.duration=0.40 +self.MarshalCall.N7.duration=0.40 +self.MarshalCall.N8.duration=0.37 +self.MarshalCall.N9.duration=0.40 +self.MarshalCall.NEGATIVE.duration=0.80 +self.MarshalCall.NEWFB.duration=1.35 +self.MarshalCall.OPS.duration=0.48 +self.MarshalCall.POINT.duration=0.33 +self.MarshalCall.RADIOCHECK.duration=1.20 +self.MarshalCall.RECOVERY.duration=0.70 +self.MarshalCall.RECOVERYOPSSTOPPED.duration=1.65 +self.MarshalCall.RECOVERYPAUSEDNOTICE.duration=2.9 +self.MarshalCall.RECOVERYPAUSEDRESUMED.duration=3.40 +self.MarshalCall.REPORTSEEME.duration=0.95 +self.MarshalCall.RESUMERECOVERY.duration=1.75 +self.MarshalCall.ROGER.duration=0.53 +self.MarshalCall.SAYNEEDLES.duration=0.90 +self.MarshalCall.STACKFULL.duration=6.35 +self.MarshalCall.STARTINGRECOVERY.duration=2.65 +end +function AIRBOSS:_InitVoiceOvers() +self.LSOCall={ +BOLTER={file="LSO-BolterBolter",suffix="ogg",loud=false,subtitle="Bolter, Bolter",duration=0.75,subduration=5}, +CALLTHEBALL={file="LSO-CallTheBall",suffix="ogg",loud=false,subtitle="Call the ball",duration=0.6,subduration=2}, +CHECK={file="LSO-Check",suffix="ogg",loud=false,subtitle="Check",duration=0.45,subduration=2.5}, +CLEAREDTOLAND={file="LSO-ClearedToLand",suffix="ogg",loud=false,subtitle="Cleared to land",duration=1.0,subduration=5}, +COMELEFT={file="LSO-ComeLeft",suffix="ogg",loud=true,subtitle="Come left",duration=0.60,subduration=1}, +RADIOCHECK={file="LSO-RadioCheck",suffix="ogg",loud=false,subtitle="Paddles, radio check",duration=1.1,subduration=5}, +RIGHTFORLINEUP={file="LSO-RightForLineup",suffix="ogg",loud=true,subtitle="Right for line up",duration=0.80,subduration=1}, +HIGH={file="LSO-High",suffix="ogg",loud=true,subtitle="You're high",duration=0.65,subduration=1}, +LOW={file="LSO-Low",suffix="ogg",loud=true,subtitle="You're low",duration=0.50,subduration=1}, +POWER={file="LSO-Power",suffix="ogg",loud=true,subtitle="Power",duration=0.50,subduration=1}, +POWERsoft={file="LSO-Power-soft",suffix="ogg",loud=false,subtitle="Power-soft",duration=0.90,subduration=1}, +SLOW={file="LSO-Slow",suffix="ogg",loud=true,subtitle="You're slow",duration=0.65,subduration=1}, +FAST={file="LSO-Fast",suffix="ogg",loud=true,subtitle="You're fast",duration=0.70,subduration=1}, +ROGERBALL={file="LSO-RogerBall",suffix="ogg",loud=false,subtitle="Roger ball",duration=1.00,subduration=2}, +WAVEOFF={file="LSO-WaveOff",suffix="ogg",loud=false,subtitle="Wave off",duration=0.6,subduration=5}, +LONGINGROOVE={file="LSO-LongInTheGroove",suffix="ogg",loud=false,subtitle="You're long in the groove",duration=1.2,subduration=5}, +FOULDECK={file="LSO-FoulDeck",suffix="ogg",loud=false,subtitle="Foul deck",duration=0.62,subduration=5}, +DEPARTANDREENTER={file="LSO-DepartAndReenter",suffix="ogg",loud=false,subtitle="Depart and re-enter",duration=1.1,subduration=5}, +PADDLESCONTACT={file="LSO-PaddlesContact",suffix="ogg",loud=false,subtitle="Paddles, contact",duration=1.0,subduration=5}, +WELCOMEABOARD={file="LSO-WelcomeAboard",suffix="ogg",loud=false,subtitle="Welcome aboard",duration=1.0,subduration=5}, +EXPECTHEAVYWAVEOFF={file="LSO-ExpectHeavyWaveoff",suffix="ogg",loud=false,subtitle="Expect heavy waveoff",duration=1.2,subduration=5}, +EXPECTSPOT75={file="LSO-ExpectSpot75",suffix="ogg",loud=false,subtitle="Expect spot 7.5",duration=2.0,subduration=5}, +EXPECTSPOT5={file="LSO-ExpectSpot5",suffix="ogg",loud=false,subtitle="Expect spot 5",duration=1.3,subduration=5}, +STABILIZED={file="LSO-Stabilized",suffix="ogg",loud=false,subtitle="Stabilized",duration=0.9,subduration=5}, +IDLE={file="LSO-Idle",suffix="ogg",loud=false,subtitle="Idle",duration=0.45,subduration=5}, +N0={file="LSO-N0",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N1={file="LSO-N1",suffix="ogg",loud=false,subtitle="",duration=0.25}, +N2={file="LSO-N2",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N3={file="LSO-N3",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N4={file="LSO-N4",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N5={file="LSO-N5",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N6={file="LSO-N6",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N7={file="LSO-N7",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N8={file="LSO-N8",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N9={file="LSO-N9",suffix="ogg",loud=false,subtitle="",duration=0.40}, +CLICK={file="AIRBOSS-RadioClick",suffix="ogg",loud=false,subtitle="",duration=0.35}, +NOISE={file="AIRBOSS-Noise",suffix="ogg",loud=false,subtitle="",duration=3.6}, +SPINIT={file="AIRBOSS-SpinIt",suffix="ogg",loud=false,subtitle="",duration=0.73,subduration=5}, +} +self.PilotCall={ +N0={file="PILOT-N0",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N1={file="PILOT-N1",suffix="ogg",loud=false,subtitle="",duration=0.25}, +N2={file="PILOT-N2",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N3={file="PILOT-N3",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N4={file="PILOT-N4",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N5={file="PILOT-N5",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N6={file="PILOT-N6",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N7={file="PILOT-N7",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N8={file="PILOT-N8",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N9={file="PILOT-N9",suffix="ogg",loud=false,subtitle="",duration=0.40}, +POINT={file="PILOT-Point",suffix="ogg",loud=false,subtitle="",duration=0.33}, +SKYHAWK={file="PILOT-Skyhawk",suffix="ogg",loud=false,subtitle="",duration=0.95,subduration=5}, +HARRIER={file="PILOT-Harrier",suffix="ogg",loud=false,subtitle="",duration=0.58,subduration=5}, +HAWKEYE={file="PILOT-Hawkeye",suffix="ogg",loud=false,subtitle="",duration=0.63,subduration=5}, +TOMCAT={file="PILOT-Tomcat",suffix="ogg",loud=false,subtitle="",duration=0.66,subduration=5}, +HORNET={file="PILOT-Hornet",suffix="ogg",loud=false,subtitle="",duration=0.56,subduration=5}, +VIKING={file="PILOT-Viking",suffix="ogg",loud=false,subtitle="",duration=0.61,subduration=5}, +GREYHOUND={file="PILOT-Greyhound",suffix="ogg",loud=false,subtitle="",duration=0.61,subduration=5}, +BALL={file="PILOT-Ball",suffix="ogg",loud=false,subtitle="",duration=0.50,subduration=5}, +BINGOFUEL={file="PILOT-BingoFuel",suffix="ogg",loud=false,subtitle="",duration=0.80}, +GASATDIVERT={file="PILOT-GasAtDivert",suffix="ogg",loud=false,subtitle="",duration=1.80}, +GASATTANKER={file="PILOT-GasAtTanker",suffix="ogg",loud=false,subtitle="",duration=1.95}, +} +self.MarshalCall={ +AFFIRMATIVE={file="MARSHAL-Affirmative",suffix="ogg",loud=false,subtitle="",duration=0.90}, +ALTIMETER={file="MARSHAL-Altimeter",suffix="ogg",loud=false,subtitle="",duration=0.85}, +BRC={file="MARSHAL-BRC",suffix="ogg",loud=false,subtitle="",duration=0.80}, +CARRIERTURNTOHEADING={file="MARSHAL-CarrierTurnToHeading",suffix="ogg",loud=false,subtitle="",duration=2.48,subduration=5}, +CASE={file="MARSHAL-Case",suffix="ogg",loud=false,subtitle="",duration=0.40}, +CHARLIETIME={file="MARSHAL-CharlieTime",suffix="ogg",loud=false,subtitle="",duration=0.90}, +CLEAREDFORRECOVERY={file="MARSHAL-ClearedForRecovery",suffix="ogg",loud=false,subtitle="",duration=1.25}, +DECKCLOSED={file="MARSHAL-DeckClosed",suffix="ogg",loud=false,subtitle="",duration=1.10,subduration=5}, +DEGREES={file="MARSHAL-Degrees",suffix="ogg",loud=false,subtitle="",duration=0.60}, +EXPECTED={file="MARSHAL-Expected",suffix="ogg",loud=false,subtitle="",duration=0.55}, +FLYNEEDLES={file="MARSHAL-FlyYourNeedles",suffix="ogg",loud=false,subtitle="Fly your needles",duration=0.9,subduration=5}, +HOLDATANGELS={file="MARSHAL-HoldAtAngels",suffix="ogg",loud=false,subtitle="",duration=1.10}, +HOURS={file="MARSHAL-Hours",suffix="ogg",loud=false,subtitle="",duration=0.60,subduration=5}, +MARSHALRADIAL={file="MARSHAL-MarshalRadial",suffix="ogg",loud=false,subtitle="",duration=1.10}, +N0={file="MARSHAL-N0",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N1={file="MARSHAL-N1",suffix="ogg",loud=false,subtitle="",duration=0.25}, +N2={file="MARSHAL-N2",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N3={file="MARSHAL-N3",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N4={file="MARSHAL-N4",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N5={file="MARSHAL-N5",suffix="ogg",loud=false,subtitle="",duration=0.39}, +N6={file="MARSHAL-N6",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N7={file="MARSHAL-N7",suffix="ogg",loud=false,subtitle="",duration=0.40}, +N8={file="MARSHAL-N8",suffix="ogg",loud=false,subtitle="",duration=0.37}, +N9={file="MARSHAL-N9",suffix="ogg",loud=false,subtitle="",duration=0.40}, +NEGATIVE={file="MARSHAL-Negative",suffix="ogg",loud=false,subtitle="",duration=0.80,subduration=5}, +NEWFB={file="MARSHAL-NewFB",suffix="ogg",loud=false,subtitle="",duration=1.35}, +OPS={file="MARSHAL-Ops",suffix="ogg",loud=false,subtitle="",duration=0.48}, +POINT={file="MARSHAL-Point",suffix="ogg",loud=false,subtitle="",duration=0.33}, +RADIOCHECK={file="MARSHAL-RadioCheck",suffix="ogg",loud=false,subtitle="Radio check",duration=1.20,subduration=5}, +RECOVERY={file="MARSHAL-Recovery",suffix="ogg",loud=false,subtitle="",duration=0.70,subduration=5}, +RECOVERYOPSSTOPPED={file="MARSHAL-RecoveryOpsStopped",suffix="ogg",loud=false,subtitle="",duration=1.65,subduration=5}, +RECOVERYPAUSEDNOTICE={file="MARSHAL-RecoveryPausedNotice",suffix="ogg",loud=false,subtitle="aircraft recovery paused until further notice",duration=2.90,subduration=5}, +RECOVERYPAUSEDRESUMED={file="MARSHAL-RecoveryPausedResumed",suffix="ogg",loud=false,subtitle="",duration=3.40,subduration=5}, +REPORTSEEME={file="MARSHAL-ReportSeeMe",suffix="ogg",loud=false,subtitle="",duration=0.95}, +RESUMERECOVERY={file="MARSHAL-ResumeRecovery",suffix="ogg",loud=false,subtitle="resuming aircraft recovery",duration=1.75,subduraction=5}, +ROGER={file="MARSHAL-Roger",suffix="ogg",loud=false,subtitle="",duration=0.53,subduration=5}, +SAYNEEDLES={file="MARSHAL-SayNeedles",suffix="ogg",loud=false,subtitle="Say needles",duration=0.90,subduration=5}, +STACKFULL={file="MARSHAL-StackFull",suffix="ogg",loud=false,subtitle="Marshal Stack is currently full. Hold outside 10 NM zone and wait for further instructions",duration=6.35,subduration=10}, +STARTINGRECOVERY={file="MARSHAL-StartingRecovery",suffix="ogg",loud=false,subtitle="",duration=2.65,subduration=5}, +CLICK={file="AIRBOSS-RadioClick",suffix="ogg",loud=false,subtitle="",duration=0.35}, +NOISE={file="AIRBOSS-Noise",suffix="ogg",loud=false,subtitle="",duration=3.6}, +} +self:SetVoiceOversLSOByRaynor() +self:SetVoiceOversMarshalByRaynor() +end +function AIRBOSS:SetVoiceOver(radiocall,duration,subtitle,subduration,filename,suffix) +radiocall.duration=duration +radiocall.subtitle=subtitle or radiocall.subtitle +radiocall.file=filename +radiocall.suffix=suffix or".ogg" +end +function AIRBOSS:_GetAircraftAoA(playerData) +local hornet=playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER +local goshawk=playerData.actype==AIRBOSS.AircraftCarrier.T45C +local skyhawk=playerData.actype==AIRBOSS.AircraftCarrier.A4EC +local harrier=playerData.actype==AIRBOSS.AircraftCarrier.AV8B +local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B +local corsair=playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR or playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW +local aoa={} +if hornet then +aoa.SLOW=9.8 +aoa.Slow=9.3 +aoa.OnSpeedMax=8.8 +aoa.OnSpeed=8.1 +aoa.OnSpeedMin=7.4 +aoa.Fast=6.9 +aoa.FAST=6.3 +elseif tomcat then +aoa.SLOW=self:_AoAUnit2Deg(playerData,17.5) +aoa.Slow=self:_AoAUnit2Deg(playerData,16.5) +aoa.OnSpeedMax=self:_AoAUnit2Deg(playerData,16.0) +aoa.OnSpeed=self:_AoAUnit2Deg(playerData,15.0) +aoa.OnSpeedMin=self:_AoAUnit2Deg(playerData,14.0) +aoa.Fast=self:_AoAUnit2Deg(playerData,13.5) +aoa.FAST=self:_AoAUnit2Deg(playerData,12.5) +elseif goshawk then +aoa.SLOW=8.00 +aoa.Slow=7.75 +aoa.OnSpeedMax=7.25 +aoa.OnSpeed=7.00 +aoa.OnSpeedMin=6.75 +aoa.Fast=6.25 +aoa.FAST=6.00 +elseif skyhawk then +aoa.SLOW=10.50 +aoa.Slow=9.50 +aoa.OnSpeedMax=9.25 +aoa.OnSpeed=8.75 +aoa.OnSpeedMin=8.25 +aoa.Fast=8.00 +aoa.FAST=7.00 +elseif harrier then +aoa.SLOW=16.0 +aoa.Slow=13.5 +aoa.OnSpeedMax=12.5 +aoa.OnSpeed=10.0 +aoa.OnSpeedMin=9.5 +aoa.Fast=8.0 +aoa.FAST=7.5 +elseif corsair then +aoa.SLOW=16.0 +aoa.Slow=13.5 +aoa.OnSpeedMax=12.5 +aoa.OnSpeed=10.0 +aoa.OnSpeedMin=9.5 +aoa.Fast=8.0 +aoa.FAST=7.5 +end +return aoa +end +function AIRBOSS:_AoAUnit2Deg(playerData,aoaunits) +local degrees=aoaunits +if playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +degrees=-10+50/30*aoaunits +degrees=0.918*aoaunits-3.411 +elseif playerData.actype==AIRBOSS.AircraftCarrier.A4EC then +degrees=0.5*aoaunits +end +return degrees +end +function AIRBOSS:_AoADeg2Units(playerData,degrees) +local aoaunits=degrees +if playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +aoaunits=(degrees+10)*30/50 +aoaunits=1.089*degrees+3.715 +elseif playerData.actype==AIRBOSS.AircraftCarrier.A4EC then +aoaunits=2*degrees +end +return aoaunits +end +function AIRBOSS:_GetAircraftParameters(playerData,step) +step=step or playerData.step +local hornet=playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER +local skyhawk=playerData.actype==AIRBOSS.AircraftCarrier.A4EC +local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B +local harrier=playerData.actype==AIRBOSS.AircraftCarrier.AV8B +local goshawk=playerData.actype==AIRBOSS.AircraftCarrier.T45C +local corsair=playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR or playerData.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW +local alt +local aoa +local dist +local speed +local aoaac=self:_GetAircraftAoA(playerData) +if step==AIRBOSS.PatternStep.PLATFORM then +alt=UTILS.FeetToMeters(5000) +speed=UTILS.KnotsToMps(250) +elseif step==AIRBOSS.PatternStep.ARCIN then +if tomcat then +speed=UTILS.KnotsToMps(150) +else +speed=UTILS.KnotsToMps(250) +end +elseif step==AIRBOSS.PatternStep.ARCOUT then +if tomcat then +speed=UTILS.KnotsToMps(150) +else +speed=UTILS.KnotsToMps(250) +end +elseif step==AIRBOSS.PatternStep.DIRTYUP then +alt=UTILS.FeetToMeters(1200) +elseif step==AIRBOSS.PatternStep.BULLSEYE then +alt=UTILS.FeetToMeters(1200) +dist=-UTILS.NMToMeters(3) +aoa=aoaac.OnSpeed +elseif step==AIRBOSS.PatternStep.INITIAL then +if hornet or tomcat or harrier then +alt=UTILS.FeetToMeters(800) +speed=UTILS.KnotsToMps(350) +elseif skyhawk then +alt=UTILS.FeetToMeters(600) +speed=UTILS.KnotsToMps(250) +elseif goshawk then +alt=UTILS.FeetToMeters(800) +speed=UTILS.KnotsToMps(300) +elseif corsair then +alt=UTILS.FeetToMeters(300) +speed=UTILS.KnotsToMps(120) +end +elseif step==AIRBOSS.PatternStep.BREAKENTRY then +if hornet or tomcat or harrier then +alt=UTILS.FeetToMeters(800) +speed=UTILS.KnotsToMps(350) +elseif skyhawk then +alt=UTILS.FeetToMeters(600) +speed=UTILS.KnotsToMps(250) +elseif goshawk then +alt=UTILS.FeetToMeters(800) +speed=UTILS.KnotsToMps(300) +elseif corsair then +alt=UTILS.FeetToMeters(200) +speed=UTILS.KnotsToMps(110) +end +elseif step==AIRBOSS.PatternStep.EARLYBREAK then +if hornet or tomcat or harrier or goshawk then +alt=UTILS.FeetToMeters(800) +elseif skyhawk then +alt=UTILS.FeetToMeters(600) +elseif corsair then +alt=UTILS.FeetToMeters(200) +speed=UTILS.KnotsToMps(100) +end +elseif step==AIRBOSS.PatternStep.LATEBREAK then +if hornet or tomcat or harrier or goshawk then +alt=UTILS.FeetToMeters(800) +elseif skyhawk then +alt=UTILS.FeetToMeters(600) +elseif corsair then +alt=UTILS.FeetToMeters(150) +speed=UTILS.KnotsToMps(100) +end +elseif step==AIRBOSS.PatternStep.ABEAM then +if hornet or tomcat or harrier or goshawk then +alt=UTILS.FeetToMeters(600) +elseif skyhawk then +alt=UTILS.FeetToMeters(500) +elseif corsair then +alt=UTILS.FeetToMeters(150) +speed=UTILS.KnotsToMps(90) +end +aoa=aoaac.OnSpeed +if goshawk then +dist=UTILS.NMToMeters(0.9) +elseif harrier then +dist=UTILS.NMToMeters(0.9) +else +dist=UTILS.NMToMeters(1.1) +end +elseif step==AIRBOSS.PatternStep.NINETY then +if hornet or tomcat then +alt=UTILS.FeetToMeters(500) +elseif goshawk then +alt=UTILS.FeetToMeters(450) +elseif skyhawk then +alt=UTILS.FeetToMeters(500) +elseif harrier then +alt=UTILS.FeetToMeters(425) +elseif corsair then +alt=UTILS.FeetToMeters(90) +speed=UTILS.KnotsToMps(90) +end +aoa=aoaac.OnSpeed +elseif step==AIRBOSS.PatternStep.WAKE then +if hornet or goshawk then +alt=UTILS.FeetToMeters(370) +elseif tomcat then +alt=UTILS.FeetToMeters(430) +elseif skyhawk then +alt=UTILS.FeetToMeters(370) +elseif corsair then +alt=UTILS.FeetToMeters(80) +end +aoa=aoaac.OnSpeed +elseif step==AIRBOSS.PatternStep.FINAL then +if hornet or goshawk then +alt=UTILS.FeetToMeters(300) +elseif tomcat then +alt=UTILS.FeetToMeters(360) +elseif skyhawk then +alt=UTILS.FeetToMeters(300) +elseif harrier then +alt=UTILS.FeetToMeters(312) +elseif corsair then +alt=UTILS.FeetToMeters(80) +end +aoa=aoaac.OnSpeed +end +return alt,aoa,dist,speed +end +function AIRBOSS:_GetNextMarshalFight() +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +local stack=flight.flag +local Tmarshal=timer.getAbsTime()-flight.time +local TmarshalMin=2*60 +if flight.ai then +TmarshalMin=3*60 +end +if flight.holding~=nil and Tmarshal>=TmarshalMin then +if flight.case==1 and stack==1 or flight.case>1 then +if flight.ai then +return flight +else +if flight.step~=AIRBOSS.PatternStep.COMMENCING then +return flight +end +end +end +end +end +return nil +end +function AIRBOSS:_CheckQueue() +if self.Debug then +self:_PrintQueue(self.flights,"All Flights") +end +self:_PrintQueue(self.Qmarshal,"Marshal") +self:_PrintQueue(self.Qpattern,"Pattern") +self:_PrintQueue(self.Qwaiting,"Waiting") +self:_PrintQueue(self.Qspinning,"Spinning") +if self.case>1 then +for _,_flight in pairs(self.Qwaiting)do +local flight=_flight +local removed=self:_RemoveFlightFromQueue(self.Qwaiting,flight) +if removed then +local stack=self:_GetFreeStack(flight.ai) +self:T(self.lid..string.format("Moving flight %s onboard %s from Waiting queue to Case %d Marshal stack %d",flight.groupname,flight.onboard,self.case,stack)) +if flight.ai then +self:_MarshalAI(flight,stack) +else +self:_MarshalPlayer(flight,stack) +end +break +end +end +end +if not self:IsRecovering()then +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +if(flight.case==1 and self.case>1)or(flight.case>1 and self.case==1)then +local removed=self:_RemoveFlightFromQueue(self.Qmarshal,flight) +if removed then +local stack=self:_GetFreeStack(flight.ai) +self:T(self.lid..string.format("Moving flight %s onboard %s from Marshal Case %d ==> %d Marshal stack %d",flight.groupname,flight.onboard,flight.case,self.case,stack)) +if flight.ai then +self:_MarshalAI(flight,stack) +else +self:_MarshalPlayer(flight,stack) +end +break +elseif flight.case~=self.case then +flight.case=self.case +end +end +end +return +end +local _,npattern=self:_GetQueueInfo(self.Qpattern) +local _,nspinning=self:_GetQueueInfo(self.Qspinning) +local marshalflight=self:_GetNextMarshalFight() +if marshalflight and npattern<self.Nmaxpattern and nspinning==0 then +local Tmarshal=timer.getAbsTime()-marshalflight.time +self:T(self.lid..string.format("Marshal time of next group %s = %d seconds",marshalflight.groupname,Tmarshal)) +local Tpattern=9999 +local npunits=1 +local pcase=1 +if npattern>0 then +local patternflight=self.Qpattern[#self.Qpattern] +pcase=patternflight.case +local npunits=self:_GetFlightUnits(patternflight,false) +Tpattern=timer.getAbsTime()-patternflight.time +self:T(self.lid..string.format("Pattern time of last group %s = %d seconds. # of units=%d.",patternflight.groupname,Tpattern,npunits)) +end +local TpatternMin +if pcase==1 then +TpatternMin=2*60*npunits +else +TpatternMin=2*60*npunits +end +if Tpattern>TpatternMin then +self:T(self.lid..string.format("Sending marshal flight %s to pattern.",marshalflight.groupname)) +self:_ClearForLanding(marshalflight) +end +end +end +function AIRBOSS:_ClearForLanding(flight) +if flight.ai then +self:_RemoveFlightFromMarshalQueue(flight,false) +self:_LandAI(flight) +self:_MarshalCallClearedForRecovery(flight.onboard,flight.case) +if self.xtVoiceOversAI then +local leader=flight.group:GetUnits()[1] +self:_CommencingCall(leader,flight.onboard) +end +else +if flight.step~=AIRBOSS.PatternStep.COMMENCING then +self:_MarshalCallClearedForRecovery(flight.onboard,flight.case) +flight.time=timer.getAbsTime() +end +self:_SetPlayerStep(flight,AIRBOSS.PatternStep.COMMENCING,3) +end +end +function AIRBOSS:_SetPlayerStep(playerData,step,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,self._SetPlayerStep,self,playerData,step) +else +if playerData then +playerData.step=step +playerData.warning=nil +self:_StepHint(playerData) +end +end +end +function AIRBOSS:_ScanCarrierZone() +local coord=self:GetCoordinate() +local RCCZ=self.zoneCCA:GetRadius() +self:T(self.lid..string.format("Scanning Carrier Controlled Area. Radius=%.1f NM.",UTILS.MetersToNM(RCCZ))) +local _,_,_,unitscan=coord:ScanObjects(RCCZ,true,false,false) +local insideCCA={} +for _,_unit in pairs(unitscan)do +local unit=_unit +local airborne=unit:IsAir() +local inzone=unit:IsInZone(self.zoneCCA) +local friendly=self:GetCoalition()==unit:GetCoalition() +local carrierac=self:_IsCarrierAircraft(unit) +if airborne and inzone and friendly and carrierac then +local group=unit:GetGroup() +local groupname=group:GetName() +if insideCCA[groupname]==nil then +insideCCA[groupname]=group +end +end +end +for groupname,_group in pairs(insideCCA)do +local group=_group +local knownflight=self:_GetFlightFromGroupInQueue(group,self.flights) +local actype=group:GetTypeName() +if knownflight then +self:T2(self.lid..string.format("Known flight group %s of type %s in CCA.",groupname,actype)) +if knownflight.ai and knownflight.flag==-100 and self.handleai then +local putintomarshal=false +local flight=_DATABASE:GetOpsGroup(groupname) +if flight and flight:IsInbound()and flight.destbase:GetName()==self.carrier:GetName()then +if flight.ishelo then +else +putintomarshal=true +end +flight.airboss=self +end +if putintomarshal then +local stack=self:_GetFreeStack(knownflight.ai) +local respawn=self.respawnAI +if stack then +self:_MarshalAI(knownflight,stack,respawn) +else +if not self:_InQueue(self.Qwaiting,knownflight.group)then +self:_WaitAI(knownflight,respawn) +end +end +break +end +end +else +if not self:_IsHuman(group)then +self:_CreateFlightGroup(group) +end +end +end +local remove={} +for _,_flight in pairs(self.flights)do +local flight=_flight +if insideCCA[flight.groupname]==nil then +if flight.ai and not(self:_InQueue(self.Qmarshal,flight.group)or self:_InQueue(self.Qpattern,flight.group))then +table.insert(remove,flight) +end +end +end +for _,flight in pairs(remove)do +self:_RemoveFlightFromQueue(self.flights,flight) +end +end +function AIRBOSS:_WaitPlayer(playerData) +if playerData then +local nwaiting=#self.Qwaiting +self:_MarshalCallStackFull(playerData.onboard,nwaiting) +table.insert(self.Qwaiting,playerData) +playerData.time=timer.getAbsTime() +playerData.step=AIRBOSS.PatternStep.WAITING +playerData.warning=nil +for _,_flight in pairs(playerData.section)do +local flight=_flight +flight.step=AIRBOSS.PatternStep.WAITING +flight.time=timer.getAbsTime() +flight.warning=nil +end +end +end +function AIRBOSS:_MarshalPlayer(playerData,stack) +if playerData then +self:_AddMarshalGroup(playerData,stack) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.HOLDING) +playerData.holding=nil +for _,_flight in pairs(playerData.section)do +local flight=_flight +self:_SetPlayerStep(flight,AIRBOSS.PatternStep.HOLDING) +flight.holding=nil +flight.case=playerData.case +flight.flag=stack +self:Marshal(flight) +end +else +self:E(self.lid.."ERROR: Could not add player to Marshal stack! playerData=nil") +end +end +function AIRBOSS:_WaitAI(flight,respawn) +flight.flag=-99 +table.insert(self.Qwaiting,flight) +local group=flight.group +local groupname=flight.groupname +local speedOrbitMps=UTILS.KnotsToMps(274) +local speedOrbitKmh=UTILS.KnotsToKmph(274) +local speedTransit=UTILS.KnotsToKmph(370) +local cv=self:GetCoordinate() +local fc=group:GetCoordinate() +local hdg=self:GetHeading(false) +local hdgto=cv:HeadingTo(fc) +local angels=math.random(6,10) +local altitude=UTILS.FeetToMeters(angels*1000) +local p0=cv:Translate(UTILS.NMToMeters(11),hdgto):Translate(UTILS.NMToMeters(5),hdg):SetAltitude(altitude) +local wp={} +wp[1]=group:GetCoordinate():WaypointAirTurningPoint(nil,speedTransit,{},"Current Position") +local taskorbit=group:TaskOrbit(p0,altitude,speedOrbitMps) +wp[#wp+1]=p0:WaypointAirTurningPoint(nil,speedOrbitKmh,{taskorbit},string.format("Waiting Orbit at Angels %d",angels)) +if self.Debug then +p0:MarkToAll(string.format("Waiting Orbit of flight %s at Angels %s",groupname,angels)) +end +if respawn then +local Template=group:GetTemplate() +Template.route.points=wp +group=group:Respawn(Template,true) +end +group:WayPointInitialize(wp) +group:Route(wp,1) +end +function AIRBOSS:_MarshalAI(flight,nstack,respawn) +self:F2({flight=flight,nstack=nstack,respawn=respawn}) +if flight==nil or flight.group==nil then +self:E(self.lid.."ERROR: flight or flight.group is nil.") +return +end +if flight.group:GetCoordinate()==nil then +self:E(self.lid.."ERROR: cannot get coordinate of flight group.") +return +end +if not self:_InQueue(self.Qmarshal,flight.group)then +if self.xtVoiceOversAI then +local leader=flight.group:GetUnits()[1] +self:_MarshallInboundCall(leader,flight.onboard) +end +self:_AddMarshalGroup(flight,nstack) +end +local case=flight.case +local ostack=flight.flag +local group=flight.group +local groupname=flight.groupname +flight.flag=nstack +local Carrier=self:GetCoordinate() +local hdg=self:GetHeading() +local speedOrbitMps=UTILS.KnotsToMps(274) +local speedOrbitKmh=UTILS.KnotsToKmph(274) +local speedTransit=UTILS.KnotsToKmph(370) +local altitude +local p0 +local p1 +local p2 +altitude,p1,p2=self:_GetMarshalAltitude(nstack,case) +local wp={} +if not flight.holding then +self:T(self.lid..string.format("Guiding AI flight %s to marshal stack %d-->%d.",groupname,ostack,nstack)) +wp[1]=group:GetCoordinate():WaypointAirTurningPoint(nil,speedTransit,{},"Current Position") +local TaskArrivedHolding=flight.group:TaskFunction("AIRBOSS._ReachedHoldingZone",self,flight) +if case==1 then +local pE=Carrier:Translate(UTILS.NMToMeters(7),hdg-30):SetAltitude(altitude) +p0=Carrier:Translate(UTILS.NMToMeters(5),hdg-135):SetAltitude(altitude) +wp[#wp+1]=pE:WaypointAirTurningPoint(nil,speedTransit,{TaskArrivedHolding},"Entering Case I Marshal Pattern") +else +local radial=self:GetRadial(case,false,true) +p0=p2:Translate(UTILS.NMToMeters(5),radial+90,true):Translate(UTILS.NMToMeters(5),radial,true) +wp[#wp+1]=p0:WaypointAirTurningPoint(nil,speedTransit,{TaskArrivedHolding},"Entering Case II/III Marshal Pattern") +end +else +self:T(self.lid..string.format("Updating AI flight %s at marshal stack %d-->%d.",groupname,ostack,nstack)) +wp[1]=group:GetCoordinate():WaypointAirTurningPoint(nil,speedOrbitKmh,{},"Current Position") +p0=group:GetCoordinate():Translate(UTILS.NMToMeters(0.2),group:GetHeading(),true) +end +local taskorbit=group:TaskOrbit(p1,altitude,speedOrbitMps,p2) +wp[#wp+1]=p0:WaypointAirTurningPoint(nil,speedOrbitKmh,{taskorbit},string.format("Marshal Orbit Stack %d",nstack)) +if self.Debug then +p0:MarkToAll("WP P0 "..groupname) +p1:MarkToAll("RT P1 "..groupname) +p2:MarkToAll("RT P2 "..groupname) +end +if respawn then +local Template=group:GetTemplate() +Template.route.points=wp +flight.group=group:Respawn(Template,true) +end +flight.group:WayPointInitialize(wp) +flight.group:Route(wp,1) +self:Marshal(flight) +end +function AIRBOSS:_RefuelAI(flight) +local wp={} +local CurrentSpeed=flight.group:GetVelocityKMH() +wp[#wp+1]=flight.group:GetCoordinate():WaypointAirTurningPoint(nil,CurrentSpeed,{},"Current position") +local refuelac=false +local actype=flight.group:GetTypeName() +if actype==AIRBOSS.AircraftCarrier.AV8B or +actype==AIRBOSS.AircraftCarrier.F14A or +actype==AIRBOSS.AircraftCarrier.F14B or +actype==AIRBOSS.AircraftCarrier.F14A_AI or +actype==AIRBOSS.AircraftCarrier.HORNET or +actype==AIRBOSS.AircraftCarrier.RHINOE or +actype==AIRBOSS.AircraftCarrier.RHINOF or +actype==AIRBOSS.AircraftCarrier.GROWLER or +actype==AIRBOSS.AircraftCarrier.FA18C or +actype==AIRBOSS.AircraftCarrier.S3B or +actype==AIRBOSS.AircraftCarrier.S3BTANKER then +refuelac=true +end +local text="" +if self.tanker and refuelac then +local tankerpos=self.tanker.tanker:GetCoordinate() +local TaskRefuel=flight.group:TaskRefueling() +local TaskMarshal=flight.group:TaskFunction("AIRBOSS._TaskFunctionMarshalAI",self,flight) +wp[#wp+1]=tankerpos:WaypointAirTurningPoint(nil,CurrentSpeed,{TaskRefuel,TaskMarshal},"Refueling") +self:_MarshalCallGasAtTanker(flight.onboard) +else +local divertfield=self:GetCoordinate():GetClosestAirbase(Airbase.Category.AIRDROME,self:GetCoalition()) +if divertfield==nil then +divertfield=self:GetCoordinate():GetClosestAirbase(Airbase.Category.AIRDROME,0) +end +if divertfield then +local divertcoord=divertfield:GetCoordinate() +wp[#wp+1]=divertcoord:WaypointAirLanding(UTILS.KnotsToKmph(300),divertfield,{},"Divert Field") +self:_MarshalCallGasAtDivert(flight.onboard,divertfield:GetName()) +local Template=flight.group:GetTemplate() +Template.route.points=wp +flight.group=flight.group:Respawn(Template,true) +else +self:E(self.lid..string.format("WARNING: No recovery tanker or divert field available for group %s.",flight.groupname)) +flight.refueling=true +return +end +end +flight.group:WayPointInitialize(wp) +flight.group:Route(wp,1) +flight.refueling=true +end +function AIRBOSS:_LandAI(flight) +self:T(self.lid..string.format("Landing AI flight %s.",flight.groupname)) +local Speed=UTILS.KnotsToKmph(200) +if flight.actype==AIRBOSS.AircraftCarrier.HORNET +or flight.actype==AIRBOSS.AircraftCarrier.FA18C +or flight.actype==AIRBOSS.AircraftCarrier.RHINOE +or flight.actype==AIRBOSS.AircraftCarrier.RHINOF +or flight.actype==AIRBOSS.AircraftCarrier.GROWLER then +Speed=UTILS.KnotsToKmph(200) +elseif flight.actype==AIRBOSS.AircraftCarrier.E2D or flight.actype==AIRBOSS.AircraftCarrier.C2A then +Speed=UTILS.KnotsToKmph(150) +elseif flight.actype==AIRBOSS.AircraftCarrier.F14A_AI or flight.actype==AIRBOSS.AircraftCarrier.F14A or flight.actype==AIRBOSS.AircraftCarrier.F14B then +Speed=UTILS.KnotsToKmph(175) +elseif flight.actype==AIRBOSS.AircraftCarrier.S3B or flight.actype==AIRBOSS.AircraftCarrier.S3BTANKER then +Speed=UTILS.KnotsToKmph(140) +elseif flight.actype==AIRBOSS.AircraftCarrier.CORSAIR or flight.actype==AIRBOSS.AircraftCarrier.CORSAIR_CW then +Speed=UTILS.KnotsToKmph(100) +end +local Carrier=self:GetCoordinate() +local hdg=self:GetHeading() +local wp={} +local CurrentSpeed=flight.group:GetVelocityKMH() +wp[#wp+1]=flight.group:GetCoordinate():WaypointAirTurningPoint(nil,CurrentSpeed,{},"Current position") +local alt=UTILS.FeetToMeters(800) +wp[#wp+1]=Carrier:Translate(UTILS.NMToMeters(4),hdg-160):SetAltitude(alt):WaypointAirLanding(Speed,self.airbase,nil,"Landing") +flight.group:WayPointInitialize(wp) +flight.group:Route(wp,0) +end +function AIRBOSS:_GetMarshalAltitude(stack,case) +if stack<=0 then +return 0,nil,nil +end +case=case or self.case +local Carrier=self:GetCoordinate() +local angels0 +local Dist +local p1=nil +local p2=nil +local nstack=stack-1 +if case==1 then +angels0=2 +local hdg=self.carrier:GetHeading() +p1=Carrier +p2=Carrier:Translate(UTILS.NMToMeters(1.5),hdg) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +p1=Carrier:Translate(UTILS.NMToMeters(1.0),hdg+90) +p2=p1:Translate(2.5,hdg) +end +else +angels0=6 +Dist=UTILS.NMToMeters(nstack+angels0+15) +local radial=self:GetRadial(case,false,true) +local l=UTILS.NMToMeters(10) +p1=Carrier:Translate(Dist+l,radial) +p2=Carrier:Translate(Dist,radial) +end +local altitude=UTILS.FeetToMeters((nstack+angels0)*1000) +p1:SetAltitude(altitude,true) +p2:SetAltitude(altitude,true) +return altitude,p1,p2 +end +function AIRBOSS:_GetCharlieTime(flightgroup) +local stack=flightgroup.flag +if stack<=0 then +return nil +end +local Tnow=timer.getAbsTime() +local Tcharlie=0 +local Trecovery=0 +if self.recoverywindow then +Trecovery=math.max(self.recoverywindow.START-Tnow,0) +else +Trecovery=7*60 +end +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +local mstack=flight.flag +local Tarrive=0 +local Tholding=3*60 +if stack>0 and mstack>0 and mstack<=stack then +if flight.holding==nil then +local holdingzone=self:_GetZoneHolding(flight.case,1):GetCoordinate() +local d0=holdingzone:Get2DDistance(flight.group:GetCoordinate()) +local v0=flight.group:GetVelocityMPS() +Tarrive=d0/v0 +self:T3(self.lid..string.format("Tarrive=%.1f seconds, Clock %s",Tarrive,UTILS.SecondsToClock(Tnow+Tarrive))) +else +if mstack==1 then +local tholding=timer.getAbsTime()-flight.time +Tholding=math.max(3*60-tholding,0) +end +end +local Tmin=math.max(Tarrive,Trecovery) +Tcharlie=math.max(Tmin,Tcharlie)+Tholding +end +end +Tcharlie=Tcharlie+Tnow +local text=string.format("Charlie time for flight %s (%s) %s",flightgroup.onboard,flightgroup.groupname,UTILS.SecondsToClock(Tcharlie)) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +return Tcharlie +end +function AIRBOSS:_AddMarshalGroup(flight,stack) +flight.flag=stack +flight.case=self.case +table.insert(self.Qmarshal,flight) +local P=UTILS.hPa2inHg(self:GetCoordinate():GetPressure()) +local alt=self:_GetMarshalAltitude(stack,flight.case) +local brc=self:GetBRC() +if self.recoverywindow and self.recoverywindow.WIND then +brc=self:GetBRCintoWind(self.recoverywindow.SPEED) +end +flight.Tcharlie=self:_GetCharlieTime(flight) +local Ccharlie=UTILS.SecondsToClock(flight.Tcharlie) +brc=brc%360 +self:_MarshalCallArrived(flight.onboard,flight.case,brc,alt,Ccharlie,P) +if self.TACANon and(not flight.ai)and flight.difficulty==AIRBOSS.Difficulty.EASY then +local radial=self:GetRadial(flight.case,true,true,true) +if flight.case==1 then +radial=self:GetBRC() +end +local text=string.format("Select TACAN %03d°, channel %d%s (%s)",radial,self.TACANchannel,self.TACANmode,self.TACANmorse) +self:MessageToPlayer(flight,text,nil,"") +end +end +function AIRBOSS:_CollapseMarshalStack(flight,nopattern) +self:F2({flight=flight,nopattern=nopattern}) +local case=flight.case +local stack=flight.flag +if stack<=0 then +self:E(self.lid..string.format("ERROR: Flight %s is has stack value %d<0. Cannot collapse stack!",flight.groupname,stack)) +return +end +self.Tcollapse=timer.getTime() +for _,_flight in pairs(self.Qmarshal)do +local mflight=_flight +if(case==1 and mflight.case==1)then +local mstack=mflight.flag +if mstack>stack then +local newstack=self:_GetFreeStack(mflight.ai,mflight.case,true) +if newstack and newstack<mstack then +self:T(self.lid..string.format("Collapse Marshal: Flight %s (case %d) is changing marshal stack %d --> %d.",mflight.groupname,mflight.case,mstack,newstack)) +if mflight.ai then +self:_MarshalAI(mflight,newstack) +else +mflight.flag=newstack +local angels=self:_GetAngels(self:_GetMarshalAltitude(newstack,case)) +if mflight.difficulty~=AIRBOSS.Difficulty.HARD then +local text=string.format("descent to stack at Angels %d.",angels) +self:MessageToPlayer(mflight,text,"MARSHAL") +end +mflight.time=timer.getAbsTime() +for _,_sec in pairs(mflight.section)do +local sec=_sec +sec.flag=newstack +sec.time=timer.getAbsTime() +if sec.difficulty~=AIRBOSS.Difficulty.HARD then +local text=string.format("descent to stack at Angels %d.",angels) +self:MessageToPlayer(sec,text,"MARSHAL") +end +end +end +end +end +end +end +if nopattern then +self:T(self.lid..string.format("Flight %s is leaving stack but not going to pattern.",flight.groupname)) +else +local Tmarshal=UTILS.SecondsToClock(timer.getAbsTime()-flight.time) +self:T(self.lid..string.format("Flight %s is leaving marshal after %s and going pattern.",flight.groupname,Tmarshal)) +self:_AddFlightToPatternQueue(flight) +end +flight.flag=-1 +flight.time=timer.getAbsTime() +end +function AIRBOSS:_GetFreeStack(ai,case,empty) +case=case or self.case +if case==1 then +return self:_GetFreeStack_Old(ai,case,empty) +end +local nmaxstacks=100 +if case==1 then +nmaxstacks=self.Nmaxmarshal +end +local stack={} +for i=1,nmaxstacks do +stack[i]=self.NmaxStack +end +local nmax=1 +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +if flight.case==case then +local n=flight.flag +if n>nmax then +nmax=n +end +if n>0 then +if flight.ai or flight.case>1 then +stack[n]=0 +else +stack[n]=stack[n]-1 +end +else +self:E(string.format("ERROR: Flight %s in marshal stack has stack value <= 0. Stack value is %d.",flight.groupname,n)) +end +end +end +local nfree=nil +if stack[nmax]==0 then +if case==1 then +if nmax>=nmaxstacks then +nfree=nil +else +nfree=nmax+1 +end +else +nfree=nmax+1 +end +elseif stack[nmax]==self.NmaxStack then +self:E(self.lid..string.format("ERROR: Max occupied stack is empty. Should not happen! Nmax=%d, stack[nmax]=%d",nmax,stack[nmax])) +nfree=nmax +else +if ai or empty or case>1 then +nfree=nmax+1 +else +nfree=nmax +end +end +self:T(self.lid..string.format("Returning free stack %s",tostring(nfree))) +return nfree +end +function AIRBOSS:_GetFreeStack_Old(ai,case,empty) +case=case or self.case +local nmaxstacks=100 +if case==1 then +nmaxstacks=self.Nmaxmarshal +end +local stack={} +for i=1,nmaxstacks do +stack[i]=self.NmaxStack +end +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +if flight.case==case then +local n=flight.flag +if n>0 then +if flight.ai or flight.case>1 then +stack[n]=0 +else +stack[n]=stack[n]-1 +end +else +self:E(string.format("ERROR: Flight %s in marshal stack has stack value <= 0. Stack value is %d.",flight.groupname,n)) +end +end +end +local nfree=nil +for i=1,nmaxstacks do +self:T2(self.lid..string.format("FF Stack[%d]=%d",i,stack[i])) +if ai or empty or case>1 then +if stack[i]==self.NmaxStack then +nfree=i +return i +end +else +if stack[i]>0 then +nfree=i +return i +end +end +end +return nfree +end +function AIRBOSS:_GetFlightUnits(flight,onground) +local inair=true +if onground==true then +inair=false +end +local function countunits(_group,inair) +local group=_group +local units=group:GetUnits() +local n=0 +if units then +for _,_unit in pairs(units)do +local unit=_unit +if unit and unit:IsAlive()then +if inair then +if unit:InAir()then +self:T2(self.lid..string.format("Unit %s is in AIR",unit:GetName())) +n=n+1 +end +else +n=n+1 +end +end +end +end +return n +end +local nunits=countunits(flight.group,inair) +local nsection=0 +for _,sec in pairs(flight.section)do +local secflight=sec +nsection=nsection+countunits(secflight.group,inair) +end +return nunits+nsection,nunits,nsection +end +function AIRBOSS:_GetQueueInfo(queue,case) +local ngroup=0 +local Nunits=0 +for _,_flight in pairs(queue)do +local flight=_flight +if case then +if(flight.case==case)or(case==23 and(flight.case==2 or flight.case==3))then +local ntot,nunits,nsection=self:_GetFlightUnits(flight) +Nunits=Nunits+ntot +if ntot>0 then +ngroup=ngroup+1 +end +end +else +local ntot,nunits,nsection=self:_GetFlightUnits(flight) +Nunits=Nunits+ntot +if ntot>0 then +ngroup=ngroup+1 +end +end +end +return ngroup,Nunits +end +function AIRBOSS:_PrintQueue(queue,name) +local Nqueue,nqueue=self:_GetQueueInfo(queue) +local text=string.format("%s Queue N=%d (#%d), n=%d:",name,Nqueue,#queue,nqueue) +if#queue==0 then +text=text.." empty." +else +for i,_flight in pairs(queue)do +local flight=_flight +local clock=UTILS.SecondsToClock(timer.getAbsTime()-flight.time) +local case=flight.case +local stack=flight.flag +local fuel=flight.group:GetFuelMin()*100 +local ai=tostring(flight.ai) +local lead=flight.seclead +local Nsec=#flight.section +local actype=self:_GetACNickname(flight.actype) +local onboard=flight.onboard +local holding=tostring(flight.holding) +local _,nunits,nsec=self:_GetFlightUnits(flight,false) +text=text..string.format("\n[%d] %s*%d (%s): lead=%s (%d/%d), onboard=%s, flag=%d, case=%d, time=%s, fuel=%d, ai=%s, holding=%s",i,flight.groupname,nunits,actype,lead,nsec,Nsec,onboard,stack,case,clock,fuel,ai,holding) +if stack>0 then +local alt=UTILS.MetersToFeet(self:_GetMarshalAltitude(stack,case)) +text=text..string.format(" stackalt=%d ft",alt) +end +for j,_element in pairs(flight.elements)do +local element=_element +text=text..string.format("\n (%d) %s (%s): ai=%s, ballcall=%s, recovered=%s",j,element.onboard,element.unitname,tostring(element.ai),tostring(element.ballcall),tostring(element.recovered)) +end +end +end +self:T(self.lid..text) +end +function AIRBOSS:_CreateFlightGroup(group) +self:T(self.lid..string.format("Creating new flight for group %s of aircraft type %s.",group:GetName(),group:GetTypeName())) +local flight={} +if not self:_InQueue(self.flights,group)then +local groupname=group:GetName() +local human,playername=self:_IsHuman(group) +flight.group=group +flight.groupname=group:GetName() +flight.nunits=#group:GetUnits() +flight.time=timer.getAbsTime() +flight.dist0=group:GetCoordinate():Get2DDistance(self:GetCoordinate()) +flight.flag=-100 +flight.ai=not human +flight.actype=group:GetTypeName() +flight.onboardnumbers=self:_GetOnboardNumbers(group) +flight.seclead=flight.group:GetUnit(1):GetName() +flight.section={} +flight.ballcall=false +flight.refueling=false +flight.holding=nil +flight.name=flight.group:GetUnit(1):GetName() +flight.case=self.case +local text=string.format("Flight elements of group %s:",flight.groupname) +flight.elements={} +local units=group:GetUnits() +for i,_unit in pairs(units)do +local unit=_unit +local element={} +element.unit=unit +element.unitname=unit:GetName() +element.onboard=flight.onboardnumbers[element.unitname] +element.ballcall=false +element.ai=not self:_IsHumanUnit(unit) +element.recovered=nil +text=text..string.format("\n[%d] %s onboard #%s, AI=%s",i,element.unitname,tostring(element.onboard),tostring(element.ai)) +table.insert(flight.elements,element) +end +self:T(self.lid..text) +if flight.ai then +local onboard=flight.onboardnumbers[flight.seclead] +flight.onboard=onboard +else +flight.onboard=self:_GetOnboardNumberPlayer(group) +end +table.insert(self.flights,flight) +else +self:E(self.lid..string.format("ERROR: Flight group %s already exists in self.flights!",group:GetName())) +return nil +end +return flight +end +function AIRBOSS:_NewPlayer(unitname) +local playerunit,playername=self:_GetPlayerUnitAndName(unitname) +if playerunit and playername then +local group=playerunit:GetGroup() +local playerData +playerData=self:_CreateFlightGroup(group) +if playerData then +playerData.unit=playerunit +playerData.unitname=unitname +playerData.name=playername +playerData.callsign=playerData.unit:GetCallsign() +playerData.client=CLIENT:FindByName(unitname,nil,true) +playerData.seclead=playername +playerData.passes=0 +playerData.messages={} +playerData.lastdebrief=playerData.lastdebrief or{} +playerData.attitudemonitor=false +if playerData.trapon==nil then +playerData.trapon=self.trapsheet +end +playerData.difficulty=playerData.difficulty or self.defaultskill +if playerData.subtitles==nil then +playerData.subtitles=true +end +if playerData.showhints==nil then +if playerData.difficulty==AIRBOSS.Difficulty.HARD then +playerData.showhints=false +else +playerData.showhints=true +end +end +playerData.points={} +playerData=self:_InitPlayer(playerData) +self.players[playername]=playerData +self.playerscores[playername]=self.playerscores[playername]or{} +if self.welcome then +self:MessageToPlayer(playerData,string.format("Welcome, %s %s!",playerData.difficulty,playerData.name),string.format("AIRBOSS %s",self.alias),"",5) +end +end +return playerData +end +return nil +end +function AIRBOSS:_InitPlayer(playerData,step) +self:T(self.lid..string.format("Initializing player data for %s callsign %s.",playerData.name,playerData.callsign)) +playerData.step=step or AIRBOSS.PatternStep.UNDEFINED +playerData.groove={} +playerData.debrief={} +playerData.trapsheet={} +playerData.warning=nil +playerData.holding=nil +playerData.refueling=false +playerData.valid=false +playerData.lig=false +playerData.wop=false +playerData.waveoff=false +playerData.wofd=false +playerData.owo=false +playerData.boltered=false +playerData.hover=false +playerData.stable=false +playerData.landed=false +playerData.Tlso=timer.getTime() +playerData.Tgroove=nil +playerData.TIG0=0 +playerData.wire=nil +playerData.flag=-100 +playerData.debriefschedulerID=nil +if playerData.group:GetName():match("Groove")and playerData.passes==0 then +self:MessageToPlayer(playerData,"Group name contains \"Groove\". Happy groove testing.") +playerData.attitudemonitor=true +playerData.step=AIRBOSS.PatternStep.FINAL +self:_AddFlightToPatternQueue(playerData) +self.dTstatus=0.1 +end +return playerData +end +function AIRBOSS:_GetFlightFromGroupInQueue(group,queue) +if group then +local name=group:GetName() +for i,_flight in pairs(queue)do +local flight=_flight +if flight.groupname==name then +return flight,i +end +end +self:T2(self.lid..string.format("WARNING: Flight group %s could not be found in queue.",name)) +end +self:T2(self.lid..string.format("WARNING: Flight group could not be found in queue. Group is nil!")) +return nil,nil +end +function AIRBOSS:_GetFlightElement(unitname) +local unit=UNIT:FindByName(unitname) +if unit then +local flight=self:_GetFlightFromGroupInQueue(unit:GetGroup(),self.flights) +if flight then +for i,_element in pairs(flight.elements)do +local element=_element +if element.unit:GetName()==unitname then +return element,i,flight +end +end +self:T2(self.lid..string.format("WARNING: Flight element %s could not be found in flight group.",unitname,flight.groupname)) +end +end +return nil,nil,nil +end +function AIRBOSS:_RemoveFlightElement(unitname) +local element,idx,flight=self:_GetFlightElement(unitname) +if idx then +table.remove(flight.elements,idx) +return true +else +self:T("WARNING: Flight element could not be removed from flight group. Index=nil!") +return nil +end +end +function AIRBOSS:_InQueue(queue,group) +local name=group:GetName() +for _,_flight in pairs(queue)do +local flight=_flight +if name==flight.groupname then +return true +end +end +return false +end +function AIRBOSS:_RemoveDeadFlightGroups() +for i=#self.flight,1,-1 do +local flight=self.flights[i] +if not flight.group:IsAlive()then +self:T(string.format("Removing dead flight group %s from ALL flights table.",flight.groupname)) +table.remove(self.flights,i) +end +end +for i=#self.Qmarshal,1,-1 do +local flight=self.Qmarshal[i] +if not flight.group:IsAlive()then +self:T(string.format("Removing dead flight group %s from Marshal Queue table.",flight.groupname)) +table.remove(self.Qmarshal,i) +end +end +for i=#self.Qpattern,1,-1 do +local flight=self.Qpattern[i] +if not flight.group:IsAlive()then +self:T(string.format("Removing dead flight group %s from Pattern Queue table.",flight.groupname)) +table.remove(self.Qpattern,i) +end +end +end +function AIRBOSS:_GetLeadFlight(flight) +local lead=flight +if flight.name~=flight.seclead then +lead=self.players[flight.seclead] +end +return lead +end +function AIRBOSS:_CheckSectionRecovered(flight) +if flight==nil then +return true +end +local lead=self:_GetLeadFlight(flight) +for _,_element in pairs(lead.elements)do +local element=_element +if not element.recovered then +return false +end +end +for _,_section in pairs(lead.section)do +local sectionmember=_section +for _,_element in pairs(sectionmember.elements)do +local element=_element +if not element.recovered then +return false +end +end +end +self:_RemoveFlightFromQueue(self.Qpattern,lead) +if self:_InQueue(self.Qmarshal,lead.group)then +self:E(self.lid..string.format("ERROR: lead flight group %s should not be in marshal queue",lead.groupname)) +self:_RemoveFlightFromMarshalQueue(lead,true) +end +if self:_InQueue(self.Qwaiting,lead.group)then +self:E(self.lid..string.format("ERROR: lead flight group %s should not be in pattern queue",lead.groupname)) +self:_RemoveFlightFromQueue(self.Qwaiting,lead) +end +return true +end +function AIRBOSS:_AddFlightToPatternQueue(flight) +table.insert(self.Qpattern,flight) +flight.flag=-1 +flight.time=timer.getAbsTime() +flight.recovered=false +for _,elem in pairs(flight.elements)do +elem.recoverd=false +end +for _,sec in pairs(flight.section)do +sec.flag=-1 +sec.time=timer.getAbsTime() +for _,elem in pairs(sec.elements)do +elem.recoverd=false +end +end +end +function AIRBOSS:_RecoveredElement(unit) +local element,idx,flight=self:_GetFlightElement(unit:GetName()) +if element then +element.recovered=true +end +return flight +end +function AIRBOSS:_RemoveFlightFromMarshalQueue(flight,nopattern) +local removed,idx=self:_RemoveFlightFromQueue(self.Qmarshal,flight) +if removed then +flight.holding=nil +self:_CollapseMarshalStack(flight,nopattern) +if flight.case==1 and#self.Qwaiting>0 then +local nextflight=self.Qwaiting[1] +local freestack=self:_GetFreeStack(nextflight.ai) +if nextflight.ai then +self:_MarshalAI(nextflight,freestack) +else +self:_MarshalPlayer(nextflight,freestack) +end +self:_RemoveFlightFromQueue(self.Qwaiting,nextflight) +end +end +return removed,idx +end +function AIRBOSS:_RemoveFlightFromQueue(queue,flight) +for i,_flight in pairs(queue)do +local qflight=_flight +if qflight.groupname==flight.groupname then +self:T(self.lid..string.format("Removing flight group %s from queue.",flight.groupname)) +table.remove(queue,i) +return true,i +end +end +return false,nil +end +function AIRBOSS:_RemoveUnitFromFlight(unit) +if unit and unit:IsInstanceOf("UNIT")then +local group=unit:GetGroup() +if group then +local flight=self:_GetFlightFromGroupInQueue(group,self.flights) +if flight then +local removed=self:_RemoveFlightElement(unit:GetName()) +if removed then +local _,nunits=self:_GetFlightUnits(flight,not flight.ai) +local nelements=#flight.elements +self:T(self.lid..string.format("Removed unit %s: nunits=%d, nelements=%d",unit:GetName(),nunits,nelements)) +if nunits==0 or nelements==0 then +self:_RemoveFlight(flight) +end +end +end +end +end +end +function AIRBOSS:_RemoveFlightFromSection(flight) +if flight.name~=flight.seclead then +local lead=self.players[flight.seclead] +if lead then +for i,sec in pairs(lead.section)do +local sectionmember=sec +if sectionmember.name==flight.name then +table.remove(lead.section,i) +break +end +end +end +end +end +function AIRBOSS:_UpdateFlightSection(flight) +if flight.seclead==flight.name then +if#flight.section>=1 then +local newlead=flight.section[1] +newlead.seclead=newlead.name +for i=2,#flight.section do +local member=flight.section[i] +table.insert(newlead.section,member) +member.seclead=newlead.name +end +end +flight.section={} +else +self:_RemoveFlightFromSection(flight) +end +end +function AIRBOSS:_RemoveFlight(flight,completely) +self:F(self.lid..string.format("Removing flight %s, ai=%s completely=%s.",tostring(flight.groupname),tostring(flight.ai),tostring(completely))) +self:_RemoveFlightFromMarshalQueue(flight,true) +self:_RemoveFlightFromQueue(self.Qpattern,flight) +self:_RemoveFlightFromQueue(self.Qwaiting,flight) +self:_RemoveFlightFromQueue(self.Qspinning,flight) +if flight.ai then +self:_RemoveFlightFromQueue(self.flights,flight) +else +local grades=self.playerscores[flight.name] +if grades and#grades>0 then +while#grades>0 and grades[#grades].finalscore==nil do +table.remove(grades,#grades) +end +end +if completely then +self:_UpdateFlightSection(flight) +self:_RemoveFlightFromQueue(self.flights,flight) +local playerdata=self.players[flight.name] +if playerdata then +self:T(self.lid..string.format("Removing player %s completely.",flight.name)) +self.players[flight.name]=nil +end +flight=nil +else +self:_SetPlayerStep(flight,AIRBOSS.PatternStep.UNDEFINED) +for _,sectionmember in pairs(flight.section)do +self:_SetPlayerStep(sectionmember,AIRBOSS.PatternStep.UNDEFINED) +self:_RemoveFlightFromQueue(self.Qspinning,sectionmember) +end +self:_RemoveFlightFromSection(flight) +end +end +end +function AIRBOSS:_CheckPlayerStatus() +for _playerName,_playerData in pairs(self.players)do +local playerData=_playerData +if playerData then +local unit=playerData.unit +if unit and unit:IsAlive()then +if unit:IsInZone(self.zoneCCA)then +if playerData.step==AIRBOSS.PatternStep.WAKE then +if math.abs(playerData.unit:GetRoll())>35 and math.abs(playerData.unit:GetRoll())<=40 then +playerData.wrappedUpAtWakeLittle=true +elseif math.abs(playerData.unit:GetRoll())>40 and math.abs(playerData.unit:GetRoll())<=45 then +playerData.wrappedUpAtWakeFull=true +elseif math.abs(playerData.unit:GetRoll())>45 then +playerData.wrappedUpAtWakeUnderline=true +elseif math.abs(playerData.unit:GetRoll())<20 and math.abs(playerData.unit:GetRoll())>=10 then +playerData.AAatWakeLittle=true +elseif math.abs(playerData.unit:GetRoll())<10 and math.abs(playerData.unit:GetRoll())>=2 then +playerData.AAatWakeFull=true +elseif math.abs(playerData.unit:GetRoll())<2 then +playerData.AAatWakeUnderline=true +else +end +if math.abs(playerData.unit:GetAoA())>=15 then +playerData.AFU=true +elseif math.abs(playerData.unit:GetAoA())<=5 then +playerData.AFU=true +else +end +end +if playerData.attitudemonitor then +self:_AttitudeMonitor(playerData) +end +self:_CheckPlayerPatternDistance(playerData) +self:_CheckFoulDeck(playerData) +if playerData.step==AIRBOSS.PatternStep.UNDEFINED then +elseif playerData.step==AIRBOSS.PatternStep.REFUELING then +elseif playerData.step==AIRBOSS.PatternStep.SPINNING then +self:_Spinning(playerData) +elseif playerData.step==AIRBOSS.PatternStep.HOLDING then +self:_Holding(playerData) +elseif playerData.step==AIRBOSS.PatternStep.WAITING then +self:_Waiting(playerData) +elseif playerData.step==AIRBOSS.PatternStep.COMMENCING then +self:_Commencing(playerData,true) +elseif playerData.step==AIRBOSS.PatternStep.BOLTER then +self:_BolterPattern(playerData) +elseif playerData.step==AIRBOSS.PatternStep.PLATFORM then +self:_Platform(playerData) +elseif playerData.step==AIRBOSS.PatternStep.ARCIN then +self:_ArcInTurn(playerData) +elseif playerData.step==AIRBOSS.PatternStep.ARCOUT then +self:_ArcOutTurn(playerData) +elseif playerData.step==AIRBOSS.PatternStep.DIRTYUP then +self:_DirtyUp(playerData) +elseif playerData.step==AIRBOSS.PatternStep.BULLSEYE then +self:_Bullseye(playerData) +elseif playerData.step==AIRBOSS.PatternStep.INITIAL then +self:_Initial(playerData) +elseif playerData.step==AIRBOSS.PatternStep.BREAKENTRY then +self:_BreakEntry(playerData) +elseif playerData.step==AIRBOSS.PatternStep.EARLYBREAK then +self:_Break(playerData,AIRBOSS.PatternStep.EARLYBREAK) +elseif playerData.step==AIRBOSS.PatternStep.LATEBREAK then +self:_Break(playerData,AIRBOSS.PatternStep.LATEBREAK) +elseif playerData.step==AIRBOSS.PatternStep.ABEAM then +self:_Abeam(playerData) +elseif playerData.step==AIRBOSS.PatternStep.NINETY then +self:_CheckForLongDownwind(playerData) +self:_Ninety(playerData) +elseif playerData.step==AIRBOSS.PatternStep.WAKE then +self:_Wake(playerData) +elseif playerData.step==AIRBOSS.PatternStep.EMERGENCY then +self:_Final(playerData,true) +elseif playerData.step==AIRBOSS.PatternStep.FINAL then +self:_Final(playerData) +elseif playerData.step==AIRBOSS.PatternStep.GROOVE_XX or +playerData.step==AIRBOSS.PatternStep.GROOVE_IM or +playerData.step==AIRBOSS.PatternStep.GROOVE_IC or +playerData.step==AIRBOSS.PatternStep.GROOVE_AR or +playerData.step==AIRBOSS.PatternStep.GROOVE_AL or +playerData.step==AIRBOSS.PatternStep.GROOVE_LC or +playerData.step==AIRBOSS.PatternStep.GROOVE_IW then +self:_Groove(playerData) +elseif playerData.step==AIRBOSS.PatternStep.DEBRIEF then +playerData.debriefschedulerID=self:ScheduleOnce(5,self._Debrief,self,playerData) +playerData.step=AIRBOSS.PatternStep.UNDEFINED +else +self:E(self.lid..string.format("ERROR: Unknown player step %s. Please report!",tostring(playerData.step))) +end +self:_CheckMissedStepOnEntry(playerData) +else +self:T2(self.lid.."WARNING: Player unit not inside the CCA!") +end +else +self:T(self.lid.."WARNING: Player unit is not alive!") +end +end +end +end +function AIRBOSS:_CheckMissedStepOnEntry(playerData) +local rightcase=playerData.case>1 +local rightqueue=self:_InQueue(self.Qpattern,playerData.group) +local rightflag=playerData.flag~=-42 +local step=playerData.step +local missedstep=step==AIRBOSS.PatternStep.PLATFORM or step==AIRBOSS.PatternStep.ARCIN or step==AIRBOSS.PatternStep.ARCOUT or step==AIRBOSS.PatternStep.DIRTYUP +if rightcase and rightqueue and rightflag then +local zone=nil +if playerData.case==2 and missedstep then +zone=self:_GetZoneInitial(playerData.case) +elseif playerData.case==3 and missedstep then +zone=self:_GetZoneBullseye(playerData.case) +end +if zone then +local inzone=playerData.unit:IsInZone(zone) +local relheading=self:_GetRelativeHeading(playerData.unit,false) +if inzone and math.abs(relheading)<60 then +local text=string.format("you missed an important step in the pattern!\nYour next step would have been %s.",playerData.step) +self:MessageToPlayer(playerData,text,"AIRBOSS",nil,5) +if playerData.case==2 then +playerData.step=AIRBOSS.PatternStep.INITIAL +elseif playerData.case==3 then +playerData.step=AIRBOSS.PatternStep.BULLSEYE +end +playerData.flag=-42 +end +end +end +end +function AIRBOSS:_SetTimeInGroove(playerData) +if playerData.TIG0 then +playerData.Tgroove=timer.getTime()-playerData.TIG0-1.5 +else +playerData.Tgroove=999 +end +end +function AIRBOSS:_GetTimeInGroove(playerData) +local Tgroove=999 +if playerData.TIG0 then +Tgroove=timer.getTime()-playerData.TIG0 +end +return Tgroove +end +function AIRBOSS:OnEventBirth(EventData) +self:F3({eventbirth=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event BIRTH!") +self:E(EventData) +return +end +if EventData.IniUnit==nil and(not EventData.IniObjectCategory==Object.Category.STATIC)then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event BIRTH!") +self:E(EventData) +return +end +if EventData.IniObjectCategory~=Object.Category.UNIT then return end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T(self.lid.."BIRTH: unit = "..tostring(EventData.IniUnitName)) +self:T(self.lid.."BIRTH: group = "..tostring(EventData.IniGroupName)) +self:T(self.lid.."BIRTH: player = "..tostring(_playername)) +if _unit and _playername then +local _uid=_unit:GetID() +local _group=_unit:GetGroup() +local _callsign=_unit:GetCallsign() +local text=string.format("Pilot %s, callsign %s entered unit %s of group %s.",_playername,_callsign,_unitName,_group:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,5):ToAllIf(self.Debug) +local rightaircraft=self:_IsCarrierAircraft(_unit) +if rightaircraft==false then +local text=string.format("Player aircraft type %s not supported by AIRBOSS class.",_unit:GetTypeName()) +MESSAGE:New(text,30):ToAllIf(self.Debug) +self:T2(self.lid..text) +return +end +if self:GetCoalition()~=_unit:GetCoalition()then +local text=string.format("Player entered aircraft of other coalition.") +MESSAGE:New(text,30):ToAllIf(self.Debug) +self:T(self.lid..text) +return +end +self:_AddF10Commands(_unitName) +self:ScheduleOnce(1,self._NewPlayer,self,_unitName) +end +end +function AIRBOSS:OnEventRunwayTouch(EventData) +self:F3({eventland=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event LAND!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event LAND!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T(self.lid.."LAND: unit = "..tostring(EventData.IniUnitName)) +self:T(self.lid.."LAND: group = "..tostring(EventData.IniGroupName)) +self:T(self.lid.."LAND: player = "..tostring(_playername)) +local airbase=EventData.Place +if airbase==nil then +return +end +local airbasename=tostring(airbase:GetName()) +if airbasename==self.airbase:GetName()then +local stern=self:_GetSternCoord() +local zoneCarrier=self:_GetZoneCarrierBox() +if _unit and _playername then +local _uid=_unit:GetID() +local _group=_unit:GetGroup() +local _callsign=_unit:GetCallsign() +local text=string.format("Player %s, callsign %s unit %s (ID=%d) of group %s landed at airbase %s",_playername,_callsign,_unitName,_uid,_group:GetName(),airbasename) +self:T(self.lid..text) +MESSAGE:New(text,5,"DEBUG"):ToAllIf(self.Debug) +local playerData=self.players[_playername] +if playerData==nil then +self:E(self.lid..string.format("ERROR: playerData nil in landing event. unit=%s player=%s",tostring(_unitName),tostring(_playername))) +return +end +if _unit:IsInZone(zoneCarrier)then +if not playerData.valid then +local text=string.format("you missed at least one important step in the pattern!\nYour next step would have been %s.\nThis pass is INVALID.",playerData.step) +self:MessageToPlayer(playerData,text,"AIRBOSS",nil,30,true,5) +self:_RemoveFlightFromMarshalQueue(playerData,true) +self:_RemoveFlightFromQueue(self.Qpattern,playerData) +self:_RemoveFlightFromQueue(self.Qwaiting,playerData) +self:_RemoveFlightFromQueue(self.Qspinning,playerData) +self:_InitPlayer(playerData) +return +end +if playerData.landed then +self:E(self.lid..string.format("Player %s just landed a second time.",_playername)) +else +playerData.landed=true +playerData.attitudemonitor=false +local coord=playerData.unit:GetCoordinate() +local X,Z,rho,phi=self:_GetDistances(_unit) +local dist=coord:Get2DDistance(stern) +if self.Debug and false then +local lp=coord:MarkToAll("Landing coord.") +coord:SmokeGreen() +end +self:_SetTimeInGroove(playerData) +local text=string.format("Player %s AC type %s landed at dist=%.1f m. Tgroove=%.1f sec.",playerData.name,playerData.actype,dist,self:_GetTimeInGroove(playerData)) +text=text..string.format(" X=%.1f m, Z=%.1f m, rho=%.1f m.",X,Z,rho) +self:T(self.lid..text) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self:RadioTransmission(self.LSORadio,self.LSOCall.IDLE,false,1,nil,true) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.DEBRIEF) +else +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.UNDEFINED) +self:ScheduleOnce(1,self._Trapped,self,playerData) +end +end +else +if playerData then +self:E(self.lid..string.format("Player %s did not land in carrier box zone. Maybe in the water near the carrier?",playerData.name)) +end +end +else +if self.carriertype~=AIRBOSS.CarrierType.INVINCIBLE or self.carriertype~=AIRBOSS.CarrierType.HERMES or self.carriertype~=AIRBOSS.CarrierType.TARAWA or self.carriertype~=AIRBOSS.CarrierType.AMERICA or self.carriertype~=AIRBOSS.CarrierType.JCARLOS or self.carriertype~=AIRBOSS.CarrierType.CANBERRA then +local coord=EventData.IniUnit:GetCoordinate() +local dist=coord:Get2DDistance(self:GetCoordinate()) +local wire=self:_GetWire(coord,0) +local _type=EventData.IniUnit:GetTypeName() +local text=string.format("AI unit %s of type %s landed at dist=%.1f m. Trapped wire=%d.",_unitName,_type,dist,wire) +self:T(self.lid..text) +end +local flight=self:_RecoveredElement(EventData.IniUnit) +self:_CheckSectionRecovered(flight) +end +end +end +function AIRBOSS:OnEventEngineShutdown(EventData) +self:F3({eventengineshutdown=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event ENGINESHUTDOWN!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event ENGINESHUTDOWN!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."ENGINESHUTDOWN: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."ENGINESHUTDOWN: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."ENGINESHUTDOWN: player = "..tostring(_playername)) +if _unit and _playername then +self:T(self.lid..string.format("Player %s shut down its engines!",_playername)) +else +self:T(self.lid..string.format("AI unit %s shut down its engines!",_unitName)) +local flight=self:_GetFlightFromGroupInQueue(EventData.IniGroup,self.flights) +if flight and flight.ai then +local recovered=self:_CheckSectionRecovered(flight) +if recovered then +self:T(self.lid..string.format("AI group %s completely recovered. Despawning group after engine shutdown event as requested in 5 seconds.",tostring(EventData.IniGroupName))) +self:_RemoveFlight(flight) +local istanker=self.tanker and self.tanker.tanker:GetName()==EventData.IniGroupName +local isawacs=self.awacs and self.awacs.tanker:GetName()==EventData.IniGroupName +if self.despawnshutdown and not(istanker or isawacs)then +EventData.IniGroup:Destroy(nil,5) +end +end +end +end +end +function AIRBOSS:OnEventTakeoff(EventData) +self:F3({eventtakeoff=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event TAKEOFF!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event TAKEOFF!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."TAKEOFF: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."TAKEOFF: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."TAKEOFF: player = "..tostring(_playername)) +local airbase=EventData.Place +local airbasename="unknown" +if airbase then +airbasename=airbase:GetName() +end +if airbasename==self.airbase:GetName()then +if _unit and _playername then +self:T(self.lid..string.format("Player %s took off at %s!",_playername,airbasename)) +else +self:T2(self.lid..string.format("AI unit %s took off at %s!",_unitName,airbasename)) +local flight=self:_GetFlightFromGroupInQueue(EventData.IniGroup,self.flights) +if flight then +for _,elem in pairs(flight.elements)do +local element=elem +element.ballcall=false +element.recovered=nil +end +end +end +end +end +function AIRBOSS:OnEventCrash(EventData) +self:F3({eventcrash=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event CRASH!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event CRASH!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."CRASH: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."CRASH: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."CARSH: player = "..tostring(_playername)) +if _unit and _playername then +self:T(self.lid..string.format("Player %s crashed!",_playername)) +local flight=self.players[_playername] +if flight then +self:_RemoveFlight(flight,true) +end +else +self:T2(self.lid..string.format("AI unit %s crashed!",EventData.IniUnitName)) +self:_RemoveUnitFromFlight(EventData.IniUnit) +end +end +function AIRBOSS:OnEventEjection(EventData) +self:F3({eventland=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event EJECTION!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event EJECTION!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."EJECT: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."EJECT: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."EJECT: player = "..tostring(_playername)) +if _unit and _playername then +self:T(self.lid..string.format("Player %s ejected!",_playername)) +local flight=self.players[_playername] +if flight then +self:_RemoveFlight(flight,true) +end +else +self:T(self.lid..string.format("AI unit %s ejected!",EventData.IniUnitName)) +self:_RemoveUnitFromFlight(EventData.IniUnit) +local flight=self:_GetFlightFromGroupInQueue(EventData.IniGroup,self.flights) +self:_CheckSectionRecovered(flight) +end +end +function AIRBOSS:OnEventRemoveUnit(EventData) +self:F3({eventland=EventData}) +if EventData==nil then +self:T(self.lid.."ERROR: EventData=nil in event REMOVEUNIT!") +self:T(EventData) +return +end +if EventData.IniUnit==nil then +self:T(self.lid.."ERROR: EventData.IniUnit=nil in event REMOVEUNIT!") +self:T(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."EJECT: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."EJECT: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."EJECT: player = "..tostring(_playername)) +if _unit and _playername then +self:T(self.lid..string.format("Player %s removed!",_playername)) +local flight=self.players[_playername] +if flight then +self:_RemoveFlight(flight,true) +end +else +self:T(self.lid..string.format("AI unit %s removed!",EventData.IniUnitName)) +self:_RemoveUnitFromFlight(EventData.IniUnit) +local flight=self:_GetFlightFromGroupInQueue(EventData.IniGroup,self.flights) +self:_CheckSectionRecovered(flight) +end +end +function AIRBOSS:_PlayerLeft(EventData) +self:F3({eventleave=EventData}) +if EventData==nil then +self:E(self.lid.."ERROR: EventData=nil in event PLAYERLEFTUNIT!") +self:E(EventData) +return +end +if EventData.IniUnit==nil then +self:E(self.lid.."ERROR: EventData.IniUnit=nil in event PLAYERLEFTUNIT!") +self:E(EventData) +return +end +local _unitName=EventData.IniUnitName +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +self:T3(self.lid.."PLAYERLEAVEUNIT: unit = "..tostring(EventData.IniUnitName)) +self:T3(self.lid.."PLAYERLEAVEUNIT: group = "..tostring(EventData.IniGroupName)) +self:T3(self.lid.."PLAYERLEAVEUNIT: player = "..tostring(_playername)) +if _unit and _playername then +self:T(self.lid..string.format("Player %s left unit %s!",_playername,_unitName)) +local flight=self.players[_playername] +if flight then +self:_RemoveFlight(flight,true) +end +end +end +function AIRBOSS:OnEventMissionEnd(EventData) +self:T3(self.lid.."Mission Ended") +end +function AIRBOSS:_Spinning(playerData) +local SpinIt={} +SpinIt.name="Spinning" +SpinIt.Xmin=-UTILS.NMToMeters(6) +SpinIt.Xmax=UTILS.NMToMeters(5) +SpinIt.Zmin=-UTILS.NMToMeters(6) +SpinIt.Zmax=UTILS.NMToMeters(2) +SpinIt.LimitXmin=-100 +SpinIt.LimitXmax=nil +SpinIt.LimitZmin=-UTILS.NMToMeters(1) +SpinIt.LimitZmax=nil +local X,Z,rho,phi=self:_GetDistances(playerData.unit) +if self:_CheckLimits(X,Z,SpinIt)then +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.INITIAL) +self:_RemoveFlightFromQueue(self.Qspinning,playerData) +end +end +function AIRBOSS:_Waiting(playerData) +local radius=UTILS.NMToMeters(10) +local zone=ZONE_RADIUS:New("Carrier 10 NM Zone",self.carrier:GetVec2(),radius) +local inzone=playerData.unit:IsInZone(zone) +local Twaiting=timer.getAbsTime()-playerData.time +if inzone and Twaiting>3*60 and not playerData.warning then +local text=string.format("You are supposed to wait outside the 10 NM zone.") +self:MessageToPlayer(playerData,text,"AIRBOSS") +playerData.warning=true +end +if inzone==false and playerData.warning==true then +playerData.warning=nil +end +end +function AIRBOSS:_Holding(playerData) +local unit=playerData.unit +local stack=playerData.flag +if stack<=0 then +local text=string.format("ERROR: player %s in step %s is holding but has stack=%s (<=0)",playerData.name,playerData.step,tostring(stack)) +self:E(self.lid..text) +end +local patternalt=self:_GetMarshalAltitude(stack,playerData.case) +local playeralt=unit:GetAltitude() +local zoneHolding=self:_GetZoneHolding(playerData.case,stack) +if zoneHolding==nil then +self:E(self.lid.."ERROR: zoneHolding is nil!") +self:E({playerData=playerData}) +return +end +local inholdingzone=unit:IsInZone(zoneHolding) +local altdiff=playeralt-patternalt +local altgood=UTILS.FeetToMeters(500) +if playerData.difficulty==AIRBOSS.Difficulty.HARD then +altgood=UTILS.FeetToMeters(200) +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +altgood=UTILS.FeetToMeters(350) +elseif playerData.difficulty==AIRBOSS.Difficulty.EASY then +altgood=UTILS.FeetToMeters(500) +end +local altback=altgood*0.5 +local justcollapsed=false +if self.Tcollapse then +local dT=timer.getTime()-self.Tcollapse +if dT<=90 then +justcollapsed=true +end +end +local goodalt=math.abs(altdiff)<altgood +local angels=self:_GetAngels(patternalt) +local text="" +if playerData.holding==true then +if inholdingzone then +self:T3("Player is still in the holding zone. Good job.") +else +text=text..string.format("You just left the holding zone. Watch your numbers!") +playerData.holding=false +end +if not justcollapsed then +if altdiff>altgood then +if not playerData.warning then +text=text..string.format("You left your assigned altitude. Descent to angels %d.",angels) +playerData.warning=true +end +elseif altdiff<-altgood then +if not playerData.warning then +text=text..string.format("You left your assigned altitude. Climb to angels %d.",angels) +playerData.warning=true +end +end +end +if playerData.warning and math.abs(altdiff)<=altback then +text=text..string.format("Altitude is looking good again.") +playerData.warning=nil +end +elseif playerData.holding==false then +if inholdingzone then +text=text..string.format("You are back in the holding zone. Now stay there!") +playerData.holding=true +else +self:T3("Player still outside the holding zone. What are you doing man?!") +end +elseif playerData.holding==nil then +if inholdingzone then +playerData.holding=true +text=text..string.format("You arrived at the holding zone.") +if goodalt then +text=text..string.format(" Altitude is good.") +else +if altdiff<0 then +text=text..string.format(" But you're too low.") +else +text=text..string.format(" But you're too high.") +end +text=text..string.format("\nCurrently assigned altitude is %d ft.",UTILS.MetersToFeet(patternalt)) +playerData.warning=true +end +else +self:T3("Waiting for player to arrive in the holding zone.") +end +end +if playerData.showhints then +self:MessageToPlayer(playerData,text,"MARSHAL") +end +end +function AIRBOSS:_Commencing(playerData,zonecheck) +if zonecheck then +local zoneCommence=self:_GetZoneCommence(playerData.case,playerData.flag) +local inzone=playerData.unit:IsInZone(zoneCommence) +if not inzone then +if timer.getAbsTime()-playerData.time>180 then +self:_MarshalCallClearedForRecovery(playerData.onboard,playerData.case) +playerData.time=timer.getAbsTime() +end +return +end +end +self:_RemoveFlightFromMarshalQueue(playerData) +self:_InitPlayer(playerData) +if playerData.difficulty~=AIRBOSS.Difficulty.HARD then +local text="" +if playerData.case==1 then +text=text.."Proceed to initial." +else +text=text.."Descent to platform." +if playerData.difficulty==AIRBOSS.Difficulty.EASY and playerData.showhints then +text=text.." VSI 4000 ft/min until you reach 5000 ft." +end +end +self:MessageToPlayer(playerData,text,"MARSHAL") +end +local nextstep +if playerData.case==1 then +nextstep=AIRBOSS.PatternStep.INITIAL +else +nextstep=AIRBOSS.PatternStep.PLATFORM +end +self:_SetPlayerStep(playerData,nextstep) +for i,_flight in pairs(playerData.section)do +local flight=_flight +self:_Commencing(flight,false) +end +end +function AIRBOSS:_Initial(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZoneInitial(playerData.case)) +local relheading=self:_GetRelativeHeading(playerData.unit,false) +local altitude=playerData.unit:GetAltitude() +if inzone and math.abs(relheading)<60 and altitude<=self.initialmaxalt then +if playerData.showhints then +local hint=string.format("Initial") +if playerData.difficulty==AIRBOSS.Difficulty.EASY and playerData.actype~=AIRBOSS.AircraftCarrier.AV8B then +if playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +hint=hint.." - Hook down, SAS on, Wing Sweep 68°!" +else +hint=hint.." - Hook down!" +end +end +self:MessageToPlayer(playerData,hint,"MARSHAL") +end +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.BREAKENTRY) +return true +end +return false +end +function AIRBOSS:_CheckCorridor(playerData) +local validzone=self:_GetZoneCorridor(playerData.case) +local invalid=playerData.unit:IsNotInZone(validzone) +if invalid and(not playerData.warning)then +self:MessageToPlayer(playerData,"you left the approach corridor!","AIRBOSS") +playerData.warning=true +end +if(not invalid)and playerData.warning then +self:MessageToPlayer(playerData,"you're back in the approach corridor.","AIRBOSS") +playerData.warning=false +end +end +function AIRBOSS:_Platform(playerData) +self:_CheckCorridor(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZonePlatform(playerData.case)) +if inzone then +self:_PlayerHint(playerData) +local nextstep +if math.abs(self.holdingoffset)>0 and playerData.case>1 then +nextstep=AIRBOSS.PatternStep.ARCIN +else +if playerData.case==2 then +nextstep=AIRBOSS.PatternStep.INITIAL +elseif playerData.case==3 then +nextstep=AIRBOSS.PatternStep.DIRTYUP +end +end +self:_SetPlayerStep(playerData,nextstep) +end +end +function AIRBOSS:_ArcInTurn(playerData) +self:_CheckCorridor(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZoneArcIn(playerData.case)) +if inzone then +self:_PlayerHint(playerData) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.ARCOUT) +end +end +function AIRBOSS:_ArcOutTurn(playerData) +self:_CheckCorridor(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZoneArcOut(playerData.case)) +if inzone then +self:_PlayerHint(playerData) +local nextstep +if playerData.case==3 then +nextstep=AIRBOSS.PatternStep.DIRTYUP +else +nextstep=AIRBOSS.PatternStep.INITIAL +end +self:_SetPlayerStep(playerData,nextstep) +end +end +function AIRBOSS:_DirtyUp(playerData) +self:_CheckCorridor(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZoneDirtyUp(playerData.case)) +if inzone then +playerData.Tgroove=timer.getTime()-playerData.TIG0-1.5 +playerData.wrappedUpAtWakeLittle=false +playerData.wrappedUpAtWakeFull=false +playerData.wrappedUpAtWakeUnderline=false +playerData.wrappedUpAtStartLittle=false +playerData.wrappedUpAtStartFull=false +playerData.wrappedUpAtStartUnderline=false +playerData.AAatWakeLittle=false +playerData.AAatWakeFull=false +playerData.AAatWakeUnderline=false +playerData.AFU=false +if playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.F14A +or playerData.actype==AIRBOSS.AircraftCarrier.F14B +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER +then +local callsay=self:_NewRadioCall(self.MarshalCall.SAYNEEDLES,nil,nil,5,playerData.onboard) +local callfly=self:_NewRadioCall(self.MarshalCall.FLYNEEDLES,nil,nil,5,playerData.onboard) +self:RadioTransmission(self.MarshalRadio,callsay,false,55,nil,true) +self:RadioTransmission(self.MarshalRadio,callfly,false,60,nil,true) +end +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.BULLSEYE) +end +end +function AIRBOSS:_Bullseye(playerData) +self:_CheckCorridor(playerData) +local inzone=playerData.unit:IsInZone(self:_GetZoneBullseye(playerData.case)) +local relheading=self:_GetRelativeHeading(playerData.unit,true) +if inzone and math.abs(relheading)<60 then +self:_PlayerHint(playerData) +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT5,nil,nil,nil,true) +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT5,nil,nil,nil,true) +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT75,nil,nil,nil,true) +end +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_XX) +end +end +function AIRBOSS:_BolterPattern(playerData) +local X,Z,rho,phi=self:_GetDistances(playerData.unit) +local Bolter={} +Bolter.name="Bolter Pattern" +Bolter.Xmin=-UTILS.NMToMeters(5) +Bolter.Xmax=UTILS.NMToMeters(3) +Bolter.Zmin=-UTILS.NMToMeters(5) +Bolter.Zmax=UTILS.NMToMeters(1) +Bolter.LimitXmin=100 +Bolter.LimitXmax=nil +Bolter.LimitZmin=nil +Bolter.LimitZmax=nil +if self:_CheckLimits(X,Z,Bolter)then +local nextstep +if playerData.case<3 then +nextstep=AIRBOSS.PatternStep.ABEAM +else +nextstep=AIRBOSS.PatternStep.BULLSEYE +end +self:_SetPlayerStep(playerData,nextstep) +end +end +function AIRBOSS:_BreakEntry(playerData) +local X,Z=self:_GetDistances(playerData.unit) +if self:_CheckAbort(X,Z,self.BreakEntry)then +self:_AbortPattern(playerData,X,Z,self.BreakEntry,true) +return +end +if self:_CheckLimits(X,Z,self.BreakEntry)then +self:_PlayerHint(playerData) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.EARLYBREAK) +end +end +function AIRBOSS:_Break(playerData,part) +local X,Z=self:_GetDistances(playerData.unit) +local breakpoint=self.BreakEarly +if part==AIRBOSS.PatternStep.LATEBREAK then +breakpoint=self.BreakLate +end +if self:_CheckAbort(X,Z,breakpoint)then +self:_AbortPattern(playerData,X,Z,breakpoint,true) +return +end +local tooclose=false +if part==AIRBOSS.PatternStep.LATEBREAK then +local close=0.8 +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +close=0.5 +end +if X<0 and Z<UTILS.NMToMeters(close)then +if playerData.difficulty==AIRBOSS.Difficulty.EASY and playerData.showhints then +self:MessageToPlayer(playerData,"your turn was too tight! Allow for more distance to the boat next time.","LSO") +end +tooclose=true +end +end +if self:_CheckLimits(X,Z,breakpoint)or tooclose then +self:_PlayerHint(playerData) +local nextstep +if part==AIRBOSS.PatternStep.EARLYBREAK then +nextstep=AIRBOSS.PatternStep.LATEBREAK +else +nextstep=AIRBOSS.PatternStep.ABEAM +end +self:_SetPlayerStep(playerData,nextstep) +end +end +function AIRBOSS:_CheckForLongDownwind(playerData) +local X,Z=self:_GetDistances(playerData.unit) +local limit=UTILS.NMToMeters(-1.6) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +limit=UTILS.NMToMeters(-2.0) +end +if X<limit then +self:RadioTransmission(self.LSORadio,self.LSOCall.LONGINGROOVE) +self:RadioTransmission(self.LSORadio,self.LSOCall.DEPARTANDREENTER,nil,nil,nil,true) +self:_AddToDebrief(playerData,"Long in the groove - Pattern Waveoff!") +playerData.lig=true +playerData.wop=true +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.DEBRIEF) +end +end +function AIRBOSS:_Abeam(playerData) +local X,Z=self:_GetDistances(playerData.unit) +if self:_CheckAbort(X,Z,self.Abeam)then +self:_AbortPattern(playerData,X,Z,self.Abeam,true) +return +end +if self:_CheckLimits(X,Z,self.Abeam)then +self:RadioTransmission(self.LSORadio,self.LSOCall.PADDLESCONTACT,nil,nil,nil,true) +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.JCARLOS then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT5,false,5,nil,true) +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT5,false,5,nil,true) +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +self:RadioTransmission(self.LSORadio,self.LSOCall.EXPECTSPOT75,false,5,nil,true) +end +self:_PlayerHint(playerData,3) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.NINETY) +end +end +function AIRBOSS:_Ninety(playerData) +playerData.wrappedUpAtWakeLittle=false +playerData.wrappedUpAtWakeFull=false +playerData.wrappedUpAtWakeUnderline=false +playerData.wrappedUpAtStartLittle=false +playerData.wrappedUpAtStartFull=false +playerData.wrappedUpAtStartUnderline=false +playerData.AAatWakeLittle=false +playerData.AAatWakeFull=false +playerData.AAatWakeUnderline=false +playerData.AFU=false +local X,Z=self:_GetDistances(playerData.unit) +if self:_CheckAbort(X,Z,self.Ninety)then +self:_AbortPattern(playerData,X,Z,self.Ninety,true) +return +end +local relheading=self:_GetRelativeHeading(playerData.unit,false) +if relheading<=90 then +self:_PlayerHint(playerData) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.FINAL) +else +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.WAKE) +end +elseif relheading>90 and self:_CheckLimits(X,Z,self.Wake)then +self:MessageToPlayer(playerData,"you are already at the wake and have not passed the 90. Turn faster next time!","LSO") +self:RadioTransmission(self.LSORadio,self.LSOCall.DEPARTANDREENTER,nil,nil,nil,true) +playerData.wop=true +self:_AddToDebrief(playerData,"Overshoot at wake - Pattern Waveoff!") +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.DEBRIEF) +end +end +function AIRBOSS:_Wake(playerData) +local X,Z=self:_GetDistances(playerData.unit) +if self:_CheckAbort(X,Z,self.Wake)then +self:_AbortPattern(playerData,X,Z,self.Wake,true) +return +end +if self:_CheckLimits(X,Z,self.Wake)then +self:_PlayerHint(playerData) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.FINAL) +end +end +function AIRBOSS:_GetGrooveData(playerData) +local X,Z=self:_GetDistances(playerData.unit) +local stern=self:_GetSternCoord() +local rho=stern:Get2DDistance(playerData.unit:GetCoordinate()) +local astern=X<self.carrierparam.sterndist +if astern==false then +rho=-rho +end +local vel=playerData.unit:GetVelocityVec3() +local Gg,Gp,Gd=self:_LSOgrade(playerData) +local groovedata={} +groovedata.Step=playerData.step +groovedata.Time=timer.getTime() +groovedata.Rho=rho +groovedata.X=X +groovedata.Z=Z +groovedata.Alt=self:_GetAltCarrier(playerData.unit) +groovedata.AoA=playerData.unit:GetAoA() +groovedata.GSE=self:_Glideslope(playerData.unit) +groovedata.LUE=self:_Lineup(playerData.unit,true) +groovedata.LUEwire=self:_LineupWIRE(playerData.unit,true) +groovedata.LeftNozzle=self:_NozzleArgumentLeft(playerData.unit) +groovedata.RightNozzle=self:_NozzleArgumentRight(playerData.unit) +groovedata.Roll=playerData.unit:GetRoll() +groovedata.Pitch=playerData.unit:GetPitch() +groovedata.Yaw=playerData.unit:GetYaw() +groovedata.Vel=UTILS.VecNorm(vel) +groovedata.Vy=vel.y +groovedata.Gamma=self:_GetRelativeHeading(playerData.unit,true) +groovedata.Grade=Gg +groovedata.GradePoints=Gp +groovedata.GradeDetail=Gd +return groovedata +end +function AIRBOSS:_Final(playerData,nocheck) +local X,Z,rho,phi=self:_GetDistances(playerData.unit) +if not nocheck then +if self:_CheckAbort(X,Z,self.Final)then +self:_AbortPattern(playerData,X,Z,self.Final,true) +return +end +end +local groovedata=self:_GetGrooveData(playerData) +table.insert(playerData.trapsheet,groovedata) +local zone=self:_GetZoneGroove() +local inzone=playerData.unit:IsInZone(zone) +if inzone then +self:_PlayerHint(playerData,nil,true) +groovedata.FlyThrough=nil +playerData.groove.X0=UTILS.DeepCopy(groovedata) +playerData.Tlso=timer.getTime() +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_XX) +end +groovedata.Step=playerData.step +end +function AIRBOSS:_Groove(playerData) +local RX0=UTILS.NMToMeters(1.000) +local RXX=UTILS.NMToMeters(0.750) +local RIM=UTILS.NMToMeters(0.500) +local RIC=UTILS.NMToMeters(0.250) +local RAR=UTILS.NMToMeters(0.040) +local RIW=UTILS.NMToMeters(-0.020) +local groovedata=self:_GetGrooveData(playerData) +table.insert(playerData.trapsheet,groovedata) +local X=groovedata.X +local Z=groovedata.Z +if self:_CheckAbort(groovedata.X,groovedata.Z,self.Groove)then +self:_AbortPattern(playerData,groovedata.X,groovedata.Z,self.Groove,true) +return +end +local rho=groovedata.Rho +local lineupError=groovedata.LUE +local glideslopeError=groovedata.GSE +local AoA=groovedata.AoA +if rho<=RXX and playerData.step==AIRBOSS.PatternStep.GROOVE_XX and(math.abs(groovedata.Roll)<=3.5 or playerData.unit:IsInZone(self:_GetZoneLineup()))then +playerData.TIG0=timer.getTime() +self:RadioTransmission(self.LSORadio,self.LSOCall.CALLTHEBALL,nil,nil,nil,true) +playerData.Tlso=timer.getTime() +self:RadioTransmission(self.LSORadio,self.LSOCall.ROGERBALL,false,nil,2,true) +playerData.groove.XX=UTILS.DeepCopy(groovedata) +playerData.valid=true +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_IM) +elseif rho<=RIM and playerData.step==AIRBOSS.PatternStep.GROOVE_IM then +playerData.groove.IM=UTILS.DeepCopy(groovedata) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_IC) +elseif rho<=RIC and playerData.step==AIRBOSS.PatternStep.GROOVE_IC then +playerData.groove.IC=UTILS.DeepCopy(groovedata) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_AR) +elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AR then +playerData.groove.AR=UTILS.DeepCopy(groovedata) +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_AL) +else +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_IW) +end +elseif rho<=RIW and playerData.step==AIRBOSS.PatternStep.GROOVE_IW then +playerData.groove.IW=UTILS.DeepCopy(groovedata) +elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_AL then +playerData.groove.AL=UTILS.DeepCopy(groovedata) +local ZoneALS=self:_GetZoneAbeamLandingSpot() +local vplayer=playerData.unit:GetVelocityKMH() +local vcarrier=self.carrier:GetVelocityKMH() +local dv=math.abs(vplayer-vcarrier) +local stable=dv<30 +if playerData.unit:IsInZone(ZoneALS)and stable then +self:RadioTransmission(self.LSORadio,self.LSOCall.CLEAREDTOLAND,nil,nil,nil,true) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.GROOVE_LC) +playerData.stable=true +playerData.hover=true +end +elseif rho<=RAR and playerData.step==AIRBOSS.PatternStep.GROOVE_LC then +playerData.groove.LC=UTILS.DeepCopy(groovedata) +local ZoneLS=self:_GetZoneLandingSpot() +local vplayer=playerData.unit:GetVelocityKMH() +local vcarrier=self.carrier:GetVelocityKMH() +local dv=math.abs(vplayer-vcarrier) +local stable=dv<15 +if playerData.unit:IsInZone(ZoneLS)and stable and playerData.stable==true then +self:RadioTransmission(self.LSORadio,self.LSOCall.STABILIZED,nil,nil,nil,false) +playerData.stable=false +playerData.warning=true +end +end +if rho>=RAR and rho<=RIC and not playerData.waveoff then +local waveoff=self:_CheckWaveOff(glideslopeError,lineupError,AoA,playerData) +if waveoff then +self:T3(self.lid..string.format("Waveoff distance rho=%.1f m",rho)) +self:RadioTransmission(self.LSORadio,self.LSOCall.WAVEOFF,nil,nil,nil,true) +playerData.Tlso=timer.getTime() +playerData.waveoff=true +return +end +end +groovedata.Step=playerData.step +if rho>=RAR and rho<RX0 and playerData.waveoff==false then +local gs=self:_GS(playerData.step,-1) +local gd=playerData.groove[gs] +if gd then +self:T3(gd) +local d=UTILS.MetersToNM(rho) +if playerData.case~=3 then +if playerData.wrappedUpAtWakeUnderline==true or playerData.wrappedUpAtStartUnderline==true then +gd.WrappedUp="_WU_" +elseif playerData.wrappedUpAtWakeUnderline==false and playerData.wrappedUpAtStartUnderline==false then +if playerData.wrappedUpAtWakeFull==true or playerData.wrappedUpAtStartFull==true then +gd.WrappedUp="WU" +elseif playerData.wrappedUpAtStartFull==false then +if playerData.wrappedUpAtWakeLittle==true or playerData.wrappedUpAtStartLittle==true then +gd.WrappedUp="(WU)" +end +end +else +end +if playerData.AAatWakeUnderline==true then +gd.AngledApch="_AA_" +elseif playerData.AAatWakeUnderline==false then +if playerData.AAatWakeFull==true then +gd.AngledApch="AA" +elseif playerData.AAatWakeFull==false then +if playerData.AAatWakeLittle==true then +gd.AngledApch="(AA)" +end +end +else +end +if playerData.AFU==true then +gd.AFU="AFU" +else +end +else +end +if rho>=RAR and rho<=RIM then +if gd.LUE>0.22 and lineupError<-0.22 then +env.info" Drift Right across centre ==> DR-" +gd.Drift="DR" +self:T(self.lid..string.format("Got Drift Right across centre step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f",gs,d,gd.LUE,lineupError)) +elseif gd.LUE<-0.22 and lineupError>0.22 then +env.info" Drift Left ==> DL-" +gd.Drift="DL" +self:T(self.lid..string.format("Got Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f",gs,d,gd.LUE,lineupError)) +elseif gd.LUE>0.13 and lineupError<-0.14 then +env.info" Little Drift Right across centre ==> (DR-)" +gd.Drift="(DR)" +self:T(self.lid..string.format("Got Little Drift Right across centre at step %s, d=%.3f: Max LUE=%.3f, lower LUE=%.3f",gs,d,gd.LUE,lineupError)) +elseif gd.LUE<-0.13 and lineupError>0.14 then +env.info" Little Drift Left across centre ==> (DL-)" +gd.Drift="(DL)" +self:E(self.lid..string.format("Got Little Drift Left across centre at step %s, d=%.3f: Min LUE=%.3f, lower LUE=%.3f",gs,d,gd.LUE,lineupError)) +end +end +if math.abs(lineupError)>math.abs(gd.LUE)then +self:T(self.lid..string.format("Got bigger LUE at step %s, d=%.3f: LUE %.3f>%.3f",gs,d,lineupError,gd.LUE)) +gd.LUE=lineupError +end +if gd.GSE>0.4 and glideslopeError<-0.3 then +gd.FlyThrough="\\" +self:T(self.lid..string.format("Got Fly through DOWN at step %s, d=%.3f: Max GSE=%.3f, lower GSE=%.3f",gs,d,gd.GSE,glideslopeError)) +elseif gd.GSE<-0.3 and glideslopeError>0.4 then +gd.FlyThrough="/" +self:E(self.lid..string.format("Got Fly through UP at step %s, d=%.3f: Min GSE=%.3f, lower GSE=%.3f",gs,d,gd.GSE,glideslopeError)) +end +if math.abs(glideslopeError)>math.abs(gd.GSE)then +self:T(self.lid..string.format("Got bigger GSE at step %s, d=%.3f: GSE |%.3f|>|%.3f|",gs,d,glideslopeError,gd.GSE)) +gd.GSE=glideslopeError +end +local aircraftaoa=self:_GetAircraftAoA(playerData) +local aoaopt=aircraftaoa.OnSpeed +if math.abs(AoA-aoaopt)>math.abs(gd.AoA-aoaopt)then +self:T(self.lid..string.format("Got bigger AoA error at step %s, d=%.3f: AoA %.3f>%.3f.",gs,d,AoA,gd.AoA)) +gd.AoA=AoA +end +end +local deltaT=timer.getTime()-playerData.Tlso +local _advice=true +if playerData.TIG0==nil and playerData.difficulty~=AIRBOSS.Difficulty.EASY then +_advice=false +end +if deltaT>=self.LSOdT and _advice then +self:_LSOadvice(playerData,glideslopeError,lineupError) +end +end +if X>self.carrierparam.totlength+self.carrierparam.sterndist then +if playerData.waveoff then +if playerData.landed then +self:_AddToDebrief(playerData,"You were waved off but landed anyway. Airboss wants to talk to you!") +else +self:_AddToDebrief(playerData,"You were waved off.") +end +elseif playerData.boltered then +self:_AddToDebrief(playerData,"You boltered.") +else +self:T("Player was not waved off but flew past the carrier without landing ==> Own wave off!") +self:_AddToDebrief(playerData,"Own waveoff.") +playerData.owo=true +end +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.DEBRIEF) +end +end +function AIRBOSS:_CheckWaveOff(glideslopeError,lineupError,AoA,playerData) +local waveoff=false +local glMax=1.8 +local glMin=-1.2 +local luAbs=3.0 +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +glMax=2.6 +glMin=-2.2 +luAbs=4.1 +end +if glideslopeError>glMax then +local text=string.format("\n- Waveoff due to glideslope error %.2f > %.1f degrees!",glideslopeError,glMax) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +waveoff=true +elseif glideslopeError<glMin then +local text=string.format("\n- Waveoff due to glideslope error %.2f < %.1f degrees!",glideslopeError,glMin) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +waveoff=true +end +if math.abs(lineupError)>luAbs then +local text=string.format("\n- Waveoff due to line up error |%.1f| > %.1f degrees!",lineupError,luAbs) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +waveoff=true +end +if playerData.difficulty==AIRBOSS.Difficulty.HARD and playerData.actype~=AIRBOSS.AircraftCarrier.AV8B then +local aoaac=self:_GetAircraftAoA(playerData) +if AoA<aoaac.FAST then +local text=string.format("\n- Waveoff due to AoA %.1f < %.1f!",AoA,aoaac.FAST) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +waveoff=true +elseif AoA>aoaac.SLOW then +local text=string.format("\n- Waveoff due to AoA %.1f > %.1f!",AoA,aoaac.SLOW) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +waveoff=true +end +end +return waveoff +end +function AIRBOSS:_CheckFoulDeck(playerData) +local check=false +if playerData.step==AIRBOSS.PatternStep.GROOVE_IM or playerData.step==AIRBOSS.PatternStep.GROOVE_IC then +check=true +end +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +if playerData.step==AIRBOSS.PatternStep.GROOVE_AR or playerData.step==AIRBOSS.PatternStep.GROOVE_AL then +check=true +end +end +if playerData.wofd==true or check==false then +return +end +local runway=self:_GetZoneRunwayBox() +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +runway=self:_GetZoneLandingSpot() +end +local R=250 +self:T(self.lid..string.format("Foul deck check: Scanning Carrier Runway Area. Radius=%.1f m.",R)) +local _,_,_,unitscan=self:GetCoordinate():ScanObjects(R,true,false,false) +local fouldeck=false +local foulunit=nil +for _,_unit in pairs(unitscan)do +local unit=_unit +local inzone=unit:IsInZone(runway) +local isaircraft=unit:IsAir() +local isairborn=unit:InAir() +if inzone and isaircraft and not isairborn then +local text=string.format("Unit %s on landing runway ==> Foul deck!",unit:GetName()) +self:T(self.lid..text) +MESSAGE:New(text,10):ToAllIf(self.Debug) +if self.Debug then +runway:FlareZone(FLARECOLOR.Red,30) +end +fouldeck=true +foulunit=unit +end +end +if playerData and fouldeck then +local text=string.format("Foul deck waveoff due to aircraft %s!",foulunit:GetName()) +self:T(self.lid..string.format("%s: %s",playerData.name,text)) +self:_AddToDebrief(playerData,text) +self:RadioTransmission(self.LSORadio,self.LSOCall.FOULDECK,false,1) +self:RadioTransmission(self.LSORadio,self.LSOCall.WAVEOFF,false,1.2,nil,true) +if playerData.showhints then +local text=string.format("overfly landing area and enter bolter pattern.") +self:MessageToPlayer(playerData,text,"LSO",nil,nil,false,3) +end +playerData.wofd=true +playerData.step=AIRBOSS.PatternStep.DEBRIEF +playerData.warning=nil +playerData.valid=false +if foulunit then +local foulflight=self:_GetFlightFromGroupInQueue(foulunit:GetGroup(),self.flights) +if foulflight and not foulflight.ai then +self:MessageToPlayer(foulflight,"move your ass from my runway. NOW!","AIRBOSS") +end +end +end +return fouldeck +end +function AIRBOSS:_GetSternCoord() +local hdg=self.carrier:GetHeading() +local FB=self:GetFinalBearing() +local case=self.case +self.sterncoord:UpdateFromCoordinate(self:GetCoordinate()) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +if case==3 then +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(8,FB-90,true,true) +elseif case==2 or case==1 then +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(8,FB-90,true,true) +end +elseif self.carriertype==AIRBOSS.CarrierType.STENNIS then +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(7,FB+90,true,true) +elseif self.carriertype==AIRBOSS.CarrierType.FORRESTAL then +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(7.5,FB+90,true,true) +elseif self.carriertype==AIRBOSS.CarrierType.ESSEX then +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(-1,FB+90,true,true) +else +self.sterncoord:Translate(self.carrierparam.sterndist,hdg,true,true):Translate(9.5,FB+90,true,true) +end +self.sterncoord:SetAltitude(self.carrierparam.deckheight) +return self.sterncoord +end +function AIRBOSS:_GetWireFromDrawArg() +local wireArgs={} +wireArgs[1]=141 +wireArgs[2]=142 +wireArgs[3]=143 +wireArgs[4]=144 +for wire,drawArg in pairs(wireArgs)do +local value=self.carrier:GetDrawArgumentValue(drawArg) +if math.abs(value)>0.001 then +return wire +end +end +return 99 +end +function AIRBOSS:_GetWire(Lcoord,dc) +local FB=self:GetFinalBearing() +local Scoord=self:_GetSternCoord() +local Ldist=Lcoord:Get2DDistance(Scoord) +dc=dc or 65 +local d=Ldist-dc +if self.mpWireCorrection then +d=d-self.mpWireCorrection +end +local w1=self.carrierparam.wire1 +local w2=self.carrierparam.wire2 +local w3=self.carrierparam.wire3 +local w4=self.carrierparam.wire4 +local wire +if d<w1 then +wire=1 +elseif d<w2 then +wire=2 +elseif d<w3 then +wire=3 +elseif d<w4 then +wire=4 +else +wire=99 +end +if self.Debug and false then +local wp1=Scoord:Translate(w1,FB) +local wp2=Scoord:Translate(w2,FB) +local wp3=Scoord:Translate(w3,FB) +local wp4=Scoord:Translate(w4,FB) +wp1:MarkToAll("Wire 1") +wp2:MarkToAll("Wire 2") +wp3:MarkToAll("Wire 3") +wp4:MarkToAll("Wire 4") +Scoord:MarkToAll("Stern") +Lcoord:MarkToAll(string.format("Landing Point wire=%s",wire)) +Lcoord:SmokeGreen() +local Dcoord=Lcoord:Translate(-dc,FB) +Dcoord:SmokeRed() +end +self:T(string.format("GetWire: L=%.1f, L-dc=%.1f ==> wire=%d (dc=%.1f)",Ldist,Ldist-dc,wire,dc)) +return wire +end +function AIRBOSS:_Trapped(playerData) +if playerData.unit:InAir()==false then +local unit=playerData.unit +local coord=unit:GetCoordinate() +local v=unit:GetVelocityKMH()-self.carrier:GetVelocityKMH() +local stern=self:_GetSternCoord() +local s=stern:Get2DDistance(coord) +local dcorr=100 +if playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER then +dcorr=100 +elseif playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +dcorr=100 +elseif playerData.actype==AIRBOSS.AircraftCarrier.A4EC then +dcorr=56 +elseif playerData.actype==AIRBOSS.AircraftCarrier.T45C then +dcorr=56 +end +local wire=self:_GetWire(coord,dcorr) +local text=string.format("Player %s _Trapped: v=%.1f km/h, s-dcorr=%.1f m ==> wire=%d (dcorr=%d)",playerData.name,v,s-dcorr,wire,dcorr) +self:T(self.lid..text) +if v>5 then +if wire>4 and v>10 and not playerData.warning then +self:RadioTransmission(self.LSORadio,self.LSOCall.BOLTER,nil,nil,nil,true) +playerData.warning=true +end +self:ScheduleOnce(0.1,self._Trapped,self,playerData) +return +end +if self.Debug then +coord:SmokeBlue() +coord:MarkToAll(text) +stern:MarkToAll("Stern") +end +playerData.wire=wire +local text=string.format("Trapped %d-wire.",wire) +if wire==3 then +text=text.." " +elseif wire==2 then +text=text.." " +elseif wire==4 then +text=text.." " +elseif wire==1 then +text=text.." " +end +self:MessageToPlayer(playerData,text,"LSO","") +local hint=string.format("Trapped %d-wire.",wire) +self:_AddToDebrief(playerData,hint,"Groove: IW") +else +local text=string.format("Player %s boltered in trapped function.",playerData.name) +self:T(self.lid..text) +MESSAGE:New(text,5,"DEBUG"):ToAllIf(self.debug) +playerData.boltered=true +end +playerData.step=AIRBOSS.PatternStep.DEBRIEF +playerData.warning=nil +end +function AIRBOSS:_GetZoneInitial(case) +self.zoneInitial=self.zoneInitial or ZONE_POLYGON_BASE:New("Zone CASE I/II Initial") +local radial=self:GetRadial(2,false,false) +local cv=self:GetCoordinate() +local vec2={} +if case==1 then +local c1=cv:Translate(UTILS.NMToMeters(0.5),radial-90) +local c2=cv:Translate(UTILS.NMToMeters(1.3),radial-90):Translate(UTILS.NMToMeters(3),radial) +local c3=cv:Translate(UTILS.NMToMeters(0.4),radial+90):Translate(UTILS.NMToMeters(3),radial) +local c4=cv:Translate(UTILS.NMToMeters(1.0),radial) +local c5=cv +vec2={c1:GetVec2(),c2:GetVec2(),c3:GetVec2(),c4:GetVec2(),c5:GetVec2()} +else +local c1=cv:Translate(UTILS.NMToMeters(0.5),radial-90) +local c2=c1:Translate(UTILS.NMToMeters(0.5),radial) +local c3=cv:Translate(UTILS.NMToMeters(1.2),radial-90):Translate(UTILS.NMToMeters(3),radial) +local c4=cv:Translate(UTILS.NMToMeters(1.2),radial+90):Translate(UTILS.NMToMeters(3),radial) +local c5=cv:Translate(UTILS.NMToMeters(0.5),radial) +local c6=cv +vec2={c1:GetVec2(),c2:GetVec2(),c3:GetVec2(),c4:GetVec2(),c5:GetVec2(),c6:GetVec2()} +end +self.zoneInitial:UpdateFromVec2(vec2) +return self.zoneInitial +end +function AIRBOSS:_GetZoneLineup() +self.zoneLineup=self.zoneLineup or ZONE_POLYGON_BASE:New("Zone Lineup") +local fbi=self:GetRadial(1,false,false) +local st=self:_GetOptLandingCoordinate() +local c1=st +local c2=st:Translate(UTILS.NMToMeters(0.50),fbi+15) +local c3=st:Translate(UTILS.NMToMeters(0.50),fbi+self.lue._max-0.05) +local c4=st:Translate(UTILS.NMToMeters(0.77),fbi+self.lue._max-0.05) +local c5=c4:Translate(UTILS.NMToMeters(0.25),fbi-90) +local vec2={c1:GetVec2(),c2:GetVec2(),c3:GetVec2(),c4:GetVec2(),c5:GetVec2()} +self.zoneLineup:UpdateFromVec2(vec2) +return self.zoneLineup +end +function AIRBOSS:_GetZoneGroove(l,w,b) +self.zoneGroove=self.zoneGroove or ZONE_POLYGON_BASE:New("Zone Groove") +l=l or 1.50 +w=w or 0.25 +b=b or 0.10 +local fbi=self:GetRadial(1,false,false) +local st=self:_GetSternCoord() +local c1=st:Translate(self.carrierparam.totwidthstarboard,fbi-90) +local c2=st:Translate(UTILS.NMToMeters(0.10),fbi-90):Translate(UTILS.NMToMeters(0.3),fbi) +local c3=st:Translate(UTILS.NMToMeters(0.25),fbi-90):Translate(UTILS.NMToMeters(l),fbi) +local c4=st:Translate(UTILS.NMToMeters(w/2),fbi+90):Translate(UTILS.NMToMeters(l),fbi) +local c5=st:Translate(UTILS.NMToMeters(b),fbi+90):Translate(UTILS.NMToMeters(0.3),fbi) +local c6=st:Translate(self.carrierparam.totwidthport,fbi+90) +local vec2={c1:GetVec2(),c2:GetVec2(),c3:GetVec2(),c4:GetVec2(),c5:GetVec2(),c6:GetVec2()} +self.zoneGroove:UpdateFromVec2(vec2) +return self.zoneGroove +end +function AIRBOSS:_GetZoneBullseye(case) +local radius=UTILS.NMToMeters(1) +local distance=UTILS.NMToMeters(3) +local radial=self:GetRadial(case,false,false) +local coord=self:GetCoordinate():Translate(distance,radial) +local vec2=coord:GetVec2() +local zone=ZONE_RADIUS:New("Zone Bullseye",vec2,radius) +return zone +end +function AIRBOSS:_GetZoneDirtyUp(case) +local radius=UTILS.NMToMeters(1) +local distance=UTILS.NMToMeters(9) +local radial=self:GetRadial(case,false,false) +local coord=self:GetCoordinate():Translate(distance,radial) +local vec2=coord:GetVec2() +local zone=ZONE_RADIUS:New("Zone Dirty Up",vec2,radius) +return zone +end +function AIRBOSS:_GetZoneArcOut(case) +local radius=UTILS.NMToMeters(1.25) +local distance=UTILS.NMToMeters(11.75) +local radial=self:GetRadial(case,false,false) +local coord=self:GetCoordinate():Translate(distance,radial) +local zone=ZONE_RADIUS:New("Zone Arc Out",coord:GetVec2(),radius) +return zone +end +function AIRBOSS:_GetZoneArcIn(case) +local radius=UTILS.NMToMeters(1.25) +local radial=self:GetRadial(case,false,true) +local alpha=math.rad(self.holdingoffset) +local x=14 +local distance=UTILS.NMToMeters(x) +local coord=self:GetCoordinate():Translate(distance,radial) +local zone=ZONE_RADIUS:New("Zone Arc In",coord:GetVec2(),radius) +return zone +end +function AIRBOSS:_GetZonePlatform(case) +local radius=UTILS.NMToMeters(1) +local radial=self:GetRadial(case,false,true) +local alpha=math.rad(self.holdingoffset) +local distance=UTILS.NMToMeters(19) +local coord=self:GetCoordinate():Translate(distance,radial) +local zone=ZONE_RADIUS:New("Zone Platform",coord:GetVec2(),radius) +return zone +end +function AIRBOSS:_GetZoneCorridor(case,l) +l=l or 31 +local radial=self:GetRadial(case,false,false) +local offset=self:GetRadial(case,false,true) +local dx=5 +local w=2 +local w2=w/2 +local d=12 +local cv=self:GetCoordinate() +local c={} +c[1]=cv:Translate(-UTILS.NMToMeters(dx),radial) +if math.abs(self.holdingoffset)>=5 then +c[2]=c[1]:Translate(UTILS.NMToMeters(w2),radial-90) +c[3]=c[2]:Translate(UTILS.NMToMeters(d+dx+w2),radial) +c[4]=cv:Translate(UTILS.NMToMeters(15),offset):Translate(UTILS.NMToMeters(1),offset-90) +c[5]=cv:Translate(UTILS.NMToMeters(l),offset):Translate(UTILS.NMToMeters(1),offset-90) +c[6]=cv:Translate(UTILS.NMToMeters(l),offset):Translate(UTILS.NMToMeters(1),offset+90) +c[7]=cv:Translate(UTILS.NMToMeters(13),offset):Translate(UTILS.NMToMeters(1),offset+90) +c[8]=cv:Translate(UTILS.NMToMeters(11),radial):Translate(UTILS.NMToMeters(1),radial+90) +c[9]=c[1]:Translate(UTILS.NMToMeters(w2),radial+90) +else +c[2]=c[1]:Translate(UTILS.NMToMeters(w2),radial-90) +c[3]=c[2]:Translate(UTILS.NMToMeters(dx+l),radial) +c[4]=c[3]:Translate(UTILS.NMToMeters(w),radial+90) +c[5]=c[1]:Translate(UTILS.NMToMeters(w2),radial+90) +end +local p={} +for _i,_c in ipairs(c)do +if self.Debug then +end +p[_i]=_c:GetVec2() +end +local zone=ZONE_POLYGON_BASE:New("CASE II/III Approach Corridor",p) +return zone +end +function AIRBOSS:_GetZoneCarrierBox() +self.zoneCarrierbox=self.zoneCarrierbox or ZONE_POLYGON_BASE:New("Carrier Box Zone") +local S=self:_GetSternCoord() +local hdg=self:GetHeading(false) +local p={} +p[1]=S:Translate(self.carrierparam.totwidthstarboard,hdg+90) +p[2]=p[1]:Translate(self.carrierparam.totlength,hdg) +p[3]=p[2]:Translate(self.carrierparam.totwidthstarboard+self.carrierparam.totwidthport,hdg-90) +p[4]=p[3]:Translate(self.carrierparam.totlength,hdg-180) +local vec2={} +for _,coord in ipairs(p)do +table.insert(vec2,coord:GetVec2()) +end +self.zoneCarrierbox:UpdateFromVec2(vec2) +return self.zoneCarrierbox +end +function AIRBOSS:_GetZoneRunwayBox() +self.zoneRunwaybox=self.zoneRunwaybox or ZONE_POLYGON_BASE:New("Landing Runway Zone") +local S=self:_GetSternCoord() +local FB=self:GetFinalBearing(false) +local p={} +p[1]=S:Translate(self.carrierparam.rwywidth*0.5,FB+90) +p[2]=p[1]:Translate(self.carrierparam.rwylength,FB) +p[3]=p[2]:Translate(self.carrierparam.rwywidth,FB-90) +p[4]=p[3]:Translate(self.carrierparam.rwylength,FB-180) +local vec2={} +for _,coord in ipairs(p)do +table.insert(vec2,coord:GetVec2()) +end +self.zoneRunwaybox:UpdateFromVec2(vec2) +return self.zoneRunwaybox +end +function AIRBOSS:_GetZoneAbeamLandingSpot() +local S=self:_GetOptLandingCoordinate() +local FB=self:GetFinalBearing(false) +local p={} +p[1]=S:Translate(15,FB):Translate(15,FB+90) +p[2]=S:Translate(-45,FB):Translate(15,FB+90) +p[3]=S:Translate(-45,FB):Translate(15,FB-90) +p[4]=S:Translate(15,FB):Translate(15,FB-90) +local vec2={} +for _,coord in ipairs(p)do +table.insert(vec2,coord:GetVec2()) +end +local zone=ZONE_POLYGON_BASE:New("Abeam Landing Spot Zone",vec2) +return zone +end +function AIRBOSS:_GetZoneLandingSpot() +local S=self:_GetLandingSpotCoordinate() +local FB=self:GetFinalBearing(false) +local p={} +p[1]=S:Translate(10,FB):Translate(10,FB+90) +p[2]=S:Translate(-10,FB):Translate(10,FB+90) +p[3]=S:Translate(-10,FB):Translate(10,FB-90) +p[4]=S:Translate(10,FB):Translate(10,FB-90) +local vec2={} +for _,coord in ipairs(p)do +table.insert(vec2,coord:GetVec2()) +end +local zone=ZONE_POLYGON_BASE:New("Landing Spot Zone",vec2) +return zone +end +function AIRBOSS:_GetZoneHolding(case,stack) +local zoneHolding=nil +if stack<=0 then +self:E(self.lid.."ERROR: Stack <= 0 in _GetZoneHolding!") +self:E({case=case,stack=stack}) +return nil +end +local patternalt,c1,c2=self:_GetMarshalAltitude(stack,case) +if case==1 then +local hdg=self:GetHeading() +local D=UTILS.NMToMeters(2.5) +local Post=self:GetCoordinate():Translate(D,hdg+270) +self.zoneHolding=ZONE_RADIUS:New("CASE I Holding Zone",Post:GetVec2(),self.marshalradius) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +self.zoneHolding=ZONE_RADIUS:New("CASE I Holding Zone",self.carrier:GetVec2(),UTILS.NMToMeters(5)) +end +else +local radial=self:GetRadial(case,false,true) +local p={} +p[1]=c2:Translate(UTILS.NMToMeters(1),radial-90):GetVec2() +p[2]=c1:Translate(UTILS.NMToMeters(1),radial-90):GetVec2() +p[3]=c1:Translate(UTILS.NMToMeters(7),radial+90):GetVec2() +p[4]=c2:Translate(UTILS.NMToMeters(7),radial+90):GetVec2() +self.zoneHolding=self.zoneHolding or ZONE_POLYGON_BASE:New("CASE II/III Holding Zone") +self.zoneHolding:UpdateFromVec2(p) +end +return self.zoneHolding +end +function AIRBOSS:_GetZoneCommence(case,stack) +local zone +if case==1 then +local hdg=self:GetHeading() +local D=UTILS.NMToMeters(4.75) +local R=UTILS.NMToMeters(1) +local Three=self:GetCoordinate():Translate(D,hdg+275) +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +local Dx=UTILS.NMToMeters(2.25) +local Dz=UTILS.NMToMeters(2.25) +R=UTILS.NMToMeters(1) +Three=self:GetCoordinate():Translate(Dz,hdg-90):Translate(Dx,hdg-180) +end +self.zoneCommence=self.zoneCommence or ZONE_RADIUS:New("CASE I Commence Zone") +self.zoneCommence:UpdateFromVec2(Three:GetVec2(),R) +else +stack=stack or 1 +local l=20+stack +local offset=self:GetRadial(case,false,true) +local cv=self:GetCoordinate() +local c={} +c[1]=cv:Translate(UTILS.NMToMeters(l),offset):Translate(UTILS.NMToMeters(1),offset-90) +c[2]=cv:Translate(UTILS.NMToMeters(l+2.5),offset):Translate(UTILS.NMToMeters(1),offset-90) +c[3]=cv:Translate(UTILS.NMToMeters(l+2.5),offset):Translate(UTILS.NMToMeters(1),offset+90) +c[4]=cv:Translate(UTILS.NMToMeters(l),offset):Translate(UTILS.NMToMeters(1),offset+90) +local p={} +for _i,_c in ipairs(c)do +p[_i]=_c:GetVec2() +end +self.zoneCommence=self.zoneCommence or ZONE_POLYGON_BASE:New("CASE II/III Commence Zone") +self.zoneCommence:UpdateFromVec2(p) +end +return self.zoneCommence +end +function AIRBOSS:_AttitudeMonitor(playerData) +local unit=playerData.unit +local aoa=unit:GetAoA() +local yaw=unit:GetYaw() +local roll=unit:GetRoll() +local pitch=unit:GetPitch() +local dist=playerData.unit:GetCoordinate():Get2DDistance(self:GetCoordinate()) +local dx,dz,rho,phi=self:_GetDistances(unit) +local wind=unit:GetCoordinate():GetWindWithTurbulenceVec3() +local velo=unit:GetVelocityVec3() +local vabs=UTILS.VecNorm(velo) +local rwy=false +local step=playerData.step +if playerData.step==AIRBOSS.PatternStep.FINAL or +playerData.step==AIRBOSS.PatternStep.GROOVE_XX or +playerData.step==AIRBOSS.PatternStep.GROOVE_IM or +playerData.step==AIRBOSS.PatternStep.GROOVE_IC or +playerData.step==AIRBOSS.PatternStep.GROOVE_AR or +playerData.step==AIRBOSS.PatternStep.GROOVE_AL or +playerData.step==AIRBOSS.PatternStep.GROOVE_LC or +playerData.step==AIRBOSS.PatternStep.GROOVE_IW then +step=self:_GS(step,-1) +rwy=true +end +local relhead=self:_GetRelativeHeading(playerData.unit,rwy) +local text=string.format("Pattern step: %s",step) +text=text..string.format("\nAoA=%.1f° = %.1f Units | |V|=%.1f knots",aoa,self:_AoADeg2Units(playerData,aoa),UTILS.MpsToKnots(vabs)) +if self.Debug then +text=text..string.format("\nVx=%.1f Vy=%.1f Vz=%.1f m/s",velo.x,velo.y,velo.z) +text=text..string.format("\nWind Vx=%.1f Vy=%.1f Vz=%.1f m/s",wind.x,wind.y,wind.z) +end +text=text..string.format("\nPitch=%.1f° | Roll=%.1f° | Yaw=%.1f°",pitch,roll,yaw) +text=text..string.format("\nClimb Angle=%.1f° | Rate=%d ft/min",unit:GetClimbAngle(),velo.y*196.85) +local dist=self:_GetOptLandingCoordinate():Get3DDistance(playerData.unit:GetVec3()) +local vplayer=playerData.unit:GetVelocityKMH() +local vcarrier=self.carrier:GetVelocityKMH() +local dv=math.abs(vplayer-vcarrier) +local alt=self:_GetAltCarrier(playerData.unit) +text=text..string.format("\nDist=%.1f m Alt=%.1f m delta|V|=%.1f km/h",dist,alt,dv) +if playerData.step==AIRBOSS.PatternStep.FINAL or +playerData.step==AIRBOSS.PatternStep.GROOVE_XX or +playerData.step==AIRBOSS.PatternStep.GROOVE_IM or +playerData.step==AIRBOSS.PatternStep.GROOVE_IC or +playerData.step==AIRBOSS.PatternStep.GROOVE_AR or +playerData.step==AIRBOSS.PatternStep.GROOVE_AL or +playerData.step==AIRBOSS.PatternStep.GROOVE_LC or +playerData.step==AIRBOSS.PatternStep.GROOVE_IW then +local lue=self:_Lineup(playerData.unit,true) +local gle=self:_Glideslope(playerData.unit) +text=text..string.format("\nGamma=%.1f° | Rho=%.1f°",relhead,phi) +text=text..string.format("\nLineUp=%.2f° | GlideSlope=%.2f° | AoA=%.1f Units",lue,gle,self:_AoADeg2Units(playerData,aoa)) +local grade,points,analysis=self:_LSOgrade(playerData) +text=text..string.format("\nTgroove=%.1f sec",self:_GetTimeInGroove(playerData)) +text=text..string.format("\nGrade: %s %.1f PT - %s",grade,points,analysis) +else +text=text..string.format("\nR=%.2f NM | X=%d Z=%d m",UTILS.MetersToNM(rho),dx,dz) +text=text..string.format("\nGamma=%.1f° | Rho=%.1f°",relhead,phi) +end +local lueWire=self:_LineupWIRE(playerData.unit,true) +text=text..string.format("\nLineUpForWireCalls=%.2f° | lineup for Groove calls=%.2f°",lueWire or 0,lue or 0) +local unitClient=Unit.getByName(unit:GetName()) +local hornet=playerData.actype==AIRBOSS.AircraftCarrier.HORNET +local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B +if hornet then +local nozzlePosL=0 +local burnerPosL=unitClient:getDrawArgumentValue(28) +if burnerPosL<0.2 then +nozzlePosL=unitClient:getDrawArgumentValue(89) +else +nozzlePosL=0 +end +local nozzlePosR=0 +local burnerPosR=unitClient:getDrawArgumentValue(29) +if burnerPosR<0.2 then +nozzlePosR=unitClient:getDrawArgumentValue(90) +else +nozzlePosR=0 +end +text=text..string.format("\n Left Nozzle position=%.2f | Right Nozzle position=%.2f ",nozzlePosL,nozzlePosR) +end +if tomcat then +local nozzlePosL=unitClient:getDrawArgumentValue(434) +local nozzlePosR=unitClient:getDrawArgumentValue(433) +text=text..string.format("\n Left Nozzle position=%.2f | Right Nozzle position=%.2f ",nozzlePosL,nozzlePosR) +end +MESSAGE:New(text,1,nil,true):ToClient(playerData.client) +end +function AIRBOSS:_Glideslope(unit,optangle) +if optangle==nil then +if unit:GetTypeName()==AIRBOSS.AircraftCarrier.AV8B then +optangle=3.0 +else +optangle=3.5 +end +end +local landingcoord=self:_GetOptLandingCoordinate() +local x=unit:GetCoordinate():Get2DDistance(landingcoord) +local h=self:_GetAltCarrier(unit) +if unit:GetTypeName()==AIRBOSS.AircraftCarrier.AV8B then +h=unit:GetAltitude()-(UTILS.FeetToMeters(50)+self.carrierparam.deckheight+2) +end +local glideslope=math.atan(h/x) +local gs=math.deg(glideslope)-optangle +return gs +end +function AIRBOSS:_Glideslope2(unit,optangle) +if optangle==nil then +if unit:GetTypeName()==AIRBOSS.AircraftCarrier.AV8B then +optangle=3.0 +else +optangle=3.5 +end +end +local landingcoord=self:_GetOptLandingCoordinate() +local x=unit:GetCoordinate():Get3DDistance(landingcoord) +local h=self:_GetAltCarrier(unit) +if unit:GetTypeName()==AIRBOSS.AircraftCarrier.AV8B then +h=unit:GetAltitude()-(UTILS.FeetToMeters(50)+self.carrierparam.deckheight+2) +end +local glideslope=math.asin(h/x) +local gs=math.deg(glideslope)-optangle +self:T3(self.lid..string.format("Glide slope error = %.1f, x=%.1f h=%.1f",gs,x,h)) +return gs +end +function AIRBOSS:_Lineup(unit,runway) +local landingcoord=self:_GetOptLandingCoordinate() +local A=landingcoord:GetVec3() +local B=unit:GetVec3() +local C=UTILS.VecSubstract(A,B) +C.y=0.0 +local X=self.carrier:GetOrientationX() +X.y=0.0 +if runway then +X=UTILS.Rotate2D(X,-self.carrierparam.rwyangle) +end +local x=UTILS.VecDot(X,C) +local Z=self.carrier:GetOrientationZ() +Z.y=0.0 +if runway then +Z=UTILS.Rotate2D(Z,-self.carrierparam.rwyangle) +end +local z=UTILS.VecDot(Z,C) +local lineup=math.deg(math.atan2(z,x)) +return lineup +end +function AIRBOSS:_LineupWIRE(unit,runway) +local landingcoord=self:_GetOptLandingCoordinateWIRE() +local A=landingcoord:GetVec3() +local B=unit:GetVec3() +local C=UTILS.VecSubstract(A,B) +C.y=0.0 +local X=self.carrier:GetOrientationX() +X.y=0.0 +if runway then +X=UTILS.Rotate2D(X,-self.carrierparam.rwyangle) +end +local x=UTILS.VecDot(X,C) +local Z=self.carrier:GetOrientationZ() +Z.y=0.0 +if runway then +Z=UTILS.Rotate2D(Z,-self.carrierparam.rwyangle) +end +local z=UTILS.VecDot(Z,C) +local lineup=math.deg(math.atan2(z,x)) +return lineup +end +function AIRBOSS:_NozzleArgumentLeft(unit) +local unitClient=Unit.getByName(unit:GetName()) +local typeName=unit:GetTypeName() +local nozzlePosL=0 +local burnerPosL=0 +if typeName=="FA-18C_hornet"then +burnerPosL=unitClient:getDrawArgumentValue(28) +if burnerPosL<0.2 then +nozzlePosL=unitClient:getDrawArgumentValue(89) +else +nozzlePosL=0 +end +elseif typeName=="F-14A-135-GR"or typeName=="F-14B"then +nozzlePosL=unitClient:getDrawArgumentValue(434) +end +return nozzlePosL +end +function AIRBOSS:_NozzleArgumentRight(unit) +local unitClient=Unit.getByName(unit:GetName()) +local typeName=unit:GetTypeName() +local nozzlePosR=0 +local burnerPosR=0 +if typeName=="FA-18C_hornet"then +burnerPosR=unitClient:getDrawArgumentValue(29) +if burnerPosR<0.2 then +nozzlePosR=unitClient:getDrawArgumentValue(90) +else +nozzlePosR=0 +end +elseif typeName=="F-14A-135-GR"or typeName=="F-14B"then +nozzlePosR=unitClient:getDrawArgumentValue(433) +end +return nozzlePosR +end +function AIRBOSS:_GetAltCarrier(unit) +local h=unit:GetAltitude()-self.carrierparam.deckheight-2 +return h +end +function AIRBOSS:_GetOptLandingCoordinate() +self.landingcoord:UpdateFromCoordinate(self:_GetSternCoord()) +local FB=self:GetFinalBearing(false) +local case=self.case +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +if case==3 then +self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()) +self.landingcoord:SetAltitude(UTILS.FeetToMeters(120)) +elseif case==2 or case==1 then +self.landingcoord:UpdateFromCoordinate(self:_GetLandingSpotCoordinate()):Translate(35,FB-90,true,true) +self.landingcoord:SetAltitude(UTILS.FeetToMeters(120)) +end +else +if self.carrierparam.wire3 then +self.landingcoord:Translate(self.carrierparam.wire3,FB,true,true) +end +self.landingcoord.y=self.landingcoord.y+2 +end +return self.landingcoord +end +function AIRBOSS:_GetOptLandingCoordinateWIRE() +self.landingcoord:UpdateFromCoordinate(self:_GetSternCoord()) +local FB=self:GetFinalBearing(false) +local case=self.case +if self.carrierparam.wire3 then +self.landingcoord:Translate(self.carrierparam.wire3+500,FB,true,true) +end +self.landingcoord.y=self.landingcoord.y+2 +return self.landingcoord +end +function AIRBOSS:_GetLandingSpotCoordinate() +self.landingspotcoord:UpdateFromCoordinate(self:_GetSternCoord()) +local hdg=self:GetHeading() +self.landingspotcoord:Translate(self.carrierparam.landingspot,hdg,true,true):SetAltitude(self.carrierparam.deckheight) +return self.landingspotcoord +end +function AIRBOSS:GetHeading(magnetic) +self:F3({magnetic=magnetic}) +local hdg=self.carrier:GetHeading() +if magnetic then +hdg=hdg-self.magvar +end +hdg=hdg%360 +return hdg +end +function AIRBOSS:GetBRC() +return self:GetHeading(true) +end +function AIRBOSS:GetWind(alt,magnetic,coord) +local cv=coord or self:GetCoordinate() +local Wdir,Wspeed=cv:GetWind(alt or 18) +if magnetic then +Wdir=Wdir-self.magvar +if Wdir<0 then +Wdir=Wdir+360 +end +end +return Wdir,Wspeed +end +function AIRBOSS:GetWindOnDeck(alt) +local cv=self:GetCoordinate() +local vc=self.carrier:GetVelocityVec3() +local xc=self.carrier:GetOrientationX() +local zc=self.carrier:GetOrientationZ() +xc=UTILS.Rotate2D(xc,-self.carrierparam.rwyangle) +zc=UTILS.Rotate2D(zc,-self.carrierparam.rwyangle) +local vw=cv:GetWindWithTurbulenceVec3(alt or 18) +local vT=UTILS.VecSubstract(vw,vc) +local vpa=UTILS.VecDot(vT,xc) +local vpp=UTILS.VecDot(vT,zc) +local vabs=UTILS.VecNorm(vT) +return-vpa,vpp,vabs +end +function AIRBOSS:GetHeadingIntoWind(vdeck,magnetic,coord) +if self.intowindold then +return self:GetHeadingIntoWind_old(vdeck,magnetic,coord) +else +return self:GetHeadingIntoWind_new(vdeck,magnetic,coord) +end +end +function AIRBOSS:GetHeadingIntoWind_old(vdeck,magnetic,coord) +local function adjustDegreesForWindSpeed(windSpeed) +local degreesAdjustment=0 +if windSpeed>0 and windSpeed<3 then +degreesAdjustment=30 +elseif windSpeed>=3 and windSpeed<5 then +degreesAdjustment=20 +elseif windSpeed>=5 and windSpeed<8 then +degreesAdjustment=8 +elseif windSpeed>=8 and windSpeed<13 then +degreesAdjustment=4 +elseif windSpeed>=13 then +degreesAdjustment=0 +end +return degreesAdjustment +end +local windfrom,vwind=self:GetWind(nil,nil,coord) +local intowind=windfrom-self.carrierparam.rwyangle+adjustDegreesForWindSpeed(vwind) +if vwind<0.1 then +intowind=self:GetHeading() +end +if magnetic then +intowind=intowind-self.magvar +end +if intowind<0 then +intowind=intowind+360 +end +local vtot=math.max(vdeck-UTILS.MpsToKnots(vwind),4) +return intowind,vtot +end +function AIRBOSS:GetHeadingIntoWind_new(vdeck,magnetic,coord) +local Offset=self.carrierparam.rwyangle or 0 +local windfrom,vwind=self:GetWind(18,nil,coord) +local Vmin=4 +local Vmax=UTILS.KmphToKnots(self.carrier:GetSpeedMax()) +if vwind<0.1 then +local h=self:GetHeading(magnetic) +return h,math.min(vdeck,Vmax) +end +vwind=UTILS.MpsToKnots(vwind) +local windto=(windfrom+180)%360 +local alpha=math.rad(-Offset) +local C=math.sqrt(math.cos(alpha)^2/math.sin(alpha)^2+1) +local vdeckMax=vwind+math.cos(alpha)*Vmax +local vdeckMin=vwind+math.cos(alpha)*Vmin +local v=0 +local theta=0 +if vdeck>vdeckMax then +v=Vmax +theta=math.asin(v/(vwind*C))-math.asin(-1/C) +elseif vdeck<vdeckMin then +v=Vmin +theta=math.asin(v/(vwind*C))-math.asin(-1/C) +elseif vdeck*math.sin(alpha)>vwind then +theta=math.pi/2 +v=math.sqrt(vdeck^2-vwind^2) +else +theta=math.asin(vdeck*math.sin(alpha)/vwind) +v=vdeck*math.cos(alpha)-vwind*math.cos(theta) +end +local magvar=magnetic and self.magvar or 0 +local intowind=(540+(windto-magvar+math.deg(theta)))%360 +return intowind,v +end +function AIRBOSS:GetBRCintoWind(vdeck) +return self:GetHeadingIntoWind(vdeck,true) +end +function AIRBOSS:GetFinalBearing(magnetic) +local fb=self:GetHeading(magnetic) +fb=fb+self.carrierparam.rwyangle +if fb<0 then +fb=fb+360 +end +return fb +end +function AIRBOSS:GetRadial(case,magnetic,offset,inverse) +case=case or self.case +local radial +if case==1 then +radial=self:GetFinalBearing(magnetic)-180 +elseif case==2 then +radial=self:GetHeading(magnetic)-180 +if offset then +radial=radial+self.holdingoffset +end +elseif case==3 then +radial=self:GetFinalBearing(magnetic)-180 +if offset then +radial=radial+self.holdingoffset +end +end +if radial<0 then +radial=radial+360 +end +if inverse then +radial=radial-180 +if radial<0 then +radial=radial+360 +end +end +return radial +end +function AIRBOSS:_GetDeltaHeading(hdg1,hdg2) +local V={} +V.x=math.cos(math.rad(hdg1)) +V.y=0 +V.z=math.sin(math.rad(hdg1)) +local W={} +W.x=math.cos(math.rad(hdg2)) +W.y=0 +W.z=math.sin(math.rad(hdg2)) +local alpha=UTILS.VecAngle(V,W) +return alpha +end +function AIRBOSS:_GetRelativeHeading(unit,runway) +local vC=self.carrier:GetOrientationX() +if runway then +vC=UTILS.Rotate2D(vC,-self.carrierparam.rwyangle) +end +local vP=unit:GetOrientationX() +vC.y=0; +vP.y=0 +local rhdg=UTILS.VecAngle(vC,vP) +return rhdg +end +function AIRBOSS:_GetRelativeVelocity(unit) +local vC=self.carrier:GetVelocityVec3() +local vP=unit:GetVelocityVec3() +vC.y=0; +vP.y=0 +local v=UTILS.VecSubstract(vP,vC) +return UTILS.VecNorm(v),v +end +function AIRBOSS:_GetDistances(unit) +local a=self.carrier:GetVec3() +local b=unit:GetVec3() +local c={x=b.x-a.x,y=0,z=b.z-a.z} +local x=self.carrier:GetOrientationX() +local dx=UTILS.VecDot(x,c) +local z=self.carrier:GetOrientationZ() +local dz=UTILS.VecDot(z,c) +local rho=math.sqrt(dx*dx+dz*dz) +local phi=math.deg(math.atan2(dz,dx)) +if phi<0 then +phi=phi+360 +end +return dx,dz,rho,phi +end +function AIRBOSS:_CheckLimits(X,Z,check) +local nextXmin=check.LimitXmin==nil or(check.LimitXmin and(check.LimitXmin<0 and X<=check.LimitXmin or check.LimitXmin>=0 and X>=check.LimitXmin)) +local nextXmax=check.LimitXmax==nil or(check.LimitXmax and(check.LimitXmax<0 and X>=check.LimitXmax or check.LimitXmax>=0 and X<=check.LimitXmax)) +local nextZmin=check.LimitZmin==nil or(check.LimitZmin and(check.LimitZmin<0 and Z<=check.LimitZmin or check.LimitZmin>=0 and Z>=check.LimitZmin)) +local nextZmax=check.LimitZmax==nil or(check.LimitZmax and(check.LimitZmax<0 and Z>=check.LimitZmax or check.LimitZmax>=0 and Z<=check.LimitZmax)) +local next=nextXmin and nextXmax and nextZmin and nextZmax +local text=string.format("step=%s: next=%s: X=%d Xmin=%s Xmax=%s | Z=%d Zmin=%s Zmax=%s",check.name,tostring(next),X,tostring(check.LimitXmin),tostring(check.LimitXmax),Z,tostring(check.LimitZmin),tostring(check.LimitZmax)) +self:T3(self.lid..text) +return next +end +function AIRBOSS:_LSOadvice(playerData,glideslopeError,lineupError) +local advice=0 +if glideslopeError>self.gle.HIGH then +self:RadioTransmission(self.LSORadio,self.LSOCall.HIGH,true,nil,nil,true) +advice=advice+self.LSOCall.HIGH.duration +elseif glideslopeError>self.gle.High then +self:RadioTransmission(self.LSORadio,self.LSOCall.HIGH,false,nil,nil,true) +advice=advice+self.LSOCall.HIGH.duration +elseif glideslopeError<self.gle.LOW then +self:RadioTransmission(self.LSORadio,self.LSOCall.POWER,true,nil,nil,true) +advice=advice+self.LSOCall.POWER.duration +elseif glideslopeError<self.gle.Low then +self:RadioTransmission(self.LSORadio,self.LSOCall.POWER,false,nil,nil,true) +advice=advice+self.LSOCall.POWER.duration +elseif glideslopeError<self.gle._min then +self:RadioTransmission(self.LSORadio,self.LSOCall.POWER,false,nil,nil,true) +advice=advice+self.LSOCall.POWERsoft.duration +else +end +if lineupError<self.lue.LEFT then +self:RadioTransmission(self.LSORadio,self.LSOCall.COMELEFT,true,nil,nil,true) +advice=advice+self.LSOCall.COMELEFT.duration +elseif lineupError<self.lue.Left then +self:RadioTransmission(self.LSORadio,self.LSOCall.COMELEFT,false,nil,nil,true) +advice=advice+self.LSOCall.COMELEFT.duration +elseif lineupError>self.lue.RIGHT then +self:RadioTransmission(self.LSORadio,self.LSOCall.RIGHTFORLINEUP,true,nil,nil,true) +advice=advice+self.LSOCall.RIGHTFORLINEUP.duration +elseif lineupError>self.lue.Right then +self:RadioTransmission(self.LSORadio,self.LSOCall.RIGHTFORLINEUP,false,nil,nil,true) +advice=advice+self.LSOCall.RIGHTFORLINEUP.duration +else +end +local AOA=playerData.unit:GetAoA() +local acaoa=self:_GetAircraftAoA(playerData) +if playerData.actype~=AIRBOSS.AircraftCarrier.AV8B then +if AOA>acaoa.SLOW then +self:RadioTransmission(self.LSORadio,self.LSOCall.SLOW,true,nil,nil,true) +advice=advice+self.LSOCall.SLOW.duration +elseif AOA>acaoa.Slow then +self:RadioTransmission(self.LSORadio,self.LSOCall.SLOW,false,nil,nil,true) +advice=advice+self.LSOCall.SLOW.duration +elseif AOA>acaoa.OnSpeedMax then +elseif AOA<acaoa.FAST then +self:RadioTransmission(self.LSORadio,self.LSOCall.FAST,true,nil,nil,true) +advice=advice+self.LSOCall.FAST.duration +elseif AOA<acaoa.Fast then +self:RadioTransmission(self.LSORadio,self.LSOCall.FAST,false,nil,nil,true) +advice=advice+self.LSOCall.FAST.duration +elseif AOA<acaoa.OnSpeedMin then +end +end +playerData.Tlso=timer.getTime() +end +function AIRBOSS:_EvalGrooveTime(playerData) +local t=playerData.Tgroove +local grade="" +if t<9 then +grade="_NESA_" +elseif t<12 then +grade="NESA" +elseif t<15 then +grade="(NESA)" +elseif t<19 then +grade="" +elseif t<22 then +grade="(LIG)" +elseif t<25 then +grade="LIG" +elseif t>=25 then +grade="_LIG_" +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t<55 then +grade="FAST V/STOL Groove" +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t<75 then +grade="OK V/STOL Groove" +elseif playerData.actype==AIRBOSS.AircraftCarrier.AV8B and t>=76 then +grade="SLOW V/STOL Groove" +else +grade="LIG" +end +if t>=16.49 and t<=16.6 then +grade="_OK_" +end +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B and(t>=60.0 and t<=65.0)then +grade="_OK_ V/STOL" +end +return grade +end +function AIRBOSS:_LSOgrade(playerData) +local function count(base,pattern) +return select(2,string.gsub(base,pattern,"")) +end +local TIG="" +if playerData.Tgroove and playerData.Tgroove<=360 and playerData.case<3 then +TIG=self:_EvalGrooveTime(playerData)or"N/A" +end +local GXX,nXX=self:_Flightdata2Text(playerData,AIRBOSS.GroovePos.XX) +local GIM,nIM=self:_Flightdata2Text(playerData,AIRBOSS.GroovePos.IM) +local GIC,nIC=self:_Flightdata2Text(playerData,AIRBOSS.GroovePos.IC) +local GAR,nAR=self:_Flightdata2Text(playerData,AIRBOSS.GroovePos.AR) +local GIW,nIW=self:_Flightdata2Text(playerData,AIRBOSS.GroovePos.IW) +local vtol=playerData.actype==AIRBOSS.AircraftCarrier.AV8B +local G=GXX.." "..GIM.." ".." "..GIC.." "..GAR.." "..GIW.." "..TIG +local gradeWithDeviations=GXX.."["..nXX.."] "..GIM.."["..nIM.."] "..GIC.."["..nIC.."] "..GAR.."["..nAR.."] "..GIW.."["..nIW.."]" +env.info("LSO Grade [with deviation count]: "..gradeWithDeviations) +local N=nXX+nIM+nIC+nAR+nIW +local nL=count(G,'_')/2 +local nS=count(G,'%(') +local nN=N-nS-nL +if TIG=="_OK_"then nL=nL-1 end +local Tgroove=playerData.Tgroove +local TgrooveUnicorn=Tgroove and(Tgroove>=16.49 and Tgroove<=16.59)or false +local TgrooveVstolUnicorn=Tgroove and(Tgroove>=60.0 and Tgroove<=65.0)and playerData.actype==AIRBOSS.AircraftCarrier.AV8B or false +local grade +local points +if N==0 and TgrooveVstolUnicorn then +grade="_OK_" +points=5.0 +G="Unicorn" +end +if N==0 and TgrooveUnicorn then +if playerData.wire==3 then +grade="_OK_" +points=5.0 +G="Unicorn" +else +grade="OK" +points=4.0 +end +else +if vtol then +local Gb=GXX.." "..GIM +local N=nXX+nIM +local nL=count(Gb,'_')/2 +local nS=count(Gb,'%(') +local nN=N-nS-nL +local Gv=GIC.." "..GAR +local Nv=nIC+nAR +local nLv=count(Gv,'_')/2 +local nSv=count(Gv,'%(') +local nNv=Nv-nSv-nLv +if nL>0 or nLv>1 then +grade="--" +points=2.0 +elseif nN>0 or nNv>1 or nLv==1 then +grade="(OK)" +points=3.0 +else +grade="OK" +points=4.0 +end +else +if nL>0 then +grade="--" +points=2.0 +elseif nN>0 then +grade="(OK)" +points=3.0 +else +grade="OK" +points=4.0 +end +end +end +G=G:gsub("%)%(","") +G=G:gsub("__","") +local text="LSO grade:\n" +text=text..G.."\n" +text=text.."Grade = "..grade.." points = "..points.."\n" +text=text.."# of total deviations = "..N.."\n" +text=text.."# of large deviations _ = "..nL.."\n" +text=text.."# of normal deviations = "..nN.."\n" +text=text.."# of small deviations ( = "..nS.."\n" +self:T2(self.lid..text) +env.info(text) +if playerData.wop then +if playerData.lig then +grade="WO" +points=1.0 +G="LIG" +else +grade="WOP" +points=2.0 +G="n/a" +end +elseif playerData.wofd then +if playerData.landed then +grade="CUT" +points=0.0 +else +grade="WOFD" +points=-1.0 +end +G="n/a" +elseif playerData.owo then +grade="OWO" +points=2.0 +if N==0 then +G="n/a" +end +elseif playerData.waveoff then +if playerData.landed then +grade="CUT" +points=0.0 +else +grade="WO" +points=1.0 +end +elseif playerData.boltered then +grade="-- (BOLTER)" +points=2.5 +elseif not playerData.hover and playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +if playerData.landed then +grade="CUT" +points=0.0 +end +end +if playerData.wire==1 and points>=3 and N>4 then +points=points-1 +end +env.info("Returning: "..grade.." "..points.." "..G) +return grade,points,G +end +function AIRBOSS:_Flightdata2Text(playerData,groovestep) +local function little(text) +return string.format("(%s)",text) +end +local function underline(text) +return string.format("_%s_",text) +end +local fdata=playerData.groove[groovestep] +if fdata==nil then +self:T3(self.lid.."Flight data is nil.") +return"",0 +end +local step=fdata.Step +local AOA=fdata.AoA +local GSE=fdata.GSE +local LUE=fdata.LUE +local LUEwire=fdata.LUEwire +local Lnoz=fdata.LeftNozzle +local Rnoz=fdata.RightNozzle +local ROL=fdata.Roll +local GT=fdata.GT +local acaoa=self:_GetAircraftAoA(playerData) +local P=nil +if step==AIRBOSS.PatternStep.GROOVE_XX and ROL<=3.5 and playerData.case<3 then +if LUE>3.2 then +P=underline("LUL") +elseif LUE>2.2 then +P="LUL" +elseif LUE>1.2 then +P=little("LUL") +end +end +local O=nil +if step==AIRBOSS.PatternStep.GROOVE_XX and playerData.case<3 then +if LUE<self.lue.LEFT then +O=underline("OS") +elseif LUE<self.lue.Left then +O="OS" +elseif LUE<self.lue._min then +O=little("OS") +end +end +local S=nil +local A=nil +if step~=AIRBOSS.PatternStep.GROOVE_IW then +if AIRBOSS.PatternStep.GROOVE_AR and playerData.waveoff==true and playerData.owo==true then +else +if AOA>acaoa.SLOW then +S=underline("SLO") +elseif AOA>acaoa.Slow then +S="SLO" +elseif AOA>acaoa.OnSpeedMax then +S=little("SLO") +elseif AOA<acaoa.FAST then +S=underline("F") +elseif AOA<acaoa.Fast then +S="F" +elseif AOA<acaoa.OnSpeedMin then +S=little("F") +end +if GSE>self.gle.HIGH then +A=underline("H") +elseif GSE>self.gle.High then +A="H" +elseif GSE>self.gle._max then +A=little("H") +elseif GSE<self.gle.LOW then +A=underline("LO") +elseif GSE<self.gle.Low then +A="LO" +elseif GSE<self.gle._min then +A=little("LO") +end +end +end +local stepMod=self:_GS(step) +local D=nil +local DW=nil +local Rol=nil +local Noz=nil +if AIRBOSS.PatternStep.GROOVE_AR and playerData.waveoff==true and playerData.owo==true then +else +if LUE>self.lue.RIGHT and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D=underline("LUL") +elseif LUE>self.lue.Right and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D="LUL" +elseif LUE>self.lue._max and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D=little("LUL") +elseif LUE<self.lue.LEFT and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D=underline("LUR") +elseif LUE<self.lue.Left and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D="LUR" +elseif LUE<self.lue._min and step~=AIRBOSS.PatternStep.GROOVE_XX and step~=AIRBOSS.PatternStep.GROOVE_IW then +D=little("LUR") +end +end +if step==AIRBOSS.PatternStep.GROOVE_IW and playerData.waveoff==false and playerData.owo==false then +if LUEwire>1.2 then +DW=underline("LL") +elseif LUEwire>0.4 then +DW="LL" +elseif LUEwire>0.25 then +DW=little("LL") +elseif LUEwire<-1.17 then +DW=underline("LR") +elseif LUEwire<-0.46 then +DW="LR" +elseif LUEwire<-0.25 then +DW=little("LR") +else +end +if ROL>5 and ROL<=10 then +Rol=little("LRWD") +elseif ROL>10 and ROL<=15 then +Rol=("LRWD") +elseif ROL>15 then +Rol=underline("LRWD") +elseif ROL<-5 and ROL>=-10 then +Rol=little("LLWD") +elseif ROL<-10 and ROL>=-15 then +Rol=("LLWD") +elseif ROL<-15 then +Rol=underline("LLWD") +else +end +local hornet=playerData.actype==AIRBOSS.AircraftCarrier.HORNET +local tomcat=playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B +if hornet then +if Lnoz>0.6 and Rnoz>0.6 then +Noz=underline("EG") +else +end +end +if playerData.Tgroove and playerData.Tgroove<=360 and playerData.case<3 then +local grooveTime=playerData.Tgroove +if grooveTime>19 or grooveTime<15 then +GT="" +end +end +end +local G="" +local n=0 +if stepMod=="XX"then +if playerData.case<3 then +if fdata.WrappedUp then +env.info("Adding WrappedUp deviation.") +G=G..fdata.WrappedUp +n=n+1 +end +if fdata.AngledApch then +env.info("Adding AngledApch deviation.") +G=G..fdata.AngledApch +n=n+1 +end +if fdata.AFU then +env.info("Adding AFU deviation.") +G=G..fdata.AFU +n=n+1 +end +end +end +if fdata.FlyThrough then +G=G..fdata.FlyThrough +end +if S then +env.info("Adding speed deviation.") +G=G..S +n=n+1 +end +if A then +env.info("Adding altitude deviation.") +G=G..A +n=n+1 +end +if D then +env.info("Adding line up deviation.") +G=G..D +n=n+1 +end +if fdata.Drift then +env.info("Adding drift deviation.") +G=G..fdata.Drift +n=n +end +if O then +env.info("Adding overshoot deviation.") +G=G..O +n=n+1 +end +if DW then +env.info("Adding landed L/R deviation.") +G=G..DW +n=n+1 +end +if Rol then +env.info("Adding landed rol deviation.") +G=G..Rol +n=n+1 +end +if Noz then +env.info("Adding eased guns deviation.") +G=G..Noz +n=n+1 +end +if GT then +G=G..GT +n=n+1 +end +local step=self:_GS(step) +step=step:gsub("XX","X") +if G~=""then +G=G..step +end +local text=string.format("LSO Grade at %s:\n",step) +text=text..string.format("AOA=%.1f\n",AOA) +text=text..string.format("GSE=%.1f\n",GSE) +text=text..string.format("LUE=%.1f\n",LUE) +text=text..string.format("ROL=%.1f\n",ROL) +text=text..G +self:T3(self.lid..text) +return G,n +end +function AIRBOSS:_GS(step,n) +local gp +n=n or 0 +if step==AIRBOSS.PatternStep.FINAL then +gp=AIRBOSS.GroovePos.X0 +if n==-1 then +gp=AIRBOSS.GroovePos.X0 +elseif n==1 then +gp=AIRBOSS.GroovePos.XX +end +elseif step==AIRBOSS.PatternStep.GROOVE_XX then +gp=AIRBOSS.GroovePos.XX +if n==-1 then +gp=AIRBOSS.GroovePos.X0 +elseif n==1 then +gp=AIRBOSS.GroovePos.IM +end +elseif step==AIRBOSS.PatternStep.GROOVE_IM then +gp=AIRBOSS.GroovePos.IM +if n==-1 then +gp=AIRBOSS.GroovePos.XX +elseif n==1 then +gp=AIRBOSS.GroovePos.IC +end +elseif step==AIRBOSS.PatternStep.GROOVE_IC then +gp=AIRBOSS.GroovePos.IC +if n==-1 then +gp=AIRBOSS.GroovePos.IM +elseif n==1 then +gp=AIRBOSS.GroovePos.AR +end +elseif step==AIRBOSS.PatternStep.GROOVE_AR then +gp=AIRBOSS.GroovePos.AR +if n==-1 then +gp=AIRBOSS.GroovePos.IC +elseif n==1 then +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +gp=AIRBOSS.GroovePos.AL +else +gp=AIRBOSS.GroovePos.IW +end +end +elseif step==AIRBOSS.PatternStep.GROOVE_AL then +gp=AIRBOSS.GroovePos.AL +if n==-1 then +gp=AIRBOSS.GroovePos.AR +elseif n==1 then +gp=AIRBOSS.GroovePos.LC +end +elseif step==AIRBOSS.PatternStep.GROOVE_LC then +gp=AIRBOSS.GroovePos.LC +if n==-1 then +gp=AIRBOSS.GroovePos.AL +elseif n==1 then +gp=AIRBOSS.GroovePos.LC +end +elseif step==AIRBOSS.PatternStep.GROOVE_IW then +gp=AIRBOSS.GroovePos.IW +if n==-1 then +gp=AIRBOSS.GroovePos.AR +elseif n==1 then +gp=AIRBOSS.GroovePos.IW +end +end +return gp +end +function AIRBOSS:_CheckAbort(X,Z,pos) +local abort=false +if pos.Xmin and X<pos.Xmin then +self:T(string.format("Xmin: X=%d < %d=Xmin",X,pos.Xmin)) +abort=true +elseif pos.Xmax and X>pos.Xmax then +self:T(string.format("Xmax: X=%d > %d=Xmax",X,pos.Xmax)) +abort=true +elseif pos.Zmin and Z<pos.Zmin then +self:T(string.format("Zmin: Z=%d < %d=Zmin",Z,pos.Zmin)) +abort=true +elseif pos.Zmax and Z>pos.Zmax then +self:T(string.format("Zmax: Z=%d > %d=Zmax",Z,pos.Zmax)) +abort=true +end +return abort +end +function AIRBOSS:_TooFarOutText(X,Z,posData) +local text="you are too " +local xtext=nil +if posData.Xmin and X<posData.Xmin then +if posData.Xmin<=0 then +xtext="far behind " +else +xtext="close to " +end +elseif posData.Xmax and X>posData.Xmax then +if posData.Xmax>=0 then +xtext="far ahead of " +else +xtext="close to " +end +end +local ztext=nil +if posData.Zmin and Z<posData.Zmin then +if posData.Zmin<=0 then +ztext="far port of " +else +ztext="close to " +end +elseif posData.Zmax and Z>posData.Zmax then +if posData.Zmax>=0 then +ztext="far starboard of " +else +ztext="too close to " +end +end +if xtext and ztext then +text=text..xtext.." and "..ztext +elseif xtext then +text=text..xtext +elseif ztext then +text=text..ztext +end +text=text.."the carrier." +if xtext==nil and ztext==nil then +text="you are too far from where you should be!" +end +return text +end +function AIRBOSS:_AbortPattern(playerData,X,Z,posData,patternwo) +local text=self:_TooFarOutText(X,Z,posData) +local dtext=string.format("Abort: X=%d Xmin=%s, Xmax=%s | Z=%d Zmin=%s Zmax=%s",X,tostring(posData.Xmin),tostring(posData.Xmax),Z,tostring(posData.Zmin),tostring(posData.Zmax)) +self:T(self.lid..dtext) +self:MessageToPlayer(playerData,text,"LSO") +if patternwo then +playerData.wop=true +self:_AddToDebrief(playerData,string.format("Pattern wave off: %s",text)) +self:RadioTransmission(self.LSORadio,self.LSOCall.DEPARTANDREENTER,false,3,nil,nil,true) +playerData.step=AIRBOSS.PatternStep.DEBRIEF +playerData.warning=nil +end +end +function AIRBOSS:_PlayerHint(playerData,delay,soundoff) +if not playerData.showhints then +return +end +local alt,aoa,dist,speed=self:_GetAircraftParameters(playerData) +local hintAlt,debriefAlt,callAlt=self:_AltitudeCheck(playerData,alt) +local hintSpeed,debriefSpeed,callSpeed=self:_SpeedCheck(playerData,speed) +local hintAoA,debriefAoA,callAoA=self:_AoACheck(playerData,aoa) +local hintDist,debriefDist,callDist=self:_DistanceCheck(playerData,dist) +local hint="" +if hintAlt and hintAlt~=""then +hint=hint.."\n"..hintAlt +end +if hintSpeed and hintSpeed~=""then +hint=hint.."\n"..hintSpeed +end +if hintAoA and hintAoA~=""then +hint=hint.."\n"..hintAoA +end +if hintDist and hintDist~=""then +hint=hint.."\n"..hintDist +end +local debrief="" +if debriefAlt and debriefAlt~=""then +debrief=debrief.."\n- "..debriefAlt +end +if debriefSpeed and debriefSpeed~=""then +debrief=debrief.."\n- "..debriefSpeed +end +if debriefAoA and debriefAoA~=""then +debrief=debrief.."\n- "..debriefAoA +end +if debriefDist and debriefDist~=""then +debrief=debrief.."\n- "..debriefDist +end +if debrief~=""then +self:_AddToDebrief(playerData,debrief) +end +delay=delay or 0 +if not soundoff then +if callAlt then +self:Sound2Player(playerData,self.LSORadio,callAlt,false,delay) +delay=delay+callAlt.duration+0.5 +end +if callSpeed then +self:Sound2Player(playerData,self.LSORadio,callSpeed,false,delay) +delay=delay+callSpeed.duration+0.5 +end +if callAoA then +self:Sound2Player(playerData,self.LSORadio,callAoA,false,delay) +delay=delay+callAoA.duration+0.5 +end +if callDist then +self:Sound2Player(playerData,self.LSORadio,callDist,false,delay) +delay=delay+callDist.duration+0.5 +end +end +if playerData.step==AIRBOSS.PatternStep.ARCIN then +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +local radial=self:GetRadial(playerData.case,true,false,true) +local turn="right" +if self.holdingoffset<0 then +turn="left" +end +hint=hint..string.format("\nTurn %s and select TACAN %03d°.",turn,radial) +end +end +if playerData.step==AIRBOSS.PatternStep.DIRTYUP then +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +hint=hint.."\nFAF! Checks completed. Nozzles 50°." +else +hint=hint.."\nDirty up! Hook, gear and flaps down." +end +end +end +if playerData.step==AIRBOSS.PatternStep.BULLSEYE then +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +if playerData.actype==AIRBOSS.AircraftCarrier.HORNET +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOE +or playerData.actype==AIRBOSS.AircraftCarrier.RHINOF +or playerData.actype==AIRBOSS.AircraftCarrier.GROWLER then +hint=hint..string.format("\nIntercept glideslope and follow the needles.") +else +hint=hint..string.format("\nIntercept glideslope.") +end +end +end +if hint~=""then +local text=string.format("%s%s",playerData.step,hint) +self:MessageToPlayer(playerData,hint,"AIRBOSS","") +end +end +function AIRBOSS:_StepHint(playerData,step) +step=step or playerData.step +if playerData.difficulty==AIRBOSS.Difficulty.EASY and playerData.showhints then +local alt,aoa,dist,speed=self:_GetAircraftParameters(playerData,step) +local hint="" +if alt then +hint=hint..string.format("\nAltitude %d ft",UTILS.MetersToFeet(alt)) +end +if aoa then +hint=hint..string.format("\nAoA %.1f",self:_AoADeg2Units(playerData,aoa)) +end +if speed then +hint=hint..string.format("\nSpeed %d knots",UTILS.MpsToKnots(speed)) +end +if dist then +hint=hint..string.format("\nDistance to the boat %.1f NM",UTILS.MetersToNM(dist)) +end +if step==AIRBOSS.PatternStep.LATEBREAK then +if playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +hint=hint.."\nWing Sweep 20°, Gear DOWN < 280 KIAS." +end +end +if step==AIRBOSS.PatternStep.ABEAM then +if playerData.actype==AIRBOSS.AircraftCarrier.AV8B then +hint=hint.."\nNozzles 50°-60°. Antiskid OFF. Lights OFF." +elseif playerData.actype==AIRBOSS.AircraftCarrier.F14A or playerData.actype==AIRBOSS.AircraftCarrier.F14B then +hint=hint.."\nSlats/Flaps EXTENDED < 225 KIAS. DLC SELECTED. Auto Throttle IF DESIRED." +else +hint=hint.."\nDirty up! Gear DOWN, flaps DOWN. Check hook down." +end +end +if hint~=""then +local text=string.format("Optimal setup at next step %s:%s",step,hint) +self:MessageToPlayer(playerData,text,"AIRBOSS","",nil,false,1) +end +end +end +function AIRBOSS:_AltitudeCheck(playerData,altopt) +if altopt==nil then +return nil,nil +end +local altitude=playerData.unit:GetAltitude() +local lowscore,badscore=self:_GetGoodBadScore(playerData) +local _error=(altitude-altopt)/altopt*100 +local radiocall=nil +local hint="" +if _error>badscore then +radiocall=self:_NewRadioCall(self.LSOCall.HIGH,"Paddles","") +elseif _error>lowscore then +radiocall=self:_NewRadioCall(self.LSOCall.HIGH,"Paddles","") +elseif _error<-badscore then +radiocall=self:_NewRadioCall(self.LSOCall.LOW,"Paddles","") +elseif _error<-lowscore then +radiocall=self:_NewRadioCall(self.LSOCall.LOW,"Paddles","") +else +hint=string.format("Good altitude. ") +end +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +hint=hint..string.format("Optimal altitude is %d ft.",UTILS.MetersToFeet(altopt)) +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +hint="" +elseif playerData.difficulty==AIRBOSS.Difficulty.HARD then +hint="" +end +local debrief=string.format("Altitude %d ft = %d%% deviation from %d ft.",UTILS.MetersToFeet(altitude),_error,UTILS.MetersToFeet(altopt)) +return hint,debrief,radiocall +end +function AIRBOSS:_AoACheck(playerData,optaoa) +if optaoa==nil then +return nil,nil +end +local lowscore,badscore=self:_GetGoodBadScore(playerData) +local aoa=playerData.unit:GetAoA() +local _error=(aoa-optaoa)/optaoa*100 +local aircraftaoa=self:_GetAircraftAoA(playerData) +local radiocall=nil +local hint="" +if aoa>=aircraftaoa.SLOW then +radiocall=self:_NewRadioCall(self.LSOCall.SLOW,"Paddles","") +elseif aoa>=aircraftaoa.Slow then +radiocall=self:_NewRadioCall(self.LSOCall.SLOW,"Paddles","") +elseif aoa>=aircraftaoa.OnSpeedMax then +hint="Your're a little slow. " +elseif aoa>=aircraftaoa.OnSpeedMin then +hint="You're on speed. " +elseif aoa>=aircraftaoa.Fast then +hint="You're a little fast. " +elseif aoa>=aircraftaoa.FAST then +radiocall=self:_NewRadioCall(self.LSOCall.FAST,"Paddles","") +else +radiocall=self:_NewRadioCall(self.LSOCall.FAST,"Paddles","") +end +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +hint=hint..string.format("Optimal AoA is %.1f.",self:_AoADeg2Units(playerData,optaoa)) +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +hint="" +elseif playerData.difficulty==AIRBOSS.Difficulty.HARD then +hint="" +end +local debrief=string.format("AoA %.1f = %d%% deviation from %.1f.",self:_AoADeg2Units(playerData,aoa),_error,self:_AoADeg2Units(playerData,optaoa)) +return hint,debrief,radiocall +end +function AIRBOSS:_SpeedCheck(playerData,speedopt) +if speedopt==nil then +return nil,nil +end +local speed=playerData.unit:GetVelocityMPS() +local lowscore,badscore=self:_GetGoodBadScore(playerData) +local _error=(speed-speedopt)/speedopt*100 +local radiocall=nil +local hint="" +if _error>badscore then +radiocall=self:_NewRadioCall(self.LSOCall.FAST,"AIRBOSS","") +elseif _error>lowscore then +radiocall=self:_NewRadioCall(self.LSOCall.FAST,"AIRBOSS","") +elseif _error<-badscore then +radiocall=self:_NewRadioCall(self.LSOCall.SLOW,"AIRBOSS","") +elseif _error<-lowscore then +radiocall=self:_NewRadioCall(self.LSOCall.SLOW,"AIRBOSS","") +else +hint=string.format("Good speed. ") +end +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +hint=hint..string.format("Optimal speed is %d knots.",UTILS.MpsToKnots(speedopt)) +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +hint="" +elseif playerData.difficulty==AIRBOSS.Difficulty.HARD then +hint="" +end +local debrief=string.format("Speed %d knots = %d%% deviation from %d knots.",UTILS.MpsToKnots(speed),_error,UTILS.MpsToKnots(speedopt)) +return hint,debrief,radiocall +end +function AIRBOSS:_DistanceCheck(playerData,optdist) +if optdist==nil then +return nil,nil +end +local distance=playerData.unit:GetCoordinate():Get2DDistance(self:GetCoordinate()) +local lowscore,badscore=self:_GetGoodBadScore(playerData) +local _error=(distance-optdist)/optdist*100 +local hint +if _error>badscore then +hint=string.format("You're too far from the boat!") +elseif _error>lowscore then +hint=string.format("You're slightly too far from the boat.") +elseif _error<-badscore then +hint=string.format("You're too close to the boat!") +elseif _error<-lowscore then +hint=string.format("You're slightly too far from the boat.") +else +hint=string.format("Good distance to the boat.") +end +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +hint=hint..string.format(" Optimal distance is %.1f NM.",UTILS.MetersToNM(optdist)) +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +hint="" +elseif playerData.difficulty==AIRBOSS.Difficulty.HARD then +hint="" +end +local debrief=string.format("Distance %.1f NM = %d%% deviation from %.1f NM.",UTILS.MetersToNM(distance),_error,UTILS.MetersToNM(optdist)) +return hint,debrief,nil +end +function AIRBOSS:_AddToDebrief(playerData,hint,step) +step=step or playerData.step +table.insert(playerData.debrief,{step=step,hint=hint}) +end +function AIRBOSS:_Debrief(playerData) +self:F(self.lid..string.format("Debriefing of player %s.",playerData.name)) +playerData.debriefschedulerID=nil +playerData.attitudemonitor=false +local grade,points,analysis=self:_LSOgrade(playerData) +if points and points>=0 then +table.insert(playerData.points,points) +end +local Points=0 +if playerData.landed and not playerData.unit:InAir()then +for _,_points in pairs(playerData.points)do +Points=Points+_points +end +Points=Points/#playerData.points +playerData.points={} +else +Points=points +end +local mygrade={} +mygrade.grade=grade +mygrade.points=points +mygrade.details=analysis +mygrade.wire=playerData.wire +mygrade.Tgroove=playerData.Tgroove +if playerData.landed and not playerData.unit:InAir()then +mygrade.finalscore=Points +end +mygrade.case=playerData.case +local windondeck=self:GetWindOnDeck() +mygrade.wind=UTILS.Round(UTILS.MpsToKnots(windondeck),1) +mygrade.modex=playerData.onboard +mygrade.airframe=playerData.actype +mygrade.carriertype=self.carriertype +mygrade.carriername=self.alias +mygrade.carrierrwy=self.carrierparam.rwyangle +mygrade.theatre=self.theatre +mygrade.mitime=UTILS.SecondsToClock(timer.getAbsTime(),true) +mygrade.midate=UTILS.GetDCSMissionDate() +mygrade.osdate="n/a" +if os then +mygrade.osdate=os.date() +end +playerData.grade=mygrade +if playerData.trapon and self.trapsheet then +self:_SaveTrapSheet(playerData,mygrade) +end +table.insert(self.playerscores[playerData.name],mygrade) +self:LSOGrade(playerData,mygrade) +local text=string.format("%s %.1f PT - %s",grade,Points,analysis) +if Points==-1 then +text=string.format("%s n/a PT - Foul deck",grade,Points,analysis) +end +if not(playerData.wop or playerData.wofd)then +if playerData.wire and playerData.wire<=4 then +text=text..string.format(" %d-wire",playerData.wire) +end +if playerData.Tgroove and playerData.Tgroove<=360 and playerData.case<3 then +text=text..string.format("\nTime in the groove %.1f seconds.",playerData.Tgroove) +end +end +playerData.lastdebrief=UTILS.DeepCopy(playerData.debrief) +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +text=text..string.format("\nYour detailed debriefing can be found via the F10 radio menu.") +end +self:MessageToPlayer(playerData,text,"LSO","",30,true) +playerData.step=AIRBOSS.PatternStep.UNDEFINED +if playerData.wop then +if playerData.unit:IsAlive()then +local heading,distance +if playerData.case==1 or playerData.case==2 then +playerData.step=AIRBOSS.PatternStep.INITIAL +local initial=self:GetCoordinate():Translate(UTILS.NMToMeters(3.5),self:GetRadial(2,false,false,false)) +heading=playerData.unit:GetCoordinate():HeadingTo(initial) +distance=playerData.unit:GetCoordinate():Get2DDistance(initial) +elseif playerData.case==3 then +playerData.step=AIRBOSS.PatternStep.BULLSEYE +local zone=self:_GetZoneBullseye(playerData.case) +heading=playerData.unit:GetCoordinate():HeadingTo(zone:GetCoordinate()) +distance=playerData.unit:GetCoordinate():Get2DDistance(zone:GetCoordinate()) +end +local text=string.format("fly heading %03d° for %d NM to re-enter the pattern.",heading,UTILS.MetersToNM(distance)) +self:MessageToPlayer(playerData,text,"LSO",nil,nil,false,5) +else +self:E(self.lid..string.format("ERROR: Player unit not alive!")) +end +elseif playerData.wofd then +if playerData.unit:InAir()then +playerData.step=AIRBOSS.PatternStep.BOLTER +else +self:Sound2Player(playerData,self.LSORadio,self.LSOCall.WELCOMEABOARD) +local text=string.format("deck was fouled but you landed anyway. Airboss wants to talk to you!") +self:MessageToPlayer(playerData,text,"LSO",nil,nil,false,3) +end +elseif playerData.owo then +if playerData.unit:InAir()then +playerData.step=AIRBOSS.PatternStep.BOLTER +else +self:E(self.lid.."ERROR: player landed when OWO was issues. This should not happen. Please report!") +self:Sound2Player(playerData,self.LSORadio,self.LSOCall.WELCOMEABOARD) +end +elseif playerData.waveoff then +if playerData.unit:InAir()then +playerData.step=AIRBOSS.PatternStep.BOLTER +else +self:Sound2Player(playerData,self.LSORadio,self.LSOCall.WELCOMEABOARD) +local text=string.format("you were waved off but landed anyway. Airboss wants to talk to you!") +self:MessageToPlayer(playerData,text,"LSO",nil,nil,false,3) +end +elseif playerData.boltered then +if playerData.unit:InAir()then +playerData.step=AIRBOSS.PatternStep.BOLTER +end +elseif playerData.landed then +if not playerData.unit:InAir()then +self:Sound2Player(playerData,self.LSORadio,self.LSOCall.WELCOMEABOARD) +end +else +self:MessageToPlayer(playerData,"Undefined state after landing! Please report.","ERROR",nil,20) +playerData.step=AIRBOSS.PatternStep.UNDEFINED +end +if playerData.landed and not playerData.unit:InAir()then +self:_RecoveredElement(playerData.unit) +self:_CheckSectionRecovered(playerData) +end +playerData.passes=playerData.passes+1 +self:_StepHint(playerData) +self:_InitPlayer(playerData,playerData.step) +MESSAGE:New(string.format("Player step %s.",playerData.step),5,"DEBUG"):ToAllIf(self.Debug) +if self.autosave and mygrade.finalscore then +self:Save(self.autosavepath,self.autosavefile) +end +end +function AIRBOSS:_CheckCollisionCoord(coordto,coordfrom) +local dx=100 +local d=0 +if coordfrom then +d=0 +else +d=250 +coordfrom=self:GetCoordinate():Translate(d,self:GetHeading()) +end +local dmax=coordfrom:Get2DDistance(coordto) +local direction=coordfrom:HeadingTo(coordto) +local clear=true +while d<=dmax do +local cp=coordfrom:Translate(d,direction) +if not cp:IsSurfaceTypeWater()then +if self.Debug then +local st=cp:GetSurfaceType() +cp:MarkToAll(string.format("Collision check surface type %d",st)) +end +clear=false +break +end +d=d+dx +end +local text="" +if clear then +text=string.format("Path into direction %03d° is clear for the next %.1f NM.",direction,UTILS.MetersToNM(d)) +else +text=string.format("Detected obstacle at distance %.1f NM into direction %03d°.",UTILS.MetersToNM(d),direction) +end +self:T2(self.lid..text) +return not clear,d +end +function AIRBOSS:_CheckFreePathToNextWP(fromcoord) +fromcoord=fromcoord or self:GetCoordinate():Translate(250,self:GetHeading()) +local Nnextwp=math.min(self.currentwp+1,#self.waypoints) +local nextwp=self.waypoints[Nnextwp] +local collision=self:_CheckCollisionCoord(nextwp,fromcoord) +return collision +end +function AIRBOSS:_Pathfinder() +local hdg=self:GetHeading() +local cv=self:GetCoordinate() +local directions={-20,20,-30,30,-40,40,-50,50,-60,60,-70,70,-80,80,-90,90,-100,100} +for _,_direction in pairs(directions)do +local direction=hdg+_direction +local _,dfree=self:_CheckCollisionCoord(cv:Translate(UTILS.NMToMeters(20),direction),cv) +local distance=500 +while distance<=dfree do +local fromcoord=cv:Translate(distance,direction) +local collision=self:_CheckFreePathToNextWP(fromcoord) +self:T2(self.lid..string.format("Pathfinder d=%.1f m, direction=%03d°, collision=%s",distance,direction,tostring(collision))) +if not collision then +self:CarrierDetour(fromcoord) +return +end +distance=distance+500 +end +end +end +function AIRBOSS:CarrierResumeRoute(gotocoord) +AIRBOSS._ResumeRoute(self.carrier:GetGroup(),self,gotocoord) +return self +end +function AIRBOSS:CarrierDetour(coord,speed,uturn,uspeed,tcoord) +local pos0=self:GetCoordinate() +local vel0=self.carrier:GetVelocityKNOTS() +speed=speed or math.max(vel0,5) +local speedkmh=math.max(UTILS.KnotsToKmph(speed),UTILS.KnotsToKmph(2)) +local cspeedkmh=math.max(self.carrier:GetVelocityKMH(),UTILS.KnotsToKmph(10)) +local uspeedkmh=UTILS.KnotsToKmph(uspeed or speed) +local wp={} +table.insert(wp,pos0:WaypointGround(cspeedkmh)) +if tcoord then +table.insert(wp,tcoord:WaypointGround(cspeedkmh)) +end +table.insert(wp,coord:WaypointGround(speedkmh)) +if uturn then +table.insert(wp,pos0:WaypointGround(uspeedkmh)) +end +local group=self.carrier:GetGroup() +local TaskResumeRoute=group:TaskFunction("AIRBOSS._ResumeRoute",self) +group:SetTaskWaypoint(wp[#wp],TaskResumeRoute) +if self.Debug then +if tcoord then +tcoord:MarkToAll(string.format("Detour Turn Help WP. Speed %.1f knots",UTILS.KmphToKnots(cspeedkmh))) +end +coord:MarkToAll(string.format("Detour Waypoint. Speed %.1f knots",UTILS.KmphToKnots(speedkmh))) +if uturn then +pos0:MarkToAll(string.format("Detour U-turn WP. Speed %.1f knots",UTILS.KmphToKnots(uspeedkmh))) +end +end +self.detour=true +self.carrier:Route(wp) +end +function AIRBOSS:CarrierTurnIntoWind(time,vdeck,uturn) +local _,vwind=self:GetWind() +local vdeck=UTILS.MpsToKnots(vdeck) +local hiw,speedknots=self:GetHeadingIntoWind(vdeck) +local vtot=UTILS.KnotsToMps(speedknots) +local dist=vtot*time +local distNM=UTILS.MetersToNM(dist) +local hdg=self:GetHeading() +local deltaH=self:_GetDeltaHeading(hdg,hiw) +self:I(self.lid..string.format("Carrier steaming into the wind (%.1f kts). Heading=%03d-->%03d (Delta=%.1f), Speed=%.1f knots, Distance=%.1f NM, Time=%d sec", +UTILS.MpsToKnots(vwind),hdg,hiw,deltaH,speedknots,distNM,speedknots,time)) +local Cv=self:GetCoordinate() +local Ctiw=nil +local Csoo=nil +if deltaH<45 then +Csoo=Cv:Translate(750,hdg):Translate(750,hiw) +local hsw=self:GetHeadingIntoWind(vdeck,false,Csoo) +Ctiw=Csoo:Translate(dist,hsw) +elseif deltaH<90 then +Csoo=Cv:Translate(900,hdg):Translate(900,hiw) +local hsw=self:GetHeadingIntoWind(vdeck,false,Csoo) +Ctiw=Csoo:Translate(dist,hsw) +elseif deltaH<135 then +Csoo=Cv:Translate(1100,hdg-90):Translate(1000,hiw) +local hsw=self:GetHeadingIntoWind(vdeck,false,Csoo) +Ctiw=Csoo:Translate(dist,hsw) +else +Csoo=Cv:Translate(1200,hdg-90):Translate(1000,hiw) +local hsw=self:GetHeadingIntoWind(vdeck,false,Csoo) +Ctiw=Csoo:Translate(dist,hsw) +end +self.Creturnto=self:GetCoordinate() +local nextwp=self:_GetNextWaypoint() +local vdownwind=UTILS.MpsToKnots(nextwp:GetVelocity()) +if vdownwind<1 then +vdownwind=10 +end +self:CarrierDetour(Ctiw,speedknots,uturn,vdownwind,Csoo) +self.turnintowind=true +return self +end +function AIRBOSS:_GetNextWaypoint() +local Nextwp=nil +if self.currentwp==#self.waypoints then +Nextwp=1 +else +Nextwp=self.currentwp+1 +end +local text=string.format("Current WP=%d/%d, next WP=%d",self.currentwp,#self.waypoints,Nextwp) +self:T2(self.lid..text) +local nextwp=self.waypoints[Nextwp] +return nextwp,Nextwp +end +function AIRBOSS:_InitWaypoints() +local Waypoints=self.carrier:GetGroup():GetTemplateRoutePoints() +self.waypoints={} +for i,point in ipairs(Waypoints)do +local coord=COORDINATE:New(point.x,point.alt,point.y) +coord:SetVelocity(point.speed) +table.insert(self.waypoints,coord) +if self.Debug then +coord:MarkToAll(string.format("Carrier Waypoint %d, Speed=%.1f knots",i,UTILS.MpsToKnots(point.speed))) +end +end +return self +end +function AIRBOSS:_PatrolRoute(n) +local nextWP,N=self:_GetNextWaypoint() +n=n or N +local CarrierGroup=self.carrier:GetGroup() +local Waypoints={} +local wp=self:GetCoordinate():WaypointGround(CarrierGroup:GetVelocityKMH()) +table.insert(Waypoints,wp) +for i=n,#self.waypoints do +local coord=self.waypoints[i] +local wp=coord:WaypointGround(UTILS.MpsToKmph(coord.Velocity)) +local TaskPassingWP=CarrierGroup:TaskFunction("AIRBOSS._PassingWaypoint",self,i,#self.waypoints) +CarrierGroup:SetTaskWaypoint(wp,TaskPassingWP) +table.insert(Waypoints,wp) +end +CarrierGroup:Route(Waypoints) +return self +end +function AIRBOSS:_GetETAatNextWP() +local cwp=self.currentwp +local tnow=timer.getAbsTime() +local p=self:GetCoordinate() +local v=self.carrier:GetVelocityMPS() +local nextWP=self:_GetNextWaypoint() +local s=p:Get2DDistance(nextWP) +local t=s/v +local eta=t+tnow +return eta +end +function AIRBOSS:_CheckCarrierTurning() +local vNew=self.carrier:GetOrientationX() +local vLast=self.Corientlast +vNew.y=0; +vLast.y=0 +local deltaLast=math.deg(math.acos(UTILS.VecDot(vNew,vLast)/UTILS.VecNorm(vNew)/UTILS.VecNorm(vLast))) +self.Corientlast=vNew +local turning=math.abs(deltaLast)>=1 +if self.turning and not turning then +local FB=self:GetFinalBearing(true) +self:_MarshalCallNewFinalBearing(FB) +end +if turning and not self.turning then +local hdg +if self.turnintowind then +local vdeck=self.recoverywindow and self.recoverywindow.SPEED or 20 +hdg=self:GetHeadingIntoWind(vdeck,false) +else +hdg=self:GetCoordinate():HeadingTo(self:_GetNextWaypoint()) +end +hdg=hdg-self.magvar +if hdg<0 then +hdg=360+hdg +end +self:_MarshalCallCarrierTurnTo(hdg) +end +self.turning=turning +end +function AIRBOSS:_CheckPatternUpdate() +local dTPupdate=10*60 +local Dupdate=UTILS.NMToMeters(2.5) +local Hupdate=5 +local dt=timer.getTime()-self.Tpupdate +if dt<dTPupdate or self.turning then +return +end +local vNew=self.carrier:GetOrientationX() +local vOld=self.Corientation +vNew.y=0; +vOld.y=0 +local deltaHeading=math.deg(math.acos(UTILS.VecDot(vNew,vOld)/UTILS.VecNorm(vNew)/UTILS.VecNorm(vOld))) +local Hchange=false +if math.abs(deltaHeading)>=Hupdate then +self:T(self.lid..string.format("Carrier heading changed by %d°.",deltaHeading)) +Hchange=true +end +local pos=self:GetCoordinate() +local dist=pos:Get2DDistance(self.Cposition) +local Dchange=false +if dist>=Dupdate then +self:T(self.lid..string.format("Carrier position changed by %.1f NM.",UTILS.MetersToNM(dist))) +Dchange=true +end +if Hchange or Dchange then +for _,_flight in pairs(self.Qmarshal)do +local flight=_flight +if flight.ai then +self:_MarshalAI(flight,flight.flag) +end +end +self.Corientation=vNew +self.Cposition=pos +self.Tpupdate=timer.getTime() +end +end +function AIRBOSS._PassingWaypoint(group,airboss,i,final) +local text=string.format("Group %s passing waypoint %d of %d.",group:GetName(),i,final) +if airboss.Debug and false then +local pos=group:GetCoordinate() +pos:SmokeRed() +local MarkerID=pos:MarkToAll(string.format("Group %s reached waypoint %d",group:GetName(),i)) +end +MESSAGE:New(text,10):ToAllIf(airboss.Debug) +airboss:T(airboss.lid..text) +airboss.currentwp=i +airboss:PassingWaypoint(i) +if i==final and final>1 and airboss.adinfinitum then +airboss:_PatrolRoute() +end +end +function AIRBOSS._ResumeRoute(group,airboss,gotocoord) +local nextwp,Nextwp=airboss:_GetNextWaypoint() +local speedkmh=nextwp.Velocity*3.6 +if speedkmh<1 then +speedkmh=UTILS.KnotsToKmph(10) +end +local waypoints={} +local c0=group:GetCoordinate() +local wp0=c0:WaypointGround(speedkmh) +table.insert(waypoints,wp0) +if gotocoord then +local headingto=c0:HeadingTo(gotocoord) +local hdg1=airboss:GetHeading() +local hdg2=c0:HeadingTo(gotocoord) +local delta=airboss:_GetDeltaHeading(hdg1,hdg2) +if delta>90 then +local turnradius=UTILS.NMToMeters(3) +local gotocoordh=c0:Translate(turnradius,hdg1+45) +local wp=gotocoordh:WaypointGround(speedkmh) +table.insert(waypoints,wp) +gotocoordh=c0:Translate(turnradius,hdg1+90) +wp=gotocoordh:WaypointGround(speedkmh) +table.insert(waypoints,wp) +end +local wp1=gotocoord:WaypointGround(speedkmh) +table.insert(waypoints,wp1) +end +local text=string.format("Carrier is resuming route. Next waypoint %d, Speed=%.1f knots.",Nextwp,UTILS.KmphToKnots(speedkmh)) +MESSAGE:New(text,10):ToAllIf(airboss.Debug) +airboss:I(airboss.lid..text) +for i=Nextwp,#airboss.waypoints do +local coord=airboss.waypoints[i] +local speed=coord.Velocity*3.6 +if speed<1 then +speed=UTILS.KnotsToKmph(10) +end +local wp=coord:WaypointGround(speed) +local TaskPassingWP=group:TaskFunction("AIRBOSS._PassingWaypoint",airboss,i,#airboss.waypoints) +group:SetTaskWaypoint(wp,TaskPassingWP) +table.insert(waypoints,wp) +end +airboss.turnintowind=false +airboss.detour=false +group:Route(waypoints) +end +function AIRBOSS._ReachedHoldingZone(group,airboss,flight) +local text=string.format("Flight %s reached holding zone.",group:GetName()) +MESSAGE:New(text,10):ToAllIf(airboss.Debug) +airboss:T(airboss.lid..text) +if airboss.Debug then +group:GetCoordinate():MarkToAll(text) +end +if flight then +flight.holding=true +flight.time=timer.getAbsTime() +end +end +function AIRBOSS._TaskFunctionMarshalAI(group,airboss,flight) +local text=string.format("Flight %s is send to marshal.",group:GetName()) +MESSAGE:New(text,10):ToAllIf(airboss.Debug) +airboss:T(airboss.lid..text) +local stack=airboss:_GetFreeStack(flight.ai) +if stack then +airboss:_MarshalAI(flight,stack) +else +if not airboss:_InQueue(airboss.Qwaiting,flight.group)then +airboss:_WaitAI(flight) +end +end +if flight.refueling==true then +airboss:I(airboss.lid..string.format("Flight group %s finished refueling task.",flight.groupname)) +end +flight.refueling=false +end +function AIRBOSS:_GetACNickname(actype) +local nickname="unknown" +if actype==AIRBOSS.AircraftCarrier.A4EC then +nickname="Skyhawk" +elseif actype==AIRBOSS.AircraftCarrier.T45C then +nickname="Goshawk" +elseif actype==AIRBOSS.AircraftCarrier.AV8B then +nickname="Harrier" +elseif actype==AIRBOSS.AircraftCarrier.E2D then +nickname="Hawkeye" +elseif actype==AIRBOSS.AircraftCarrier.C2A then +nickname="Greyhound" +elseif actype==AIRBOSS.AircraftCarrier.F14A_AI or actype==AIRBOSS.AircraftCarrier.F14A or actype==AIRBOSS.AircraftCarrier.F14B then +nickname="Tomcat" +elseif actype==AIRBOSS.AircraftCarrier.FA18C or actype==AIRBOSS.AircraftCarrier.HORNET then +nickname="Hornet" +elseif actype==AIRBOSS.AircraftCarrier.RHINOE or actype==AIRBOSS.AircraftCarrier.RHINOF then +nickname="Rhino" +elseif actype==AIRBOSS.AircraftCarrier.GROWLER then +nickname="Growler" +elseif actype==AIRBOSS.AircraftCarrier.S3B or actype==AIRBOSS.AircraftCarrier.S3BTANKER then +nickname="Viking" +end +return nickname +end +function AIRBOSS:_GetOnboardNumberPlayer(group) +return self:_GetOnboardNumbers(group,true) +end +function AIRBOSS:_GetOnboardNumbers(group,playeronly) +local groupname=group:GetName() +local text=string.format("Onboard numbers of group %s:",groupname) +local template=group:GetTemplate() +local numbers={} +if template then +local units=template.units +for _,unit in pairs(units)do +local n=tostring(unit.onboard_num) +local name=unit.name +local skill=unit.skill or"Unknown" +text=text..string.format("\n- unit %s: onboard #=%s skill=%s",name,n,tostring(skill)) +if playeronly and skill=="Client"or skill=="Player"then +return n +end +numbers[name]=n +end +self:T2(self.lid..text) +else +if playeronly then +return 101 +else +local units=group:GetUnits() +for i,_unit in pairs(units)do +local name=_unit:GetName() +numbers[name]=100+i +end +end +end +return numbers +end +function AIRBOSS:_GetTowerFrequency() +self.TowerFreq=0 +local striketemplate=self.carrier:GetGroup():GetTemplate() +for _,unit in pairs(striketemplate.units)do +if self.carrier:GetName()==unit.name then +self.TowerFreq=unit.frequency/1000000 +return +end +end +end +function AIRBOSS:_GetGoodBadScore(playerData) +local lowscore +local badscore +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +lowscore=10 +badscore=20 +elseif playerData.difficulty==AIRBOSS.Difficulty.NORMAL then +lowscore=5 +badscore=10 +elseif playerData.difficulty==AIRBOSS.Difficulty.HARD then +lowscore=2.5 +badscore=5 +end +return lowscore,badscore +end +function AIRBOSS:_IsCarrierAircraft(unit) +local aircrafttype=unit:GetTypeName() +if aircrafttype==AIRBOSS.AircraftCarrier.AV8B then +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +return true +else +return false +end +end +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +if aircrafttype~=AIRBOSS.AircraftCarrier.AV8B then +return false +end +end +for _,actype in pairs(AIRBOSS.AircraftCarrier)do +if actype==aircrafttype then +return true +end +end +return false +end +function AIRBOSS:_IsHumanUnit(unit) +local playerunit=self:_GetPlayerUnitAndName(unit:GetName()) +if playerunit then +return true +else +return false +end +end +function AIRBOSS:_IsHuman(group) +local units=group:GetUnits() +for _,_unit in pairs(units)do +local human=self:_IsHumanUnit(_unit) +if human then +return true +end +end +return false +end +function AIRBOSS:_GetFuelState(unit) +local fuel=unit:GetFuel() +local maxfuel=self:_GetUnitMasses(unit) +local fuelstate=fuel*maxfuel +self:T2(self.lid..string.format("Unit %s fuel state = %.1f kg = %.1f lbs",unit:GetName(),fuelstate,UTILS.kg2lbs(fuelstate))) +return UTILS.kg2lbs(fuelstate) +end +function AIRBOSS:_GetAngels(alt) +if alt then +local angels=UTILS.Round(UTILS.MetersToFeet(alt)/1000,0) +return angels +else +return 0 +end +end +function AIRBOSS:_GetUnitMasses(unit) +local Desc=unit:GetDesc() +local massfuel=Desc.fuelMassMax or 0 +local massempty=Desc.massEmpty or 0 +local massmax=Desc.massMax or 0 +local masscargo=massmax-massfuel-massempty +self:T2(self.lid..string.format("Unit %s mass fuel=%.1f kg, empty=%.1f kg, max=%.1f kg, cargo=%.1f kg",unit:GetName(),massfuel,massempty,massmax,masscargo)) +return massfuel,massempty,massmax,masscargo +end +function AIRBOSS:_GetPlayerDataUnit(unit) +if unit:IsAlive()then +local unitname=unit:GetName() +local playerunit,playername=self:_GetPlayerUnitAndName(unitname) +if playerunit and playername then +return self.players[playername] +end +end +return nil +end +function AIRBOSS:_GetPlayerDataGroup(group) +local units=group:GetUnits() +for _,unit in pairs(units)do +local playerdata=self:_GetPlayerDataUnit(unit) +if playerdata then +return playerdata +end +end +return nil +end +function AIRBOSS:_GetPlayerUnit(_unitName) +for _,_player in pairs(self.players)do +local player=_player +if player.unit and player.unit:GetName()==_unitName then +self:T(self.lid..string.format("Found player=%s unit=%s in players table.",tostring(player.name),tostring(_unitName))) +return player.unit,player.name +end +end +return nil,nil +end +function AIRBOSS:_GetPlayerUnitAndName(_unitName) +self:F2(_unitName) +if _unitName~=nil then +local u,pn=self:_GetPlayerUnit(_unitName) +if u and pn then +return u,pn +end +local DCSunit=Unit.getByName(_unitName) +if DCSunit and DCSunit.getPlayerName then +local playername=DCSunit:getPlayerName() +local unit=UNIT:Find(DCSunit) +self:T2({DCSunit=DCSunit,unit=unit,playername=playername}) +if DCSunit and unit and playername then +self:T(self.lid..string.format("Found DCS unit %s with player %s.",tostring(_unitName),tostring(playername))) +return unit,playername +end +end +end +return nil,nil +end +function AIRBOSS:GetCoalition() +return self.carrier:GetCoalition() +end +function AIRBOSS:GetCoordinate() +return self.carrier:GetCoord() +end +function AIRBOSS:GetCoord() +return self.carrier:GetCoord() +end +function AIRBOSS:_GetStaticWeather() +local weather=env.mission.weather +local clouds=weather.clouds +local visibility=weather.visibility.distance +local dust=nil +if weather.enable_dust==true then +dust=weather.dust_density +end +local fog=nil +if weather.enable_fog==true then +fog=weather.fog +end +return clouds,visibility,fog,dust +end +function AIRBOSS._CheckRadioQueueT(param,time) +AIRBOSS._CheckRadioQueue(param.airboss,param.radioqueue,param.name) +return time+0.05 +end +function AIRBOSS:_CheckRadioQueue(radioqueue,name) +if#radioqueue==0 then +if name=="LSO"then +self:T(self.lid..string.format("Stopping LSO radio queue.")) +self.radiotimer:Stop(self.RQLid) +self.RQLid=nil +elseif name=="MARSHAL"then +self:T(self.lid..string.format("Stopping Marshal radio queue.")) +self.radiotimer:Stop(self.RQMid) +self.RQMid=nil +end +return +end +local _time=timer.getAbsTime() +local playing=false +local next=nil +local _remove=nil +for i,_transmission in ipairs(radioqueue)do +local transmission=_transmission +if _time>=transmission.Tplay then +if transmission.isplaying then +if _time>=transmission.Tstarted+transmission.call.duration then +transmission.isplaying=false +_remove=i +if transmission.radio.alias=="LSO"then +self.TQLSO=_time +elseif transmission.radio.alias=="MARSHAL"then +self.TQMarshal=_time +end +else +playing=true +end +else +local Tlast=nil +if transmission.interval then +if transmission.radio.alias=="LSO"then +Tlast=self.TQLSO +elseif transmission.radio.alias=="MARSHAL"then +Tlast=self.TQMarshal +end +end +if transmission.interval==nil then +if next==nil then +next=transmission +end +else +if _time-Tlast>=transmission.interval then +next=transmission +else +end +end +if next or Tlast then +break +end +end +else +end +end +if next~=nil and not playing then +self:Broadcast(next.radio,next.call,next.loud) +next.isplaying=true +next.Tstarted=_time +end +if _remove then +table.remove(radioqueue,_remove) +end +return +end +function AIRBOSS:RadioTransmission(radio,call,loud,delay,interval,click,pilotcall) +self:F2({radio=radio,call=call,loud=loud,delay=delay,interval=interval,click=click}) +if radio==nil or call==nil then +return +end +if not self.SRS then +local transmission={} +transmission.radio=radio +transmission.call=call +transmission.Tplay=timer.getAbsTime()+(delay or 0) +transmission.interval=interval +transmission.isplaying=false +transmission.Tstarted=nil +transmission.loud=loud and call.loud +if self:_IsOnboard(call.modexsender)then +self:_Number2Radio(radio,call.modexsender,delay,0.3,pilotcall) +end +if self:_IsOnboard(call.modexreceiver)then +self:_Number2Radio(radio,call.modexreceiver,delay,0.3,pilotcall) +end +local caller="" +if radio.alias=="LSO"then +table.insert(self.RQLSO,transmission) +caller="LSOCall" +if not self.RQLid then +self:T(self.lid..string.format("Starting LSO radio queue.")) +self.RQLid=self.radiotimer:Schedule(nil,AIRBOSS._CheckRadioQueue,{self,self.RQLSO,"LSO"},0.02,0.05) +end +elseif radio.alias=="MARSHAL"then +table.insert(self.RQMarshal,transmission) +caller="MarshalCall" +if not self.RQMid then +self:T(self.lid..string.format("Starting Marhal radio queue.")) +self.RQMid=self.radiotimer:Schedule(nil,AIRBOSS._CheckRadioQueue,{self,self.RQMarshal,"MARSHAL"},0.02,0.05) +end +end +if click then +self:RadioTransmission(radio,self[caller].CLICK,false,delay) +end +else +if call.subtitle~=nil and string.len(call.subtitle)>1 then +local frequency=self.MarshalRadio.frequency +local modulation=self.MarshalRadio.modulation +local voice=nil +local gender=nil +local culture=nil +if radio.alias=="AIRBOSS"then +frequency=self.AirbossRadio.frequency +modulation=self.AirbossRadio.modulation +voice=self.AirbossRadio.voice +gender=self.AirbossRadio.gender +culture=self.AirbossRadio.culture +end +if radio.alias=="MARSHAL"then +voice=self.MarshalRadio.voice +gender=self.MarshalRadio.gender +culture=self.MarshalRadio.culture +end +if radio.alias=="LSO"then +frequency=self.LSORadio.frequency +modulation=self.LSORadio.modulation +voice=self.LSORadio.voice +gender=self.LSORadio.gender +culture=self.LSORadio.culture +end +if pilotcall then +voice=self.PilotRadio.voice +gender=self.PilotRadio.gender +culture=self.PilotRadio.culture +radio.alias="PILOT" +end +if not radio.alias then +frequency=self.AirbossRadio.frequency +modulation=self.AirbossRadio.modulation +radio.alias="AIRBOSS" +end +local volume=nil +if loud then +volume=1.0 +end +local text=call.subtitle +self:T(self.lid..text) +local srstext=self:_GetNiceSRSText(text) +self.SRSQ:NewTransmission(srstext,call.duration,self.SRS,nil,0.1,nil,call.subtitle,call.subduration,frequency,modulation,gender,culture,voice,volume,radio.alias) +end +end +end +function AIRBOSS:SetSRSPilotVoice(Voice,Gender,Culture) +self.PilotRadio={} +self.PilotRadio.alias="PILOT" +self.PilotRadio.voice=Voice or MSRS.Voices.Microsoft.David +self.PilotRadio.gender=Gender or"male" +self.PilotRadio.culture=Culture or"en-US" +if(not Voice)and self.SRS and self.SRS:GetProvider()==MSRS.Provider.GOOGLE then +self.PilotRadio.voice=MSRS.Voices.Google.Standard.en_US_Standard_J +end +return self +end +function AIRBOSS:_NeedsSubtitle(call) +if call.file==self.MarshalCall.NOISE.file or call.file==self.LSOCall.NOISE.file then +return true +else +return false +end +end +function AIRBOSS:Broadcast(radio,call,loud) +self:F(call) +if not self.usersoundradio then +local sender=self:_GetRadioSender(radio) +local filename=self:_RadioFilename(call,loud,radio.alias) +local subtitle=self:_RadioSubtitle(radio,call,loud) +self:T({filename=filename,subtitle=subtitle}) +if sender then +self:T(self.lid..string.format("Broadcasting from aircraft %s",sender:GetName())) +local commandFrequency={ +id="SetFrequency", +params={ +frequency=radio.frequency*1000000, +modulation=radio.modulation, +}, +} +local commandTransmit={ +id="TransmitMessage", +params={ +file=filename, +duration=call.subduration or 5, +subtitle=subtitle, +loop=false, +}, +} +sender:SetCommand(commandFrequency) +sender:SetCommand(commandTransmit) +else +self:T(self.lid..string.format("Broadcasting from carrier via trigger.action.radioTransmission().")) +local vec3=self.carrier:GetPositionVec3() +trigger.action.radioTransmission(filename,vec3,radio.modulation,false,radio.frequency*1000000,100) +for _,_player in pairs(self.players)do +local playerData=_player +if playerData.unit:IsInZone(self.zoneCCA)and playerData.actype~=AIRBOSS.AircraftCarrier.A4EC then +if playerData.subtitles or self:_NeedsSubtitle(call)then +if radio.alias=="MARSHAL"or(radio.alias=="LSO"and self:_InQueue(self.Qpattern,playerData.group))then +self:MessageToPlayer(playerData,subtitle,nil,"",call.subduration or 5) +end +end +end +end +end +end +for _,_player in pairs(self.players)do +local playerData=_player +if self.usersoundradio or playerData.actype==AIRBOSS.AircraftCarrier.A4EC then +if radio.alias=="MARSHAL"or(radio.alias=="LSO"and self:_InQueue(self.Qpattern,playerData.group))then +self:Sound2Player(playerData,radio,call,loud) +end +end +end +end +function AIRBOSS:Sound2Player(playerData,radio,call,loud,delay) +if playerData.unit:IsInZone(self.zoneCCA)and call then +local filename=self:_RadioFilename(call,loud,radio.alias) +local subtitle=self:_RadioSubtitle(radio,call,loud) +USERSOUND:New(filename):ToGroup(playerData.group,delay) +if playerData.subtitles or self:_NeedsSubtitle(call)then +self:MessageToPlayer(playerData,subtitle,nil,"",call.subduration,false,delay) +end +end +end +function AIRBOSS:_RadioSubtitle(radio,call,loud) +if call==nil or call.subtitle==nil or call.subtitle==""then +return"" +end +local sender=call.sender or radio.alias +if call.modexsender then +sender=call.modexsender +end +local receiver=call.modexreceiver or"" +local subtitle=string.format("%s: %s",sender,call.subtitle) +if receiver and receiver~=""then +subtitle=string.format("%s: %s, %s",sender,receiver,call.subtitle) +end +local lastchar=string.sub(subtitle,-1) +if loud then +if lastchar=="."or lastchar=="!"then +subtitle=string.sub(subtitle,1,-1) +end +subtitle=subtitle.."!" +else +if lastchar=="!"then +elseif lastchar=="."then +else +subtitle=subtitle.."." +end +end +return subtitle +end +function AIRBOSS:_RadioFilename(call,loud,channel) +local prefix=call.file or"" +local suffix=call.suffix or"ogg" +local path=self.soundfolder or"l10n/DEFAULT/" +if string.find(call.file,"LSO-")and channel and(channel=="LSO"or channel=="LSOCall")then +path=self.soundfolderLSO or path +end +if string.find(call.file,"MARSHAL-")and channel and(channel=="MARSHAL"or channel=="MarshalCall")then +path=self.soundfolderMSH or path +end +if loud then +prefix=prefix.."_Loud" +end +local filename=string.format("%s%s.%s",path,prefix,suffix) +return filename +end +function AIRBOSS:_GetNiceSRSText(text) +text=string.gsub(text,"================================\n","") +text=string.gsub(text,"||","parallel") +text=string.gsub(text,"==","perpendicular") +text=string.gsub(text,"BRC","Base recovery") +text=string.gsub(text,"%((%a+)%)","Morse %1") +text=string.gsub(text,"°C","° Celsius") +text=string.gsub(text,"°"," degrees") +text=string.gsub(text," FB "," Final bearing ") +text=string.gsub(text," ops"," operations ") +text=string.gsub(text," kts"," knots") +text=string.gsub(text,"TACAN","Tackan") +text=string.gsub(text,"ICLS","I.C.L.S.") +text=string.gsub(text,"LSO","L.S.O.") +text=string.gsub(text,"inHg","inches of Mercury") +text=string.gsub(text,"QFE","Q.F.E.") +text=string.gsub(text,"hPa","hecto pascal") +text=string.gsub(text," NM"," nautical miles") +text=string.gsub(text," ft"," feet") +text=string.gsub(text,"A/C","aircraft") +text=string.gsub(text,"(#[%a%d%p%s]+)\n","") +text=string.gsub(text,"%.000"," dot zero") +text=string.gsub(text,"00"," double zero") +text=string.gsub(text," 0 "," zero ") +text=string.gsub(text,"\n","; ") +return text +end +function AIRBOSS:MessageToPlayer(playerData,message,sender,receiver,duration,clear,delay) +self:T({sender,receiver,message}) +if playerData and message and message~=""then +duration=duration or self.Tmessage +local text +if receiver and receiver==""then +text=string.format("%s",message) +else +receiver=receiver or playerData.onboard +text=string.format("%s, %s",receiver,message) +end +self:T(self.lid..text) +if delay and delay>0 then +self:ScheduleOnce(delay,self.MessageToPlayer,self,playerData,message,sender,receiver,duration,clear) +else +if not self.SRS then +local wait=0 +if receiver==playerData.onboard then +if sender and(sender=="LSO"or sender=="MARSHAL"or sender=="AIRBOSS")then +wait=wait+self:_Number2Sound(playerData,sender,receiver) +end +end +if string.find(text:lower(),"negative")then +local filename=self:_RadioFilename(self.MarshalCall.NEGATIVE,false,"MARSHAL") +USERSOUND:New(filename):ToGroup(playerData.group,wait) +wait=wait+self.MarshalCall.NEGATIVE.duration +end +if string.find(text:lower(),"affirm")then +local filename=self:_RadioFilename(self.MarshalCall.AFFIRMATIVE,false,"MARSHAL") +USERSOUND:New(filename):ToGroup(playerData.group,wait) +wait=wait+self.MarshalCall.AFFIRMATIVE.duration +end +if string.find(text:lower(),"roger")then +local filename=self:_RadioFilename(self.MarshalCall.ROGER,false,"MARSHAL") +USERSOUND:New(filename):ToGroup(playerData.group,wait) +wait=wait+self.MarshalCall.ROGER.duration +end +if wait>0 then +local filename=self:_RadioFilename(self.MarshalCall.CLICK) +USERSOUND:New(filename):ToGroup(playerData.group,wait) +end +else +local frequency=self.MarshalRadio.frequency +local modulation=self.MarshalRadio.modulation +local voice=self.MarshalRadio.voice +local gender=self.MarshalRadio.gender +local culture=self.MarshalRadio.culture +if not sender then sender="AIRBOSS"end +if string.find(sender,"AIRBOSS")then +frequency=self.AirbossRadio.frequency +modulation=self.AirbossRadio.modulation +voice=self.AirbossRadio.voice +gender=self.AirbossRadio.gender +culture=self.AirbossRadio.culture +end +if sender=="LSO"then +frequency=self.LSORadio.frequency +modulation=self.LSORadio.modulation +voice=self.LSORadio.voice +gender=self.LSORadio.gender +culture=self.LSORadio.culture +end +self:T(self.lid..text) +self:T({sender,frequency,modulation,voice}) +local srstext=self:_GetNiceSRSText(text) +self.SRSQ:NewTransmission(srstext,duration,self.SRS,nil,0.1,nil,nil,nil,frequency,modulation,gender,culture,voice,nil,sender) +end +if playerData.client then +MESSAGE:New(text,duration,sender,clear):ToClient(playerData.client) +end +end +end +end +function AIRBOSS:MessageToPattern(message,sender,receiver,duration,clear,delay) +local call=self:_NewRadioCall(self.LSOCall.NOISE,sender or"LSO",message,duration,receiver,sender) +self:RadioTransmission(self.LSORadio,call,false,delay,nil,true) +end +function AIRBOSS:MessageToMarshal(message,sender,receiver,duration,clear,delay) +local call=self:_NewRadioCall(self.MarshalCall.NOISE,sender or"MARSHAL",message,duration,receiver,sender) +self:RadioTransmission(self.MarshalRadio,call,false,delay,nil,true) +end +function AIRBOSS:_NewRadioCall(call,sender,subtitle,subduration,modexreceiver,modexsender) +local newcall=UTILS.DeepCopy(call) +newcall.sender=sender +newcall.subtitle=subtitle or call.subtitle +newcall.subduration=subduration or self.Tmessage +if self:_IsOnboard(modexreceiver)then +newcall.modexreceiver=modexreceiver +end +if self:_IsOnboard(modexsender)then +newcall.modexsender=modexsender +end +return newcall +end +function AIRBOSS:_GetRadioSender(radio) +local sender=nil +if self.senderac then +sender=UNIT:FindByName(self.senderac) +end +if radio.alias=="MARSHAL"then +if self.radiorelayMSH then +sender=UNIT:FindByName(self.radiorelayMSH) +end +end +if radio.alias=="LSO"then +if self.radiorelayLSO then +sender=UNIT:FindByName(self.radiorelayLSO) +end +end +if sender and sender:IsAlive()and sender:IsAir()then +return sender +end +return nil +end +function AIRBOSS:_IsOnboard(text) +if text==nil then +return false +end +if text=="99"then +return true +end +for _,_flight in pairs(self.flights)do +local flight=_flight +for _,onboard in pairs(flight.onboardnumbers)do +if text==onboard then +return true +end +end +end +return false +end +function AIRBOSS:_Number2Sound(playerData,sender,number,delay) +delay=delay or 0 +local function _split(str) +local chars={} +for i=1,#str do +local c=str:sub(i,i) +table.insert(chars,c) +end +return chars +end +local Sender +if sender=="LSO"then +Sender="LSOCall" +elseif sender=="MARSHAL"or sender=="AIRBOSS"then +Sender="MarshalCall" +else +self:E(self.lid..string.format("ERROR: Unknown radio sender %s!",tostring(sender))) +return +end +local numbers=_split(tostring(number)) +local wait=0 +for i=1,#numbers do +local n=numbers[i] +local N=string.format("N%s",n) +local call=self[Sender][N] +local filename=self:_RadioFilename(call,false,Sender) +USERSOUND:New(filename):ToGroup(playerData.group,delay+wait) +wait=wait+call.duration +end +return wait +end +function AIRBOSS:_Number2Radio(radio,number,delay,interval,pilotcall) +local function _split(str) +local chars={} +for i=1,#str do +local c=str:sub(i,i) +table.insert(chars,c) +end +return chars +end +local Sender="" +if radio.alias=="LSO"then +Sender="LSOCall" +elseif radio.alias=="MARSHAL"then +Sender="MarshalCall" +else +self:E(self.lid..string.format("ERROR: Unknown radio alias %s!",tostring(radio.alias))) +end +if pilotcall then +Sender="PilotCall" +end +if Sender==""then +self:E(self.lid..string.format("ERROR: Sender unknown!")) +return +end +local numbers=_split(tostring(number)) +local wait=0 +for i=1,#numbers do +local n=numbers[i] +local N=string.format("N%s",n) +local call=self[Sender][N] +if interval and i==1 then +self:RadioTransmission(radio,call,false,delay,interval) +else +self:RadioTransmission(radio,call,false,delay) +end +wait=wait+call.duration +end +return wait +end +function AIRBOSS:_MarshallInboundCall(unit,modex) +local vectorCarrier=self:GetCoordinate():GetDirectionVec3(unit:GetCoordinate()) +local bearing=UTILS.Round(unit:GetCoordinate():GetAngleDegrees(vectorCarrier),0) +local distance=UTILS.Round(UTILS.MetersToNM(unit:GetCoordinate():Get2DDistance(self:GetCoordinate())),0) +local angels=UTILS.Round(UTILS.MetersToFeet(unit:GetHeight()/1000),0) +local state=UTILS.Round(self:_GetFuelState(unit)/1000,1) +local text=string.format("Marshal, %s, marking mom's %d for %d, angels %d, state %.1f",modex,bearing,distance,angels,state) +self:T(self.lid..text) +local FS=UTILS.Split(string.format("%.1f",state),".") +local inboundcall=self:_NewRadioCall(self.MarshalCall.CLICK,unit.UnitName:upper(),text,self.Tmessage,nil,unit.UnitName:upper()) +self:RadioTransmission(self.MarshalRadio,inboundcall) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.MARSHAL,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,modex,nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.MARKINGMOMS,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,tostring(bearing),nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.FOR,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,tostring(distance),nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.ANGELS,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,tostring(angels),nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.STATE,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,FS[1],nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.POINT,nil,nil,nil,nil,true) +self:_Number2Radio(self.MarshalRadio,FS[2],nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.MarshalRadio.CLICK,nil,nil,nil,nil,true) +end +function AIRBOSS:_CommencingCall(unit,modex) +local text=string.format("%s, commencing",modex) +self:T(self.lid..text) +local commencingCall=self:_NewRadioCall(self.MarshalCall.CLICK,unit.UnitName:upper(),text,self.Tmessage,nil,unit.UnitName:upper()) +self:RadioTransmission(self.MarshalRadio,commencingCall) +self:_Number2Radio(self.MarshalRadio,modex,nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.COMMENCING,nil,nil,nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.MarshalRadio.CLICK,nil,nil,nil,nil,true) +end +function AIRBOSS:_LSOCallAircraftBall(modex,nickname,fuelstate) +local text=string.format("%s Ball, %.1f.",nickname,fuelstate) +self:T(self.lid..text) +local NICKNAME=nickname:upper() +local FS=UTILS.Split(string.format("%.1f",fuelstate),".") +local call=self:_NewRadioCall(self.PilotCall[NICKNAME],modex,text,self.Tmessage,nil,modex) +self:RadioTransmission(self.LSORadio,call,nil,nil,nil,nil,true) +self:RadioTransmission(self.LSORadio,self.PilotCall.BALL,nil,nil,nil,nil,true) +self:_Number2Radio(self.LSORadio,FS[1],nil,nil,true) +self:RadioTransmission(self.LSORadio,self.PilotCall.POINT,nil,nil,nil,nil,true) +self:_Number2Radio(self.LSORadio,FS[2],nil,nil,true) +self:RadioTransmission(self.LSORadio,self.LSOCall.CLICK) +end +function AIRBOSS:_MarshalCallGasAtTanker(modex) +local text=string.format("Bingo fuel! Going for gas at the recovery tanker.") +self:T(self.lid..text) +local call=self:_NewRadioCall(self.PilotCall.BINGOFUEL,modex,text,self.Tmessage,nil,modex) +self:RadioTransmission(self.MarshalRadio,call,nil,nil,nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.GASATTANKER,nil,nil,nil,true,true) +end +function AIRBOSS:_MarshalCallGasAtDivert(modex,divertname) +local text=string.format("Bingo fuel! Going for gas at divert field %s.",divertname) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.PilotCall.BINGOFUEL,modex,text,self.Tmessage,nil,modex) +self:RadioTransmission(self.MarshalRadio,call,nil,nil,nil,nil,true) +self:RadioTransmission(self.MarshalRadio,self.PilotCall.GASATDIVERT,nil,nil,nil,true,true) +end +function AIRBOSS:_MarshalCallRecoveryStopped(case) +local text=string.format("Case %d recovery ops are stopped. Deck is closed.",case) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.CASE,"AIRBOSS",text,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call) +self:_Number2Radio(self.MarshalRadio,tostring(case)) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.RECOVERYOPSSTOPPED,nil,nil,0.2) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.DECKCLOSED,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallRecoveryPausedUntilFurtherNotice() +local call=self:_NewRadioCall(self.MarshalCall.RECOVERYPAUSEDNOTICE,"AIRBOSS",nil,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallRecoveryPausedResumedAt(clock) +local _clock=UTILS.Split(clock,"+") +local CT=UTILS.Split(_clock[1],":") +local text=string.format("aircraft recovery is paused and will be resumed at %s.",clock) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.RECOVERYPAUSEDRESUMED,"AIRBOSS",text,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call) +self:_Number2Radio(self.MarshalRadio,CT[1]) +self:_Number2Radio(self.MarshalRadio,CT[2]) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.HOURS,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallClearedForRecovery(modex,case) +local text=string.format("you're cleared for Case %d recovery.",case) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.CLEAREDFORRECOVERY,"MARSHAL",text,self.Tmessage,modex) +local delay=2 +self:RadioTransmission(self.MarshalRadio,call,nil,delay) +self:_Number2Radio(self.MarshalRadio,tostring(case),delay) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.RECOVERY,nil,delay,nil,true) +end +function AIRBOSS:_MarshalCallResumeRecovery() +local call=self:_NewRadioCall(self.MarshalCall.RESUMERECOVERY,"AIRBOSS",nil,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallNewFinalBearing(FB) +local text=string.format("new final bearing %03d°.",FB) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.NEWFB,"AIRBOSS",text,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call) +self:_Number2Radio(self.MarshalRadio,string.format("%03d",FB),nil,0.2) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.DEGREES,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallCarrierTurnTo(hdg) +local text=string.format("carrier is now starting turn to heading %03d°.",hdg) +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.CARRIERTURNTOHEADING,"AIRBOSS",text,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call) +self:_Number2Radio(self.MarshalRadio,string.format("%03d",hdg),nil,0.2) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.DEGREES,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallStackFull(modex,nwaiting) +local text=string.format("Marshal stack is currently full. Hold outside 10 NM zone and wait for further instructions. ") +if nwaiting==1 then +text=text..string.format("There is one flight ahead of you.") +elseif nwaiting>1 then +text=text..string.format("There are %d flights ahead of you.",nwaiting) +else +text=text..string.format("You are next in line.") +end +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.STACKFULL,"AIRBOSS",text,self.Tmessage,modex) +self:RadioTransmission(self.MarshalRadio,call,nil,nil,nil,true) +end +function AIRBOSS:_MarshalCallRecoveryStart(case) +local radial=self:GetRadial(case,true,true,false) +local text=string.format("Starting aircraft recovery Case %d ops.",case) +if case==1 then +text=text..string.format(" BRC %03d°.",self:GetBRC()) +elseif case==2 then +text=text..string.format(" Marshal radial %03d°. BRC %03d°.",radial,self:GetBRC()) +elseif case==3 then +text=text..string.format(" Marshal radial %03d°. Final heading %03d°.",radial,self:GetFinalBearing(false)) +end +self:T(self.lid..text) +local call=self:_NewRadioCall(self.MarshalCall.STARTINGRECOVERY,"AIRBOSS",text,self.Tmessage,"99") +self:RadioTransmission(self.MarshalRadio,call) +self:_Number2Radio(self.MarshalRadio,tostring(case),nil,0.1) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.OPS) +if case>1 then +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.MARSHALRADIAL) +self:_Number2Radio(self.MarshalRadio,string.format("%03d",radial),nil,0.2) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.DEGREES,nil,nil,nil,true) +end +end +function AIRBOSS:_MarshalCallArrived(modex,case,brc,altitude,charlie,qfe) +self:F({modex=modex,case=case,brc=brc,altitude=altitude,charlie=charlie,qfe=qfe}) +local angels=self:_GetAngels(altitude) +local QFE=UTILS.Split(string.format("%.2f",qfe),".") +local clock=UTILS.Split(charlie,"+") +local CT=UTILS.Split(clock[1],":") +local text=string.format("Case %d, expected BRC %03d°, hold at angels %d. Expected Charlie Time %s. Altimeter %.2f. Report see me.",case,brc,angels,charlie,qfe) +self:T(self.lid..text) +local casecall=self:_NewRadioCall(self.MarshalCall.CASE,"MARSHAL",text,self.Tmessage,modex) +self:RadioTransmission(self.MarshalRadio,casecall) +self:_Number2Radio(self.MarshalRadio,tostring(case)) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.EXPECTED,nil,nil,0.5) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.BRC) +self:_Number2Radio(self.MarshalRadio,string.format("%03d",brc)) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.DEGREES) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.HOLDATANGELS,nil,nil,0.5) +self:_Number2Radio(self.MarshalRadio,tostring(angels)) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.EXPECTED,nil,nil,0.5) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.CHARLIETIME) +self:_Number2Radio(self.MarshalRadio,CT[1]) +self:_Number2Radio(self.MarshalRadio,CT[2]) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.HOURS) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.ALTIMETER,nil,nil,0.5) +self:_Number2Radio(self.MarshalRadio,QFE[1]) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.POINT) +self:_Number2Radio(self.MarshalRadio,QFE[2]) +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.REPORTSEEME,nil,nil,0.5,true) +end +function AIRBOSS:_AddF10Commands(_unitName) +self:F(_unitName) +local _unit,playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and playername then +local group=_unit:GetGroup() +local gid=group:GetID() +if group and gid then +if not self.menuadded[gid]then +self.menuadded[gid]=true +local _rootPath=nil +if AIRBOSS.MenuF10Root then +if self.menusingle then +_rootPath=AIRBOSS.MenuF10Root +else +_rootPath=missionCommands.addSubMenuForGroup(gid,self.alias,AIRBOSS.MenuF10Root) +end +else +if AIRBOSS.MenuF10[gid]==nil then +AIRBOSS.MenuF10[gid]=missionCommands.addSubMenuForGroup(gid,"Airboss") +end +if self.menusingle then +_rootPath=AIRBOSS.MenuF10[gid] +else +_rootPath=missionCommands.addSubMenuForGroup(gid,self.alias,AIRBOSS.MenuF10[gid]) +end +end +local _helpPath=missionCommands.addSubMenuForGroup(gid,"Help",_rootPath) +if self.menumarkzones then +local _markPath=missionCommands.addSubMenuForGroup(gid,"Mark Zones",_helpPath) +if self.menusmokezones then +missionCommands.addCommandForGroup(gid,"Smoke Pattern Zones",_markPath,self._MarkCaseZones,self,_unitName,false) +end +missionCommands.addCommandForGroup(gid,"Flare Pattern Zones",_markPath,self._MarkCaseZones,self,_unitName,true) +if self.menusmokezones then +missionCommands.addCommandForGroup(gid,"Smoke Marshal Zone",_markPath,self._MarkMarshalZone,self,_unitName,false) +end +missionCommands.addCommandForGroup(gid,"Flare Marshal Zone",_markPath,self._MarkMarshalZone,self,_unitName,true) +end +local _skillPath=missionCommands.addSubMenuForGroup(gid,"Skill Level",_helpPath) +missionCommands.addCommandForGroup(gid,"Flight Student",_skillPath,self._SetDifficulty,self,_unitName,AIRBOSS.Difficulty.EASY) +missionCommands.addCommandForGroup(gid,"Naval Aviator",_skillPath,self._SetDifficulty,self,_unitName,AIRBOSS.Difficulty.NORMAL) +missionCommands.addCommandForGroup(gid,"TOPGUN Graduate",_skillPath,self._SetDifficulty,self,_unitName,AIRBOSS.Difficulty.HARD) +missionCommands.addCommandForGroup(gid,"Hints On/Off",_skillPath,self._SetHintsOnOff,self,_unitName) +missionCommands.addCommandForGroup(gid,"My Status",_helpPath,self._DisplayPlayerStatus,self,_unitName) +missionCommands.addCommandForGroup(gid,"Attitude Monitor",_helpPath,self._DisplayAttitude,self,_unitName) +missionCommands.addCommandForGroup(gid,"Radio Check LSO",_helpPath,self._LSORadioCheck,self,_unitName) +missionCommands.addCommandForGroup(gid,"Radio Check Marshal",_helpPath,self._MarshalRadioCheck,self,_unitName) +missionCommands.addCommandForGroup(gid,"Subtitles On/Off",_helpPath,self._SubtitlesOnOff,self,_unitName) +missionCommands.addCommandForGroup(gid,"Trapsheet On/Off",_helpPath,self._TrapsheetOnOff,self,_unitName) +local _kneeboardPath=missionCommands.addSubMenuForGroup(gid,"Kneeboard",_rootPath) +local _resultsPath=missionCommands.addSubMenuForGroup(gid,"Results",_kneeboardPath) +missionCommands.addCommandForGroup(gid,"Greenie Board",_resultsPath,self._DisplayScoreBoard,self,_unitName) +missionCommands.addCommandForGroup(gid,"My LSO Grades",_resultsPath,self._DisplayPlayerGrades,self,_unitName) +missionCommands.addCommandForGroup(gid,"Last Debrief",_resultsPath,self._DisplayDebriefing,self,_unitName) +if self.skipperMenu then +local _skipperPath=missionCommands.addSubMenuForGroup(gid,"Skipper",_kneeboardPath) +local _menusetspeed=missionCommands.addSubMenuForGroup(gid,"Set Speed",_skipperPath) +missionCommands.addCommandForGroup(gid,"10 knots",_menusetspeed,self._SkipperRecoverySpeed,self,_unitName,10) +missionCommands.addCommandForGroup(gid,"15 knots",_menusetspeed,self._SkipperRecoverySpeed,self,_unitName,15) +missionCommands.addCommandForGroup(gid,"20 knots",_menusetspeed,self._SkipperRecoverySpeed,self,_unitName,20) +missionCommands.addCommandForGroup(gid,"25 knots",_menusetspeed,self._SkipperRecoverySpeed,self,_unitName,25) +missionCommands.addCommandForGroup(gid,"30 knots",_menusetspeed,self._SkipperRecoverySpeed,self,_unitName,30) +local _menusetrtime=missionCommands.addSubMenuForGroup(gid,"Set Time",_skipperPath) +missionCommands.addCommandForGroup(gid,"15 min",_menusetrtime,self._SkipperRecoveryTime,self,_unitName,15) +missionCommands.addCommandForGroup(gid,"30 min",_menusetrtime,self._SkipperRecoveryTime,self,_unitName,30) +missionCommands.addCommandForGroup(gid,"45 min",_menusetrtime,self._SkipperRecoveryTime,self,_unitName,45) +missionCommands.addCommandForGroup(gid,"60 min",_menusetrtime,self._SkipperRecoveryTime,self,_unitName,60) +missionCommands.addCommandForGroup(gid,"90 min",_menusetrtime,self._SkipperRecoveryTime,self,_unitName,90) +local _menusetrtime=missionCommands.addSubMenuForGroup(gid,"Set Marshal Radial",_skipperPath) +missionCommands.addCommandForGroup(gid,"+30°",_menusetrtime,self._SkipperRecoveryOffset,self,_unitName,30) +missionCommands.addCommandForGroup(gid,"+15°",_menusetrtime,self._SkipperRecoveryOffset,self,_unitName,15) +missionCommands.addCommandForGroup(gid,"0°",_menusetrtime,self._SkipperRecoveryOffset,self,_unitName,0) +missionCommands.addCommandForGroup(gid,"-15°",_menusetrtime,self._SkipperRecoveryOffset,self,_unitName,-15) +missionCommands.addCommandForGroup(gid,"-30°",_menusetrtime,self._SkipperRecoveryOffset,self,_unitName,-30) +missionCommands.addCommandForGroup(gid,"U-turn On/Off",_skipperPath,self._SkipperRecoveryUturn,self,_unitName) +missionCommands.addCommandForGroup(gid,"Start CASE I",_skipperPath,self._SkipperStartRecovery,self,_unitName,1) +missionCommands.addCommandForGroup(gid,"Start CASE II",_skipperPath,self._SkipperStartRecovery,self,_unitName,2) +missionCommands.addCommandForGroup(gid,"Start CASE III",_skipperPath,self._SkipperStartRecovery,self,_unitName,3) +missionCommands.addCommandForGroup(gid,"Stop Recovery",_skipperPath,self._SkipperStopRecovery,self,_unitName) +end +missionCommands.addCommandForGroup(gid,"Carrier Info",_kneeboardPath,self._DisplayCarrierInfo,self,_unitName) +missionCommands.addCommandForGroup(gid,"Weather Report",_kneeboardPath,self._DisplayCarrierWeather,self,_unitName) +missionCommands.addCommandForGroup(gid,"Set Section",_kneeboardPath,self._SetSection,self,_unitName) +missionCommands.addCommandForGroup(gid,"Marshal Queue",_kneeboardPath,self._DisplayQueue,self,_unitName,"Marshal") +missionCommands.addCommandForGroup(gid,"Pattern Queue",_kneeboardPath,self._DisplayQueue,self,_unitName,"Pattern") +missionCommands.addCommandForGroup(gid,"Waiting Queue",_kneeboardPath,self._DisplayQueue,self,_unitName,"Waiting") +missionCommands.addCommandForGroup(gid,"Request Marshal",_rootPath,self._RequestMarshal,self,_unitName) +missionCommands.addCommandForGroup(gid,"Request Commence",_rootPath,self._RequestCommence,self,_unitName) +missionCommands.addCommandForGroup(gid,"Request Refueling",_rootPath,self._RequestRefueling,self,_unitName) +missionCommands.addCommandForGroup(gid,"Spinning",_rootPath,self._RequestSpinning,self,_unitName) +missionCommands.addCommandForGroup(gid,"Emergency Landing",_rootPath,self._RequestEmergency,self,_unitName) +missionCommands.addCommandForGroup(gid,"[Reset My Status]",_rootPath,self._ResetPlayerStatus,self,_unitName) +end +else +self:E(self.lid..string.format("ERROR: Could not find group or group ID in AddF10Menu() function. Unit name: %s.",_unitName)) +end +else +self:E(self.lid..string.format("ERROR: Player unit does not exist in AddF10Menu() function. Unit name: %s.",_unitName)) +end +end +function AIRBOSS:_SkipperStartRecovery(_unitName,case) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("affirm, Case %d recovery will start in 5 min for %d min. Wind on deck %d knots. U-turn=%s.",case,self.skipperTime,self.skipperSpeed,tostring(self.skipperUturn)) +if case>1 then +text=text..string.format(" Marshal radial %d°.",self.skipperOffset) +end +if self:IsRecovering()then +text="negative, carrier is already recovering." +self:MessageToPlayer(playerData,text,"AIRBOSS") +return +end +self:MessageToPlayer(playerData,text,"AIRBOSS") +local t0=timer.getAbsTime()+5*60 +local t9=t0+self.skipperTime*60 +local C0=UTILS.SecondsToClock(t0) +local C9=UTILS.SecondsToClock(t9) +self:AddRecoveryWindow(C0,C9,case,self.skipperOffset,true,self.skipperSpeed,self.skipperUturn) +end +end +end +function AIRBOSS:_SkipperStopRecovery(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text="roger, stopping recovery right away." +if not self:IsRecovering()then +text="negative, carrier is currently not recovering." +self:MessageToPlayer(playerData,text,"AIRBOSS") +return +end +self:MessageToPlayer(playerData,text,"AIRBOSS") +self:RecoveryStop() +end +end +end +function AIRBOSS:_SkipperRecoveryOffset(_unitName,offset) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("roger, relative CASE II/III Marshal radial set to %d°.",offset) +self:MessageToPlayer(playerData,text,"AIRBOSS") +self.skipperOffset=offset +end +end +end +function AIRBOSS:_SkipperRecoveryTime(_unitName,time) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("roger, manual recovery time set to %d min.",time) +self:MessageToPlayer(playerData,text,"AIRBOSS") +self.skipperTime=time +end +end +end +function AIRBOSS:_SkipperRecoverySpeed(_unitName,speed) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("roger, wind on deck set to %d knots.",speed) +self:MessageToPlayer(playerData,text,"AIRBOSS") +self.skipperSpeed=speed +end +end +end +function AIRBOSS:_SkipperRecoveryUturn(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +self.skipperUturn=not self.skipperUturn +local text=string.format("roger, U-turn is now %s.",tostring(self.skipperUturn)) +self:MessageToPlayer(playerData,text,"AIRBOSS") +end +end +end +function AIRBOSS:_ResetPlayerStatus(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text="roger, status reset executed! You have been removed from all queues." +self:MessageToPlayer(playerData,text,"AIRBOSS") +self:_RemoveFlight(playerData) +if playerData.debriefschedulerID and self.Scheduler then +self.Scheduler:Stop(playerData.debriefschedulerID) +end +self:_InitPlayer(playerData) +end +end +end +function AIRBOSS:_RequestMarshal(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +if self.xtVoiceOvers then +self:_MarshallInboundCall(_unit,playerData.onboard) +end +local inCCA=playerData.unit:IsInZone(self.zoneCCA) +if inCCA then +if self:_InQueue(self.Qmarshal,playerData.group)then +local text=string.format("negative, you are already in the Marshal queue. New marshal request denied!") +self:MessageToPlayer(playerData,text,"MARSHAL") +elseif self:_InQueue(self.Qpattern,playerData.group)then +local text=string.format("negative, you are already in the Pattern queue. Marshal request denied!") +self:MessageToPlayer(playerData,text,"MARSHAL") +elseif self:_InQueue(self.Qwaiting,playerData.group)then +local text=string.format("negative, you are in the Waiting queue with %d flights ahead of you. Marshal request denied!",#self.Qwaiting) +self:MessageToPlayer(playerData,text,"MARSHAL") +elseif not _unit:InAir()then +local text=string.format("negative, you are not airborne. Marshal request denied!") +self:MessageToPlayer(playerData,text,"MARSHAL") +elseif playerData.name~=playerData.seclead then +local text=string.format("negative, your section lead %s needs to request Marshal.",playerData.seclead) +self:MessageToPlayer(playerData,text,"MARSHAL") +else +local freestack=self:_GetFreeStack(playerData.ai) +if freestack then +self:_MarshalPlayer(playerData,freestack) +else +self:_WaitPlayer(playerData) +end +end +else +local text=string.format("negative, you are not inside CCA. Marshal request denied!") +self:MessageToPlayer(playerData,text,"MARSHAL") +end +end +end +end +function AIRBOSS:_RequestEmergency(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text="" +if not self.emergency then +text="negative, no emergency landings on my carrier. We are currently busy. See how you get along!" +elseif not _unit:InAir()then +local zone=self:_GetZoneCarrierBox() +if playerData.unit:IsInZone(zone)then +text="roger, you are now technically in the bolter pattern. Your next step after takeoff is abeam!" +local lead=self:_GetFlightLead(playerData) +self:_SetPlayerStep(lead,AIRBOSS.PatternStep.BOLTER) +for _,sec in pairs(lead.section)do +local sectionmember=sec +self:_SetPlayerStep(sectionmember,AIRBOSS.PatternStep.BOLTER) +end +self:_RemoveFlightFromQueue(self.Qwaiting,lead) +if self:_InQueue(self.Qmarshal,lead.group)then +self:_RemoveFlightFromMarshalQueue(lead) +else +if not self:_InQueue(self.Qpattern,lead.group)then +self:_AddFlightToPatternQueue(lead) +end +end +else +text=string.format("negative, you are not airborne. Request denied!") +end +else +text="affirmative, you can bypass the pattern and are cleared for final approach!" +playerData.wrappedUpAtWakeLittle=false +playerData.wrappedUpAtWakeFull=false +playerData.wrappedUpAtWakeUnderline=false +playerData.wrappedUpAtStartLittle=false +playerData.wrappedUpAtStartFull=false +playerData.wrappedUpAtStartUnderline=false +playerData.AAatWakeLittle=false +playerData.AAatWakeFull=false +playerData.AAatWakeUnderline=false +local lead=self:_GetFlightLead(playerData) +self:_SetPlayerStep(lead,AIRBOSS.PatternStep.EMERGENCY) +for _,sec in pairs(lead.section)do +local sectionmember=sec +self:_SetPlayerStep(sectionmember,AIRBOSS.PatternStep.EMERGENCY) +self:_RemoveFlightFromQueue(self.Qspinning,sectionmember) +end +self:_RemoveFlightFromQueue(self.Qwaiting,lead) +if self:_InQueue(self.Qmarshal,lead.group)then +self:_RemoveFlightFromMarshalQueue(lead) +else +if not self:_InQueue(self.Qpattern,lead.group)then +self:_AddFlightToPatternQueue(lead) +end +end +end +self:MessageToPlayer(playerData,text,"AIRBOSS") +end +end +end +function AIRBOSS:_RequestSpinning(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text="" +if not self:_InQueue(self.Qpattern,playerData.group)then +text="negative, you have to be in the pattern to spin it!" +elseif playerData.step==AIRBOSS.PatternStep.SPINNING then +text="negative, you are already spinning." +elseif not(playerData.step==AIRBOSS.PatternStep.BREAKENTRY or +playerData.step==AIRBOSS.PatternStep.EARLYBREAK or +playerData.step==AIRBOSS.PatternStep.LATEBREAK)then +text="negative, you have to be in the right step to spin it!" +else +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.SPINNING) +table.insert(self.Qspinning,playerData) +local call=self:_NewRadioCall(self.LSOCall.SPINIT,"AIRBOSS","Spin it!",self.Tmessage,playerData.onboard) +self:RadioTransmission(self.LSORadio,call,nil,nil,nil,true) +if playerData.difficulty==AIRBOSS.Difficulty.EASY then +local text="Climb to 1200 feet and proceed to the initial again." +self:MessageToPlayer(playerData,text,"AIRBOSS","") +end +return +end +self:MessageToPlayer(playerData,text,"AIRBOSS") +end +end +end +function AIRBOSS:_RequestCommence(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +if self.xtVoiceOvers then +self:_CommencingCall(_unit,playerData.onboard) +end +local text="" +local cleared=false +if _unit:IsInZone(self.zoneCCA)then +local stack=playerData.flag +local _,npattern=self:_GetQueueInfo(self.Qpattern) +if self:_InQueue(self.Qpattern,playerData.group)then +text=string.format("negative, %s, you are already in the Pattern queue.",playerData.name) +elseif not _unit:InAir()then +text=string.format("negative, %s, you are not airborne.",playerData.name) +elseif playerData.seclead~=playerData.name then +text=string.format("negative, %s, your section leader %s has to request commence!",playerData.name,playerData.seclead) +elseif stack>1 then +text=string.format("negative, %s, it's not your turn yet! You are in stack no. %s.",playerData.name,stack) +elseif npattern>=self.Nmaxpattern then +text=string.format("negative ghostrider, pattern is full!\nThere are %d aircraft currently in the pattern.",npattern) +elseif self:IsRecovering()==false and not self.airbossnice then +if self.recoverywindow then +local clock=UTILS.SecondsToClock(self.recoverywindow.START) +text=string.format("negative, carrier is currently not recovery. Next window will open at %s.",clock) +else +text=string.format("negative, carrier is not recovering. No future windows planned.") +end +elseif not self:_InQueue(self.Qmarshal,playerData.group)and not self.airbossnice then +text="negative, you have to request Marshal before you can commence." +else +text=text.."roger." +if not self:IsRecovering()then +text=text.." Carrier is not recovering currently! However, you are cleared anyway as I have a nice day." +end +if not self:_InQueue(self.Qmarshal,playerData.group)then +playerData.case=self.case +if self.TACANon and playerData.difficulty~=AIRBOSS.Difficulty.HARD then +local radial=self:GetRadial(playerData.case,true,true,true) +if playerData.case==1 then +radial=self:GetBRC() +end +text=text..string.format("\nSelect TACAN %03d°, Channel %d%s (%s).\n",radial,self.TACANchannel,self.TACANmode,self.TACANmorse) +end +for _,flight in pairs(playerData.section)do +flight.case=playerData.case +end +self:_AddFlightToPatternQueue(playerData) +end +cleared=true +end +else +text=string.format("negative, %s, you are not inside the CCA!",playerData.name) +end +self:T(self.lid..text) +self:MessageToPlayer(playerData,text,"MARSHAL") +if cleared then +self:_Commencing(playerData,false) +end +end +end +end +function AIRBOSS:_RequestRefueling(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text +if self.tanker then +if _unit:IsInZone(self.zoneCCA)then +if self.tanker:IsRunning()or self.tanker:IsRefueling()then +local angels=self:_GetAngels(self.tanker.altitude) +text=string.format("affirmative, proceed to tanker at angels %d.",angels) +if self.tanker.TACANon then +text=text..string.format("\nTanker TACAN channel %d%s (%s).",self.tanker.TACANchannel,self.tanker.TACANmode,self.tanker.TACANmorse) +text=text..string.format("\nRadio frequency %.3f MHz AM.",self.tanker.RadioFreq) +end +if self.tanker:IsRefueling()then +text=text.."\nTanker is currently refueling. You might have to queue up." +end +self:_RemoveFlightFromMarshalQueue(playerData,true) +self:_SetPlayerStep(playerData,AIRBOSS.PatternStep.REFUELING) +for _,sec in pairs(playerData.section)do +local sectext="follow your section leader to the tanker." +self:MessageToPlayer(sec,sectext,"MARSHAL") +self:_SetPlayerStep(sec,AIRBOSS.PatternStep.REFUELING) +end +elseif self.tanker:IsReturning()then +text="negative, tanker is RTB. Request denied!\nWait for the tanker to be back on station if you can." +end +else +text="negative, you are not inside the CCA yet." +end +else +text="negative, no refueling tanker available." +end +self:MessageToPlayer(playerData,text,"MARSHAL") +end +end +end +function AIRBOSS:_RemoveSectionMember(playerData,sectionmember) +for i,_flight in pairs(playerData.section)do +local flight=_flight +if flight.name==sectionmember.name then +table.remove(playerData.section,i) +return true +end +end +return false +end +function AIRBOSS:_SetSection(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local mycoord=_unit:GetCoordinate() +local dmax=self.maxsectiondistance +local text +if self.NmaxSection==0 then +text=string.format("negative, setting sections is disabled in this mission. You stay alone.") +elseif self:_InQueue(self.Qmarshal,playerData.group)then +text=string.format("negative, you are already in the Marshal queue. Setting section not possible any more!") +elseif self:_InQueue(self.Qpattern,playerData.group)then +text=string.format("negative, you are already in the Pattern queue. Setting section not possible any more!") +else +if playerData.seclead~=playerData.name then +local lead=self.players[playerData.seclead] +if lead then +local removed=self:_RemoveSectionMember(lead,playerData) +if removed then +self:MessageToPlayer(lead,string.format("Flight %s has been removed from your section.",playerData.name),"AIRBOSS","",5) +self:MessageToPlayer(playerData,string.format("You have been removed from %s's section.",lead.name),"AIRBOSS","",5) +end +end +end +local section={} +for _,_flight in pairs(self.flights)do +local flight=_flight +if flight.ai==false and flight.groupname~=playerData.groupname and#flight.section==0 and flight.seclead==flight.name then +local distance=flight.group:GetCoordinate():Get3DDistance(mycoord) +if distance<dmax then +self:T(self.lid..string.format("Found potential section member %s for lead %s at distance %.1f m.",flight.name,playerData.name,distance)) +table.insert(section,{flight=flight,distance=distance}) +end +end +end +table.sort(section,function(a,b) +return a.distance<b.distance +end) +playerData.seclead=playerData.name +for _,_flight in pairs(playerData.section)do +local flight=_flight +local gotit=false +for _,_new in pairs(section)do +local newflight=_new.flight +if newflight.name==flight.name then +gotit=true +end +end +if not gotit then +self:MessageToPlayer(flight,string.format("you were removed from %s's section and are on your own now.",playerData.name),"AIRBOSS","",5) +flight.seclead=flight.name +self:_RemoveSectionMember(playerData,flight) +end +end +for i,_new in pairs(section)do +local newflight=_new.flight +for _,_flight in pairs(playerData.section)do +local currentflight=_flight +if newflight.name==currentflight.name then +table.remove(section,i) +end +end +end +text=string.format("Registered flight section:") +text=text..string.format("\n- %s (lead)",playerData.seclead) +for _,_flight in pairs(playerData.section)do +local flight=_flight +text=text..string.format("\n- %s",flight.name) +end +for i=1,math.min(self.NmaxSection-#playerData.section,#section)do +local flight=section[i].flight +text=text..string.format("\n- %s",flight.name) +flight.seclead=playerData.name +flight.case=playerData.case +self:MessageToPlayer(flight,string.format("your section lead is now %s.",playerData.name),"AIRBOSS") +table.insert(playerData.section,flight) +end +if#playerData.section==0 then +text=text..string.format("\n- No other human flights found within radius of %.1f meters!",dmax) +end +end +self:MessageToPlayer(playerData,text,"MARSHAL") +end +end +end +function AIRBOSS:_DisplayScoreBoard(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local _playerResults={} +for playerName,playerGrades in pairs(self.playerscores)do +if playerGrades then +local Paverage=0 +local n=0 +for _,_grade in pairs(playerGrades)do +local grade=_grade +if grade.finalscore then +Paverage=Paverage+grade.finalscore +n=n+1 +else +end +end +if n>0 then +_playerResults[playerName]=Paverage/n +end +end +end +local text=string.format("Greenie Board (top ten):") +local i=1 +for _playerName,_points in UTILS.spairs(_playerResults,function(t,a,b) +return t[b]<t[a] +end)do +text=text..string.format("\n[%d] %s %.1f||",i,_playerName,_points) +local playerGrades=self.playerscores[_playerName] +for _,_grade in pairs(playerGrades)do +local grade=_grade +if grade.finalscore then +text=text..string.format("%.1f|",grade.points) +elseif grade.points>=0 then +text=text..string.format("(%.1f)",grade.points) +end +end +i=i+1 +if i>10 then +break +end +end +if i==1 then +text=text.."\nNo results yet." +end +local playerData=self.players[_playername] +if playerData.client then +MESSAGE:New(text,30,nil,true):ToClient(playerData.client) +end +end +end +function AIRBOSS:_DisplayPlayerGrades(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("Your last 10 grades, %s:",_playername) +local playerGrades=self.playerscores[_playername]or{} +local p=0 +local n=0 +local m=0 +for i=#playerGrades,1,-1 do +local grade=playerGrades[i] +if grade.points>=0 then +local points=grade.finalscore or grade.points +if m<10 then +text=text..string.format("\n[%d] %s %.1f PT - %s",i,grade.grade,points,grade.details) +if grade.wire and grade.wire<=4 then +text=text..string.format(" %d-wire",grade.wire) +end +if grade.Tgroove and grade.Tgroove<=360 then +text=text..string.format(" Tgroove=%.1f s",grade.Tgroove) +end +end +if grade.finalscore then +p=p+grade.finalscore +n=n+1 +end +m=m+1 +end +end +if n>0 then +text=text..string.format("\nAverage points = %.1f",p/n) +else +text=text..string.format("\nNo data available.") +end +if playerData.client then +MESSAGE:New(text,30,nil,true):ToClient(playerData.client) +end +end +end +end +function AIRBOSS:_DisplayDebriefing(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local text=string.format("Debriefing:") +if#playerData.lastdebrief>0 then +text=text..string.format("\n================================\n") +for _,_data in pairs(playerData.lastdebrief)do +local step=_data.step +local comment=_data.hint +text=text..string.format("* %s:",step) +text=text..string.format("%s\n",comment) +end +else +text=text.." Nothing to show yet." +end +self:MessageToPlayer(playerData,text,nil,"",30,true) +end +end +end +function AIRBOSS:_DisplayQueue(_unitname,qname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +local queue=nil +if qname=="Marshal"then +queue=self.Qmarshal +elseif qname=="Pattern"then +queue=self.Qpattern +elseif qname=="Waiting"then +queue=self.Qwaiting +end +local Nqueue,nqueue=self:_GetQueueInfo(queue,playerData.case) +local text=string.format("%s Queue:",qname) +if#queue==0 then +text=text.." empty" +else +local N=0 +if qname=="Marshal"then +for i,_flight in pairs(queue)do +local flight=_flight +local charlie=self:_GetCharlieTime(flight) +local Charlie=UTILS.SecondsToClock(charlie) +local stack=flight.flag +local angels=self:_GetAngels(self:_GetMarshalAltitude(stack,flight.case)) +local _,nunit,nsec=self:_GetFlightUnits(flight,true) +local nick=self:_GetACNickname(flight.actype) +N=N+nunit +text=text..string.format("\n[Stack %d] %s (%s*%d+%d): Case %d, Angels %d, Charlie %s",stack,flight.onboard,nick,nunit,nsec,flight.case,angels,tostring(Charlie)) +end +elseif qname=="Pattern"or qname=="Waiting"then +for i,_flight in pairs(queue)do +local flight=_flight +local _,nunit,nsec=self:_GetFlightUnits(flight,true) +local nick=self:_GetACNickname(flight.actype) +local ptime=UTILS.SecondsToClock(timer.getAbsTime()-flight.time) +N=N+nunit +text=text..string.format("\n[%d] %s (%s*%d+%d): Case %d, T=%s",i,flight.onboard,nick,nunit,nsec,flight.case,ptime) +end +end +text=text..string.format("\nTotal AC: %d (airborne %d)",N,nqueue) +end +self:MessageToPlayer(playerData,text,nil,"",nil,true) +end +end +end +function AIRBOSS:_DisplayCarrierInfo(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +local coord=self:GetCoordinate() +local carrierheading=self.carrier:GetHeading() +local carrierspeed=UTILS.MpsToKnots(self.carrier:GetVelocityMPS()) +local tacan="unknown" +local icls="unknown" +if self.TACANon and self.TACANchannel~=nil then +tacan=string.format("%d%s (%s)",self.TACANchannel,self.TACANmode,self.TACANmorse) +end +if self.ICLSon and self.ICLSchannel~=nil then +icls=string.format("%d (%s)",self.ICLSchannel,self.ICLSmorse) +end +local wind=UTILS.MpsToKnots(select(1,self:GetWindOnDeck())) +local Nmarshal,nmarshal=self:_GetQueueInfo(self.Qmarshal,playerData.case) +local Npattern,npattern=self:_GetQueueInfo(self.Qpattern) +local Nspinning,nspinning=self:_GetQueueInfo(self.Qspinning) +local Nwaiting,nwaiting=self:_GetQueueInfo(self.Qwaiting) +local Ntotal,ntotal=self:_GetQueueInfo(self.flights) +local Tabs=timer.getAbsTime() +local recoverytext="Recovery time windows (max 5):" +if#self.recoverytimes==0 then +recoverytext=recoverytext.." none." +else +local rw=0 +for _,_recovery in pairs(self.recoverytimes)do +local recovery=_recovery +if Tabs<recovery.STOP then +recoverytext=recoverytext..string.format("\n* %s - %s: Case %d (%d°)",UTILS.SecondsToClock(recovery.START),UTILS.SecondsToClock(recovery.STOP),recovery.CASE,recovery.OFFSET) +if recovery.WIND then +recoverytext=recoverytext..string.format(" @ %.1f kts wind",recovery.SPEED) +end +rw=rw+1 +if rw>=5 then +break +end +end +end +end +local tankertext=nil +if self.tanker then +tankertext=string.format("Recovery tanker frequency %.3f MHz\n",self.tanker.RadioFreq) +if self.tanker.TACANon then +tankertext=tankertext..string.format("Recovery tanker TACAN %d%s (%s)",self.tanker.TACANchannel,self.tanker.TACANmode,self.tanker.TACANmorse) +else +tankertext=tankertext.."Recovery tanker TACAN n/a" +end +end +local state=self:GetState() +if state=="Idle"then +state="Deck closed" +end +if self.turning then +state=state.." (currently turning)" +end +local text=string.format("%s info:\n",self.alias) +text=text..string.format("================================\n") +text=text..string.format("Carrier state: %s\n",state) +if self.case==1 then +text=text..string.format("Case %d recovery ops\n",self.case) +else +local radial=self:GetRadial(self.case,true,true,false) +text=text..string.format("Case %d recovery ops\nMarshal radial %03d°\n",self.case,radial) +end +text=text..string.format("BRC %03d° - FB %03d°\n",self:GetBRC(),self:GetFinalBearing(true)) +text=text..string.format("Speed %.1f kts - Wind on deck %.1f kts\n",carrierspeed,wind) +text=text..string.format("Tower frequency %.3f MHz\n",self.TowerFreq) +text=text..string.format("Marshal radio %.3f MHz\n",self.MarshalFreq) +text=text..string.format("LSO radio %.3f MHz\n",self.LSOFreq) +text=text..string.format("TACAN Channel %s\n",tacan) +text=text..string.format("ICLS Channel %s\n",icls) +if tankertext then +text=text..tankertext.."\n" +end +text=text..string.format("# A/C total %d (%d)\n",Ntotal,ntotal) +text=text..string.format("# A/C marshal %d (%d)\n",Nmarshal,nmarshal) +text=text..string.format("# A/C pattern %d (%d) - spinning %d (%d)\n",Npattern,npattern,Nspinning,nspinning) +text=text..string.format("# A/C waiting %d (%d)\n",Nwaiting,nwaiting) +text=text..string.format(recoverytext) +self:T2(self.lid..text) +self:MessageToPlayer(playerData,text,nil,"",30,true) +else +self:E(self.lid..string.format("ERROR: Could not get player data for player %s.",playername)) +end +end +end +function AIRBOSS:_DisplayCarrierWeather(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local text="" +local coord=self:GetCoordinate() +local T=coord:GetTemperature() +local P=coord:GetPressure() +local Wd,Ws=self:GetWind(nil,true) +local Bn,Bd=UTILS.BeaufortScale(Ws) +local WodPA,WodPP=self:GetWindOnDeck() +local WodPA=UTILS.MpsToKnots(WodPA) +local WodPP=UTILS.MpsToKnots(WodPP) +local WD=string.format('%03d°',Wd) +local Ts=string.format("%d°C",T) +local tT=string.format("%d°C",T) +local tW=string.format("%.1f knots",UTILS.MpsToKnots(Ws)) +local tP=string.format("%.2f inHg",UTILS.hPa2inHg(P)) +text=text..string.format("Weather Report at Carrier %s:\n",self.alias) +text=text..string.format("================================\n") +text=text..string.format("Temperature %s\n",tT) +text=text..string.format("Wind from %s at %s (%s)\n",WD,tW,Bd) +text=text..string.format("Wind on deck || %.1f kts, == %.1f kts\n",WodPA,WodPP) +text=text..string.format("QFE %.1f hPa = %s",P,tP) +if self.staticweather then +local clouds,visibility,fog,dust=self:_GetStaticWeather() +text=text..string.format("\nVisibility %.1f NM",UTILS.MetersToNM(visibility)) +text=text..string.format("\nCloud base %d ft",UTILS.MetersToFeet(clouds.base)) +text=text..string.format("\nCloud thickness %d ft",UTILS.MetersToFeet(clouds.thickness)) +text=text..string.format("\nCloud density %d",clouds.density) +text=text..string.format("\nPrecipitation %d",clouds.iprecptns) +if fog then +text=text..string.format("\nFog thickness %d ft",UTILS.MetersToFeet(fog.thickness)) +text=text..string.format("\nFog visibility %d ft",UTILS.MetersToFeet(fog.visibility)) +else +text=text..string.format("\nNo fog") +end +if dust then +text=text..string.format("\nDust density %d",dust) +else +text=text..string.format("\nNo dust") +end +end +self:T2(self.lid..text) +self:MessageToPlayer(self.players[playername],text,nil,"",30,true) +else +self:E(self.lid..string.format("ERROR! Could not find player unit in CarrierWeather! Unit name = %s",_unitname)) +end +end +function AIRBOSS:_SetDifficulty(_unitname,difficulty) +self:T2({difficulty=difficulty,unitname=_unitname}) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.difficulty=difficulty +local text=string.format("roger, your skill level is now: %s.",difficulty) +self:MessageToPlayer(playerData,text,nil,playerData.name,5) +else +self:E(self.lid..string.format("ERROR: Could not get player data for player %s.",playername)) +end +if playerData.difficulty==AIRBOSS.Difficulty.HARD then +playerData.showhints=false +else +playerData.showhints=true +end +end +end +function AIRBOSS:_SetHintsOnOff(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.showhints=not playerData.showhints +local text="" +if playerData.showhints==true then +text=string.format("roger, hints are now ON.") +else +text=string.format("affirm, hints are now OFF.") +end +self:MessageToPlayer(playerData,text,nil,playerData.name,5) +end +end +end +function AIRBOSS:_DisplayAttitude(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.attitudemonitor=not playerData.attitudemonitor +end +end +end +function AIRBOSS:_SubtitlesOnOff(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +playerData.subtitles=not playerData.subtitles +local text="" +if playerData.subtitles==true then +text=string.format("roger, subtitiles are now ON.") +elseif playerData.subtitles==false then +text=string.format("affirm, subtitiles are now OFF.") +end +self:MessageToPlayer(playerData,text,nil,playerData.name,5) +end +end +end +function AIRBOSS:_TrapsheetOnOff(_unitname) +self:F2(_unitname) +local unit,playername=self:_GetPlayerUnitAndName(_unitname) +if unit and playername then +local playerData=self.players[playername] +if playerData then +local text="" +if self.trapsheet then +playerData.trapon=not playerData.trapon +if playerData.trapon==true then +text=string.format("roger, your trapsheets are now SAVED.") +else +text=string.format("affirm, your trapsheets are NOT SAVED.") +end +else +text="negative, trap sheet data recorder is broken on this carrier." +end +self:MessageToPlayer(playerData,text,nil,playerData.name,5) +end +end +end +function AIRBOSS:_DisplayPlayerStatus(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local steptext=playerData.step +if playerData.step==AIRBOSS.PatternStep.HOLDING then +if playerData.holding==nil then +steptext="Transit to Marshal" +elseif playerData.holding==false then +steptext="Marshal (outside zone)" +elseif playerData.holding==true then +steptext="Marshal Stack Holding" +end +end +local stack=playerData.flag +local stacktext=nil +if stack>0 then +local stackalt=self:_GetMarshalAltitude(stack) +local angels=self:_GetAngels(stackalt) +stacktext=string.format("Marshal Stack %d, Angels %d\n",stack,angels) +if playerData.step==AIRBOSS.PatternStep.HOLDING and playerData.case>1 then +local radial=self:GetRadial(playerData.case,true,true,true) +stacktext=stacktext..string.format("Select TACAN %03d°, %d DME\n",radial,angels+15) +end +end +local fuel=playerData.unit:GetFuel()*100 +local fuelstate=self:_GetFuelState(playerData.unit) +local _,nunitsGround=self:_GetFlightUnits(playerData,true) +local _,nunitsAirborne=self:_GetFlightUnits(playerData,false) +local text=string.format("Status of player %s (%s)\n",playerData.name,playerData.callsign) +text=text..string.format("================================\n") +text=text..string.format("Step: %s\n",steptext) +if stacktext then +text=text..stacktext +end +text=text..string.format("Recovery Case: %d\n",playerData.case) +text=text..string.format("Skill Level: %s\n",playerData.difficulty) +text=text..string.format("Modex: %s (%s)\n",playerData.onboard,self:_GetACNickname(playerData.actype)) +text=text..string.format("Fuel State: %.1f lbs/1000 (%.1f %%)\n",fuelstate/1000,fuel) +text=text..string.format("# units: %d (%d airborne)\n",nunitsGround,nunitsAirborne) +text=text..string.format("Section Lead: %s (%d/%d)",tostring(playerData.seclead),#playerData.section+1,self.NmaxSection+1) +for _,_sec in pairs(playerData.section)do +local sec=_sec +text=text..string.format("\n- %s",sec.name) +end +if playerData.step==AIRBOSS.PatternStep.INITIAL then +local zoneinitial=self:GetCoordinate():Translate(UTILS.NMToMeters(3.5),self:GetRadial(2,false,false,false)) +local flyhdg=playerData.unit:GetCoordinate():HeadingTo(zoneinitial) +local flydist=UTILS.MetersToNM(playerData.unit:GetCoordinate():Get2DDistance(zoneinitial)) +local brc=self:GetBRC() +text=text..string.format("\nTo Initial: Fly heading %03d° for %.1f NM and turn to BRC %03d°",flyhdg,flydist,brc) +elseif playerData.step==AIRBOSS.PatternStep.PLATFORM then +local zoneplatform=self:_GetZonePlatform(playerData.case):GetCoordinate() +local flyhdg=playerData.unit:GetCoordinate():HeadingTo(zoneplatform) +local flydist=UTILS.MetersToNM(playerData.unit:GetCoordinate():Get2DDistance(zoneplatform)) +local hdg=self:GetRadial(playerData.case,true,true,true) +text=text..string.format("\nTo Platform: Fly heading %03d° for %.1f NM and turn to %03d°",flyhdg,flydist,hdg) +end +self:MessageToPlayer(playerData,text,nil,"",30,true) +else +self:E(self.lid..string.format("ERROR: playerData=nil. Unit name=%s, player name=%s",_unitName,_playername)) +end +else +self:E(self.lid..string.format("ERROR: could not find player for unit %s",_unitName)) +end +end +function AIRBOSS:_MarkMarshalZone(_unitName,flare) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local stack=playerData.flag +local case=playerData.case +local text="" +if stack>0 then +local zoneHolding=self:_GetZoneHolding(case,stack) +local zoneThree=self:_GetZoneCommence(case,stack) +local patternalt=self:_GetMarshalAltitude(stack,case) +patternalt=5 +text="roger, marking" +if flare then +text=text..string.format("\n* Marshal zone stack %d with WHITE flares.",stack) +zoneHolding:FlareZone(FLARECOLOR.White,45,nil,patternalt) +text=text.."\n* Commence zone with RED flares." +zoneThree:FlareZone(FLARECOLOR.Red,45,nil,patternalt) +else +text=text..string.format("\n* Marshal zone stack %d with WHITE smoke.",stack) +zoneHolding:SmokeZone(SMOKECOLOR.White,45,patternalt) +text=text.."\n* Commence zone with RED smoke." +zoneThree:SmokeZone(SMOKECOLOR.Red,45,patternalt) +end +else +text="negative, you are currently not in a Marshal stack. No zones will be marked!" +end +self:MessageToPlayer(playerData,text,"MARSHAL",playerData.name) +end +end +end +function AIRBOSS:_MarkCaseZones(_unitName,flare) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +local case=playerData.case +local text=string.format("affirm, marking CASE %d zones",case) +if flare then +if case==1 or case==2 then +text=text.."\n* initial with GREEN flares" +self:_GetZoneInitial(case):FlareZone(FLARECOLOR.Green,45) +end +if case==2 or case==3 then +text=text.."\n* approach corridor with GREEN flares" +self:_GetZoneCorridor(case):FlareZone(FLARECOLOR.Green,45) +end +if case==2 or case==3 then +text=text.."\n* platform with RED flares" +self:_GetZonePlatform(case):FlareZone(FLARECOLOR.Red,45) +end +if case==3 then +text=text.."\n* dirty up with YELLOW flares" +self:_GetZoneDirtyUp(case):FlareZone(FLARECOLOR.Yellow,45) +end +if case==2 or case==3 then +if math.abs(self.holdingoffset)>0 then +self:_GetZoneArcIn(case):FlareZone(FLARECOLOR.White,45) +text=text.."\n* arc turn in with WHITE flares" +self:_GetZoneArcOut(case):FlareZone(FLARECOLOR.White,45) +text=text.."\n* arc turn out with WHITE flares" +end +end +if case==3 then +text=text.."\n* bullseye with GREEN flares" +self:_GetZoneBullseye(case):FlareZone(FLARECOLOR.Green,45) +end +if self.carriertype==AIRBOSS.CarrierType.INVINCIBLE or self.carriertype==AIRBOSS.CarrierType.HERMES or self.carriertype==AIRBOSS.CarrierType.TARAWA or self.carriertype==AIRBOSS.CarrierType.AMERICA or self.carriertype==AIRBOSS.CarrierType.JCARLOS or self.carriertype==AIRBOSS.CarrierType.CANBERRA then +text=text.."\n* abeam landing stop with RED flares" +local ALSPT=self:_GetZoneAbeamLandingSpot() +ALSPT:FlareZone(FLARECOLOR.Red,5,nil,UTILS.FeetToMeters(110)) +text=text.."\n* primary landing spot with GREEN flares" +local LSPT=self:_GetZoneLandingSpot() +LSPT:FlareZone(FLARECOLOR.Green,5,nil,self.carrierparam.deckheight) +end +else +if case==1 or case==2 then +text=text.."\n* initial with GREEN smoke" +self:_GetZoneInitial(case):SmokeZone(SMOKECOLOR.Green,45) +end +if case==2 or case==3 then +text=text.."\n* approach corridor with GREEN smoke" +self:_GetZoneCorridor(case):SmokeZone(SMOKECOLOR.Green,45) +end +if case==2 or case==3 then +text=text.."\n* platform with RED smoke" +self:_GetZonePlatform(case):SmokeZone(SMOKECOLOR.Red,45) +end +if case==2 or case==3 then +if math.abs(self.holdingoffset)>0 then +self:_GetZoneArcIn(case):SmokeZone(SMOKECOLOR.Blue,45) +text=text.."\n* arc turn in with BLUE smoke" +self:_GetZoneArcOut(case):SmokeZone(SMOKECOLOR.Blue,45) +text=text.."\n* arc turn out with BLUE smoke" +end +end +if case==3 then +text=text.."\n* dirty up with ORANGE smoke" +self:_GetZoneDirtyUp(case):SmokeZone(SMOKECOLOR.Orange,45) +end +if case==3 then +text=text.."\n* bullseye with GREEN smoke" +self:_GetZoneBullseye(case):SmokeZone(SMOKECOLOR.Green,45) +end +end +self:MessageToPlayer(playerData,text,"MARSHAL",playerData.name) +end +end +end +function AIRBOSS:_LSORadioCheck(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +self:RadioTransmission(self.LSORadio,self.LSOCall.RADIOCHECK,nil,nil,nil,true) +end +end +end +function AIRBOSS:_MarshalRadioCheck(_unitName) +self:F(_unitName) +local _unit,_playername=self:_GetPlayerUnitAndName(_unitName) +if _unit and _playername then +local playerData=self.players[_playername] +if playerData then +self:RadioTransmission(self.MarshalRadio,self.MarshalCall.RADIOCHECK,nil,nil,nil,true) +end +end +end +function AIRBOSS:_SaveTrapSheet(playerData,grade) +if playerData.trapsheet==nil or#playerData.trapsheet==0 or not io then +return +end +local function _savefile(filename,data) +local f=io.open(filename,"wb") +if f then +f:write(data) +f:close() +else +self:E(self.lid..string.format("ERROR: could not save trap sheet to file %s.\nFile may contain invalid characters.",tostring(filename))) +end +end +local path=self.trappath +if lfs then +path=path or lfs.writedir() +end +local filename=nil +for i=1,9999 do +if self.trapprefix then +filename=string.format("%s_%s-%04d.csv",self.trapprefix,playerData.actype,i) +else +local name=UTILS.ReplaceIllegalCharacters(playerData.name,"_") +filename=string.format("AIRBOSS-%s_Trapsheet-%s_%s-%04d.csv",self.alias,name,playerData.actype,i) +end +if path~=nil then +filename=path.."\\"..filename +end +local _exists=UTILS.FileExists(filename) +if not _exists then +break +end +end +local text=string.format("Saving player %s trapsheet to file %s",playerData.name,filename) +self:I(self.lid..text) +local data="#Time,Rho,X,Z,Alt,AoA,GSE,LUE,Vtot,Vy,Gamma,Pitch,Roll,Yaw,Step,Grade,Points,Details\n" +local g0=playerData.trapsheet[1] +local T0=g0.Time +for i=1,#playerData.trapsheet do +local groove=playerData.trapsheet[i] +local t=groove.Time-T0 +local a=UTILS.MetersToNM(groove.Rho or 0) +local b=-groove.X or 0 +local c=groove.Z or 0 +local d=UTILS.MetersToFeet(groove.Alt or 0) +local e=groove.AoA or 0 +local f=groove.GSE or 0 +local g=-groove.LUE or 0 +local h=UTILS.MpsToKnots(groove.Vel or 0) +local i=(groove.Vy or 0)*196.85 +local j=groove.Gamma or 0 +local k=groove.Pitch or 0 +local l=groove.Roll or 0 +local m=groove.Yaw or 0 +local n=self:_GS(groove.Step,-1)or"n/a" +local o=groove.Grade or"n/a" +local p=groove.GradePoints or 0 +local q=groove.GradeDetail or"n/a" +data=data..string.format("%.2f,%.3f,%.1f,%.1f,%.1f,%.2f,%.2f,%.2f,%.1f,%.1f,%.1f,%.1f,%.1f,%.1f,%s,%s,%.1f,%s\n",t,a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q) +end +_savefile(filename,data) +end +function AIRBOSS:onbeforeSave(From,Event,To,path,filename) +if not io then +self:E(self.lid.."ERROR: io not desanitized. Can't save player grades.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +return true +end +function AIRBOSS:onafterSave(From,Event,To,path,filename) +local function _savefile(filename,data) +local f=assert(io.open(filename,"wb")) +f:write(data) +f:close() +end +if lfs then +path=path or lfs.writedir() +end +filename=filename or string.format("AIRBOSS-%s_LSOgrades.csv",self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local scores="Name,Pass,Points Final,Points Pass,Grade,Details,Wire,Tgroove,Case,Wind,Modex,Airframe,Carrier Type,Carrier Name,Theatre,Mission Time,Mission Date,OS Date\n" +local n=0 +for playername,grades in pairs(self.playerscores)do +for i,_grade in pairs(grades)do +local grade=_grade +local wire="n/a" +if grade.wire and grade.wire<=4 then +wire=tostring(grade.wire) +end +local Tgroove="n/a" +if grade.Tgroove and grade.Tgroove<=360 and grade.case<3 then +Tgroove=tostring(UTILS.Round(grade.Tgroove,1)) +end +local finalscore="n/a" +if grade.finalscore then +finalscore=tostring(UTILS.Round(grade.finalscore,1)) +end +scores=scores..string.format("%s,%d,%s,%.1f,%s,%s,%s,%s,%d,%s,%s,%s,%s,%s,%s,%s,%s,%s\n",playername,i,finalscore,grade.points,grade.grade,grade.details,wire,Tgroove,grade.case,grade.wind,grade.modex,grade.airframe,grade.carriertype,grade.carriername,grade.theatre,grade.mitime,grade.midate,grade.osdate) +n=n+1 +end +end +local text=string.format("Saving %d player LSO grades to file %s",n,filename) +self:I(self.lid..text) +_savefile(filename,scores) +end +function AIRBOSS:onbeforeLoad(From,Event,To,path,filename) +local function _fileexists(name) +local f=io.open(name,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +end +if not io then +self:E(self.lid.."WARNING: io not desanitized. Can't load player grades.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. Results will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +if lfs then +path=path or lfs.writedir() +end +filename=filename or string.format("AIRBOSS-%s_LSOgrades.csv",self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local exists=_fileexists(filename) +if exists then +return true +else +self:E(self.lid..string.format("WARNING: Player LSO grades file %s does not exist.",filename)) +return false +end +end +function AIRBOSS:onafterLoad(From,Event,To,path,filename) +local function _loadfile(filename) +local f=assert(io.open(filename,"rb")) +local data=f:read("*all") +f:close() +return data +end +if lfs then +path=path or lfs.writedir() +end +filename=filename or string.format("AIRBOSS-%s_LSOgrades.csv",self.alias) +if path~=nil then +filename=path.."\\"..filename +end +local text=string.format("Loading player LSO grades from file %s",filename) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:I(self.lid..text) +local data=_loadfile(filename) +local playergrades=UTILS.Split(data,"\n") +table.remove(playergrades,1) +self.playerscores={} +local n=0 +for _,gradeline in pairs(playergrades)do +local gradedata=UTILS.Split(gradeline,",") +self:T2(gradedata) +local grade={} +local playername=gradedata[1] +if gradedata[3]~=nil and gradedata[3]~="n/a"then +grade.finalscore=tonumber(gradedata[3]) +end +grade.points=tonumber(gradedata[4]) +grade.grade=tostring(gradedata[5]) +grade.details=tostring(gradedata[6]) +if gradedata[7]~=nil and gradedata[7]~="n/a"then +grade.wire=tonumber(gradedata[7]) +end +if gradedata[8]~=nil and gradedata[8]~="n/a"then +grade.Tgroove=tonumber(gradedata[8]) +end +grade.case=tonumber(gradedata[9]) +grade.wind=gradedata[10]or"n/a" +grade.modex=gradedata[11]or"n/a" +grade.airframe=gradedata[12]or"n/a" +grade.carriertype=gradedata[13]or"n/a" +grade.carriername=gradedata[14]or"n/a" +grade.theatre=gradedata[15]or"n/a" +grade.mitime=gradedata[16]or"n/a" +grade.midate=gradedata[17]or"n/a" +grade.osdate=gradedata[18]or"n/a" +self.playerscores[playername]=self.playerscores[playername]or{} +table.insert(self.playerscores[playername],grade) +n=n+1 +self:T2({playername,self.playerscores[playername]}) +end +local text=string.format("Loaded %d player LSO grades from file %s",n,filename) +self:I(self.lid..text) +end +function AIRBOSS:onafterLSOGrade(From,Event,To,playerData,grade) +if self.funkmanSocket then +local trapsheet={};trapsheet.X={};trapsheet.Z={};trapsheet.AoA={};trapsheet.Alt={} +for i=1,#playerData.trapsheet do +local ts=playerData.trapsheet[i] +table.insert(trapsheet.X,UTILS.Round(ts.X,1)) +table.insert(trapsheet.Z,UTILS.Round(ts.Z,1)) +table.insert(trapsheet.AoA,UTILS.Round(ts.AoA,2)) +table.insert(trapsheet.Alt,UTILS.Round(ts.Alt,1)) +end +local result={} +result.command=SOCKET.DataType.LSOGRADE +result.name=playerData.name +result.trapsheet=trapsheet +result.airframe=grade.airframe +result.mitime=grade.mitime +result.midate=grade.midate +result.wind=grade.wind +result.carriertype=grade.carriertype +result.carriername=grade.carriername +result.carrierrwy=grade.carrierrwy +result.landingdist=self.carrierparam.landingdist +result.theatre=grade.theatre +result.case=playerData.case +result.Tgroove=grade.Tgroove +result.wire=grade.wire +result.grade=grade.grade +result.points=grade.points +result.details=grade.details +self:T(self.lid.."Result onafterLSOGrade") +self:T(result) +self.funkmanSocket:SendTable(result) +end +end +RECOVERYTANKER={ +ClassName="RECOVERYTANKER", +Debug=false, +lid=nil, +carrier=nil, +carriertype=nil, +tankergroupname=nil, +tanker=nil, +airbase=nil, +beacon=nil, +TACANchannel=nil, +TACANmode=nil, +TACANmorse=nil, +TACANon=nil, +RadioFreq=nil, +RadioModu=nil, +altitude=nil, +speed=nil, +distStern=nil, +distBow=nil, +dTupdate=nil, +Dupdate=nil, +Hupdate=nil, +Tupdate=nil, +takeoff=nil, +lowfuel=nil, +respawn=nil, +respawninair=nil, +uncontrolledac=nil, +orientation=nil, +orientlast=nil, +position=nil, +alias=nil, +uid=0, +awacs=nil, +callsignname=nil, +callsignnumber=nil, +modex=nil, +eplrs=nil, +recovery=nil, +terminaltype=nil, +unlimitedfuel=false, +} +_RECOVERYTANKERID=0 +RECOVERYTANKER.version="1.0.10" +function RECOVERYTANKER:New(carrierunit,tankergroupname) +local self=BASE:Inherit(self,FSM:New()) +if type(carrierunit)=="string"then +self.carrier=UNIT:FindByName(carrierunit) +else +self.carrier=carrierunit +end +self.carriertype=self.carrier:GetTypeName() +self.tankergroupname=tankergroupname +_RECOVERYTANKERID=_RECOVERYTANKERID+1 +self.uid=_RECOVERYTANKERID +self.carrier:SetState(self.carrier,string.format("RECOVERYTANKER_%d",self.uid),self) +self.alias=string.format("%s_%s_%02d",self.carrier:GetName(),self.tankergroupname,_RECOVERYTANKERID) +self.lid=string.format("RECOVERYTANKER %s | ",self.alias) +self:SetAltitude() +self:SetSpeed() +self:SetRacetrackDistances() +self:SetHomeBase(AIRBASE:FindByName(self.carrier:GetName())) +self:SetTakeoffHot() +self:SetLowFuelThreshold() +self:SetRespawnOnOff() +self:SetTACAN() +self:SetRadio() +self:SetPatternUpdateDistance() +self:SetPatternUpdateHeading() +self:SetPatternUpdateInterval() +self:SetAWACS(false) +self:SetRecoveryAirboss(false) +self.terminaltype=AIRBASE.TerminalType.OpenMedOrBig +if false then +BASE:TraceOnOff(true) +BASE:TraceClass(self.ClassName) +BASE:TraceLevel(1) +end +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","RefuelStart","Refueling") +self:AddTransition("*","RefuelStop","Running") +self:AddTransition("*","Run","Running") +self:AddTransition("Running","RTB","Returning") +self:AddTransition("Returning","Returned","Returned") +self:AddTransition("*","Status","*") +self:AddTransition("Running","PatternUpdate","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function RECOVERYTANKER:SetUnlimitedFuel(OnOff) +self.unlimitedfuel=OnOff +return self +end +function RECOVERYTANKER:SetSpeed(speed) +self.speed=UTILS.KnotsToMps(speed or 274) +return self +end +function RECOVERYTANKER:SetAltitude(altitude) +self.altitude=UTILS.FeetToMeters(altitude or 6000) +return self +end +function RECOVERYTANKER:SetRacetrackDistances(distbow,diststern) +self.distBow=UTILS.NMToMeters(distbow or 10) +self.distStern=-UTILS.NMToMeters(diststern or 4) +return self +end +function RECOVERYTANKER:SetPatternUpdateInterval(interval) +self.dTupdate=(interval or 10)*60 +return self +end +function RECOVERYTANKER:SetPatternUpdateDistance(distancechange) +self.Dupdate=UTILS.NMToMeters(distancechange or 5) +return self +end +function RECOVERYTANKER:SetPatternUpdateHeading(headingchange) +self.Hupdate=headingchange or 5 +return self +end +function RECOVERYTANKER:SetLowFuelThreshold(fuelthreshold) +self.lowfuel=fuelthreshold or 10 +return self +end +function RECOVERYTANKER:SetHomeBase(airbase,terminaltype) +if type(airbase)=="string"then +self.airbase=AIRBASE:FindByName(airbase) +else +self.airbase=airbase +end +if not self.airbase then +self:E(self.lid.."ERROR: Airbase is nil!") +end +if terminaltype then +self.terminaltype=terminaltype +end +return self +end +function RECOVERYTANKER:SetRecoveryAirboss(switch) +if switch==true or switch==nil then +self.recovery=true +else +self.recovery=false +end +return self +end +function RECOVERYTANKER:SetAWACS(switch,eplrs) +if switch==nil or switch==true then +self.awacs=true +else +self.awacs=false +end +if eplrs==nil or eplrs==true then +self.eplrs=true +else +self.eplrs=false +end +return self +end +function RECOVERYTANKER:SetCallsign(callsignname,callsignnumber) +self.callsignname=callsignname +self.callsignnumber=callsignnumber +return self +end +function RECOVERYTANKER:SetModex(modex) +self.modex=modex +return self +end +function RECOVERYTANKER:SetTakeoff(takeofftype) +self.takeoff=takeofftype +return self +end +function RECOVERYTANKER:SetTakeoffHot() +self:SetTakeoff(SPAWN.Takeoff.Hot) +return self +end +function RECOVERYTANKER:SetTakeoffCold() +self:SetTakeoff(SPAWN.Takeoff.Cold) +return self +end +function RECOVERYTANKER:SetTakeoffAir() +self:SetTakeoff(SPAWN.Takeoff.Air) +return self +end +function RECOVERYTANKER:SetRespawnOn() +self.respawn=true +return self +end +function RECOVERYTANKER:SetRespawnOff() +self.respawn=false +return self +end +function RECOVERYTANKER:SetRespawnOnOff(switch) +if switch==nil or switch==true then +self.respawn=true +else +self.respawn=false +end +return self +end +function RECOVERYTANKER:SetRespawnInAir() +self.respawninair=true +return self +end +function RECOVERYTANKER:SetUseUncontrolledAircraft() +self.uncontrolledac=true +return self +end +function RECOVERYTANKER:SetTACANoff() +self.TACANon=false +return self +end +function RECOVERYTANKER:SetTACAN(channel,morse,mode) +self.TACANchannel=channel or 1 +self.TACANmode=mode or"Y" +self.TACANmorse=morse or"TKR" +self.TACANon=true +return self +end +function RECOVERYTANKER:SetRadio(frequency,modulation) +self.RadioFreq=frequency or 251 +self.RadioModu=modulation or"AM" +return self +end +function RECOVERYTANKER:SetDebugModeON() +self.Debug=true +return self +end +function RECOVERYTANKER:SetDebugModeOFF() +self.Debug=false +return self +end +function RECOVERYTANKER:IsReturning() +return self:is("Returning") +end +function RECOVERYTANKER:IsReturned() +return self:is("Returned") +end +function RECOVERYTANKER:IsRunning() +return self:is("Running") +end +function RECOVERYTANKER:IsRefueling() +return self:is("Refueling") +end +function RECOVERYTANKER:IsStopped() +return self:is("Stopped") +end +function RECOVERYTANKER:GetAlias() +return self.alias +end +function RECOVERYTANKER:GetUnitName() +local unit=self.tanker:GetUnit(1) +if unit then +return unit:GetName() +end +return nil +end +function RECOVERYTANKER:onafterStart(From,Event,To) +self:I(string.format("Starting Recovery Tanker v%s for carrier unit %s of type %s for tanker group %s.",RECOVERYTANKER.version,self.carrier:GetName(),self.carriertype,self.tankergroupname)) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.Refueling,self._RefuelingStart) +self:HandleEvent(EVENTS.RefuelingStop,self._RefuelingStop) +self:HandleEvent(EVENTS.Crash,self._OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self._OnEventCrashOrDead) +local Spawn=SPAWN:NewWithAlias(self.tankergroupname,self.alias) +if self.unlimitedfuel then +Spawn:OnSpawnGroup( +function(grp) +grp:CommandSetUnlimitedFuel(self.unlimitedfuel) +end +) +end +Spawn:InitRadioCommsOnOff(true) +Spawn:InitRadioFrequency(self.RadioFreq) +Spawn:InitRadioModulation(self.RadioModu) +Spawn:InitModex(self.modex) +if self.takeoff==SPAWN.Takeoff.Air then +local hdg=self.carrier:GetHeading() +local dist=-self.distStern+UTILS.NMToMeters(4) +local Carrier=self.carrier:GetCoordinate():Translate(dist,hdg+190):SetAltitude(self.altitude) +Spawn:InitHeading(hdg+10) +self.tanker=Spawn:SpawnFromCoordinate(Carrier) +else +if self.uncontrolledac then +self.tanker=GROUP:FindByName(self.tankergroupname) +if self.tanker:IsAlive()then +self.tanker:StartUncontrolled() +else +self:E(string.format("ERROR: No uncontrolled (alive) tanker group with name %s could be found!",self.tankergroupname)) +return +end +else +self.tanker=Spawn:SpawnAtAirbase(self.airbase,self.takeoff,nil,self.terminaltype) +end +end +self:ScheduleOnce(1,self._InitRoute,self,-self.distStern+UTILS.NMToMeters(3)) +if self.TACANon then +self:_ActivateTACAN(2) +end +if self.callsignname then +self.tanker:CommandSetCallsign(self.callsignname,self.callsignnumber,2) +end +if self.eplrs then +self.tanker:CommandEPLRS(true,3) +end +self.orientation=self.carrier:GetOrientationX() +self.orientlast=self.carrier:GetOrientationX() +self.position=self.carrier:GetCoordinate() +self:__Status(10) +return self +end +function RECOVERYTANKER:onafterStatus(From,Event,To) +local time=timer.getTime() +if self.tanker and self.tanker:IsAlive()then +local fuel=self.tanker:GetFuel()*100 +local life=self.tanker:GetUnit(1):GetLife() +local life0=self.tanker:GetUnit(1):GetLife0() +local lifeR=self.tanker:GetUnit(1):GetLifeRelative() +local text=string.format("Recovery tanker %s: state=%s fuel=%.1f, life=%.1f/%.1f=%d",self.tanker:GetName(),self:GetState(),fuel,life,life0,lifeR*100) +self:T(self.lid..text) +MESSAGE:New(text,10):ToAllIf(self.Debug) +if self:IsRunning()then +if fuel<self.lowfuel then +if(self.takeoff==SPAWN.Takeoff.Air or self.respawninair)and not self.recovery then +if self.respawn then +local text=string.format("Respawning recovery tanker %s in air.",self.tanker:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self.tanker:InitHeading(self.tanker:GetHeading()) +self.tanker:InitRadioCommsOnOff(true) +self.tanker:InitRadioFrequency(self.RadioFreq) +self.tanker:InitRadioModulation(self.RadioModu) +self.tanker:InitModex(self.modex) +self.tanker=self.tanker:Respawn(nil,true) +self:__PatternUpdate(2) +if self.TACANon then +self:_ActivateTACAN(3) +end +if self.callsignname then +self.tanker:CommandSetCallsign(self.callsignname,self.callsignnumber,3) +end +if self.eplrs then +self.tanker:CommandEPLRS(true,4) +end +end +else +self:RTB(self.airbase) +end +else +if self.Tupdate then +local dt=time-self.Tupdate +local updatepattern=self:_CheckPatternUpdate(dt) +if updatepattern then +self:PatternUpdate() +end +end +end +elseif self:IsReturning()then +self:T2(self.lid.."Tanker is returning.") +elseif self:IsReturned()then +self:T2(self.lid.."Tanker returned. waiting for engine shutdown.") +end +if not self:IsStopped()then +self:__Status(-30) +end +else +if not self:IsStopped()then +self:E(self.lid.."Recovery tanker is NOT alive (and not stopped)!") +self:Stop() +if self.respawn then +self:__Start(5) +end +end +end +end +function RECOVERYTANKER:onafterPatternUpdate(From,Event,To) +local text=string.format("Updating recovery tanker %s racetrack pattern.",self.tanker:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +local hdg=self.carrier:GetHeading() +local Carrier=self.carrier:GetCoordinate() +local p0=self.tanker:GetCoordinate():Translate(UTILS.NMToMeters(1),self.tanker:GetHeading(),true) +local p1=Carrier:Translate(self.distStern,hdg):SetAltitude(self.altitude) +local p2=Carrier:Translate(self.distBow,hdg):SetAltitude(self.altitude) +local taskorbit=self.tanker:TaskOrbit(p1,self.altitude,self.speed,p2) +if self.Debug then +p0:MarkToAll("Waypoint P0 "..self.tanker:GetName()) +p1:MarkToAll("Racetrack P1 "..self.tanker:GetName()) +p2:MarkToAll("Racetrack P2 "..self.tanker:GetName()) +end +local wp={} +wp[1]=self.tanker:GetCoordinate():WaypointAirTurningPoint(nil,UTILS.MpsToKmph(self.speed),{},"Current Position") +wp[2]=p0:WaypointAirTurningPoint(nil,UTILS.MpsToKmph(self.speed),{taskorbit},"Tanker Orbit") +self.tanker:WayPointInitialize(wp) +local taskroll=self.tanker:EnRouteTaskTanker() +if self.awacs then +taskroll=self.tanker:EnRouteTaskAWACS() +end +local taskroute=self.tanker:TaskRoute(wp) +local taskcombo=self.tanker:TaskCombo({taskroll,taskroute}) +self.tanker:SetTask(taskcombo,1) +self.Tupdate=timer.getTime() +end +function RECOVERYTANKER:onafterRTB(From,Event,To,airbase) +airbase=airbase or self.airbase +local text=string.format("Recovery tanker %s returning to airbase %s.",self.tanker:GetName(),airbase:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +local wp={} +local speed=self.tanker:GetSpeedMax()*0.75 +wp[1]=self.tanker:GetCoordinate():WaypointAirTurningPoint(nil,speed,{},"Current Position") +if self.recovery then +wp[2]=self.tanker:GetCoordinate():Translate(UTILS.NMToMeters(10),self.tanker:GetHeading(),true):WaypointAirTurningPoint(nil,speed,{},"WP") +else +wp[2]=airbase:GetCoordinate():SetAltitude(500):WaypointAirLanding(speed,airbase,nil,"Land at airbase") +end +self.tanker:WayPointInitialize(wp) +self.tanker:Route(wp,1) +end +function RECOVERYTANKER:onafterReturned(From,Event,To,airbase) +if airbase then +local airbasename=airbase:GetName() +self:I(self.lid..string.format("Tanker returned to airbase %s",tostring(airbasename))) +else +self:E(self.lid..string.format("WARNING: Tanker landed but airbase (EventData.Place) is nil!")) +end +end +function RECOVERYTANKER:onafterStop(From,Event,To) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.Refueling) +self:UnHandleEvent(EVENTS.RefuelingStop) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.Crash) +self.CallScheduler:Clear() +if self.tanker and self.tanker:IsAlive()then +self:I(self.lid.."Stopping FSM and despawning tanker.") +self.tanker:Destroy() +else +self:I(self.lid.."Stopping FSM. Tanker was not alive.") +end +end +function RECOVERYTANKER:OnEventLand(EventData) +local group=EventData.IniGroup +if group and group:IsAlive()then +local groupname=group:GetName() +if groupname==self.tanker:GetName()then +local airbase=nil +local airbasename="unknown" +if EventData.Place then +airbase=EventData.Place +airbasename=airbase:GetName() +end +local text=string.format("Recovery tanker group %s landed at airbase %s.",group:GetName(),airbasename) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self:__Returned(1,airbase) +end +end +end +function RECOVERYTANKER:OnEventEngineShutdown(EventData) +local group=EventData.IniGroup +if group and group:IsAlive()then +local groupname=group:GetName() +if groupname==self.tanker:GetName()and self.respawn then +local text=string.format("Respawning recovery tanker group %s.",group:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +group:InitRadioCommsOnOff(true) +group:InitRadioFrequency(self.RadioFreq) +group:InitRadioModulation(self.RadioModu) +group:InitModex(self.modex) +self:ScheduleOnce(1,GROUP.RespawnAtCurrentAirbase,group) +if self.TACANon then +self:_ActivateTACAN(3) +end +if self.callsignname then +self.tanker:CommandSetCallsign(self.callsignname,self.callsignnumber,3) +end +if self.eplrs then +self.tanker:CommandEPLRS(true,4) +end +self:ScheduleOnce(2,RECOVERYTANKER._InitRoute,self,-self.distStern+UTILS.NMToMeters(3)) +end +end +end +function RECOVERYTANKER:_RefuelingStart(EventData) +if EventData and EventData.IniUnit and EventData.IniUnit:IsAlive()then +local receiver=EventData.IniUnit +local dist=receiver:GetCoordinate():Get2DDistance(self.tanker:GetCoordinate()) +if dist>100 then +return +end +local text=string.format("Recovery tanker %s started refueling unit %s",self.tanker:GetName(),receiver:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self:RefuelStart(receiver) +end +end +function RECOVERYTANKER:_RefuelingStop(EventData) +if EventData and EventData.IniUnit and EventData.IniUnit:IsAlive()then +local receiver=EventData.IniUnit +local dist=receiver:GetCoordinate():Get2DDistance(self.tanker:GetCoordinate()) +if dist>100 then +return +end +local text=string.format("Recovery tanker %s stopped refueling unit %s",self.tanker:GetName(),receiver:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self:RefuelStop(receiver) +end +end +function RECOVERYTANKER:_OnEventCrashOrDead(EventData) +self:F2({eventdata=EventData}) +if EventData and EventData.IniUnit then +local unit=EventData.IniUnit +local unitname=tostring(EventData.IniUnitName) +if EventData.IniGroupName==self.tanker:GetName()then +self:E(self.lid..string.format("Recovery tanker %s crashed!",unitname)) +self:Stop() +if self.respawn then +self:__Start(5) +end +end +end +end +function RECOVERYTANKER:_InitPatternTaskFunction() +local carriername=self.carrier:GetName() +local DCSScript={} +DCSScript[#DCSScript+1]=string.format('local mycarrier = UNIT:FindByName(\"%s\") ',carriername) +DCSScript[#DCSScript+1]=string.format('local mytanker = mycarrier:GetState(mycarrier, \"RECOVERYTANKER_%d\") ',self.uid) +DCSScript[#DCSScript+1]=string.format('mytanker:PatternUpdate()') +local DCSTask=CONTROLLABLE.TaskWrappedAction(self,CONTROLLABLE.CommandDoScript(self,table.concat(DCSScript))) +return DCSTask +end +function RECOVERYTANKER:_InitRoute(dist,delay) +dist=dist or UTILS.NMToMeters(8) +delay=delay or 1 +self:T(self.lid..string.format("Initializing route of recovery tanker %s.",self.tanker:GetName())) +local Carrier=self.carrier:GetCoordinate() +local hdg=self.carrier:GetHeading() +local p=Carrier:Translate(dist,hdg+190):SetAltitude(self.altitude) +local speed=self.tanker:GetSpeedMax()*0.8 +if self.Debug then +p:MarkToAll(string.format("Enter Pattern WP: alt=%d ft, speed=%d kts",UTILS.MetersToFeet(self.altitude),speed*0.539957)) +end +local task=self:_InitPatternTaskFunction() +local wp={} +if self.takeoff==SPAWN.Takeoff.Air then +wp[#wp+1]=self.tanker:GetCoordinate():SetAltitude(self.altitude):WaypointAirTurningPoint(nil,speed,{},"Spawn Position") +else +wp[#wp+1]=Carrier:WaypointAirTakeOffParking() +end +wp[#wp+1]=p:WaypointAirTurningPoint(nil,speed,{task},"Enter Pattern") +self.tanker:Route(wp,delay) +self:__Run(1) +self.Tupdate=nil +end +function RECOVERYTANKER:_CheckPatternUpdate(dt) +local pos=self.carrier:GetCoordinate() +local vNew=self.carrier:GetOrientationX() +local vOld=self.orientation +local vLast=self.orientlast +vNew.y=0;vOld.y=0;vLast.y=0 +local deltaHeading=math.deg(math.acos(UTILS.VecDot(vNew,vOld)/UTILS.VecNorm(vNew)/UTILS.VecNorm(vOld))) +local deltaLast=math.deg(math.acos(UTILS.VecDot(vNew,vLast)/UTILS.VecNorm(vNew)/UTILS.VecNorm(vLast))) +self.orientlast=vNew +local turning=deltaLast>=1 +if turning then +self:T2(self.lid..string.format("Carrier is turning. Delta Heading = %.1f",deltaLast)) +end +local Hchange=false +if math.abs(deltaHeading)>=self.Hupdate then +self:T(self.lid..string.format("Carrier heading changed by %d degrees. Turning=%s.",deltaHeading,tostring(turning))) +Hchange=true +end +local dist=pos:Get2DDistance(self.position) +local Dchange=false +if dist>self.Dupdate then +self:T(self.lid..string.format("Carrier position changed by %.1f NM. Turning=%s.",UTILS.MetersToNM(dist),tostring(turning))) +Dchange=true +end +local update=false +if self:IsRunning()and dt>self.dTupdate and not turning then +if Hchange or Dchange then +local text=string.format("Updating tanker %s pattern due to carrier position=%s or heading=%s change.",self.tanker:GetName(),tostring(Dchange),tostring(Hchange)) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self.orientation=vNew +self.position=pos +update=true +end +end +return update +end +function RECOVERYTANKER:_ActivateTACAN(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,RECOVERYTANKER._ActivateTACAN,self) +else +local unit=self.tanker:GetUnit(1) +if unit and unit:IsAlive()then +local text=string.format("Activating TACAN beacon: channel=%d mode=%s, morse=%s.",self.TACANchannel,self.TACANmode,self.TACANmorse) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self.beacon=BEACON:New(unit) +self.beacon:ActivateTACAN(self.TACANchannel,self.TACANmode,self.TACANmorse,true) +else +self:E(self.lid.."ERROR: Recovery tanker is not alive!") +end +end +end +function RECOVERYTANKER:_Pattern() +local hdg=self.carrier:GetHeading() +local alt=self.altitude +local Carrier=self.carrier:GetCoordinate() +local width=UTILS.NMToMeters(8) +local p={} +p[1]=self.tanker:GetCoordinate() +p[2]=Carrier:SetAltitude(alt) +p[3]=p[2]:Translate(self.distBow,hdg) +p[4]=p[3]:Translate(width/math.sqrt(2),hdg-45) +p[5]=p[3]:Translate(width,hdg-90) +p[6]=p[5]:Translate(self.distStern-self.distBow,hdg) +p[7]=p[2]:Translate(self.distStern,hdg) +local wp={} +for i=1,#p do +local coord=p[i] +coord:MarkToAll(string.format("Waypoint %d",i)) +table.insert(wp,coord:WaypointAirTurningPoint(nil,UTILS.MpsToKmph(self.speed))) +end +return wp +end +RESCUEHELO={ +ClassName="RESCUEHELO", +Debug=false, +lid=nil, +carrier=nil, +carriertype=nil, +helogroupname=nil, +helo=nil, +airbase=nil, +takeoff=nil, +followset=nil, +formation=nil, +lowfuel=nil, +altitude=nil, +offsetX=nil, +offsetZ=nil, +rescuezone=nil, +respawn=nil, +respawninair=nil, +uncontrolledac=nil, +rescueon=nil, +rescueduration=nil, +rescuespeed=nil, +rescuestopboat=nil, +HeloFuel0=nil, +rtb=nil, +carrierstop=nil, +alias=nil, +uid=0, +modex=nil, +dtFollow=nil, +} +_RESCUEHELOID=0 +RESCUEHELO.version="1.1.0" +function RESCUEHELO:New(carrierunit,helogroupname) +local self=BASE:Inherit(self,FSM:New()) +if type(carrierunit)=="string"then +self.carrier=UNIT:FindByName(carrierunit) +else +self.carrier=carrierunit +end +self.carriertype=self.carrier:GetTypeName() +self.helogroupname=helogroupname +_RESCUEHELOID=_RESCUEHELOID+1 +self.uid=_RESCUEHELOID +self.carrier:SetState(self.carrier,string.format("RESCUEHELO_%d",self.uid),self) +self.alias=string.format("%s_%s_%02d",self.carrier:GetName(),self.helogroupname,_RESCUEHELOID) +self.lid=string.format("RESCUEHELO %s | ",self.alias) +self:SetHomeBase(AIRBASE:FindByName(self.carrier:GetName())) +self:SetTakeoffHot() +self:SetLowFuelThreshold() +self:SetAltitude() +self:SetOffsetX() +self:SetOffsetZ() +self:SetRespawnOn() +self:SetRescueOn() +self:SetRescueZone() +self:SetRescueHoverSpeed() +self:SetRescueDuration() +self:SetFollowTimeInterval() +self:SetRescueStopBoatOff() +self.rtb=false +self.carrierstop=false +if false then +self.Debug=true +BASE:TraceOnOff(true) +BASE:TraceClass(self.ClassName) +BASE:TraceLevel(1) +end +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("Running","Rescue","Rescuing") +self:AddTransition("Running","RTB","Returning") +self:AddTransition("Rescuing","RTB","Returning") +self:AddTransition("Returning","Returned","Returned") +self:AddTransition("Running","Run","Running") +self:AddTransition("Returned","Run","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function RESCUEHELO:SetLowFuelThreshold(threshold) +self.lowfuel=threshold or 5 +return self +end +function RESCUEHELO:SetHomeBase(airbase) +if type(airbase)=="string"then +self.airbase=AIRBASE:FindByName(airbase) +else +self.airbase=airbase +end +if not self.airbase then +self:E(self.lid.."ERROR: Airbase is nil!") +end +return self +end +function RESCUEHELO:SetRescueZone(radius) +radius=UTILS.NMToMeters(radius or 15) +self.rescuezone=ZONE_UNIT:New("Rescue Zone",self.carrier,radius) +return self +end +function RESCUEHELO:SetRescueHoverSpeed(speed) +self.rescuespeed=UTILS.KnotsToMps(speed or 5) +return self +end +function RESCUEHELO:SetRescueDuration(duration) +self.rescueduration=(duration or 5)*60 +return self +end +function RESCUEHELO:SetRescueOn() +self.rescueon=true +return self +end +function RESCUEHELO:SetRescueOff() +self.rescueon=false +return self +end +function RESCUEHELO:SetRescueStopBoatOn() +self.rescuestopboat=true +return self +end +function RESCUEHELO:SetRescueStopBoatOff() +self.rescuestopboat=false +return self +end +function RESCUEHELO:SetTakeoff(takeofftype) +self.takeoff=takeofftype or SPAWN.Takeoff.Hot +return self +end +function RESCUEHELO:SetTakeoffHot() +self:SetTakeoff(SPAWN.Takeoff.Hot) +return self +end +function RESCUEHELO:SetTakeoffCold() +self:SetTakeoff(SPAWN.Takeoff.Cold) +return self +end +function RESCUEHELO:SetTakeoffAir() +self:SetTakeoff(SPAWN.Takeoff.Air) +return self +end +function RESCUEHELO:SetAltitude(alt) +self.altitude=alt or 70 +return self +end +function RESCUEHELO:SetOffsetX(distance) +self.offsetX=distance or 200 +return self +end +function RESCUEHELO:SetOffsetZ(distance) +self.offsetZ=distance or 240 +return self +end +function RESCUEHELO:SetRespawnOn() +self.respawn=true +return self +end +function RESCUEHELO:SetRespawnOff() +self.respawn=false +return self +end +function RESCUEHELO:SetRespawnOnOff(switch) +if switch==nil or switch==true then +self.respawn=true +else +self.respawn=false +end +return self +end +function RESCUEHELO:SetRespawnInAir() +self.respawninair=true +return self +end +function RESCUEHELO:SetModex(modex) +self.modex=modex +return self +end +function RESCUEHELO:SetFollowTimeInterval(dt) +self.dtFollow=dt or 1.0 +return self +end +function RESCUEHELO:SetUseUncontrolledAircraft() +self.uncontrolledac=true +return self +end +function RESCUEHELO:SetDebugModeON() +self.Debug=true +return self +end +function RESCUEHELO:SetDebugModeOFF() +self.Debug=false +return self +end +function RESCUEHELO:IsReturning() +return self:is("Returning") +end +function RESCUEHELO:IsRunning() +return self:is("Running") +end +function RESCUEHELO:IsRescuing() +return self:is("Rescuing") +end +function RESCUEHELO:IsStopped() +return self:is("Stopped") +end +function RESCUEHELO:GetAlias() +return self.alias +end +function RESCUEHELO:GetUnitName() +local unit=self.helo:GetUnit(1) +if unit then +return unit:GetName() +end +return nil +end +function RESCUEHELO:OnEventLand(EventData) +local group=EventData.IniGroup +if group and group:IsAlive()then +local groupname=group:GetName() +if groupname==self.helo:GetName()then +local airbase=nil +local airbasename="unknown" +if EventData.Place then +airbase=EventData.Place +airbasename=airbase:GetName() +end +local text=string.format("Rescue helo group %s landed at airbase %s.",groupname,airbasename) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +if self:IsRescuing()then +self:T(self.lid..string.format("Rescue helo %s returned from rescue operation.",groupname)) +end +if self.takeoff==SPAWN.Takeoff.Air or self.respawninair then +if not self:IsRescuing()then +self:E(self.lid..string.format("WARNING: Rescue helo %s landed. This should not happen for Takeoff=Air or respawninair=true and no rescue operation in progress.",groupname)) +end +end +self:__Returned(3,airbase) +end +end +end +function RESCUEHELO:_OnEventCrashOrEject(EventData) +self:F2({eventdata=EventData}) +if EventData and EventData.IniUnit then +local unit=EventData.IniUnit +local unitname=tostring(EventData.IniUnitName) +if EventData.IniGroupName~=self.helo:GetName()then +local text=string.format("Unit %s crashed or ejected.",unitname) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +local Vec3=EventData.IniDCSUnit:getPoint() +local coord=COORDINATE:NewFromVec3(Vec3) +if coord and self.rescuezone:IsCoordinateInZone(coord)then +if self.Debug then +coord:MarkToCoalition(self.lid..string.format("Crash site of unit %s.",unitname),self.helo:GetCoalition()) +end +local rightcoalition=EventData.IniGroup:GetCoalition()==self.helo:GetCoalition() +if self:IsRunning()and self.rescueon and rightcoalition then +self:Rescue(coord) +end +end +else +self:E(self.lid..string.format("Rescue helo %s crashed!",unitname)) +self:Stop() +if self.respawn then +self:__Start(5) +end +end +end +end +function RESCUEHELO:onafterStart(From,Event,To) +local text=string.format("Starting Rescue Helo Formation v%s for carrier unit %s of type %s.",RESCUEHELO.version,self.carrier:GetName(),self.carriertype) +self:I(self.lid..text) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.Crash,self._OnEventCrashOrEject) +self:HandleEvent(EVENTS.Ejection,self._OnEventCrashOrEject) +local delay=120 +local Spawn=SPAWN:NewWithAlias(self.helogroupname,self.alias) +Spawn:InitModex(self.modex) +if self.takeoff==SPAWN.Takeoff.Air then +local hdg=self.carrier:GetHeading() +local dist=UTILS.NMToMeters(0.2) +local Carrier=self.carrier:GetCoordinate():Translate(dist,hdg):SetAltitude(math.max(100,self.altitude)) +Spawn:InitHeading(hdg) +self.helo=Spawn:SpawnFromCoordinate(Carrier) +delay=1 +else +if self.uncontrolledac then +self.helo=GROUP:FindByName(self.helogroupname) +if self.helo and self.helo:IsAlive()then +self.helo:StartUncontrolled() +delay=60 +else +self:E(string.format("ERROR: No uncontrolled (alive) rescue helo group with name %s could be found!",self.helogroupname)) +return +end +else +self.helo=Spawn:SpawnAtAirbase(self.airbase,self.takeoff,nil,AIRBASE.TerminalType.HelicopterUsable) +if self.takeoff==SPAWN.Takeoff.Runway then +delay=5 +elseif self.takeoff==SPAWN.Takeoff.Hot then +delay=30 +elseif self.takeoff==SPAWN.Takeoff.Cold then +delay=60 +end +end +end +self.followset=SET_GROUP:New() +self.followset:AddGroup(self.helo) +self.HeloFuel0=self.helo:GetFuel() +self.formation=AI_FORMATION:New(self.carrier,self.followset,"Helo Formation with Carrier","Follow Carrier at given parameters.") +self.formation:FormationCenterWing(-self.offsetX,50,math.abs(self.altitude),50,self.offsetZ,50) +self.formation:SetFollowTimeInterval(self.dtFollow) +self.formation:SetFlightModeFormation(self.helo) +self.formation:__Start(delay) +self:__Status(1) +return self +end +function RESCUEHELO:onafterStatus(From,Event,To) +local time=timer.getTime() +if self.helo and self.helo:IsAlive()then +local fuel=self.helo:GetFuel()*100 +local fuelrel=fuel/self.HeloFuel0 +local life=self.helo:GetUnit(1):GetLife() +local life0=self.helo:GetUnit(1):GetLife0() +local lifeR=self.helo:GetUnit(1):GetLifeRelative() +local text=string.format("Rescue Helo %s: state=%s fuel=%.1f, rel.fuel=%.1f, life=%.1f/%.1f=%d",self.helo:GetName(),self:GetState(),fuel,fuelrel,life,life0,lifeR*100) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +if self:IsRunning()then +if fuel<self.lowfuel then +if self.takeoff==SPAWN.Takeoff.Air or self.respawninair then +if self.respawn then +self.helo:InitModex(self.modex) +self.helo=self.helo:Respawn(nil,true) +end +else +self:RTB(self.airbase) +end +end +elseif self:IsRescuing()then +end +if not self:IsStopped()then +self:__Status(-30) +end +else +if not self:IsStopped()then +self:E(self.lid.."Rescue helo is NOT alive (and not stopped)!") +self:Stop() +if self.respawn then +self:__Start(5) +end +end +end +end +function RESCUEHELO:onafterRun(From,Event,To) +if self.formation:Is("Stopped")then +local text=string.format("Restarting formation of rescue helo %s.",self.helo:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +self.formation:Start() +end +end +function RESCUEHELO:_TaskRTB() +local carriername=self.carrier:GetName() +local DCSScript={} +DCSScript[#DCSScript+1]=string.format('local mycarrier = UNIT:FindByName(\"%s\") ',carriername) +DCSScript[#DCSScript+1]=string.format('local myhelo = mycarrier:GetState(mycarrier, \"RESCUEHELO_%d\") ',self.uid) +DCSScript[#DCSScript+1]=string.format('myhelo:RTB()') +local DCSTask=CONTROLLABLE.TaskWrappedAction(self,CONTROLLABLE.CommandDoScript(self,table.concat(DCSScript))) +return DCSTask +end +function RESCUEHELO:onafterRescue(From,Event,To,RescueCoord) +local text=string.format("Helo %s is send to rescue mission.",self.helo:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:I(self.lid..text) +local wp={} +local RescueTask={} +RescueTask.id="ControlledTask" +RescueTask.params={} +RescueTask.params.task=self.helo:TaskOrbit(RescueCoord,20,self.rescuespeed) +RescueTask.params.stopCondition={duration=self.rescueduration} +local TaskRTB=self:_TaskRTB() +local speed=self.helo:GetSpeedMax()*0.9 +wp[1]=self.helo:GetCoordinate():WaypointAirTurningPoint(nil,speed,{},"Current Position") +wp[2]=RescueCoord:SetAltitude(50):WaypointAirTurningPoint(nil,speed,{RescueTask,TaskRTB},"Crash Site") +wp[3]=self.airbase:GetCoordinate():SetAltitude(50):WaypointAirTurningPoint(nil,speed,{},"RTB") +self.helo:WayPointInitialize(wp) +self.helo:Route(wp,1) +self.formation:Stop() +end +function RESCUEHELO:onafterRTB(From,Event,To,airbase) +airbase=airbase or self.airbase +local text=string.format("Rescue helo %s is returning to airbase %s.",self.helo:GetName(),airbase:GetName()) +MESSAGE:New(text,10,"DEBUG"):ToAllIf(self.Debug) +self:T(self.lid..text) +if From=="Running"then +self.formation:Stop() +end +self:RouteRTB(airbase) +end +function RESCUEHELO:onafterReturned(From,Event,To,airbase) +if airbase then +local airbasename=airbase:GetName() +self:I(self.lid..string.format("Helo returned to airbase %s",tostring(airbasename))) +else +self:E(self.lid..string.format("WARNING: Helo landed but airbase (EventData.Place) is nil!")) +end +if self.respawn then +self.helo:InitModex(self.modex) +if self.helo and self.helo:IsAlive()then +self:ScheduleOnce(5,self.helo.RespawnAtCurrentAirbase,self.helo) +end +self:__Run(10) +end +end +function RESCUEHELO:onafterStop(From,Event,To) +self.formation:Stop() +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Ejection) +self.CallScheduler:Clear() +if self.helo and self.helo:IsAlive()then +self:I(self.lid.."Stopping FSM and despawning helo.") +self.helo:Destroy() +else +self:I(self.lid.."Stopping FSM. Helo was not alive.") +end +end +function RESCUEHELO:RouteRTB(RTBAirbase,Speed) +local Speed=Speed or self.helo:GetSpeedMax()*0.8 +local coord=self.helo:GetCoordinate() +local PointFrom=coord:WaypointAirTurningPoint(nil,Speed,{},"Current") +local PointLanding=RTBAirbase:GetCoordinate():SetAltitude(20):WaypointAirLanding(Speed,RTBAirbase,{},"Landing") +local Points={PointFrom,PointLanding} +local Template=self.helo:GetTemplate() +Template.route.points=Points +self.helo:InitModex(self.modex) +self.helo=self.helo:Respawn(Template,true) +self.helo:Route(Points,1) +return self +end +ATIS={ +ClassName="ATIS", +lid=nil, +theatre=nil, +airbasename=nil, +airbase=nil, +frequency=nil, +modulation=nil, +power=nil, +radioqueue=nil, +soundpath=nil, +relayunitname=nil, +towerfrequency=nil, +activerunway=nil, +subduration=nil, +metric=nil, +PmmHg=nil, +qnhonly=false, +TDegF=nil, +zuludiff=nil, +zulutimeonly=false, +magvar=nil, +ils={}, +ndbinner={}, +ndbouter={}, +vor=nil, +tacan=nil, +rsbn=nil, +prmg={}, +rwylength=nil, +elevation=nil, +runwaymag={}, +runwaym2t=nil, +windtrue=nil, +altimeterQNH=nil, +usemarker=nil, +markerid=nil, +relHumidity=nil, +ReportmBar=false, +TransmitOnlyWithPlayers=false, +ATISforFARPs=false, +locale="en", +} +ATIS.Alphabet={ +[1]="Alfa", +[2]="Bravo", +[3]="Charlie", +[4]="Delta", +[5]="Echo", +[6]="Delta", +[7]="Echo", +[8]="Foxtrot", +[9]="Golf", +[10]="Hotel", +[11]="India", +[12]="Juliett", +[13]="Kilo", +[14]="Lima", +[15]="Mike", +[16]="November", +[17]="Oscar", +[18]="Papa", +[19]="Quebec", +[20]="Romeo", +[21]="Sierra", +[22]="Tango", +[23]="Uniform", +[24]="Victor", +[25]="Whiskey", +[26]="Xray", +[27]="Yankee", +[28]="Zulu", +} +ATIS.RunwayM2T={ +Caucasus=0, +Nevada=12, +Normandy=-10, +PersianGulf=2, +TheChannel=-10, +Syria=5, +MarianaIslands=2, +Falklands=12, +SinaiMap=5, +Kola=15, +Afghanistan=3, +Iraq=4.4, +GermanyCW=0.1, +} +ATIS.ICAOPhraseology={ +Caucasus=true, +Nevada=false, +Normandy=true, +PersianGulf=true, +TheChannel=true, +Syria=true, +MarianaIslands=true, +Falklands=true, +SinaiMap=true, +Kola=true, +Afghanistan=true, +Iraq=true, +GermanyCW=true, +} +ATIS.Sound={ +ActiveRunway={filename="ActiveRunway.ogg",duration=0.85}, +ActiveRunwayDeparture={filename="ActiveRunwayDeparture.ogg",duration=1.50}, +ActiveRunwayArrival={filename="ActiveRunwayArrival.ogg",duration=1.38}, +AdviceOnInitial={filename="AdviceOnInitial.ogg",duration=2.98}, +Airport={filename="Airport.ogg",duration=0.55}, +Altimeter={filename="Altimeter.ogg",duration=0.91}, +At={filename="At.ogg",duration=0.32}, +CloudBase={filename="CloudBase.ogg",duration=0.69}, +CloudCeiling={filename="CloudCeiling.ogg",duration=0.53}, +CloudsBroken={filename="CloudsBroken.ogg",duration=0.81}, +CloudsFew={filename="CloudsFew.ogg",duration=0.74}, +CloudsNo={filename="CloudsNo.ogg",duration=0.69}, +CloudsNotAvailable={filename="CloudsNotAvailable.ogg",duration=2.64}, +CloudsOvercast={filename="CloudsOvercast.ogg",duration=0.82}, +CloudsScattered={filename="CloudsScattered.ogg",duration=0.89}, +Decimal={filename="Decimal.ogg",duration=0.71}, +DegreesCelsius={filename="DegreesCelsius.ogg",duration=1.08}, +DegreesFahrenheit={filename="DegreesFahrenheit.ogg",duration=1.07}, +DewPoint={filename="DewPoint.ogg",duration=0.59}, +Dust={filename="Dust.ogg",duration=0.37}, +Elevation={filename="Elevation.ogg",duration=0.92}, +EndOfInformation={filename="EndOfInformation.ogg",duration=1.24}, +Feet={filename="Feet.ogg",duration=0.34}, +Fog={filename="Fog.ogg",duration=0.41}, +Gusting={filename="Gusting.ogg",duration=0.58}, +HectoPascal={filename="HectoPascal.ogg",duration=0.92}, +Hundred={filename="Hundred.ogg",duration=0.53}, +ILSFrequency={filename="ILSFrequency.ogg",duration=1.30}, +InchesOfMercury={filename="InchesOfMercury.ogg",duration=1.26}, +Information={filename="Information.ogg",duration=0.99}, +InnerNDBFrequency={filename="InnerNDBFrequency.ogg",duration=1.69}, +Kilometers={filename="Kilometers.ogg",duration=0.93}, +Knots={filename="Knots.ogg",duration=0.46}, +Left={filename="Left.ogg",duration=0.41}, +MegaHertz={filename="MegaHertz.ogg",duration=0.83}, +Meters={filename="Meters.ogg",duration=0.55}, +MetersPerSecond={filename="MetersPerSecond.ogg",duration=1.03}, +Miles={filename="Miles.ogg",duration=0.44}, +MillimetersOfMercury={filename="MillimetersOfMercury.ogg",duration=1.59}, +Minus={filename="Minus.ogg",duration=0.55}, +N0={filename="N-0.ogg",duration=0.52}, +N1={filename="N-1.ogg",duration=0.35}, +N2={filename="N-2.ogg",duration=0.41}, +N3={filename="N-3.ogg",duration=0.34}, +N4={filename="N-4.ogg",duration=0.37}, +N5={filename="N-5.ogg",duration=0.40}, +N6={filename="N-6.ogg",duration=0.46}, +N7={filename="N-7.ogg",duration=0.52}, +N8={filename="N-8.ogg",duration=0.36}, +N9={filename="N-9.ogg",duration=0.51}, +NauticalMiles={filename="NauticalMiles.ogg",duration=0.93}, +None={filename="None.ogg",duration=0.33}, +OuterNDBFrequency={filename="OuterNDBFrequency.ogg",duration=1.70}, +PRMGChannel={filename="PRMGChannel.ogg",duration=1.27}, +QFE={filename="QFE.ogg",duration=0.90}, +QNH={filename="QNH.ogg",duration=0.94}, +Rain={filename="Rain.ogg",duration=0.35}, +Right={filename="Right.ogg",duration=0.31}, +RSBNChannel={filename="RSBNChannel.ogg",duration=1.26}, +RunwayLength={filename="RunwayLength.ogg",duration=0.81}, +Snow={filename="Snow.ogg",duration=0.40}, +SnowStorm={filename="SnowStorm.ogg",duration=0.73}, +StatuteMiles={filename="StatuteMiles.ogg",duration=0.90}, +SunriseAt={filename="SunriseAt.ogg",duration=0.82}, +SunsetAt={filename="SunsetAt.ogg",duration=0.87}, +TACANChannel={filename="TACANChannel.ogg",duration=0.81}, +Temperature={filename="Temperature.ogg",duration=0.70}, +Thousand={filename="Thousand.ogg",duration=0.58}, +ThunderStorm={filename="ThunderStorm.ogg",duration=0.79}, +TimeLocal={filename="TimeLocal.ogg",duration=0.83}, +TimeZulu={filename="TimeZulu.ogg",duration=0.83}, +TowerFrequency={filename="TowerFrequency.ogg",duration=1.05}, +Visibilty={filename="Visibility.ogg",duration=1.16}, +VORFrequency={filename="VORFrequency.ogg",duration=1.28}, +WeatherPhenomena={filename="WeatherPhenomena.ogg",duration=1.09}, +WindFrom={filename="WindFrom.ogg",duration=0.63}, +Zulu={filename="Zulu.ogg",duration=0.51}, +} +ATIS.Messages={ +EN= +{ +HOURS="hours", +TIME="Hours", +NOCLOUDINFO="Cloud coverage information not available", +OVERCAST="Overcast", +BROKEN="Broken clouds", +SCATTERED="Scattered clouds", +FEWCLOUDS="Few clouds", +NOCLOUDS="No clouds", +AIRPORT="Airport", +INFORMATION="Information", +SUNRISEAT="Sunrise at %s local time", +SUNSETAT="Sunset at %s local time", +WINDFROMMS="Wind from %s at %s m/s", +WINDFROMKNOTS="Wind from %s at %s knots", +GUSTING="gusting", +VISIKM="Visibility %s km", +VISISM="Visibility %s SM", +RAIN="rain", +TSTORM="thunderstorm", +SNOW="snow", +SSTROM="snowstorm", +FOG="fog", +DUST="dust", +PHENOMENA="Weather phenomena", +CLOUDBASEM="Cloud base %s, ceiling %s meters", +CLOUDBASEFT="Cloud base %s, ceiling %s feet", +TEMPERATURE="Temperature", +DEWPOINT="Dew point", +ALTIMETER="Altimeter", +ACTIVERUN="Active runway departure", +ACTIVELANDING="Active runway arrival", +LEFT="Left", +RIGHT="Right", +RWYLENGTH="Runway length", +METERS="meters", +FEET="feet", +ELEVATION="Elevation", +TOWERFREQ="Tower frequency", +ILSFREQ="ILS frequency", +OUTERNDB="Outer NDB frequency", +INNERNDB="Inner NDB frequency", +VORFREQ="VOR frequency", +VORFREQTTS="V O R frequency", +TACANCH="TACAN channel %dX Ray", +RSBNCH="RSBN channel", +PRMGCH="PRMG channel", +ADVISE="Advise on initial contact, you have information", +STATUTE="statute miles", +DEGREES="degrees Celsius", +FAHRENHEIT="degrees Fahrenheit", +INCHHG="inches of Mercury", +MMHG="millimeters of Mercury", +HECTO="hectopascals", +METERSPER="meters per second", +TACAN="tackan", +FARP="farp", +DELIMITER="point", +}, +DE= +{ +HOURS="Uhr", +TIME="Zeit", +NOCLOUDINFO="Informationen über Wolken nicht verfuegbar", +OVERCAST="Geschlossene Wolkendecke", +BROKEN="Stark bewoelkt", +SCATTERED="Bewoelkt", +FEWCLOUDS="Leicht bewoelkt", +NOCLOUDS="Klar", +AIRPORT="Flughafen", +INFORMATION="Information", +SUNRISEAT="Sonnenaufgang um %s lokaler Zeit", +SUNSETAT="Sonnenuntergang um %s lokaler Zeit", +WINDFROMMS="Wind aus %s mit %s m/s", +WINDFROMKNOTS="Wind aus %s mit %s Knoten", +GUSTING="boeig", +VISIKM="Sichtweite %s km", +VISISM="Sichtweite %s Meilen", +RAIN="Regen", +TSTORM="Gewitter", +SNOW="Schnee", +SSTROM="Schneesturm", +FOG="Nebel", +DUST="Staub", +PHENOMENA="Wetter Phaenomene", +CLOUDBASEM="Wolkendecke von %s bis %s Meter", +CLOUDBASEFT="Wolkendecke von %s bis %s Fuß", +TEMPERATURE="Temperatur", +DEWPOINT="Taupunkt", +ALTIMETER="Hoehenmesser", +ACTIVERUN="Aktive Startbahn", +ACTIVELANDING="Aktive Landebahn", +LEFT="Links", +RIGHT="Rechts", +RWYLENGTH="Startbahn", +METERS="Meter", +FEET="Fuß", +ELEVATION="Hoehe", +TOWERFREQ="Kontrollturm Frequenz", +ILSFREQ="ILS Frequenz", +OUTERNDB="Aeussere NDB Frequenz", +INNERNDB="Innere NDB Frequenz", +VORFREQ="VOR Frequenz", +VORFREQTTS="V O R Frequenz", +TACANCH="TACAN Kanal %d Xaver", +RSBNCH="RSBN Kanal", +PRMGCH="PRMG Kanal", +ADVISE="Hinweis bei Erstkontakt, Sie haben Informationen", +STATUTE="englische Meilen", +DEGREES="Grad Celsius", +FAHRENHEIT="Grad Fahrenheit", +INCHHG="Inches H G", +MMHG="Millimeter H G", +HECTO="Hektopascal", +METERSPER="Meter pro Sekunde", +TACAN="Tackan", +FARP="Farp", +DELIMITER="Komma", +}, +ES= +{ +HOURS="horas", +TIME="horas", +NOCLOUDINFO="Información sobre capa de nubes no disponible", +OVERCAST="Nublado", +BROKEN="Nubes rotas", +SCATTERED="Nubes dispersas", +FEWCLOUDS="Ligeramente nublado", +NOCLOUDS="Despejado", +AIRPORT="Aeropuerto", +INFORMATION="Informacion", +SUNRISEAT="Amanecer a las %s hora local", +SUNSETAT="Puesta de sol a las %s hora local", +WINDFROMMS="Viento procedente de %s con %s m/s", +WINDFROMKNOTS="Viento de %s con %s nudos", +GUSTING="ráfagas", +VISIKM="Visibilidad %s km", +VISISM="Visibilidad %s millas", +RAIN="Lluvia", +TSTORM="Tormenta", +SNOW="Nieve", +SSTROM="Tormenta de nieve", +FOG="Niebla", +DUST="Polvo", +PHENOMENA="Fenómenos meteorológicos", +CLOUDBASEM="Capa de nubes de %s a %s metros", +CLOUDBASEFT="Capa de nubes de %s a %s pies", +TEMPERATURE="Temperatura", +DEWPOINT="Punto de rocio", +ALTIMETER="Altímetro", +ACTIVERUN="Pista activa", +ACTIVELANDING="Pista de aterrizaje activa", +LEFT="Izquierda", +RIGHT="Derecha", +RWYLENGTH="Longitud de pista", +METERS="Metro", +FEET="Pie", +ELEVATION="Elevación", +TOWERFREQ="Frecuencias de la torre de control", +ILSFREQ="Fecuencia ILS", +OUTERNDB="Frecuencia NDB externa", +INNERNDB="Frecuencia NDB interior", +VORFREQ="Frecuencia VOR", +VORFREQTTS="Frecuencia V O R", +TACANCH="Canal TACAN %d Xaver", +RSBNCH="Canal RSBN", +PRMGCH="Canal PRMG", +ADVISE="Avise en el contacto inicial a torre de que tiene la informacion", +STATUTE="Millas inglesas", +DEGREES="Grados Celsius", +FAHRENHEIT="Grados Fahrenheit", +INCHHG="Pulgadas de mercurio", +MMHG="Milímeteros de Mercurio", +HECTO="Hectopascales", +METERSPER="Metros por segundo", +TACAN="Tacan", +FARP="Farp", +DELIMITER="Punto", +}, +FR={ +HOURS="Heures", +TIME="Temps", +NOCLOUDINFO="Informations sur la couverture nuageuse non disponibles", +OVERCAST="Ciel couvert", +BROKEN="Nuages fragmentés", +SCATTERED="Nuages épars", +FEWCLOUDS="Nuages rares", +NOCLOUDS="Clair", +AIRPORT="Aéroport", +INFORMATION="Information", +SUNRISEAT="Levé du soleil à %s heure locale", +SUNSETAT="Couché du soleil à %s heure locale", +WINDFROMMS="Vent du %s pour %s mètres par seconde", +WINDFROMKNOTS="Vent du %s pour %s noeuds", +GUSTING="Rafale de vent", +VISIKM="Visibilité %s kilomètres", +VISISM="Visibilité %s Miles", +RAIN="Pluie", +TSTORM="Orage", +SNOW="Neige", +SSTROM="Tempête de neige", +FOG="Brouillard", +DUST="Poussière", +PHENOMENA="Phénomène météorologique", +CLOUDBASEM="Couverture nuageuse de %s à %s mètres", +CLOUDBASEFT="Couverture nuageuse de %s à %s pieds", +TEMPERATURE="Température", +DEWPOINT="Point de rosée", +ALTIMETER="Altimètre", +ACTIVERUN="Décollages piste", +ACTIVELANDING="Atterrissages piste", +LEFT="Gauche", +RIGHT="Droite", +RWYLENGTH="Longueur de piste", +METERS="Mètre", +FEET="Pieds", +ELEVATION="Hauteur", +TOWERFREQ="Fréquences de la tour", +ILSFREQ="Fréquences ILS", +OUTERNDB="Fréquences Outer NDB", +INNERNDB="Fréquences Inner NDB", +VORFREQ="Fréquences VOR", +VORFREQTTS="Fréquences V O R", +TACANCH="Canal TACAN %d", +RSBNCH="Canal RSBN", +PRMGCH="Canal PRMG", +ADVISE="Informez le contrôle que vous avez copié l'information", +STATUTE="Statute Miles", +DEGREES="Degré celcius", +FAHRENHEIT="Degré Fahrenheit", +INCHHG="Pouces de mercure", +MMHG="Millimètres de mercure", +HECTO="Hectopascals", +METERSPER="Mètres par seconde", +TACAN="TAKAN", +FARP="FARPE", +DELIMITER="Décimal", +} +} +ATIS.locale="en" +_ATIS={} +ATIS.version="1.0.1" +function ATIS:New(AirbaseName,Frequency,Modulation) +local self=BASE:Inherit(self,FSM:New()) +self.airbasename=AirbaseName +self.airbase=AIRBASE:FindByName(AirbaseName) +if self.airbase==nil then +self:E("ERROR: Airbase %s for ATIS could not be found!",tostring(AirbaseName)) +return nil +end +self.frequency=Frequency or 143.00 +self.modulation=Modulation or 0 +self.theatre=env.mission.theatre +self.lid=string.format("ATIS %s | ",self.airbasename) +_ATIS[#_ATIS+1]=self +self:SetSoundfilesPath() +self:SetSubtitleDuration() +self:SetMagneticDeclination() +self:SetRunwayCorrectionMagnetic2True() +self:SetRadioPower() +self:SetAltimeterQNH(true) +self:SetMapMarks(false) +self:SetRelativeHumidity() +self:SetQueueUpdateTime() +self:SetReportmBar(false) +self:_InitLocalization() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Broadcast","*") +self:AddTransition("*","CheckQueue","*") +self:AddTransition("*","Report","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function ATIS:_InitLocalization() +self:T(self.lid.."_InitLocalization") +self.gettext=TEXTANDSOUND:New("ATIS","en") +self.locale="en" +for locale,table in pairs(self.Messages)do +local Locale=string.lower(tostring(locale)) +self:T("**** Adding locale: "..Locale) +for ID,Text in pairs(table)do +self:T(string.format('Adding ID %s',tostring(ID))) +self.gettext:AddEntry(Locale,tostring(ID),Text) +end +end +return self +end +function ATIS:SetLocale(locale) +self.locale=string.lower(locale) +return self +end +function ATIS:SetSoundfilesPath(pathMain,pathAirports,pathNato) +self.soundpath=tostring(pathMain or"ATIS Soundfiles/") +if pathAirports==nil then +self.soundpathAirports=self.soundpath..env.mission.theatre.."/" +else +self.soundpathAirports=pathAirports +end +if pathNato==nil then +self.soundpathNato=self.soundpath.."NATO Alphabet/" +else +self.soundpathNato=pathNato +end +self:T(self.lid..string.format("Setting sound files path to %s",self.soundpath)) +return self +end +function ATIS:SetSoundfilesInfo(csvfile) +local function getSound(filename) +for key,_soundfile in pairs(self.Sound)do +local soundfile=_soundfile +if filename==soundfile.filename then +return soundfile +end +end +return nil +end +local data=UTILS.ReadCSV(csvfile) +if data then +for i,sound in pairs(data)do +local soundfile=getSound(sound.filename..".ogg") +if soundfile then +soundfile.duration=tonumber(sound.duration) +else +self:E(string.format("ERROR: Could not get info for sound file %s",sound.filename)) +end +end +else +self:E(string.format("ERROR: Could not read sound csv file!")) +end +return self +end +function ATIS:SetRadioRelayUnitName(unitname) +self.relayunitname=unitname +self:T(self.lid..string.format("Setting radio relay unit to %s",self.relayunitname)) +return self +end +function ATIS:SetTowerFrequencies(freqs) +if type(freqs)=="table"then +else +freqs={freqs} +end +self.towerfrequency=freqs +return self +end +function ATIS:SetTransmitOnlyWithPlayers(Switch) +self.TransmitOnlyWithPlayers=Switch +if self.msrsQ then +self.msrsQ:SetTransmitOnlyWithPlayers(Switch) +end +return self +end +function ATIS:SetActiveRunway(runway) +self.activerunway=tostring(runway) +local prefer=nil +if string.find(string.lower(runway),"l")then +prefer=true +elseif string.find(string.lower(runway),"r")then +prefer=false +end +self.airbase:SetActiveRunway(runway,prefer) +return self +end +function ATIS:SetActiveRunwayLanding(runway,preferleft) +self.airbase:SetActiveRunwayLanding(runway,preferleft) +return self +end +function ATIS:SetActiveRunwayTakeoff(runway,preferleft) +self.airbase:SetActiveRunwayTakeoff(runway,preferleft) +return self +end +function ATIS:SetRunwayLength() +self.rwylength=true +return self +end +function ATIS:SetRunwayLength() +self.rwylength=true +return self +end +function ATIS:SetElevation() +self.elevation=true +return self +end +function ATIS:SetRadioPower(power) +self.power=power or 100 +return self +end +function ATIS:SetMapMarks(switch) +if switch==nil or switch==true then +self.usemarker=true +else +self.usemarker=false +end +return self +end +function ATIS:GetSRSText() +return self.SRSText +end +function ATIS:SetRunwayHeadingsMagnetic(headings) +if type(headings)=="table"then +else +headings={headings} +end +for _,heading in pairs(headings)do +if type(heading)=="number"then +heading=string.format("%02d",heading) +end +self:T(self.lid..string.format("Adding user specified magnetic runway heading %s",heading)) +table.insert(self.runwaymag,heading) +local h=self:GetRunwayWithoutLR(heading) +local head2=tonumber(h)-18 +if head2<0 then +head2=head2+36 +end +head2=string.format("%02d",head2) +local left=self:GetRunwayLR(heading) +if left==true then +head2=head2.."L" +elseif left==false then +head2=head2.."R" +end +self:T(self.lid..string.format("Adding user specified magnetic runway heading %s (inverse)",head2)) +table.insert(self.runwaymag,head2) +end +return self +end +function ATIS:SetSubtitleDuration(duration) +self.subduration=tonumber(duration or 10) +return self +end +function ATIS:SetMetricUnits() +self.metric=true +return self +end +function ATIS:SetImperialUnits() +self.metric=false +return self +end +function ATIS:SetPressureMillimetersMercury() +self.PmmHg=true +return self +end +function ATIS:SetTemperatureFahrenheit() +self.TDegF=true +return self +end +function ATIS:SetRelativeHumidity(Humidity) +self.relHumidity=Humidity or 50 +return self +end +function ATIS:SetAltimeterQNH(switch) +if switch==true or switch==nil then +self.altimeterQNH=true +else +self.altimeterQNH=false +end +return self +end +function ATIS:SetReportmBar(switch) +if switch==true or switch==nil then +self.ReportmBar=true +else +self.ReportmBar=false +end +return self +end +function ATIS:SetAdditionalInformation(text) +self.AdditionalInformation=text +return self +end +function ATIS:ReportQNHOnly() +self.qnhonly=true +return self +end +function ATIS:SetMagneticDeclination(magvar) +self.magvar=magvar or UTILS.GetMagneticDeclination() +return self +end +function ATIS:SetRunwayCorrectionMagnetic2True(correction) +self.runwaym2t=correction or ATIS.RunwayM2T[UTILS.GetDCSMap()] +return self +end +function ATIS:SetReportWindTrue() +self.windtrue=true +return self +end +function ATIS:SetZuluTimeDifference(delta) +self.zuludiff=delta +return self +end +function ATIS:ReportZuluTimeOnly() +self.zulutimeonly=true +return self +end +function ATIS:AddILS(frequency,runway) +local ils={} +ils.frequency=tonumber(frequency) +ils.runway=runway and tostring(runway)or nil +table.insert(self.ils,ils) +return self +end +function ATIS:SetVOR(frequency) +self.vor=frequency +return self +end +function ATIS:AddNDBouter(frequency,runway) +local ndb={} +ndb.frequency=tonumber(frequency) +ndb.runway=runway and tostring(runway)or nil +table.insert(self.ndbouter,ndb) +return self +end +function ATIS:AddNDBinner(frequency,runway) +local ndb={} +ndb.frequency=tonumber(frequency) +ndb.runway=runway and tostring(runway)or nil +table.insert(self.ndbinner,ndb) +return self +end +function ATIS:SetTACAN(channel) +self.tacan=channel +return self +end +function ATIS:SetRSBN(channel) +self.rsbn=channel +return self +end +function ATIS:AddPRMG(channel,runway) +local ndb={} +ndb.frequency=tonumber(channel) +ndb.runway=runway and tostring(runway)or nil +table.insert(self.prmg,ndb) +return self +end +function ATIS:MarkRunways(markall) +local airbases=AIRBASE.GetAllAirbases() +for _,_airbase in pairs(airbases)do +local airbase=_airbase +if(not markall and airbase:GetName()==self.airbasename)or markall==true then +airbase:GetRunwayData(self.runwaym2t,true) +end +end +end +function ATIS:SetSRS(PathToSRS,Gender,Culture,Voice,Port,GoogleKey) +self.useSRS=true +local path=PathToSRS or MSRS.path +local gender=Gender or MSRS.gender +local culture=Culture or MSRS.culture +local voice=Voice or MSRS.voice +local port=Port or MSRS.port or 5002 +self.msrs=MSRS:New(path,self.frequency,self.modulation) +self.msrs:SetGender(gender) +self.msrs:SetCulture(culture) +self.msrs:SetPort(port) +self.msrs:SetCoalition(self:GetCoalition()) +self.msrs:SetLabel("ATIS") +if GoogleKey then +self.msrs:SetProviderOptionsGoogle(GoogleKey,GoogleKey) +self.msrs:SetProvider(MSRS.Provider.GOOGLE) +end +if(not GoogleKey)and self.msrs:GetProvider()==MSRS.Provider.GOOGLE then +voice=Voice or MSRS.poptions.gcloud.voice +end +self.msrs:SetVoice(voice) +self.msrs:SetCoordinate(self.airbase:GetCoordinate()) +self.msrsQ=MSRSQUEUE:New("ATIS") +self.msrsQ:SetTransmitOnlyWithPlayers(self.TransmitOnlyWithPlayers) +if self.dTQueueCheck<=10 then +self:SetQueueUpdateTime(90) +end +return self +end +function ATIS:SetSRSProvider(Provider) +self:T(self.lid.."SetSRSProvider") +if self.msrs then +self.msrs:SetProvider(Provider) +else +MESSAGE:New(self.lid.."Set up SRS first before trying to change the provider!",30,"ATIS"):ToAll():ToLog() +end +return self +end +function ATIS:SetQueueUpdateTime(TimeInterval) +self.dTQueueCheck=TimeInterval or 5 +end +function ATIS:GetCoalition() +local coal=self.airbase and self.airbase:GetCoalition()or nil +return coal +end +function ATIS:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:T("Airbase category is "..self.airbase:GetAirbaseCategory()) +if self.airbase:GetAirbaseCategory()==Airbase.Category.SHIP then +self:E(self.lid..string.format("ERROR: Cannot start ATIS for airbase %s! Only AIRDROMES are supported but NOT SHIPS.",self.airbasename)) +return +end +if self.airbase:GetAirbaseCategory()==Airbase.Category.HELIPAD then +self:E(self.lid..string.format("EXPERIMENTAL: Starting ATIS for Helipad %s! SRS must be ON",self.airbasename)) +self.ATISforFARPs=true +self.useSRS=true +end +if type(self.frequency)=="table"then +local frequency=table.concat(self.frequency,"/") +local modulation=self.modulation +if type(self.modulation)=="table"then +modulation=table.concat(self.modulation,"/") +end +self:I(self.lid..string.format("Starting ATIS v%s for airbase %s on %s MHz Modulation=%s",ATIS.version,self.airbasename,frequency,modulation)) +else +self:I(self.lid..string.format("Starting ATIS v%s for airbase %s on %.3f MHz Modulation=%d",ATIS.version,self.airbasename,self.frequency,self.modulation)) +end +if not self.useSRS then +self.radioqueue=RADIOQUEUE:New(self.frequency,self.modulation,string.format("ATIS %s",self.airbasename)) +self.radioqueue:SetSenderCoordinate(self.airbase:GetCoordinate()) +self.radioqueue:SetSenderUnitName(self.relayunitname) +self.radioqueue:SetRadioPower(self.power) +self.radioqueue:SetDigit(0,self.Sound.N0.filename,self.Sound.N0.duration,self.soundpath) +self.radioqueue:SetDigit(1,self.Sound.N1.filename,self.Sound.N1.duration,self.soundpath) +self.radioqueue:SetDigit(2,self.Sound.N2.filename,self.Sound.N2.duration,self.soundpath) +self.radioqueue:SetDigit(3,self.Sound.N3.filename,self.Sound.N3.duration,self.soundpath) +self.radioqueue:SetDigit(4,self.Sound.N4.filename,self.Sound.N4.duration,self.soundpath) +self.radioqueue:SetDigit(5,self.Sound.N5.filename,self.Sound.N5.duration,self.soundpath) +self.radioqueue:SetDigit(6,self.Sound.N6.filename,self.Sound.N6.duration,self.soundpath) +self.radioqueue:SetDigit(7,self.Sound.N7.filename,self.Sound.N7.duration,self.soundpath) +self.radioqueue:SetDigit(8,self.Sound.N8.filename,self.Sound.N8.duration,self.soundpath) +self.radioqueue:SetDigit(9,self.Sound.N9.filename,self.Sound.N9.duration,self.soundpath) +self.radioqueue:Start(1,0.1) +end +self:HandleEvent(EVENTS.BaseCaptured) +self:__Status(-2) +self:__CheckQueue(-3) +end +function ATIS:onafterStatus(From,Event,To) +self:T({From,Event,To}) +local fsmstate=self:GetState() +local relayunitstatus="N/A" +if self.relayunitname then +local ru=UNIT:FindByName(self.relayunitname) +if ru then +relayunitstatus=tostring(ru:IsAlive()) +end +end +local text="" +if type(self.frequency)=="table"then +local frequency=table.concat(self.frequency,"/") +local modulation=self.modulation +if type(self.modulation)=="table"then +modulation=table.concat(self.modulation,"/") +end +text=string.format("State %s: Freq=%s MHz %s",fsmstate,frequency,modulation) +else +text=string.format("State %s: Freq=%.3f MHz %s",fsmstate,self.frequency,UTILS.GetModulationName(self.modulation)) +end +if self.useSRS then +text=text..string.format(", SRS path=%s (%s), gender=%s, culture=%s, voice=%s",tostring(self.msrs.path),tostring(self.msrs.port),tostring(self.msrs.gender),tostring(self.msrs.culture),tostring(self.msrs.voice)) +else +text=text..string.format(", Relay unit=%s (alive=%s)",tostring(self.relayunitname),relayunitstatus) +end +self:T(self.lid..text) +if not self:Is("Stopped")then +self:__Status(60) +end +end +function ATIS:onafterCheckQueue(From,Event,To) +self:T({From,Event,To}) +if not self:Is("Stopped")then +if self.useSRS then +self:Broadcast() +else +if#self.radioqueue.queue==0 then +self:T(self.lid..string.format("Radio queue empty. Repeating message.")) +self:Broadcast() +else +self:T2(self.lid..string.format("Radio queue %d transmissions queued.",#self.radioqueue.queue)) +end +end +self:__CheckQueue(math.abs(self.dTQueueCheck)) +end +end +function ATIS:onafterBroadcast(From,Event,To) +self:T({From,Event,To}) +local coord=self.airbase:GetCoordinate() +local height=coord:GetLandHeight() +local qfe=coord:GetPressure(height) +local qnh=coord:GetPressure(0) +if self.altimeterQNH then +local L=-0.0065 +local R=8.31446 +local g=9.80665 +local M=0.0289644 +local T0=coord:GetTemperature(0)+273.15 +local TS=288.15 +local q=qnh*100 +local P=q*(1+L*height/T0)^(-g*M/(R*L)) +local Q=P/(1+L*height/TS)^(-g*M/(R*L)) +local A=(T0/L)*((P/q)^(((-R*L)/(g*M)))-1) +self:T2(self.lid..string.format("height=%.1f, A=%.1f, T0=%.1f, QFE=%.1f, QNH=%.1f, P=%.1f, Q=%.1f hPa = %.2f",height,A,T0-273.15,qfe,qnh,P/100,Q/100,UTILS.hPa2inHg(Q/100))) +qnh=Q/100 +end +local mBarqnh=qnh +local mBarqfe=qfe +if self.PmmHg then +qfe=UTILS.hPa2mmHg(qfe) +qnh=UTILS.hPa2mmHg(qnh) +else +if not self.metric then +qfe=UTILS.hPa2inHg(qfe) +qnh=UTILS.hPa2inHg(qnh) +end +end +local QFE=UTILS.Split(string.format("%.2f",qfe),".") +local QNH=UTILS.Split(string.format("%.2f",qnh),".") +if self.PmmHg then +QFE=UTILS.Split(string.format("%.1f",qfe),".") +QNH=UTILS.Split(string.format("%.1f",qnh),".") +else +if self.metric then +QFE=UTILS.Split(string.format("%.1f",qfe),".") +QNH=UTILS.Split(string.format("%.1f",qnh),".") +end +end +local windFrom,windSpeed=coord:GetWind(height+10) +local magvar=self.magvar +if self.windtrue then +magvar=0 +end +windFrom=windFrom-magvar +if windFrom<0 then +windFrom=windFrom+360 +end +local WINDFROM=string.format("%03d",windFrom) +local WINDSPEED=string.format("%d",UTILS.MpsToKnots(windSpeed)) +if WINDFROM=="000"then +WINDFROM="360" +end +if self.metric then +WINDSPEED=string.format("%d",windSpeed) +end +local runwayLanding,rwyLandingLeft +local runwayTakeoff,rwyTakeoffLeft +if self.airbase:GetAirbaseCategory()==Airbase.Category.HELIPAD then +runwayLanding,rwyLandingLeft="PAD 01",false +runwayTakeoff,rwyTakeoffLeft="PAD 02",false +else +runwayLanding,rwyLandingLeft=self:GetActiveRunway() +runwayTakeoff,rwyTakeoffLeft=self:GetActiveRunway(true) +end +local time=timer.getAbsTime() +if self.zuludiff then +time=time-self.zuludiff*60*60 +else +time=time-UTILS.GMTToLocalTimeDifference()*60*60 +end +if time<0 then +time=24*60*60+time +end +local clock=UTILS.SecondsToClock(time) +local zulu=UTILS.Split(clock,":") +local ZULU=string.format("%s%s",zulu[1],zulu[2]) +local hours=self.gettext:GetEntry("TIME",self.locale) +if self.useSRS then +ZULU=string.format("%s %s",hours,zulu[1]) +end +local NATO=ATIS.Alphabet[tonumber(zulu[1])+1] +self:T3(string.format("clock=%s",tostring(clock))) +self:T3(string.format("zulu1=%s",tostring(zulu[1]))) +self:T3(string.format("zulu2=%s",tostring(zulu[2]))) +self:T3(string.format("ZULU =%s",tostring(ZULU))) +self:T3(string.format("NATO =%s",tostring(NATO))) +local hours=self.gettext:GetEntry("HOURS",self.locale) +local sunrise=coord:GetSunrise() +local SUNRISE="no time" +local NorthPolar=true +if tostring(sunrise)~="N/S"and tostring(sunrise)~="N/R"then +sunrise=UTILS.Split(sunrise,":") +SUNRISE=string.format("%s%s",sunrise[1],sunrise[2]) +if self.useSRS then +SUNRISE=string.format("%s %s %s",sunrise[1],sunrise[2],hours) +end +NorthPolar=false +end +local sunset=coord:GetSunset() +local SUNSET="no time" +if tostring(sunset)~="N/S"and tostring(sunset)~="N/R"then +sunset=UTILS.Split(sunset,":") +SUNSET=string.format("%s%s",sunset[1],sunset[2]) +if self.useSRS then +SUNSET=string.format("%s %s %s",sunset[1],sunset[2],hours) +end +NorthPolar=false +end +local temperature=coord:GetTemperature(height+5) +local dewpoint=temperature-(100-self.relHumidity)/5 +if self.TDegF then +temperature=UTILS.CelsiusToFahrenheit(temperature) +dewpoint=UTILS.CelsiusToFahrenheit(dewpoint) +end +local TEMPERATURE=string.format("%d",math.abs(temperature)) +local DEWPOINT=string.format("%d",math.abs(dewpoint)) +local clouds,visibility,turbulence,dustdens,static=self:GetMissionWeather() +local dust=false +local fog=false +if dustdens then +if UTILS.FeetToMeters(1500)>height+25 then +dust=true +visibility=math.min(visibility,dustdens) +end +else +local fvis=world.weather.getFogVisibilityDistance() +local fheight=world.weather.getFogThickness() +if fvis>0 and fheight>height+25 then +fog=true +visibility=math.min(visibility,fvis) +end +end +local VISIBILITY="" +if self.metric then +local reportedviz=UTILS.Round(visibility/1000) +if reportedviz>10 then +reportedviz=10 +end +VISIBILITY=string.format("%d",reportedviz) +else +local reportedviz=UTILS.Round(UTILS.MetersToSM(visibility)) +if reportedviz>10 then +reportedviz=10 +end +VISIBILITY=string.format("%d",reportedviz) +end +local cloudbase=clouds.base +local cloudceil=clouds.base+clouds.thickness +local clouddens=clouds.density +local cloudspreset=clouds.preset or"Nothing" +local precepitation=0 +if cloudspreset:find("RainyPreset1")then +clouddens=9 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset2")then +clouddens=9 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset3")then +clouddens=9 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset4")then +clouddens=5 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset5")then +clouddens=5 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset6")then +clouddens=5 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("NEWRAINPRESET4")then +clouddens=5 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("RainyPreset")then +clouddens=9 +if temperature>5 then +precepitation=1 +else +precepitation=3 +end +elseif cloudspreset:find("Preset10")then +clouddens=4 +elseif cloudspreset:find("Preset11")then +clouddens=4 +elseif cloudspreset:find("Preset12")then +clouddens=4 +elseif cloudspreset:find("Preset13")then +clouddens=7 +elseif cloudspreset:find("Preset14")then +clouddens=7 +elseif cloudspreset:find("Preset15")then +clouddens=7 +elseif cloudspreset:find("Preset16")then +clouddens=7 +elseif cloudspreset:find("Preset17")then +clouddens=7 +elseif cloudspreset:find("Preset18")then +clouddens=7 +elseif cloudspreset:find("Preset19")then +clouddens=7 +elseif cloudspreset:find("Preset20")then +clouddens=7 +elseif cloudspreset:find("Preset21")then +clouddens=9 +elseif cloudspreset:find("Preset22")then +clouddens=9 +elseif cloudspreset:find("Preset23")then +clouddens=9 +elseif cloudspreset:find("Preset24")then +clouddens=9 +elseif cloudspreset:find("Preset25")then +clouddens=9 +elseif cloudspreset:find("Preset26")then +clouddens=9 +elseif cloudspreset:find("Preset27")then +clouddens=9 +elseif cloudspreset:find("Preset1")then +clouddens=1 +elseif cloudspreset:find("Preset2")then +clouddens=1 +elseif cloudspreset:find("Preset3")then +clouddens=4 +elseif cloudspreset:find("Preset4")then +clouddens=4 +elseif cloudspreset:find("Preset5")then +clouddens=4 +elseif cloudspreset:find("Preset6")then +clouddens=4 +elseif cloudspreset:find("Preset7")then +clouddens=4 +elseif cloudspreset:find("Preset8")then +clouddens=4 +elseif cloudspreset:find("Preset9")then +clouddens=4 +else +self:E(string.format("WARNING! Unknown weather preset: %s",tostring(cloudspreset))) +end +local CLOUDBASE=string.format("%d",UTILS.MetersToFeet(cloudbase)) +local CLOUDCEIL=string.format("%d",UTILS.MetersToFeet(cloudceil)) +if self.metric then +CLOUDBASE=string.format("%d",cloudbase) +CLOUDCEIL=string.format("%d",cloudceil) +end +local CLOUDBASE1000,CLOUDBASE0100=self:_GetThousandsAndHundreds(UTILS.MetersToFeet(cloudbase)) +local CLOUDCEIL1000,CLOUDCEIL0100=self:_GetThousandsAndHundreds(UTILS.MetersToFeet(cloudceil)) +if self.metric then +CLOUDBASE1000,CLOUDBASE0100=self:_GetThousandsAndHundreds(cloudbase) +CLOUDCEIL1000,CLOUDCEIL0100=self:_GetThousandsAndHundreds(cloudceil) +end +local CloudCover={} +CloudCover=self.Sound.CloudsNotAvailable +local CLOUDSsub=self.gettext:GetEntry("NOCLOUDINFO",self.locale) +if static then +if clouddens>=9 then +CloudCover=self.Sound.CloudsOvercast +CLOUDSsub=self.gettext:GetEntry("OVERCAST",self.locale) +elseif clouddens>=7 then +CloudCover=self.Sound.CloudsBroken +CLOUDSsub=self.gettext:GetEntry("BROKEN",self.locale) +elseif clouddens>=4 then +CloudCover=self.Sound.CloudsScattered +CLOUDSsub=self.gettext:GetEntry("SCATTERED",self.locale) +elseif clouddens>=1 then +CloudCover=self.Sound.CloudsFew +CLOUDSsub=self.gettext:GetEntry("FEWCLOUDS",self.locale) +else +CLOUDBASE=nil +CLOUDCEIL=nil +CloudCover=self.Sound.CloudsNo +CLOUDSsub=self.gettext:GetEntry("NOCLOUDS",self.locale) +end +end +local subtitle="" +subtitle=string.format("%s",self.airbasename) +if(not self.ATISforFARPs)and self.airbasename:find("AFB")==nil and self.airbasename:find("Airport")==nil +and self.airbasename:find("Airstrip")==nil and self.airbasename:find("airfield")==nil and self.airbasename:find("AB")==nil +and self.airbasename:find("Field")==nil +then +subtitle=subtitle.." "..self.gettext:GetEntry("AIRPORT",self.locale) +end +if not self.useSRS then +self.radioqueue:NewTransmission(string.format("%s.ogg",self.airbasename),3.0,self.soundpathAirports,nil,nil,subtitle,self.subduration) +end +local alltext=subtitle +local information=self.gettext:GetEntry("INFORMATION",self.locale) +subtitle=string.format("%s %s",information,NATO) +local _INFORMATION=subtitle +if not self.useSRS then +self:Transmission(self.Sound.Information,0.5,subtitle) +self.radioqueue:NewTransmission(string.format("%s.ogg",NATO),0.75,self.soundpathNato) +end +alltext=alltext..";\n"..subtitle +subtitle=string.format("%s Zulu",ZULU) +if not self.useSRS then +self.radioqueue:Number2Transmission(ZULU,nil,0.5) +self:Transmission(self.Sound.Zulu,0.2,subtitle) +end +alltext=alltext..";\n"..subtitle +if not self.zulutimeonly then +local sunrise=self.gettext:GetEntry("SUNRISEAT",self.locale) +subtitle=string.format(sunrise,SUNRISE) +if not self.useSRS and NorthPolar==false then +self:Transmission(self.Sound.SunriseAt,0.5,subtitle) +self.radioqueue:Number2Transmission(SUNRISE,nil,0.2) +self:Transmission(self.Sound.TimeLocal,0.2) +end +alltext=alltext..";\n"..subtitle +local sunset=self.gettext:GetEntry("SUNSETAT",self.locale) +subtitle=string.format(sunset,SUNSET) +if not self.useSRS and NorthPolar==false then +self:Transmission(self.Sound.SunsetAt,0.5,subtitle) +self.radioqueue:Number2Transmission(SUNSET,nil,0.5) +self:Transmission(self.Sound.TimeLocal,0.2) +end +alltext=alltext..";\n"..subtitle +end +if self.useSRS then +WINDFROM=string.gsub(WINDFROM,".","%1 ") +end +if self.metric then +local windfrom=self.gettext:GetEntry("WINDFROMMS",self.locale) +subtitle=string.format(windfrom,WINDFROM,WINDSPEED) +else +local windfrom=self.gettext:GetEntry("WINDFROMKNOTS",self.locale) +subtitle=string.format(windfrom,WINDFROM,WINDSPEED) +end +if turbulence>0 then +subtitle=subtitle..", "..self.gettext:GetEntry("GUSTING",self.locale) +end +local _WIND=subtitle +if not self.useSRS then +self:Transmission(self.Sound.WindFrom,1.0,subtitle) +self.radioqueue:Number2Transmission(WINDFROM) +self:Transmission(self.Sound.At,0.2) +self.radioqueue:Number2Transmission(WINDSPEED) +if self.metric then +self:Transmission(self.Sound.MetersPerSecond,0.2) +else +self:Transmission(self.Sound.Knots,0.2) +end +if turbulence>0 then +self:Transmission(self.Sound.Gusting,0.2) +end +end +alltext=alltext..";\n"..subtitle +if self.metric then +local visi=self.gettext:GetEntry("VISIKM",self.locale) +subtitle=string.format(visi,VISIBILITY) +else +local visi=self.gettext:GetEntry("VISISM",self.locale) +subtitle=string.format(visi,VISIBILITY) +end +if not self.useSRS then +self:Transmission(self.Sound.Visibilty,1.0,subtitle) +self.radioqueue:Number2Transmission(VISIBILITY) +if self.metric then +self:Transmission(self.Sound.Kilometers,0.2) +else +self:Transmission(self.Sound.StatuteMiles,0.2) +end +end +alltext=alltext..";\n"..subtitle +subtitle="" +local wp=false +local wpsub="" +if precepitation==1 then +wp=true +wpsub=wpsub.." "..self.gettext:GetEntry("RAIN",self.locale) +elseif precepitation==2 then +if wp then +wpsub=wpsub.."," +end +wpsub=wpsub.." "..self.gettext:GetEntry("TSTORM",self.locale) +wp=true +elseif precepitation==3 then +wpsub=wpsub.." "..self.gettext:GetEntry("SNOW",self.locale) +wp=true +elseif precepitation==4 then +wpsub=wpsub.." "..self.gettext:GetEntry("SSTROM",self.locale) +wp=true +end +if fog then +if wp then +wpsub=wpsub.."," +end +wpsub=wpsub.." "..self.gettext:GetEntry("FOG",self.locale) +wp=true +end +if dust then +if wp then +wpsub=wpsub.."," +end +wpsub=wpsub.." "..self.gettext:GetEntry("DUST",self.locale) +wp=true +end +if wp then +local phenos=self.gettext:GetEntry("PHENOMENA",self.locale) +subtitle=string.format("%s: %s",phenos,wpsub) +if not self.useSRS then +self:Transmission(self.Sound.WeatherPhenomena,1.0,subtitle) +if precepitation==1 then +self:Transmission(self.Sound.Rain,0.5) +elseif precepitation==2 then +self:Transmission(self.Sound.ThunderStorm,0.5) +elseif precepitation==3 then +self:Transmission(self.Sound.Snow,0.5) +elseif precepitation==4 then +self:Transmission(self.Sound.SnowStorm,0.5) +end +if fog then +self:Transmission(self.Sound.Fog,0.5) +end +if dust then +self:Transmission(self.Sound.Dust,0.5) +end +end +alltext=alltext..";\n"..subtitle +end +if not self.useSRS then +self:Transmission(CloudCover,1.0,CLOUDSsub) +end +if CLOUDBASE and static then +local cbase=tostring(tonumber(CLOUDBASE1000)*1000+tonumber(CLOUDBASE0100)*100) +local cceil=tostring(tonumber(CLOUDCEIL1000)*1000+tonumber(CLOUDCEIL0100)*100) +if self.metric then +local cloudbase=self.gettext:GetEntry("CLOUDBASEM",self.locale) +subtitle=string.format(cloudbase,cbase,cceil) +else +local cloudbase=self.gettext:GetEntry("CLOUDBASEFT",self.locale) +subtitle=string.format(cloudbase,cbase,cceil) +end +if not self.useSRS then +self:Transmission(self.Sound.CloudBase,1.0,subtitle) +if tonumber(CLOUDBASE1000)>0 then +self.radioqueue:Number2Transmission(CLOUDBASE1000) +self:Transmission(self.Sound.Thousand,0.1) +end +if tonumber(CLOUDBASE0100)>0 then +self.radioqueue:Number2Transmission(CLOUDBASE0100) +self:Transmission(self.Sound.Hundred,0.1) +end +self:Transmission(self.Sound.CloudCeiling,0.5) +if tonumber(CLOUDCEIL1000)>0 then +self.radioqueue:Number2Transmission(CLOUDCEIL1000) +self:Transmission(self.Sound.Thousand,0.1) +end +if tonumber(CLOUDCEIL0100)>0 then +self.radioqueue:Number2Transmission(CLOUDCEIL0100) +self:Transmission(self.Sound.Hundred,0.1) +end +if self.metric then +self:Transmission(self.Sound.Meters,0.1) +else +self:Transmission(self.Sound.Feet,0.1) +end +end +end +alltext=alltext..";\n"..subtitle +subtitle="" +local temptext=self.gettext:GetEntry("TEMPERATURE",self.locale) +if self.TDegF then +if temperature<0 then +subtitle=string.format("%s -%s °F",temptext,TEMPERATURE) +else +subtitle=string.format("%s %s °F",temptext,TEMPERATURE) +end +else +if temperature<0 then +subtitle=string.format("%s -%s °C",temptext,TEMPERATURE) +else +subtitle=string.format("%s %s °C",temptext,TEMPERATURE) +end +end +local _TEMPERATURE=subtitle +if not self.useSRS then +self:Transmission(self.Sound.Temperature,1.0,subtitle) +if temperature<0 then +self:Transmission(self.Sound.Minus,0.2) +end +self.radioqueue:Number2Transmission(TEMPERATURE) +if self.TDegF then +self:Transmission(self.Sound.DegreesFahrenheit,0.2) +else +self:Transmission(self.Sound.DegreesCelsius,0.2) +end +end +alltext=alltext..";\n"..subtitle +local dewtext=self.gettext:GetEntry("DEWPOINT",self.locale) +if self.TDegF then +if dewpoint<0 then +subtitle=string.format("%s -%s °F",dewtext,DEWPOINT) +else +subtitle=string.format("%s %s °F",dewtext,DEWPOINT) +end +else +if dewpoint<0 then +subtitle=string.format("%s -%s °C",dewtext,DEWPOINT) +else +subtitle=string.format("%s %s °C",dewtext,DEWPOINT) +end +end +local _DEWPOINT=subtitle +if not self.useSRS then +self:Transmission(self.Sound.DewPoint,1.0,subtitle) +if dewpoint<0 then +self:Transmission(self.Sound.Minus,0.2) +end +self.radioqueue:Number2Transmission(DEWPOINT) +if self.TDegF then +self:Transmission(self.Sound.DegreesFahrenheit,0.2) +else +self:Transmission(self.Sound.DegreesCelsius,0.2) +end +end +alltext=alltext..";\n"..subtitle +local altim=self.gettext:GetEntry("ALTIMETER",self.locale) +if self.PmmHg then +if self.qnhonly then +subtitle=string.format("%s %s.%s mmHg",altim,QNH[1],QNH[2]) +else +subtitle=string.format("%s: QNH %s.%s, QFE %s.%s mmHg",altim,QNH[1],QNH[2],QFE[1],QFE[2]) +end +else +if self.metric then +if self.qnhonly then +subtitle=string.format("%s %s.%s hPa",altim,QNH[1],QNH[2]) +else +subtitle=string.format("%s: QNH %s.%s, QFE %s.%s hPa",altim,QNH[1],QNH[2],QFE[1],QFE[2]) +end +else +if self.qnhonly then +subtitle=string.format("%s %s.%s inHg",altim,QNH[1],QNH[2]) +else +subtitle=string.format("%s: QNH %s.%s, QFE %s.%s inHg",altim,QNH[1],QNH[2],QFE[1],QFE[2]) +end +end +end +if self.ReportmBar and not self.metric then +if self.qnhonly then +subtitle=string.format("%s;\n%s %d hPa",subtitle,altim,mBarqnh) +else +subtitle=string.format("%s;\n%s: QNH %d, QFE %d hPa",subtitle,altim,mBarqnh,mBarqfe) +end +end +local _ALTIMETER=subtitle +if not self.useSRS then +self:Transmission(self.Sound.Altimeter,1.0,subtitle) +if not self.qnhonly then +self:Transmission(self.Sound.QNH,0.5) +end +self.radioqueue:Number2Transmission(QNH[1]) +if ATIS.ICAOPhraseology[UTILS.GetDCSMap()]then +self:Transmission(self.Sound.Decimal,0.2) +end +self.radioqueue:Number2Transmission(QNH[2]) +if not self.qnhonly then +self:Transmission(self.Sound.QFE,0.75) +self.radioqueue:Number2Transmission(QFE[1]) +if ATIS.ICAOPhraseology[UTILS.GetDCSMap()]then +self:Transmission(self.Sound.Decimal,0.2) +end +self.radioqueue:Number2Transmission(QFE[2]) +end +if self.PmmHg then +self:Transmission(self.Sound.MillimetersOfMercury,0.1) +else +if self.metric then +self:Transmission(self.Sound.HectoPascal,0.1) +else +self:Transmission(self.Sound.InchesOfMercury,0.1) +end +end +end +alltext=alltext..";\n"..subtitle +local _RUNACT +if not self.ATISforFARPs then +local subtitle="" +if runwayLanding and runwayLanding~=runwayTakeoff then +local actrun=self.gettext:GetEntry("ACTIVELANDING",self.locale) +subtitle=string.format("%s %s",actrun,runwayLanding) +if rwyLandingLeft==true then +subtitle=subtitle.." "..self.gettext:GetEntry("LEFT",self.locale) +elseif rwyLandingLeft==false then +subtitle=subtitle.." "..self.gettext:GetEntry("RIGHT",self.locale) +end +alltext=alltext..";\n"..subtitle +if not self.useSRS then +self:Transmission(self.Sound.ActiveRunwayArrival,1.0,subtitle) +self.radioqueue:Number2Transmission(runwayLanding) +if rwyLandingLeft==true then +self:Transmission(self.Sound.Left,0.2) +elseif rwyLandingLeft==false then +self:Transmission(self.Sound.Right,0.2) +end +end +end +if runwayTakeoff then +local actrun=self.gettext:GetEntry("ACTIVERUN",self.locale) +subtitle=string.format("%s %s",actrun,runwayTakeoff) +if rwyTakeoffLeft==true then +subtitle=subtitle.." "..self.gettext:GetEntry("LEFT",self.locale) +elseif rwyTakeoffLeft==false then +subtitle=subtitle.." "..self.gettext:GetEntry("RIGHT",self.locale) +end +alltext=alltext..";\n"..subtitle +if not self.useSRS then +self:Transmission(self.Sound.ActiveRunwayDeparture,1.0,subtitle) +self.radioqueue:Number2Transmission(runwayTakeoff) +if rwyTakeoffLeft==true then +self:Transmission(self.Sound.Left,0.2) +elseif rwyTakeoffLeft==false then +self:Transmission(self.Sound.Right,0.2) +end +end +end +_RUNACT=subtitle +if self.rwylength then +local runact=self.airbase:GetActiveRunway(self.runwaym2t) +local length=runact.length +if not self.metric then +length=UTILS.MetersToFeet(length) +end +local L1000,L0100=self:_GetThousandsAndHundreds(length) +local rwyl=self.gettext:GetEntry("RWYLENGTH",self.locale) +local meters=self.gettext:GetEntry("METERS",self.locale) +local feet=self.gettext:GetEntry("FEET",self.locale) +local subtitle=string.format("%s %d",rwyl,length) +if self.metric then +subtitle=subtitle.." "..meters +else +subtitle=subtitle.." "..feet +end +if not self.useSRS then +self:Transmission(self.Sound.RunwayLength,1.0,subtitle) +if tonumber(L1000)>0 then +self.radioqueue:Number2Transmission(L1000) +self:Transmission(self.Sound.Thousand,0.1) +end +if tonumber(L0100)>0 then +self.radioqueue:Number2Transmission(L0100) +self:Transmission(self.Sound.Hundred,0.1) +end +if self.metric then +self:Transmission(self.Sound.Meters,0.1) +else +self:Transmission(self.Sound.Feet,0.1) +end +end +alltext=alltext..";\n"..subtitle +end +end +if self.elevation then +local elev=self.gettext:GetEntry("ELEVATION",self.locale) +local meters=self.gettext:GetEntry("METERS",self.locale) +local feet=self.gettext:GetEntry("FEET",self.locale) +local elevation=self.airbase:GetHeight() +if not self.metric then +elevation=UTILS.MetersToFeet(elevation) +end +local L1000,L0100=self:_GetThousandsAndHundreds(elevation) +local subtitle=string.format("%s %d",elev,elevation) +if self.metric then +subtitle=subtitle.." "..meters +else +subtitle=subtitle.." "..feet +end +if not self.useSRS then +self:Transmission(self.Sound.Elevation,1.0,subtitle) +if tonumber(L1000)>0 then +self.radioqueue:Number2Transmission(L1000) +self:Transmission(self.Sound.Thousand,0.1) +end +if tonumber(L0100)>0 then +self.radioqueue:Number2Transmission(L0100) +self:Transmission(self.Sound.Hundred,0.1) +end +if self.metric then +self:Transmission(self.Sound.Meters,0.1) +else +self:Transmission(self.Sound.Feet,0.1) +end +end +alltext=alltext..";\n"..subtitle +end +if self.towerfrequency then +local freqs="" +for i,freq in pairs(self.towerfrequency)do +freqs=freqs..string.format("%.3f MHz",freq) +if i<#self.towerfrequency then +freqs=freqs..", " +end +end +local twrfrq=self.gettext:GetEntry("TOWERFREQ",self.locale) +subtitle=string.format("%s %s",twrfrq,freqs) +if not self.useSRS then +self:Transmission(self.Sound.TowerFrequency,1.0,subtitle) +for _,freq in pairs(self.towerfrequency)do +local f=string.format("%.3f",freq) +f=UTILS.Split(f,".") +self.radioqueue:Number2Transmission(f[1],nil,0.5) +if tonumber(f[2])>0 then +self:Transmission(self.Sound.Decimal,0.2) +self.radioqueue:Number2Transmission(f[2]) +end +self:Transmission(self.Sound.MegaHertz,0.2) +end +end +alltext=alltext..";\n"..subtitle +end +local ils=self:GetNavPoint(self.ils,runwayLanding,rwyLandingLeft) +if ils then +local ilstxt=self.gettext:GetEntry("ILSFREQ",self.locale) +subtitle=string.format("%s %.2f MHz",ilstxt,ils.frequency) +if not self.useSRS then +self:Transmission(self.Sound.ILSFrequency,1.0,subtitle) +local f=string.format("%.2f",ils.frequency) +f=UTILS.Split(f,".") +self.radioqueue:Number2Transmission(f[1],nil,0.5) +if tonumber(f[2])>0 then +self:Transmission(self.Sound.Decimal,0.2) +self.radioqueue:Number2Transmission(f[2]) +end +self:Transmission(self.Sound.MegaHertz,0.2) +end +alltext=alltext..";\n"..subtitle +end +local ndb=self:GetNavPoint(self.ndbouter,runwayLanding,rwyLandingLeft) +if ndb then +local ndbtxt=self.gettext:GetEntry("OUTERNDB",self.locale) +subtitle=string.format("%s %.2f MHz",ndbtxt,ndb.frequency) +if not self.useSRS then +self:Transmission(self.Sound.OuterNDBFrequency,1.0,subtitle) +local f=string.format("%.2f",ndb.frequency) +f=UTILS.Split(f,".") +self.radioqueue:Number2Transmission(f[1],nil,0.5) +if tonumber(f[2])>0 then +self:Transmission(self.Sound.Decimal,0.2) +self.radioqueue:Number2Transmission(f[2]) +end +self:Transmission(self.Sound.MegaHertz,0.2) +end +alltext=alltext..";\n"..subtitle +end +local ndb=self:GetNavPoint(self.ndbinner,runwayLanding,rwyLandingLeft) +if ndb then +local ndbtxt=self.gettext:GetEntry("INNERNDB",self.locale) +subtitle=string.format("%s %.2f MHz",ndbtxt,ndb.frequency) +if not self.useSRS then +self:Transmission(self.Sound.InnerNDBFrequency,1.0,subtitle) +local f=string.format("%.2f",ndb.frequency) +f=UTILS.Split(f,".") +self.radioqueue:Number2Transmission(f[1],nil,0.5) +if tonumber(f[2])>0 then +self:Transmission(self.Sound.Decimal,0.2) +self.radioqueue:Number2Transmission(f[2]) +end +self:Transmission(self.Sound.MegaHertz,0.2) +end +alltext=alltext..";\n"..subtitle +end +if self.vor then +local vortxt=self.gettext:GetEntry("VORFREQ",self.locale) +local vorttstxt=self.gettext:GetEntry("VORFREQTTS",self.locale) +subtitle=string.format("%s %.2f MHz",vortxt,self.vor) +if self.useSRS then +subtitle=string.format("%s %.2f MHz",vorttstxt,self.vor) +end +if not self.useSRS then +self:Transmission(self.Sound.VORFrequency,1.0,subtitle) +local f=string.format("%.2f",self.vor) +f=UTILS.Split(f,".") +self.radioqueue:Number2Transmission(f[1],nil,0.5) +if tonumber(f[2])>0 then +self:Transmission(self.Sound.Decimal,0.2) +self.radioqueue:Number2Transmission(f[2]) +end +self:Transmission(self.Sound.MegaHertz,0.2) +end +alltext=alltext..";\n"..subtitle +end +if self.tacan then +local tactxt=self.gettext:GetEntry("TACANCH",self.locale) +subtitle=string.format(tactxt,self.tacan) +if not self.useSRS then +self:Transmission(self.Sound.TACANChannel,1.0,subtitle) +self.radioqueue:Number2Transmission(tostring(self.tacan),nil,0.2) +self.radioqueue:NewTransmission("Xray.ogg",0.75,self.soundpathNato,nil,0.2) +end +alltext=alltext..";\n"..subtitle +end +if self.rsbn then +local rsbntxt=self.gettext:GetEntry("RSBNCH",self.locale) +subtitle=string.format("%s %d",rsbntxt,self.rsbn) +if not self.useSRS then +self:Transmission(self.Sound.RSBNChannel,1.0,subtitle) +self.radioqueue:Number2Transmission(tostring(self.rsbn),nil,0.2) +end +alltext=alltext..";\n"..subtitle +end +local ndb=self:GetNavPoint(self.prmg,runwayLanding,rwyLandingLeft) +if ndb then +local prmtxt=self.gettext:GetEntry("PRMGCH",self.locale) +subtitle=string.format("%s %d",prmtxt,ndb.frequency) +if not self.useSRS then +self:Transmission(self.Sound.PRMGChannel,1.0,subtitle) +self.radioqueue:Number2Transmission(tostring(ndb.frequency),nil,0.5) +end +alltext=alltext..";\n"..subtitle +end +if self.useSRS and self.AdditionalInformation then +alltext=alltext..";\n"..self.AdditionalInformation +end +local advtxt=self.gettext:GetEntry("ADVISE",self.locale) +subtitle=string.format("%s %s",advtxt,NATO) +if not self.useSRS then +self:Transmission(self.Sound.AdviceOnInitial,0.5,subtitle) +self.radioqueue:NewTransmission(string.format("%s.ogg",NATO),0.75,self.soundpathNato) +end +alltext=alltext..";\n"..subtitle +self:Report(alltext) +if self.usemarker then +self:UpdateMarker(_INFORMATION,_RUNACT,_WIND,_ALTIMETER,_TEMPERATURE) +end +end +function ATIS:onafterReport(From,Event,To,Text) +self:T({From,Event,To}) +self:T(self.lid..string.format("Report:\n%s",Text)) +if self.useSRS and self.msrs then +local text=string.gsub(Text,"[\r\n]","") +local statute=self.gettext:GetEntry("STATUTE",self.locale) +local degc=self.gettext:GetEntry("DEGREES",self.locale) +local degf=self.gettext:GetEntry("FAHRENHEIT",self.locale) +local inhg=self.gettext:GetEntry("INCHHG",self.locale) +local mmhg=self.gettext:GetEntry("MMHG",self.locale) +local hpa=self.gettext:GetEntry("HECTO",self.locale) +local emes=self.gettext:GetEntry("METERSPER",self.locale) +local tacan=self.gettext:GetEntry("TACAN",self.locale) +local farp=self.gettext:GetEntry("FARP",self.locale) +local text=string.gsub(text,"SM",statute) +text=string.gsub(text,"°C",degc) +text=string.gsub(text,"°F",degf) +text=string.gsub(text,"inHg",inhg) +text=string.gsub(text,"mmHg",mmhg) +text=string.gsub(text,"hPa",hpa) +text=string.gsub(text,"m/s",emes) +text=string.gsub(text,"TACAN",tacan) +text=string.gsub(text,"FARP",farp) +local delimiter=self.gettext:GetEntry("DELIMITER",self.locale) +if string.lower(self.locale)~="en"then +text=string.gsub(text,"(%d+)(%.)(%d+)","%1 "..delimiter.." %3") +end +local text=string.gsub(text,";"," . ") +self:T("SRS TTS: "..text) +local duration=MSRS.getSpeechTime(text,0.95) +self.msrsQ:NewTransmission(text,duration,self.msrs,nil,2) +self.SRSText=text +end +end +function ATIS:OnEventBaseCaptured(EventData) +if EventData and EventData.Place then +local airbase=EventData.Place +if EventData.PlaceName==self.airbasename then +local NewCoalitionAirbase=airbase:GetCoalition() +if self.useSRS and self.msrs and self.msrs.coalition~=NewCoalitionAirbase then +self.msrs:SetCoalition(NewCoalitionAirbase) +end +end +end +end +function ATIS:UpdateMarker(information,runact,wind,altimeter,temperature) +if self.markerid then +self.airbase:GetCoordinate():RemoveMark(self.markerid) +end +local text="" +if type(self.frequency)=="table"then +local frequency=table.concat(self.frequency,"/") +local modulation=self.modulation +if type(modulation)=="table"then +modulation=table.concat(self.modulation,"/") +end +text=string.format("ATIS on %s %s, %s:\n",tostring(frequency),tostring(modulation),tostring(information)) +else +text=string.format("ATIS on %.3f %s, %s:\n",self.frequency,UTILS.GetModulationName(self.modulation),tostring(information)) +end +text=text..string.format("%s\n",tostring(runact)) +text=text..string.format("%s\n",tostring(wind)) +text=text..string.format("%s\n",tostring(altimeter)) +text=text..string.format("%s",tostring(temperature)) +self.markerid=self.airbase:GetCoordinate():MarkToAll(text,true) +return self.markerid +end +function ATIS:GetActiveRunway(Takeoff) +local runway=nil +if Takeoff then +runway=self.airbase:GetActiveRunwayTakeoff() +else +runway=self.airbase:GetActiveRunwayLanding() +end +if runway then +return runway.name,runway.isLeft +else +return nil,nil +end +end +function ATIS:GetMagneticRunway(windfrom) +local diffmin=nil +local runway=nil +for _,heading in pairs(self.runwaymag)do +local hdg=self:GetRunwayWithoutLR(heading) +local diff=UTILS.HdgDiff(windfrom,tonumber(hdg)*10) +if diffmin==nil or diff<diffmin then +diffmin=diff +runway=hdg +end +end +return runway +end +function ATIS:GetNavPoint(navpoints,runway,left) +for _,_nav in pairs(navpoints or{})do +local nav=_nav +if nav.runway==nil then +return nav +else +local navy=tonumber(self:GetRunwayWithoutLR(nav.runway))*10 +local rwyy=tonumber(self:GetRunwayWithoutLR(runway))*10 +local navL=self:GetRunwayLR(nav.runway) +local hdgD=UTILS.HdgDiff(navy,rwyy) +if hdgD<=15 then +if navL==nil or(navL==true and left==true)or(navL==false and left==false)then +return nav +end +end +end +end +return nil +end +function ATIS:GetRunwayWithoutLR(runway) +local rwywo=runway:gsub("%D+","") +return rwywo +end +function ATIS:GetRunwayLR(runway) +local rwyL=runway:lower():find("l") +local rwyR=runway:lower():find("r") +if rwyL then +return true +elseif rwyR then +return false +else +return nil +end +end +function ATIS:Transmission(sound,interval,subtitle,path) +self.radioqueue:NewTransmission(sound.filename,sound.duration,path or self.soundpath,nil,interval,subtitle,self.subduration) +end +function ATIS:SoundCheck() +for _,_sound in pairs(ATIS.Sound)do +local sound=_sound +local subtitle=string.format("Playing sound file %s, duration %.2f sec",sound.filename,sound.duration) +self:Transmission(sound,nil,subtitle) +MESSAGE:New(subtitle,5,"ATIS"):ToAll() +end +end +function ATIS:GetMissionWeather() +local weather=env.mission.weather +local clouds=weather.clouds +local static=weather.atmosphere_type==0 +local visibility=weather.visibility.distance +local turbulence=weather.groundTurbulence +local dust=nil +if weather.enable_dust==true then +dust=weather.dust_density +end +self:T("FF weather:") +self:T({clouds=clouds}) +self:T({visibility=visibility}) +self:T({turbulence=turbulence}) +self:T({dust=dust}) +self:T({static=static}) +return clouds,visibility,turbulence,dust,static +end +function ATIS:_GetThousandsAndHundreds(n) +local N=UTILS.Round(n/1000,1) +local S=UTILS.Split(string.format("%.1f",N),".") +local t=S[1] +local h=S[2] +return t,h +end +do +CTLD_CARGO={ +ClassName="CTLD_CARGO", +ID=0, +Name="none", +Templates={}, +CargoType="none", +HasBeenMoved=false, +LoadDirectly=false, +CratesNeeded=0, +Positionable=nil, +HasBeenDropped=false, +PerCrateMass=0, +Stock=nil, +Stock0=nil, +Mark=nil, +DontShowInMenu=false, +Location=nil, +} +CTLD_CARGO.Enum={ +VEHICLE="Vehicle", +TROOPS="Troops", +FOB="FOB", +CRATE="Crate", +REPAIR="Repair", +ENGINEERS="Engineers", +STATIC="Static", +GCLOADABLE="GC_Loadable", +} +function CTLD_CARGO:New(ID,Name,Templates,Sorte,HasBeenMoved,LoadDirectly,CratesNeeded,Positionable,Dropped,PerCrateMass,Stock,Subcategory,DontShowInMenu,Location) +local self=BASE:Inherit(self,BASE:New()) +self:T({ID,Name,Templates,Sorte,HasBeenMoved,LoadDirectly,CratesNeeded,Positionable,Dropped}) +self.ID=ID or math.random(100000,1000000) +self.Name=Name or"none" +self.Templates=Templates or{} +self.CargoType=Sorte or"type" +self.HasBeenMoved=HasBeenMoved or false +self.LoadDirectly=LoadDirectly or false +self.CratesNeeded=CratesNeeded or 0 +self.Positionable=Positionable or nil +self.HasBeenDropped=Dropped or false +self.PerCrateMass=PerCrateMass or 0 +self.Stock=Stock or nil +self.Stock0=Stock or nil +self.Mark=nil +self.Subcategory=Subcategory or"Other" +self.DontShowInMenu=DontShowInMenu or false +self.ResourceMap=nil +self.StaticType="container_cargo" +self.StaticShape=nil +self.TypeNames=nil +self.StaticCategory="Cargos" +if type(Location)=="string"then +Location=ZONE:New(Location) +end +self.Location=Location +self.NoMoveToZone=false +return self +end +function CTLD_CARGO:SetStaticTypeAndShape(Category,TypeName,ShapeName) +self.StaticCategory=Category or"Cargos" +self.StaticType=TypeName or"container_cargo" +self.StaticShape=ShapeName +return self +end +function CTLD_CARGO:GetStaticTypeAndShape() +return self.StaticCategory,self.StaticType,self.StaticShape +end +function CTLD_CARGO:AddUnitTypeName(UnitTypes) +if not self.TypeNames then self.TypeNames={}end +if type(UnitTypes)~="table"then UnitTypes={UnitTypes}end +for _,_singletype in pairs(UnitTypes or{})do +self.TypeNames[_singletype]=_singletype +end +return self +end +function CTLD_CARGO:UnitCanCarry(Unit) +if self.TypeNames==nil then return true end +local typename=Unit:GetTypeName()or"none" +if self.TypeNames[typename]then +return true +else +return false +end +end +function CTLD_CARGO:SetStaticResourceMap(ResourceMap) +self.ResourceMap=ResourceMap +return self +end +function CTLD_CARGO:GetStaticResourceMap() +return self.ResourceMap +end +function CTLD_CARGO:GetLocation() +return self.Location +end +function CTLD_CARGO:GetID() +return self.ID +end +function CTLD_CARGO:GetSubCat() +return self.Subcategory +end +function CTLD_CARGO:GetMass() +return self.PerCrateMass +end +function CTLD_CARGO:GetName() +return self.Name +end +function CTLD_CARGO:GetTemplates() +return self.Templates +end +function CTLD_CARGO:HasMoved() +return self.HasBeenMoved +end +function CTLD_CARGO:WasDropped() +return self.HasBeenDropped +end +function CTLD_CARGO:CanLoadDirectly() +return self.LoadDirectly +end +function CTLD_CARGO:GetCratesNeeded() +return self.CratesNeeded +end +function CTLD_CARGO:GetType() +return self.CargoType +end +function CTLD_CARGO:GetPositionable() +return self.Positionable +end +function CTLD_CARGO:SetHasMoved(moved) +self.HasBeenMoved=moved or false +end +function CTLD_CARGO:Isloaded() +if self.HasBeenMoved and not self:WasDropped()then +return true +else +return false +end +end +function CTLD_CARGO:SetWasDropped(dropped) +self.HasBeenDropped=dropped or false +end +function CTLD_CARGO:GetStock() +if self.Stock then +return self.Stock +else +return-1 +end +end +function CTLD_CARGO:GetStock0() +if self.Stock0 then +return self.Stock0 +else +return-1 +end +end +function CTLD_CARGO:GetRelativeStock() +if self.Stock and self.Stock0 then +return math.floor((self.Stock/self.Stock0)*100) +else +return-1 +end +end +function CTLD_CARGO:AddStock(Number) +if self.Stock then +local number=Number or 1 +self.Stock=self.Stock+number +end +return self +end +function CTLD_CARGO:RemoveStock(Number) +if self.Stock then +local number=Number or 1 +self.Stock=self.Stock-number +if self.Stock<0 then self.Stock=0 end +end +return self +end +function CTLD_CARGO:SetStock(Number) +self.Stock=Number +return self +end +function CTLD_CARGO:IsRepair() +if self.CargoType=="Repair"then +return true +else +return false +end +end +function CTLD_CARGO:IsStatic() +if self.CargoType=="Static"then +return true +else +return false +end +end +function CTLD_CARGO:AddMark(Mark) +self.Mark=Mark +return self +end +function CTLD_CARGO:GetMark(Mark) +return self.Mark +end +function CTLD_CARGO:WipeMark() +self.Mark=nil +return self +end +function CTLD_CARGO:GetNetMass() +return self.CratesNeeded*self.PerCrateMass +end +end +do +CTLD_ENGINEERING={ +ClassName="CTLD_ENGINEERING", +lid="", +Name="none", +Group=nil, +Unit=nil, +HeliGroup=nil, +HeliUnit=nil, +State="", +} +CTLD_ENGINEERING.Version="0.0.3" +function CTLD_ENGINEERING:New(Name,GroupName,HeliGroup,HeliUnit) +local self=BASE:Inherit(self,BASE:New()) +self.Name=Name or"Engineer Squad" +self.Group=GROUP:FindByName(GroupName) +self.Unit=self.Group:GetUnit(1) +self.HeliGroup=HeliGroup +self.HeliUnit=HeliUnit +self.currwpt=nil +self.lid=string.format("%s (%s) | ",self.Name,self.Version) +self.State="Stopped" +self.marktimer=300 +self:Start() +local parent=self:GetParent(self) +return self +end +function CTLD_ENGINEERING:SetStatus(State) +self.State=State +return self +end +function CTLD_ENGINEERING:GetStatus() +return self.State +end +function CTLD_ENGINEERING:IsStatus(State) +return self.State==State +end +function CTLD_ENGINEERING:IsNotStatus(State) +return self.State~=State +end +function CTLD_ENGINEERING:Start() +self:T(self.lid.."Start") +self:SetStatus("Running") +return self +end +function CTLD_ENGINEERING:Stop() +self:T(self.lid.."Stop") +self:SetStatus("Stopped") +return self +end +function CTLD_ENGINEERING:Build() +self:T(self.lid.."Build") +self:SetStatus("Building") +return self +end +function CTLD_ENGINEERING:Done() +self:T(self.lid.."Done") +local grp=self.Group +grp:RelocateGroundRandomInRadius(7,100,false,false,"Diamond") +self:SetStatus("Running") +return self +end +function CTLD_ENGINEERING:Search(crates,number) +self:T(self.lid.."Search") +self:SetStatus("Searching") +local dist=self.distance +local group=self.Group +local ctable={} +local ind=0 +if number>0 then +for _,_cargo in pairs(crates)do +local cgotype=_cargo:GetType() +if _cargo:WasDropped()and cgotype~=CTLD_CARGO.Enum.STATIC then +local ok=false +local chalk=_cargo:GetMark() +if chalk==nil then +ok=true +else +local tag=chalk.tag or"none" +local timestamp=chalk.timestamp or 0 +local gone=timer.getAbsTime()-timestamp +if gone>=self.marktimer then +ok=true +_cargo:WipeMark() +end +end +if ok then +local chalk={} +chalk.tag="Engineers" +chalk.timestamp=timer.getAbsTime() +_cargo:AddMark(chalk) +ind=ind+1 +table.insert(ctable,ind,_cargo) +end +end +end +end +if ind>0 then +local crate=ctable[1] +local static=crate:GetPositionable() +local crate_pos=static:GetCoordinate() +local gpos=group:GetCoordinate() +local distance=self:_GetDistance(gpos,crate_pos) +self:T(string.format("%s Distance to crate: %d",self.lid,distance)) +if distance>30 and distance~=-1 and self:IsStatus("Searching")then +group:RouteGroundTo(crate_pos,15,"Line abreast",1) +self.currwpt=crate_pos +self:Move() +elseif distance<=30 and distance~=-1 then +self:Arrive() +end +else +self:T(self.lid.."No crates in reach!") +end +return self +end +function CTLD_ENGINEERING:Move() +self:T(self.lid.."Move") +self:SetStatus("Moving") +local group=self.Group +local tgtpos=self.currwpt +local gpos=group:GetCoordinate() +local distance=self:_GetDistance(gpos,tgtpos) +self:T(string.format("%s Distance remaining: %d",self.lid,distance)) +if distance<=30 and distance~=-1 then +self:Arrive() +end +return self +end +function CTLD_ENGINEERING:Arrive() +self:T(self.lid.."Arrive") +self:SetStatus("Arrived") +self.currwpt=nil +local Grp=self.Group +Grp:RouteStop() +return self +end +function CTLD_ENGINEERING:_GetDistance(_point1,_point2) +self:T(self.lid.." _GetDistance") +if _point1 and _point2 then +local distance1=_point1:Get2DDistance(_point2) +local distance2=_point1:DistanceFromPointVec2(_point2) +if distance1 and type(distance1)=="number"then +return distance1 +elseif distance2 and type(distance2)=="number"then +return distance2 +else +self:E("*****Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +else +self:E("******Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +end +end +do +CTLD={ +ClassName="CTLD", +verbose=0, +lid="", +coalition=1, +coalitiontxt="blue", +PilotGroups={}, +CtldUnits={}, +FreeVHFFrequencies={}, +FreeUHFFrequencies={}, +FreeFMFrequencies={}, +CargoCounter=0, +Cargo_Troops={}, +Cargo_Crates={}, +Loaded_Cargo={}, +Spawned_Crates={}, +Spawned_Cargo={}, +CrateDistance=35, +PackDistance=35, +debug=false, +wpZones={}, +dropOffZones={}, +pickupZones={}, +DynamicCargo={}, +ChinookTroopCircleRadius=5, +TroopUnloadDistGround=5, +TroopUnloadDistGroundHerc=25, +TroopUnloadDistGroundHook=15, +TroopUnloadDistHoverHook=5, +TroopUnloadDistHover=1.5, +UserSetGroup=nil, +LoadedGroupsTable={}, +keeploadtable=true, +allowCATransport=false, +VehicleMoveFormation=AI.Task.VehicleFormation.VEE, +} +CTLD.RadioModulation={ +AM=0, +FM=1, +} +CTLD.CargoZoneType={ +LOAD="load", +DROP="drop", +MOVE="move", +SHIP="ship", +BEACON="beacon", +} +CTLD.UnitTypeCapabilities={ +["SA342Mistral"]={type="SA342Mistral",crates=false,troops=true,cratelimit=0,trooplimit=4,length=12,cargoweightlimit=400}, +["SA342L"]={type="SA342L",crates=false,troops=true,cratelimit=0,trooplimit=2,length=12,cargoweightlimit=400}, +["SA342M"]={type="SA342M",crates=false,troops=true,cratelimit=0,trooplimit=4,length=12,cargoweightlimit=400}, +["SA342Minigun"]={type="SA342Minigun",crates=false,troops=true,cratelimit=0,trooplimit=2,length=12,cargoweightlimit=400}, +["UH-1H"]={type="UH-1H",crates=true,troops=true,cratelimit=1,trooplimit=8,length=15,cargoweightlimit=700}, +["Mi-8MTV2"]={type="Mi-8MTV2",crates=true,troops=true,cratelimit=2,trooplimit=12,length=15,cargoweightlimit=3000}, +["Mi-8MT"]={type="Mi-8MT",crates=true,troops=true,cratelimit=2,trooplimit=12,length=15,cargoweightlimit=3000}, +["Ka-50"]={type="Ka-50",crates=false,troops=false,cratelimit=0,trooplimit=0,length=15,cargoweightlimit=0}, +["Ka-50_3"]={type="Ka-50_3",crates=false,troops=false,cratelimit=0,trooplimit=0,length=15,cargoweightlimit=0}, +["Mi-24P"]={type="Mi-24P",crates=true,troops=true,cratelimit=2,trooplimit=8,length=18,cargoweightlimit=700}, +["Mi-24V"]={type="Mi-24V",crates=true,troops=true,cratelimit=2,trooplimit=8,length=18,cargoweightlimit=700}, +["Hercules"]={type="Hercules",crates=true,troops=true,cratelimit=7,trooplimit=64,length=25,cargoweightlimit=19000}, +["UH-60L"]={type="UH-60L",crates=true,troops=true,cratelimit=2,trooplimit=20,length=16,cargoweightlimit=3500}, +["UH-60L_DAP"]={type="UH-60L_DAP",crates=false,troops=true,cratelimit=0,trooplimit=2,length=16,cargoweightlimit=500}, +["MH-60R"]={type="MH-60R",crates=true,troops=true,cratelimit=2,trooplimit=20,length=16,cargoweightlimit=3500}, +["SH-60B"]={type="SH-60B",crates=true,troops=true,cratelimit=2,trooplimit=20,length=16,cargoweightlimit=3500}, +["AH-64D_BLK_II"]={type="AH-64D_BLK_II",crates=false,troops=true,cratelimit=0,trooplimit=2,length=17,cargoweightlimit=200}, +["Bronco-OV-10A"]={type="Bronco-OV-10A",crates=false,troops=true,cratelimit=0,trooplimit=5,length=13,cargoweightlimit=1450}, +["OH-6A"]={type="OH-6A",crates=false,troops=true,cratelimit=0,trooplimit=4,length=7,cargoweightlimit=550}, +["OH58D"]={type="OH58D",crates=false,troops=false,cratelimit=0,trooplimit=0,length=14,cargoweightlimit=400}, +["CH-47Fbl1"]={type="CH-47Fbl1",crates=true,troops=true,cratelimit=4,trooplimit=31,length=20,cargoweightlimit=10800}, +["MosquitoFBMkVI"]={type="MosquitoFBMkVI",crates=true,troops=false,cratelimit=2,trooplimit=0,length=13,cargoweightlimit=1800}, +["M 818"]={type="M 818",crates=true,troops=true,cratelimit=4,trooplimit=12,length=9,cargoweightlimit=4500}, +} +CTLD.FixedWingTypes={ +["Hercules"]="Hercules", +["Bronco"]="Bronco", +["Mosquito"]="Mosquito", +} +CTLD.version="1.3.38" +function CTLD:New(Coalition,Prefixes,Alias) +local self=BASE:Inherit(self,FSM:New()) +BASE:T({Coalition,Prefixes,Alias}) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +self.coalitiontxt=Coalition +elseif Coalition=="red"then +self.coalition=coalition.side.RED +self.coalitiontxt=Coalition +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +self.coalitiontxt=Coalition +else +self:E("ERROR: Unknown coalition in CTLD!") +end +else +self.coalition=Coalition +self.coalitiontxt=string.lower(UTILS.GetCoalitionName(self.coalition)) +end +if Alias then +self.alias=tostring(Alias) +else +self.alias="UNHCR" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="Red CTLD" +elseif self.coalition==coalition.side.BLUE then +self.alias="Blue CTLD" +end +end +end +self.lid=string.format("%s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","TroopsPickedUp","*") +self:AddTransition("*","TroopsExtracted","*") +self:AddTransition("*","CratesPickedUp","*") +self:AddTransition("*","TroopsDeployed","*") +self:AddTransition("*","TroopsRTB","*") +self:AddTransition("*","CratesDropped","*") +self:AddTransition("*","CratesBuild","*") +self:AddTransition("*","CratesRepaired","*") +self:AddTransition("*","CratesBuildStarted","*") +self:AddTransition("*","CratesRepairStarted","*") +self:AddTransition("*","CratesPacked","*") +self:AddTransition("*","HelicopterLost","*") +self:AddTransition("*","Load","*") +self:AddTransition("*","Loaded","*") +self:AddTransition("*","Save","*") +self:AddTransition("*","Stop","Stopped") +self.PilotGroups={} +self.CtldUnits={} +self.FreeVHFFrequencies={} +self.FreeUHFFrequencies={} +self.FreeFMFrequencies={} +self.UsedVHFFrequencies={} +self.UsedUHFFrequencies={} +self.UsedFMFrequencies={} +self.RadioSound="beacon.ogg" +self.RadioSoundFC3="beacon.ogg" +self.RadioPath="l10n/DEFAULT/" +self.pickupZones={} +self.dropOffZones={} +self.wpZones={} +self.shipZones={} +self.droppedBeacons={} +self.droppedbeaconref={} +self.droppedbeacontimeout=600 +self.useprecisecoordloads=true +self.Cargo_Crates={} +self.Cargo_Troops={} +self.Cargo_Statics={} +self.Loaded_Cargo={} +self.Spawned_Crates={} +self.Spawned_Cargo={} +self.MenusDone={} +self.DroppedTroops={} +self.DroppedCrates={} +self.CargoCounter=0 +self.CrateCounter=0 +self.TroopCounter=0 +self.Engineers=0 +self.EngineersInField={} +self.EngineerSearch=2000 +self.nobuildmenu=false +self.CrateDistance=35 +self.PackDistance=35 +self.ExtractFactor=3.33 +self.prefixes=Prefixes or{"Cargoheli"} +self.useprefix=true +self.maximumHoverHeight=15 +self.minimumHoverHeight=4 +self.forcehoverload=true +self.hoverautoloading=true +self.dropcratesanywhere=false +self.dropAsCargoCrate=false +self.smokedistance=2000 +self.movetroopstowpzone=true +self.movetroopsdistance=5000 +self.returntroopstobase=true +self.troopdropzoneradius=100 +self.VehicleMoveFormation=AI.Task.VehicleFormation.VEE +self.enableHercules=false +self.enableFixedWing=false +self.FixedMinAngels=165 +self.FixedMaxAngels=2000 +self.FixedMaxSpeed=77 +self.validateAndRepositionUnits=false +self.suppressmessages=false +self.repairtime=300 +self.buildtime=300 +self.placeCratesAhead=false +self.cratecountry=country.id.GERMANY +self.pilotmustopendoors=false +if self.coalition==coalition.side.RED then +self.cratecountry=country.id.RUSSIA +end +self.enableLoadSave=false +self.filepath=nil +self.saveinterval=600 +self.eventoninject=true +self.keeploadtable=true +self.LoadedGroupsTable={} +self.usesubcats=false +self.subcats={} +self.subcatsTroop={} +self.showstockinmenuitems=false +self.onestepmenu=false +self.nobuildinloadzones=true +self.movecratesbeforebuild=true +self.surfacetypes={land.SurfaceType.LAND,land.SurfaceType.ROAD,land.SurfaceType.RUNWAY,land.SurfaceType.SHALLOW_WATER} +self.enableChinookGCLoading=true +self.ChinookTroopCircleRadius=5 +self.UserSetGroup=nil +local AliaS=string.gsub(self.alias," ","_") +self.filename=string.format("CTLD_%s_Persist.csv",AliaS) +self.allowcratepickupagain=true +self.enableslingload=false +self.basetype="container_cargo" +self.SmokeColor=SMOKECOLOR.Red +self.FlareColor=FLARECOLOR.Red +for i=1,100 do +math.random() +end +self.allowCATransport=false +self.CATransportSet=nil +self:_GenerateVHFrequencies() +self:_GenerateUHFrequencies() +self:_GenerateFMFrequencies() +return self +end +function CTLD:_GetUnitCapabilities(Unit) +self:T(self.lid.." _GetUnitCapabilities") +local _unit=Unit +local unittype=_unit:GetTypeName() +local capabilities=self.UnitTypeCapabilities[unittype] +if not capabilities or capabilities=={}then +capabilities={} +capabilities.troops=false +capabilities.crates=false +capabilities.cratelimit=0 +capabilities.trooplimit=0 +capabilities.type="generic" +capabilities.length=20 +capabilities.cargoweightlimit=0 +end +return capabilities +end +function CTLD:AllowCATransport(OnOff,ClientSet) +self.allowCATransport=OnOff +self.CATransportSet=ClientSet +return self +end +function CTLD:_GenerateUHFrequencies() +self:T(self.lid.." _GenerateUHFrequencies") +self.FreeUHFFrequencies={} +self.FreeUHFFrequencies=UTILS.GenerateUHFrequencies(243,320) +return self +end +function CTLD:_GenerateFMFrequencies() +self:T(self.lid.." _GenerateFMrequencies") +self.FreeFMFrequencies={} +self.FreeFMFrequencies=UTILS.GenerateFMFrequencies() +return self +end +function CTLD:_GenerateVHFrequencies() +self:T(self.lid.." _GenerateVHFrequencies") +self.FreeVHFFrequencies={} +self.UsedVHFFrequencies={} +self.FreeVHFFrequencies=UTILS.GenerateVHFrequencies() +return self +end +function CTLD:SetTroopDropZoneRadius(Radius) +self:T(self.lid.." SetTroopDropZoneRadius") +local tradius=Radius or 100 +if tradius<25 then tradius=25 end +self.troopdropzoneradius=tradius +return self +end +function CTLD:AddPlayerTask(PlayerTask) +self:T(self.lid.." AddPlayerTask") +if not self.PlayerTaskQueue then +self.PlayerTaskQueue=FIFO:New() +end +self.PlayerTaskQueue:Push(PlayerTask,PlayerTask.PlayerTaskNr) +return self +end +function CTLD:_EventHandler(EventData) +self:T(string.format("%s Event = %d",self.lid,EventData.id)) +local event=EventData +if event.id==EVENTS.PlayerEnterAircraft or event.id==EVENTS.PlayerEnterUnit then +local _coalition=event.IniCoalition +if _coalition~=self.coalition then +return +end +local unitname=event.IniUnitName or"none" +self.MenusDone[unitname]=nil +local _unit=event.IniUnit +local _group=event.IniGroup +if _unit:IsHelicopter()or _group:IsHelicopter()then +local unitname=event.IniUnitName or"none" +self.Loaded_Cargo[unitname]=nil +self:_RefreshF10Menus() +end +if self:IsFixedWing(_unit)and self.enableFixedWing then +local unitname=event.IniUnitName or"none" +self.Loaded_Cargo[unitname]=nil +self:_RefreshF10Menus() +end +if _unit:IsGround()and self.allowCATransport then +local unitname=event.IniUnitName or"none" +self.Loaded_Cargo[unitname]=nil +self:_RefreshF10Menus() +end +return +elseif event.id==EVENTS.Land or event.id==EVENTS.Takeoff then +local unitname=event.IniUnitName +if self.CtldUnits[unitname]then +local _group=event.IniGroup +local _unit=event.IniUnit +self:_RefreshLoadCratesMenu(_group,_unit) +if self:IsFixedWing(_unit)and self.enableFixedWing then +self:_RefreshDropCratesMenu(_group,_unit) +end +end +elseif event.id==EVENTS.PlayerLeaveUnit or event.id==EVENTS.UnitLost then +local unitname=event.IniUnitName or"none" +if self.CtldUnits[unitname]then +local lostcargo=UTILS.DeepCopy(self.Loaded_Cargo[unitname]or{}) +self:__HelicopterLost(1,unitname,lostcargo) +end +self.CtldUnits[unitname]=nil +self.Loaded_Cargo[unitname]=nil +self.MenusDone[unitname]=nil +elseif event.id==EVENTS.NewDynamicCargo then +self:T(self.lid.."GC New Event "..event.IniDynamicCargoName) +self.DynamicCargo[event.IniDynamicCargoName]=event.IniDynamicCargo +elseif event.id==EVENTS.DynamicCargoLoaded then +self:T(self.lid.."GC Loaded Event "..event.IniDynamicCargoName) +local dcargo=event.IniDynamicCargo +local client=CLIENT:FindByPlayerName(dcargo.Owner) +if client and client:IsAlive()then +local unitname=client:GetName()or"none" +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +end +loaded.Cratesloaded=loaded.Cratesloaded+1 +table.insert(loaded.Cargo,dcargo) +self.Loaded_Cargo[unitname]=nil +self.Loaded_Cargo[unitname]=loaded +local Group=client:GetGroup() +self:_SendMessage(string.format("Crate %s loaded by ground crew!",event.IniDynamicCargoName),10,false,Group) +self:__CratesPickedUp(1,Group,client,dcargo) +end +elseif event.id==EVENTS.DynamicCargoUnloaded then +self:T(self.lid.."GC Unload Event "..event.IniDynamicCargoName) +local dcargo=event.IniDynamicCargo +local client=CLIENT:FindByPlayerName(dcargo.Owner) +if client and client:IsAlive()then +local unitname=client:GetName()or"none" +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +loaded.Cratesloaded=loaded.Cratesloaded-1 +if loaded.Cratesloaded<0 then loaded.Cratesloaded=0 end +local Loaded={} +for _,_item in pairs(loaded.Cargo or{})do +self:T(self.lid.."UNLOAD checking: ".._item:GetName()) +self:T(self.lid.."UNLOAD state: "..tostring(_item:WasDropped())) +if _item and _item:GetType()==CTLD_CARGO.Enum.GCLOADABLE and event.IniDynamicCargoName and event.IniDynamicCargoName~=_item:GetName()and not _item:WasDropped()then +table.insert(Loaded,_item) +else +table.insert(Loaded,_item) +end +end +loaded.Cargo=nil +loaded.Cargo=Loaded +self.Loaded_Cargo[unitname]=nil +self.Loaded_Cargo[unitname]=loaded +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +self.Loaded_Cargo[unitname]=loaded +end +local Group=client:GetGroup() +self:_SendMessage(string.format("Crate %s unloaded by ground crew!",event.IniDynamicCargoName),10,false,Group) +self:__CratesDropped(1,Group,client,{dcargo}) +end +elseif event.id==EVENTS.DynamicCargoRemoved then +self:T(self.lid.."GC Remove Event "..event.IniDynamicCargoName) +self.DynamicCargo[event.IniDynamicCargoName]=nil +end +return self +end +function CTLD:_SendMessage(Text,Time,Clearscreen,Group) +self:T(self.lid.." _SendMessage") +if not self.suppressmessages then +local m=MESSAGE:New(Text,Time,"CTLD",Clearscreen):ToGroup(Group) +end +return self +end +function CTLD:_FindTroopsCargoObject(Name) +self:T(self.lid.." _FindTroopsCargoObject") +local cargo=nil +for _,_cargo in pairs(self.Cargo_Troops)do +local cargo=_cargo +if cargo.Name==Name then +return cargo +end +end +return nil +end +function CTLD:_FindCratesCargoObject(Name) +self:T(self.lid.." _FindCratesCargoObject") +local cargo=nil +for _,_cargo in pairs(self.Cargo_Crates)do +local cargo=_cargo +if cargo.Name==Name then +return cargo +end +end +return nil +end +function CTLD:AddAllowedFixedWingType(typename) +if type(typename)=="string"then +self.FixedWingTypes[typename]=typename +elseif typename and typename.ClassName and typename:IsInstanceOf("UNIT")then +local TypeName=typename:GetTypeName()or"none" +self.FixedWingTypes[TypeName]=TypeName +else +self:E(self.lid.."No valid typename or no UNIT handed!") +end +return self +end +function CTLD:PreloadTroops(Unit,Troopname) +self:T(self.lid.." PreloadTroops") +local name=Troopname or"Unknown" +if Unit and Unit:IsAlive()then +local cargo=self:_FindTroopsCargoObject(name) +local group=Unit:GetGroup() +if cargo then +self:_LoadTroops(group,Unit,cargo,true) +else +self:E(self.lid.." Troops preload - Cargo Object "..name.." not found!") +end +end +return self +end +function CTLD:_PreloadCrates(Group,Unit,Cargo,NumberOfCrates) +local group=Group +local unit=Unit +local unitname=unit:GetName() +local unittype=unit:GetTypeName() +local capabilities=self:_GetUnitCapabilities(Unit) +local cancrates=capabilities.crates +local cratelimit=capabilities.cratelimit +if not cancrates then +self:_SendMessage("Sorry this chopper cannot carry crates!",10,false,Group) +return self +else +local numberonboard=0 +local massonboard=0 +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +numberonboard=loaded.Cratesloaded or 0 +massonboard=self:_GetUnitCargoMass(Unit) +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +end +local crate=Cargo +local numbercrates=NumberOfCrates or crate:GetCratesNeeded() +for i=1,numbercrates do +loaded.Cratesloaded=loaded.Cratesloaded+1 +crate:SetHasMoved(true) +crate:SetWasDropped(false) +table.insert(loaded.Cargo,crate) +crate.Positionable=nil +self:_SendMessage(string.format("Crate ID %d for %s loaded!",crate:GetID(),crate:GetName()),10,false,Group) +self.Loaded_Cargo[unitname]=loaded +self:_UpdateUnitCargoMass(Unit) +end +end +return self +end +function CTLD:PreloadCrates(Unit,Cratesname,NumberOfCrates) +self:T(self.lid.." PreloadCrates") +local name=Cratesname or"Unknown" +if Unit and Unit:IsAlive()then +local cargo=self:_FindCratesCargoObject(name) +local group=Unit:GetGroup() +if cargo then +self:_PreloadCrates(group,Unit,cargo,NumberOfCrates) +else +self:E(self.lid.." Crates preload - Cargo Object "..name.." not found!") +end +end +return self +end +function CTLD:_LoadTroops(Group,Unit,Cargotype,Inject) +self:T(self.lid.." _LoadTroops") +local instock=Cargotype:GetStock() +local cgoname=Cargotype:GetName() +local cgotype=Cargotype:GetType() +local cgonetmass=Cargotype:GetNetMass() +local maxloadable=self:_GetMaxLoadableMass(Unit) +if type(instock)=="number"and tonumber(instock)<=0 and tonumber(instock)~=-1 and not Inject then +self:_SendMessage(string.format("Sorry, all %s are gone!",cgoname),10,false,Group) +return self +end +local grounded=not self:IsUnitInAir(Unit) +local hoverload=self:CanHoverLoad(Unit) +local inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) +if not inzone then +inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) +end +if not Inject then +if not inzone then +self:_SendMessage("You are not close enough to a logistics zone!",10,false,Group) +if not self.debug then return self end +elseif not grounded and not hoverload then +self:_SendMessage("You need to land or hover in position to load!",10,false,Group) +if not self.debug then return self end +elseif self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load troops!",10,false,Group) +if not self.debug then return self end +end +end +local group=Group +local unit=Unit +local unitname=unit:GetName() +local cargotype=Cargotype +local cratename=cargotype:GetName() +local unittype=unit:GetTypeName() +local capabilities=self:_GetUnitCapabilities(Unit) +local cantroops=capabilities.troops +local trooplimit=capabilities.trooplimit +local troopsize=cargotype:GetCratesNeeded() +local numberonboard=0 +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +numberonboard=loaded.Troopsloaded or 0 +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +end +if troopsize+numberonboard>trooplimit then +self:_SendMessage("Sorry, we\'re crammed already!",10,false,Group) +return +elseif maxloadable<cgonetmass then +self:_SendMessage("Sorry, that\'s too heavy to load!",10,false,Group) +return +else +self.CargoCounter=self.CargoCounter+1 +local loadcargotype=CTLD_CARGO:New(self.CargoCounter,Cargotype.Name,Cargotype.Templates,cgotype,true,true,Cargotype.CratesNeeded,nil,nil,Cargotype.PerCrateMass) +self:T({cargotype=loadcargotype}) +loaded.Troopsloaded=loaded.Troopsloaded+troopsize +table.insert(loaded.Cargo,loadcargotype) +self.Loaded_Cargo[unitname]=loaded +self:_SendMessage(string.format("%s boarded!",cgoname),10,false,Group) +self:_RefreshDropTroopsMenu(Group,Unit) +self:__TroopsPickedUp(1,Group,Unit,Cargotype) +self:_UpdateUnitCargoMass(Unit) +Cargotype:RemoveStock() +end +return self +end +function CTLD:_FindRepairNearby(Group,Unit,Repairtype) +self:T(self.lid.." _FindRepairNearby") +local unitcoord=Unit:GetCoordinate() +local nearestGroup=nil +local nearestGroupIndex=-1 +local nearestDistance=10000 +for k,v in pairs(self.DroppedTroops)do +local distance=self:_GetDistance(v:GetCoordinate(),unitcoord) +local unit=v:GetUnit(1) +local desc=unit:GetDesc()or nil +if distance<nearestDistance and distance~=-1 and not desc.attributes.Infantry then +nearestGroup=v +nearestGroupIndex=k +nearestDistance=distance +end +end +if nearestGroup==nil or nearestDistance>self.EngineerSearch then +self:_SendMessage("No unit close enough to repair!",10,false,Group) +return nil,nil +end +local groupname=nearestGroup:GetName() +local function matchstring(String,Table) +local match=false +String=string.gsub(String,"-"," ") +if type(Table)=="table"then +for _,_name in pairs(Table)do +_name=string.gsub(_name,"-"," ") +if string.find(String,_name)then +match=true +break +end +end +else +if type(String)=="string"then +Table=string.gsub(Table,"-"," ") +if string.find(String,Table)then match=true end +end +end +return match +end +local Cargotype=nil +for k,v in pairs(self.Cargo_Crates)do +if matchstring(groupname,v.Templates)and matchstring(groupname,Repairtype)then +Cargotype=v +break +end +end +if Cargotype==nil then +return nil,nil +else +return nearestGroup,Cargotype +end +end +function CTLD:_RepairObjectFromCrates(Group,Unit,Crates,Build,Number,Engineering) +self:T(self.lid.." _RepairObjectFromCrates") +local build=Build +local Repairtype=build.Template +local NearestGroup,CargoType=self:_FindRepairNearby(Group,Unit,Repairtype) +if NearestGroup~=nil then +if self.repairtime<2 then self.repairtime=30 end +if not Engineering then +self:_SendMessage(string.format("Repair started using %s taking %d secs",build.Name,self.repairtime),10,false,Group) +end +local name=CargoType:GetName() +local required=CargoType:GetCratesNeeded() +local template=CargoType:GetTemplates() +local ctype=CargoType:GetType() +local object={} +object.Name=CargoType:GetName() +object.Required=required +object.Found=required +object.Template=template +object.CanBuild=true +object.Type=ctype +self:_CleanUpCrates(Crates,Build,Number) +local desttimer=TIMER:New(function()NearestGroup:Destroy(false)end,self) +desttimer:Start(self.repairtime-1) +local buildtimer=TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,object,true,NearestGroup:GetCoordinate()) +buildtimer:Start(self.repairtime) +self:__CratesRepairStarted(1,Group,Unit) +else +if not Engineering then +self:_SendMessage("Can't repair this unit with "..build.Name,10,false,Group) +else +self:T("Can't repair this unit with "..build.Name) +end +end +return self +end +function CTLD:_ExtractTroops(Group,Unit) +self:T(self.lid.." _ExtractTroops") +local grounded=not self:IsUnitInAir(Unit) +local hoverload=self:CanHoverLoad(Unit) +local hassecondaries=false +if not grounded and not hoverload then +self:_SendMessage("You need to land or hover in position to load!",10,false,Group) +if not self.debug then return self end +end +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to extract troops!",10,false,Group) +if not self.debug then return self end +end +local unit=Unit +local unitname=unit:GetName() +local unittype=unit:GetTypeName() +local capabilities=self:_GetUnitCapabilities(Unit) +local cantroops=capabilities.troops +local trooplimit=capabilities.trooplimit +local unitcoord=unit:GetCoordinate() +local nearestGroup=nil +local nearestGroupIndex=-1 +local nearestDistance=10000000 +local maxdistance=0 +local nearestList={} +local distancekeys={} +local extractdistance=self.CrateDistance*self.ExtractFactor +for k,v in pairs(self.DroppedTroops)do +local distance=self:_GetDistance(v:GetCoordinate(),unitcoord) +local TNow=timer.getTime() +local vtime=v.ExtractTime or TNow-310 +if distance<=extractdistance and distance~=-1 and(TNow-vtime>300)then +nearestGroup=v +nearestGroupIndex=k +nearestDistance=distance +if math.floor(distance)>maxdistance then maxdistance=math.floor(distance)end +if nearestList[math.floor(distance)]then +distance=maxdistance+1 +maxdistance=distance +end +table.insert(nearestList,math.floor(distance),v) +distancekeys[#distancekeys+1]=math.floor(distance) +end +end +if nearestGroup==nil or nearestDistance>extractdistance then +self:_SendMessage("No units close enough to extract!",10,false,Group) +return self +end +table.sort(distancekeys) +local secondarygroups={} +for i=1,#distancekeys do +local nearestGroup=nearestList[distancekeys[i]] +local groupType=string.match(nearestGroup:GetName(),"(.+)-(.+)$") +local Cargotype=nil +for k,v in pairs(self.Cargo_Troops)do +local comparison="" +if type(v.Templates)=="string"then comparison=v.Templates else comparison=v.Templates[1]end +if comparison==groupType then +Cargotype=v +break +end +end +if Cargotype==nil then +self:_SendMessage("Can't onboard "..groupType,10,false,Group) +else +local troopsize=Cargotype:GetCratesNeeded() +local numberonboard=0 +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +numberonboard=loaded.Troopsloaded or 0 +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +end +if troopsize+numberonboard>trooplimit then +self:_SendMessage("Sorry, we\'re crammed already!",10,false,Group) +nearestGroup.ExtractTime=0 +else +self.CargoCounter=self.CargoCounter+1 +nearestGroup.ExtractTime=timer.getTime() +local loadcargotype=CTLD_CARGO:New(self.CargoCounter,Cargotype.Name,Cargotype.Templates,Cargotype.CargoType,true,true,Cargotype.CratesNeeded,nil,nil,Cargotype.PerCrateMass) +self:T({cargotype=loadcargotype}) +local running=math.floor(nearestDistance/4)+20 +loaded.Troopsloaded=loaded.Troopsloaded+troopsize +table.insert(loaded.Cargo,loadcargotype) +self.Loaded_Cargo[unitname]=loaded +self:ScheduleOnce(running,self._SendMessage,self,string.format("%s boarded!",Cargotype.Name),10,false,Group) +self:_SendMessage(string.format("%s boarding!",Cargotype.Name),10,false,Group) +self:_RefreshDropTroopsMenu(Group,Unit) +self:_UpdateUnitCargoMass(Unit) +local groupname=nearestGroup:GetName() +self:__TroopsExtracted(running,Group,Unit,nearestGroup,groupname) +local coord=Unit:GetCoordinate()or Group:GetCoordinate() +local Point +if coord then +local heading=unit:GetHeading()or 0 +local Angle=math.floor((heading+160)%360) +Point=coord:Translate(8,Angle):GetVec2() +if Point then +nearestGroup:RouteToVec2(Point,5) +end +end +hassecondaries=false +if type(Cargotype.Templates)=="table"and Cargotype.Templates[2]then +for _,_key in pairs(Cargotype.Templates)do +table.insert(secondarygroups,_key) +hassecondaries=true +end +end +local destroytimer=math.random(10,20) +nearestGroup:Destroy(false,destroytimer) +end +end +end +if hassecondaries==true then +for _,_name in pairs(secondarygroups)do +for _,_group in pairs(nearestList)do +if _group and _group:IsAlive()then +local groupname=string.match(_group:GetName(),"(.+)-(.+)$") +if _name==groupname then +_group:Destroy(false,15) +end +end +end +end +end +self:CleanDroppedTroops() +return self +end +function CTLD:_GetCrates(Group,Unit,Cargo,number,drop,pack) +self:T(self.lid.." _GetCrates") +if not drop and not pack then +local cgoname=Cargo:GetName() +local instock=Cargo:GetStock() +if type(instock)=="number"and tonumber(instock)<=0 and tonumber(instock)~=-1 then +self:_SendMessage(string.format("Sorry, we ran out of %s",cgoname),10,false,Group) +return self +end +end +local inzone=false +local drop=drop or false +local ship=nil +local width=20 +local distance=nil +local zone=nil +if not drop and not pack then +inzone=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) +if not inzone then +inzone,ship,zone,distance,width=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) +end +elseif drop and not pack then +if self.dropcratesanywhere then +inzone=true +else +inzone=self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP) +end +elseif pack and not drop then +inzone=true +end +if not inzone then +self:_SendMessage("You are not close enough to a logistics zone!",10,false,Group) +if not self.debug then return self end +end +local location=Cargo:GetLocation() +if location then +local unitcoord=Unit:GetCoordinate()or Group:GetCoordinate() +if unitcoord then +if not location:IsCoordinateInZone(unitcoord)then +self:_SendMessage("The requested cargo is not available in this zone!",10,false,Group) +if not self.debug then return self end +end +end +end +local capabilities=self:_GetUnitCapabilities(Unit) +local canloadcratesno=capabilities.cratelimit +local loaddist=self.CrateDistance or 35 +local nearcrates,numbernearby=self:_FindCratesNearby(Group,Unit,loaddist,true,true) +if numbernearby>=canloadcratesno and not drop then +self:_SendMessage("There are enough crates nearby already! Take care of those first!",10,false,Group) +return self +end +local IsHerc=self:IsFixedWing(Unit) +local IsHook=self:IsHook(Unit) +local IsTruck=Unit:IsGround() +local cargotype=Cargo +local number=number or cargotype:GetCratesNeeded() +local cratesneeded=cargotype:GetCratesNeeded() +local cratename=cargotype:GetName() +local cratetemplate="Container" +local cgotype=cargotype:GetType() +local cgomass=cargotype:GetMass() +local isstatic=false +if cgotype==CTLD_CARGO.Enum.STATIC then +cratetemplate=cargotype:GetTemplates() +isstatic=true +end +local position=Unit:GetCoordinate() +local heading=Unit:GetHeading()+1 +local height=Unit:GetHeight() +local droppedcargo={} +local cratedistance=0 +local rheading=0 +local angleOffNose=0 +local addon=0 +if IsHerc or IsHook or IsTruck then +addon=180 +end +heading=(heading+addon)%360 +local row=1 +local column=1 +local initialdist=IsHerc and 16 or(capabilities.length+2) +local startpos=position:Translate(initialdist,heading) +if self.placeCratesAhead==true then +cratedistance=initialdist +end +local cratecoord=nil +for i=1,number do +local cratealias=string.format("%s-%s-%d",cratename,cratetemplate,math.random(1,100000)) +if not self.placeCratesAhead or drop==true then +cratedistance=(i-1)*2.5+capabilities.length +if cratedistance>self.CrateDistance then cratedistance=self.CrateDistance end +if self:IsUnitInAir(Unit)and self:IsFixedWing(Unit)then +rheading=math.random(20,60) +else +rheading=UTILS.RandomGaussian(0,30,-90,90,100) +end +rheading=math.fmod((heading+rheading),360) +cratecoord=position:Translate(cratedistance,rheading) +else +cratedistance=(row-1)*6 +rheading=90 +row=row+1 +cratecoord=startpos:Translate(cratedistance,rheading) +if row>4 then +row=1 +startpos:Translate(6,heading,nil,true) +end +end +self.CrateCounter=self.CrateCounter+1 +local CCat,CType,CShape=Cargo:GetStaticTypeAndShape() +local basetype=CType or self.basetype or"container_cargo" +CCat=CCat or"Cargos" +if isstatic then +basetype=cratetemplate +end +if type(ship)=="string"then +self:T("Spawning on ship "..ship) +local Ship=UNIT:FindByName(ship) +local shipcoord=Ship:GetCoordinate() +local unitcoord=Unit:GetCoordinate() +local dist=shipcoord:Get2DDistance(unitcoord) +dist=dist-(20+math.random(1,10)) +local width=width/2 +local Offy=math.random(-width,width) +local spawnstatic=SPAWNSTATIC:NewFromType(basetype,CCat,self.cratecountry) +:InitCargoMass(cgomass) +:InitCargo(self.enableslingload) +:InitLinkToUnit(Ship,dist,Offy,0) +if CShape then +spawnstatic:InitShape(CShape) +end +if isstatic then +local map=cargotype:GetStaticResourceMap() +spawnstatic.TemplateStaticUnit.resourcePayload=map +end +self.Spawned_Crates[self.CrateCounter]=spawnstatic:Spawn(270,cratealias) +else +local spawnstatic=SPAWNSTATIC:NewFromType(basetype,CCat,self.cratecountry) +:InitCoordinate(cratecoord) +:InitCargoMass(cgomass) +:InitCargo(self.enableslingload) +if CShape then +spawnstatic:InitShape(CShape) +end +if isstatic then +local map=cargotype:GetStaticResourceMap() +spawnstatic.TemplateStaticUnit.resourcePayload=map +end +self.Spawned_Crates[self.CrateCounter]=spawnstatic:Spawn(270,cratealias) +end +local templ=cargotype:GetTemplates() +local sorte=cargotype:GetType() +local subcat=cargotype.Subcategory +self.CargoCounter=self.CargoCounter+1 +local realcargo=nil +if drop then +realcargo=CTLD_CARGO:New(self.CargoCounter,cratename,templ,sorte,true,false,cratesneeded,self.Spawned_Crates[self.CrateCounter],true,cargotype.PerCrateMass,nil,subcat) +local map=cargotype:GetStaticResourceMap() +realcargo:SetStaticResourceMap(map) +local CCat,CType,CShape=cargotype:GetStaticTypeAndShape() +realcargo:SetStaticTypeAndShape(CCat,CType,CShape) +if cargotype.TypeNames then +realcargo.TypeNames=UTILS.DeepCopy(cargotype.TypeNames) +end +table.insert(droppedcargo,realcargo) +else +realcargo=CTLD_CARGO:New(self.CargoCounter,cratename,templ,sorte,false,false,cratesneeded,self.Spawned_Crates[self.CrateCounter],false,cargotype.PerCrateMass,nil,subcat) +local map=cargotype:GetStaticResourceMap() +realcargo:SetStaticResourceMap(map) +if cargotype.TypeNames then +realcargo.TypeNames=UTILS.DeepCopy(cargotype.TypeNames) +end +end +local CCat,CType,CShape=cargotype:GetStaticTypeAndShape() +realcargo:SetStaticTypeAndShape(CCat,CType,CShape) +table.insert(self.Spawned_Cargo,realcargo) +end +if not(drop or pack)then +Cargo:RemoveStock() +end +local text=string.format("Crates for %s have been positioned near you!",cratename) +if drop then +text=string.format("Crates for %s have been dropped!",cratename) +self:__CratesDropped(1,Group,Unit,droppedcargo) +else +self:_SendMessage(text,10,false,Group) +end +self:_RefreshLoadCratesMenu(Group,Unit) +return self +end +function CTLD:InjectStatics(Zone,Cargo,RandomCoord,FromLoad) +self:T(self.lid.." InjectStatics") +local cratecoord=Zone:GetCoordinate() +if RandomCoord then +cratecoord=Zone:GetRandomCoordinate(5,20) +end +local surface=cratecoord:GetSurfaceType() +if surface==land.SurfaceType.WATER then +return self +end +local cargotype=Cargo +local cratesneeded=cargotype:GetCratesNeeded() +local cratetemplate="Container" +local cratename=cargotype:GetName() +local cgotype=cargotype:GetType() +local cgomass=cargotype:GetMass() +local cratenumber=cargotype:GetCratesNeeded()or 1 +if FromLoad==true then cratenumber=1 end +for i=1,cratenumber do +local cratealias=string.format("%s-%s-%d",cratename,cratetemplate,math.random(1,100000)) +local isstatic=false +if cgotype==CTLD_CARGO.Enum.STATIC then +cratetemplate=cargotype:GetTemplates() +isstatic=true +end +local CCat,CType,CShape=cargotype:GetStaticTypeAndShape() +local basetype=CType or self.basetype or"container_cargo" +CCat=CCat or"Cargos" +if isstatic then +basetype=cratetemplate +end +self.CrateCounter=self.CrateCounter+1 +local spawnstatic=SPAWNSTATIC:NewFromType(basetype,CCat,self.cratecountry) +:InitCargoMass(cgomass) +:InitCargo(self.enableslingload) +:InitCoordinate(cratecoord) +if CShape then +spawnstatic:InitShape(CShape) +end +if isstatic then +local map=cargotype:GetStaticResourceMap() +spawnstatic.TemplateStaticUnit.resourcePayload=map +end +self.Spawned_Crates[self.CrateCounter]=spawnstatic:Spawn(270,cratealias) +local templ=cargotype:GetTemplates() +local sorte=cargotype:GetType() +cargotype.Positionable=self.Spawned_Crates[self.CrateCounter] +table.insert(self.Spawned_Cargo,cargotype) +end +return self +end +function CTLD:InjectStaticFromTemplate(Zone,Template,Mass) +self:T(self.lid.." InjectStaticFromTemplate") +local cargotype=self:GetStaticsCargoFromTemplate(Template,Mass) +self:InjectStatics(Zone,cargotype,true,true) +return self +end +function CTLD:_ListCratesNearby(_group,_unit) +self:T(self.lid.." _ListCratesNearby") +local finddist=self.CrateDistance or 35 +local crates,number,loadedbygc,indexgc=self:_FindCratesNearby(_group,_unit,finddist,true,true) +if number>0 or indexgc>0 then +local text=REPORT:New("Crates Found Nearby:") +text:Add("------------------------------------------------------------") +for _,_entry in pairs(crates)do +local entry=_entry +local name=entry:GetName() +local dropped=entry:WasDropped() +if dropped then +text:Add(string.format("Dropped crate for %s, %dkg",name,entry.PerCrateMass)) +else +text:Add(string.format("Crate for %s, %dkg",name,entry.PerCrateMass)) +end +end +if text:GetCount()==1 then +text:Add(" N O N E") +end +text:Add("------------------------------------------------------------") +if indexgc>0 then +text:Add("Probably ground crew loadable (F8)") +for _,_entry in pairs(loadedbygc)do +local entry=_entry +local name=entry:GetName() +local dropped=entry:WasDropped() +if dropped then +text:Add(string.format("Dropped crate for %s, %dkg",name,entry.PerCrateMass)) +else +text:Add(string.format("Crate for %s, %dkg",name,entry.PerCrateMass)) +end +end +end +self:_SendMessage(text:Text(),30,true,_group) +else +self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) +end +return self +end +function CTLD:_RemoveCratesNearby(_group,_unit) +self:T(self.lid.." _RemoveCratesNearby") +local finddist=self.CrateDistance or 35 +local crates,number=self:_FindCratesNearby(_group,_unit,finddist,true,true) +if number>0 then +local removedIDs={} +local text=REPORT:New("Removing Crates Found Nearby:") +text:Add("------------------------------------------------------------") +for _,_entry in pairs(crates)do +local entry=_entry +local name=entry:GetName()or"none" +text:Add(string.format("Crate for %s, %dkg removed",name,entry.PerCrateMass)) +if entry:GetPositionable()then +entry:GetPositionable():Destroy(false) +end +table.insert(removedIDs,entry:GetID()) +end +if text:GetCount()==1 then +text:Add(" N O N E") +end +text:Add("------------------------------------------------------------") +self:_SendMessage(text:Text(),30,true,_group) +self:_CleanupTrackedCrates(removedIDs) +self:_RefreshLoadCratesMenu(_group,_unit) +else +self:_SendMessage(string.format("No (loadable) crates within %d meters!",finddist),10,false,_group) +end +return self +end +function CTLD:_GetDistance(_point1,_point2) +self:T(self.lid.." _GetDistance") +if _point1 and _point2 then +local distance1=_point1:Get2DDistance(_point2) +local distance2=_point1:DistanceFromPointVec2(_point2) +if distance1 and type(distance1)=="number"then +return distance1 +elseif distance2 and type(distance2)=="number"then +return distance2 +else +self:E("*****Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +else +self:E("******Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +end +function CTLD:_FindCratesNearby(_group,_unit,_dist,_ignoreweight,ignoretype) +self:T(self.lid.." _FindCratesNearby") +local finddist=_dist +local location=_group:GetCoordinate() +local existingcrates=self.Spawned_Cargo +local index=0 +local indexg=0 +local found={} +local LoadedbyGC={} +local loadedmass=0 +local unittype="none" +local capabilities={} +local maxloadable=2000 +local IsHook=self:IsHook(_unit) +if not _ignoreweight then +maxloadable=self:_GetMaxLoadableMass(_unit) +end +self:T(self.lid.." Max loadable mass: "..maxloadable) +for _,_cargoobject in pairs(existingcrates)do +local cargo=_cargoobject +local static=cargo:GetPositionable() +local weight=cargo:GetMass() +local staticid=cargo:GetID() +self:T(self.lid.." Found cargo mass: "..weight) +if static and static:IsAlive()then +local restricthooktononstatics=self.enableChinookGCLoading and IsHook +self:T(self.lid.." restricthooktononstatics: "..tostring(restricthooktononstatics)) +local cargoisstatic=cargo:GetType()==CTLD_CARGO.Enum.STATIC and true or false +self:T(self.lid.." Cargo is static: "..tostring(cargoisstatic)) +local restricted=cargoisstatic and restricthooktononstatics +self:T(self.lid.." Loading restricted: "..tostring(restricted)) +local staticpos=static:GetCoordinate() +local cando=cargo:UnitCanCarry(_unit) +if ignoretype==true then cando=true end +self:T(self.lid.." Unit can carry: "..tostring(cando)) +local distance=self:_GetDistance(location,staticpos) +self:T(self.lid..string.format("Dist %dm/%dm | weight %dkg | maxloadable %dkg",distance,finddist,weight,maxloadable)) +if distance<=finddist and(weight<=maxloadable or _ignoreweight)and restricted==false and cando==true then +index=index+1 +table.insert(found,staticid,cargo) +maxloadable=maxloadable-weight +end +end +end +return found,index,LoadedbyGC,indexg +end +function CTLD:_LoadCratesNearby(Group,Unit) +self:T(self.lid.." _LoadCratesNearby") +local group=Group +local unit=Unit +local unitname=unit:GetName() +local unittype=unit:GetTypeName() +local capabilities=self:_GetUnitCapabilities(Unit) +local cancrates=capabilities.crates +local cratelimit=capabilities.cratelimit +local grounded=not self:IsUnitInAir(Unit) +local canhoverload=self:CanHoverLoad(Unit) +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) +if not self.debug then return self end +end +if not cancrates then +self:_SendMessage("Sorry this chopper cannot carry crates!",10,false,Group) +elseif self.forcehoverload and not canhoverload then +self:_SendMessage("Hover over the crates to pick them up!",10,false,Group) +elseif not grounded and not canhoverload then +self:_SendMessage("Land or hover over the crates to pick them up!",10,false,Group) +else +local numberonboard=0 +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +numberonboard=loaded.Cratesloaded or 0 +else +loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +end +local finddist=self.CrateDistance or 35 +local nearcrates,number=self:_FindCratesNearby(Group,Unit,finddist,false,false) +self:T(self.lid.." Crates found: "..number) +if number==0 and self.hoverautoloading then +return self +elseif number==0 then +self:_SendMessage("Sorry, no loadable crates nearby or max cargo weight reached!",10,false,Group) +return self +elseif numberonboard==cratelimit then +self:_SendMessage("Sorry, we are fully loaded!",10,false,Group) +return self +else +local capacity=cratelimit-numberonboard +local crateidsloaded={} +local crateMap={} +for _,cObj in pairs(nearcrates)do +if not cObj:HasMoved()or self.allowcratepickupagain then +local cName=cObj:GetName()or"Unknown" +crateMap[cName]=crateMap[cName]or{} +table.insert(crateMap[cName],cObj) +end +end +for cName,crateList in pairs(crateMap)do +if capacity<=0 then break end +table.sort(crateList,function(a,b)return a:GetID()>b:GetID()end) +local needed=crateList[1]:GetCratesNeeded()or 1 +local totalFound=#crateList +local loadedHere=0 +while loaded.Cratesloaded<cratelimit and loadedHere<totalFound do +loadedHere=loadedHere+1 +local crate=crateList[loadedHere] +if crate and crate.Positionable then +loaded.Cratesloaded=loaded.Cratesloaded+1 +crate:SetHasMoved(true) +crate:SetWasDropped(false) +table.insert(loaded.Cargo,crate) +table.insert(crateidsloaded,crate:GetID()) +crate:GetPositionable():Destroy(false) +crate.Positionable=nil +else +loadedHere=loadedHere-1 +break +end +end +capacity=cratelimit-loaded.Cratesloaded +if loadedHere>0 then +local fullSets=math.floor(loadedHere/needed) +local leftover=loadedHere%needed +if needed>1 then +if fullSets>0 and leftover==0 then +self:_SendMessage(string.format("Loaded %d %s.",fullSets,cName),10,false,Group) +elseif fullSets>0 and leftover>0 then +self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).",fullSets,cName,leftover),10,false,Group) +else +self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.",loadedHere,needed,cName),15,false,Group) +end +else +self:_SendMessage(string.format("Loaded %d %s(s).",loadedHere,cName),10,false,Group) +end +end +end +self.Loaded_Cargo[unitname]=loaded +self:_UpdateUnitCargoMass(Unit) +self:_RefreshDropCratesMenu(Group,Unit) +self:_RefreshLoadCratesMenu(Group,Unit) +self:_CleanupTrackedCrates(crateidsloaded) +self:__CratesPickedUp(1,Group,Unit,loaded.Cargo) +end +end +return self +end +function CTLD:_CleanupTrackedCrates(crateIdsToRemove) +local existingcrates=self.Spawned_Cargo +local newexcrates={} +for _,_crate in pairs(existingcrates)do +local excrate=_crate +local ID=excrate:GetID() +local keep=true +for _,_ID in pairs(crateIdsToRemove)do +if ID==_ID then +keep=false +end +end +local static=_crate:GetPositionable() +if not static or not static:IsAlive()then +keep=false +end +if keep then +table.insert(newexcrates,_crate) +end +end +self.Spawned_Cargo=nil +self.Spawned_Cargo=newexcrates +return self +end +function CTLD:_GetUnitCargoMass(Unit) +self:T(self.lid.." _GetUnitCargoMass") +if not Unit then return 0 end +local unitname=Unit:GetName() +local loadedcargo=self.Loaded_Cargo[unitname]or{} +local loadedmass=0 +if self.Loaded_Cargo[unitname]then +local cargotable=loadedcargo.Cargo or{} +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)and not cargo:WasDropped()then +loadedmass=loadedmass+(cargo.PerCrateMass*cargo:GetCratesNeeded()) +end +if type~=CTLD_CARGO.Enum.TROOPS and type~=CTLD_CARGO.Enum.ENGINEERS and type~=CTLD_CARGO.Enum.GCLOADABLE and not cargo:WasDropped()then +loadedmass=loadedmass+cargo.PerCrateMass +end +if type==CTLD_CARGO.Enum.GCLOADABLE then +local mass=cargo:GetCargoWeight() +loadedmass=loadedmass+mass +end +end +end +return loadedmass +end +function CTLD:_GetMaxLoadableMass(Unit) +self:T(self.lid.." _GetMaxLoadableMass") +if not Unit then return 0 end +local loadable=0 +local loadedmass=self:_GetUnitCargoMass(Unit) +local capabilities=self:_GetUnitCapabilities(Unit) +local maxmass=capabilities.cargoweightlimit or 2000 +loadable=maxmass-loadedmass +return loadable +end +function CTLD:_UpdateUnitCargoMass(Unit) +self:T(self.lid.." _UpdateUnitCargoMass") +local calculatedMass=self:_GetUnitCargoMass(Unit) +Unit:SetUnitInternalCargo(calculatedMass) +return self +end +function CTLD:_ListCargo(Group,Unit) +self:T(self.lid.." _ListCargo") +local unitname=Unit:GetName() +local unittype=Unit:GetTypeName() +local capabilities=self:_GetUnitCapabilities(Unit) +local trooplimit=capabilities.trooplimit +local cratelimit=capabilities.cratelimit +local loadedcargo=self.Loaded_Cargo[unitname]or{} +local loadedmass=self:_GetUnitCargoMass(Unit) +local maxloadable=self:_GetMaxLoadableMass(Unit) +local finddist=self.CrateDistance or 35 +if self.Loaded_Cargo[unitname]then +local no_troops=loadedcargo.Troopsloaded or 0 +local no_crates=loadedcargo.Cratesloaded or 0 +local cargotable=loadedcargo.Cargo or{} +local report=REPORT:New("Transport Checkout Sheet") +report:Add("------------------------------------------------------------") +report:Add(string.format("Troops: %d(%d), Crates: %d(%d)",no_troops,trooplimit,no_crates,cratelimit)) +report:Add("------------------------------------------------------------") +report:Add(" -- TROOPS --") +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)and(not cargo:WasDropped()or self.allowcratepickupagain)then +report:Add(string.format("Troop: %s size %d",cargo:GetName(),cargo:GetCratesNeeded())) +end +end +if report:GetCount()==4 then +report:Add(" N O N E") +end +report:Add("------------------------------------------------------------") +report:Add(" -- CRATES --") +local cratecount=0 +local accumCrates={} +for _,_cargo in pairs(cargotable or{})do +local cargo=_cargo +local type=cargo:GetType() +if(type~=CTLD_CARGO.Enum.TROOPS and type~=CTLD_CARGO.Enum.ENGINEERS and type~=CTLD_CARGO.Enum.GCLOADABLE)and(not cargo:WasDropped()or self.allowcratepickupagain)then +local cName=cargo:GetName() +local needed=cargo:GetCratesNeeded()or 1 +accumCrates[cName]=accumCrates[cName]or{count=0,needed=needed} +accumCrates[cName].count=accumCrates[cName].count+1 +end +if type==CTLD_CARGO.Enum.GCLOADABLE and not cargo:WasDropped()then +report:Add(string.format("GC loaded Crate: %s size 1",cargo:GetName())) +cratecount=cratecount+1 +end +end +for cName,data in pairs(accumCrates)do +cratecount=cratecount+data.count +report:Add(string.format("Crate: %s %d/%d",cName,data.count,data.needed)) +end +if cratecount==0 then +report:Add(" N O N E") +end +report:Add("------------------------------------------------------------") +report:Add("Total Mass: "..loadedmass.." kg. Loadable: "..maxloadable.." kg.") +local text=report:Text() +self:_SendMessage(text,30,true,Group) +else +self:_SendMessage(string.format("Nothing loaded!\nTroop limit: %d | Crate limit %d | Weight limit %d kgs",trooplimit,cratelimit,maxloadable),10,false,Group) +end +return self +end +function CTLD:_ListInventory(Group,Unit) +self:T(self.lid.." _ListInventory") +local unitname=Unit:GetName() +local unittype=Unit:GetTypeName() +local cgotypes=self.Cargo_Crates +local trptypes=self.Cargo_Troops +local stctypes=self.Cargo_Statics +local function countcargo(cgotable) +local counter=0 +for _,_cgo in pairs(cgotable)do +counter=counter+1 +end +return counter +end +local crateno=countcargo(cgotypes) +local troopno=countcargo(trptypes) +local staticno=countcargo(stctypes) +if(crateno>0 or troopno>0 or staticno>0)then +local report=REPORT:New("Inventory Sheet") +report:Add("------------------------------------------------------------") +report:Add(string.format("Troops: %d, Cratetypes: %d",troopno,crateno+staticno)) +report:Add("------------------------------------------------------------") +report:Add(" -- TROOPS --") +for _,_cargo in pairs(trptypes)do +local cargo=_cargo +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)and not cargo:WasDropped()then +local stockn=cargo:GetStock() +local stock="none" +if stockn==-1 then +stock="unlimited" +elseif stockn>0 then +stock=tostring(stockn) +end +report:Add(string.format("Unit: %s | Soldiers: %d | Stock: %s",cargo:GetName(),cargo:GetCratesNeeded(),stock)) +end +end +if report:GetCount()==4 then +report:Add(" N O N E") +end +report:Add("------------------------------------------------------------") +report:Add(" -- CRATES --") +local cratecount=0 +for _,_cargo in pairs(cgotypes)do +local cargo=_cargo +local type=cargo:GetType() +if(type~=CTLD_CARGO.Enum.TROOPS and type~=CTLD_CARGO.Enum.ENGINEERS)and not cargo:WasDropped()then +local stockn=cargo:GetStock() +local stock="none" +if stockn==-1 then +stock="unlimited" +elseif stockn>0 then +stock=tostring(stockn) +end +report:Add(string.format("Type: %s | Crates per Set: %d | Stock: %s",cargo:GetName(),cargo:GetCratesNeeded(),stock)) +cratecount=cratecount+1 +end +end +for _,_cargo in pairs(stctypes)do +local cargo=_cargo +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.STATIC)and not cargo:WasDropped()then +local stockn=cargo:GetStock() +local stock="none" +if stockn==-1 then +stock="unlimited" +elseif stockn>0 then +stock=tostring(stockn) +end +report:Add(string.format("Type: %s | Stock: %s",cargo:GetName(),stock)) +cratecount=cratecount+1 +end +end +if cratecount==0 then +report:Add(" N O N E") +end +local text=report:Text() +self:_SendMessage(text,30,true,Group) +else +self:_SendMessage(string.format("Nothing in stock!"),10,false,Group) +end +return self +end +function CTLD:IsFixedWing(Unit) +local typename=Unit:GetTypeName()or"none" +for _,_name in pairs(self.FixedWingTypes or{})do +if _name and(typename==_name or string.find(typename,_name,1,true))then +return true +end +end +return false +end +function CTLD:IsHook(Unit) +if not Unit then return false end +local typeName=Unit:GetTypeName() +if not typeName then return false end +if string.find(typeName,"CH.47")then +return true +else +return false +end +end +function CTLD:_GetUnitPositions(Coordinate,Radius,Heading,Template) +local Positions={} +local template=_DATABASE:GetGroupTemplate(Template) +local numbertroops=#template.units +local slightshift=math.abs(math.random(1,500)/100) +local newcenter=Coordinate:Translate(Radius+slightshift,((Heading+270+math.random(1,10))%360)) +for i=1,360,math.floor(360/numbertroops)do +local phead=((Heading+270+i)%360) +local post=newcenter:Translate(Radius,phead) +local pos1=post:GetVec2() +local p1t={ +x=pos1.x, +y=pos1.y, +heading=phead, +} +table.insert(Positions,p1t) +end +return Positions +end +function CTLD:_UnloadTroops(Group,Unit) +self:T(self.lid.." _UnloadTroops") +local droppingatbase=false +local canunload=true +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to unload troops!",10,false,Group) +if not self.debug then return self end +end +local inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) +if not inzone then +inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) +end +if inzone then +droppingatbase=self.returntroopstobase +end +local hoverunload=self:IsCorrectHover(Unit) +local IsHerc=self:IsFixedWing(Unit) +local IsHook=self:IsHook(Unit) +if IsHerc and(not IsHook)then +hoverunload=self:IsCorrectFlightParameters(Unit) +end +local grounded=not self:IsUnitInAir(Unit) +local unitname=Unit:GetName() +if self.Loaded_Cargo[unitname]and(grounded or hoverunload)then +if not droppingatbase or self.debug then +local loadedcargo=self.Loaded_Cargo[unitname]or{} +local cargotable=loadedcargo.Cargo +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)and not cargo:WasDropped()then +local name=cargo:GetName()or"none" +local temptable=cargo:GetTemplates()or{} +local position=Group:GetCoordinate() +local zoneradius=self.troopdropzoneradius or 100 +local factor=1 +if IsHerc then +factor=cargo:GetCratesNeeded()or 1 +zoneradius=Unit:GetVelocityMPS()or 100 +end +local zone=ZONE_GROUP:New(string.format("Unload zone-%s",unitname),Group,zoneradius*factor) +local randomcoord=zone:GetRandomCoordinate(10,30*factor) +local heading=Group:GetHeading()or 0 +if hoverunload or grounded then +randomcoord=Group:GetCoordinate() +local Angle=(heading+270)%360 +if IsHerc or IsHook then Angle=(heading+180)%360 end +local offset=hoverunload and self.TroopUnloadDistHover or self.TroopUnloadDistGround +if IsHerc then offset=self.TroopUnloadDistGroundHerc or 25 end +if IsHook then +offset=self.TroopUnloadDistGroundHook or 15 +if hoverunload and self.TroopUnloadDistHoverHook then +offset=self.TroopUnloadDistHoverHook or 5 +end +end +randomcoord:Translate(offset,Angle,nil,true) +end +local tempcount=0 +local ishook=self:IsHook(Unit) +if ishook then tempcount=self.ChinookTroopCircleRadius or 5 end +for _,_template in pairs(temptable)do +self.TroopCounter=self.TroopCounter+1 +tempcount=tempcount+1 +local alias=string.format("%s-%d",_template,math.random(1,100000)) +local rad=2.5+(tempcount*2) +local Positions=self:_GetUnitPositions(randomcoord,rad,heading,_template) +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitDelayOff() +:InitSetUnitAbsolutePositions(Positions) +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:OnSpawnGroup(function(grp)grp.spawntime=timer.getTime()end) +:SpawnFromVec2(randomcoord:GetVec2()) +self:__TroopsDeployed(1,Group,Unit,self.DroppedTroops[self.TroopCounter],type) +end +cargo:SetWasDropped(true) +if type==CTLD_CARGO.Enum.ENGINEERS then +self.Engineers=self.Engineers+1 +local grpname=self.DroppedTroops[self.TroopCounter]:GetName() +self.EngineersInField[self.Engineers]=CTLD_ENGINEERING:New(name,grpname) +self:_SendMessage(string.format("Dropped Engineers %s into action!",name),10,false,Group) +else +self:_SendMessage(string.format("Dropped Troops %s into action!",name),10,false,Group) +end +end +end +else +self:_SendMessage("Troops have returned to base!",10,false,Group) +self:__TroopsRTB(1,Group,Unit,zonename,zone) +end +local loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +local loadedcargo=self.Loaded_Cargo[unitname]or{} +local cargotable=loadedcargo.Cargo or{} +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +local dropped=cargo:WasDropped() +if type~=CTLD_CARGO.Enum.TROOPS and type~=CTLD_CARGO.Enum.ENGINEERS and not dropped then +table.insert(loaded.Cargo,_cargo) +loaded.Cratesloaded=loaded.Cratesloaded+1 +else +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)and droppingatbase then +local name=cargo:GetName() +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +local stock=_troop:GetStock() +if stock and tonumber(stock)>=0 then _troop:AddStock()end +end +end +end +end +end +self.Loaded_Cargo[unitname]=nil +self.Loaded_Cargo[unitname]=loaded +self:_RefreshDropTroopsMenu(Group,Unit) +self:_UpdateUnitCargoMass(Unit) +else +if IsHerc then +self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) +else +self:_SendMessage("Nothing loaded or not hovering within parameters!",10,false,Group) +end +end +return self +end +function CTLD:_UnloadCrates(Group,Unit) +self:T(self.lid.." _UnloadCrates") +if not self.dropcratesanywhere then +local inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP) +if not inzone then +self:_SendMessage("You are not close enough to a drop zone!",10,false,Group) +if not self.debug then +return self +end +end +end +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to drop cargo!",10,false,Group) +if not self.debug then return self end +end +local hoverunload=self:IsCorrectHover(Unit) +local IsHerc=self:IsFixedWing(Unit) +local IsHook=self:IsHook(Unit) +if IsHerc and(not IsHook)then +hoverunload=self:IsCorrectFlightParameters(Unit) +end +local grounded=not self:IsUnitInAir(Unit) +local unitname=Unit:GetName() +if self.Loaded_Cargo[unitname]and(grounded or hoverunload)then +local loadedcargo=self.Loaded_Cargo[unitname]or{} +local cargotable=loadedcargo.Cargo +local droppedCount={} +local neededMap={} +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +if type~=CTLD_CARGO.Enum.TROOPS and type~=CTLD_CARGO.Enum.ENGINEERS and type~=CTLD_CARGO.Enum.GCLOADABLE and(not cargo:WasDropped()or self.allowcratepickupagain)then +self:_GetCrates(Group,Unit,cargo,1,true) +cargo:SetWasDropped(true) +cargo:SetHasMoved(true) +local cname=cargo:GetName()or"Unknown" +droppedCount[cname]=(droppedCount[cname]or 0)+1 +if not neededMap[cname]then +neededMap[cname]=cargo:GetCratesNeeded()or 1 +end +end +end +for cname,count in pairs(droppedCount)do +local needed=neededMap[cname]or 1 +if needed>1 then +local full=math.floor(count/needed) +local left=count%needed +if full>0 and left==0 then +self:_SendMessage(string.format("Dropped %d %s.",full,cname),10,false,Group) +elseif full>0 and left>0 then +self:_SendMessage(string.format("Dropped %d %s(s), with %d leftover crate(s).",full,cname,left),10,false,Group) +else +self:_SendMessage(string.format("Dropped %d/%d crate(s) of %s.",count,needed,cname),15,false,Group) +end +else +self:_SendMessage(string.format("Dropped %d %s(s).",count,cname),10,false,Group) +end +end +local loaded={} +loaded.Troopsloaded=0 +loaded.Cratesloaded=0 +loaded.Cargo={} +for _,_cargo in pairs(cargotable)do +local cargo=_cargo +local type=cargo:GetType() +local size=cargo:GetCratesNeeded() +if type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS then +table.insert(loaded.Cargo,_cargo) +loaded.Troopsloaded=loaded.Troopsloaded+size +end +if type==CTLD_CARGO.Enum.GCLOADABLE and not cargo:WasDropped()then +table.insert(loaded.Cargo,_cargo) +loaded.Cratesloaded=loaded.Cratesloaded+size +end +end +self.Loaded_Cargo[unitname]=nil +self.Loaded_Cargo[unitname]=loaded +self:_UpdateUnitCargoMass(Unit) +self:_RefreshDropCratesMenu(Group,Unit) +else +if IsHerc then +self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) +else +self:_SendMessage("Nothing loaded or not hovering within parameters!",10,false,Group) +end +end +return self +end +function CTLD:_BuildCrates(Group,Unit,Engineering,MultiDrop) +self:T(self.lid.." _BuildCrates") +if self:IsFixedWing(Unit)and self.enableFixedWing and not Engineering then +local speed=Unit:GetVelocityKMH() +if speed>1 then +self:_SendMessage("You need to land / stop to build something, Pilot!",10,false,Group) +return self +end +end +if not Engineering and self.nobuildinloadzones then +local inloadzone=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) +if inloadzone then +self:_SendMessage("You cannot build in a loading area, Pilot!",10,false,Group) +return self +end +end +local finddist=self.CrateDistance or 35 +local crates,number=self:_FindCratesNearby(Group,Unit,finddist,true,true) +local buildables={} +local foundbuilds=false +local canbuild=false +if number>0 then +for _,_crate in pairs(crates)do +local Crate=_crate +if(Crate:WasDropped()or not self.movecratesbeforebuild)and not Crate:IsRepair()and not Crate:IsStatic()then +local name=Crate:GetName() +local required=Crate:GetCratesNeeded() +local template=Crate:GetTemplates() +local ctype=Crate:GetType() +local ccoord=Crate:GetPositionable():GetCoordinate() +if not buildables[name]then +local object={} +object.Name=name +object.Required=required +object.Found=1 +object.Template=template +object.CanBuild=false +object.Type=ctype +object.Coord=ccoord:GetVec2() +buildables[name]=object +foundbuilds=true +else +buildables[name].Found=buildables[name].Found+1 +foundbuilds=true +end +if buildables[name].Found>=buildables[name].Required then +buildables[name].CanBuild=true +canbuild=true +end +self:T({buildables=buildables}) +end +end +local report=REPORT:New("Checklist Buildable Crates") +report:Add("------------------------------------------------------------") +for _,_build in pairs(buildables)do +local build=_build +local name=build.Name +local needed=build.Required +local found=build.Found +local txtok="NO" +if build.CanBuild then +txtok="YES" +end +local text=string.format("Type: %s | Required %d | Found %d | Can Build %s",name,needed,found,txtok) +report:Add(text) +end +if not foundbuilds then +report:Add(" --- None found! ---") +if self.movecratesbeforebuild then +report:Add("*** Crates need to be moved before building!") +end +end +report:Add("------------------------------------------------------------") +local text=report:Text() +if not Engineering then +self:_SendMessage(text,30,true,Group) +else +self:T(text) +end +if canbuild then +for _,_build in pairs(buildables)do +local build=_build +if build.CanBuild then +self:_CleanUpCrates(crates,build,number) +if self.buildtime and self.buildtime>0 then +local buildtimer=TIMER:New(self._BuildObjectFromCrates,self,Group,Unit,build,false,Group:GetCoordinate(),MultiDrop) +buildtimer:Start(self.buildtime) +self:_SendMessage(string.format("Build started, ready in %d seconds!",self.buildtime),15,false,Group) +self:__CratesBuildStarted(1,Group,Unit,build.Name) +self:_RefreshDropTroopsMenu(Group,Unit) +else +self:_BuildObjectFromCrates(Group,Unit,build,false,nil,MultiDrop) +end +end +end +end +else +if not Engineering then self:_SendMessage(string.format("No crates within %d meters!",finddist),10,false,Group)end +end +return self +end +function CTLD:_PackCratesNearby(Group,Unit) +self:T(self.lid.." _PackCratesNearby") +local location=Group:GetCoordinate() +local nearestGroups=SET_GROUP:New():FilterCoalitions("blue"):FilterZones({ZONE_RADIUS:New("TempZone",location:GetVec2(),self.PackDistance,false)}):FilterOnce() +for _,_Group in pairs(nearestGroups.Set)do +for _,_Template in pairs(_DATABASE.Templates.Groups)do +if(string.match(_Group:GetName(),_Template.GroupName))then +for _,_entry in pairs(self.Cargo_Crates)do +if(_entry.Templates[1]==_Template.GroupName)then +_Group:Destroy() +self:_GetCrates(Group,Unit,_entry,nil,false,true) +self:_RefreshLoadCratesMenu(Group,Unit) +self:__CratesPacked(1,Group,Unit,_entry) +return true +end +end +end +end +end +self:_SendMessage("Nothing to pack at this distance pilot!",10,false,Group) +return false +end +function CTLD:_RepairCrates(Group,Unit,Engineering) +self:T(self.lid.." _RepairCrates") +local finddist=self.CrateDistance or 35 +local crates,number=self:_FindCratesNearby(Group,Unit,finddist,true,true) +local buildables={} +local foundbuilds=false +local canbuild=false +if number>0 then +for _,_crate in pairs(crates)do +local Crate=_crate +if Crate:WasDropped()and Crate:IsRepair()and not Crate:IsStatic()then +local name=Crate:GetName() +local required=Crate:GetCratesNeeded() +local template=Crate:GetTemplates() +local ctype=Crate:GetType() +if not buildables[name]then +local object={} +object.Name=name +object.Required=required +object.Found=1 +object.Template=template +object.CanBuild=false +object.Type=ctype +buildables[name]=object +foundbuilds=true +else +buildables[name].Found=buildables[name].Found+1 +foundbuilds=true +end +if buildables[name].Found>=buildables[name].Required then +buildables[name].CanBuild=true +canbuild=true +end +self:T({repair=buildables}) +end +end +local report=REPORT:New("Checklist Repairs") +report:Add("------------------------------------------------------------") +for _,_build in pairs(buildables)do +local build=_build +local name=build.Name +local needed=build.Required +local found=build.Found +local txtok="NO" +if build.CanBuild then +txtok="YES" +end +local text=string.format("Type: %s | Required %d | Found %d | Can Repair %s",name,needed,found,txtok) +report:Add(text) +end +if not foundbuilds then report:Add(" --- None Found ---")end +report:Add("------------------------------------------------------------") +local text=report:Text() +if not Engineering then +self:_SendMessage(text,30,true,Group) +else +self:T(text) +end +if canbuild then +for _,_build in pairs(buildables)do +local build=_build +if build.CanBuild then +self:_RepairObjectFromCrates(Group,Unit,crates,build,number,Engineering) +end +end +end +else +if not Engineering then self:_SendMessage(string.format("No crates within %d meters!",finddist),10,false,Group)end +end +return self +end +function CTLD:_BuildObjectFromCrates(Group,Unit,Build,Repair,RepairLocation,MultiDrop) +self:T(self.lid.." _BuildObjectFromCrates") +if Group and Group:IsAlive()or(RepairLocation and not Repair)then +local name=Build.Name +local ctype=Build.Type +local canmove=false +if ctype==CTLD_CARGO.Enum.VEHICLE then canmove=true end +if ctype==CTLD_CARGO.Enum.STATIC then +return self +end +local temptable=Build.Template or{} +if type(temptable)=="string"then +temptable={temptable} +end +local zone=nil +if RepairLocation and not Repair then +zone=ZONE_RADIUS:New(string.format("Build zone-%d",math.random(1,10000)),RepairLocation:GetVec2(),100) +else +zone=ZONE_GROUP:New(string.format("Unload zone-%d",math.random(1,10000)),Group,100) +end +local randomcoord=Build.Coord or zone:GetRandomCoordinate(35):GetVec2() +if MultiDrop and(not Repair)and canmove then +local randomcoord=zone:GetRandomCoordinate(35):GetVec2() +end +if Repair then +randomcoord=RepairLocation:GetVec2() +end +for _,_template in pairs(temptable)do +self.TroopCounter=self.TroopCounter+1 +local alias=string.format("%s-%d",_template,math.random(1,100000)) +if canmove then +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitDelayOff() +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:OnSpawnGroup(function(grp)grp.spawntime=timer.getTime()end) +:SpawnFromVec2(randomcoord) +else +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitDelayOff() +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:OnSpawnGroup(function(grp)grp.spawntime=timer.getTime()end) +:SpawnFromVec2(randomcoord) +end +if Repair then +self:__CratesRepaired(1,Group,Unit,self.DroppedTroops[self.TroopCounter]) +else +self:__CratesBuild(1,Group,Unit,self.DroppedTroops[self.TroopCounter]) +end +end +else +self:T(self.lid.."Group KIA while building!") +end +return self +end +function CTLD:_GetVehicleFormation() +local VehicleMoveFormation=self.VehicleMoveFormation or AI.Task.VehicleFormation.VEE +if type(self.VehicleMoveFormation)=="table"then +VehicleMoveFormation=self.VehicleMoveFormation[math.random(1,#self.VehicleMoveFormation)] +end +return VehicleMoveFormation +end +function CTLD:_MoveGroupToZone(Group) +self:T(self.lid.." _MoveGroupToZone") +local groupname=Group:GetName()or"none" +local groupcoord=Group:GetCoordinate() +local outcome,name,zone,distance=self:IsUnitInZone(Group,CTLD.CargoZoneType.MOVE) +self:T({canmove=outcome,name=name,zone=zone,dist=distance,max=self.movetroopsdistance}) +if(distance<=self.movetroopsdistance)and outcome==true and zone~=nil then +local groupname=Group:GetName() +local zonecoord=zone:GetRandomCoordinate(20,125) +local formation=self:_GetVehicleFormation() +Group:SetAIOn() +Group:OptionAlarmStateAuto() +Group:OptionDisperseOnAttack(30) +Group:OptionROEOpenFire() +Group:RouteGroundTo(zonecoord,25,formation) +end +return self +end +function CTLD:_CleanUpCrates(Crates,Build,Number) +self:T(self.lid.." _CleanUpCrates") +local build=Build +local existingcrates=self.Spawned_Cargo +local newexcrates={} +local numberdest=Build.Required +local nametype=Build.Name +local found=0 +local rounds=Number +local destIDs={} +for _,_crate in pairs(Crates)do +local nowcrate=_crate +local name=nowcrate:GetName() +local thisID=nowcrate:GetID() +if name==nametype then +table.insert(destIDs,thisID) +found=found+1 +nowcrate:GetPositionable():Destroy(false) +nowcrate.Positionable=nil +nowcrate.HasBeenDropped=false +end +if found==numberdest then break end +end +self:_CleanupTrackedCrates(destIDs) +return self +end +function CTLD:_DropAndBuild(Group,Unit) +if self.nobuildinloadzones then +if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)then +self:_SendMessage("You cannot build in a loading area, Pilot!",10,false,Group) +return self +end +end +self:_UnloadCrates(Group,Unit) +timer.scheduleFunction(function()self:_BuildCrates(Group,Unit,false,true)end,{},timer.getTime()+1) +end +function CTLD:_DropSingleAndBuild(Group,Unit,setIndex) +if self.nobuildinloadzones then +if self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)then +self:_SendMessage("You cannot build in a loading area, Pilot!",10,false,Group) +return self +end +end +self:_UnloadSingleCrateSet(Group,Unit,setIndex) +timer.scheduleFunction(function()self:_BuildCrates(Group,Unit,false)end,{},timer.getTime()+1) +end +function CTLD:_PackAndLoad(Group,Unit) +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) +return self +end +if not self:_PackCratesNearby(Group,Unit)then +return self +end +timer.scheduleFunction(function()self:_LoadCratesNearby(Group,Unit)end,{},timer.getTime()+1) +return self +end +function CTLD:_PackAndRemove(Group,Unit) +if not self:_PackCratesNearby(Group,Unit)then +return self +end +timer.scheduleFunction(function()self:_RemoveCratesNearby(Group,Unit)end,{},timer.getTime()+1) +return self +end +function CTLD:_GetAndLoad(Group,Unit,cargoObj) +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) +return self +end +self:_GetCrates(Group,Unit,cargoObj) +timer.scheduleFunction(function()self:_LoadSingleCrateSet(Group,Unit,cargoObj.Name)end,{},timer.getTime()+1) +end +function CTLD:_GetAllAndLoad(Group,Unit) +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) +return self +end +timer.scheduleFunction(function()self:_LoadCratesNearby(Group,Unit)end,{},timer.getTime()+1) +end +function CTLD:_RefreshF10Menus() +self:T(self.lid.." _RefreshF10Menus") +self.onestepmenu=self.onestepmenu or false +local PlayerSet=self.PilotGroups +local PlayerTable=PlayerSet:GetSetObjects() +local _UnitList={} +for _,groupObj in pairs(PlayerTable)do +local firstUnit=groupObj:GetFirstUnitAlive() +if firstUnit then +if firstUnit:IsPlayer()then +if firstUnit:IsHelicopter()or(self.enableFixedWing and self:IsFixedWing(firstUnit))then +local _unit=firstUnit:GetName() +_UnitList[_unit]=_unit +end +end +end +end +if self.allowCATransport and self.CATransportSet then +for _,_clientobj in pairs(self.CATransportSet.Set)do +local client=_clientobj +if client:IsGround()then +local cname=client:GetName() +self:T(self.lid.."Adding: "..cname) +_UnitList[cname]=cname +end +end +end +self.CtldUnits=_UnitList +if self.usesubcats then +for _id,_cargo in pairs(self.Cargo_Crates)do +local entry=_cargo +if not self.subcats[entry.Subcategory]then +self.subcats[entry.Subcategory]=entry.Subcategory +end +end +for _id,_cargo in pairs(self.Cargo_Statics)do +local entry=_cargo +if not self.subcats[entry.Subcategory]then +self.subcats[entry.Subcategory]=entry.Subcategory +end +end +for _id,_cargo in pairs(self.Cargo_Troops)do +local entry=_cargo +if not self.subcatsTroop[entry.Subcategory]then +self.subcatsTroop[entry.Subcategory]=entry.Subcategory +end +end +end +local menucount=0 +local menus={} +for _,_unitName in pairs(self.CtldUnits)do +if(not self.MenusDone[_unitName])or(self.showstockinmenuitems==true)then +self:T(self.lid.."Menu not done yet for ".._unitName) +local _unit=UNIT:FindByName(_unitName) +if not _unit and self.allowCATransport then +_unit=CLIENT:FindByName(_unitName) +end +if _unit and _unit:IsAlive()then +local _group=_unit:GetGroup() +if _group then +self:T(self.lid.."Unit and Group exist") +local capabilities=self:_GetUnitCapabilities(_unit) +local cantroops=capabilities.troops +local cancrates=capabilities.crates +local unittype=_unit:GetTypeName() +local isHook=self:IsHook(_unit) +local nohookswitch=true +if _group.CTLDTopmenu then +_group.CTLDTopmenu:Remove() +_group.CTLDTopmenu=nil +end +local toptroops=nil +local topcrates=nil +local topmenu=MENU_GROUP:New(_group,"CTLD",nil) +_group.CTLDTopmenu=topmenu +if cantroops then +local toptroops=MENU_GROUP:New(_group,"Manage Troops",topmenu) +local troopsmenu=MENU_GROUP:New(_group,"Load troops",toptroops) +_group.MyTopTroopsMenu=toptroops +if self.usesubcats then +local subcatmenus={} +for catName,_ in pairs(self.subcatsTroop)do +subcatmenus[catName]=MENU_GROUP:New(_group,catName,troopsmenu) +end +for _,cargoObj in pairs(self.Cargo_Troops)do +if not cargoObj.DontShowInMenu then +local stock=cargoObj:GetStock() +local menutext=cargoObj.Name +if(stock>=0)and(self.showstockinmenuitems==true)then menutext=menutext.." ["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,menutext,subcatmenus[cargoObj.Subcategory],self._LoadTroops,self,_group,_unit,cargoObj) +end +end +else +for _,cargoObj in pairs(self.Cargo_Troops)do +if not cargoObj.DontShowInMenu then +local stock=cargoObj:GetStock() +local menutext=cargoObj.Name +if(stock>=0)and(self.showstockinmenuitems==true)then menutext=menutext.." ["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,menutext,troopsmenu,self._LoadTroops,self,_group,_unit,cargoObj) +end +end +end +local dropTroopsMenu=MENU_GROUP:New(_group,"Drop Troops",toptroops):Refresh() +MENU_GROUP_COMMAND:New(_group,"Drop ALL troops",dropTroopsMenu,self._UnloadTroops,self,_group,_unit):Refresh() +MENU_GROUP_COMMAND:New(_group,"Extract troops",toptroops,self._ExtractTroops,self,_group,_unit):Refresh() +local uName=_unit:GetName() +local loadedData=self.Loaded_Cargo[uName] +if loadedData and loadedData.Cargo then +for i,cargoObj in ipairs(loadedData.Cargo)do +if cargoObj and(cargoObj:GetType()==CTLD_CARGO.Enum.TROOPS or cargoObj:GetType()==CTLD_CARGO.Enum.ENGINEERS)and not cargoObj:WasDropped()then +local name=cargoObj:GetName()or"Unknown" +local needed=cargoObj:GetCratesNeeded()or 1 +local cID=cargoObj:GetID() +local line=string.format("Drop: %s",name,needed,cID) +MENU_GROUP_COMMAND:New(_group,line,dropTroopsMenu,self._UnloadSingleTroopByID,self,_group,_unit,cID):Refresh() +end +end +end +end +if cancrates then +local topcrates=MENU_GROUP:New(_group,"Manage Crates",topmenu) +_group.MyTopCratesMenu=topcrates +local cratesmenu=MENU_GROUP:New(_group,"Get Crates",topcrates) +if self.onestepmenu then +if self.usesubcats then +local subcatmenus={} +for catName,_ in pairs(self.subcats)do +subcatmenus[catName]=MENU_GROUP:New(_group,catName,cratesmenu) +end +for _,cargoObj in pairs(self.Cargo_Crates)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +local mSet=MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) +MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) +MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) +end +end +for _,cargoObj in pairs(self.Cargo_Statics)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +local mSet=MENU_GROUP:New(_group,txt,subcatmenus[cargoObj.Subcategory]) +MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) +MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) +end +end +else +for _,cargoObj in pairs(self.Cargo_Crates)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +local mSet=MENU_GROUP:New(_group,txt,cratesmenu) +MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) +MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) +end +end +for _,cargoObj in pairs(self.Cargo_Statics)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +local mSet=MENU_GROUP:New(_group,txt,cratesmenu) +MENU_GROUP_COMMAND:New(_group,"Get",mSet,self._GetCrates,self,_group,_unit,cargoObj) +MENU_GROUP_COMMAND:New(_group,"Get and Load",mSet,self._GetAndLoad,self,_group,_unit,cargoObj) +end +end +end +else +if self.usesubcats==true then +local subcatmenus={} +for catName,_ in pairs(self.subcats)do +subcatmenus[catName]=MENU_GROUP:New(_group,catName,cratesmenu) +end +for _,cargoObj in pairs(self.Cargo_Crates)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,txt,subcatmenus[cargoObj.Subcategory],self._GetCrates,self,_group,_unit,cargoObj) +end +end +for _,cargoObj in pairs(self.Cargo_Statics)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,txt,subcatmenus[cargoObj.Subcategory],self._GetCrates,self,_group,_unit,cargoObj) +end +end +else +for _,cargoObj in pairs(self.Cargo_Crates)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,txt,cratesmenu,self._GetCrates,self,_group,_unit,cargoObj) +end +end +for _,cargoObj in pairs(self.Cargo_Statics)do +if not cargoObj.DontShowInMenu then +local needed=cargoObj:GetCratesNeeded()or 1 +local txt=string.format("%d crate%s %s (%dkg)",needed,needed==1 and""or"s",cargoObj.Name,cargoObj.PerCrateMass or 0) +if cargoObj.Location then txt=txt.."[R]"end +local stock=cargoObj:GetStock() +if stock>=0 and self.showstockinmenuitems then txt=txt.."["..stock.."]"end +MENU_GROUP_COMMAND:New(_group,txt,cratesmenu,self._GetCrates,self,_group,_unit,cargoObj) +end +end +end +end +local loadCratesMenu=MENU_GROUP:New(_group,"Load Crates",topcrates) +_group.MyLoadCratesMenu=loadCratesMenu +MENU_GROUP_COMMAND:New(_group,"Load ALL",loadCratesMenu,self._LoadCratesNearby,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"Show loadable crates",loadCratesMenu,self._RefreshLoadCratesMenu,self,_group,_unit) +local dropCratesMenu=MENU_GROUP:New(_group,"Drop Crates",topcrates) +topcrates.DropCratesMenu=dropCratesMenu +if not self.nobuildmenu then +MENU_GROUP_COMMAND:New(_group,"Build crates",topcrates,self._BuildCrates,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"Repair",topcrates,self._RepairCrates,self,_group,_unit):Refresh() +end +local removecratesmenu=MENU_GROUP:New(_group,"Remove crates",topcrates) +MENU_GROUP_COMMAND:New(_group,"Remove crates nearby",removecratesmenu,self._RemoveCratesNearby,self,_group,_unit) +if self.onestepmenu then +local mPack=MENU_GROUP:New(_group,"Pack crates",topcrates) +MENU_GROUP_COMMAND:New(_group,"Pack",mPack,self._PackCratesNearby,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"Pack and Load",mPack,self._PackAndLoad,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"Pack and Remove",mPack,self._PackAndRemove,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"List crates nearby",topcrates,self._ListCratesNearby,self,_group,_unit) +else +MENU_GROUP_COMMAND:New(_group,"Pack crates",topcrates,self._PackCratesNearby,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"List crates nearby",topcrates,self._ListCratesNearby,self,_group,_unit) +end +local uName=_unit:GetName() +local loadedData=self.Loaded_Cargo[uName] +if loadedData and loadedData.Cargo then +local cargoByName={} +for _,cgo in pairs(loadedData.Cargo)do +if cgo and(not cgo:WasDropped())then +local cname=cgo:GetName() +local cneeded=cgo:GetCratesNeeded() +cargoByName[cname]=cargoByName[cname]or{count=0,needed=cneeded} +cargoByName[cname].count=cargoByName[cname].count+1 +end +end +for name,info in pairs(cargoByName)do +local line=string.format("Drop %s (%d/%d)",name,info.count,info.needed) +MENU_GROUP_COMMAND:New(_group,line,dropCratesMenu,self._UnloadSingleCrateSet,self,_group,_unit,name) +end +end +end +MENU_GROUP_COMMAND:New(_group,"List boarded cargo",topmenu,self._ListCargo,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"Inventory",topmenu,self._ListInventory,self,_group,_unit) +MENU_GROUP_COMMAND:New(_group,"List active zone beacons",topmenu,self._ListRadioBeacons,self,_group,_unit) +local smoketopmenu=MENU_GROUP:New(_group,"Smokes, Flares, Beacons",topmenu) +MENU_GROUP_COMMAND:New(_group,"Smoke zones nearby",smoketopmenu,self.SmokeZoneNearBy,self,_unit,false) +local smokeself=MENU_GROUP:New(_group,"Drop smoke now",smoketopmenu) +MENU_GROUP_COMMAND:New(_group,"Red smoke",smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Red) +MENU_GROUP_COMMAND:New(_group,"Blue smoke",smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Blue) +MENU_GROUP_COMMAND:New(_group,"Green smoke",smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Green) +MENU_GROUP_COMMAND:New(_group,"Orange smoke",smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.Orange) +MENU_GROUP_COMMAND:New(_group,"White smoke",smokeself,self.SmokePositionNow,self,_unit,false,SMOKECOLOR.White) +MENU_GROUP_COMMAND:New(_group,"Flare zones nearby",smoketopmenu,self.SmokeZoneNearBy,self,_unit,true) +MENU_GROUP_COMMAND:New(_group,"Fire flare now",smoketopmenu,self.SmokePositionNow,self,_unit,true) +MENU_GROUP_COMMAND:New(_group,"Drop beacon now",smoketopmenu,self.DropBeaconNow,self,_unit):Refresh() +if self:IsFixedWing(_unit)then +MENU_GROUP_COMMAND:New(_group,"Show flight parameters",topmenu,self._ShowFlightParams,self,_group,_unit):Refresh() +else +MENU_GROUP_COMMAND:New(_group,"Show hover parameters",topmenu,self._ShowHoverParams,self,_group,_unit):Refresh() +end +self.MenusDone[_unitName]=true +self:_RefreshLoadCratesMenu(_group,_unit) +self:_RefreshDropCratesMenu(_group,_unit) +end +end +else +self:T(self.lid.." Menus already done for this group!") +end +end +return self +end +function CTLD:_RefreshLoadCratesMenu(Group,Unit) +if not Group.MyLoadCratesMenu then return end +Group.MyLoadCratesMenu:RemoveSubMenus() +local d=self.CrateDistance or 35 +local nearby,n=self:_FindCratesNearby(Group,Unit,d,true,true) +if n==0 then +MENU_GROUP_COMMAND:New(Group,"No crates found! Rescan?",Group.MyLoadCratesMenu,function()self:_RefreshLoadCratesMenu(Group,Unit)end) +return +end +MENU_GROUP_COMMAND:New(Group,"Load ALL",Group.MyLoadCratesMenu,self._LoadCratesNearby,self,Group,Unit) +local cargoByName={} +for _,crate in pairs(nearby)do +local name=crate:GetName() +cargoByName[name]=cargoByName[name]or{} +table.insert(cargoByName[name],crate) +end +local lineIndex=1 +for cName,list in pairs(cargoByName)do +local needed=list[1]:GetCratesNeeded()or 1 +table.sort(list,function(a,b)return a:GetID()<b:GetID()end) +local i=1 +while i<=#list do +local left=#list-i+1 +local label +if left>=needed then +label=string.format("%d. Load %s",lineIndex,cName) +i=i+needed +else +label=string.format("%d. Load %s (%d/%d)",lineIndex,cName,left,needed) +i=#list+1 +end +MENU_GROUP_COMMAND:New(Group,label,Group.MyLoadCratesMenu,self._LoadSingleCrateSet,self,Group,Unit,cName) +lineIndex=lineIndex+1 +end +end +end +function CTLD:_LoadSingleCrateSet(Group,Unit,cargoName) +self:T(self.lid.." _LoadSingleCrateSet cargoName="..(cargoName or"nil")) +local grounded=not self:IsUnitInAir(Unit) +local hover=self:CanHoverLoad(Unit) +if not grounded and not hover then +self:_SendMessage("You must land or hover to load crates!",10,false,Group) +return self +end +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to load cargo!",10,false,Group) +return self +end +local finddist=self.CrateDistance or 35 +local cratesNearby,number=self:_FindCratesNearby(Group,Unit,finddist,false,false) +if number==0 then +self:_SendMessage("No crates found in range!",10,false,Group) +return self +end +local matchingCrates={} +local needed=nil +for _,crateObj in pairs(cratesNearby)do +if crateObj:GetName()==cargoName then +needed=needed or crateObj:GetCratesNeeded() +table.insert(matchingCrates,crateObj) +end +end +if not needed then +self:_SendMessage(string.format("No \"%s\" crates found in range!",cargoName),10,false,Group) +return self +end +local found=#matchingCrates +local unitName=Unit:GetName() +local loadedData=self.Loaded_Cargo[unitName]or{Troopsloaded=0,Cratesloaded=0,Cargo={}} +local capabilities=self:_GetUnitCapabilities(Unit) +local capacity=capabilities.cratelimit or 0 +if loadedData.Cratesloaded>=capacity then +self:_SendMessage("No more capacity to load crates!",10,false,Group) +return self +end +local spaceLeft=capacity-loadedData.Cratesloaded +local toLoad=math.min(found,needed,spaceLeft) +if toLoad<1 then +self:_SendMessage("Cannot load crates: either none found or no capacity left.",10,false,Group) +return self +end +local crateIDsLoaded={} +for i=1,toLoad do +local crate=matchingCrates[i] +crate:SetHasMoved(true) +crate:SetWasDropped(false) +table.insert(loadedData.Cargo,crate) +loadedData.Cratesloaded=loadedData.Cratesloaded+1 +local stObj=crate:GetPositionable() +if stObj and stObj:IsAlive()then +stObj:Destroy(false) +end +table.insert(crateIDsLoaded,crate:GetID()) +end +self.Loaded_Cargo[unitName]=loadedData +self:_UpdateUnitCargoMass(Unit) +local newSpawned={} +for _,cObj in ipairs(self.Spawned_Cargo)do +local keep=true +for i=1,toLoad do +if matchingCrates[i]and cObj:GetID()==matchingCrates[i]:GetID()then +keep=false +break +end +end +if keep then +table.insert(newSpawned,cObj) +end +end +self.Spawned_Cargo=newSpawned +local loadedHere=toLoad +if loadedHere<needed and loadedData.Cratesloaded>=capacity then +self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s. Cargo limit is now reached!",loadedHere,needed,cargoName),10,false,Group) +else +local fullSets=math.floor(loadedHere/needed) +local leftover=loadedHere%needed +if needed>1 then +if fullSets>0 and leftover==0 then +self:_SendMessage(string.format("Loaded %d %s.",fullSets,cargoName),10,false,Group) +elseif fullSets>0 and leftover>0 then +self:_SendMessage(string.format("Loaded %d %s(s), with %d leftover crate(s).",fullSets,cargoName,leftover),10,false,Group) +else +self:_SendMessage(string.format("Loaded only %d/%d crate(s) of %s.",loadedHere,needed,cargoName),15,false,Group) +end +else +self:_SendMessage(string.format("Loaded %d %s(s).",loadedHere,cargoName),10,false,Group) +end +end +self:_RefreshLoadCratesMenu(Group,Unit) +self:_RefreshDropCratesMenu(Group,Unit) +return self +end +function CTLD:_UnloadSingleCrateSet(Group,Unit,setIndex) +self:T(self.lid.." _UnloadSingleCrateSet") +if not self.dropcratesanywhere then +local inzone,zoneName,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.DROP) +if not inzone then +self:_SendMessage("You are not close enough to a drop zone!",10,false,Group) +if not self.debug then +return self +end +end +end +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to drop cargo!",10,false,Group) +if not self.debug then return self end +end +local unitName=Unit:GetName() +if not self.CrateGroupList or not self.CrateGroupList[unitName]then +self:_SendMessage("No crate groups found for this unit!",10,false,Group) +if not self.debug then return self end +return self +end +local chunk=self.CrateGroupList[unitName][setIndex] +if not chunk then +self:_SendMessage("No crate set found or index invalid!",10,false,Group) +if not self.debug then return self end +return self +end +if#chunk==0 then +self:_SendMessage("No crate found in that set!",10,false,Group) +if not self.debug then return self end +return self +end +local grounded=not self:IsUnitInAir(Unit) +local hoverunload=self:IsCorrectHover(Unit) +local isHerc=self:IsFixedWing(Unit) +local isHook=self:IsHook(Unit) +if isHerc and not isHook then +hoverunload=self:IsCorrectFlightParameters(Unit) +end +if not grounded and not hoverunload then +if isHerc then +self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) +else +self:_SendMessage("Nothing loaded or not hovering within parameters!",10,false,Group) +end +if not self.debug then return self end +return self +end +local crateObj=chunk[1] +if not crateObj then +self:_SendMessage("No crate found in that set!",10,false,Group) +if not self.debug then return self end +return self +end +local needed=crateObj:GetCratesNeeded()or 1 +self:_GetCrates(Group,Unit,crateObj,#chunk,true) +for _,cObj in ipairs(chunk)do +cObj:SetWasDropped(true) +cObj:SetHasMoved(true) +end +local cname=crateObj:GetName()or"Unknown" +local count=#chunk +if needed>1 then +if count==needed then +self:_SendMessage(string.format("Dropped %d %s.",1,cname),10,false,Group) +else +self:_SendMessage(string.format("Dropped %d/%d crate(s) of %s.",count,needed,cname),15,false,Group) +end +else +self:_SendMessage(string.format("Dropped %d %s(s).",count,cname),10,false,Group) +end +local loadedData=self.Loaded_Cargo[unitName] +if loadedData and loadedData.Cargo then +local newList={} +local newCratesCount=0 +for _,cObj in ipairs(loadedData.Cargo)do +if not cObj:WasDropped()then +table.insert(newList,cObj) +local ct=cObj:GetType() +if ct~=CTLD_CARGO.Enum.TROOPS and ct~=CTLD_CARGO.Enum.ENGINEERS then +newCratesCount=newCratesCount+1 +end +end +end +loadedData.Cargo=newList +loadedData.Cratesloaded=newCratesCount +self.Loaded_Cargo[unitName]=loadedData +end +self:_UpdateUnitCargoMass(Unit) +self:_RefreshDropCratesMenu(Group,Unit) +self:_RefreshLoadCratesMenu(Group,Unit) +return self +end +function CTLD:_RefreshDropCratesMenu(Group,Unit) +if not Group.CTLDTopmenu then return end +local topCrates=Group.MyTopCratesMenu +if not topCrates then return end +if topCrates.DropCratesMenu then +topCrates.DropCratesMenu:RemoveSubMenus() +else +topCrates.DropCratesMenu=MENU_GROUP:New(Group,"Drop Crates",topCrates) +end +local dropCratesMenu=topCrates.DropCratesMenu +local loadedData=self.Loaded_Cargo[Unit:GetName()] +if not loadedData or not loadedData.Cargo then +MENU_GROUP_COMMAND:New(Group,"No crates to drop!",dropCratesMenu,function()end) +return +end +local cargoByName={} +local dropableCrates=0 +for _,cObj in ipairs(loadedData.Cargo)do +if cObj and not cObj:WasDropped()then +local cType=cObj:GetType() +if cType~=CTLD_CARGO.Enum.TROOPS and cType~=CTLD_CARGO.Enum.ENGINEERS and cType~=CTLD_CARGO.Enum.GCLOADABLE then +local name=cObj:GetName()or"Unknown" +cargoByName[name]=cargoByName[name]or{} +table.insert(cargoByName[name],cObj) +dropableCrates=dropableCrates+1 +end +end +end +if dropableCrates==0 then +MENU_GROUP_COMMAND:New(Group,"No crates to drop!",dropCratesMenu,function()end) +return +end +if not self.onestepmenu then +MENU_GROUP_COMMAND:New(Group,"Drop ALL crates",dropCratesMenu,self._UnloadCrates,self,Group,Unit) +self.CrateGroupList=self.CrateGroupList or{} +self.CrateGroupList[Unit:GetName()]={} +local lineIndex=1 +for cName,list in pairs(cargoByName)do +local needed=list[1]:GetCratesNeeded()or 1 +table.sort(list,function(a,b)return a:GetID()<b:GetID()end) +local i=1 +while i<=#list do +local left=(#list-i+1) +if left>=needed then +local chunk={} +for n=i,i+needed-1 do +table.insert(chunk,list[n]) +end +local label=string.format("%d. %s",lineIndex,cName) +table.insert(self.CrateGroupList[Unit:GetName()],chunk) +local setIndex=#self.CrateGroupList[Unit:GetName()] +MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) +i=i+needed +else +local chunk={} +for n=i,#list do +table.insert(chunk,list[n]) +end +local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) +table.insert(self.CrateGroupList[Unit:GetName()],chunk) +local setIndex=#self.CrateGroupList[Unit:GetName()] +MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) +i=#list+1 +end +lineIndex=lineIndex+1 +end +end +else +local mAll=MENU_GROUP:New(Group,"Drop ALL crates",dropCratesMenu) +MENU_GROUP_COMMAND:New(Group,"Drop",mAll,self._UnloadCrates,self,Group,Unit) +if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then +MENU_GROUP_COMMAND:New(Group,"Drop and build",mAll,self._DropAndBuild,self,Group,Unit) +end +self.CrateGroupList=self.CrateGroupList or{} +self.CrateGroupList[Unit:GetName()]={} +local lineIndex=1 +for cName,list in pairs(cargoByName)do +local needed=list[1]:GetCratesNeeded()or 1 +table.sort(list,function(a,b)return a:GetID()<b:GetID()end) +local i=1 +while i<=#list do +local left=(#list-i+1) +if left>=needed then +local chunk={} +for n=i,i+needed-1 do +table.insert(chunk,list[n]) +end +local label=string.format("%d. %s",lineIndex,cName) +table.insert(self.CrateGroupList[Unit:GetName()],chunk) +local setIndex=#self.CrateGroupList[Unit:GetName()] +local mSet=MENU_GROUP:New(Group,label,dropCratesMenu) +MENU_GROUP_COMMAND:New(Group,"Drop",mSet,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) +if not(self:IsUnitInAir(Unit)and self:IsFixedWing(Unit))then +MENU_GROUP_COMMAND:New(Group,"Drop and build",mSet,self._DropSingleAndBuild,self,Group,Unit,setIndex) +end +i=i+needed +else +local chunk={} +for n=i,#list do +table.insert(chunk,list[n]) +end +local label=string.format("%d. %s %d/%d",lineIndex,cName,left,needed) +table.insert(self.CrateGroupList[Unit:GetName()],chunk) +local setIndex=#self.CrateGroupList[Unit:GetName()] +MENU_GROUP_COMMAND:New(Group,label,dropCratesMenu,self._UnloadSingleCrateSet,self,Group,Unit,setIndex) +i=#list+1 +end +lineIndex=lineIndex+1 +end +end +end +end +function CTLD:_UnloadSingleTroopByID(Group,Unit,chunkID) +self:T(self.lid.." _UnloadSingleTroopByID chunkID="..tostring(chunkID)) +local droppingatbase=false +local inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD) +if not inzone then +inzone,zonename,zone,distance=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) +end +if inzone then +droppingatbase=self.returntroopstobase +end +if self.pilotmustopendoors and not UTILS.IsLoadingDoorOpen(Unit:GetName())then +self:_SendMessage("You need to open the door(s) to unload troops!",10,false,Group) +if not self.debug then return self end +end +local hoverunload=self:IsCorrectHover(Unit) +local isHerc=self:IsFixedWing(Unit) +local isHook=self:IsHook(Unit) +if isHerc and not isHook then +hoverunload=self:IsCorrectFlightParameters(Unit) +end +local grounded=not self:IsUnitInAir(Unit) +local unitName=Unit:GetName() +if self.Loaded_Cargo[unitName]and(grounded or hoverunload)then +if not droppingatbase or self.debug then +if not self.TroopsIDToChunk or not self.TroopsIDToChunk[chunkID]then +self:_SendMessage(string.format("No troop cargo chunk found for ID %d!",chunkID),10,false,Group) +if not self.debug then return self end +return self +end +local chunk=self.TroopsIDToChunk[chunkID] +if not chunk or#chunk==0 then +self:_SendMessage(string.format("Troop chunk is empty for ID %d!",chunkID),10,false,Group) +if not self.debug then return self end +return self +end +local foundCargo=chunk[1] +if not foundCargo then +self:_SendMessage(string.format("No troop cargo at chunk %d!",chunkID),10,false,Group) +if not self.debug then return self end +return self +end +local cType=foundCargo:GetType() +local name=foundCargo:GetName()or"none" +local tmpl=foundCargo:GetTemplates()or{} +local zoneradius=self.troopdropzoneradius or 100 +local factor=1 +if isHerc then +factor=foundCargo:GetCratesNeeded()or 1 +zoneradius=Unit:GetVelocityMPS()or 100 +end +local zone=ZONE_GROUP:New(string.format("Unload zone-%s",unitName),Group,zoneradius*factor) +local randomcoord=zone:GetRandomCoordinate(10,30*factor) +local heading=Group:GetHeading()or 0 +if grounded or hoverunload then +randomcoord=Group:GetCoordinate() +local Angle=(heading+270)%360 +if isHerc or isHook then +Angle=(heading+180)%360 +end +local offset=hoverunload and self.TroopUnloadDistHover or self.TroopUnloadDistGround +if isHerc then +offset=self.TroopUnloadDistGroundHerc or 25 +end +if isHook then +offset=self.TroopUnloadDistGroundHook or 15 +if hoverunload and self.TroopUnloadDistHoverHook then +offset=self.TroopUnloadDistHoverHook or 5 +end +end +randomcoord:Translate(offset,Angle,nil,true) +end +local tempcount=0 +if isHook then +tempcount=self.ChinookTroopCircleRadius or 5 +end +for _,_template in pairs(tmpl)do +self.TroopCounter=self.TroopCounter+1 +tempcount=tempcount+1 +local alias=string.format("%s-%d",_template,math.random(1,100000)) +local rad=2.5+(tempcount*2) +local Positions=self:_GetUnitPositions(randomcoord,rad,heading,_template) +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitDelayOff() +:InitSetUnitAbsolutePositions(Positions) +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:OnSpawnGroup(function(grp)grp.spawntime=timer.getTime()end) +:SpawnFromVec2(randomcoord:GetVec2()) +self:__TroopsDeployed(1,Group,Unit,self.DroppedTroops[self.TroopCounter],cType) +end +foundCargo:SetWasDropped(true) +if cType==CTLD_CARGO.Enum.ENGINEERS then +self.Engineers=self.Engineers+1 +local grpname=self.DroppedTroops[self.TroopCounter]:GetName() +self.EngineersInField[self.Engineers]=CTLD_ENGINEERING:New(name,grpname) +self:_SendMessage(string.format("Dropped Engineers %s into action!",name),10,false,Group) +else +self:_SendMessage(string.format("Dropped Troops %s into action!",name),10,false,Group) +end +table.remove(chunk,1) +if#chunk==0 then +self.TroopsIDToChunk[chunkID]=nil +end +else +self:_SendMessage("Troops have returned to base!",10,false,Group) +self:__TroopsRTB(1,Group,Unit,zonename,zone) +if self.TroopsIDToChunk and self.TroopsIDToChunk[chunkID]then +local chunk=self.TroopsIDToChunk[chunkID] +if#chunk>0 then +local firstObj=chunk[1] +local cName=firstObj:GetName() +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +if _troop.Name==cName then +local st=_troop:GetStock() +if st and tonumber(st)>=0 then +_troop:AddStock() +end +end +end +firstObj:SetWasDropped(true) +table.remove(chunk,1) +if#chunk==0 then +self.TroopsIDToChunk[chunkID]=nil +end +end +end +end +local cargoList=self.Loaded_Cargo[unitName].Cargo +for i=#cargoList,1,-1 do +if cargoList[i]:WasDropped()then +table.remove(cargoList,i) +end +end +local troopsLoaded=0 +local cratesLoaded=0 +for _,cargo in ipairs(cargoList)do +local cT=cargo:GetType() +if cT==CTLD_CARGO.Enum.TROOPS or cT==CTLD_CARGO.Enum.ENGINEERS then +troopsLoaded=troopsLoaded+1 +else +cratesLoaded=cratesLoaded+1 +end +end +self.Loaded_Cargo[unitName].Troopsloaded=troopsLoaded +self.Loaded_Cargo[unitName].Cratesloaded=cratesLoaded +self:_RefreshDropTroopsMenu(Group,Unit) +else +local isHerc=self:IsFixedWing(Unit) +if isHerc then +self:_SendMessage("Nothing loaded or not within airdrop parameters!",10,false,Group) +else +self:_SendMessage("Nothing loaded or not hovering within parameters!",10,false,Group) +end +end +return self +end +function CTLD:_RefreshDropTroopsMenu(Group,Unit) +local theGroup=Group +local theUnit=Unit +if not theGroup.CTLDTopmenu then return end +local topTroops=theGroup.MyTopTroopsMenu +if not topTroops then return end +if topTroops.DropTroopsMenu then +topTroops.DropTroopsMenu:Remove() +end +local dropTroopsMenu=MENU_GROUP:New(theGroup,"Drop Troops",topTroops) +topTroops.DropTroopsMenu=dropTroopsMenu +MENU_GROUP_COMMAND:New(theGroup,"Drop ALL troops",dropTroopsMenu,self._UnloadTroops,self,theGroup,theUnit) +local loadedData=self.Loaded_Cargo[theUnit:GetName()] +if not loadedData or not loadedData.Cargo then return end +local troopsByName={} +for _,cargoObj in ipairs(loadedData.Cargo)do +if cargoObj +and(cargoObj:GetType()==CTLD_CARGO.Enum.TROOPS or cargoObj:GetType()==CTLD_CARGO.Enum.ENGINEERS) +and not cargoObj:WasDropped() +then +local name=cargoObj:GetName()or"Unknown" +troopsByName[name]=troopsByName[name]or{} +table.insert(troopsByName[name],cargoObj) +end +end +self.TroopsIDToChunk=self.TroopsIDToChunk or{} +for tName,objList in pairs(troopsByName)do +table.sort(objList,function(a,b)return a:GetID()<b:GetID()end) +local count=#objList +local chunkID=objList[1]:GetID() +self.TroopsIDToChunk[chunkID]=objList +local label=string.format("Drop %s (%d)",tName,count) +MENU_GROUP_COMMAND:New(theGroup,label,dropTroopsMenu,self._UnloadSingleTroopByID,self,theGroup,theUnit,chunkID) +end +end +function CTLD:_CheckTemplates(temptable) +self:T(self.lid.." _CheckTemplates") +local outcome=true +if type(temptable)~="table"then +temptable={temptable} +end +for _,_name in pairs(temptable)do +if not _DATABASE.Templates.Groups[_name]then +outcome=false +self:E(self.lid.."ERROR: Template name ".._name.." is missing!") +end +end +return outcome +end +function CTLD:AddTroopsCargo(Name,Templates,Type,NoTroops,PerTroopMass,Stock,SubCategory) +self:T(self.lid.." AddTroopsCargo") +self:T({Name,Templates,Type,NoTroops,PerTroopMass,Stock}) +if not self:_CheckTemplates(Templates)then +self:E(self.lid.."Troops Cargo for "..Name.." has missing template(s)!") +return self +end +self.CargoCounter=self.CargoCounter+1 +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,Templates,Type,false,true,NoTroops,nil,nil,PerTroopMass,Stock,SubCategory) +table.insert(self.Cargo_Troops,cargo) +if SubCategory and self.usesubcats~=true then self.usesubcats=true end +return self +end +function CTLD:AddCratesCargo(Name,Templates,Type,NoCrates,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location,UnitTypes,Category,TypeName,ShapeName) +self:T(self.lid.." AddCratesCargo") +if not self:_CheckTemplates(Templates)then +self:E(self.lid.."Crates Cargo for "..Name.." has missing template(s)!") +return self +end +self.CargoCounter=self.CargoCounter+1 +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,Templates,Type,false,false,NoCrates,nil,nil,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location) +if UnitTypes then +cargo:AddUnitTypeName(UnitTypes) +end +cargo:SetStaticTypeAndShape("Cargos",self.basetype) +if TypeName then +cargo:SetStaticTypeAndShape(Category,TypeName,ShapeName) +end +table.insert(self.Cargo_Crates,cargo) +if SubCategory and self.usesubcats~=true then self.usesubcats=true end +return self +end +function CTLD:AddCratesCargoNoMove(Name,Templates,Type,NoCrates,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location,UnitTypes,Category,TypeName,ShapeName) +self:T(self.lid.." AddCratesCargoNoMove") +if not self:_CheckTemplates(Templates)then +self:E(self.lid.."Crates Cargo for "..Name.." has missing template(s)!") +return self +end +self.CargoCounter=self.CargoCounter+1 +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,Templates,Type,false,false,NoCrates,nil,nil,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location) +cargo.NoMoveToZone=true +if UnitTypes then +cargo:AddUnitTypeName(UnitTypes) +end +cargo:SetStaticTypeAndShape("Cargos",self.basetype) +if TypeName then +cargo:SetStaticTypeAndShape(Category,TypeName,ShapeName) +end +table.insert(self.Cargo_Crates,cargo) +self.templateToCargoName=self.templateToCargoName or{} +if type(Templates)=="table"then +for _,t in pairs(Templates)do self.templateToCargoName[t]=Name end +else +self.templateToCargoName[Templates]=Name +end +self.nomovetozone_names=self.nomovetozone_names or{} +self.nomovetozone_names[Name]=true +if SubCategory and self.usesubcats~=true then self.usesubcats=true end +return self +end +function CTLD:AddStaticsCargo(Name,Mass,Stock,SubCategory,DontShowInMenu,Location) +self:T(self.lid.." AddStaticsCargo") +self.CargoCounter=self.CargoCounter+1 +local type=CTLD_CARGO.Enum.STATIC +local template=STATIC:FindByName(Name,true):GetTypeName() +local unittemplate=_DATABASE:GetStaticUnitTemplate(Name) +local ResourceMap=nil +if unittemplate and unittemplate.resourcePayload then +ResourceMap=UTILS.DeepCopy(unittemplate.resourcePayload) +end +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,template,type,false,false,1,nil,nil,Mass,Stock,SubCategory,DontShowInMenu,Location) +cargo:SetStaticResourceMap(ResourceMap) +table.insert(self.Cargo_Statics,cargo) +if SubCategory and self.usesubcats~=true then self.usesubcats=true end +return cargo +end +function CTLD:GetStaticsCargoFromTemplate(Name,Mass) +self:T(self.lid.." GetStaticsCargoFromTemplate") +self.CargoCounter=self.CargoCounter+1 +local type=CTLD_CARGO.Enum.STATIC +local template=STATIC:FindByName(Name,true):GetTypeName() +local unittemplate=_DATABASE:GetStaticUnitTemplate(Name) +local ResourceMap=nil +if unittemplate and unittemplate.resourcePayload then +ResourceMap=UTILS.DeepCopy(unittemplate.resourcePayload) +end +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,template,type,false,false,1,nil,nil,Mass,1) +cargo:SetStaticResourceMap(ResourceMap) +return cargo +end +function CTLD:AddCratesRepair(Name,Template,Type,NoCrates,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location,UnitTypes,Category,TypeName,ShapeName) +self:T(self.lid.." AddCratesRepair") +if not self:_CheckTemplates(Template)then +self:E(self.lid.."Repair Cargo for "..Name.." has a missing template!") +return self +end +self.CargoCounter=self.CargoCounter+1 +local cargo=CTLD_CARGO:New(self.CargoCounter,Name,Template,Type,false,false,NoCrates,nil,nil,PerCrateMass,Stock,SubCategory,DontShowInMenu,Location) +if UnitTypes then +cargo:AddUnitTypeName(UnitTypes) +end +cargo:SetStaticTypeAndShape("cargos",self.basetype) +if TypeName then +cargo:SetStaticTypeAndShape(Category,TypeName,ShapeName) +end +table.insert(self.Cargo_Crates,cargo) +return self +end +function CTLD:AddZone(Zone) +self:T(self.lid.." AddZone") +local zone=Zone +if zone.type==CTLD.CargoZoneType.LOAD then +table.insert(self.pickupZones,zone) +elseif zone.type==CTLD.CargoZoneType.DROP then +table.insert(self.dropOffZones,zone) +elseif zone.type==CTLD.CargoZoneType.SHIP then +table.insert(self.shipZones,zone) +elseif zone.type==CTLD.CargoZoneType.BEACON then +table.insert(self.droppedBeacons,zone) +else +table.insert(self.wpZones,zone) +end +return self +end +function CTLD:ActivateZone(Name,ZoneType,NewState) +self:T(self.lid.." ActivateZone") +local newstate=true +if NewState~=nil then +newstate=NewState +end +local table={} +if ZoneType==CTLD.CargoZoneType.LOAD then +table=self.pickupZones +elseif ZoneType==CTLD.CargoZoneType.DROP then +table=self.dropOffZones +elseif ZoneType==CTLD.CargoZoneType.SHIP then +table=self.shipZones +elseif ZoneType==CTLD.CargoZoneType.BEACON then +table=self.droppedBeacons +else +table=self.wpZones +end +for _,_zone in pairs(table)do +local thiszone=_zone +if thiszone.name==Name then +thiszone.active=newstate +break +end +end +return self +end +function CTLD:DeactivateZone(Name,ZoneType) +self:T(self.lid.." DeactivateZone") +self:ActivateZone(Name,ZoneType,false) +return self +end +function CTLD:_GetFMBeacon(Name) +self:T(self.lid.." _GetFMBeacon") +local beacon={} +if#self.FreeFMFrequencies<=1 then +self.FreeFMFrequencies=self.UsedFMFrequencies +self.UsedFMFrequencies={} +end +local FM=table.remove(self.FreeFMFrequencies,math.random(#self.FreeFMFrequencies)) +table.insert(self.UsedFMFrequencies,FM) +beacon.name=Name +beacon.frequency=FM/1000000 +beacon.modulation=CTLD.RadioModulation.FM +return beacon +end +function CTLD:_GetUHFBeacon(Name) +self:T(self.lid.." _GetUHFBeacon") +local beacon={} +if#self.FreeUHFFrequencies<=1 then +self.FreeUHFFrequencies=self.UsedUHFFrequencies +self.UsedUHFFrequencies={} +end +local UHF=table.remove(self.FreeUHFFrequencies,math.random(#self.FreeUHFFrequencies)) +table.insert(self.UsedUHFFrequencies,UHF) +beacon.name=Name +beacon.frequency=UHF/1000000 +beacon.modulation=CTLD.RadioModulation.AM +return beacon +end +function CTLD:_GetVHFBeacon(Name) +self:T(self.lid.." _GetVHFBeacon") +local beacon={} +if#self.FreeVHFFrequencies<=3 then +self.FreeVHFFrequencies=self.UsedVHFFrequencies +self.UsedVHFFrequencies={} +end +local VHF=table.remove(self.FreeVHFFrequencies,math.random(#self.FreeVHFFrequencies)) +table.insert(self.UsedVHFFrequencies,VHF) +beacon.name=Name +beacon.frequency=VHF/1000000 +beacon.modulation=CTLD.RadioModulation.FM +return beacon +end +function CTLD:AddCTLDZone(Name,Type,Color,Active,HasBeacon,Shiplength,Shipwidth) +self:T(self.lid.." AddCTLDZone") +local zone=ZONE:FindByName(Name) +if not zone and Type~=CTLD.CargoZoneType.SHIP then +self:E(self.lid.."**** Zone does not exist: "..Name) +return self +end +if Type==CTLD.CargoZoneType.SHIP then +local Ship=UNIT:FindByName(Name) +if not Ship then +self:E(self.lid.."**** Ship does not exist: "..Name) +return self +end +end +local exists=true +local ctldzone=self:GetCTLDZone(Name,Type) +if not ctldzone then +exists=false +ctldzone={} +end +ctldzone.active=Active or false +ctldzone.color=Color or SMOKECOLOR.Red +ctldzone.name=Name or"NONE" +ctldzone.type=Type or CTLD.CargoZoneType.MOVE +ctldzone.hasbeacon=HasBeacon or false +if Type==CTLD.CargoZoneType.BEACON then +self.droppedbeaconref[ctldzone.name]=zone:GetCoordinate() +ctldzone.timestamp=timer.getTime() +end +if HasBeacon then +ctldzone.fmbeacon=self:_GetFMBeacon(Name) +ctldzone.uhfbeacon=self:_GetUHFBeacon(Name) +ctldzone.vhfbeacon=self:_GetVHFBeacon(Name) +else +ctldzone.fmbeacon=nil +ctldzone.uhfbeacon=nil +ctldzone.vhfbeacon=nil +end +if Type==CTLD.CargoZoneType.SHIP then +ctldzone.shiplength=Shiplength or 100 +ctldzone.shipwidth=Shipwidth or 10 +end +if not exists then +self:AddZone(ctldzone) +end +return self +end +function CTLD:GetCTLDZone(Name,Type) +if Type==CTLD.CargoZoneType.LOAD then +for _,z in pairs(self.pickupZones)do +if z.name==Name then +return z +end +end +elseif Type==CTLD.CargoZoneType.DROP then +for _,z in pairs(self.dropOffZones)do +if z.name==Name then +return z +end +end +elseif Type==CTLD.CargoZoneType.SHIP then +for _,z in pairs(self.shipZones)do +if z.name==Name then +return z +end +end +elseif Type==CTLD.CargoZoneType.BEACON then +for _,z in pairs(self.droppedBeacons)do +if z.name==Name then +return z +end +end +else +for _,z in pairs(self.wpZones)do +if z.name==Name then +return z +end +end +end +return nil +end +function CTLD:AddCTLDZoneFromAirbase(AirbaseName,Type,Color,Active,HasBeacon) +self:T(self.lid.." AddCTLDZoneFromAirbase") +local AFB=AIRBASE:FindByName(AirbaseName) +local name=AFB:GetZone():GetName() +self:T(self.lid.."AFB "..AirbaseName.." ZoneName "..name) +self:AddCTLDZone(name,Type,Color,Active,HasBeacon) +return self +end +function CTLD:DropBeaconNow(Unit) +self:T(self.lid.." DropBeaconNow") +local ctldzone={} +ctldzone.active=true +ctldzone.color=math.random(0,4) +ctldzone.name="Beacon "..math.random(1,10000) +ctldzone.type=CTLD.CargoZoneType.BEACON +ctldzone.hasbeacon=true +ctldzone.fmbeacon=self:_GetFMBeacon(ctldzone.name) +ctldzone.uhfbeacon=self:_GetUHFBeacon(ctldzone.name) +ctldzone.vhfbeacon=self:_GetVHFBeacon(ctldzone.name) +ctldzone.timestamp=timer.getTime() +self.droppedbeaconref[ctldzone.name]=Unit:GetCoordinate() +self:AddZone(ctldzone) +local FMbeacon=ctldzone.fmbeacon +local VHFbeacon=ctldzone.vhfbeacon +local UHFbeacon=ctldzone.uhfbeacon +local Name=ctldzone.name +local FM=FMbeacon.frequency +local VHF=VHFbeacon.frequency*1000 +local UHF=UHFbeacon.frequency +local text=string.format("Dropped %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",Name,FM,VHF,UHF) +self:_SendMessage(text,15,false,Unit:GetGroup()) +return self +end +function CTLD:CheckDroppedBeacons() +self:T(self.lid.." CheckDroppedBeacons") +local timeout=self.droppedbeacontimeout or 600 +local livebeacontable={} +for _,_beacon in pairs(self.droppedBeacons)do +local beacon=_beacon +if not beacon.timestamp then beacon.timestamp=timer.getTime()+timeout end +local T0=beacon.timestamp +if timer.getTime()-T0>timeout then +local name=beacon.name +self.droppedbeaconref[name]=nil +_beacon=nil +else +table.insert(livebeacontable,beacon) +end +end +self.droppedBeacons=nil +self.droppedBeacons=livebeacontable +return self +end +function CTLD:_ListRadioBeacons(Group,Unit) +self:T(self.lid.." _ListRadioBeacons") +local report=REPORT:New("Active Zone Beacons") +report:Add("------------------------------------------------------------") +local zones={[1]=self.pickupZones,[2]=self.wpZones,[3]=self.dropOffZones,[4]=self.shipZones,[5]=self.droppedBeacons} +for i=1,5 do +for index,cargozone in pairs(zones[i])do +local czone=cargozone +if czone.active and czone.hasbeacon then +local FMbeacon=czone.fmbeacon +local VHFbeacon=czone.vhfbeacon +local UHFbeacon=czone.uhfbeacon +local Name=czone.name +local FM=FMbeacon.frequency +local VHF=VHFbeacon.frequency*1000 +local UHF=UHFbeacon.frequency +report:AddIndent(string.format(" %s | FM %s Mhz | VHF %s KHz | UHF %s Mhz ",Name,FM,VHF,UHF),"|") +end +end +end +if report:GetCount()==1 then +report:Add(" N O N E") +end +report:Add("------------------------------------------------------------") +self:_SendMessage(report:Text(),30,true,Group) +return self +end +function CTLD:_AddRadioBeacon(Name,Sound,Mhz,Modulation,IsShip,IsDropped) +self:T(self.lid.." _AddRadioBeacon") +local Zone=nil +if IsShip then +Zone=UNIT:FindByName(Name) +elseif IsDropped then +Zone=self.droppedbeaconref[Name] +else +Zone=ZONE:FindByName(Name) +if not Zone then +Zone=AIRBASE:FindByName(Name):GetZone() +end +end +local Sound=Sound or"beacon.ogg" +if Zone then +if IsDropped then +local ZoneCoord=Zone +local ZoneVec3=ZoneCoord:GetVec3()or{x=0,y=0,z=0} +local Frequency=Mhz*1000000 +local Sound=self.RadioPath..Sound +trigger.action.radioTransmission(Sound,ZoneVec3,Modulation,false,Frequency,1000,Name..math.random(1,10000)) +self:T2(string.format("Beacon added | Name = %s | Sound = %s | Vec3 = %d %d %d | Freq = %f | Modulation = %d (0=AM/1=FM)",Name,Sound,ZoneVec3.x,ZoneVec3.y,ZoneVec3.z,Mhz,Modulation)) +else +local ZoneCoord=Zone:GetCoordinate() +local ZoneVec3=ZoneCoord:GetVec3()or{x=0,y=0,z=0} +local Frequency=Mhz*1000000 +local Sound=self.RadioPath..Sound +trigger.action.radioTransmission(Sound,ZoneVec3,Modulation,false,Frequency,1000,Name..math.random(1,10000)) +self:T2(string.format("Beacon added | Name = %s | Sound = %s | Vec3 = {x=%d, y=%d, z=%d} | Freq = %f | Modulation = %d (0=AM/1=FM)",Name,Sound,ZoneVec3.x,ZoneVec3.y,ZoneVec3.z,Mhz,Modulation)) +end +else +self:E(self.lid.."***** _AddRadioBeacon: Zone does not exist: "..Name) +end +return self +end +function CTLD:SetSoundfilesFolder(FolderPath) +self:T(self.lid.." SetSoundfilesFolder") +if FolderPath then +local lastchar=string.sub(FolderPath,-1) +if lastchar~="/"then +FolderPath=FolderPath.."/" +end +end +self.RadioPath=FolderPath +self:I(self.lid..string.format("Setting sound files folder to: %s",self.RadioPath)) +return self +end +function CTLD:_RefreshRadioBeacons() +self:T(self.lid.." _RefreshRadioBeacons") +local zones={[1]=self.pickupZones,[2]=self.wpZones,[3]=self.dropOffZones,[4]=self.shipZones,[5]=self.droppedBeacons} +for i=1,5 do +local IsShip=false +if i==4 then IsShip=true end +local IsDropped=false +if i==5 then IsDropped=true end +for index,cargozone in pairs(zones[i])do +local czone=cargozone +local Sound=self.RadioSound +local Silent=self.RadioSoundFC3 or self.RadioSound +if czone.active and czone.hasbeacon then +local FMbeacon=czone.fmbeacon +local VHFbeacon=czone.vhfbeacon +local UHFbeacon=czone.uhfbeacon +local Name=czone.name +local FM=FMbeacon.frequency +local VHF=VHFbeacon.frequency +local UHF=UHFbeacon.frequency +self:_AddRadioBeacon(Name,Sound,FM,CTLD.RadioModulation.FM,IsShip,IsDropped) +self:_AddRadioBeacon(Name,Sound,VHF,CTLD.RadioModulation.AM,IsShip,IsDropped) +self:_AddRadioBeacon(Name,Silent,UHF,CTLD.RadioModulation.AM,IsShip,IsDropped) +end +end +end +return self +end +function CTLD:IsUnitInZone(Unit,Zonetype) +self:T(self.lid.." IsUnitInZone") +self:T(Zonetype) +local unitname=Unit:GetName() +local zonetable={} +local outcome=false +if Zonetype==CTLD.CargoZoneType.LOAD then +zonetable=self.pickupZones +elseif Zonetype==CTLD.CargoZoneType.DROP then +zonetable=self.dropOffZones +elseif Zonetype==CTLD.CargoZoneType.SHIP then +zonetable=self.shipZones +else +zonetable=self.wpZones +end +local zonecoord=nil +local colorret=nil +local maxdist=1000000 +local zoneret=nil +local zonewret=nil +local zonenameret=nil +local unitcoord=Unit:GetCoordinate() +local unitVec2=unitcoord:GetVec2() +for _,_cargozone in pairs(zonetable)do +local czone=_cargozone +local zonename=czone.name +local active=czone.active +local color=czone.color +local zone=nil +local zoneradius=100 +local zonewidth=20 +if Zonetype==CTLD.CargoZoneType.SHIP then +self:T("Checking Type Ship: "..zonename) +local ZoneUNIT=UNIT:FindByName(zonename) +if not ZoneUNIT then return false end +zonecoord=ZoneUNIT:GetCoordinate() +zoneradius=czone.shiplength +zonewidth=czone.shipwidth +zone=ZONE_UNIT:New(ZoneUNIT:GetName(),ZoneUNIT,zoneradius/2) +elseif ZONE:FindByName(zonename)then +zone=ZONE:FindByName(zonename) +self:T("Checking Zone: "..zonename) +zonecoord=zone:GetCoordinate() +zonewidth=zoneradius +elseif AIRBASE:FindByName(zonename)then +zone=AIRBASE:FindByName(zonename):GetZone() +self:T("Checking Zone: "..zonename) +zonecoord=zone:GetCoordinate() +zoneradius=2000 +zonewidth=zoneradius +end +local distance=self:_GetDistance(zonecoord,unitcoord) +self:T("Distance Zone: "..distance) +self:T("Zone Active: "..tostring(active)) +if(zone:IsVec2InZone(unitVec2)or Zonetype==CTLD.CargoZoneType.MOVE)and active==true and distance<maxdist then +outcome=true +maxdist=distance +zoneret=zone +zonenameret=zonename +zonewret=zonewidth +colorret=color +end +end +if Zonetype==CTLD.CargoZoneType.SHIP then +return outcome,zonenameret,zoneret,maxdist,zonewret +else +return outcome,zonenameret,zoneret,maxdist +end +end +function CTLD:SmokePositionNow(Unit,Flare,SmokeColor) +self:T(self.lid.." SmokePositionNow") +local Smokecolor=self.SmokeColor or SMOKECOLOR.Red +if SmokeColor then +Smokecolor=SmokeColor +end +local FlareColor=self.FlareColor or FLARECOLOR.Red +local unitcoord=Unit:GetCoordinate() +local Group=Unit:GetGroup() +if Flare then +unitcoord:Flare(FlareColor,90) +else +local height=unitcoord:GetLandHeight()+2 +unitcoord.y=height +unitcoord:Smoke(Smokecolor) +end +return self +end +function CTLD:SmokeZoneNearBy(Unit,Flare) +self:T(self.lid.." SmokeZoneNearBy") +local unitcoord=Unit:GetCoordinate() +local Group=Unit:GetGroup() +local smokedistance=self.smokedistance +local smoked=false +local zones={[1]=self.pickupZones,[2]=self.wpZones,[3]=self.dropOffZones,[4]=self.shipZones} +for i=1,4 do +for index,cargozone in pairs(zones[i])do +local CZone=cargozone +local zonename=CZone.name +local zone=nil +local airbasezone=false +if i==4 then +zone=UNIT:FindByName(zonename) +else +zone=ZONE:FindByName(zonename) +if not zone then +zone=AIRBASE:FindByName(zonename):GetZone() +airbasezone=true +end +end +local zonecoord=zone:GetCoordinate() +if(i==1 or 1==3)and airbasezone==true and zone:IsInstanceOf("ZONE_BASE")then +zonecoord=zone:GetRandomCoordinate(inner,outer,{land.SurfaceType.LAND}) +end +if zonecoord then +local active=CZone.active +local color=CZone.color +local distance=self:_GetDistance(zonecoord,unitcoord) +if distance<smokedistance and active then +if not Flare then +zonecoord:Smoke(color or SMOKECOLOR.White) +else +if color==SMOKECOLOR.Blue then color=FLARECOLOR.White end +zonecoord:Flare(color or FLARECOLOR.White) +end +local txt="smoking" +if Flare then txt="flaring"end +self:_SendMessage(string.format("Roger, %s zone %s!",txt,zonename),10,false,Group) +smoked=true +end +end +end +end +if not smoked then +local distance=UTILS.MetersToNM(self.smokedistance) +self:_SendMessage(string.format("Negative, need to be closer than %dnm to a zone!",distance),10,false,Group) +end +return self +end +function CTLD:SetUnitCapabilities(Unittype,Cancrates,Cantroops,Cratelimit,Trooplimit,Length,Maxcargoweight) +self:T(self.lid.." UnitCapabilities") +local unittype=nil +local unit=nil +if type(Unittype)=="string"then +unittype=Unittype +elseif type(Unittype)=="table"and Unittype.ClassName and Unittype:IsInstanceOf("UNIT")then +unittype=Unittype:GetTypeName() +else +return self +end +local length=20 +local maxcargo=500 +local existingcaps=self.UnitTypeCapabilities[unittype] +if existingcaps then +length=existingcaps.length or 20 +maxcargo=existingcaps.cargoweightlimit or 500 +end +local capabilities={} +capabilities.type=unittype +capabilities.crates=Cancrates or false +capabilities.troops=Cantroops or false +capabilities.cratelimit=Cratelimit or 0 +capabilities.trooplimit=Trooplimit or 0 +capabilities.length=Length or length +capabilities.cargoweightlimit=Maxcargoweight or maxcargo +self.UnitTypeCapabilities[unittype]=capabilities +return self +end +function CTLD:SetOwnSetPilotGroups(Set) +self.UserSetGroup=Set +return self +end +function CTLD:UnitCapabilities(Unittype,Cancrates,Cantroops,Cratelimit,Trooplimit,Length,Maxcargoweight) +self:I(self.lid.."This function been replaced with `SetUnitCapabilities()` - pls use the new one going forward!") +self:SetUnitCapabilities(Unittype,Cancrates,Cantroops,Cratelimit,Trooplimit,Length,Maxcargoweight) +return self +end +function CTLD:IsCorrectHover(Unit) +self:T(self.lid.." IsCorrectHover") +local outcome=false +if self:IsUnitInAir(Unit)then +local uspeed=Unit:GetVelocityMPS() +local uheight=Unit:GetHeight() +local ucoord=Unit:GetCoordinate() +if not ucoord then +return false +end +local gheight=ucoord:GetLandHeight() +local aheight=uheight-gheight +local maxh=self.maximumHoverHeight +local minh=self.minimumHoverHeight +local mspeed=2 +if(uspeed<=mspeed)and(aheight<=maxh)and(aheight>=minh)then +outcome=true +end +end +return outcome +end +function CTLD:IsCorrectFlightParameters(Unit) +self:T(self.lid.." IsCorrectFlightParameters") +local outcome=false +if self:IsUnitInAir(Unit)then +local uspeed=Unit:GetVelocityMPS() +local uheight=Unit:GetHeight() +local ucoord=Unit:GetCoordinate() +if not ucoord then +return false +end +local gheight=ucoord:GetLandHeight() +local aheight=uheight-gheight +local minh=self.FixedMinAngels +local maxh=self.FixedMaxAngels +local maxspeed=self.FixedMaxSpeed +local kmspeed=uspeed*3.6 +local knspeed=kmspeed/1.86 +self:T(string.format("%s Unit parameters: at %dm AGL with %dmps | %dkph | %dkn",self.lid,aheight,uspeed,kmspeed,knspeed)) +if(aheight<=maxh)and(aheight>=minh)and(uspeed<=maxspeed)then +outcome=true +end +end +return outcome +end +function CTLD:_ShowHoverParams(Group,Unit) +local inhover=self:IsCorrectHover(Unit) +local htxt="true" +if not inhover then htxt="false"end +local text="" +if _SETTINGS:IsMetric()then +text=string.format("Hover parameters (autoload/drop):\n - Min height %dm \n - Max height %dm \n - Max speed 2mps \n - In parameter: %s",self.minimumHoverHeight,self.maximumHoverHeight,htxt) +else +local minheight=UTILS.MetersToFeet(self.minimumHoverHeight) +local maxheight=UTILS.MetersToFeet(self.maximumHoverHeight) +text=string.format("Hover parameters (autoload/drop):\n - Min height %dft \n - Max height %dft \n - Max speed 6ftps \n - In parameter: %s",minheight,maxheight,htxt) +end +self:_SendMessage(text,10,false,Group) +return self +end +function CTLD:_ShowFlightParams(Group,Unit) +local inhover=self:IsCorrectFlightParameters(Unit) +local htxt="true" +if not inhover then htxt="false"end +local text="" +if _SETTINGS:IsImperial()then +local minheight=UTILS.MetersToFeet(self.FixedMinAngels) +local maxheight=UTILS.MetersToFeet(self.FixedMaxAngels) +text=string.format("Flight parameters (airdrop):\n - Min height %dft \n - Max height %dft \n - In parameter: %s",minheight,maxheight,htxt) +else +local minheight=self.FixedMinAngels +local maxheight=self.FixedMaxAngels +text=string.format("Flight parameters (airdrop):\n - Min height %dm \n - Max height %dm \n - In parameter: %s",minheight,maxheight,htxt) +end +self:_SendMessage(text,10,false,Group) +return self +end +function CTLD:CanHoverLoad(Unit) +self:T(self.lid.." CanHoverLoad") +if self:IsFixedWing(Unit)then return false end +local outcome=self:IsUnitInZone(Unit,CTLD.CargoZoneType.LOAD)and self:IsCorrectHover(Unit) +if not outcome then +outcome=self:IsUnitInZone(Unit,CTLD.CargoZoneType.SHIP) +end +return outcome +end +function CTLD:IsUnitInAir(Unit) +local minheight=self.minimumHoverHeight +if self.enableFixedWing and self:IsFixedWing(Unit)then +minheight=5.1 +end +local uheight=Unit:GetHeight() +local ucoord=Unit:GetCoordinate() +if not ucoord then +return false +end +local gheight=ucoord:GetLandHeight() +local aheight=uheight-gheight +if aheight>=minheight then +return true +else +return false +end +end +function CTLD:AutoHoverLoad(Unit) +self:T(self.lid.." AutoHoverLoad") +local unittype=Unit:GetTypeName() +local unitname=Unit:GetName() +local Group=Unit:GetGroup() +local capabilities=self:_GetUnitCapabilities(Unit) +local cancrates=capabilities.crates +local cratelimit=capabilities.cratelimit +if cancrates then +local numberonboard=0 +local loaded={} +if self.Loaded_Cargo[unitname]then +loaded=self.Loaded_Cargo[unitname] +numberonboard=loaded.Cratesloaded or 0 +end +local load=cratelimit-numberonboard +local canload=self:CanHoverLoad(Unit) +if canload and load>0 then +self:_LoadCratesNearby(Group,Unit) +end +end +return self +end +function CTLD:CheckAutoHoverload() +if self.hoverautoloading then +for _,_pilot in pairs(self.CtldUnits)do +local Unit=UNIT:FindByName(_pilot) +if self:CanHoverLoad(Unit)then self:AutoHoverLoad(Unit)end +end +end +return self +end +function CTLD:CleanDroppedTroops() +local troops=self.DroppedTroops +local newtable={} +for _index,_group in pairs(troops)do +self:T({_group.ClassName}) +if _group and _group.ClassName=="GROUP"then +if _group:IsAlive()then +newtable[_index]=_group +end +end +end +self.DroppedTroops=newtable +local engineers=self.EngineersInField +local engtable={} +for _index,_group in pairs(engineers)do +self:T({_group.ClassName}) +if _group and _group:IsNotStatus("Stopped")then +engtable[_index]=_group +end +end +self.EngineersInField=engtable +return self +end +function CTLD:_CountStockPlusInHeloPlusAliveGroups(Restock,Threshold) +local Troopstable={} +for _id,_cargo in pairs(self.Cargo_Crates)do +local generic=_cargo +local genname=generic:GetName() +if generic and generic:GetStock0()>0 and not Troopstable[genname]then +Troopstable[genname]={ +Stock0=generic:GetStock0(), +Stock=generic:GetStock(), +StockR=generic:GetRelativeStock(), +Infield=0, +Inhelo=0, +CratesInfield=0, +Sum=generic:GetStock(), +} +if Restock==true then +Troopstable[genname].GenericCargo=generic +end +end +end +for _id,_cargo in pairs(self.Cargo_Troops)do +local generic=_cargo +local genname=generic:GetName() +if generic and generic:GetStock0()>0 and not Troopstable[genname]then +Troopstable[genname]={ +Stock0=generic:GetStock0(), +Stock=generic:GetStock(), +StockR=generic:GetRelativeStock(), +Infield=0, +Inhelo=0, +CratesInfield=0, +Sum=generic:GetStock(), +} +if Restock==true then +Troopstable[genname].GenericCargo=generic +end +end +end +for _index,_group in pairs(self.DroppedTroops)do +if _group and _group:IsAlive()then +self:T("Looking at ".._group:GetName().." in the field") +local generic=self:GetGenericCargoObjectFromGroupName(_group:GetName()) +if generic then +local genname=generic:GetName() +self:T("Found Generic "..genname.." in the field. Adding.") +if generic:GetStock0()>0 then +Troopstable[genname].Infield=Troopstable[genname].Infield+1 +Troopstable[genname].Sum=Troopstable[genname].Infield+Troopstable[genname].Stock+Troopstable[genname].Inhelo +end +else +self:E(self.lid.."Group without Cargo Generic: ".._group:GetName()) +end +end +end +for _unitname,_loaded in pairs(self.Loaded_Cargo)do +local _unit=UNIT:FindByName(_unitname) +if _unit and _unit:IsAlive()then +local unitname=_unit:GetName() +local loadedcargo=self.Loaded_Cargo[unitname].Cargo or{} +for _,_cgo in pairs(loadedcargo)do +local cargo=_cgo +local type=cargo.CargoType +local gname=cargo.Name +local gcargo=self:_FindCratesCargoObject(gname)or self:_FindTroopsCargoObject(gname) +self:T("Looking at "..gname.." in the helo - type = "..type) +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS or type==CTLD_CARGO.Enum.VEHICLE or type==CTLD_CARGO.Enum.FOB)then +if gcargo and gcargo:GetStock0()>0 then +self:T("Adding "..gname.." in the helo - type = "..type) +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)then +Troopstable[gname].Inhelo=Troopstable[gname].Inhelo+1 +end +if(type==CTLD_CARGO.Enum.VEHICLE or type==CTLD_CARGO.Enum.FOB)then +local counting=gcargo.CratesNeeded +local added=1 +if counting>1 then +added=added/counting +end +Troopstable[gname].Inhelo=Troopstable[gname].Inhelo+added +end +Troopstable[gname].Sum=Troopstable[gname].Infield+Troopstable[gname].Stock+Troopstable[gname].Inhelo+Troopstable[gname].CratesInfield +end +end +end +end +end +if self.Spawned_Cargo then +for i=#self.Spawned_Cargo,1,-1 do +local cargo=self.Spawned_Cargo[i] +if cargo and cargo:GetPositionable()and cargo:GetPositionable():IsAlive()then +local genname=cargo:GetName() +local gcargo=self:_FindCratesCargoObject(genname) +if Troopstable[genname]and gcargo and gcargo:GetStock0()>0 then +local needed=gcargo.CratesNeeded or 1 +local added=1 +if needed>1 then +added=added/needed +end +Troopstable[genname].CratesInfield=Troopstable[genname].CratesInfield+added +Troopstable[genname].Sum=Troopstable[genname].Infield+Troopstable[genname].Stock ++Troopstable[genname].Inhelo+Troopstable[genname].CratesInfield +end +end +end +for i=#self.Spawned_Cargo,1,-1 do +local cargo=self.Spawned_Cargo[i] +if cargo and cargo:GetPositionable()and cargo:GetPositionable():IsAlive()then +local genname=cargo:GetName() +if Troopstable[genname]then +if Troopstable[genname].Inhelo==0 and Troopstable[genname].CratesInfield<1 then +Troopstable[genname].CratesInfield=0 +Troopstable[genname].Sum=Troopstable[genname].Stock +cargo:GetPositionable():Destroy(false) +table.remove(self.Spawned_Cargo,i) +local leftover=Troopstable[genname].Stock0-(Troopstable[genname].Infield+Troopstable[genname].Inhelo+Troopstable[genname].CratesInfield) +if leftover<Troopstable[genname].Stock then +Troopstable[genname].Stock=leftover +end +Troopstable[genname].Sum=Troopstable[genname].Stock+Troopstable[genname].Infield+Troopstable[genname].Inhelo+Troopstable[genname].CratesInfield +end +end +end +end +end +if Restock==true then +local threshold=Threshold or 75 +for _name,_data in pairs(Troopstable)do +if _data.StockR and _data.StockR<threshold then +if _data.GenericCargo then +_data.GenericCargo:SetStock(_data.Stock0) +end +end +end +end +return Troopstable +end +function CTLD:AddStockTroops(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:AddStock(number) +break +end +end +return self +end +function CTLD:AddStockCrates(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Crates +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:AddStock(number) +break +end +end +return self +end +function CTLD:AddStockStatics(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Statics +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:AddStock(number) +break +end +end +return self +end +function CTLD:SetStockCrates(Name,Number) +local name=Name or"none" +local number=Number +local gentroops=self.Cargo_Crates +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:SetStock(number) +break +end +end +return self +end +function CTLD:SetStockTroops(Name,Number) +local name=Name or"none" +local number=Number +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:SetStock(number) +break +end +end +return self +end +function CTLD:SetStockStatics(Name,Number) +local name=Name or"none" +local number=Number +local gentroops=self.Cargo_Statics +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:SetStock(number) +break +end +end +return self +end +function CTLD:GetStockCrates() +local Stock={} +local gentroops=self.Cargo_Crates +for _id,_troop in pairs(gentroops)do +Stock[_troop.Name]=_troop.Stock or-1 +end +return Stock +end +function CTLD:GetStockTroops() +local Stock={} +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +Stock[_troop.Name]=_troop.Stock or-1 +end +return Stock +end +function CTLD:GetLoadedCargo(Unit) +local Troops=0 +local Crates=0 +local Cargo={} +if Unit and Unit:IsAlive()then +local name=Unit:GetName() +if self.Loaded_Cargo[name]then +Troops=self.Loaded_Cargo[name].Troopsloaded or 0 +Crates=self.Loaded_Cargo[name].Cratesloaded or 0 +Cargo=self.Loaded_Cargo[name].Cargo or{} +end +end +return Troops,Crates,Cargo +end +function CTLD:GetStockStatics() +local Stock={} +local gentroops=self.Cargo_Statics +for _id,_troop in pairs(gentroops)do +Stock[_troop.Name]=_troop.Stock or-1 +end +return Stock +end +function CTLD:RemoveStockTroops(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Troops +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:RemoveStock(number) +end +end +return self +end +function CTLD:RemoveStockCrates(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Crates +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:RemoveStock(number) +end +end +return self +end +function CTLD:RemoveStockStatics(Name,Number) +local name=Name or"none" +local number=Number or 1 +local gentroops=self.Cargo_Statics +for _id,_troop in pairs(gentroops)do +if _troop.Name==name then +_troop:RemoveStock(number) +end +end +return self +end +function CTLD:GetGenericCargoObjectFromGroupName(GroupName) +local Cargotype=nil +local template=GroupName +if string.find(template,"#")then +template=string.gsub(GroupName,"#(%d+)$","") +end +template=string.gsub(template,"-(%d+)$","") +for k,v in pairs(self.Cargo_Troops)do +local comparison="" +if type(v.Templates)=="string"then comparison=v.Templates else comparison=v.Templates[1]end +if comparison==template then +Cargotype=v +break +end +end +if not Cargotype then +for k,v in pairs(self.Cargo_Crates)do +local comparison="" +if type(v.Templates)=="string"then comparison=v.Templates else comparison=v.Templates[1]end +if comparison==template and v.CargoType~=CTLD_CARGO.Enum.REPAIR then +Cargotype=v +break +end +end +end +return Cargotype +end +function CTLD:_CheckEngineers() +self:T(self.lid.." CheckEngineers") +local engtable=self.EngineersInField +for _ind,_engineers in pairs(engtable)do +local engineers=_engineers +local wrenches=engineers.Group +self:T(_engineers.lid.._engineers:GetStatus()) +if wrenches and wrenches:IsAlive()then +if engineers:IsStatus("Running")or engineers:IsStatus("Searching")then +local crates,number=self:_FindCratesNearby(wrenches,nil,self.EngineerSearch,true,true) +engineers:Search(crates,number) +elseif engineers:IsStatus("Moving")then +engineers:Move() +elseif engineers:IsStatus("Arrived")then +engineers:Build() +local unit=wrenches:GetUnit(1) +self:_BuildCrates(wrenches,unit,true) +self:_RepairCrates(wrenches,unit,true) +engineers:Done() +end +else +engineers:Stop() +end +end +return self +end +function CTLD:InjectTroops(Zone,Cargo,Surfacetypes,PreciseLocation,Structure,TimeStamp) +self:T(self.lid.." InjectTroops") +local cargo=Cargo +local function IsTroopsMatch(cargo) +local match=false +local cgotbl=self.Cargo_Troops +local name=cargo:GetName() +local CargoObject +local CargoName +for _,_cgo in pairs(cgotbl)do +local cname=_cgo:GetName() +if name==cname then +match=true +CargoObject=_cgo +CargoName=cname +break +end +end +return match,CargoObject,CargoName +end +local function Cruncher(group,typename,anzahl) +local units=group:GetUnits() +local reduced=0 +for _,_unit in pairs(units)do +local typo=_unit:GetTypeName() +if typename==typo then +_unit:Destroy(false) +reduced=reduced+1 +if reduced==anzahl then break end +end +end +end +local function PostSpawn(args) +local group=args[1] +local structure=args[2] +if structure then +local loadedstructure={} +local strcset=UTILS.Split(structure,";") +for _,_data in pairs(strcset)do +local datasplit=UTILS.Split(_data,"==") +loadedstructure[datasplit[1]]=tonumber(datasplit[2]) +end +local originalstructure=UTILS.GetCountPerTypeName(group) +for _name,_number in pairs(originalstructure)do +local loadednumber=0 +if loadedstructure[_name]then +loadednumber=loadedstructure[_name] +end +local reduce=false +if loadednumber<_number then reduce=true end +if reduce then +Cruncher(group,_name,_number-loadednumber) +end +end +end +end +local match,CargoObject,CargoName=IsTroopsMatch(cargo) +if not match then +self.CargoCounter=self.CargoCounter+1 +cargo.ID=self.CargoCounter +table.insert(self.Cargo_Troops,cargo) +end +if match and CargoObject then +local stock=CargoObject:GetStock() +if stock~=-1 and stock~=nil and stock==0 then +self:T(self.lid.."Stock of "..CargoName.." is empty. Cannot inject.") +return +else +CargoObject:RemoveStock(1) +end +end +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.TROOPS or type==CTLD_CARGO.Enum.ENGINEERS)then +local name=cargo:GetName()or"none" +local temptable=cargo:GetTemplates()or{} +local factor=1.5 +local zone=Zone +local randomcoord=zone:GetRandomCoordinate(10,30*factor,Surfacetypes):GetVec2() +if PreciseLocation then +randomcoord=zone:GetCoordinate():GetVec2() +end +local randompositions=not PreciseLocation +for _,_template in pairs(temptable)do +self.TroopCounter=self.TroopCounter+1 +local alias=string.format("%s-%d",_template,math.random(1,100000)) +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitRandomizeUnits(randompositions,20,2) +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:InitDelayOff() +:OnSpawnGroup(function(grp,TimeStamp)grp.spawntime=TimeStamp or timer.getTime()end,TimeStamp) +:SpawnFromVec2(randomcoord) +if self.movetroopstowpzone and type~=CTLD_CARGO.Enum.ENGINEERS then +self:_MoveGroupToZone(self.DroppedTroops[self.TroopCounter]) +end +end +cargo:SetWasDropped(true) +if type==CTLD_CARGO.Enum.ENGINEERS then +self.Engineers=self.Engineers+1 +local grpname=self.DroppedTroops[self.TroopCounter]:GetName() +self.EngineersInField[self.Engineers]=CTLD_ENGINEERING:New(name,grpname) +end +if Structure then +BASE:ScheduleOnce(0.5,PostSpawn,{self.DroppedTroops[self.TroopCounter],Structure}) +end +if self.keeploadtable and TimeStamp~=nil then +self:T2("Inserting: "..cargo.CargoType) +local cargotype=type +table.insert(self.LoadedGroupsTable,{Group=self.DroppedTroops[self.TroopCounter],TimeStamp=TimeStamp,CargoType=cargotype,CargoName=name}) +end +if self.eventoninject then +self:__TroopsDeployed(1,nil,nil,self.DroppedTroops[self.TroopCounter],type) +end +end +return self +end +function CTLD:InjectVehicles(Zone,Cargo,Surfacetypes,PreciseLocation,Structure,TimeStamp) +self:T(self.lid.." InjectVehicles") +local cargo=Cargo +local function IsVehicMatch(cargo) +local match=false +local cgotbl=self.Cargo_Crates +local name=cargo:GetName() +local CargoObject +local CargoName +for _,_cgo in pairs(cgotbl)do +local cname=_cgo:GetName() +if name==cname then +match=true +CargoObject=_cgo +CargoName=cname +break +end +end +return match,CargoObject,CargoName +end +local function Cruncher(group,typename,anzahl) +local units=group:GetUnits() +local reduced=0 +for _,_unit in pairs(units)do +local typo=_unit:GetTypeName() +if typename==typo then +_unit:Destroy(false) +reduced=reduced+1 +if reduced==anzahl then break end +end +end +end +local function PostSpawn(args) +local group=args[1] +local structure=args[2] +if structure then +local loadedstructure={} +local strcset=UTILS.Split(structure,";") +for _,_data in pairs(strcset)do +local datasplit=UTILS.Split(_data,"==") +loadedstructure[datasplit[1]]=tonumber(datasplit[2]) +end +local originalstructure=UTILS.GetCountPerTypeName(group) +for _name,_number in pairs(originalstructure)do +local loadednumber=0 +if loadedstructure[_name]then +loadednumber=loadedstructure[_name] +end +local reduce=false +if loadednumber<_number then reduce=true end +if reduce then +Cruncher(group,_name,_number-loadednumber) +end +end +end +end +local match,CargoObject,CargoName=IsVehicMatch(cargo) +if not match then +self.CargoCounter=self.CargoCounter+1 +cargo.ID=self.CargoCounter +table.insert(self.Cargo_Crates,cargo) +end +if match and CargoObject then +local stock=CargoObject:GetStock() +if stock~=-1 and stock~=nil and stock==0 then +self:T(self.lid.."Stock of "..CargoName.." is empty. Cannot inject.") +return +else +CargoObject:RemoveStock(1) +end +end +local type=cargo:GetType() +if(type==CTLD_CARGO.Enum.VEHICLE or type==CTLD_CARGO.Enum.FOB)then +local name=cargo:GetName()or"none" +local temptable=cargo:GetTemplates()or{} +local factor=1.5 +local zone=Zone +local randomcoord=zone:GetRandomCoordinate(10,30*factor,Surfacetypes):GetVec2() +if PreciseLocation then +randomcoord=zone:GetCoordinate():GetVec2() +end +cargo:SetWasDropped(true) +local canmove=false +if type==CTLD_CARGO.Enum.VEHICLE then canmove=true end +for _,_template in pairs(temptable)do +self.TroopCounter=self.TroopCounter+1 +local alias=string.format("%s-%d",_template,math.random(1,100000)) +if canmove then +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitRandomizeUnits(true,20,2) +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:InitDelayOff() +:OnSpawnGroup(function(grp,TimeStamp)grp.spawntime=TimeStamp or timer.getTime()end,TimeStamp) +:SpawnFromVec2(randomcoord) +else +self.DroppedTroops[self.TroopCounter]=SPAWN:NewWithAlias(_template,alias) +:InitDelayOff() +:InitValidateAndRepositionGroundUnits(self.validateAndRepositionUnits) +:OnSpawnGroup(function(grp,TimeStamp)grp.spawntime=TimeStamp or timer.getTime()end,TimeStamp) +:SpawnFromVec2(randomcoord) +end +if Structure then +BASE:ScheduleOnce(0.5,PostSpawn,{self.DroppedTroops[self.TroopCounter],Structure}) +end +if self.keeploadtable and TimeStamp~=nil then +self:T2("Inserting: "..cargo.CargoType) +local cargotype=type +table.insert(self.LoadedGroupsTable,{Group=self.DroppedTroops[self.TroopCounter],TimeStamp=TimeStamp,CargoType=cargotype,CargoName=name}) +end +if self.eventoninject then +self:__CratesBuild(1,nil,nil,self.DroppedTroops[self.TroopCounter]) +end +end +end +return self +end +function CTLD:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:I(self.lid.."Started ("..self.version..")") +if self.enableHercules then self.enableFixedWing=true end +if self.UserSetGroup then +self.PilotGroups=self.UserSetGroup +elseif self.useprefix or self.enableFixedWing then +local prefix=self.prefixes +if self.enableFixedWing then +self.PilotGroups=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(prefix):FilterStart() +else +self.PilotGroups=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(prefix):FilterCategories("helicopter"):FilterStart() +end +else +self.PilotGroups=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterCategories("helicopter"):FilterStart() +end +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventHandler) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.UnitLost,self._EventHandler) +self:HandleEvent(EVENTS.NewDynamicCargo,self._EventHandler) +self:HandleEvent(EVENTS.DynamicCargoLoaded,self._EventHandler) +self:HandleEvent(EVENTS.DynamicCargoUnloaded,self._EventHandler) +self:HandleEvent(EVENTS.DynamicCargoRemoved,self._EventHandler) +self:HandleEvent(EVENTS.Land,self._EventHandler) +self:HandleEvent(EVENTS.Takeoff,self._EventHandler) +self:__Status(-5) +if self.enableLoadSave then +local interval=self.saveinterval +local filename=self.filename +local filepath=self.filepath +self:__Save(interval,filepath,filename) +end +if type(self.VehicleMoveFormation)=="table"then +local Formations={} +for _,_formation in pairs(self.VehicleMoveFormation)do +table.insert(Formations,_formation) +end +self.VehicleMoveFormation=nil +self.VehicleMoveFormation=Formations +end +return self +end +function CTLD:onbeforeStatus(From,Event,To) +self:T({From,Event,To}) +self:CleanDroppedTroops() +self:_RefreshF10Menus() +self:CheckDroppedBeacons() +self:_RefreshRadioBeacons() +self:CheckAutoHoverload() +self:_CheckEngineers() +return self +end +function CTLD:onafterStatus(From,Event,To) +self:T({From,Event,To}) +local pilots=0 +for _,_pilot in pairs(self.CtldUnits)do +pilots=pilots+1 +end +local boxes=0 +for _,_pilot in pairs(self.Spawned_Cargo)do +boxes=boxes+1 +end +local cc=self.CargoCounter +local tc=self.TroopCounter +if self.debug or self.verbose>0 then +local text=string.format("%s Pilots %d | Live Crates %d |\nCargo Counter %d | Troop Counter %d",self.lid,pilots,boxes,cc,tc) +local m=MESSAGE:New(text,10,"CTLD"):ToAll() +if self.verbose>0 then +self:I(self.lid.."Cargo and Troops in Stock:") +for _,_troop in pairs(self.Cargo_Crates)do +local name=_troop:GetName() +local stock=_troop:GetStock() +self:I(string.format("-- %s \t\t\t %d",name,stock)) +end +for _,_troop in pairs(self.Cargo_Statics)do +local name=_troop:GetName() +local stock=_troop:GetStock() +self:I(string.format("-- %s \t\t\t %d",name,stock)) +end +for _,_troop in pairs(self.Cargo_Troops)do +local name=_troop:GetName() +local stock=_troop:GetStock() +self:I(string.format("-- %s \t\t %d",name,stock)) +end +end +end +self:__Status(-30) +return self +end +function CTLD:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self:UnHandleEvent(EVENTS.PlayerEnterUnit) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.UnitLost) +self:UnHandleEvent(EVENTS.Shot) +return self +end +function CTLD:onbeforeTroopsPickedUp(From,Event,To,Group,Unit,Cargo) +self:T({From,Event,To}) +return self +end +function CTLD:onbeforeCratesPickedUp(From,Event,To,Group,Unit,Cargo) +self:T({From,Event,To}) +return self +end +function CTLD:onbeforeTroopsExtracted(From,Event,To,Group,Unit,Troops,Groupname) +self:T({From,Event,To}) +if Unit and Unit:IsPlayer()and self.PlayerTaskQueue then +local playername=Unit:GetPlayerName() +self.PlayerTaskQueue:ForEach( +function(Task) +local task=Task +local subtype=task:GetSubType() +if Event==subtype and not task:IsDone()then +local targetzone=task.Target:GetObject() +self:T2({Name=Groupname,Property=task:GetProperty("ExtractName")}) +if task:GetProperty("ExtractName")then +local okaygroup=string.find(Groupname,task:GetProperty("ExtractName"),1,true) +if targetzone and targetzone.ClassName and string.match(targetzone.ClassName,"ZONE")and okaygroup then +if task.Clients:HasUniqueID(playername)then +task:__Success(-1) +end +end +else +self:T({Text="'ExtractName' Property not set",Name=Groupname,Property=task.Type}) +end +end +end +) +end +return self +end +function CTLD:onbeforeTroopsDeployed(From,Event,To,Group,Unit,Troops) +self:T({From,Event,To}) +if Unit and Unit:IsPlayer()and self.PlayerTaskQueue then +local playername=Unit:GetPlayerName() +local dropcoord=Troops:GetCoordinate()or COORDINATE:New(0,0,0) +local dropvec2=dropcoord:GetVec2() +self.PlayerTaskQueue:ForEach( +function(Task) +local task=Task +local subtype=task:GetSubType() +if Event==subtype and not task:IsDone()then +local targetzone=task.Target:GetObject() +if targetzone and targetzone.ClassName and string.match(targetzone.ClassName,"ZONE")and targetzone:IsVec2InZone(dropvec2)then +if task.Clients:HasUniqueID(playername)then +task:__Success(-1) +end +end +end +end +) +end +return self +end +function CTLD:onafterTroopsDeployed(From,Event,To,Group,Unit,Troops,Type) +self:T({From,Event,To}) +if self.movetroopstowpzone and Type~=CTLD_CARGO.Enum.ENGINEERS then +self:_MoveGroupToZone(Troops) +end +return self +end +function CTLD:onbeforeCratesDropped(From,Event,To,Group,Unit,Cargotable) +self:T({From,Event,To}) +return self +end +function CTLD:onbeforeCratesBuild(From,Event,To,Group,Unit,Vehicle) +self:T({From,Event,To}) +if Unit and Unit:IsPlayer()and self.PlayerTaskQueue then +local playername=Unit:GetPlayerName() +local dropcoord=Vehicle:GetCoordinate()or COORDINATE:New(0,0,0) +local dropvec2=dropcoord:GetVec2() +self.PlayerTaskQueue:ForEach( +function(Task) +local task=Task +local subtype=task:GetSubType() +if Event==subtype and not task:IsDone()then +local targetzone=task.Target:GetObject() +if targetzone and targetzone.ClassName and string.match(targetzone.ClassName,"ZONE")and targetzone:IsVec2InZone(dropvec2)then +if task.Clients:HasUniqueID(playername)then +task:__Success(-1) +end +end +end +end +) +end +return self +end +function CTLD:onafterCratesBuild(From,Event,To,Group,Unit,Vehicle) +self:T({From,Event,To}) +if self.movetroopstowpzone and Vehicle then +local cg=self:GetGenericCargoObjectFromGroupName(Vehicle:GetName()) +if not(cg and(cg.NoMoveToZone or(self.nomovetozone_names and self.nomovetozone_names[cg:GetName()])))then +self:_MoveGroupToZone(Vehicle) +end +end +return self +end +function CTLD:onbeforeTroopsRTB(From,Event,To,Group,Unit,ZoneName,ZoneObject) +self:T({From,Event,To}) +return self +end +function CTLD:onbeforeSave(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +if not io then +self:E(self.lid.."ERROR: io not desanitized. Can't save current state.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. State will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +return true +end +function CTLD:onafterSave(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _savefile(filename,data) +local f=assert(io.open(filename,"wb")) +f:write(data) +f:close() +end +if lfs then +path=self.filepath or lfs.writedir() +end +filename=filename or self.filename +if path~=nil then +filename=path.."\\"..filename +end +local grouptable=self.DroppedTroops +local cgovehic=self.Cargo_Crates +local cgotable=self.Cargo_Troops +local stcstable=self.Spawned_Cargo +local statics=nil +local statics={} +self:T(self.lid.."Building Statics Table for Saving") +for _,_cargo in pairs(stcstable)do +local cargo=_cargo +local object=cargo:GetPositionable() +if object and object:IsAlive()and(cargo:WasDropped()or not cargo:HasMoved())then +statics[#statics+1]=cargo +end +end +local function FindCargoType(name,table) +local match=false +local cargo=nil +name=string.gsub(name,"-"," ") +for _ind,_cargo in pairs(table)do +local thiscargo=_cargo +local template=thiscargo:GetTemplates() +if type(template)=="string"then +template={template} +end +for _,_name in pairs(template)do +_name=string.gsub(_name,"-"," ") +if string.find(name,_name)and _cargo:GetType()~=CTLD_CARGO.Enum.REPAIR then +match=true +cargo=thiscargo +end +end +if match then break end +end +return match,cargo +end +local data="Group,x,y,z,CargoName,CargoTemplates,CargoType,CratesNeeded,CrateMass,Structure,StaticCategory,StaticType,StaticShape,SpawnTime\n" +local n=0 +for _,_grp in pairs(grouptable)do +local group=_grp +if group and group:IsAlive()then +local name=group:GetName() +local template=name +if string.find(template,"#")then +template=string.gsub(name,"#(%d+)$","") +end +local template=string.gsub(name,"-(%d+)$","") +local match,cargo=FindCargoType(template,cgotable) +if not match then +match,cargo=FindCargoType(template,cgovehic) +end +if match then +n=n+1 +local cargo=cargo +local cgoname=cargo.Name +local cgotemp=cargo.Templates +local cgotype=cargo.CargoType +local cgoneed=cargo.CratesNeeded +local cgomass=cargo.PerCrateMass +local scat,stype,sshape=cargo:GetStaticTypeAndShape() +local structure=UTILS.GetCountPerTypeName(group) +local strucdata="" +for typen,anzahl in pairs(structure)do +strucdata=strucdata..typen.."=="..anzahl..";" +end +local spawntime=group.spawntime or timer.getTime()+n +if type(cgotemp)=="table"then +local templates="{" +for _,_tmpl in pairs(cgotemp)do +templates=templates.._tmpl..";" +end +templates=templates.."}" +cgotemp=templates +end +local location=group:GetVec3() +local txt=string.format("%s,%d,%d,%d,%s,%s,%s,%d,%d,%s,%s,%s,%s,%f\n" +,template,location.x,location.y,location.z,cgoname,cgotemp,cgotype,cgoneed,cgomass,strucdata,scat,stype,sshape or"none",spawntime) +data=data..txt +end +end +end +for _,_cgo in pairs(statics)do +local object=_cgo +local cgoname=object.Name +local cgotemp=object.Templates +if type(cgotemp)=="table"then +local templates="{" +for _,_tmpl in pairs(cgotemp)do +templates=templates.._tmpl..";" +end +templates=templates.."}" +cgotemp=templates +end +local cgotype=object.CargoType +local cgoneed=object.CratesNeeded +local cgomass=object.PerCrateMass +local crateobj=object.Positionable +local location=crateobj:GetVec3() +local scat,stype,sshape=object:GetStaticTypeAndShape() +local txt=string.format("%s,%d,%d,%d,%s,%s,%s,%d,%d,'none',%s,%s,%s\n" +,"STATIC",location.x,location.y,location.z,cgoname,cgotemp,cgotype,cgoneed,cgomass,scat,stype,sshape or"none") +data=data..txt +end +_savefile(filename,data) +if self.enableLoadSave then +local interval=self.saveinterval +local filename=self.filename +local filepath=self.filepath +self:__Save(interval,filepath,filename) +end +return self +end +function CTLD:onbeforeLoad(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _fileexists(name) +local f=io.open(name,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +end +filename=filename or self.filename +path=path or self.filepath +if not io then +self:E(self.lid.."WARNING: io not desanitized. Cannot load file.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. State will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +if lfs then +path=path or lfs.writedir() +end +if path~=nil then +filename=path.."\\"..filename +end +local exists=_fileexists(filename) +if exists then +return true +else +self:E(self.lid..string.format("WARNING: State file %s might not exist.",filename)) +return false +end +end +function CTLD:onafterLoad(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _loadfile(filename) +local f=assert(io.open(filename,"rb")) +local data=f:read("*all") +f:close() +return data +end +filename=filename or self.filename +path=path or self.filepath +if lfs then +path=path or lfs.writedir() +end +if path~=nil then +filename=path.."\\"..filename +end +local text=string.format("Loading CTLD state from file %s",filename) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:I(self.lid..text) +local file=assert(io.open(filename,"rb")) +local loadeddata={} +for line in file:lines()do +loadeddata[#loadeddata+1]=line +end +file:close() +table.remove(loadeddata,1) +local n=0 +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local groupname=dataset[1] +local vec2={} +vec2.x=tonumber(dataset[2]) +vec2.y=tonumber(dataset[4]) +local cargoname=dataset[5] +local cargotemplates=dataset[6] +local cargotype=dataset[7] +local size=tonumber(dataset[8]) +local mass=tonumber(dataset[9]) +local StaticCategory=dataset[11] +local StaticType=dataset[12] +local StaticShape=dataset[13] +n=n+1 +local timestamp=tonumber(dataset[14])or(timer.getTime()+n) +self:T2("TimeStamp = "..timestamp) +if type(groupname)=="string"and groupname~="STATIC"then +cargotemplates=string.gsub(cargotemplates,"{","") +cargotemplates=string.gsub(cargotemplates,"}","") +cargotemplates=UTILS.Split(cargotemplates,";") +local structure=nil +if dataset[10]and dataset[10]~="none"then +structure=dataset[10] +structure=string.gsub(structure,",","") +end +local dropzone=ZONE_RADIUS:New("DropZone",vec2,20) +if cargotype==CTLD_CARGO.Enum.VEHICLE or cargotype==CTLD_CARGO.Enum.FOB then +local injectvehicle=CTLD_CARGO:New(nil,cargoname,cargotemplates,cargotype,true,true,size,nil,true,mass) +injectvehicle:SetStaticTypeAndShape(StaticCategory,StaticType,StaticShape) +self:InjectVehicles(dropzone,injectvehicle,self.surfacetypes,self.useprecisecoordloads,structure,timestamp) +elseif cargotype==CTLD_CARGO.Enum.TROOPS or cargotype==CTLD_CARGO.Enum.ENGINEERS then +local injecttroops=CTLD_CARGO:New(nil,cargoname,cargotemplates,cargotype,true,true,size,nil,true,mass) +self:InjectTroops(dropzone,injecttroops,self.surfacetypes,self.useprecisecoordloads,structure,timestamp) +end +elseif(type(groupname)=="string"and groupname=="STATIC")or cargotype==CTLD_CARGO.Enum.REPAIR then +local dropzone=ZONE_RADIUS:New("DropZone",vec2,20) +local injectstatic=nil +if cargotype==CTLD_CARGO.Enum.VEHICLE or cargotype==CTLD_CARGO.Enum.FOB then +cargotemplates=string.gsub(cargotemplates,"{","") +cargotemplates=string.gsub(cargotemplates,"}","") +cargotemplates=UTILS.Split(cargotemplates,";") +injectstatic=CTLD_CARGO:New(nil,cargoname,cargotemplates,cargotype,true,true,size,nil,true,mass) +injectstatic:SetStaticTypeAndShape(StaticCategory,StaticType,StaticShape) +elseif cargotype==CTLD_CARGO.Enum.STATIC or cargotype==CTLD_CARGO.Enum.REPAIR then +injectstatic=CTLD_CARGO:New(nil,cargoname,cargotemplates,cargotype,true,true,size,nil,true,mass) +injectstatic:SetStaticTypeAndShape(StaticCategory,StaticType,StaticShape) +local map=cargotype:GetStaticResourceMap() +injectstatic:SetStaticResourceMap(map) +end +if injectstatic then +self:InjectStatics(dropzone,injectstatic,false,true) +end +end +end +if self.keeploadtable then +self:__Loaded(1,self.LoadedGroupsTable) +end +return self +end +end +do +CTLD_HERCULES={ +ClassName="CTLD_HERCULES", +lid="", +Name="", +Version="0.0.3", +} +CTLD_HERCULES.Types={ +["ATGM M1045 HMMWV TOW Air [7183lb]"]={['name']="M1045 HMMWV TOW",['container']=true}, +["ATGM M1045 HMMWV TOW Skid [7073lb]"]={['name']="M1045 HMMWV TOW",['container']=false}, +["APC M1043 HMMWV Armament Air [7023lb]"]={['name']="M1043 HMMWV Armament",['container']=true}, +["APC M1043 HMMWV Armament Skid [6912lb]"]={['name']="M1043 HMMWV Armament",['container']=false}, +["SAM Avenger M1097 Air [7200lb]"]={['name']="M1097 Avenger",['container']=true}, +["SAM Avenger M1097 Skid [7090lb]"]={['name']="M1097 Avenger",['container']=false}, +["APC Cobra Air [10912lb]"]={['name']="Cobra",['container']=true}, +["APC Cobra Skid [10802lb]"]={['name']="Cobra",['container']=false}, +["APC M113 Air [21624lb]"]={['name']="M-113",['container']=true}, +["APC M113 Skid [21494lb]"]={['name']="M-113",['container']=false}, +["Tanker M978 HEMTT [34000lb]"]={['name']="M978 HEMTT Tanker",['container']=false}, +["HEMTT TFFT [34400lb]"]={['name']="HEMTT TFFT",['container']=false}, +["SPG M1128 Stryker MGS [33036lb]"]={['name']="M1128 Stryker MGS",['container']=false}, +["AAA Vulcan M163 Air [21666lb]"]={['name']="Vulcan",['container']=true}, +["AAA Vulcan M163 Skid [21577lb]"]={['name']="Vulcan",['container']=false}, +["APC M1126 Stryker ICV [29542lb]"]={['name']="M1126 Stryker ICV",['container']=false}, +["ATGM M1134 Stryker [30337lb]"]={['name']="M1134 Stryker ATGM",['container']=false}, +["APC LAV-25 Air [22520lb]"]={['name']="LAV-25",['container']=true}, +["APC LAV-25 Skid [22514lb]"]={['name']="LAV-25",['container']=false}, +["M1025 HMMWV Air [6160lb]"]={['name']="Hummer",['container']=true}, +["M1025 HMMWV Skid [6050lb]"]={['name']="Hummer",['container']=false}, +["IFV M2A2 Bradley [34720lb]"]={['name']="M-2 Bradley",['container']=false}, +["IFV MCV-80 [34720lb]"]={['name']="MCV-80",['container']=false}, +["IFV BMP-1 [23232lb]"]={['name']="BMP-1",['container']=false}, +["IFV BMP-2 [25168lb]"]={['name']="BMP-2",['container']=false}, +["IFV BMP-3 [32912lb]"]={['name']="BMP-3",['container']=false}, +["ARV BRDM-2 Air [12320lb]"]={['name']="BRDM-2",['container']=true}, +["ARV BRDM-2 Skid [12210lb]"]={['name']="BRDM-2",['container']=false}, +["APC BTR-80 Air [23936lb]"]={['name']="BTR-80",['container']=true}, +["APC BTR-80 Skid [23826lb]"]={['name']="BTR-80",['container']=false}, +["APC BTR-82A Air [24998lb]"]={['name']="BTR-82A",['container']=true}, +["APC BTR-82A Skid [24888lb]"]={['name']="BTR-82A",['container']=false}, +["SAM ROLAND ADS [34720lb]"]={['name']="Roland Radar",['container']=false}, +["SAM ROLAND LN [34720b]"]={['name']="Roland ADS",['container']=false}, +["SAM SA-13 STRELA [21624lb]"]={['name']="Strela-10M3",['container']=false}, +["AAA ZSU-23-4 Shilka [32912lb]"]={['name']="ZSU-23-4 Shilka",['container']=false}, +["SAM SA-19 Tunguska 2S6 [34720lb]"]={['name']="2S6 Tunguska",['container']=false}, +["Transport UAZ-469 Air [3747lb]"]={['name']="UAZ-469",['container']=true}, +["Transport UAZ-469 Skid [3630lb]"]={['name']="UAZ-469",['container']=false}, +["AAA GEPARD [34720lb]"]={['name']="Gepard",['container']=false}, +["SAM CHAPARRAL Air [21624lb]"]={['name']="M48 Chaparral",['container']=true}, +["SAM CHAPARRAL Skid [21516lb]"]={['name']="M48 Chaparral",['container']=false}, +["SAM LINEBACKER [34720lb]"]={['name']="M6 Linebacker",['container']=false}, +["Transport URAL-375 [14815lb]"]={['name']="Ural-375",['container']=false}, +["Transport M818 [16000lb]"]={['name']="M 818",['container']=false}, +["IFV MARDER [34720lb]"]={['name']="Marder",['container']=false}, +["Transport Tigr Air [15900lb]"]={['name']="Tigr_233036",['container']=true}, +["Transport Tigr Skid [15730lb]"]={['name']="Tigr_233036",['container']=false}, +["IFV TPZ FUCH [33440lb]"]={['name']="TPZ",['container']=false}, +["IFV BMD-1 Air [18040lb]"]={['name']="BMD-1",['container']=true}, +["IFV BMD-1 Skid [17930lb]"]={['name']="BMD-1",['container']=false}, +["IFV BTR-D Air [18040lb]"]={['name']="BTR_D",['container']=true}, +["IFV BTR-D Skid [17930lb]"]={['name']="BTR_D",['container']=false}, +["EWR SBORKA Air [21624lb]"]={['name']="Dog Ear radar",['container']=true}, +["EWR SBORKA Skid [21624lb]"]={['name']="Dog Ear radar",['container']=false}, +["ART 2S9 NONA Air [19140lb]"]={['name']="SAU 2-C9",['container']=true}, +["ART 2S9 NONA Skid [19030lb]"]={['name']="SAU 2-C9",['container']=false}, +["ART GVOZDIKA [34720lb]"]={['name']="SAU Gvozdika",['container']=false}, +["APC MTLB Air [26400lb]"]={['name']="MTLB",['container']=true}, +["APC MTLB Skid [26290lb]"]={['name']="MTLB",['container']=false}, +} +function CTLD_HERCULES:New(Coalition,Alias,CtldObject) +local self=BASE:Inherit(self,FSM:New()) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +self.coalitiontxt=Coalition +elseif Coalition=="red"then +self.coalition=coalition.side.RED +self.coalitiontxt=Coalition +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +self.coalitiontxt=Coalition +else +self:E("ERROR: Unknown coalition in CTLD!") +end +else +self.coalition=Coalition +self.coalitiontxt=string.lower(UTILS.GetCoalitionName(self.coalition)) +end +if Alias then +self.alias=tostring(Alias) +else +self.alias="UNHCR" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="Red CTLD Hercules" +elseif self.coalition==coalition.side.BLUE then +self.alias="Blue CTLD Hercules" +end +end +end +self.lid=string.format("%s (%s) | ",self.alias,self.coalitiontxt) +self.infantrytemplate="Infantry" +self.CTLD=CtldObject +self.verbose=true +self.j=0 +self.carrierGroups={} +self.Cargo={} +self.ParatrooperCount={} +self.ObjectTracker={} +self.lid=string.format("%s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:HandleEvent(EVENTS.Shot,self._HandleShot) +self:I(self.lid.."Started") +self:CheckTemplates() +return self +end +function CTLD_HERCULES:CheckTemplates() +self:T(self.lid..'CheckTemplates') +self.Types["Paratroopers 10"]={ +name=self.infantrytemplate, +container=false, +available=false, +} +local missing={} +local nomissing=0 +local found={} +local nofound=0 +for _index,_tab in pairs(self.Types)do +local outcometxt="MISSING" +if _DATABASE.Templates.Groups[_tab.name]then +outcometxt="OK" +self.Types[_index].available=true +found[_tab.name]=true +else +self.Types[_index].available=false +missing[_tab.name]=true +end +if self.verbose then +self:I(string.format(self.lid.."Checking template for %s (%s) ... %s",_index,_tab.name,outcometxt)) +end +end +for _,_name in pairs(found)do +nofound=nofound+1 +end +for _,_name in pairs(missing)do +nomissing=nomissing+1 +end +self:I(string.format(self.lid.."Template Check Summary: Found %d, Missing %d, Total %d",nofound,nomissing,nofound+nomissing)) +return self +end +function CTLD_HERCULES:Soldier_SpawnGroup(Cargo_Drop_initiator,Cargo_Drop_Position,Cargo_Type_name,CargoHeading,Cargo_Country,GroupSpacing) +self:T(self.lid..'Soldier_SpawnGroup') +self:T(Cargo_Drop_Position) +local InjectTroopsType=CTLD_CARGO:New(nil,self.infantrytemplate,{self.infantrytemplate},CTLD_CARGO.Enum.TROOPS,true,true,10,nil,false,80) +local position=Cargo_Drop_Position:GetVec2() +local dropzone=ZONE_RADIUS:New("Infantry "..math.random(1,10000),position,100) +self.CTLD:InjectTroops(dropzone,InjectTroopsType) +return self +end +function CTLD_HERCULES:Cargo_SpawnGroup(Cargo_Drop_initiator,Cargo_Drop_Position,Cargo_Type_name,CargoHeading,Cargo_Country) +self:T(self.lid.."Cargo_SpawnGroup") +self:T(Cargo_Type_name) +if Cargo_Type_name~='Container red 1'then +local InjectVehicleType=CTLD_CARGO:New(nil,Cargo_Type_name,{Cargo_Type_name},CTLD_CARGO.Enum.VEHICLE,true,true,1,nil,false,1000) +local position=Cargo_Drop_Position:GetVec2() +local dropzone=ZONE_RADIUS:New("Vehicle "..math.random(1,10000),position,100) +self.CTLD:InjectVehicles(dropzone,InjectVehicleType) +end +return self +end +function CTLD_HERCULES:Cargo_SpawnStatic(Cargo_Drop_initiator,Cargo_Drop_Position,Cargo_Type_name,CargoHeading,dead,Cargo_Country) +self:T(self.lid.."Cargo_SpawnStatic") +self:T("Static "..Cargo_Type_name.." Dead "..tostring(dead)) +local position=Cargo_Drop_Position:GetVec2() +local Zone=ZONE_RADIUS:New("Cargo Static "..math.random(1,10000),position,100) +if not dead then +local injectstatic=CTLD_CARGO:New(nil,"Cargo Static Group "..math.random(1,10000),"iso_container",CTLD_CARGO.Enum.STATIC,true,false,1,nil,true,4500,1) +self.CTLD:InjectStatics(Zone,injectstatic,true,true) +end +return self +end +function CTLD_HERCULES:Cargo_SpawnDroppedAsCargo(_name,_pos) +local theCargo=self.CTLD:_FindCratesCargoObject(_name) +if theCargo then +self.CTLD.CrateCounter=self.CTLD.CrateCounter+1 +local CCat,CType,CShape=theCargo:GetStaticTypeAndShape() +local basetype=CType or self.CTLD.basetype or"container_cargo" +CCat=CCat or"Cargos" +local theStatic=SPAWNSTATIC:NewFromType(basetype,CCat,self.cratecountry) +:InitCargoMass(theCargo.PerCrateMass) +:InitCargo(self.CTLD.enableslingload) +:InitCoordinate(_pos) +if CShape then +theStatic:InitShape(CShape) +end +theStatic:Spawn(270,_name.."-Container-"..math.random(1,100000)) +self.CTLD.Spawned_Crates[self.CTLD.CrateCounter]=theStatic +local newCargo=CTLD_CARGO:New(self.CTLD.CargoCounter,theCargo.Name,theCargo.Templates,theCargo.CargoType,true,false,theCargo.CratesNeeded,self.CTLD.Spawned_Crates[self.CTLD.CrateCounter],true,theCargo.PerCrateMass,nil,theCargo.Subcategory) +local map=theCargo:GetStaticResourceMap() +newCargo:SetStaticResourceMap(map) +table.insert(self.CTLD.Spawned_Cargo,newCargo) +newCargo:SetWasDropped(true) +newCargo:SetHasMoved(true) +end +return self +end +function CTLD_HERCULES:Cargo_SpawnObjects(Cargo_Drop_initiator,Cargo_Drop_Direction,Cargo_Content_position,Cargo_Type_name,Cargo_over_water,Container_Enclosed,ParatrooperGroupSpawn,offload_cargo,all_cargo_survive_to_the_ground,all_cargo_gets_destroyed,destroy_cargo_dropped_without_parachute,Cargo_Country) +self:T(self.lid..'Cargo_SpawnObjects') +local CargoHeading=self.CargoHeading +if offload_cargo==true or ParatrooperGroupSpawn==true then +if ParatrooperGroupSpawn==true then +self:Soldier_SpawnGroup(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,Cargo_Country,10) +else +self:Cargo_SpawnGroup(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,Cargo_Country) +end +else +if all_cargo_gets_destroyed==true or Cargo_over_water==true then +else +if all_cargo_survive_to_the_ground==true then +if ParatrooperGroupSpawn==true then +self:Cargo_SpawnStatic(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,true,Cargo_Country) +else +self:Cargo_SpawnGroup(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,Cargo_Country) +end +if Container_Enclosed==true then +if ParatrooperGroupSpawn==false then +self:Cargo_SpawnStatic(Cargo_Drop_initiator,Cargo_Content_position,"Hercules_Container_Parachute_Static",CargoHeading,false,Cargo_Country) +end +end +end +if destroy_cargo_dropped_without_parachute==true then +if Container_Enclosed==true then +if ParatrooperGroupSpawn==true then +self:Soldier_SpawnGroup(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,Cargo_Country,0) +else +if self.CTLD.dropAsCargoCrate then +self:Cargo_SpawnDroppedAsCargo(Cargo_Type_name,Cargo_Content_position) +else +self:Cargo_SpawnGroup(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,Cargo_Country) +self:Cargo_SpawnStatic(Cargo_Drop_initiator,Cargo_Content_position,"Hercules_Container_Parachute_Static",CargoHeading,false,Cargo_Country) +end +end +else +self:Cargo_SpawnStatic(Cargo_Drop_initiator,Cargo_Content_position,Cargo_Type_name,CargoHeading,true,Cargo_Country) +end +end +end +end +return self +end +function CTLD_HERCULES:Calculate_Object_Height_AGL(group) +self:T(self.lid.."Calculate_Object_Height_AGL") +if group.ClassName and group.ClassName=="GROUP"then +local gcoord=group:GetCoordinate() +local height=group:GetHeight() +local lheight=gcoord:GetLandHeight() +self:T(self.lid.."Height "..height-lheight) +return height-lheight +else +if group:isExist()then +local dcsposition=group:getPosition().p +local dcsvec2={x=dcsposition.x,y=dcsposition.z} +local height=math.floor(group:getPosition().p.y-land.getHeight(dcsvec2)) +self.ObjectTracker[group.id_]=dcsposition +self:T(self.lid.."Height "..height) +return height +else +return 0 +end +end +end +function CTLD_HERCULES:Check_SurfaceType(object) +self:T(self.lid.."Check_SurfaceType") +if object:isExist()then +return land.getSurfaceType({x=object:getPosition().p.x,y=object:getPosition().p.z}) +else +return 1 +end +end +function CTLD_HERCULES:Cargo_Track(cargo,initiator) +self:T(self.lid.."Cargo_Track") +local Cargo_Drop_initiator=initiator +if cargo.Cargo_Contents~=nil then +if self:Calculate_Object_Height_AGL(cargo.Cargo_Contents)<10 then +if self:Check_SurfaceType(cargo.Cargo_Contents)==2 or self:Check_SurfaceType(cargo.Cargo_Contents)==3 then +cargo.Cargo_over_water=true +end +local dcsvec3=self.ObjectTracker[cargo.Cargo_Contents.id_]or initiator:GetVec3() +self:T("SPAWNPOSITION: ") +self:T({dcsvec3}) +local Vec2={ +x=dcsvec3.x, +y=dcsvec3.z, +} +local vec3=COORDINATE:NewFromVec2(Vec2) +self.ObjectTracker[cargo.Cargo_Contents.id_]=nil +self:Cargo_SpawnObjects(Cargo_Drop_initiator,cargo.Cargo_Drop_Direction,vec3,cargo.Cargo_Type_name,cargo.Cargo_over_water,cargo.Container_Enclosed,cargo.ParatrooperGroupSpawn,cargo.offload_cargo,cargo.all_cargo_survive_to_the_ground,cargo.all_cargo_gets_destroyed,cargo.destroy_cargo_dropped_without_parachute,cargo.Cargo_Country) +if cargo.Cargo_Contents:isExist()then +cargo.Cargo_Contents:destroy() +end +cargo.scheduleFunctionID:Stop() +cargo={} +end +end +return self +end +function CTLD_HERCULES:Calculate_Cargo_Drop_initiator_NorthCorrection(point) +self:T(self.lid.."Calculate_Cargo_Drop_initiator_NorthCorrection") +if not point.z then +point.z=point.y +point.y=0 +end +local lat,lon=coord.LOtoLL(point) +local north_posit=coord.LLtoLO(lat+1,lon) +return math.atan2(north_posit.z-point.z,north_posit.x-point.x) +end +function CTLD_HERCULES:Calculate_Cargo_Drop_initiator_Heading(Cargo_Drop_initiator) +self:T(self.lid.."Calculate_Cargo_Drop_initiator_Heading") +local Heading=Cargo_Drop_initiator:GetHeading() +Heading=Heading+self:Calculate_Cargo_Drop_initiator_NorthCorrection(Cargo_Drop_initiator:GetVec3()) +if Heading<0 then +Heading=Heading+(2*math.pi) +end +return Heading+0.06 +end +function CTLD_HERCULES:Cargo_Initialize(Initiator,Cargo_Contents,Cargo_Type_name,Container_Enclosed,SoldierGroup,ParatrooperGroupSpawnInit) +self:T(self.lid.."Cargo_Initialize") +local Cargo_Drop_initiator=Initiator:GetName() +if Cargo_Drop_initiator~=nil then +if ParatrooperGroupSpawnInit==true then +self:T("Paratrooper Drop") +if not self.ParatrooperCount[Cargo_Drop_initiator]then +self.ParatrooperCount[Cargo_Drop_initiator]=1 +else +self.ParatrooperCount[Cargo_Drop_initiator]=self.ParatrooperCount[Cargo_Drop_initiator]+1 +end +local Paratroopers=self.ParatrooperCount[Cargo_Drop_initiator] +self:T("Paratrooper Drop Number "..self.ParatrooperCount[Cargo_Drop_initiator]) +local SpawnParas=false +if math.fmod(Paratroopers,10)==0 then +SpawnParas=true +end +self.j=self.j+1 +self.Cargo[self.j]={} +self.Cargo[self.j].Cargo_Drop_Direction=self:Calculate_Cargo_Drop_initiator_Heading(Initiator) +self.Cargo[self.j].Cargo_Contents=Cargo_Contents +self.Cargo[self.j].Cargo_Type_name=Cargo_Type_name +self.Cargo[self.j].Container_Enclosed=Container_Enclosed +self.Cargo[self.j].ParatrooperGroupSpawn=SpawnParas +self.Cargo[self.j].Cargo_Country=Initiator:GetCountry() +if self:Calculate_Object_Height_AGL(Initiator)<5.0 then +self.Cargo[self.j].offload_cargo=true +elseif self:Calculate_Object_Height_AGL(Initiator)<10.0 then +self.Cargo[self.j].all_cargo_survive_to_the_ground=true +elseif self:Calculate_Object_Height_AGL(Initiator)<100.0 then +self.Cargo[self.j].all_cargo_gets_destroyed=true +else +self.Cargo[self.j].all_cargo_gets_destroyed=false +end +local timer=TIMER:New(self.Cargo_Track,self,self.Cargo[self.j],Initiator) +self.Cargo[self.j].scheduleFunctionID=timer +timer:Start(1,1,600) +else +self.j=self.j+1 +self.Cargo[self.j]={} +self.Cargo[self.j].Cargo_Drop_Direction=self:Calculate_Cargo_Drop_initiator_Heading(Initiator) +self.Cargo[self.j].Cargo_Contents=Cargo_Contents +self.Cargo[self.j].Cargo_Type_name=Cargo_Type_name +self.Cargo[self.j].Container_Enclosed=Container_Enclosed +self.Cargo[self.j].ParatrooperGroupSpawn=false +self.Cargo[self.j].Cargo_Country=Initiator:GetCountry() +if self:Calculate_Object_Height_AGL(Initiator)<5.0 then +self.Cargo[self.j].offload_cargo=true +elseif self:Calculate_Object_Height_AGL(Initiator)<10.0 then +self.Cargo[self.j].all_cargo_survive_to_the_ground=true +elseif self:Calculate_Object_Height_AGL(Initiator)<100.0 then +self.Cargo[self.j].all_cargo_gets_destroyed=true +else +self.Cargo[self.j].destroy_cargo_dropped_without_parachute=true +end +local timer=TIMER:New(self.Cargo_Track,self,self.Cargo[self.j],Initiator) +self.Cargo[self.j].scheduleFunctionID=timer +timer:Start(1,1,600) +end +end +return self +end +function CTLD_HERCULES:SetType(key,cargoType,cargoNum) +self:T(self.lid.."SetType") +self.carrierGroups[key]['cargoType']=cargoType +self.carrierGroups[key]['cargoNum']=cargoNum +return self +end +function CTLD_HERCULES:_HandleShot(Cargo_Drop_Event) +self:T(self.lid.."Shot Event ID:"..Cargo_Drop_Event.id) +if Cargo_Drop_Event.id==EVENTS.Shot then +local GT_Name="" +local SoldierGroup=false +local ParatrooperGroupSpawnInit=false +local GT_DisplayName=Weapon.getDesc(Cargo_Drop_Event.weapon).typeName:sub(15,-1) +self:T(string.format("%sCargo_Drop_Event: %s",self.lid,Weapon.getDesc(Cargo_Drop_Event.weapon).typeName)) +if(GT_DisplayName=="Squad 30 x Soldier [7950lb]")then +self:Cargo_Initialize(Cargo_Drop_Event.IniGroup,Cargo_Drop_Event.weapon,"Soldier M4 GRG",false,true,true) +end +if self.Types[GT_DisplayName]then +local GT_Name=self.Types[GT_DisplayName]['name'] +local Cargo_Container_Enclosed=self.Types[GT_DisplayName]['container'] +self:Cargo_Initialize(Cargo_Drop_Event.IniGroup,Cargo_Drop_Event.weapon,GT_Name,Cargo_Container_Enclosed) +end +end +return self +end +function CTLD_HERCULES:_HandleBirth(event) +self:T(self.lid.."Birth Event ID:"..event.id) +return self +end +end +CSAR={ +ClassName="CSAR", +verbose=0, +lid="", +coalition=1, +coalitiontxt="blue", +FreeVHFFrequencies={}, +UsedVHFFrequencies={}, +takenOff={}, +csarUnits={}, +downedPilots={}, +landedStatus={}, +addedTo={}, +woundedGroups={}, +inTransitGroups={}, +smokeMarkers={}, +heliVisibleMessage={}, +heliCloseMessage={}, +max_units=6, +hoverStatus={}, +pilotDisabled={}, +pilotLives={}, +useprefix=true, +csarPrefix={}, +template=nil, +mash={}, +smokecolor=4, +rescues=0, +rescuedpilots=0, +limitmaxdownedpilots=true, +maxdownedpilots=10, +useFIFOLimitReplacement=false, +allheligroupset=nil, +topmenuname="CSAR", +ADFRadioPwr=1000, +PilotWeight=80, +CreateRadioBeacons=true, +UserSetGroup=nil, +AllowIRStrobe=false, +IRStrobeRuntime=300, +} +CSAR.AircraftType={} +CSAR.AircraftType["SA342Mistral"]=2 +CSAR.AircraftType["SA342Minigun"]=2 +CSAR.AircraftType["SA342L"]=4 +CSAR.AircraftType["SA342M"]=4 +CSAR.AircraftType["UH-1H"]=8 +CSAR.AircraftType["Mi-8MTV2"]=12 +CSAR.AircraftType["Mi-8MT"]=12 +CSAR.AircraftType["Mi-24P"]=8 +CSAR.AircraftType["Mi-24V"]=8 +CSAR.AircraftType["Bell-47"]=2 +CSAR.AircraftType["UH-60L"]=10 +CSAR.AircraftType["UH-60L_DAP"]=2 +CSAR.AircraftType["AH-64D_BLK_II"]=2 +CSAR.AircraftType["Bronco-OV-10A"]=2 +CSAR.AircraftType["MH-60R"]=10 +CSAR.AircraftType["OH-6A"]=2 +CSAR.AircraftType["OH58D"]=2 +CSAR.AircraftType["CH-47Fbl1"]=31 +CSAR.version="1.0.34" +function CSAR:New(Coalition,Template,Alias) +local self=BASE:Inherit(self,FSM:New()) +BASE:T({Coalition,Template,Alias}) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +self.coalitiontxt=Coalition +elseif Coalition=="red"then +self.coalition=coalition.side.RED +self.coalitiontxt=Coalition +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +self.coalitiontxt=Coalition +else +self:E("ERROR: Unknown coalition in CSAR!") +end +else +self.coalition=Coalition +self.coalitiontxt=string.lower(UTILS.GetCoalitionName(self.coalition)) +end +if Alias then +self.alias=tostring(Alias) +else +self.alias="Red Cross" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="IFRC" +elseif self.coalition==coalition.side.BLUE then +self.alias="CSAR" +end +end +end +self.lid=string.format("%s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","PilotDown","*") +self:AddTransition("*","Approach","*") +self:AddTransition("*","Landed","*") +self:AddTransition("*","Boarded","*") +self:AddTransition("*","Returning","*") +self:AddTransition("*","Rescued","*") +self:AddTransition("*","KIA","*") +self:AddTransition("*","Load","*") +self:AddTransition("*","Save","*") +self:AddTransition("*","Stop","Stopped") +self.addedTo={} +self.allheligroupset={} +self.csarUnits={} +self.FreeVHFFrequencies={} +self.heliVisibleMessage={} +self.heliCloseMessage={} +self.hoverStatus={} +self.inTransitGroups={} +self.landedStatus={} +self.lastCrash={} +self.takenOff={} +self.smokeMarkers={} +self.UsedVHFFrequencies={} +self.woundedGroups={} +self.downedPilots={} +self.downedpilotcounter=1 +self.rescues=0 +self.rescuedpilots=0 +self.csarOncrash=false +self.allowDownedPilotCAcontrol=false +self.enableForAI=false +self.smokecolor=4 +self.coordtype=2 +self.immortalcrew=true +self.invisiblecrew=false +self.messageTime=15 +self.pilotRuntoExtractPoint=true +self.loadDistance=75 +self.extractDistance=500 +self.loadtimemax=135 +self.radioSound="beacon.ogg" +self.beaconRefresher=29 +self.allowFARPRescue=true +self.FARPRescueDistance=1000 +self.max_units=6 +self.useprefix=true +self.csarPrefix={"helicargo","MEDEVAC"} +self.template=Template or"generic" +self.mashprefix={"MASH"} +self.autosmoke=false +self.autosmokedistance=2000 +self.limitmaxdownedpilots=true +self.maxdownedpilots=25 +self:_GenerateVHFrequencies() +self.approachdist_far=5000 +self.approachdist_near=3000 +self.pilotmustopendoors=false +self.suppressmessages=false +self.rescuehoverheight=20 +self.rescuehoverdistance=10 +self.countryblue=country.id.USA +self.countryred=country.id.RUSSIA +self.countryneutral=country.id.UN_PEACEKEEPERS +self.csarUsePara=false +self.wetfeettemplate=nil +self.usewetfeet=false +self.allowbronco=false +self.ADFRadioPwr=500 +self.PilotWeight=80 +self.UserSetGroup=nil +self.useSRS=false +self.SRSPath="E:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.SRSchannel=300 +self.SRSModulation=radio.modulation.AM +self.SRSport=5002 +self.SRSCulture="en-GB" +self.SRSVoice=MSRS.Voices.Google.Standard.en_GB_Standard_B +self.SRSGPathToCredentials=nil +self.SRSVolume=1.0 +self.SRSGender="male" +self.CSARVoice=MSRS.Voices.Google.Standard.en_US_Standard_A +self.CSARVoiceMS=MSRS.Voices.Microsoft.Hedda +self.coordinate=nil +local AliaS=string.gsub(self.alias," ","_") +self.filename=string.format("CSAR_%s_Persist.csv",AliaS) +self.enableLoadSave=false +self.filepath=nil +self.saveinterval=600 +return self +end +function CSAR:_CreateDownedPilotTrack(Group,Groupname,Side,OriginalUnit,Description,Typename,Frequency,Playername,Wetfeet,BeaconName) +self:T({"_CreateDownedPilotTrack",Groupname,Side,OriginalUnit,Description,Typename,Frequency,Playername}) +local DownedPilot={} +DownedPilot.desc=Description or"" +DownedPilot.frequency=Frequency or 0 +DownedPilot.index=self.downedpilotcounter +DownedPilot.name=Groupname or Playername or"" +DownedPilot.originalUnit=OriginalUnit or"" +DownedPilot.player=Playername or"" +DownedPilot.side=Side or 0 +DownedPilot.typename=Typename or"" +DownedPilot.group=Group +DownedPilot.timestamp=0 +DownedPilot.alive=true +DownedPilot.wetfeet=Wetfeet or false +DownedPilot.BeaconName=BeaconName +local PilotTable=self.downedPilots +local counter=self.downedpilotcounter +PilotTable[counter]={} +PilotTable[counter]=DownedPilot +self:T({Table=PilotTable}) +self.downedPilots=PilotTable +self.downedpilotcounter=self.downedpilotcounter+1 +return self +end +function CSAR:_PilotsOnboard(_heliName) +self:T(self.lid.." _PilotsOnboard") +local count=0 +if self.inTransitGroups[_heliName]then +for _,_group in pairs(self.inTransitGroups[_heliName])do +count=count+1 +end +end +return count +end +function CSAR:_DoubleEjection(_unitname) +if self.lastCrash[_unitname]then +local _time=self.lastCrash[_unitname] +if timer.getTime()-_time<10 then +self:E(self.lid.."Caught double ejection!") +return true +end +end +self.lastCrash[_unitname]=timer.getTime() +return false +end +function CSAR:AddPlayerTask(PlayerTask) +self:T(self.lid.." AddPlayerTask") +if not self.PlayerTaskQueue then +self.PlayerTaskQueue=FIFO:New() +end +self.PlayerTaskQueue:Push(PlayerTask,PlayerTask.PlayerTaskNr) +return self +end +function CSAR:_SpawnPilotInField(country,point,frequency,wetfeet) +self:T({country,point,frequency,tostring(wetfeet)}) +local freq=frequency or 1000 +local freq=freq/1000 +for i=1,10 do +math.random(i,10000) +end +if point:IsSurfaceTypeWater()or wetfeet then +point.y=0 +end +local template=self.template +if self.usewetfeet and wetfeet then +template=self.wetfeettemplate +end +local alias=string.format("Pilot %.2fkHz-%d",freq,math.random(1,99)) +local coalition=self.coalition +local pilotcacontrol=self.allowDownedPilotCAcontrol +local _spawnedGroup=SPAWN +:NewWithAlias(template,alias) +:InitCoalition(coalition) +:InitCountry(country) +:InitDelayOff() +:SpawnFromCoordinate(point) +return _spawnedGroup,alias +end +function CSAR:_AddSpecialOptions(group) +self:T(self.lid.." _AddSpecialOptions") +self:T({group}) +local immortalcrew=self.immortalcrew +local invisiblecrew=self.invisiblecrew +if immortalcrew then +local _setImmortal={ +id='SetImmortal', +params={ +value=true +} +} +group:SetCommand(_setImmortal) +end +if invisiblecrew then +local _setInvisible={ +id='SetInvisible', +params={ +value=true +} +} +group:SetCommand(_setInvisible) +end +group:OptionAlarmStateGreen() +group:OptionROEHoldFire() +return self +end +function CSAR:_AddCsar(_coalition,_country,_point,_typeName,_unitName,_playerName,_freq,noMessage,_description,forcedesc) +self:T(self.lid.." _AddCsar") +self:T({_coalition,_country,_point,_typeName,_unitName,_playerName,_freq,noMessage,_description}) +local template=self.template +local wetfeet=false +local surface=_point:GetSurfaceType() +if surface==land.SurfaceType.WATER then +wetfeet=true +end +if not _freq then +_freq=self:_GenerateADFFrequency() +if not _freq then _freq=333000 end +end +local _spawnedGroup,_alias=self:_SpawnPilotInField(_country,_point,_freq,wetfeet) +local _typeName=_typeName or"Pilot" +if not noMessage then +if _freq~=0 then +self:_DisplayToAllSAR("MAYDAY MAYDAY! ".._typeName.." is down. ",self.coalition,self.messageTime) +else +self:_DisplayToAllSAR("Troops In Contact. ".._typeName.." requests CASEVAC. ",self.coalition,self.messageTime) +end +end +local BeaconName +if _playerName then +BeaconName=_playerName..math.random(1,10000) +elseif _unitName then +BeaconName=_unitName..math.random(1,10000) +else +BeaconName="Ghost-1-1"..math.random(1,10000) +end +if(_freq and _freq~=0)then +self:_AddBeaconToGroup(_spawnedGroup,_freq,BeaconName) +end +self:_AddSpecialOptions(_spawnedGroup) +local _text=_description +if not forcedesc then +if _playerName~=nil then +if _freq~=0 then +_text="Pilot ".._playerName +else +_text="TIC - ".._playerName +end +elseif _unitName~=nil then +if _freq~=0 then +_text="AI Pilot of ".._unitName +else +_text="TIC - ".._unitName +end +end +end +self:T({_spawnedGroup,_alias}) +local _GroupName=_spawnedGroup:GetName()or _alias +self:_CreateDownedPilotTrack(_spawnedGroup,_GroupName,_coalition,_unitName,_text,_typeName,_freq,_playerName,wetfeet,BeaconName) +self:_InitSARForPilot(_spawnedGroup,_unitName,_freq,noMessage,_playerName) +return _spawnedGroup,_alias +end +function CSAR:_SpawnCsarAtZone(_zone,_coalition,_description,_randomPoint,_nomessage,unitname,typename,forcedesc) +self:T(self.lid.." _SpawnCsarAtZone") +local freq=self:_GenerateADFFrequency() +local _triggerZone=nil +if type(_zone)=="string"then +_triggerZone=ZONE:New(_zone) +elseif type(_zone)=="table"and _zone.ClassName then +if string.find(_zone.ClassName,"ZONE",1)then +_triggerZone=_zone +end +end +if _triggerZone==nil then +self:E(self.lid.."ERROR: Can\'t find zone called ".._zone,10) +return +end +local _description=_description or"PoW" +local unitname=unitname or"Old Rusty" +local typename=typename or"Phantom II" +local pos={} +if _randomPoint then +local _pos=_triggerZone:GetRandomPointVec3() +pos=COORDINATE:NewFromVec3(_pos) +else +pos=_triggerZone:GetCoordinate() +end +local _country=0 +if _coalition==coalition.side.BLUE then +_country=self.countryblue +elseif _coalition==coalition.side.RED then +_country=self.countryred +else +_country=self.countryneutral +end +self:_AddCsar(_coalition,_country,pos,typename,unitname,_description,freq,_nomessage,_description,forcedesc) +return self +end +function CSAR:SpawnCSARAtZone(Zone,Coalition,Description,RandomPoint,Nomessage,Unitname,Typename,Forcedesc) +self:_SpawnCsarAtZone(Zone,Coalition,Description,RandomPoint,Nomessage,Unitname,Typename,Forcedesc) +return self +end +function CSAR:_SpawnCASEVAC(_Point,_coalition,_description,_nomessage,unitname,typename,forcedesc) +self:T(self.lid.." _SpawnCASEVAC") +local _description=_description or"CASEVAC" +local unitname=unitname or"CASEVAC" +local typename=typename or"Ground Commander" +local pos={} +pos=_Point +local _country=0 +if _coalition==coalition.side.BLUE then +_country=self.countryblue +elseif _coalition==coalition.side.RED then +_country=self.countryred +else +_country=self.countryneutral +end +self:_AddCsar(_coalition,_country,pos,typename,unitname,_description,0,_nomessage,_description,forcedesc) +return self +end +function CSAR:SpawnCASEVAC(Point,Coalition,Description,Nomessage,Unitname,Typename,Forcedesc) +self:_SpawnCASEVAC(Point,Coalition,Description,Nomessage,Unitname,Typename,Forcedesc) +return self +end +function CSAR:_EventHandler(EventData) +self:T(self.lid.." _EventHandler") +self:T({Event=EventData.id}) +local _event=EventData +if self.enableForAI==false and _event.IniPlayerName==nil then +return self +end +if _event==nil or _event.initiator==nil then +return self +elseif _event.id==EVENTS.Takeoff then +self:T(self.lid.." Event unit - Takeoff") +local _coalition=_event.IniCoalition +if _coalition~=self.coalition then +return self +end +if _event.IniGroupName then +self.takenOff[_event.IniUnitName]=true +end +return self +elseif _event.id==EVENTS.PlayerEnterAircraft or _event.id==EVENTS.PlayerEnterUnit then +self:T(self.lid.." Event unit - Player Enter") +local _coalition=_event.IniCoalition +self:T("Coalition = "..UTILS.GetCoalitionName(_coalition)) +if _coalition~=self.coalition then +return self +end +if _event.IniPlayerName then +self.takenOff[_event.IniPlayerName]=nil +end +self:T("Taken Off: "..tostring(_event.IniUnit:InAir(true))) +if _event.IniUnit:InAir(true)then +self.takenOff[_event.IniPlayerName]=true +end +local _unit=_event.IniUnit +local _group=_event.IniGroup +local function IsBronco(Group) +local grp=Group +local typename=grp:GetTypeName() +self:T(typename) +if typename=="Bronco-OV-10A"then return true end +return false +end +if _unit:IsHelicopter()or _group:IsHelicopter()or IsBronco(_group)then +self:_AddMedevacMenuItem() +end +return self +elseif(_event.id==EVENTS.PilotDead and self.csarOncrash==false)then +self:T(self.lid.." Event unit - Pilot Dead") +local _unit=_event.IniUnit +local _unitname=_event.IniUnitName +local _group=_event.IniGroup +if _unit==nil then +return self +end +local _coalition=_event.IniCoalition +if _coalition~=self.coalition then +return self +end +if self.takenOff[_event.IniUnitName]==true or _group:IsAirborne()then +if self:_DoubleEjection(_unitname)then +return self +end +else +self:T(self.lid.." Pilot has not taken off, ignore") +end +return self +elseif _event.id==EVENTS.PilotDead or _event.id==EVENTS.Ejection then +if _event.id==EVENTS.PilotDead and self.csarOncrash==false then +return self +end +self:T(self.lid.." Event unit - Pilot Ejected") +local _unit=_event.IniUnit +local _unitname=_event.IniUnitName +local _group=_event.IniGroup +self:T({_unit.UnitName,_unitname,_group.GroupName}) +if _unit==nil then +self:T("Unit NIL!") +return self +end +local _coalition=_group:GetCoalition() +if _coalition~=self.coalition then +self:T("Wrong coalition! Coalition = "..UTILS.GetCoalitionName(_coalition)) +return self +end +self:T("Airborne: "..tostring(_group:IsAirborne())) +self:T("Taken Off: "..tostring(self.takenOff[_event.IniUnitName])) +if not self.takenOff[_event.IniUnitName]and not _group:IsAirborne()then +self:T(self.lid.." Pilot has not taken off, ignore") +end +if self:_DoubleEjection(_unitname)then +self:T("Double Ejection!") +return self +end +local initdcscoord=nil +local initcoord=nil +if _event.id==EVENTS.Ejection and _event.TgtDCSUnit then +initdcscoord=_event.TgtDCSUnit:getPoint() +initcoord=COORDINATE:NewFromVec3(initdcscoord) +self:T({initdcscoord}) +elseif _event.IniDCSUnit then +initdcscoord=_event.IniDCSUnit:getPoint() +initcoord=COORDINATE:NewFromVec3(initdcscoord) +self:T({initdcscoord}) +end +if _event.IniPlayerName then +local PilotTable=self.downedPilots +local _foundPilot=nil +for _,_pilot in pairs(PilotTable)do +if _pilot.player==_event.IniPlayerName and _pilot.alive==true then +_foundPilot=_pilot +break +end +end +if _foundPilot then +self:T("Downed pilot already exists!") +_foundPilot.group:Destroy(false) +self:_RemoveNameFromDownedPilots(_foundPilot.name) +self:_CheckDownedPilotTable() +end +end +if self.limitmaxdownedpilots and self:_ReachedPilotLimit()then +self:T("Maxed Downed Pilot!") +return self +end +local wetfeet=false +local surface=initcoord:GetSurfaceType() +if surface==land.SurfaceType.WATER then +self:T("Wet feet!") +wetfeet=true +end +if self.csarUsePara==false or(self.csarUsePara and wetfeet)then +local _freq=self:_GenerateADFFrequency() +self:_AddCsar(_coalition,_unit:GetCountry(),initcoord,_unit:GetTypeName(),_unit:GetName(),_event.IniPlayerName,_freq,self.suppressmessages,"none") +return self +end +elseif _event.id==EVENTS.Land then +self:T(self.lid.." Landing") +if _event.IniUnitName then +self.takenOff[_event.IniUnitName]=nil +end +if self.allowFARPRescue then +local _unit=_event.IniUnit +if _unit==nil then +self:T(self.lid.." Unit nil on landing") +return self +end +local _coalition=_event.IniGroup:GetCoalition() +if _coalition~=self.coalition then +self:T(self.lid.." Wrong coalition") +return self +end +self.takenOff[_event.IniUnitName]=nil +local _place=_event.Place +if _place==nil then +self:T(self.lid.." Landing Place Nil") +return self +end +if self.inTransitGroups[_event.IniUnitName]==nil then +return self +end +if _place:GetCoalition()==self.coalition or _place:GetCoalition()==coalition.side.NEUTRAL then +self:__Landed(2,_event.IniUnitName,_place) +local IsHeloBase=false +local ABName=_place:GetName() +if ABName and string.find(ABName,"^H")then IsHeloBase=true end +self:_ScheduledSARFlight(_event.IniUnitName,_event.IniGroupName,true,true,IsHeloBase) +else +self:T(string.format("Airfield %d, Unit %d",_place:GetCoalition(),_unit:GetCoalition())) +end +end +return self +end +if(_event.id==EVENTS.LandingAfterEjection and self.csarUsePara==true)then +self:T("LANDING_AFTER_EJECTION") +local _LandingPos=COORDINATE:NewFromVec3(_event.initiator:getPosition().p) +local _unitname="Aircraft" +local _typename="Ejected Pilot" +local _country=_event.initiator:getCountry() +local _coalition=coalition.getCountryCoalition(_country) +self:T("Country = ".._country.." Coalition = ".._coalition) +if _coalition==self.coalition then +local _freq=self:_GenerateADFFrequency() +self:I({coalition=_coalition,country=_country,coord=_LandingPos,name=_unitname,player=_event.IniPlayerName,freq=_freq}) +self:_AddCsar(_coalition,_country,_LandingPos,nil,_unitname,_event.IniPlayerName,_freq,self.suppressmessages,"none") +Unit.destroy(_event.initiator) +end +end +return self +end +function CSAR:_InitSARForPilot(_downedGroup,_GroupName,_freq,_nomessage,_playername) +self:T(self.lid.." _InitSARForPilot") +local _leader=_downedGroup:GetUnit(1) +local _groupName=_GroupName +local _freqk=_freq/1000 +local _coordinatesText=self:_GetPositionOfWounded(_downedGroup) +local _leadername=_leader:GetName() +if not _nomessage then +if _freq~=0 then +local _text=string.format("%s requests SAR at %s, beacon at %.2f KHz",_groupName,_coordinatesText,_freqk) +if self.coordtype~=2 then +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime) +else +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime,false,true) +local coordtext=UTILS.MGRSStringToSRSFriendly(_coordinatesText,true) +local _text=string.format("%s requests SAR at %s, beacon at %.2f kilo hertz",_groupName,coordtext,_freqk) +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime,true,false) +end +else +local _text=string.format("Pickup Zone at %s.",_coordinatesText) +if self.coordtype~=2 then +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime) +else +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime,false,true) +local coordtext=UTILS.MGRSStringToSRSFriendly(_coordinatesText,true) +local _text=string.format("Pickup Zone at %s.",coordtext) +self:_DisplayToAllSAR(_text,self.coalition,self.messageTime,true,false) +end +end +end +for _,_heliName in pairs(self.csarUnits)do +self:_CheckWoundedGroupStatus(_heliName,_groupName) +end +self:__PilotDown(2,_downedGroup,_freqk,_groupName,_coordinatesText,_playername) +return self +end +function CSAR:_CheckNameInDownedPilots(name) +local PilotTable=self.downedPilots +local found=false +local table=nil +for _,_pilot in pairs(PilotTable)do +if _pilot.name==name and _pilot.alive==true then +found=true +table=_pilot +break +end +end +return found,table +end +function CSAR:_RemoveNameFromDownedPilots(name,force) +local PilotTable=self.downedPilots +local found=false +for _index,_pilot in pairs(PilotTable)do +if _pilot.name==name then +self.downedPilots[_index].alive=false +end +end +return found +end +function CSAR:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations) +if not ShortCallsign or ShortCallsign==false then +self.ShortCallsign=false +else +self.ShortCallsign=true +end +self.Keepnumber=Keepnumber or false +self.CallsignTranslations=CallsignTranslations +return self +end +function CSAR:_GetCustomCallSign(UnitName) +local callsign=UnitName +local unit=UNIT:FindByName(UnitName) +if unit and unit:IsAlive()then +local group=unit:GetGroup() +callsign=group:GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations) +end +return callsign +end +function CSAR:_CheckWoundedGroupStatus(heliname,woundedgroupname) +self:T(self.lid.." _CheckWoundedGroupStatus") +local _heliName=heliname +local _woundedGroupName=woundedgroupname +self:T({Heli=_heliName,Downed=_woundedGroupName}) +local _found,_downedpilot=self:_CheckNameInDownedPilots(_woundedGroupName) +if not _found then +self:T("...not found in list!") +return +end +local _woundedGroup=_downedpilot.group +if _woundedGroup~=nil and _woundedGroup:IsAlive()then +local _heliUnit=self:_GetSARHeli(_heliName) +local _lookupKeyHeli=_heliName.."_".._woundedGroupName +if _heliUnit==nil then +self.heliVisibleMessage[_lookupKeyHeli]=nil +self.heliCloseMessage[_lookupKeyHeli]=nil +self.landedStatus[_lookupKeyHeli]=nil +self:T("...heliunit nil!") +return +end +local _heliCoord=_heliUnit:GetCoordinate() +local _leaderCoord=_woundedGroup:GetCoordinate() +local _distance=self:_GetDistance(_heliCoord,_leaderCoord) +if(self.autosmoke==true)and(_distance<self.autosmokedistance)and(_distance~=-1)then +self:_PopSmokeForGroup(_woundedGroupName,_woundedGroup) +end +if _distance<self.approachdist_near and _distance>0 then +if self:_CheckCloseWoundedGroup(_distance,_heliUnit,_heliName,_woundedGroup,_woundedGroupName)==true then +_downedpilot.timestamp=timer.getAbsTime() +self:__Approach(-5,heliname,woundedgroupname) +end +elseif _distance>=self.approachdist_near and _distance<self.approachdist_far then +if self.heliVisibleMessage[_lookupKeyHeli]==nil then +local _pilotName=_downedpilot.desc +if self.autosmoke==true then +local dist=self.autosmokedistance/1000 +local disttext=string.format("%.0fkm",dist) +if _SETTINGS:IsImperial()then +local dist=UTILS.MetersToNM(self.autosmokedistance) +disttext=string.format("%.0fnm",dist) +end +self:_DisplayMessageToSAR(_heliUnit,string.format("%s: %s. I hear you! Finally, that is music in my ears!\nI'll pop a smoke when you are %s away.\nLand or hover by the smoke.",self:_GetCustomCallSign(_heliName),_pilotName,disttext),self.messageTime,false,true) +else +self:_DisplayMessageToSAR(_heliUnit,string.format("%s: %s. I hear you! Finally, that is music in my ears!\nRequest a flare or smoke if you need.",self:_GetCustomCallSign(_heliName),_pilotName),self.messageTime,false,true) +end +self.heliVisibleMessage[_lookupKeyHeli]=true +end +self.heliCloseMessage[_lookupKeyHeli]=nil +self.landedStatus[_lookupKeyHeli]=nil +_downedpilot.timestamp=timer.getAbsTime() +self:__Approach(-10,heliname,woundedgroupname) +end +else +self:T("...Downed Pilot KIA?!") +if not _downedpilot.alive then +self:_RemoveNameFromDownedPilots(_downedpilot.name,true) +end +end +return self +end +function CSAR:_PopSmokeForGroup(_woundedGroupName,_woundedLeader) +self:T(self.lid.." _PopSmokeForGroup") +local _lastSmoke=self.smokeMarkers[_woundedGroupName] +if _lastSmoke==nil or timer.getTime()>_lastSmoke then +local _smokecolor=self.smokecolor +local _smokecoord=_woundedLeader:GetCoordinate():Translate(6,math.random(1,360)) +_smokecoord:Smoke(_smokecolor) +self.smokeMarkers[_woundedGroupName]=timer.getTime()+300 +end +return self +end +function CSAR:_PickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) +self:T(self.lid.." _PickupUnit") +local _heliName=_heliUnit:GetName() +local _groups=self.inTransitGroups[_heliName] +local _unitsInHelicopter=self:_PilotsOnboard(_heliName) +if not _groups then +self.inTransitGroups[_heliName]={} +_groups=self.inTransitGroups[_heliName] +end +local _maxUnits=self.AircraftType[_heliUnit:GetTypeName()] +if _maxUnits==nil then +_maxUnits=self.max_units +end +if _unitsInHelicopter+1>_maxUnits then +self:_DisplayMessageToSAR(_heliUnit,string.format("%s, %s. We\'re already crammed with %d guys! Sorry!",_pilotName,self:_GetCustomCallSign(_heliName),_unitsInHelicopter,_unitsInHelicopter),self.messageTime,false,false,true) +return self +end +local found,downedgrouptable=self:_CheckNameInDownedPilots(_woundedGroupName) +local grouptable=downedgrouptable +self.inTransitGroups[_heliName][_woundedGroupName]= +{ +originalUnit=grouptable.originalUnit, +woundedGroup=_woundedGroupName, +side=self.coalition, +desc=grouptable.desc, +player=grouptable.player, +} +_woundedGroup:Destroy(false) +self:_RemoveNameFromDownedPilots(_woundedGroupName,true) +self:_DisplayMessageToSAR(_heliUnit,string.format("%s: %s I\'m in! Get to the MASH ASAP! ",self:_GetCustomCallSign(_heliName),_pilotName),self.messageTime,true,true) +self:_UpdateUnitCargoMass(_heliName) +self:__Boarded(5,_heliName,_woundedGroupName,grouptable.desc) +return self +end +function CSAR:_UpdateUnitCargoMass(_heliName) +self:T(self.lid.." _UpdateUnitCargoMass") +local calculatedMass=self:_PilotsOnboard(_heliName)*(self.PilotWeight or 80) +local Unit=UNIT:FindByName(_heliName) +if Unit then +Unit:SetUnitInternalCargo(calculatedMass) +end +return self +end +function CSAR:_OrderGroupToMoveToPoint(_leader,_destination) +self:T(self.lid.." _OrderGroupToMoveToPoint") +local group=_leader +local coordinate=_destination:GetVec2() +group:SetAIOn() +group:RouteToVec2(coordinate,5) +return self +end +function CSAR:_IsLoadingDoorOpen(unit_name) +self:T(self.lid.." _IsLoadingDoorOpen") +return UTILS.IsLoadingDoorOpen(unit_name) +end +function CSAR:_CheckCloseWoundedGroup(_distance,_heliUnit,_heliName,_woundedGroup,_woundedGroupName) +self:T(self.lid.." _CheckCloseWoundedGroup") +local _woundedLeader=_woundedGroup +local _lookupKeyHeli=_heliUnit:GetName().."_".._woundedGroupName +local _found,_pilotable=self:_CheckNameInDownedPilots(_woundedGroupName) +local _pilotName=_pilotable.desc +local _reset=true +if(_distance<500)then +self:T(self.lid.."[Pickup Debug] Helo closer than 500m: ".._lookupKeyHeli) +if self.heliCloseMessage[_lookupKeyHeli]==nil then +if self.autosmoke==true then +self:_DisplayMessageToSAR(_heliUnit,string.format("%s: %s. You\'re close now! Land or hover at the smoke.",self:_GetCustomCallSign(_heliName),_pilotName),self.messageTime,false,true) +else +self:_DisplayMessageToSAR(_heliUnit,string.format("%s: %s. You\'re close now! Land in a safe place, I will go there ",self:_GetCustomCallSign(_heliName),_pilotName),self.messageTime,false,true) +end +self.heliCloseMessage[_lookupKeyHeli]=true +end +self:T(self.lid.."[Pickup Debug] Checking landed vs Hover for ".._lookupKeyHeli) +if not _heliUnit:InAir()then +self:T(self.lid.."[Pickup Debug] Helo landed: ".._lookupKeyHeli) +if self.pilotRuntoExtractPoint==true then +if(_distance<self.extractDistance)then +local _time=self.landedStatus[_lookupKeyHeli] +self:T(self.lid.."[Pickup Debug] Check pilot running or arrived ".._lookupKeyHeli) +if _time==nil then +self:T(self.lid.."[Pickup Debug] Pilot running not arrived yet ".._lookupKeyHeli) +self.landedStatus[_lookupKeyHeli]=math.floor((_distance-self.loadDistance)/3.6) +_time=self.landedStatus[_lookupKeyHeli] +_woundedGroup:OptionAlarmStateGreen() +self:_OrderGroupToMoveToPoint(_woundedGroup,_heliUnit:GetCoordinate()) +self:_DisplayMessageToSAR(_heliUnit,"Wait till ".._pilotName.." gets in. \nETA ".._time.." more seconds.",self.messageTime,false) +else +_time=self.landedStatus[_lookupKeyHeli]-10 +self.landedStatus[_lookupKeyHeli]=_time +end +self:T(self.lid.."[Pickup Debug] Pilot close enough? ".._lookupKeyHeli) +if _distance<self.loadDistance+5 or _distance<=13 then +self:T(self.lid.."[Pickup Debug] Pilot close enough - YES ".._lookupKeyHeli) +if self.pilotmustopendoors and(self:_IsLoadingDoorOpen(_heliName)==false)then +self:_DisplayMessageToSAR(_heliUnit,"Open the door to let me in!",self.messageTime,true,true) +self:T(self.lid.."[Pickup Debug] Door closed, try again next loop ".._lookupKeyHeli) +return false +else +self:T(self.lid.."[Pickup Debug] Pick up Pilot ".._lookupKeyHeli) +self.landedStatus[_lookupKeyHeli]=nil +self:_PickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) +return true +end +end +end +else +self:T(self.lid.."[Pickup Debug] Helo landed, pilot NOT set to run to helo ".._lookupKeyHeli) +if(_distance<self.loadDistance)then +self:T(self.lid.."[Pickup Debug] Helo close enough, door check ".._lookupKeyHeli) +if self.pilotmustopendoors and(self:_IsLoadingDoorOpen(_heliName)==false)then +self:T(self.lid.."[Pickup Debug] Door closed, try again next loop ".._lookupKeyHeli) +self:_DisplayMessageToSAR(_heliUnit,"Open the door to let me in!",self.messageTime,true,true) +return false +else +self:T(self.lid.."[Pickup Debug] Pick up Pilot ".._lookupKeyHeli) +self:_PickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) +return true +end +end +end +else +self:T(self.lid.."[Pickup Debug] Helo hovering".._lookupKeyHeli) +local _unitsInHelicopter=self:_PilotsOnboard(_heliName) +local _maxUnits=self.AircraftType[_heliUnit:GetTypeName()] +if _maxUnits==nil then +_maxUnits=self.max_units +end +self:T(self.lid.."[Pickup Debug] Check capacity and close enough for winching ".._lookupKeyHeli) +if _heliUnit:InAir()and _unitsInHelicopter+1<=_maxUnits then +if _distance<self.rescuehoverdistance then +self:T(self.lid.."[Pickup Debug] Helo hovering close enough ".._lookupKeyHeli) +local leaderheight=_woundedLeader:GetHeight() +if leaderheight<0 then leaderheight=0 end +local _height=_heliUnit:GetHeight()-leaderheight +if _height<=self.rescuehoverheight then +self:T(self.lid.."[Pickup Debug] Helo hovering low enough ".._lookupKeyHeli) +local _time=self.hoverStatus[_lookupKeyHeli] +if _time==nil then +self.hoverStatus[_lookupKeyHeli]=10 +_time=10 +else +_time=self.hoverStatus[_lookupKeyHeli]-10 +self.hoverStatus[_lookupKeyHeli]=_time +end +self:T(self.lid.."[Pickup Debug] Check hover timer ".._lookupKeyHeli) +if _time>0 then +self:T(self.lid.."[Pickup Debug] Helo hovering not long enough ".._lookupKeyHeli) +self:_DisplayMessageToSAR(_heliUnit,"Hovering above ".._pilotName..". \n\nHold hover for ".._time.." seconds to winch them up. \n\nIf the countdown stops you\'re too far away!",self.messageTime,true) +else +self:T(self.lid.."[Pickup Debug] Helo hovering long enough - door check ".._lookupKeyHeli) +if self.pilotmustopendoors and(self:_IsLoadingDoorOpen(_heliName)==false)then +self:_DisplayMessageToSAR(_heliUnit,"Open the door to let me in!",self.messageTime,true,true) +self:T(self.lid.."[Pickup Debug] Door closed, try again next loop ".._lookupKeyHeli) +return false +else +self.hoverStatus[_lookupKeyHeli]=nil +self:_PickupUnit(_heliUnit,_pilotName,_woundedGroup,_woundedGroupName) +self:T(self.lid.."[Pickup Debug] Pilot picked up ".._lookupKeyHeli) +return true +end +end +_reset=false +else +self:T(self.lid.."[Pickup Debug] Helo hovering too high ".._lookupKeyHeli) +self:_DisplayMessageToSAR(_heliUnit,"Too high to winch ".._pilotName.." \nReduce height and hover for 10 seconds!",self.messageTime,true,true) +self:T(self.lid.."[Pickup Debug] Hovering too high, try again next loop ".._lookupKeyHeli) +return false +end +end +end +end +end +if _reset then +self.hoverStatus[_lookupKeyHeli]=nil +end +if _distance<500 then +return true +else +return false +end +end +function CSAR:_ScheduledSARFlight(heliname,groupname,isairport,noreschedule,IsHeloBase) +self:T(self.lid.." _ScheduledSARFlight") +self:T({heliname,groupname}) +local _heliUnit=self:_GetSARHeli(heliname) +local _woundedGroupName=groupname +if(_heliUnit==nil)then +self.inTransitGroups[heliname]=nil +return +end +if self.inTransitGroups[heliname]==nil or self.inTransitGroups[heliname][_woundedGroupName]==nil then +return +end +local _dist=self:_GetClosestMASH(_heliUnit) +if _dist==-1 then +self:T(self.lid.."[Drop off debug] Check distance to MASH for "..heliname.." Distance can not be determined!") +return +end +self:T(self.lid.."[Drop off debug] Check distance to MASH for "..heliname.." Distance km: "..math.floor(_dist/1000)) +if(_dist<self.FARPRescueDistance or isairport)and((_heliUnit:InAir()==false)or(IsHeloBase==true))then +self:T(self.lid.."[Drop off debug] Distance ok, door check") +if self.pilotmustopendoors and self:_IsLoadingDoorOpen(heliname)==false then +self:_DisplayMessageToSAR(_heliUnit,"Open the door to let me out!",self.messageTime,true,true) +self:T(self.lid.."[Drop off debug] Door closed, try again next loop") +else +self:T(self.lid.."[Drop off debug] Rescued!") +self:_RescuePilots(_heliUnit) +return +end +end +if not noreschedule then +self:__Returning(5,heliname,_woundedGroupName,isairport) +self:ScheduleOnce(5,self._ScheduledSARFlight,self,heliname,groupname,isairport,noreschedule,IsHeloBase) +end +return self +end +function CSAR:_RescuePilots(_heliUnit) +self:T(self.lid.." _RescuePilots") +local _heliName=_heliUnit:GetName() +local _rescuedGroups=self.inTransitGroups[_heliName] +if _rescuedGroups==nil then +return +end +local PilotsSaved=self:_PilotsOnboard(_heliName) +self.inTransitGroups[_heliName]=nil +local _txt=string.format("%s: The %d pilot(s) have been taken to the\nmedical clinic. Good job!",self:_GetCustomCallSign(_heliName),PilotsSaved) +self:_DisplayMessageToSAR(_heliUnit,_txt,self.messageTime) +self:_UpdateUnitCargoMass(_heliName) +self:__Rescued(-1,_heliUnit,_heliName,PilotsSaved) +return self +end +function CSAR:_GetSARHeli(_unitName) +self:T(self.lid.." _GetSARHeli") +local unit=UNIT:FindByName(_unitName) +if unit and unit:IsAlive()then +return unit +else +return nil +end +end +function CSAR:_DisplayMessageToSAR(_unit,_text,_time,_clear,_speak,_override) +self:T(self.lid.." _DisplayMessageToSAR") +local group=_unit:GetGroup() +local _clear=_clear or nil +local _time=_time or self.messageTime +if _override or not self.suppressmessages then +local m=MESSAGE:New(_text,_time,"CSAR",_clear):ToGroup(group) +end +if _speak and self.useSRS then +local coord=_unit:GetCoordinate() +if coord then +self.msrs:SetCoordinate(coord) +end +_text=string.gsub(_text,"km"," kilometer") +_text=string.gsub(_text,"nm"," nautical miles") +self.SRSQueue:NewTransmission(_text,duration,self.msrs,tstart,2,subgroups,subtitle,subduration,self.SRSchannel,self.SRSModulation,gender,culture,self.SRSVoice,volume,label,coord) +end +return self +end +function CSAR:_GetPositionOfWounded(_woundedGroup,_Unit) +self:T(self.lid.." _GetPositionOfWounded") +local _coordinate=_woundedGroup:GetCoordinate() +local _coordinatesText="None" +if _coordinate then +if self.coordtype==0 then +_coordinatesText=_coordinate:ToStringLLDDM() +elseif self.coordtype==1 then +_coordinatesText=_coordinate:ToStringLLDMS() +elseif self.coordtype==2 then +_coordinatesText=_coordinate:ToStringMGRS() +else +_coordinatesText=_coordinate:ToStringBULLS(self.coalition) +end +end +if _Unit and _Unit:GetPlayerName()then +local playername=_Unit:GetPlayerName() +if playername then +local settings=_DATABASE:GetPlayerSettings(playername)or _SETTINGS +if settings then +self:T("Get Settings ok!") +if settings:IsA2G_MGRS()then +_coordinatesText=_coordinate:ToStringMGRS(settings) +elseif settings:IsA2G_LL_DMS()then +_coordinatesText=_coordinate:ToStringLLDMS(settings) +elseif settings:IsA2G_LL_DDM()then +_coordinatesText=_coordinate:ToStringLLDDM(settings) +elseif settings:IsA2G_BR()then +local startcoordinate=_Unit:GetCoordinate() +_coordinatesText=_coordinate:ToStringBR(startcoordinate,settings) +end +end +end +end +return _coordinatesText +end +function CSAR:_DisplayActiveSAR(_unitName) +self:T(self.lid.." _DisplayActiveSAR") +local _msg="Active MEDEVAC/SAR:" +local _heli=self:_GetSARHeli(_unitName) +if _heli==nil then +return +end +local _heliSide=self.coalition +local _csarList={} +local _DownedPilotTable=self.downedPilots +self:T({Table=_DownedPilotTable}) +for _,_value in pairs(_DownedPilotTable)do +local _groupName=_value.name +self:T(string.format("Display Active Pilot: %s",tostring(_groupName))) +self:T({Table=_value}) +local _woundedGroup=_value.group +if _woundedGroup and _value.alive then +local _coordinatesText=self:_GetPositionOfWounded(_woundedGroup,_heli) +local _helicoord=_heli:GetCoordinate() +local _woundcoord=_woundedGroup:GetCoordinate() +local _distance=self:_GetDistance(_helicoord,_woundcoord) +self:T({_distance=_distance}) +local distancetext="" +local settings=_SETTINGS +if _heli:GetPlayerName()then +settings=_DATABASE:GetPlayerSettings(_heli:GetPlayerName())or _SETTINGS +end +if settings:IsImperial()then +distancetext=string.format("%.1fnm",UTILS.MetersToNM(_distance)) +else +distancetext=string.format("%.1fkm",_distance/1000.0) +end +if _value.frequency==0 or self.CreateRadioBeacons==false then +table.insert(_csarList,{dist=_distance,msg=string.format("%s at %s - %s ",_value.desc,_coordinatesText,distancetext)}) +else +table.insert(_csarList,{dist=_distance,msg=string.format("%s at %s - %.2f KHz ADF - %s ",_value.desc,_coordinatesText,_value.frequency/1000,distancetext)}) +end +end +end +local function sortDistance(a,b) +return a.dist<b.dist +end +table.sort(_csarList,sortDistance) +for _,_line in pairs(_csarList)do +_msg=_msg.."\n".._line.msg +end +self:_DisplayMessageToSAR(_heli,_msg,self.messageTime*2,false,false,true) +return self +end +function CSAR:_GetClosestDownedPilot(_heli) +self:T(self.lid.." _GetClosestDownedPilot") +local _side=self.coalition +local _closestGroup=nil +local _shortestDistance=-1 +local _distance=0 +local _closestGroupInfo=nil +local _heliCoord=_heli:GetCoordinate()or _heli:GetCoordinate() +if _heliCoord==nil then +self:E("****Error obtaining coordinate!") +return nil +end +local DownedPilotsTable=self.downedPilots +for _,_groupInfo in UTILS.spairs(DownedPilotsTable)do +local _woundedName=_groupInfo.name +local _tempWounded=_groupInfo.group +if _tempWounded then +local _tempCoord=_tempWounded:GetCoordinate() +_distance=self:_GetDistance(_heliCoord,_tempCoord) +if _distance~=nil and(_shortestDistance==-1 or _distance<_shortestDistance)then +_shortestDistance=_distance +_closestGroup=_tempWounded +_closestGroupInfo=_groupInfo +end +end +end +return{pilot=_closestGroup,distance=_shortestDistance,groupInfo=_closestGroupInfo} +end +function CSAR:_SignalFlare(_unitName) +self:T(self.lid.." _SignalFlare") +local _heli=self:_GetSARHeli(_unitName) +if _heli==nil then +return +end +local _closest=self:_GetClosestDownedPilot(_heli) +local smokedist=8000 +if self.approachdist_far>smokedist then smokedist=self.approachdist_far end +if _closest~=nil and _closest.pilot~=nil and _closest.distance>0 and _closest.distance<smokedist then +local _clockDir=self:_GetClockDirection(_heli,_closest.pilot) +local _distance="" +if _SETTINGS:IsImperial()then +_distance=string.format("%.1fnm",UTILS.MetersToNM(_closest.distance)) +else +_distance=string.format("%.1fkm",_closest.distance/1000) +end +local _msg=string.format("%s - Firing signal flare at your %s o\'clock. Distance %s",self:_GetCustomCallSign(_unitName),_clockDir,_distance) +self:_DisplayMessageToSAR(_heli,_msg,self.messageTime,false,true,true) +local _coord=_closest.pilot:GetCoordinate() +_coord:FlareRed(_clockDir) +else +local _distance=smokedist +local dtext="" +if _SETTINGS:IsImperial()then +dtext=string.format("%.1fnm",UTILS.MetersToNM(smokedist)) +else +dtext=string.format("%.1fkm",smokedist/1000) +end +self:_DisplayMessageToSAR(_heli,string.format("No Pilots within %s",dtext),self.messageTime,false,false,true) +end +return self +end +function CSAR:_DisplayToAllSAR(_message,_side,_messagetime,ToSRS,ToScreen) +self:T(self.lid.." _DisplayToAllSAR") +local messagetime=_messagetime or self.messageTime +self:T({_message,ToSRS=ToSRS,ToScreen=ToScreen}) +if self.msrs and(ToSRS==true or ToSRS==nil)then +local voice=self.CSARVoice or MSRS.Voices.Google.Standard.en_GB_Standard_F +if self.msrs:GetProvider()==MSRS.Provider.WINDOWS then +voice=self.CSARVoiceMS or MSRS.Voices.Microsoft.Hedda +end +self.SRSQueue:NewTransmission(_message,duration,self.msrs,tstart,2,subgroups,subtitle,subduration,self.SRSchannel,self.SRSModulation,gender,culture,voice,volume,label,self.coordinate) +end +if ToScreen==true or ToScreen==nil then +for _,_unitName in pairs(self.csarUnits)do +local _unit=self:_GetSARHeli(_unitName) +if _unit and not self.suppressmessages then +self:_DisplayMessageToSAR(_unit,_message,_messagetime) +end +end +end +return self +end +function CSAR:_ReqIRStrobe(_unitName) +self:T(self.lid.." _ReqIRStrobe") +local _heli=self:_GetSARHeli(_unitName) +if _heli==nil then +return +end +local smokedist=8000 +if smokedist<self.approachdist_far then smokedist=self.approachdist_far end +local _closest=self:_GetClosestDownedPilot(_heli) +if _closest~=nil and _closest.pilot~=nil and _closest.distance>0 and _closest.distance<smokedist then +local _clockDir=self:_GetClockDirection(_heli,_closest.pilot) +local _distance=string.format("%.1fkm",_closest.distance/1000) +if _SETTINGS:IsImperial()then +_distance=string.format("%.1fnm",UTILS.MetersToNM(_closest.distance)) +else +_distance=string.format("%.1fkm",_closest.distance/1000) +end +local _msg=string.format("%s - IR Strobe active at your %s o\'clock. Distance %s",self:_GetCustomCallSign(_unitName),_clockDir,_distance) +self:_DisplayMessageToSAR(_heli,_msg,self.messageTime,false,true,true) +_closest.pilot:NewIRMarker(true,self.IRStrobeRuntime or 300) +else +local _distance=string.format("%.1fkm",smokedist/1000) +if _SETTINGS:IsImperial()then +_distance=string.format("%.1fnm",UTILS.MetersToNM(smokedist)) +else +_distance=string.format("%.1fkm",smokedist/1000) +end +self:_DisplayMessageToSAR(_heli,string.format("No Pilots within %s",_distance),self.messageTime,false,false,true) +end +return self +end +function CSAR:_Reqsmoke(_unitName) +self:T(self.lid.." _Reqsmoke") +local _heli=self:_GetSARHeli(_unitName) +if _heli==nil then +return +end +local smokedist=8000 +if smokedist<self.approachdist_far then smokedist=self.approachdist_far end +local _closest=self:_GetClosestDownedPilot(_heli) +if _closest~=nil and _closest.pilot~=nil and _closest.distance>0 and _closest.distance<smokedist then +local _clockDir=self:_GetClockDirection(_heli,_closest.pilot) +local _distance=string.format("%.1fkm",_closest.distance/1000) +if _SETTINGS:IsImperial()then +_distance=string.format("%.1fnm",UTILS.MetersToNM(_closest.distance)) +else +_distance=string.format("%.1fkm",_closest.distance/1000) +end +local _msg=string.format("%s - Popping smoke at your %s o\'clock. Distance %s",self:_GetCustomCallSign(_unitName),_clockDir,_distance) +self:_DisplayMessageToSAR(_heli,_msg,self.messageTime,false,true,true) +local _coord=_closest.pilot:GetCoordinate() +local color=self.smokecolor +_coord:Smoke(color) +else +local _distance=string.format("%.1fkm",smokedist/1000) +if _SETTINGS:IsImperial()then +_distance=string.format("%.1fnm",UTILS.MetersToNM(smokedist)) +else +_distance=string.format("%.1fkm",smokedist/1000) +end +self:_DisplayMessageToSAR(_heli,string.format("No Pilots within %s",_distance),self.messageTime,false,false,true) +end +return self +end +function CSAR:_GetClosestMASH(_heli) +self:T(self.lid.." _GetClosestMASH") +local _mashset=self.mash +local MashSets={} +table.insert(MashSets,_mashset.Set) +table.insert(MashSets,self.zonemashes.Set) +table.insert(MashSets,self.staticmashes.Set) +local _shortestDistance=-1 +local _distance=0 +local _helicoord=_heli:GetCoordinate() +local MashName=nil +if self.allowFARPRescue then +local position=_heli:GetCoordinate() +local afb,distance=position:GetClosestAirbase(nil,self.coalition) +_shortestDistance=distance +MashName=(afb~=nil)and afb:GetName()or"Unknown" +end +for _,_mashes in pairs(MashSets)do +for _,_mashUnit in pairs(_mashes or{})do +local _mashcoord +if _mashUnit and(not _mashUnit:IsInstanceOf("ZONE_BASE"))and _mashUnit:IsAlive()then +_mashcoord=_mashUnit:GetCoordinate() +elseif _mashUnit and _mashUnit:IsInstanceOf("ZONE_BASE")then +_mashcoord=_mashUnit:GetCoordinate() +end +_distance=self:_GetDistance(_helicoord,_mashcoord) +if _distance~=nil and(_shortestDistance==-1 or _distance<_shortestDistance)then +_shortestDistance=_distance +MashName=_mashUnit:GetName()or"Unknown" +end +end +end +if _shortestDistance~=-1 then +return _shortestDistance,MashName +else +return-1 +end +end +function CSAR:_CheckOnboard(_unitName) +self:T(self.lid.." _CheckOnboard") +local _unit=self:_GetSARHeli(_unitName) +if _unit==nil then +return +end +local _inTransit=self.inTransitGroups[_unitName] +if _inTransit==nil then +self:_DisplayMessageToSAR(_unit,"No Rescued Pilots onboard",self.messageTime,false,false,true) +else +local _text="Onboard - RTB to FARP/Airfield or MASH: " +for _,_onboard in pairs(self.inTransitGroups[_unitName])do +_text=_text.."\n".._onboard.desc +end +self:_DisplayMessageToSAR(_unit,_text,self.messageTime*2,false,false,true) +end +return self +end +function CSAR:_AddMedevacMenuItem() +self:T(self.lid.." _AddMedevacMenuItem") +local coalition=self.coalition +local allheligroupset=self.allheligroupset +local _allHeliGroups=allheligroupset:GetSetObjects() +local _UnitList={} +for _key,_group in pairs(_allHeliGroups)do +local _unit=_group:GetFirstUnitAlive() +if _unit then +if _unit:IsAlive()and _unit:IsPlayer()then +local unitName=_unit:GetName() +_UnitList[unitName]=unitName +end +end +end +self.csarUnits=_UnitList +for _,_unitName in pairs(self.csarUnits)do +local _unit=self:_GetSARHeli(_unitName) +if _unit then +local _group=_unit:GetGroup() +if _group then +local groupname=_group:GetName() +if self.addedTo[groupname]==nil then +self.addedTo[groupname]=true +local menuname=self.topmenuname or"CSAR" +local _rootPath=MENU_GROUP:New(_group,menuname) +local _rootMenu1=MENU_GROUP_COMMAND:New(_group,"List Active CSAR",_rootPath,self._DisplayActiveSAR,self,_unitName) +local _rootMenu2=MENU_GROUP_COMMAND:New(_group,"Check Onboard",_rootPath,self._CheckOnboard,self,_unitName) +local _rootMenu3=MENU_GROUP_COMMAND:New(_group,"Request Signal Flare",_rootPath,self._SignalFlare,self,_unitName) +local _rootMenu4=MENU_GROUP_COMMAND:New(_group,"Request Smoke",_rootPath,self._Reqsmoke,self,_unitName) +if self.AllowIRStrobe then +local _rootMenu5=MENU_GROUP_COMMAND:New(_group,"Request IR Strobe",_rootPath,self._ReqIRStrobe,self,_unitName):Refresh() +else +_rootMenu4:Refresh() +end +end +end +end +end +return self +end +function CSAR:_GetDistance(_point1,_point2) +self:T(self.lid.." _GetDistance") +if _point1 and _point2 then +local distance1=_point1:Get2DDistance(_point2) +local distance2=_point1:DistanceFromPointVec2(_point2) +if distance1 and type(distance1)=="number"then +return distance1 +elseif distance2 and type(distance2)=="number"then +return distance2 +else +self:E("*****Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +else +self:E("******Cannot calculate distance!") +self:E({_point1,_point2}) +return-1 +end +end +function CSAR:_GenerateVHFrequencies() +self:T(self.lid.." _GenerateVHFrequencies") +local FreeVHFFrequencies={} +FreeVHFFrequencies=UTILS.GenerateVHFrequencies() +self.FreeVHFFrequencies=FreeVHFFrequencies +return self +end +function CSAR:_GenerateADFFrequency() +self:T(self.lid.." _GenerateADFFrequency") +if#self.FreeVHFFrequencies<=3 then +self.FreeVHFFrequencies=self.UsedVHFFrequencies +self.UsedVHFFrequencies={} +end +local _vhf=table.remove(self.FreeVHFFrequencies,math.random(#self.FreeVHFFrequencies)) +return _vhf +end +function CSAR:_GetClockDirection(_heli,_group) +self:T(self.lid.." _GetClockDirection") +local _playerPosition=_heli:GetCoordinate() +local _targetpostions=_group:GetCoordinate() +local _heading=_heli:GetHeading() +local DirectionVec3=_playerPosition:GetDirectionVec3(_targetpostions) +local Angle=_playerPosition:GetAngleDegrees(DirectionVec3) +self:T(self.lid.." _GetClockDirection"..tostring(Angle).." "..tostring(_heading)) +local hours=0 +local clock=12 +if _heading and Angle then +clock=12 +clock=_heading-Angle +hours=(clock/30)*-1 +clock=12+hours +clock=UTILS.Round(clock,0) +if clock>12 then clock=clock-12 end +end +return clock +end +function CSAR:_AddBeaconToGroup(_group,_freq,BeaconName) +self:T(self.lid.." _AddBeaconToGroup") +if self.CreateRadioBeacons==false then return end +local _group=_group +if _group==nil then +for _i,_current in ipairs(self.UsedVHFFrequencies)do +if _current==_freq then +table.insert(self.FreeVHFFrequencies,_freq) +table.remove(self.UsedVHFFrequencies,_i) +end +end +return +end +if _group:IsAlive()then +local _radioUnit=_group:GetUnit(1) +if _radioUnit then +local name=_radioUnit:GetName() +local Frequency=_freq +local Sound="l10n/DEFAULT/"..self.radioSound +local vec3=_radioUnit:GetVec3()or _radioUnit:GetPositionVec3()or{x=0,y=0,z=0} +self:I(self.lid..string.format("Added Radio Beacon %d Hertz | Name %s | Position {%d,%d,%d}",Frequency,BeaconName,vec3.x,vec3.y,vec3.z)) +trigger.action.radioTransmission(Sound,vec3,0,true,Frequency,self.ADFRadioPwr or 500,BeaconName) +end +end +return self +end +function CSAR:_RefreshRadioBeacons() +self:T(self.lid.." _RefreshRadioBeacons") +if self.CreateRadioBeacons==false then return end +if self:_CountActiveDownedPilots()>0 then +local PilotTable=self.downedPilots +for _,_pilot in pairs(PilotTable)do +self:T({_pilot.name}) +local pilot=_pilot +local group=pilot.group +local frequency=pilot.frequency or 0 +local bname=pilot.BeaconName or pilot.name..math.random(1,100000) +if group and group:IsAlive()and frequency>0 then +else +if frequency>0 then +trigger.action.stopRadioTransmission(bname) +end +end +end +end +return self +end +function CSAR:_CountActiveDownedPilots() +self:T(self.lid.." _CountActiveDownedPilots") +local PilotsInFieldN=0 +for _,_unitName in pairs(self.downedPilots)do +self:T({_unitName.desc}) +if _unitName.alive==true then +PilotsInFieldN=PilotsInFieldN+1 +end +end +return PilotsInFieldN +end +function CSAR:_ReachedPilotLimit() +self:T(self.lid.." _ReachedPilotLimit") +local limit=self.maxdownedpilots +local islimited=self.limitmaxdownedpilots +local count=self:_CountActiveDownedPilots() +if islimited and(count>=limit)then +if self.useFIFOLimitReplacement then +local oldIndex=-1 +local oldDownedPilot=nil +for _index,_downedpilot in pairs(self.downedPilots)do +oldIndex=_index +oldDownedPilot=_downedpilot +break +end +if oldDownedPilot then +oldDownedPilot.group:Destroy(false) +oldDownedPilot.alive=false +self:_CheckDownedPilotTable() +return false +end +end +return true +else +return false +end +end +function CSAR:SetOwnSetPilotGroups(Set) +self.UserSetGroup=Set +return self +end +function CSAR:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:I(self.lid.."Started ("..self.version..")") +self:HandleEvent(EVENTS.Takeoff,self._EventHandler) +self:HandleEvent(EVENTS.Land,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.LandingAfterEjection,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +if self.UserSetGroup then +self.allheligroupset=self.UserSetGroup +elseif self.allowbronco then +local prefixes=self.csarPrefix or{} +self.allheligroupset=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(prefixes):FilterStart() +elseif self.useprefix then +local prefixes=self.csarPrefix or{} +self.allheligroupset=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(prefixes):FilterCategoryHelicopter():FilterStart() +else +self.allheligroupset=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterCategoryHelicopter():FilterStart() +end +self.mash=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart() +self.staticmashes=SET_STATIC:New():FilterCoalitions(self.coalitiontxt):FilterPrefixes(self.mashprefix):FilterStart() +self.zonemashes=SET_ZONE:New():FilterPrefixes(self.mashprefix):FilterStart() +if not self.coordinate then +local csarhq=self.mash:GetRandom() +if csarhq then +self.coordinate=csarhq:GetCoordinate() +end +end +if self.wetfeettemplate then +self.usewetfeet=true +end +if self.useSRS then +local path=self.SRSPath +local modulation=self.SRSModulation +local channel=self.SRSchannel +self.msrs=MSRS:New(path,channel,modulation) +self.msrs:SetPort(self.SRSport) +self.msrs:SetLabel("CSAR") +self.msrs:SetCulture(self.SRSCulture) +self.msrs:SetCoalition(self.coalition) +self.msrs:SetVoice(self.SRSVoice) +self.msrs:SetGender(self.SRSGender) +if self.SRSGPathToCredentials then +self.msrs:SetProviderOptionsGoogle(self.SRSGPathToCredentials,self.SRSGPathToCredentials) +self.msrs:SetProvider(MSRS.Provider.GOOGLE) +end +self.msrs:SetVolume(self.SRSVolume) +self.msrs:SetLabel("CSAR") +self.SRSQueue=MSRSQUEUE:New("CSAR") +end +self:__Status(-10) +if self.enableLoadSave then +local interval=self.saveinterval +local filename=self.filename +local filepath=self.filepath +self:__Save(interval,filepath,filename) +end +return self +end +function CSAR:_CheckDownedPilotTable() +local pilots=self.downedPilots +local npilots={} +for _ind,_entry in pairs(pilots)do +local _group=_entry.group +if _group:IsAlive()then +npilots[_ind]=_entry +else +if _entry.alive then +self:__KIA(1,_entry.desc) +end +end +end +self.downedPilots=npilots +return self +end +function CSAR:onbeforeStatus(From,Event,To) +self:T({From,Event,To}) +self:_AddMedevacMenuItem() +if not self.BeaconTimer or(self.BeaconTimer and not self.BeaconTimer:IsRunning())then +self.BeaconTimer=TIMER:New(self._RefreshRadioBeacons,self) +self.BeaconTimer:Start(2,self.beaconRefresher) +end +self:_CheckDownedPilotTable() +for _,_sar in pairs(self.csarUnits)do +local PilotTable=self.downedPilots +for _,_entry in pairs(PilotTable)do +if _entry.alive then +local entry=_entry +local name=entry.name +local timestamp=entry.timestamp or 0 +local now=timer.getAbsTime() +if now-timestamp>17 then +self:_CheckWoundedGroupStatus(_sar,name) +end +end +end +end +return self +end +function CSAR:onafterStatus(From,Event,To) +self:T({From,Event,To}) +local NumberOfSARPilots=0 +for _,_unitName in pairs(self.csarUnits)do +NumberOfSARPilots=NumberOfSARPilots+1 +end +local PilotsInFieldN=self:_CountActiveDownedPilots() +local PilotsBoarded=0 +for _,_unitName in pairs(self.inTransitGroups)do +for _,_units in pairs(_unitName)do +PilotsBoarded=PilotsBoarded+1 +end +end +if self.verbose>0 then +local text=string.format("%s Active SAR: %d | Downed Pilots in field: %d (max %d) | Pilots boarded: %d | Landings: %d | Pilots rescued: %d", +self.lid,NumberOfSARPilots,PilotsInFieldN,self.maxdownedpilots,PilotsBoarded,self.rescues,self.rescuedpilots) +self:T(text) +if self.verbose<2 then +self:I(text) +elseif self.verbose>1 then +self:I(text) +local m=MESSAGE:New(text,"10","Status",true):ToCoalition(self.coalition) +end +end +self:__Status(-20) +return self +end +function CSAR:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.LandingAfterEjection) +self:UnHandleEvent(EVENTS.PlayerEnterUnit) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self:UnHandleEvent(EVENTS.PilotDead) +self:T(self.lid.."Stopped.") +return self +end +function CSAR:onbeforeApproach(From,Event,To,Heliname,Woundedgroupname) +self:T({From,Event,To,Heliname,Woundedgroupname}) +self:_CheckWoundedGroupStatus(Heliname,Woundedgroupname) +return self +end +function CSAR:onbeforeBoarded(From,Event,To,Heliname,Woundedgroupname) +self:T({From,Event,To,Heliname,Woundedgroupname}) +self:_ScheduledSARFlight(Heliname,Woundedgroupname) +local Unit=UNIT:FindByName(Heliname) +if Unit and Unit:IsPlayer()and self.PlayerTaskQueue then +local playername=Unit:GetPlayerName() +local dropcoord=Unit:GetCoordinate()or COORDINATE:New(0,0,0) +local dropvec2=dropcoord:GetVec2() +self.PlayerTaskQueue:ForEach( +function(Task) +local task=Task +local subtype=task:GetSubType() +if Event==subtype and not task:IsDone()then +local targetzone=task.Target:GetObject() +if(targetzone and targetzone.ClassName and string.match(targetzone.ClassName,"ZONE")and targetzone:IsVec2InZone(dropvec2)) +or(string.find(task.CSARPilotName,Woundedgroupname))then +if task.Clients:HasUniqueID(playername)then +task:__Success(-1) +end +end +end +end +) +end +return self +end +function CSAR:onbeforeReturning(From,Event,To,Heliname,Woundedgroupname,IsAirPort) +self:T({From,Event,To,Heliname,Woundedgroupname}) +return self +end +function CSAR:onbeforeRescued(From,Event,To,HeliUnit,HeliName,PilotsSaved) +self:T({From,Event,To,HeliName,HeliUnit}) +self.rescues=self.rescues+1 +self.rescuedpilots=self.rescuedpilots+PilotsSaved +local Unit=HeliUnit or UNIT:FindByName(HeliName) +if Unit and Unit:IsPlayer()and self.PlayerTaskQueue then +local playername=Unit:GetPlayerName() +self.PlayerTaskQueue:ForEach( +function(Task) +local task=Task +local subtype=task:GetSubType() +if Event==subtype and not task:IsDone()then +if task.Clients:HasUniqueID(playername)then +task:__Success(-1) +end +end +end +) +end +return self +end +function CSAR:onbeforePilotDown(From,Event,To,Group,Frequency,Leadername,CoordinatesText,Playername) +self:T({From,Event,To,Group,Frequency,Leadername,CoordinatesText,tostring(Playername)}) +return self +end +function CSAR:onbeforeLanded(From,Event,To,HeliName,Airbase) +self:T({From,Event,To,HeliName,Airbase}) +return self +end +function CSAR:onbeforeSave(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +if not io then +self:E(self.lid.."ERROR: io not desanitized. Can't save current state.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. State will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +return true +end +function CSAR:onafterSave(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _savefile(filename,data) +local f=assert(io.open(filename,"wb")) +f:write(data) +f:close() +end +if lfs then +path=self.filepath or lfs.writedir() +end +filename=filename or self.filename +if path~=nil then +filename=path.."\\"..filename +end +local pilots=self.downedPilots +local data="playerName,x,y,z,coalition,country,description,typeName,unitName,freq\n" +local n=0 +for _,_grp in pairs(pilots)do +local DownedPilot=_grp +if DownedPilot and DownedPilot.alive then +local playerName=DownedPilot.player +local group=DownedPilot.group +local coalition=group:GetCoalition() +local country=group:GetCountry() +local description=DownedPilot.desc +local typeName=DownedPilot.typename +local freq=DownedPilot.frequency +local location=group:GetVec3() +local unitName=DownedPilot.originalUnit +local txt=string.format("%s,%d,%d,%d,%s,%s,%s,%s,%s,%d\n",playerName,location.x,location.y,location.z,coalition,country,description,typeName,unitName,freq) +self:I(self.lid.."Saving to CSAR File: "..txt) +data=data..txt +end +end +_savefile(filename,data) +if self.enableLoadSave then +local interval=self.saveinterval +local filename=self.filename +local filepath=self.filepath +self:__Save(interval,filepath,filename) +end +return self +end +function CSAR:onbeforeLoad(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _fileexists(name) +local f=io.open(name,"r") +if f~=nil then +io.close(f) +return true +else +return false +end +end +filename=filename or self.filename +path=path or self.filepath +if not io then +self:E(self.lid.."WARNING: io not desanitized. Cannot load file.") +return false +end +if path==nil and not lfs then +self:E(self.lid.."WARNING: lfs not desanitized. State will be saved in DCS installation root directory rather than your \"Saved Games\\DCS\" folder.") +end +if lfs then +path=path or lfs.writedir() +end +if path~=nil then +filename=path.."\\"..filename +end +local exists=_fileexists(filename) +if exists then +return true +else +self:E(self.lid..string.format("WARNING: State file %s might not exist.",filename)) +return false +end +end +function CSAR:onafterLoad(From,Event,To,path,filename) +self:T({From,Event,To,path,filename}) +if not self.enableLoadSave then +return self +end +local function _loadfile(filename) +local f=assert(io.open(filename,"rb")) +local data=f:read("*all") +f:close() +return data +end +filename=filename or self.filename +path=path or self.filepath +if lfs then +path=path or lfs.writedir() +end +if path~=nil then +filename=path.."\\"..filename +end +local text=string.format("Loading CSAR state from file %s",filename) +MESSAGE:New(text,10):ToAllIf(self.Debug) +self:I(self.lid..text) +local file=assert(io.open(filename,"rb")) +local loadeddata={} +for line in file:lines()do +loadeddata[#loadeddata+1]=line +end +file:close() +table.remove(loadeddata,1) +for _id,_entry in pairs(loadeddata)do +local dataset=UTILS.Split(_entry,",") +local playerName=dataset[1] +local vec3={} +vec3.x=tonumber(dataset[2]) +vec3.y=tonumber(dataset[3]) +vec3.z=tonumber(dataset[4]) +local point=COORDINATE:NewFromVec3(vec3) +local coalition=tonumber(dataset[5]) +local country=tonumber(dataset[6]) +local description=dataset[7] +local typeName=dataset[8] +local unitName=dataset[9] +local freq=tonumber(dataset[10]) +self:_AddCsar(coalition,country,point,typeName,unitName,playerName,freq,false,description,nil) +end +return self +end +AIRWING={ +ClassName="AIRWING", +verbose=0, +lid=nil, +menu=nil, +payloads={}, +payloadcounter=0, +pointsCAP={}, +pointsTANKER={}, +pointsAWACS={}, +pointsRecon={}, +markpoints=false, +capOptionPatrolRaceTrack=false, +capFormation=nil, +capOptionVaryStartTime=nil, +capOptionVaryEndTime=nil, +} +AIRWING.version="0.9.7" +function AIRWING:New(warehousename,airwingname) +local self=BASE:Inherit(self,LEGION:New(warehousename,airwingname)) +if not self then +BASE:E(string.format("ERROR: Could not find warehouse %s!",warehousename)) +return nil +end +self.lid=string.format("AIRWING %s | ",self.alias) +self.nflightsCAP=0 +self.nflightsAWACS=0 +self.nflightsRecon=0 +self.nflightsTANKERboom=0 +self.nflightsTANKERprobe=0 +self.nflightsRecoveryTanker=0 +self.nflightsRescueHelo=0 +self.markpoints=false +self:AddTransition("*","FlightOnMission","*") +return self +end +function AIRWING:AddSquadron(Squadron) +table.insert(self.cohorts,Squadron) +self:AddAssetToSquadron(Squadron,Squadron.Ngroups) +if Squadron.attribute==GROUP.Attribute.AIR_AWACS then +self:NewPayload(Squadron.templategroup,-1,AUFTRAG.Type.AWACS) +elseif Squadron.attribute==GROUP.Attribute.AIR_TANKER then +self:NewPayload(Squadron.templategroup,-1,AUFTRAG.Type.TANKER) +end +self:NewPayload(Squadron.templategroup,-1,AUFTRAG.Type.RELOCATECOHORT,0) +Squadron:SetAirwing(self) +if Squadron:IsStopped()then +Squadron:Start() +end +return self +end +function AIRWING:NewPayload(Unit,Npayloads,MissionTypes,Performance) +Performance=Performance or 50 +if type(Unit)=="string"then +local name=Unit +Unit=UNIT:FindByName(name) +if not Unit then +Unit=GROUP:FindByName(name) +end +end +if Unit then +if Unit:IsInstanceOf("GROUP")then +Unit=Unit:GetUnit(1) +end +if MissionTypes and type(MissionTypes)~="table"then +MissionTypes={MissionTypes} +end +local payload={} +payload.uid=self.payloadcounter +payload.unitname=Unit:GetName() +payload.aircrafttype=Unit:GetTypeName() +payload.pylons=Unit:GetTemplatePayload() +self:SetPayloadAmount(payload,Npayloads) +payload.capabilities={} +for _,missiontype in pairs(MissionTypes)do +local capability={} +capability.MissionType=missiontype +capability.Performance=Performance +table.insert(payload.capabilities,capability) +end +if not AUFTRAG.CheckMissionType(AUFTRAG.Type.ORBIT,MissionTypes)then +local capability={} +capability.MissionType=AUFTRAG.Type.ORBIT +capability.Performance=50 +table.insert(payload.capabilities,capability) +end +if not AUFTRAG.CheckMissionType(AUFTRAG.Type.RELOCATECOHORT,MissionTypes)then +local capability={} +capability.MissionType=AUFTRAG.Type.RELOCATECOHORT +capability.Performance=50 +table.insert(payload.capabilities,capability) +end +self:T(self.lid..string.format("Adding new payload from unit %s for aircraft type %s: ID=%d, N=%d (unlimited=%s), performance=%d, missions: %s", +payload.unitname,payload.aircrafttype,payload.uid,payload.navail,tostring(payload.unlimited),Performance,table.concat(MissionTypes,", "))) +table.insert(self.payloads,payload) +self.payloadcounter=self.payloadcounter+1 +return payload +end +self:E(self.lid.."ERROR: No UNIT found to create PAYLOAD!") +return nil +end +function AIRWING:SetPayloadAmount(Payload,Navailable) +Navailable=Navailable or 99 +if Payload then +Payload.unlimited=Navailable<0 +if Payload.unlimited then +Payload.navail=1 +else +Payload.navail=Navailable +end +end +return self +end +function AIRWING:IncreasePayloadAmount(Payload,N) +N=N or 1 +if Payload and Payload.navail>=0 then +Payload.navail=Payload.navail+N +Payload.navail=math.max(Payload.navail,0) +end +return self +end +function AIRWING:GetPayloadAmount(Payload) +return Payload.navail +end +function AIRWING:GetPayloadCapabilities(Payload) +return Payload.capabilities +end +function AIRWING:AddPayloadCapability(Payload,MissionTypes,Performance) +if MissionTypes and type(MissionTypes)~="table"then +MissionTypes={MissionTypes} +end +Payload.capabilities=Payload.capabilities or{} +for _,missiontype in pairs(MissionTypes)do +local capability={} +capability.MissionType=missiontype +capability.Performance=Performance +table.insert(Payload.capabilities,capability) +end +return self +end +function AIRWING:FetchPayloadFromStock(UnitType,MissionType,Payloads) +if not self.payloads or#self.payloads==0 then +self:T(self.lid.."WARNING: No payloads in stock!") +return nil +end +if self.verbose>=4 then +self:I(self.lid..string.format("Looking for payload for unit type=%s and mission type=%s",UnitType,MissionType)) +for i,_payload in pairs(self.payloads)do +local payload=_payload +local performance=self:GetPayloadPeformance(payload,MissionType) +self:I(self.lid..string.format("[%d] Payload type=%s navail=%d unlimited=%s",i,payload.aircrafttype,payload.navail,tostring(payload.unlimited))) +end +end +local function sortpayloads(a,b) +local pA=a +local pB=b +if a and b then +local performanceA=self:GetPayloadPeformance(a,MissionType) +local performanceB=self:GetPayloadPeformance(b,MissionType) +return(performanceA>performanceB)or(performanceA==performanceB and a.unlimited==true and b.unlimited~=true)or(performanceA==performanceB and a.unlimited==true and b.unlimited==true and a.navail>b.navail) +elseif not a then +self:I(self.lid..string.format("FF ERROR in sortpayloads: a is nil")) +return false +elseif not b then +self:I(self.lid..string.format("FF ERROR in sortpayloads: b is nil")) +return true +else +self:I(self.lid..string.format("FF ERROR in sortpayloads: a and b are nil")) +return false +end +end +local function _checkPayloads(payload) +if Payloads then +for _,Payload in pairs(Payloads)do +if Payload.uid==payload.uid then +return true +end +end +else +return nil +end +return false +end +local payloads={} +for _,_payload in pairs(self.payloads)do +local payload=_payload +local specialpayload=_checkPayloads(payload) +local compatible=AUFTRAG.CheckMissionCapability(MissionType,payload.capabilities) +local goforit=specialpayload or(specialpayload==nil and compatible) +if payload.aircrafttype==UnitType and payload.navail>0 and goforit then +table.insert(payloads,payload) +end +end +if self.verbose>=4 then +self:I(self.lid..string.format("Sorted payloads for mission type %s and aircraft type=%s:",MissionType,UnitType)) +for _,_payload in ipairs(self.payloads)do +local payload=_payload +if payload.aircrafttype==UnitType and AUFTRAG.CheckMissionCapability(MissionType,payload.capabilities)then +local performace=self:GetPayloadPeformance(payload,MissionType) +self:I(self.lid..string.format("- %s payload for %s: avail=%d performace=%d",MissionType,payload.aircrafttype,payload.navail,performace)) +end +end +end +if#payloads==0 then +self:T(self.lid..string.format("WARNING: Could not find a payload for airframe %s mission type %s!",UnitType,MissionType)) +return nil +elseif#payloads==1 then +local payload=payloads[1] +if not payload.unlimited then +payload.navail=payload.navail-1 +end +return payload +else +table.sort(payloads,sortpayloads) +local payload=payloads[1] +if not payload.unlimited then +payload.navail=payload.navail-1 +end +return payload +end +end +function AIRWING:ReturnPayloadFromAsset(asset) +local payload=asset.payload +if payload then +if not payload.unlimited then +payload.navail=payload.navail+1 +end +asset.payload=nil +else +self:E(self.lid.."ERROR: asset had no payload attached!") +end +end +function AIRWING:AddAssetToSquadron(Squadron,Nassets) +if Squadron then +local Group=GROUP:FindByName(Squadron.templatename) +if Group then +local text=string.format("Adding asset %s to squadron %s",Group:GetName(),Squadron.name) +self:T(self.lid..text) +self:AddAsset(Group,Nassets,nil,nil,nil,nil,Squadron.skill,Squadron.livery,Squadron.name) +else +self:E(self.lid.."ERROR: Group does not exist!") +end +else +self:E(self.lid.."ERROR: Squadron does not exit!") +end +return self +end +function AIRWING:GetSquadron(SquadronName) +local squad=self:_GetCohort(SquadronName) +return squad +end +function AIRWING:GetSquadronOfAsset(Asset) +return self:GetSquadron(Asset.squadname) +end +function AIRWING:RemoveAssetFromSquadron(Asset) +local squad=self:GetSquadronOfAsset(Asset) +if squad then +squad:DelAsset(Asset) +end +end +function AIRWING:SetNumberCAP(n) +self.nflightsCAP=n or 1 +return self +end +function AIRWING:SetCAPFormation(Formation) +self.capFormation=Formation +return self +end +function AIRWING:SetCapCloseRaceTrack(OnOff) +self.capOptionPatrolRaceTrack=OnOff +return self +end +function AIRWING:SetCapStartTimeVariation(Start,End) +self.capOptionVaryStartTime=Start or 5 +self.capOptionVaryEndTime=End or 60 +return self +end +function AIRWING:SetNumberTankerBoom(Nboom) +self.nflightsTANKERboom=Nboom or 1 +return self +end +function AIRWING:ShowPatrolPointMarkers(onoff) +if onoff then +self.markpoints=true +else +self.markpoints=false +end +return self +end +function AIRWING:SetNumberTankerProbe(Nprobe) +self.nflightsTANKERprobe=Nprobe or 1 +return self +end +function AIRWING:SetNumberAWACS(n) +self.nflightsAWACS=n or 1 +return self +end +function AIRWING:SetNumberRecon(n) +self.nflightsRecon=n or 1 +return self +end +function AIRWING:SetNumberRescuehelo(n) +self.nflightsRescueHelo=n or 1 +return self +end +function AIRWING:_PatrolPointMarkerText(point) +local text=string.format("%s Occupied=%d, \nheading=%03d, leg=%d NM, alt=%d ft, speed=%d kts", +point.type,point.noccupied,point.heading,point.leg,point.altitude,point.speed) +return text +end +function AIRWING:UpdatePatrolPointMarker(point) +if self and self.markpoints then +local text=string.format("%s Occupied=%d\nheading=%03d, leg=%d NM, alt=%d ft, speed=%d kts", +point.type,point.noccupied,point.heading,point.leg,point.altitude,point.speed) +if point.IsZonePoint and point.IsZonePoint==true and point.patrolzone then +local Coordinate=point.patrolzone:GetCoordinate() +point.marker:UpdateCoordinate(Coordinate) +point.marker:UpdateText(text,1.5) +else +point.marker:UpdateText(text,1) +end +end +end +function AIRWING:NewPatrolPoint(Type,Coordinate,Altitude,Speed,Heading,LegLength,RefuelSystem) +local patrolpoint={} +patrolpoint.type=Type or"Unknown" +patrolpoint.coord=Coordinate or self:GetCoordinate():Translate(UTILS.NMToMeters(math.random(10,15)),math.random(360)) +if Coordinate and Coordinate:IsInstanceOf("ZONE_BASE")then +patrolpoint.IsZonePoint=true +patrolpoint.patrolzone=Coordinate +patrolpoint.coord=patrolpoint.patrolzone:GetCoordinate() +else +patrolpoint.IsZonePoint=false +end +patrolpoint.heading=Heading or math.random(360) +patrolpoint.leg=LegLength or 15 +patrolpoint.altitude=Altitude or math.random(10,20)*1000 +patrolpoint.speed=Speed or 350 +patrolpoint.noccupied=0 +patrolpoint.refuelsystem=RefuelSystem +if self.markpoints then +patrolpoint.marker=MARKER:New(Coordinate,"New Patrol Point"):ToAll() +self:UpdatePatrolPointMarker(patrolpoint) +end +return patrolpoint +end +function AIRWING:AddPatrolPointCAP(Coordinate,Altitude,Speed,Heading,LegLength) +local patrolpoint=self:NewPatrolPoint("CAP",Coordinate,Altitude,Speed,Heading,LegLength) +table.insert(self.pointsCAP,patrolpoint) +return self +end +function AIRWING:AddPatrolPointRecon(Coordinate,Altitude,Speed,Heading,LegLength) +local patrolpoint=self:NewPatrolPoint("RECON",Coordinate,Altitude,Speed,Heading,LegLength) +table.insert(self.pointsRecon,patrolpoint) +return self +end +function AIRWING:AddPatrolPointTANKER(Coordinate,Altitude,Speed,Heading,LegLength,RefuelSystem) +local patrolpoint=self:NewPatrolPoint("Tanker",Coordinate,Altitude,Speed,Heading,LegLength,RefuelSystem) +table.insert(self.pointsTANKER,patrolpoint) +return self +end +function AIRWING:AddPatrolPointAWACS(Coordinate,Altitude,Speed,Heading,LegLength) +local patrolpoint=self:NewPatrolPoint("AWACS",Coordinate,Altitude,Speed,Heading,LegLength) +table.insert(self.pointsAWACS,patrolpoint) +return self +end +function AIRWING:SetAirboss(airboss) +self.airboss=airboss +return self +end +function AIRWING:SetTakeoffType(TakeoffType) +TakeoffType=TakeoffType or"Cold" +if TakeoffType:lower()=="hot"then +self.takeoffType=COORDINATE.WaypointType.TakeOffParkingHot +elseif TakeoffType:lower()=="cold"then +self.takeoffType=COORDINATE.WaypointType.TakeOffParking +elseif TakeoffType:lower()=="air"then +self.takeoffType=COORDINATE.WaypointType.TurningPoint +else +self.takeoffType=COORDINATE.WaypointType.TakeOffParking +end +return self +end +function AIRWING:SetTakeoffCold() +self:SetTakeoffType("Cold") +return self +end +function AIRWING:SetTakeoffHot() +self:SetTakeoffType("Hot") +return self +end +function AIRWING:SetTakeoffAir() +self:SetTakeoffType("Air") +return self +end +function AIRWING:SetLandingStraightIn() +self.OptionLandingStraightIn=true +return self +end +function AIRWING:SetLandingForcePair() +self.OptionLandingForcePair=true +return self +end +function AIRWING:SetLandingRestrictPair() +self.OptionLandingRestrictPair=true +return self +end +function AIRWING:SetLandingOverheadBreak() +self.OptionLandingOverheadBreak=true +return self +end +function AIRWING:SetOptionPreferVerticalLanding() +self.OptionPreferVerticalLanding=true +return self +end +function AIRWING:SetDespawnAfterLanding(Switch) +if Switch then +self.despawnAfterLanding=Switch +else +self.despawnAfterLanding=true +end +return self +end +function AIRWING:SetDespawnAfterHolding(Switch) +if Switch then +self.despawnAfterHolding=Switch +else +self.despawnAfterHolding=true +end +return self +end +function AIRWING:onafterStart(From,Event,To) +self:GetParent(self,AIRWING).onafterStart(self,From,Event,To) +self:I(self.lid..string.format("Starting AIRWING v%s",AIRWING.version)) +end +function AIRWING:onafterStatus(From,Event,To) +self:GetParent(self).onafterStatus(self,From,Event,To) +local fsmstate=self:GetState() +self:CheckCAP() +self:CheckTANKER() +self:CheckAWACS() +self:CheckRescuhelo() +self:CheckRECON() +self:_TacticalOverview() +self:CheckTransportQueue() +self:CheckMissionQueue() +if self.verbose>=1 then +local Nmissions=self:CountMissionsInQueue() +local Npayloads=self:CountPayloadsInStock(AUFTRAG.Type) +local Npq,Np,Nq=self:CountAssetsOnMission() +local assets=string.format("%d (OnMission: Total=%d, Active=%d, Queued=%d)",self:CountAssets(),Npq,Np,Nq) +local text=string.format("%s: Missions=%d, Payloads=%d (%d), Squads=%d, Assets=%s",fsmstate,Nmissions,Npayloads,#self.payloads,#self.cohorts,assets) +self:I(self.lid..text) +end +if self.verbose>=2 then +local text=string.format("Missions Total=%d:",#self.missionqueue) +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +local prio=string.format("%d/%s",mission.prio,tostring(mission.importance));if mission.urgent then prio=prio.." (!)"end +local assets=string.format("%d/%d",mission:CountOpsGroups(),mission:GetNumberOfRequiredAssets()) +local target=string.format("%d/%d Damage=%.1f",mission:CountMissionTargets(),mission:GetTargetInitialNumber(),mission:GetTargetDamage()) +local mystatus=mission:GetLegionStatus(self) +text=text..string.format("\n[%d] %s %s: Status=%s [%s], Prio=%s, Assets=%s, Targets=%s",i,mission.name,mission.type,mystatus,mission.status,prio,assets,target) +end +self:I(self.lid..text) +end +if self.verbose>=3 then +local text="Squadrons:" +for i,_squadron in pairs(self.cohorts)do +local squadron=_squadron +local callsign=squadron.callsignName and UTILS.GetCallsignName(squadron.callsignName)or"N/A" +local modex=squadron.modex and squadron.modex or-1 +local skill=squadron.skill and tostring(squadron.skill)or"N/A" +text=text..string.format("\n* %s %s: %s*%d/%d, Callsign=%s, Modex=%d, Skill=%s",squadron.name,squadron:GetState(),squadron.aircrafttype,squadron:CountAssets(true),#squadron.assets,callsign,modex,skill) +end +self:I(self.lid..text) +end +end +function AIRWING:_GetPatrolData(PatrolPoints,RefuelSystem) +local function sort(a,b) +return a.noccupied<b.noccupied +end +if PatrolPoints and#PatrolPoints>0 then +table.sort(PatrolPoints,sort) +for _,_patrolpoint in pairs(PatrolPoints)do +local patrolpoint=_patrolpoint +if patrolpoint.IsZonePoint and patrolpoint.IsZonePoint==true and patrolpoint.patrolzone then +patrolpoint.coord=patrolpoint.patrolzone:GetCoordinate() +end +if(RefuelSystem and patrolpoint.refuelsystem and RefuelSystem==patrolpoint.refuelsystem)or RefuelSystem==nil or patrolpoint.refuelsystem==nil then +return patrolpoint +end +end +end +return self:NewPatrolPoint() +end +function AIRWING:CheckCAP() +local Ncap=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and(mission.type==AUFTRAG.Type.GCICAP or mission.type==AUFTRAG.Type.PATROLRACETRACK)and mission.patroldata then +Ncap=Ncap+1 +end +end +for i=1,self.nflightsCAP-Ncap do +local patrol=self:_GetPatrolData(self.pointsCAP) +local altitude=patrol.altitude+1000*patrol.noccupied +local missionCAP=nil +if self.capOptionPatrolRaceTrack then +missionCAP=AUFTRAG:NewPATROL_RACETRACK(patrol.coord,altitude,patrol.speed,patrol.heading,patrol.leg,self.capFormation) +else +missionCAP=AUFTRAG:NewGCICAP(patrol.coord,altitude,patrol.speed,patrol.heading,patrol.leg) +end +if self.capOptionVaryStartTime then +local ClockStart=math.random(self.capOptionVaryStartTime,self.capOptionVaryEndTime) +missionCAP:SetTime(ClockStart) +end +missionCAP.patroldata=patrol +patrol.noccupied=patrol.noccupied+1 +if self.markpoints then self:UpdatePatrolPointMarker(patrol)end +self:AddMission(missionCAP) +end +return self +end +function AIRWING:CheckRECON() +local Ncap=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and mission.type==AUFTRAG.Type.RECON and mission.patroldata then +Ncap=Ncap+1 +end +end +for i=1,self.nflightsRecon-Ncap do +local patrol=self:_GetPatrolData(self.pointsRecon) +local altitude=patrol.altitude +local ZoneSet=SET_ZONE:New() +local Zone=ZONE_RADIUS:New(self.alias.." Recon "..math.random(1,10000),patrol.coord:GetVec2(),UTILS.NMToMeters(patrol.leg/2)) +ZoneSet:AddZone(Zone) +if self.Debug then +Zone:DrawZone(self.coalition,{0,0,1},Alpha,FillColor,FillAlpha,2,true) +end +local missionRECON=AUFTRAG:NewRECON(ZoneSet,patrol.speed,patrol.altitude,true) +missionRECON.patroldata=patrol +missionRECON.categories={AUFTRAG.Category.AIRCRAFT} +patrol.noccupied=patrol.noccupied+1 +if self.markpoints then self:UpdatePatrolPointMarker(patrol)end +self:AddMission(missionRECON) +end +return self +end +function AIRWING:CheckTANKER() +local Nboom=0 +local Nprob=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and mission.type==AUFTRAG.Type.TANKER and mission.patroldata then +if mission.refuelSystem==Unit.RefuelingSystem.BOOM_AND_RECEPTACLE then +Nboom=Nboom+1 +elseif mission.refuelSystem==Unit.RefuelingSystem.PROBE_AND_DROGUE then +Nprob=Nprob+1 +end +end +end +for i=1,self.nflightsTANKERboom-Nboom do +local patrol=self:_GetPatrolData(self.pointsTANKER) +local altitude=patrol.altitude+1000*patrol.noccupied +local mission=AUFTRAG:NewTANKER(patrol.coord,altitude,patrol.speed,patrol.heading,patrol.leg,Unit.RefuelingSystem.BOOM_AND_RECEPTACLE) +mission.patroldata=patrol +patrol.noccupied=patrol.noccupied+1 +if self.markpoints then self:UpdatePatrolPointMarker(patrol)end +self:AddMission(mission) +end +for i=1,self.nflightsTANKERprobe-Nprob do +local patrol=self:_GetPatrolData(self.pointsTANKER) +local altitude=patrol.altitude+1000*patrol.noccupied +local mission=AUFTRAG:NewTANKER(patrol.coord,altitude,patrol.speed,patrol.heading,patrol.leg,Unit.RefuelingSystem.PROBE_AND_DROGUE) +mission.patroldata=patrol +patrol.noccupied=patrol.noccupied+1 +if self.markpoints then self:UpdatePatrolPointMarker(patrol)end +self:AddMission(mission) +end +return self +end +function AIRWING:CheckAWACS() +local N=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and mission.type==AUFTRAG.Type.AWACS and mission.patroldata then +N=N+1 +end +end +for i=1,self.nflightsAWACS-N do +local patrol=self:_GetPatrolData(self.pointsAWACS) +local altitude=patrol.altitude+1000*patrol.noccupied +local mission=AUFTRAG:NewAWACS(patrol.coord,altitude,patrol.speed,patrol.heading,patrol.leg) +mission.patroldata=patrol +patrol.noccupied=patrol.noccupied+1 +if self.markpoints then self:UpdatePatrolPointMarker(patrol)end +self:AddMission(mission) +end +return self +end +function AIRWING:CheckRescuhelo() +local N=self:CountMissionsInQueue({AUFTRAG.Type.RESCUEHELO}) +if self.airbase then +local name=self.airbase:GetName() +local carrier=UNIT:FindByName(name) +for i=1,self.nflightsRescueHelo-N do +local mission=AUFTRAG:NewRESCUEHELO(carrier) +self:AddMission(mission) +end +end +return self +end +function AIRWING:GetTankerForFlight(flightgroup) +local tankers=self:GetAssetsOnMission(AUFTRAG.Type.TANKER) +if#tankers>0 then +local tankeropt={} +for _,_tanker in pairs(tankers)do +local tanker=_tanker +if flightgroup.refueltype and flightgroup.refueltype==tanker.flightgroup.tankertype then +local tankercoord=tanker.flightgroup.group:GetCoordinate() +local assetcoord=flightgroup.group:GetCoordinate() +local dist=assetcoord:Get2DDistance(tankercoord) +if dist>5 then +table.insert(tankeropt,{tanker=tanker,dist=dist}) +end +end +end +table.sort(tankeropt,function(a,b)return a.dist<b.dist end) +if#tankeropt>0 then +return tankeropt[1].tanker +else +return nil +end +end +return nil +end +function AIRWING:SetUsingOpsAwacs(ConnectecdAwacs) +self:I(self.lid.."Added AWACS Object: "..ConnectecdAwacs:GetName()or"unknown") +self.UseConnectedOpsAwacs=true +self.ConnectedOpsAwacs=ConnectecdAwacs +return self +end +function AIRWING:RemoveUsingOpsAwacs() +self:I(self.lid.."Reomve AWACS Object: "..self.ConnectedOpsAwacs:GetName()or"unknown") +self.UseConnectedOpsAwacs=false +return self +end +function AIRWING:onafterFlightOnMission(From,Event,To,FlightGroup,Mission) +self:T(self.lid..string.format("Group %s on %s mission %s",FlightGroup:GetName(),Mission:GetType(),Mission:GetName())) +if self.UseConnectedOpsAwacs and self.ConnectedOpsAwacs then +self.ConnectedOpsAwacs:__FlightOnMission(2,FlightGroup,Mission) +end +if self.OptionLandingForcePair then +FlightGroup:SetOptionLandingForcePair() +elseif self.OptionLandingOverheadBreak then +FlightGroup:SetOptionLandingOverheadBreak() +elseif self.OptionLandingRestrictPair then +FlightGroup:SetOptionLandingRestrictPair() +elseif self.OptionLandingStraightIn then +FlightGroup:SetOptionLandingStraightIn() +end +if self.OptionPreferVerticalLanding then +FlightGroup:SetOptionPreferVertical() +end +end +function AIRWING:CountPayloadsInStock(MissionTypes,UnitTypes,Payloads) +if MissionTypes then +if type(MissionTypes)=="string"then +MissionTypes={MissionTypes} +end +end +if UnitTypes then +if type(UnitTypes)=="string"then +UnitTypes={UnitTypes} +end +end +local function _checkUnitTypes(payload) +if UnitTypes then +for _,unittype in pairs(UnitTypes)do +if unittype==payload.aircrafttype then +return true +end +end +else +return true +end +return false +end +local function _checkPayloads(payload) +if Payloads then +for _,Payload in pairs(Payloads)do +if Payload.uid==payload.uid then +return true +end +end +else +return nil +end +return false +end +local n=0 +for _,_payload in pairs(self.payloads)do +local payload=_payload +for _,MissionType in pairs(MissionTypes)do +local specialpayload=_checkPayloads(payload) +local compatible=AUFTRAG.CheckMissionCapability(MissionType,payload.capabilities) +local goforit=specialpayload or(specialpayload==nil and compatible) +if goforit and _checkUnitTypes(payload)then +if payload.unlimited then +return 999 +else +n=n+payload.navail +end +end +end +end +return n +end +function AIRWING:GetPayloadPeformance(Payload,MissionType) +if Payload then +for _,Capability in pairs(Payload.capabilities)do +local capability=Capability +if capability.MissionType==MissionType then +return capability.Performance +end +end +else +self:E(self.lid.."ERROR: Payload is nil!") +end +return-1 +end +function AIRWING:GetPayloadMissionTypes(Payload) +local missiontypes={} +for _,Capability in pairs(Payload.capabilities)do +local capability=Capability +table.insert(missiontypes,capability.MissionType) +end +return missiontypes +end +ARMYGROUP={ +ClassName="ARMYGROUP", +formationPerma=nil, +engage={}, +} +ARMYGROUP.version="1.0.3" +function ARMYGROUP:New(group) +local og=_DATABASE:GetOpsGroup(group) +if og then +og:I(og.lid..string.format("WARNING: OPS group already exists in data base!")) +return og +end +local self=BASE:Inherit(self,OPSGROUP:New(group)) +self.lid=string.format("ARMYGROUP %s | ",self.groupname) +self:SetDefaultROE() +self:SetDefaultAlarmstate() +self:SetDefaultEPLRS(self.isEPLRS) +self:SetDefaultEmission() +self:SetDetection() +self:SetPatrolAdInfinitum(false) +self:SetRetreatZones() +self:AddTransition("*","FullStop","Holding") +self:AddTransition("*","Cruise","Cruising") +self:AddTransition("*","RTZ","Returning") +self:AddTransition("Holding","Returned","Returned") +self:AddTransition("Returning","Returned","Returned") +self:AddTransition("*","Detour","OnDetour") +self:AddTransition("OnDetour","DetourReached","Cruising") +self:AddTransition("*","Retreat","Retreating") +self:AddTransition("Retreating","Retreated","Retreated") +self:AddTransition("*","Suppressed","*") +self:AddTransition("*","Unsuppressed","*") +self:AddTransition("Cruising","EngageTarget","Engaging") +self:AddTransition("Holding","EngageTarget","Engaging") +self:AddTransition("OnDetour","EngageTarget","Engaging") +self:AddTransition("Engaging","Disengage","Cruising") +self:AddTransition("*","Rearm","Rearm") +self:AddTransition("Rearm","Rearming","Rearming") +self:AddTransition("*","Rearmed","Cruising") +self:_InitWaypoints() +self:_InitGroup() +self:HandleEvent(EVENTS.Birth,self.OnEventBirth) +self:HandleEvent(EVENTS.Dead,self.OnEventDead) +self:HandleEvent(EVENTS.RemoveUnit,self.OnEventRemoveUnit) +self:HandleEvent(EVENTS.UnitLost,self.OnEventRemoveUnit) +self:HandleEvent(EVENTS.Hit,self.OnEventHit) +self.timerStatus=TIMER:New(self.Status,self):Start(1,30) +self.timerQueueUpdate=TIMER:New(self._QueueUpdate,self):Start(2,5) +self.timerCheckZone=TIMER:New(self._CheckInZones,self):Start(2,30) +_DATABASE:AddOpsGroup(self) +return self +end +function ARMYGROUP:SetPatrolAdInfinitum(switch) +if switch==false then +self.adinfinitum=false +else +self.adinfinitum=true +end +return self +end +function ARMYGROUP:GetClosestRoad() +local coord=self:GetCoordinate():GetClosestPointToRoad() +return coord +end +function ARMYGROUP:GetClosestRoadDist() +local road=self:GetClosestRoad() +if road then +local dist=road:Get2DDistance(self:GetCoordinate()) +return dist +end +return math.huge +end +function ARMYGROUP:AddTaskFireAtPoint(Coordinate,Clock,Radius,Nshots,WeaponType,Prio) +Coordinate=self:_CoordinateFromObject(Coordinate) +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,Coordinate:GetVec2(),Radius,Nshots,WeaponType) +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function ARMYGROUP:AddTaskBarrage(Clock,Heading,Alpha,Altitude,Radius,Nshots,WeaponType,Prio) +Heading=Heading or 0 +Alpha=Alpha or 60 +Altitude=Altitude or 100 +local distance=Altitude/math.tan(math.rad(Alpha)) +local a=self:GetVec2() +local vec2=UTILS.Vec2Translate(a,distance,Heading) +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,vec2,Radius,Nshots,WeaponType,Altitude) +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function ARMYGROUP:AddTaskWaypointFireAtPoint(Coordinate,Waypoint,Radius,Nshots,WeaponType,Prio) +Coordinate=self:_CoordinateFromObject(Coordinate) +Waypoint=Waypoint or self:GetWaypointNext() +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,Coordinate:GetVec2(),Radius,Nshots,WeaponType) +local task=self:AddTaskWaypoint(DCStask,Waypoint,nil,Prio) +return task +end +function ARMYGROUP:AddTaskAttackGroup(TargetGroup,WeaponExpend,WeaponType,Clock,Prio) +local DCStask=CONTROLLABLE.TaskAttackGroup(nil,TargetGroup,WeaponType,WeaponExpend,AttackQty,Direction,Altitude,AttackQtyLimit,GroupAttack) +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function ARMYGROUP:AddTaskCargoGroup(GroupSet,PickupZone,DeployZone,Clock,Prio) +local DCStask={} +DCStask.id="CargoTransport" +DCStask.params={} +DCStask.params.cargoqueu=1 +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function ARMYGROUP:SetRetreatZones(RetreatZoneSet) +self.retreatZones=RetreatZoneSet or SET_ZONE:New() +return self +end +function ARMYGROUP:AddRetreatZone(RetreatZone) +self.retreatZones:AddZone(RetreatZone) +return self +end +function ARMYGROUP:SetSuppressionOn(Tave,Tmin,Tmax) +self.suppressionOn=true +self.TsuppressMin=Tmin or 1 +self.TsuppressMin=math.max(self.TsuppressMin,1) +self.TsuppressMax=Tmax or 15 +self.TsuppressMax=math.max(self.TsuppressMax,self.TsuppressMin) +self.TsuppressAve=Tave or 10 +self.TsuppressAve=math.max(self.TsuppressMin) +self.TsuppressAve=math.min(self.TsuppressMax) +self:T(self.lid..string.format("Set ave suppression time to %d seconds.",self.TsuppressAve)) +self:T(self.lid..string.format("Set min suppression time to %d seconds.",self.TsuppressMin)) +self:T(self.lid..string.format("Set max suppression time to %d seconds.",self.TsuppressMax)) +return self +end +function ARMYGROUP:SetSuppressionOff() +self.suppressionOn=false +end +function ARMYGROUP:IsHolding() +return self:Is("Holding") +end +function ARMYGROUP:IsCruising() +return self:Is("Cruising") +end +function ARMYGROUP:IsOnDetour() +return self:Is("OnDetour") +end +function ARMYGROUP:IsCombatReady() +local combatready=true +if self:IsRearming()or self:IsRetreating()or self:IsOutOfAmmo()or self:IsEngaging()or self:IsDead()or self:IsStopped()or self:IsInUtero()then +combatready=false +end +if self:IsPickingup()or self:IsLoading()or self:IsTransporting()or self:IsLoaded()or self:IsCargo()or self:IsCarrier()then +combatready=false +end +return combatready +end +function ARMYGROUP:Status() +local fsmstate=self:GetState() +local alive=self:IsAlive() +if alive then +self:_UpdatePosition() +self:_CheckDetectedUnits() +self:_CheckAmmoStatus() +self:_CheckDamage() +self:_CheckStuck() +if self:IsEngaging()then +self:_UpdateEngageTarget() +end +if self:IsWaiting()then +if self.Twaiting and self.dTwait then +if timer.getAbsTime()>self.Twaiting+self.dTwait then +self.Twaiting=nil +self.dTwait=nil +if self:_CountPausedMissions()>0 then +self:UnpauseMission() +else +self:Cruise() +end +end +end +end +local mission=self:GetMissionCurrent() +if mission and mission.updateDCSTask then +if mission.type==AUFTRAG.Type.CAPTUREZONE then +local Task=mission:GetGroupWaypointTask(self) +if mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.EXECUTING or mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.STARTED then +self:_UpdateTask(Task,mission) +end +end +end +else +self:_CheckDamage() +end +if alive~=nil then +if self.verbose>=1 then +local nelem=self:CountElements() +local Nelem=#self.elements +local nTaskTot,nTaskSched,nTaskWP=self:CountRemainingTasks() +local nMissions=self:CountRemainingMissison() +local roe=self:GetROE()or-1 +local als=self:GetAlarmstate()or-1 +local wpidxCurr=self.currentwp +local wpuidCurr=self:GetWaypointUIDFromIndex(wpidxCurr)or 0 +local wpidxNext=self:GetWaypointIndexNext()or 0 +local wpuidNext=self:GetWaypointUIDFromIndex(wpidxNext)or 0 +local wpN=#self.waypoints or 0 +local wpF=tostring(self.passedfinalwp) +local speed=UTILS.MpsToKnots(self.velocity or 0) +local speedEx=UTILS.MpsToKnots(self:GetExpectedSpeed()) +local alt=self.position and self.position.y or 0 +local hdg=self.heading or 0 +local formation=self.option.Formation or"unknown" +local life=self.life or 0 +local ammo=self:GetAmmoTot().Total +local ndetected=self.detectionOn and tostring(self.detectedunits:Count())or"Off" +local cargo=0 +for _,_element in pairs(self.elements)do +local element=_element +cargo=cargo+element.weightCargo +end +local text=string.format("%s [%d/%d]: ROE/AS=%d/%d | T/M=%d/%d | Wp=%d[%d]-->%d[%d]/%d [%s] | Life=%.1f | v=%.1f (%d) [%s] | Hdg=%03d | Ammo=%d | Detect=%s | Cargo=%.1f", +fsmstate,nelem,Nelem,roe,als,nTaskTot,nMissions,wpidxCurr,wpuidCurr,wpidxNext,wpuidNext,wpN,wpF,life,speed,speedEx,formation,hdg,ammo,ndetected,cargo) +self:I(self.lid..text) +end +else +if self.verbose>=1 then +local text=string.format("State %s: Alive=%s",fsmstate,tostring(self:IsAlive())) +self:I(self.lid..text) +end +end +if self.verbose>=2 then +local text="Elements:" +for i,_element in pairs(self.elements)do +local element=_element +local name=element.name +local status=element.status +local unit=element.unit +local life,life0=self:GetLifePoints(element) +local life0=element.life0 +local ammo=self:GetAmmoElement(element) +text=text..string.format("\n[%d] %s: status=%s, life=%.1f/%.1f, guns=%d, rockets=%d, bombs=%d, missiles=%d, cargo=%d/%d kg", +i,name,status,life,life0,ammo.Guns,ammo.Rockets,ammo.Bombs,ammo.Missiles,element.weightCargo,element.weightMaxCargo) +end +if#self.elements==0 then +text=text.." none!" +end +self:T(self.lid..text) +end +if self:IsCruising()and self.detectionOn and self.engagedetectedOn then +local targetgroup,targetdist=self:_GetDetectedTarget() +if targetgroup then +self:T(self.lid..string.format("Engaging target group %s at distance %d meters",targetgroup:GetName(),targetdist)) +self:EngageTarget(targetgroup) +end +end +self:_CheckCargoTransport() +self:_PrintTaskAndMissionStatus() +end +function ARMYGROUP:onafterElementSpawned(From,Event,To,Element) +self:T(self.lid..string.format("Element spawned %s",Element.name)) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.SPAWNED) +end +function ARMYGROUP:onafterSpawned(From,Event,To) +self:T(self.lid..string.format("Group spawned!")) +if self.verbose>=1 then +local text=string.format("Initialized Army Group %s:\n",self.groupname) +text=text..string.format("Unit type = %s\n",self.actype) +text=text..string.format("Speed max = %.1f Knots\n",UTILS.KmphToKnots(self.speedMax)) +text=text..string.format("Speed cruise = %.1f Knots\n",UTILS.KmphToKnots(self.speedCruise)) +text=text..string.format("Weight = %.1f kg\n",self:GetWeightTotal()) +text=text..string.format("Cargo bay = %.1f kg\n",self:GetFreeCargobay()) +text=text..string.format("Has EPLRS = %s\n",tostring(self.isEPLRS)) +text=text..string.format("Elements = %d\n",#self.elements) +text=text..string.format("Waypoints = %d\n",#self.waypoints) +text=text..string.format("Radio = %.1f MHz %s %s\n",self.radio.Freq,UTILS.GetModulationName(self.radio.Modu),tostring(self.radio.On)) +text=text..string.format("Ammo = %d (G=%d/R=%d/M=%d)\n",self.ammo.Total,self.ammo.Guns,self.ammo.Rockets,self.ammo.Missiles) +text=text..string.format("FSM state = %s\n",self:GetState()) +text=text..string.format("Is alive = %s\n",tostring(self:IsAlive())) +text=text..string.format("LateActivate = %s\n",tostring(self:IsLateActivated())) +self:I(self.lid..text) +end +self:_UpdatePosition() +self.isDead=false +self.isDestroyed=false +if self.isAI then +self:SwitchROE(self.option.ROE) +self:SwitchAlarmstate(self.option.Alarm) +self:SwitchEmission(self.option.Emission) +self:SwitchEPLRS(self.option.EPLRS) +self:SwitchInvisible(self.option.Invisible) +self:SwitchImmortal(self.option.Immortal) +self:_SwitchTACAN() +if self.radioDefault then +self:SwitchRadio(self.radioDefault.Freq,self.radioDefault.Modu) +else +self:SetDefaultRadio(self.radio.Freq,self.radio.Modu,true) +end +if not self.option.Formation then +end +local Nwp=#self.waypoints +if Nwp>1 and self.isMobile then +self:T(self.lid..string.format("Got %d waypoints on spawn ==> Cruise in -1.0 sec!",Nwp)) +local wp=self:GetWaypointNext() +self.option.Formation=wp.action +self:__Cruise(-1) +else +self:T(self.lid.."No waypoints on spawn ==> Full Stop!") +self:FullStop() +end +end +end +function ARMYGROUP:onbeforeUpdateRoute(From,Event,To,n,N,Speed,Formation) +local allowed=true +local trepeat=nil +if self:IsWaiting()then +self:T(self.lid.."Update route denied. Group is WAITING!") +return false +elseif self:IsInUtero()then +self:T(self.lid.."Update route denied. Group is INUTERO!") +return false +elseif self:IsDead()then +self:T(self.lid.."Update route denied. Group is DEAD!") +return false +elseif self:IsStopped()then +self:T(self.lid.."Update route denied. Group is STOPPED!") +return false +elseif self:IsHolding()then +self:T(self.lid.."Update route denied. Group is holding position!") +return false +elseif self:IsEngaging()then +self:T(self.lid.."Update route allowed. Group is engaging!") +return true +end +if self.taskcurrent>0 then +local task=self:GetTaskByID(self.taskcurrent) +if task then +if task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +self:T2(self.lid.."Allowing update route for Task: PatrolZone") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RECON then +self:T2(self.lid.."Allowing update route for Task: ReconMission") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RELOCATECOHORT then +self:T2(self.lid.."Allowing update route for Task: Relocate Cohort") +elseif task.dcstask.id==AUFTRAG.SpecialTask.REARMING then +self:T2(self.lid.."Allowing update route for Task: Rearming") +else +local taskname=task and task.description or"No description" +self:T(self.lid..string.format("WARNING: Update route denied because taskcurrent=%d>0! Task description = %s",self.taskcurrent,tostring(taskname))) +allowed=false +end +else +self:T(self.lid..string.format("WARNING: before update route taskcurrent=%d (>0!) but no task?!",self.taskcurrent)) +allowed=false +end +end +if not self.isAI then +allowed=false +end +self:T2(self.lid..string.format("Onbefore Updateroute in state %s: allowed=%s (repeat in %s)",self:GetState(),tostring(allowed),tostring(trepeat))) +if trepeat then +self:__UpdateRoute(trepeat,n) +end +return allowed +end +function ARMYGROUP:onafterUpdateRoute(From,Event,To,n,N,Speed,Formation) +n=n or self:GetWaypointIndexNext(self.adinfinitum) +N=N or#self.waypoints +N=math.min(N,#self.waypoints) +local text=string.format("Update route state=%s: n=%s, N=%s, Speed=%s, Formation=%s",self:GetState(),tostring(n),tostring(N),tostring(Speed),tostring(Formation)) +self:T(self.lid..text) +local waypoints={} +local wp=self.waypoints[n] +local coordinate=self:GetCoordinate() +local coordRoad=coordinate:GetClosestPointToRoad() +local roaddist=coordinate:Get2DDistance(coordRoad) +local formation0=wp.action +if formation0==ENUMS.Formation.Vehicle.OnRoad then +if roaddist>10 then +formation0=ENUMS.Formation.Vehicle.OffRoad +else +formation0=ENUMS.Formation.Vehicle.OnRoad +end +end +local current=coordinate:WaypointGround(UTILS.MpsToKmph(self.speedWp),formation0) +table.insert(waypoints,1,current) +if N-n>0 then +for j=n,N do +local i=j-1 +if i==0 then +i=self.currentwp +end +local wp=UTILS.DeepCopy(self.waypoints[j]) +local wp0=self.waypoints[i] +if false and self.attribute==GROUP.Attribute.GROUND_APC then +local text=string.format("FF Update: i=%d, wp[i]=%s, wp[i-1]=%s",i,wp.action,wp0.action) +env.info(text) +end +if Speed then +wp.speed=UTILS.KnotsToMps(tonumber(Speed)) +else +if wp.speed<0.1 then +wp.speed=UTILS.KmphToMps(self.speedCruise) +end +end +if self.formationPerma then +wp.action=self.formationPerma +elseif Formation then +wp.action=Formation +end +if wp.action==ENUMS.Formation.Vehicle.OnRoad and wp0.roaddist>=0 then +local wproad=wp0.roadcoord:WaypointGround(UTILS.MpsToKmph(wp.speed),ENUMS.Formation.Vehicle.OnRoad) +table.insert(waypoints,wproad) +end +if wp.action==ENUMS.Formation.Vehicle.OnRoad and wp.roaddist>=0 then +wp.action=ENUMS.Formation.Vehicle.OffRoad +local wproad=wp.roadcoord:WaypointGround(UTILS.MpsToKmph(wp.speed),ENUMS.Formation.Vehicle.OnRoad) +table.insert(waypoints,wproad) +end +table.insert(waypoints,wp) +end +else +local wp=UTILS.DeepCopy(self.waypoints[n]) +if wp.speed<0.1 then +wp.speed=UTILS.KmphToMps(self.speedCruise) +end +local formation=wp.action +if self.formationPerma then +formation=self.formationPerma +elseif Formation then +formation=Formation +end +if formation==ENUMS.Formation.Vehicle.OnRoad then +if roaddist>10 then +local wproad=coordRoad:WaypointGround(UTILS.MpsToKmph(wp.speed),ENUMS.Formation.Vehicle.OnRoad) +table.insert(waypoints,wproad) +end +if wp.roaddist>10 then +local wproad=wp.roadcoord:WaypointGround(UTILS.MpsToKmph(wp.speed),ENUMS.Formation.Vehicle.OnRoad) +table.insert(waypoints,wproad) +end +end +if wp.action==ENUMS.Formation.Vehicle.OnRoad and wp.roaddist>10 then +wp.action=ENUMS.Formation.Vehicle.OffRoad +end +table.insert(waypoints,wp) +end +local wp=waypoints[1] +self.option.Formation=wp.action +self.speedWp=wp.speed +self:T(self.lid..string.format("Expected/waypoint speed=%.1f m/s",self.speedWp)) +if self.verbose>=10 then +for i,_wp in pairs(waypoints)do +local wp=_wp +local text=string.format("WP #%d UID=%d Formation=%s: Speed=%d m/s, Alt=%d m, Type=%s",i,wp.uid and wp.uid or-1,wp.action,wp.speed,wp.alt,wp.type) +local coord=COORDINATE:NewFromWaypoint(wp):MarkToAll(text) +self:I(text) +end +end +if self:IsEngaging()or not self.passedfinalwp then +self:T(self.lid..string.format("Updateing route: WP %d-->%d (%d/%d), Speed=%.1f knots, Formation=%s", +self.currentwp,n,#waypoints,#self.waypoints,UTILS.MpsToKnots(self.speedWp),tostring(self.option.Formation))) +self:Route(waypoints) +else +self:T(self.lid..string.format("WARNING: Passed final WP when UpdateRoute() ==> Full Stop!")) +self:FullStop() +end +end +function ARMYGROUP:onafterGotoWaypoint(From,Event,To,UID,Speed,Formation) +local n=self:GetWaypointIndex(UID) +if n then +Speed=Speed or self:GetSpeedToWaypoint(n) +self:__UpdateRoute(-0.01,n,nil,Speed,Formation) +end +end +function ARMYGROUP:onafterDetour(From,Event,To,Coordinate,Speed,Formation,ResumeRoute) +for _,_wp in pairs(self.waypoints)do +local wp=_wp +if wp.detour then +self:RemoveWaypointByID(wp.uid) +end +end +Speed=Speed or self:GetSpeedCruise() +local uid=self:GetWaypointCurrentUID() +local wp=self:AddWaypoint(Coordinate,Speed,uid,Formation,true) +if ResumeRoute then +wp.detour=1 +else +wp.detour=0 +end +end +function ARMYGROUP:onafterOutOfAmmo(From,Event,To) +self:T(self.lid..string.format("Group is out of ammo at t=%.3f",timer.getTime())) +local task=self:GetTaskCurrent() +if task then +if task.dcstask.id=="FireAtPoint"or task.dcstask.id==AUFTRAG.SpecialTask.BARRAGE then +self:T(self.lid..string.format("Cancelling current %s task because out of ammo!",task.dcstask.id)) +self:TaskCancel(task) +end +end +if self.rearmOnOutOfAmmo then +local truck,dist=self:FindNearestAmmoSupply(30) +if truck then +self:T(self.lid..string.format("Found Ammo Truck %s [%s]",truck:GetName(),truck:GetTypeName())) +local Coordinate=truck:GetCoordinate() +self:__Rearm(-1,Coordinate) +return +end +end +if self.retreatOnOutOfAmmo then +self:T(self.lid.."Retreat on out of ammo") +self:__Retreat(-1) +return +end +if self.rtzOnOutOfAmmo and not self:IsMissionTypeInQueue(AUFTRAG.Type.REARMING)then +self:T(self.lid.."RTZ on out of ammo") +self:__RTZ(-1) +end +end +function ARMYGROUP:onbeforeRearm(From,Event,To,Coordinate,Formation) +local dt=nil +local allowed=true +if self:IsOnMission()then +local mission=self:GetMissionCurrent() +if mission and mission.type~=AUFTRAG.Type.REARMING then +self:T(self.lid.."Rearm command but have current mission ==> Pausing mission!") +self:PauseMission() +dt=-0.1 +allowed=false +else +self:T(self.lid.."Rearm command and current mission is REARMING ==> Transition ALLOWED!") +end +end +if self:IsEngaging()then +self:T(self.lid.."Rearm command but currently engaging ==> Disengage!") +self:Disengage() +dt=-0.1 +allowed=false +end +if allowed and not Coordinate then +local truck=self:FindNearestAmmoSupply() +if truck and truck:IsAlive()then +self:__Rearm(-0.1,truck:GetCoordinate(),Formation) +end +return false +end +if dt then +self:T(self.lid..string.format("Trying Rearm again in %.2f sec",dt)) +self:__Rearm(dt,Coordinate,Formation) +allowed=false +end +return allowed +end +function ARMYGROUP:onafterRearm(From,Event,To,Coordinate,Formation) +self:T(self.lid..string.format("Group send to rearm")) +local uid=self:GetWaypointCurrentUID() +local wp=self:AddWaypoint(Coordinate,nil,uid,Formation,true) +wp.detour=0 +end +function ARMYGROUP:onafterRearmed(From,Event,To) +self:T(self.lid.."Group rearmed") +local mission=self:GetMissionCurrent() +if mission and mission.type==AUFTRAG.Type.REARMING then +self:MissionDone(mission) +else +self:_CheckGroupDone(1) +end +end +function ARMYGROUP:onbeforeRTZ(From,Event,To,Zone,Formation) +self:T2(self.lid.."onbeforeRTZ") +local zone=Zone or self.homezone +if zone then +if(not self.isMobile)and(not self:IsInZone(zone))then +self:Teleport(zone:GetCoordinate(),0,true) +self:__RTZ(-1,Zone,Formation) +return false +end +else +return false +end +return true +end +function ARMYGROUP:onafterRTZ(From,Event,To,Zone,Formation) +self:T2(self.lid.."onafterRTZ") +local zone=Zone or self.homezone +self:CancelAllMissions() +if zone then +if self:IsInZone(zone)then +self:Returned() +else +self:T(self.lid..string.format("RTZ to Zone %s",zone:GetName())) +local Coordinate=zone:GetRandomCoordinate() +local uid=self:GetWaypointCurrentUID() +local wp=self:AddWaypoint(Coordinate,nil,uid,Formation,true) +wp.detour=0 +end +else +self:T(self.lid.."ERROR: No RTZ zone given!") +end +end +function ARMYGROUP:onafterReturned(From,Event,To) +self:T(self.lid..string.format("Group returned")) +if self.legion then +self:T(self.lid..string.format("Adding group back to warehouse stock")) +self.legion:__AddAsset(10,self.group,1) +end +end +function ARMYGROUP:onafterRearming(From,Event,To) +local pos=self:GetCoordinate() +local wp=pos:WaypointGround(0) +self:Route({wp}) +end +function ARMYGROUP:onbeforeRetreat(From,Event,To,Zone,Formation) +if not Zone then +local a=self:GetVec2() +local distmin=math.huge +local zonemin=nil +for _,_zone in pairs(self.retreatZones:GetSet())do +local zone=_zone +local b=zone:GetVec2() +local dist=UTILS.VecDist2D(a,b) +if dist<distmin then +distmin=dist +zonemin=zone +end +end +if zonemin then +self:__Retreat(0.1,zonemin,Formation) +end +return false +end +return true +end +function ARMYGROUP:onafterRetreat(From,Event,To,Zone,Formation) +local uid=self:GetWaypointCurrentUID() +local Coordinate=Zone:GetRandomCoordinate() +self:T(self.lid..string.format("Retreating to zone %s",Zone:GetName())) +local wp=self:AddWaypoint(Coordinate,nil,uid,Formation,true) +wp.detour=0 +self:CancelAllMissions() +end +function ARMYGROUP:onafterRetreated(From,Event,To) +local pos=self:GetCoordinate() +local wp=pos:WaypointGround(0) +self:Route({wp}) +end +function ARMYGROUP:onbeforeEngageTarget(From,Event,To,Target,Speed,Formation) +local dt=nil +local allowed=true +local ammo=self:GetAmmoTot() +if ammo.Total==0 then +self:T(self.lid.."WARNING: Cannot engage TARGET because no ammo left!") +return false +end +local mission=self:GetMissionCurrent() +if mission and mission.type~=AUFTRAG.Type.GROUNDATTACK and mission.type~=AUFTRAG.Type.CAPTUREZONE then +self:T(self.lid.."Engage command but have current mission ==> Pausing mission!") +self:PauseMission() +dt=-0.1 +allowed=false +end +if dt then +self:T(self.lid..string.format("Trying Engage again in %.2f sec",dt)) +self:__EngageTarget(dt,Target) +allowed=false +end +return allowed +end +function ARMYGROUP:onafterEngageTarget(From,Event,To,Target,Speed,Formation) +self:T(self.lid.."Engaging Target") +if Target:IsInstanceOf("TARGET")then +self.engage.Target=Target +else +self.engage.Target=TARGET:New(Target) +end +self.engage.Coordinate=UTILS.DeepCopy(self.engage.Target:GetCoordinate()) +local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate,0.95) +self.engage.roe=self:GetROE() +self.engage.alarmstate=self:GetAlarmstate() +self:SwitchAlarmstate(ENUMS.AlarmState.Auto) +self:SwitchROE(ENUMS.ROE.OpenFire) +local uid=self:GetWaypointCurrentUID() +self.engage.Formation=Formation or ENUMS.Formation.Vehicle.Vee +self.engage.Speed=Speed +self.engage.Waypoint=self:AddWaypoint(intercoord,self.engage.Speed,uid,self.engage.Formation,true) +self.engage.Waypoint.detour=1 +end +function ARMYGROUP:_UpdateEngageTarget() +if self.engage.Target and self.engage.Target:IsAlive()then +local vec3=self.engage.Target:GetVec3() +if vec3 then +local dist=UTILS.VecDist3D(vec3,self.engage.Coordinate:GetVec3()) +local los=self:HasLoS(vec3) +if dist>100 or los==false then +self.engage.Coordinate:UpdateFromVec3(vec3) +local uid=self:GetWaypointCurrentUID() +self:RemoveWaypointByID(self.engage.Waypoint.uid) +local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate,0.9) +self.engage.Waypoint=self:AddWaypoint(intercoord,self.engage.Speed,uid,self.engage.Formation,true) +self.engage.Waypoint.detour=0 +end +else +self:T(self.lid.."Could not get position of target ==> Disengage!") +self:Disengage() +end +else +self:T(self.lid.."Target not ALIVE ==> Disengage!") +self:Disengage() +end +end +function ARMYGROUP:onafterDisengage(From,Event,To) +self:T(self.lid.."Disengage Target") +self:SwitchROE(self.engage.roe) +self:SwitchAlarmstate(self.engage.alarmstate) +local task=self:GetTaskCurrent() +if task and task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK then +self:T(self.lid.."Disengage with current task GROUNDATTACK ==> Task Done!") +self:TaskDone(task) +end +if self.engage.Waypoint then +self:RemoveWaypointByID(self.engage.Waypoint.uid) +end +self:_CheckGroupDone(1) +end +function ARMYGROUP:onafterDetourReached(From,Event,To) +self:T(self.lid.."Group reached detour coordinate") +end +function ARMYGROUP:onafterFullStop(From,Event,To) +self:T(self.lid..string.format("Full stop!")) +local pos=self:GetCoordinate() +local wp=pos:WaypointGround(0) +self:Route({wp}) +end +function ARMYGROUP:onafterCruise(From,Event,To,Speed,Formation) +self.Twaiting=nil +self.dTwait=nil +self:T(self.lid..string.format("Cruise ==> Update route in 0.01 sec (speed=%s, formation=%s)",tostring(Speed),tostring(Formation))) +self:__UpdateRoute(-0.01,nil,nil,Speed,Formation) +end +function ARMYGROUP:onafterHit(From,Event,To,Enemy) +self:T(self.lid..string.format("ArmyGroup hit by %s",Enemy and Enemy:GetName()or"unknown")) +if self.suppressionOn then +env.info(self.lid.."FF suppress") +self:_Suppress() +end +end +function ARMYGROUP:AddWaypoint(Coordinate,Speed,AfterWaypointWithID,Formation,Updateroute) +self:T(self.lid..string.format("AddWaypoint Formation = %s",tostring(Formation))) +local coordinate=self:_CoordinateFromObject(Coordinate) +local wpnumber=self:GetWaypointIndexAfterID(AfterWaypointWithID) +Speed=Speed or self:GetSpeedCruise() +if not Formation then +if self.formationPerma then +Formation=self.formationPerma +elseif self.optionDefault.Formation then +Formation=self.optionDefault.Formation +elseif self.option.Formation then +Formation=self.option.Formation +else +Formation=ENUMS.Formation.Vehicle.OnRoad +end +self:T2(self.lid..string.format("Formation set to = %s",tostring(Formation))) +end +local wp=coordinate:WaypointGround(UTILS.KnotsToKmph(Speed),Formation) +local waypoint=self:_CreateWaypoint(wp) +self:_AddWaypoint(waypoint,wpnumber) +waypoint.roadcoord=coordinate:GetClosestPointToRoad(false) +if waypoint.roadcoord then +waypoint.roaddist=coordinate:Get2DDistance(waypoint.roadcoord) +else +waypoint.roaddist=1000*1000 +end +self:T(self.lid..string.format("Adding waypoint UID=%d (index=%d), Speed=%.1f knots, Dist2Road=%d m, Action=%s",waypoint.uid,wpnumber,Speed,waypoint.roaddist,waypoint.action)) +if Updateroute==nil or Updateroute==true then +self:__UpdateRoute(-0.01) +end +return waypoint +end +function ARMYGROUP:_InitGroup(Template,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,ARMYGROUP._InitGroup,self,Template,0) +else +if self.groupinitialized then +self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!") +return +end +local template=Template or self:_GetTemplate() +self.isAI=true +self.isLateActivated=template.lateActivation +self.isUncontrolled=false +self.speedMax=self.group:GetSpeedMax() +if self.speedMax and self.speedMax>3.6 then +self.isMobile=true +else +self.isMobile=false +self.speedMax=0 +end +self.speedCruise=self.speedMax*0.7 +self.ammo=self:GetAmmoTot() +self.radio.On=false +self.radio.Freq=133 +self.radio.Modu=radio.modulation.AM +self:SetDefaultRadio(self.radio.Freq,self.radio.Modu,self.radio.On) +self.option.Formation=template.route.points[1].action +self.optionDefault.Formation=ENUMS.Formation.Vehicle.OnRoad +if not self.tacanDefault then +self:SetDefaultTACAN(nil,nil,nil,nil,true) +end +if not self.tacan then +self.tacan=UTILS.DeepCopy(self.tacanDefault) +end +local units=self.group:GetUnits() +local dcsgroup=Group.getByName(self.groupname) +local size0=dcsgroup:getInitialSize() +local u=dcsgroup:getUnits() +if#units~=size0 then +self:T(self.lid..string.format("ERROR: Got #units=%d but group consists of %d units! u=%d",#units,size0,#u)) +end +for _,unit in pairs(units)do +local unitname=unit:GetName() +self:_AddElementByName(unitname) +end +self.groupinitialized=true +end +return self +end +function ARMYGROUP:SwitchFormation(Formation,Permanently,NoRouteUpdate) +if self:IsAlive()or self:IsInUtero()then +Formation=Formation or(self.optionDefault.Formation or"Off road") +Permanently=Permanently or false +if Permanently then +self.formationPerma=Formation +else +self.formationPerma=nil +end +self.option.Formation=Formation or"Off road" +if self:IsInUtero()then +self:T(self.lid..string.format("Will switch formation to %s (permanently=%s) when group is spawned",tostring(self.option.Formation),tostring(Permanently))) +else +if NoRouteUpdate then +else +self:__UpdateRoute(-1,nil,nil,Formation) +end +self:T(self.lid..string.format("Switching formation to %s (permanently=%s)",tostring(self.option.Formation),tostring(Permanently))) +end +end +return self +end +function ARMYGROUP:FindNearestAmmoSupply(Radius) +Radius=UTILS.NMToMeters(Radius or 30) +local coord=self:GetCoordinate() +local myCoalition=self:GetCoalition() +local units=coord:ScanUnits(Radius) +local dmin=math.huge +local truck=nil +for _,_unit in pairs(units.Set)do +local unit=_unit +if unit:IsAlive()and unit:GetCoalition()==myCoalition and unit:IsAmmoSupply()and unit:GetVelocityKMH()<1 then +local d=coord:Get2DDistance(unit:GetCoord()) +if d<dmin then +dmin=d +truck=unit +self:T(self.lid..string.format("Ammo truck %s [%s] at dist=%d meters",unit:GetName(),unit:GetTypeName(),d)) +end +end +end +if truck then +return truck:GetGroup(),dmin +end +return nil,nil +end +function ARMYGROUP:_Suppress() +local Tnow=timer.getTime() +local currROE=self:GetROE() +local sigma=(self.TsuppressMax-self.TsuppressMin)/4 +local Tsuppress=UTILS.RandomGaussian(self.TsuppressAve,sigma,self.TsuppressMin,self.TsuppressMax) +local renew=true +if not self.TsuppressionOver then +self.TsuppressionOver=Tnow+Tsuppress +self:SwitchROE(ENUMS.ROE.WeaponHold) +self.suppressionROE=currROE +else +if Tsuppress+Tnow>self.TsuppressionOver then +self.TsuppressionOver=Tnow+Tsuppress +else +renew=false +end +end +if renew then +self:__Unsuppressed(self.TsuppressionOver-Tnow) +end +self:T(self.lid..string.format("Suppressed for %d sec",Tsuppress)) +end +function ARMYGROUP:onbeforeUnsuppressed(From,Event,To) +local Tnow=timer.getTime() +self:T(self.lid..string.format("onbeforeRecovered: Time now: %d - Time over: %d",Tnow,self.TsuppressionOver)) +if Tnow>=self.TsuppressionOver then +return true +else +return false +end +end +function ARMYGROUP:onafterUnsuppressed(From,Event,To) +local text=string.format("Group %s has recovered!",self:GetName()) +MESSAGE:New(text,10):ToAll() +self:T(self.lid..text) +self:SwitchROE(self.suppressionROE) +if true then +self.group:FlareGreen() +end +end +AUFTRAG={ +ClassName="AUFTRAG", +verbose=0, +lid=nil, +auftragsnummer=nil, +groupdata={}, +legions={}, +statusLegion={}, +requestID={}, +assets={}, +NassetsLegMin={}, +NassetsLegMax={}, +missionFraction=0.5, +enrouteTasks={}, +marker=nil, +markerOn=nil, +markerCoalition=nil, +conditionStart={}, +conditionSuccess={}, +conditionFailure={}, +conditionPush={}, +conditionSuccessSet=false, +conditionFailureSet=false, +repeatDelay=1, +} +_AUFTRAGSNR=0 +AUFTRAG.Type={ +ANTISHIP="Anti Ship", +AWACS="AWACS", +BAI="BAI", +BOMBING="Bombing", +BOMBRUNWAY="Bomb Runway", +BOMBCARPET="Carpet Bombing", +CAP="CAP", +CAS="CAS", +ESCORT="Escort", +FAC="FAC", +FACA="FAC-A", +FERRY="Ferry Flight", +GROUNDESCORT="Ground Escort", +INTERCEPT="Intercept", +ORBIT="Orbit", +GCICAP="Ground Controlled CAP", +RECON="Recon", +RECOVERYTANKER="Recovery Tanker", +RESCUEHELO="Rescue Helo", +SEAD="SEAD", +STRIKE="Strike", +TANKER="Tanker", +TROOPTRANSPORT="Troop Transport", +ARTY="Fire At Point", +PATROLZONE="Patrol Zone", +OPSTRANSPORT="Ops Transport", +AMMOSUPPLY="Ammo Supply", +FUELSUPPLY="Fuel Supply", +ALERT5="Alert5", +ONGUARD="On Guard", +ARMOREDGUARD="Armored Guard", +BARRAGE="Barrage", +ARMORATTACK="Armor Attack", +CASENHANCED="CAS Enhanced", +HOVER="Hover", +LANDATCOORDINATE="Land at Coordinate", +GROUNDATTACK="Ground Attack", +CARGOTRANSPORT="Cargo Transport", +RELOCATECOHORT="Relocate Cohort", +AIRDEFENSE="Air Defence", +EWR="Early Warning Radar", +REARMING="Rearming", +CAPTUREZONE="Capture Zone", +NOTHING="Nothing", +PATROLRACETRACK="Patrol Racetrack", +STRAFING="Strafing", +} +AUFTRAG.SpecialTask={ +FORMATION="Formation", +PATROLZONE="PatrolZone", +RECON="ReconMission", +AMMOSUPPLY="Ammo Supply", +FUELSUPPLY="Fuel Supply", +ALERT5="Alert5", +ONGUARD="On Guard", +ARMOREDGUARD="ArmoredGuard", +BARRAGE="Barrage", +ARMORATTACK="AmorAttack", +HOVER="Hover", +GROUNDATTACK="Ground Attack", +FERRY="Ferry", +RELOCATECOHORT="Relocate Cohort", +AIRDEFENSE="Air Defense", +EWR="Early Warning Radar", +RECOVERYTANKER="Recovery Tanker", +REARMING="Rearming", +CAPTUREZONE="Capture Zone", +NOTHING="Nothing", +PATROLRACETRACK="Patrol Racetrack", +} +AUFTRAG.Status={ +PLANNED="planned", +QUEUED="queued", +REQUESTED="requested", +SCHEDULED="scheduled", +STARTED="started", +EXECUTING="executing", +DONE="done", +CANCELLED="cancelled", +SUCCESS="success", +FAILED="failed", +} +AUFTRAG.GroupStatus={ +SCHEDULED="scheduled", +STARTED="started", +EXECUTING="executing", +PAUSED="paused", +DONE="done", +CANCELLED="cancelled", +} +AUFTRAG.TargetType={ +GROUP="Group", +UNIT="Unit", +STATIC="Static", +COORDINATE="Coordinate", +AIRBASE="Airbase", +SETGROUP="SetGroup", +SETUNIT="SetUnit", +} +AUFTRAG.Category={ +ALL="All", +AIRCRAFT="Aircraft", +AIRPLANE="Airplane", +HELICOPTER="Helicopter", +GROUND="Ground", +NAVAL="Naval", +} +AUFTRAG.version="1.2.1" +function AUFTRAG:New(Type) +local self=BASE:Inherit(self,FSM:New()) +_AUFTRAGSNR=_AUFTRAGSNR+1 +self.type=Type +self.auftragsnummer=_AUFTRAGSNR +self:_SetLogID() +self.status=AUFTRAG.Status.PLANNED +self:SetName() +self:SetPriority() +self:SetTime() +self:SetRequiredAssets() +self.engageAsGroup=true +self.dTevaluate=5 +self.repeated=0 +self.repeatedSuccess=0 +self.repeatedFailure=0 +self.Nrepeat=0 +self.NrepeatFailure=0 +self.NrepeatSuccess=0 +self.Ncasualties=0 +self.Nkills=0 +self.Nelements=0 +self.Ngroups=0 +self.Nassigned=nil +self.Ndead=0 +self:SetStartState(self.status) +self:AddTransition("*","Planned",AUFTRAG.Status.PLANNED) +self:AddTransition(AUFTRAG.Status.PLANNED,"Queued",AUFTRAG.Status.QUEUED) +self:AddTransition(AUFTRAG.Status.QUEUED,"Requested",AUFTRAG.Status.REQUESTED) +self:AddTransition(AUFTRAG.Status.REQUESTED,"Scheduled",AUFTRAG.Status.SCHEDULED) +self:AddTransition(AUFTRAG.Status.PLANNED,"Scheduled",AUFTRAG.Status.SCHEDULED) +self:AddTransition(AUFTRAG.Status.SCHEDULED,"Started",AUFTRAG.Status.STARTED) +self:AddTransition(AUFTRAG.Status.STARTED,"Executing",AUFTRAG.Status.EXECUTING) +self:AddTransition("*","Done",AUFTRAG.Status.DONE) +self:AddTransition("*","Cancel",AUFTRAG.Status.CANCELLED) +self:AddTransition("*","Success",AUFTRAG.Status.SUCCESS) +self:AddTransition("*","Failed",AUFTRAG.Status.FAILED) +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","*") +self:AddTransition("*","Repeat",AUFTRAG.Status.PLANNED) +self:AddTransition("*","ElementDestroyed","*") +self:AddTransition("*","GroupDead","*") +self:AddTransition("*","AssetDead","*") +self:__Status(-1) +return self +end +function AUFTRAG:NewANTISHIP(Target,Altitude) +local mission=AUFTRAG:New(AUFTRAG.Type.ANTISHIP) +mission:_TargetFromObject(Target) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 2000) +mission.missionTask=ENUMS.MissionTask.ANTISHIPSTRIKE +mission.missionAltitude=mission.engageAltitude +mission.missionFraction=0.4 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewHOVER(Coordinate,Altitude,Time,Speed,MissionAlt) +local mission=AUFTRAG:New(AUFTRAG.Type.HOVER) +if Altitude then +mission.hoverAltitude=Coordinate:GetLandHeight()+UTILS.FeetToMeters(Altitude) +else +mission.hoverAltitude=Coordinate:GetLandHeight()+UTILS.FeetToMeters(50) +end +mission:_TargetFromObject(Coordinate) +mission.hoverSpeed=0.1 +mission.hoverTime=Time or 300 +self:SetMissionSpeed(Speed or 150) +self:SetMissionAltitude(MissionAlt or 1000) +mission.missionFraction=0.9 +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.HELICOPTER} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewLANDATCOORDINATE(Coordinate,OuterRadius,InnerRadius,Time,Speed,MissionAlt,CombatLanding,DirectionAfterLand) +local mission=AUFTRAG:New(AUFTRAG.Type.LANDATCOORDINATE) +mission:_TargetFromObject(Coordinate) +mission.stayTime=Time or 300 +mission.stayAt=Coordinate +mission.combatLand=CombatLanding +mission.directionAfter=DirectionAfterLand +self:SetMissionSpeed(Speed or 150) +self:SetMissionAltitude(MissionAlt or 1000) +if OuterRadius then +mission.stayAt=Coordinate:GetRandomCoordinateInRadius(UTILS.FeetToMeters(OuterRadius),UTILS.FeetToMeters(InnerRadius or 0)) +end +mission.missionFraction=0.9 +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.HELICOPTER} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewPATROL_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg,Formation) +local mission=AUFTRAG:New(AUFTRAG.Type.PATROLRACETRACK) +mission:_TargetFromObject(Coordinate) +if Altitude then +mission.TrackAltitude=UTILS.FeetToMeters(Altitude) +else +mission.TrackAltitude=UTILS.FeetToMeters(20000) +end +mission.TrackPoint1=Coordinate +local leg=UTILS.NMToMeters(Leg)or UTILS.NMToMeters(10) +local heading=Heading or 90 +if heading<0 or heading>360 then heading=90 end +mission.TrackPoint2=Coordinate:Translate(leg,heading,true) +mission.TrackSpeed=UTILS.IasToTas(UTILS.KnotsToKmph(Speed or 300),mission.TrackAltitude) +mission.missionSpeed=UTILS.KnotsToKmph(Speed or 300) +mission.missionAltitude=mission.TrackAltitude*0.9 +mission.missionTask=ENUMS.MissionTask.CAP +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewORBIT(Coordinate,Altitude,Speed,Heading,Leg) +local mission=AUFTRAG:New(AUFTRAG.Type.ORBIT) +mission:_TargetFromObject(Coordinate) +if Altitude then +mission.orbitAltitude=UTILS.FeetToMeters(Altitude) +else +mission.orbitAltitude=Coordinate.y +end +mission.orbitSpeed=UTILS.IasToTas(UTILS.KnotsToMps(Speed or 350),mission.orbitAltitude) +mission.missionSpeed=UTILS.KnotsToKmph(Speed or 350) +if Leg then +mission.orbitLeg=UTILS.NMToMeters(Leg) +if Heading and Heading<0 then +mission.orbitHeadingRel=true +Heading=-Heading +end +mission.orbitHeading=Heading +end +mission.missionAltitude=mission.orbitAltitude*0.9 +mission.missionFraction=0.9 +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewORBIT_CIRCLE(Coordinate,Altitude,Speed) +local mission=AUFTRAG:NewORBIT(Coordinate,Altitude,Speed) +return mission +end +function AUFTRAG:NewORBIT_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg) +Heading=Heading or math.random(360) +Leg=Leg or 10 +local mission=AUFTRAG:NewORBIT(Coordinate,Altitude,Speed,Heading,Leg) +return mission +end +function AUFTRAG:NewORBIT_GROUP(Group,Altitude,Speed,Leg,Heading,OffsetVec2,Distance) +Altitude=Altitude or 6000 +local mission=AUFTRAG:NewORBIT(Group,Altitude,Speed,Heading,Leg) +mission.updateDCSTask=true +if OffsetVec2 then +if OffsetVec2.x then +OffsetVec2.x=UTILS.NMToMeters(OffsetVec2.x) +end +if OffsetVec2.y then +OffsetVec2.y=UTILS.NMToMeters(OffsetVec2.y) +end +if OffsetVec2.r then +OffsetVec2.r=UTILS.NMToMeters(OffsetVec2.r) +end +end +mission.orbitOffsetVec2=OffsetVec2 +mission.orbitDeltaR=UTILS.NMToMeters(Distance or 5) +mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewGCICAP(Coordinate,Altitude,Speed,Heading,Leg) +local mission=AUFTRAG:NewORBIT_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg) +mission.type=AUFTRAG.Type.GCICAP +mission:_SetLogID() +mission.missionTask=ENUMS.MissionTask.INTERCEPT +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +return mission +end +function AUFTRAG:NewTANKER(Coordinate,Altitude,Speed,Heading,Leg,RefuelSystem) +local mission +if Leg==0 then +mission=AUFTRAG:NewORBIT_CIRCLE(Coordinate,Altitude,Speed) +else +mission=AUFTRAG:NewORBIT_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg) +end +mission.type=AUFTRAG.Type.TANKER +mission:_SetLogID() +mission.refuelSystem=RefuelSystem +mission.missionTask=ENUMS.MissionTask.REFUELING +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewAWACS(Coordinate,Altitude,Speed,Heading,Leg) +local mission=AUFTRAG:NewORBIT_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg) +mission.type=AUFTRAG.Type.AWACS +mission:_SetLogID() +mission.missionTask=ENUMS.MissionTask.AWACS +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewINTERCEPT(Target) +local mission=AUFTRAG:New(AUFTRAG.Type.INTERCEPT) +mission:_TargetFromObject(Target) +mission.missionTask=ENUMS.MissionTask.INTERCEPT +mission.missionFraction=0.1 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewCAP(ZoneCAP,Altitude,Speed,Coordinate,Heading,Leg,TargetTypes) +TargetTypes=UTILS.EnsureTable(TargetTypes,true) +Altitude=Altitude or 10000 +local mission=AUFTRAG:NewORBIT(Coordinate or ZoneCAP:GetCoordinate(),Altitude,Speed or 350,Heading,Leg) +mission.type=AUFTRAG.Type.CAP +mission:_SetLogID() +mission.engageZone=ZoneCAP or Coordinate +mission.engageTargetTypes=TargetTypes or{"Air"} +mission.missionTask=ENUMS.MissionTask.CAP +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.missionSpeed=UTILS.KnotsToKmph(UTILS.KnotsToAltKIAS(Speed or 350,Altitude)) +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewCAPGROUP(Grp,Altitude,Speed,RelHeading,Leg,OffsetDist,OffsetAngle,UpdateDistance,TargetTypes,EngageRange) +TargetTypes=UTILS.EnsureTable(TargetTypes,true) +local OffsetVec2={r=OffsetDist or 6,phi=OffsetAngle or 180} +Leg=Leg or 14 +local Heading=nil +if RelHeading then +Heading=-math.abs(RelHeading) +end +local mission=AUFTRAG:NewORBIT_GROUP(Grp,Altitude,Speed,Leg,Heading,OffsetVec2,UpdateDistance) +mission.type=AUFTRAG.Type.CAP +mission:_SetLogID() +local engage=EngageRange or 32 +local zoneCAPGroup=ZONE_GROUP:New("CAPGroup",Grp,UTILS.NMToMeters(engage)) +mission.engageZone=zoneCAPGroup +mission.engageTargetTypes=TargetTypes or{"Air"} +mission.missionTask=ENUMS.MissionTask.CAP +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewCAS(ZoneCAS,Altitude,Speed,Coordinate,Heading,Leg,TargetTypes) +TargetTypes=UTILS.EnsureTable(TargetTypes,true) +local mission=AUFTRAG:NewORBIT(Coordinate or ZoneCAS:GetCoordinate(),Altitude or 10000,Speed,Heading,Leg) +mission.type=AUFTRAG.Type.CAS +mission:_SetLogID() +mission.engageZone=ZoneCAS +mission.engageTargetTypes=TargetTypes or{"Helicopters","Ground Units","Light armed ships"} +mission.missionTask=ENUMS.MissionTask.CAS +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewCASENHANCED(CasZone,Altitude,Speed,RangeMax,NoEngageZoneSet,TargetTypes) +local mission=AUFTRAG:New(AUFTRAG.Type.CASENHANCED) +if type(CasZone)=="string"then +CasZone=ZONE:New(CasZone) +end +mission:_TargetFromObject(CasZone) +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.CASENHANCED) +mission:SetEngageDetected(RangeMax,TargetTypes or{"Helicopters","Ground Units","Light armed ships"},CasZone,NoEngageZoneSet) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.missionFraction=0.5 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.missionAltitude=Altitude and UTILS.FeetToMeters(Altitude)or nil +mission.dTevaluate=15 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewFAC(FacZone,Speed,Altitude,Frequency,Modulation) +local mission=AUFTRAG:New(AUFTRAG.Type.FAC) +if type(FacZone)=="string"then +FacZone=ZONE:FindByName(FacZone) +end +mission:_TargetFromObject(FacZone) +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.FAC) +mission.facFreq=Frequency or 133 +mission.facModu=Modulation or radio.modulation.AM +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.missionAltitude=Altitude and UTILS.FeetToMeters(Altitude)or nil +mission.categories={AUFTRAG.Category.AIRCRAFT,AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewFACA(Target,Designation,DataLink,Frequency,Modulation) +local mission=AUFTRAG:New(AUFTRAG.Type.FACA) +mission:_TargetFromObject(Target) +mission.facDesignation=Designation +mission.facDatalink=true +mission.facFreq=Frequency or 133 +mission.facModu=Modulation or radio.modulation.AM +mission.missionTask=ENUMS.MissionTask.AFAC +mission.missionAltitude=nil +mission.missionFraction=0.5 +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewBAI(Target,Altitude) +local mission=AUFTRAG:New(AUFTRAG.Type.BAI) +mission:_TargetFromObject(Target) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 5000) +mission.missionTask=ENUMS.MissionTask.GROUNDATTACK +mission.missionAltitude=mission.engageAltitude +mission.missionFraction=0.75 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewSEAD(Target,Altitude) +local mission=AUFTRAG:New(AUFTRAG.Type.SEAD) +mission:_TargetFromObject(Target) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) +mission.missionTask=ENUMS.MissionTask.SEAD +mission.missionAltitude=mission.engageAltitude +mission.missionFraction=0.2 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewSEADInZone(TargetZone,Altitude,TargetTypes,Duration) +local mission=AUFTRAG:New(AUFTRAG.Type.SEAD) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) +mission.engageZone=TargetZone +mission.engageTargetTypes=TargetTypes or{"Air Defence"} +mission.missionTask=ENUMS.MissionTask.SEAD +mission.missionAltitude=mission.engageAltitude +mission.missionFraction=0.2 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +mission:SetDuration(Duration or 1800) +return mission +end +function AUFTRAG:NewSTRIKE(Target,Altitude,EngageWeaponType) +local mission=AUFTRAG:New(AUFTRAG.Type.STRIKE) +mission:_TargetFromObject(Target) +mission.engageWeaponType=EngageWeaponType or ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 2000) +mission.missionTask=ENUMS.MissionTask.GROUNDATTACK +mission.missionAltitude=mission.engageAltitude +mission.missionFraction=0.75 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewBOMBING(Target,Altitude,EngageWeaponType,Divebomb) +local mission=AUFTRAG:New(AUFTRAG.Type.BOMBING) +mission:_TargetFromObject(Target) +mission.engageWeaponType=EngageWeaponType or ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) +mission.missionTask=ENUMS.MissionTask.GROUNDATTACK +mission.missionAltitude=mission.engageAltitude*0.8 +mission.missionFraction=0.5 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.NoReaction +mission.optionDivebomb=Divebomb or nil +mission.dTevaluate=5*60 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewSTRAFING(Target,Altitude,Length) +local mission=AUFTRAG:New(AUFTRAG.Type.STRAFING) +mission:_TargetFromObject(Target) +mission.engageWeaponType=805337088 +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 1000) +mission.engageLength=Length +mission.missionTask=ENUMS.MissionTask.GROUNDATTACK +mission.missionAltitude=mission.engageAltitude*0.8 +mission.missionFraction=0.5 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.NoReaction +mission.dTevaluate=5*60 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewBOMBRUNWAY(Airdrome,Altitude) +if type(Airdrome)=="string"then +Airdrome=AIRBASE:FindByName(Airdrome) +end +local mission=AUFTRAG:New(AUFTRAG.Type.BOMBRUNWAY) +mission:_TargetFromObject(Airdrome) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) +mission.missionTask=ENUMS.MissionTask.RUNWAYATTACK +mission.missionAltitude=mission.engageAltitude*0.8 +mission.missionFraction=0.75 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.dTevaluate=5*60 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewBOMBCARPET(Target,Altitude,CarpetLength) +local mission=AUFTRAG:New(AUFTRAG.Type.BOMBCARPET) +mission:_TargetFromObject(Target) +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.engageWeaponExpend=AI.Task.WeaponExpend.ALL +mission.engageAltitude=UTILS.FeetToMeters(Altitude or 25000) +mission.engageLength=CarpetLength or 500 +mission.engageAsGroup=false +mission.engageDirection=nil +mission.missionTask=ENUMS.MissionTask.GROUNDATTACK +mission.missionAltitude=mission.engageAltitude*0.8 +mission.missionFraction=0.5 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.NoReaction +mission.dTevaluate=5*60 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewGROUNDESCORT(EscortGroup,OrbitDistance,TargetTypes) +local mission=AUFTRAG:New(AUFTRAG.Type.GROUNDESCORT) +if type(EscortGroup)=="string"then +mission.escortGroupName=EscortGroup +mission:_TargetFromObject() +else +mission:_TargetFromObject(EscortGroup) +end +mission.orbitDistance=OrbitDistance and UTILS.NMToMeters(OrbitDistance)or UTILS.NMToMeters(1.5) +mission.engageTargetTypes=TargetTypes or{"Ground vehicles"} +mission.missionTask=ENUMS.MissionTask.GROUNDESCORT +mission.missionFraction=0.1 +mission.missionAltitude=100 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.EvadeFire +mission.categories={AUFTRAG.Category.HELICOPTER} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewESCORT(EscortGroup,OffsetVector,EngageMaxDistance,TargetTypes) +local mission=AUFTRAG:New(AUFTRAG.Type.ESCORT) +if type(EscortGroup)=="string"then +mission.escortGroupName=EscortGroup +mission:_TargetFromObject() +else +mission:_TargetFromObject(EscortGroup) +end +mission.escortVec3=OffsetVector or{x=-100,y=0,z=200} +mission.engageMaxDistance=EngageMaxDistance and UTILS.NMToMeters(EngageMaxDistance)or UTILS.NMToMeters(32) +mission.engageTargetTypes=TargetTypes or{"Air"} +mission.missionTask=ENUMS.MissionTask.ESCORT +mission.missionFraction=0.1 +mission.missionAltitude=1000 +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewRESCUEHELO(Carrier) +local mission=AUFTRAG:New(AUFTRAG.Type.RESCUEHELO) +mission:_TargetFromObject(Carrier) +mission.missionTask=ENUMS.MissionTask.NOTHING +mission.missionFraction=0.5 +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.NoReaction +mission.categories={AUFTRAG.Category.HELICOPTER} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewRECOVERYTANKER(Carrier,Altitude,Speed,Leg,RelHeading,OffsetDist,OffsetAngle,UpdateDistance) +local OffsetVec2={r=OffsetDist or 6,phi=OffsetAngle or 180} +Leg=Leg or 14 +Speed=Speed or 250 +local Heading=nil +if RelHeading then +Heading=-math.abs(RelHeading) +end +local mission=AUFTRAG:NewORBIT_GROUP(Carrier,Altitude,Speed,Leg,Heading,OffsetVec2,UpdateDistance) +mission.type=AUFTRAG.Type.RECOVERYTANKER +mission.missionTask=ENUMS.MissionTask.REFUELING +mission.missionFraction=0.9 +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.NoReaction +mission.categories={AUFTRAG.Category.AIRPLANE} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewTROOPTRANSPORT(TransportGroupSet,DropoffCoordinate,PickupCoordinate,PickupRadius) +local mission=AUFTRAG:New(AUFTRAG.Type.TROOPTRANSPORT) +if TransportGroupSet:IsInstanceOf("GROUP")then +mission.transportGroupSet=SET_GROUP:New() +mission.transportGroupSet:AddGroup(TransportGroupSet) +elseif TransportGroupSet:IsInstanceOf("SET_GROUP")then +mission.transportGroupSet=TransportGroupSet +else +mission:E(mission.lid.."ERROR: TransportGroupSet must be a GROUP or SET_GROUP object!") +return nil +end +mission:_TargetFromObject(mission.transportGroupSet) +mission.transportPickup=PickupCoordinate or mission:GetTargetCoordinate() +mission.transportDropoff=DropoffCoordinate +mission.transportPickupRadius=PickupRadius or 100 +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.TROOPTRANSPORT) +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.HELICOPTER,AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewCARGOTRANSPORT(StaticCargo,DropZone) +local mission=AUFTRAG:New(AUFTRAG.Type.CARGOTRANSPORT) +mission:_TargetFromObject(StaticCargo) +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.CARGOTRANSPORT) +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.categories={AUFTRAG.Category.HELICOPTER} +mission.DCStask=mission:GetDCSMissionTask() +mission.DCStask.params.groupId=StaticCargo:GetID() +mission.DCStask.params.zoneId=DropZone.ZoneID +mission.DCStask.params.zone=DropZone +mission.DCStask.params.cargo=StaticCargo +return mission +end +function AUFTRAG:NewARTY(Target,Nshots,Radius,Altitude) +local mission=AUFTRAG:New(AUFTRAG.Type.ARTY) +mission:_TargetFromObject(Target) +mission.artyShots=Nshots or nil +mission.artyRadius=Radius or 100 +mission.artyAltitude=Altitude +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=0 +mission.missionFraction=0.0 +mission.missionWaypointRadius=0.0 +mission.dTevaluate=8*60 +mission.categories={AUFTRAG.Category.GROUND,AUFTRAG.Category.NAVAL} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewBARRAGE(Zone,Heading,Angle,Radius,Altitude,Nshots) +local mission=AUFTRAG:New(AUFTRAG.Type.BARRAGE) +mission:_TargetFromObject(Zone) +mission.artyShots=Nshots +mission.artyRadius=Radius or 100 +mission.artyAltitude=Altitude +mission.artyHeading=Heading +mission.artyAngle=Angle +mission.engageWeaponType=ENUMS.WeaponFlag.Auto +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=0 +mission.missionFraction=0.0 +mission.dTevaluate=10 +mission.categories={AUFTRAG.Category.GROUND,AUFTRAG.Category.NAVAL} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewPATROLZONE(Zone,Speed,Altitude,Formation) +local mission=AUFTRAG:New(AUFTRAG.Type.PATROLZONE) +if type(Zone)=="string"then +Zone=ZONE:New(Zone) +end +mission:_TargetFromObject(Zone) +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.PATROLZONE) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.missionAltitude=Altitude and UTILS.FeetToMeters(Altitude)or nil +mission.categories={AUFTRAG.Category.ALL} +mission.DCStask=mission:GetDCSMissionTask() +mission.DCStask.params.formation=Formation or"Off Road" +return mission +end +function AUFTRAG:NewCAPTUREZONE(OpsZone,Coalition,Speed,Altitude,Formation,StayInZoneTime) +local mission=AUFTRAG:New(AUFTRAG.Type.CAPTUREZONE) +mission:_TargetFromObject(OpsZone) +mission.coalition=Coalition +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.CAPTUREZONE) +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.StayInZoneTime=StayInZoneTime +mission.missionFraction=0.1 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.missionAltitude=Altitude and UTILS.FeetToMeters(Altitude)or nil +mission.categories={AUFTRAG.Category.ALL} +mission.DCStask=mission:GetDCSMissionTask() +mission.updateDCSTask=true +local params={} +params.formation=Formation or"Off Road" +params.zone=mission:GetObjective() +params.altitude=mission.missionAltitude +params.speed=mission.missionSpeed and UTILS.KmphToMps(mission.missionSpeed)or nil +mission.DCStask.params=params +return mission +end +function AUFTRAG:NewARMORATTACK(Target,Speed,Formation) +local mission=AUFTRAG:NewGROUNDATTACK(Target,Speed,Formation) +mission.type=AUFTRAG.Type.ARMORATTACK +return mission +end +function AUFTRAG:NewGROUNDATTACK(Target,Speed,Formation) +local mission=AUFTRAG:New(AUFTRAG.Type.GROUNDATTACK) +mission:_TargetFromObject(Target) +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.GROUNDATTACK) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.optionFormation="On Road" +mission.missionFraction=0.70 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +mission.DCStask.params.speed=mission.missionSpeed and UTILS.KmphToMps(mission.missionSpeed)or nil +mission.DCStask.params.formation=Formation or ENUMS.Formation.Vehicle.Vee +return mission +end +function AUFTRAG:NewRECON(ZoneSet,Speed,Altitude,Adinfinitum,Randomly,Formation) +local mission=AUFTRAG:New(AUFTRAG.Type.RECON) +mission:_TargetFromObject(ZoneSet) +if ZoneSet:IsInstanceOf("SET_ZONE")then +mission.missionZoneSet=ZoneSet +elseif ZoneSet:IsInstanceOf("ZONE_BASE")then +mission.missionZoneSet=SET_ZONE:New() +mission.missionZoneSet:AddZone(ZoneSet) +end +mission.missionTask=mission:GetMissionTaskforMissionType(AUFTRAG.Type.RECON) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.PassiveDefense +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=0.5 +mission.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +mission.missionAltitude=Altitude and UTILS.FeetToMeters(Altitude)or UTILS.FeetToMeters(2000) +mission.categories={AUFTRAG.Category.ALL} +mission.DCStask=mission:GetDCSMissionTask() +mission.DCStask.params.adinfinitum=Adinfinitum +mission.DCStask.params.randomly=Randomly +mission.DCStask.params.formation=Formation +return mission +end +function AUFTRAG:NewAMMOSUPPLY(Zone) +local mission=AUFTRAG:New(AUFTRAG.Type.AMMOSUPPLY) +mission:_TargetFromObject(Zone) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.missionWaypointRadius=0 +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewFUELSUPPLY(Zone) +local mission=AUFTRAG:New(AUFTRAG.Type.FUELSUPPLY) +mission:_TargetFromObject(Zone) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewREARMING(Zone) +local mission=AUFTRAG:New(AUFTRAG.Type.REARMING) +mission:_TargetFromObject(Zone) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.missionWaypointRadius=0 +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewALERT5(MissionType) +local mission=AUFTRAG:New(AUFTRAG.Type.ALERT5) +mission.missionTask=self:GetMissionTaskforMissionType(MissionType) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionROT=ENUMS.ROT.NoReaction +mission.alert5MissionType=MissionType +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.AIRCRAFT} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewONGUARD(Coordinate) +local mission=AUFTRAG:New(AUFTRAG.Type.ONGUARD) +mission:_TargetFromObject(Coordinate) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND,AUFTRAG.Category.NAVAL} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewAIRDEFENSE(Zone) +local mission=AUFTRAG:New(AUFTRAG.Type.AIRDEFENSE) +mission:_TargetFromObject(Zone) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND,AUFTRAG.Category.NAVAL} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewEWR(Zone) +local mission=AUFTRAG:New(AUFTRAG.Type.EWR) +mission:_TargetFromObject(Zone) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:_NewRELOCATECOHORT(Legion,Cohort) +local mission=AUFTRAG:New(AUFTRAG.Type.RELOCATECOHORT) +mission:_TargetFromObject(Legion.spawnzone) +mission.optionROE=ENUMS.ROE.ReturnFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=0.0 +mission.categories={AUFTRAG.Category.ALL} +mission.DCStask=mission:GetDCSMissionTask() +if Cohort.isGround then +mission.optionFormation=ENUMS.Formation.Vehicle.OnRoad +end +mission.DCStask.params.legion=Legion +mission.DCStask.params.cohort=Cohort +return mission +end +function AUFTRAG:NewNOTHING(RelaxZone) +local mission=AUFTRAG:New(AUFTRAG.Type.NOTHING) +mission:_TargetFromObject(RelaxZone) +mission.optionROE=ENUMS.ROE.WeaponHold +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND,AUFTRAG.Category.NAVAL} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewARMOREDGUARD(Coordinate,Formation) +local mission=AUFTRAG:New(AUFTRAG.Type.ARMOREDGUARD) +mission:_TargetFromObject(Coordinate) +mission.optionROE=ENUMS.ROE.OpenFire +mission.optionAlarm=ENUMS.AlarmState.Auto +mission.optionFormation=Formation or"On Road" +mission.missionFraction=1.0 +mission.categories={AUFTRAG.Category.GROUND} +mission.DCStask=mission:GetDCSMissionTask() +return mission +end +function AUFTRAG:NewFromTarget(Target,MissionType) +local mission=nil +if MissionType==AUFTRAG.Type.ANTISHIP then +mission=self:NewANTISHIP(Target,Altitude) +elseif MissionType==AUFTRAG.Type.ARTY then +mission=self:NewARTY(Target,Nshots,Radius) +elseif MissionType==AUFTRAG.Type.BAI then +mission=self:NewBAI(Target,Altitude) +elseif MissionType==AUFTRAG.Type.BOMBCARPET then +mission=self:NewBOMBCARPET(Target,Altitude,CarpetLength) +elseif MissionType==AUFTRAG.Type.BOMBING then +mission=self:NewBOMBING(Target,Altitude) +elseif MissionType==AUFTRAG.Type.BOMBRUNWAY then +mission=self:NewBOMBRUNWAY(Target,Altitude) +elseif MissionType==AUFTRAG.Type.STRAFING then +mission=self:NewSTRAFING(Target,Altitude) +elseif MissionType==AUFTRAG.Type.CAS then +mission=self:NewCAS(ZONE_RADIUS:New(Target:GetName(),Target:GetVec2(),1000),Altitude,Speed,Target:GetAverageCoordinate(),Heading,Leg,TargetTypes) +elseif MissionType==AUFTRAG.Type.CASENHANCED then +mission=self:NewCASENHANCED(ZONE_RADIUS:New(Target:GetName(),Target:GetVec2(),1000),Altitude,Speed,RangeMax,NoEngageZoneSet,TargetTypes) +elseif MissionType==AUFTRAG.Type.INTERCEPT then +mission=self:NewINTERCEPT(Target) +elseif MissionType==AUFTRAG.Type.SEAD then +mission=self:NewSEAD(Target,Altitude) +elseif MissionType==AUFTRAG.Type.STRIKE then +mission=self:NewSTRIKE(Target,Altitude) +elseif MissionType==AUFTRAG.Type.ARMORATTACK then +mission=self:NewARMORATTACK(Target,Speed) +elseif MissionType==AUFTRAG.Type.GROUNDATTACK then +mission=self:NewGROUNDATTACK(Target,Speed,Formation) +else +return nil +end +return mission +end +function AUFTRAG:_DetermineAuftragType(Target) +local group=nil +local airbase=nil +local scenery=nil +local coordinate=nil +local auftrag=nil +if Target:IsInstanceOf("GROUP")then +group=Target +elseif Target:IsInstanceOf("UNIT")then +group=Target:GetGroup() +elseif Target:IsInstanceOf("AIRBASE")then +airbase=Target +elseif Target:IsInstanceOf("SCENERY")then +scenery=Target +end +if group then +local category=group:GetCategory() +local attribute=group:GetAttribute() +if category==Group.Category.AIRPLANE or category==Group.Category.HELICOPTER then +auftrag=AUFTRAG.Type.INTERCEPT +elseif category==Group.Category.GROUND or category==Group.Category.TRAIN then +if attribute==GROUP.Attribute.GROUND_SAM then +auftrag=AUFTRAG.Type.SEAD +elseif attribute==GROUP.Attribute.GROUND_AAA then +auftrag=AUFTRAG.Type.BAI +elseif attribute==GROUP.Attribute.GROUND_ARTILLERY then +auftrag=AUFTRAG.Type.BAI +elseif attribute==GROUP.Attribute.GROUND_INFANTRY then +auftrag=AUFTRAG.Type.CAS +elseif attribute==GROUP.Attribute.GROUND_TANK then +auftrag=AUFTRAG.Type.BAI +else +auftrag=AUFTRAG.Type.BAI +end +elseif category==Group.Category.SHIP then +auftrag=AUFTRAG.Type.ANTISHIP +else +self:T(self.lid.."ERROR: Unknown Group category!") +end +elseif airbase then +auftrag=AUFTRAG.Type.BOMBRUNWAY +elseif scenery then +auftrag=AUFTRAG.Type.STRIKE +elseif coordinate then +auftrag=AUFTRAG.Type.BOMBING +end +return auftrag +end +function AUFTRAG:NewAUTO(EngageGroup) +local mission=nil +local Target=EngageGroup +local auftrag=self:_DetermineAuftragType(EngageGroup) +if auftrag==AUFTRAG.Type.ANTISHIP then +mission=AUFTRAG:NewANTISHIP(Target) +elseif auftrag==AUFTRAG.Type.ARTY then +mission=AUFTRAG:NewARTY(Target) +elseif auftrag==AUFTRAG.Type.AWACS then +mission=AUFTRAG:NewAWACS(Coordinate,Altitude,Speed,Heading,Leg) +elseif auftrag==AUFTRAG.Type.BAI then +mission=AUFTRAG:NewBAI(Target,Altitude) +elseif auftrag==AUFTRAG.Type.BOMBING then +mission=AUFTRAG:NewBOMBING(Target,Altitude) +elseif auftrag==AUFTRAG.Type.BOMBRUNWAY then +mission=AUFTRAG:NewBOMBRUNWAY(Airdrome,Altitude) +elseif auftrag==AUFTRAG.Type.BOMBCARPET then +mission=AUFTRAG:NewBOMBCARPET(Target,Altitude,CarpetLength) +elseif auftrag==AUFTRAG.Type.CAP then +mission=AUFTRAG:NewCAP(ZoneCAP,Altitude,Speed,Coordinate,Heading,Leg,TargetTypes) +elseif auftrag==AUFTRAG.Type.CAS then +mission=AUFTRAG:NewCAS(ZoneCAS,Altitude,Speed,Coordinate,Heading,Leg,TargetTypes) +elseif auftrag==AUFTRAG.Type.ESCORT then +mission=AUFTRAG:NewESCORT(EscortGroup,OffsetVector,EngageMaxDistance,TargetTypes) +elseif auftrag==AUFTRAG.Type.FACA then +mission=AUFTRAG:NewFACA(Target,Designation,DataLink,Frequency,Modulation) +elseif auftrag==AUFTRAG.Type.FERRY then +elseif auftrag==AUFTRAG.Type.GCICAP then +mission=AUFTRAG:NewGCICAP(Coordinate,Altitude,Speed,Heading,Leg) +elseif auftrag==AUFTRAG.Type.INTERCEPT then +mission=AUFTRAG:NewINTERCEPT(Target) +elseif auftrag==AUFTRAG.Type.ORBIT then +mission=AUFTRAG:NewORBIT(Coordinate,Altitude,Speed,Heading,Leg) +elseif auftrag==AUFTRAG.Type.RECON then +mission=AUFTRAG:NewRECON(ZoneSet,Speed,Altitude,Adinfinitum,Randomly,Formation) +elseif auftrag==AUFTRAG.Type.RESCUEHELO then +mission=AUFTRAG:NewRESCUEHELO(Carrier) +elseif auftrag==AUFTRAG.Type.SEAD then +mission=AUFTRAG:NewSEAD(Target,Altitude) +elseif auftrag==AUFTRAG.Type.STRIKE then +mission=AUFTRAG:NewSTRIKE(Target,Altitude) +elseif auftrag==AUFTRAG.Type.TANKER then +mission=AUFTRAG:NewTANKER(Coordinate,Altitude,Speed,Heading,Leg,RefuelSystem) +elseif auftrag==AUFTRAG.Type.TROOPTRANSPORT then +mission=AUFTRAG:NewTROOPTRANSPORT(TransportGroupSet,DropoffCoordinate,PickupCoordinate) +elseif auftrag==AUFTRAG.Type.PATROLRACETRACK then +mission=AUFTRAG:NewPATROL_RACETRACK(Coordinate,Altitude,Speed,Heading,Leg,Formation) +else +end +if mission then +mission:SetPriority(10,true) +end +return mission +end +function AUFTRAG:SetTime(ClockStart,ClockStop) +local Tnow=timer.getAbsTime() +local Tstart=Tnow+5 +if ClockStart and type(ClockStart)=="number"then +Tstart=Tnow+ClockStart +elseif ClockStart and type(ClockStart)=="string"then +Tstart=UTILS.ClockToSeconds(ClockStart) +end +local Tstop=nil +if ClockStop and type(ClockStop)=="number"then +Tstop=Tnow+ClockStop +elseif ClockStop and type(ClockStop)=="string"then +Tstop=UTILS.ClockToSeconds(ClockStop) +end +self.Tstart=Tstart +self.Tstop=Tstop +if Tstop then +self.duration=self.Tstop-self.Tstart +end +return self +end +function AUFTRAG:SetDuration(Duration) +self.durationExe=Duration +return self +end +function AUFTRAG:SetTeleport(Switch) +if Switch==nil then +Switch=true +end +self.teleport=Switch +return self +end +function AUFTRAG:SetReturnToLegion(Switch) +self.legionReturn=Switch +self:T(self.lid..string.format("Setting ReturnToLetion=%s",tostring(self.legionReturn))) +return self +end +function AUFTRAG:SetPushTime(ClockPush) +if ClockPush then +if type(ClockPush)=="string"then +self.Tpush=UTILS.ClockToSeconds(ClockPush) +elseif type(ClockPush)=="number"then +self.Tpush=timer.getAbsTime()+ClockPush +end +end +return self +end +function AUFTRAG:SetPriority(Prio,Urgent,Importance) +self.prio=Prio or 50 +self.urgent=Urgent +self.importance=Importance +return self +end +function AUFTRAG:SetRepeat(Nrepeat) +self.Nrepeat=Nrepeat or 0 +return self +end +function AUFTRAG:SetRepeatDelay(RepeatDelay) +self.repeatDelay=RepeatDelay +return self +end +function AUFTRAG:SetRepeatOnFailure(Nrepeat) +self.NrepeatFailure=Nrepeat or 0 +return self +end +function AUFTRAG:SetRepeatOnSuccess(Nrepeat) +self.NrepeatSuccess=Nrepeat or 0 +return self +end +function AUFTRAG:SetReinforce(Nreinforce) +self.reinforce=Nreinforce +return self +end +function AUFTRAG:SetRequiredAssets(NassetsMin,NassetsMax) +self.NassetsMin=NassetsMin or 1 +self.NassetsMax=NassetsMax or self.NassetsMin +if self.NassetsMax<self.NassetsMin then +self.NassetsMax=self.NassetsMin +end +return self +end +function AUFTRAG:GetRequiredAssets() +local Nmin=self.NassetsMin +local Nmax=self.NassetsMax +if self.type==AUFTRAG.Type.RELOCATECOHORT then +local cohort=self.DCStask.params.cohort +Nmin=#cohort.assets +Nmax=Nmin +else +if self:IsExecuting()and self.reinforce and self.reinforce>0 then +local N=self:CountOpsGroups() +if N<Nmin then +Nmin=math.min(Nmin-N,self.reinforce) +Nmax=Nmin +self:T(self.lid..string.format("FF Executing Nmin=%d, N=%d, Nreinfoce=%d ==> Nmin=%d",self.NassetsMin,N,self.reinforce,Nmin)) +end +end +end +return Nmin,Nmax +end +function AUFTRAG:SetAssetsStayAlive(Switch) +if Switch==nil then +Switch=true +end +self.assetStayAlive=Switch +return self +end +function AUFTRAG:SetRequiredEscorts(NescortMin,NescortMax,MissionType,TargetTypes,EngageRange) +self.NescortMin=NescortMin or 1 +self.NescortMax=NescortMax or self.NescortMin +if self.NescortMax<self.NescortMin then +self.NescortMax=self.NescortMin +end +self.escortMissionType=MissionType +self.escortTargetTypes=TargetTypes +self.escortEngageRange=EngageRange or 32 +self:T(self.lid..string.format("NescortMin=%s, NescortMax=%s",tostring(self.NescortMin),tostring(self.NescortMax))) +return self +end +function AUFTRAG:SetName(Name) +self.name=Name or string.format("Auftrag Nr. %d",self.auftragsnummer) +return self +end +function AUFTRAG:SetEnableMarkers(Coalition) +self.markerOn=true +self.markerCoaliton=Coalition or-1 +return self +end +function AUFTRAG:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function AUFTRAG:SetWeaponType(WeaponType) +self.engageWeaponType=WeaponType or ENUMS.WeaponFlag.Auto +self.DCStask=self:GetDCSMissionTask() +return self +end +function AUFTRAG:SetWeaponExpend(WeaponExpend) +self.engageWeaponExpend=WeaponExpend or"Auto" +self.DCStask=self:GetDCSMissionTask() +return self +end +function AUFTRAG:SetEngageAsGroup(Switch) +if Switch==nil then +Switch=true +end +self.engageAsGroup=Switch +self.DCStask=self:GetDCSMissionTask() +return self +end +function AUFTRAG:SetEngageAltitude(Altitude) +self.engageAltitude=UTILS.FeetToMeters(Altitude or 6000) +self.DCStask=self:GetDCSMissionTask() +return self +end +function AUFTRAG:SetEngageDetected(RangeMax,TargetTypes,EngageZoneSet,NoEngageZoneSet) +if TargetTypes then +if type(TargetTypes)~="table"then +TargetTypes={TargetTypes} +end +else +TargetTypes={"All"} +end +if EngageZoneSet and EngageZoneSet:IsInstanceOf("ZONE_BASE")then +local zoneset=SET_ZONE:New():AddZone(EngageZoneSet) +EngageZoneSet=zoneset +end +if NoEngageZoneSet and NoEngageZoneSet:IsInstanceOf("ZONE_BASE")then +local zoneset=SET_ZONE:New():AddZone(NoEngageZoneSet) +NoEngageZoneSet=zoneset +end +self.engagedetectedOn=true +self.engagedetectedRmax=UTILS.NMToMeters(RangeMax or 25) +self.engagedetectedTypes=TargetTypes +self.engagedetectedEngageZones=EngageZoneSet +self.engagedetectedNoEngageZones=NoEngageZoneSet +return self +end +function AUFTRAG:SetMissionAltitude(Altitude) +self.missionAltitude=UTILS.FeetToMeters(Altitude) +return self +end +function AUFTRAG:SetMissionSpeed(Speed) +self.missionSpeed=Speed and UTILS.KnotsToKmph(Speed)or nil +return self +end +function AUFTRAG:SetMissionRange(Range) +self.engageRange=UTILS.NMToMeters(Range or 100) +return self +end +function AUFTRAG:SetOpsTransport(OpsTransport) +self.opstransport=OpsTransport +return self +end +function AUFTRAG:GetOpsTransport() +return self.opstransport +end +function AUFTRAG:SetRequiredTransport(DeployZone,NcarriersMin,NcarriersMax,DisembarkZone,Categories,Attributes,Properties) +self.transportDeployZone=DeployZone +self.transportDisembarkZone=DisembarkZone +self:SetRequiredCarriers(NcarriersMin,NcarriersMax,Categories,Attributes,Properties) +return self +end +function AUFTRAG:AddTransportCarriers(Carriers) +if self.opstransport then +if Carriers:IsInstanceOf("SET_OPSGROUP")then +for _,_carrier in pairs(Carriers.Set)do +local carrier=_carrier +carrier:AddOpsTransport(self.opstransport) +end +elseif Carriers:IsInstanceOf("OPSGROUP")then +Carriers:AddOpsTransport(self.opstransport) +end +end +return self +end +function AUFTRAG:SetRequiredAttribute(Attributes) +self.attributes=UTILS.EnsureTable(Attributes,true) +return self +end +function AUFTRAG:SetRequiredProperty(Properties) +self.properties=UTILS.EnsureTable(Properties,true) +return self +end +function AUFTRAG:SetRequiredCarriers(NcarriersMin,NcarriersMax,Categories,Attributes,Properties) +self.NcarriersMin=NcarriersMin or 1 +self.NcarriersMax=NcarriersMax or self.NcarriersMin +if self.NcarriersMax<self.NcarriersMin then +self.NcarriersMax=self.NcarriersMin +end +self.carrierCategories=UTILS.EnsureTable(Categories,true) +self.carrierAttributes=UTILS.EnsureTable(Attributes,true) +self.carrierProperties=UTILS.EnsureTable(Properties,true) +return self +end +function AUFTRAG:SetProhibitAfterburner() +self.prohibitAB=true +return self +end +function AUFTRAG:SetAllowAfterburner() +self.prohibitAB=false +return self +end +function AUFTRAG:SetProhibitAfterburnerExecutePhase() +self.prohibitABExecute=true +return self +end +function AUFTRAG:SetAllowAfterburnerExecutePhase() +self.prohibitABExecute=false +return self +end +function AUFTRAG:AssignCohort(Cohort) +self.specialCohorts=self.specialCohorts or{} +self:T3(self.lid..string.format("Assigning cohort %s",tostring(Cohort.name))) +table.insert(self.specialCohorts,Cohort) +return self +end +function AUFTRAG:AssignLegion(Legion) +self.specialLegions=self.specialLegions or{} +self:T3(self.lid..string.format("Assigning Legion %s",tostring(Legion.alias))) +table.insert(self.specialLegions,Legion) +return self +end +function AUFTRAG:AssignSquadrons(Squadrons) +for _,_squad in pairs(Squadrons)do +local squadron=_squad +self:T(self.lid..string.format("Assigning squadron %s",tostring(squadron.name))) +self:AssignCohort(squadron) +end +return self +end +function AUFTRAG:AssignTransportLegion(Legion) +self.transportLegions=self.transportLegions or{} +table.insert(self.transportLegions,Legion) +return self +end +function AUFTRAG:AssignTransportCohort(Cohort) +self.transportCohorts=self.transportCohorts or{} +table.insert(self.transportCohorts,Cohort) +return self +end +function AUFTRAG:AssignEscortLegion(Legion) +self.escortLegions=self.escortLegions or{} +table.insert(self.escortLegions,Legion) +return self +end +function AUFTRAG:AssignEscortCohort(Cohort) +self.escortCohorts=self.escortCohorts or{} +table.insert(self.escortCohorts,Cohort) +return self +end +function AUFTRAG:SetROE(roe) +self.optionROE=roe +return self +end +function AUFTRAG:SetROT(rot) +self.optionROT=rot +return self +end +function AUFTRAG:SetAlarmstate(Alarmstate) +self.optionAlarm=Alarmstate +return self +end +function AUFTRAG:SetEPLRS(OnOffSwitch) +if OnOffSwitch==nil then +self.optionEPLRS=true +else +self.optionEPLRS=OnOffSwitch +end +return self +end +function AUFTRAG:SetEmission(OnOffSwitch) +if OnOffSwitch==nil then +self.optionEmission=true +else +self.optionEmission=OnOffSwitch +end +return self +end +function AUFTRAG:SetInvisible(OnOffSwitch) +if OnOffSwitch==nil then +self.optionInvisible=true +else +self.optionInvisible=OnOffSwitch +end +return self +end +function AUFTRAG:SetImmortal(OnOffSwitch) +if OnOffSwitch==nil then +self.optionImmortal=true +else +self.optionImmortal=OnOffSwitch +end +return self +end +function AUFTRAG:SetFormation(Formation) +self.optionFormation=Formation +return self +end +function AUFTRAG:SetRadio(Frequency,Modulation) +self.radio={} +self.radio.Freq=Frequency +self.radio.Modu=Modulation +return self +end +function AUFTRAG:SetTACAN(Channel,Morse,UnitName,Band) +self.tacan={} +self.tacan.Channel=Channel +self.tacan.Morse=Morse or"XXX" +self.tacan.UnitName=UnitName +self.tacan.Band=Band +return self +end +function AUFTRAG:SetICLS(Channel,Morse,UnitName) +self.icls={} +self.icls.Channel=Channel +self.icls.Morse=Morse or"XXX" +self.icls.UnitName=UnitName +return self +end +function AUFTRAG:SetEvaluationTime(Teval) +self.dTevaluate=Teval or 60 +return self +end +function AUFTRAG:GetType() +return self.type +end +function AUFTRAG:GetName() +return self.name +end +function AUFTRAG:GetNumberOfRequiredAssets() +return self.Nassets or self.NassetsMin +end +function AUFTRAG:GetPriority() +return self.prio +end +function AUFTRAG:GetCasualties() +return self.Ncasualties or 0 +end +function AUFTRAG:GetKills() +return self.Nkills or 0 +end +function AUFTRAG:IsUrgent() +return self.urgent +end +function AUFTRAG:GetImportance() +return self.importance +end +function AUFTRAG:AddConditionStart(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionStart,condition) +return self +end +function AUFTRAG:AddConditionSuccess(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionSuccess,condition) +self.conditionSuccessSet=true +return self +end +function AUFTRAG:AddConditionFailure(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionFailure,condition) +self.conditionFailureSet=true +return self +end +function AUFTRAG:AddConditionPush(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionPush,condition) +return self +end +function AUFTRAG:AddRequiredPayload(Payload) +self.payloads=self.payloads or{} +table.insert(self.payloads,Payload) +return self +end +function AUFTRAG:AddOpsGroup(OpsGroup) +self:T(self.lid..string.format("Adding Ops group %s",OpsGroup.groupname)) +local groupdata={} +groupdata.opsgroup=OpsGroup +groupdata.status=AUFTRAG.GroupStatus.SCHEDULED +groupdata.waypointcoordinate=nil +groupdata.waypointindex=nil +groupdata.waypointtask=nil +self.groupdata[OpsGroup.groupname]=groupdata +if self.opstransport then +for _,_tzc in pairs(self.opstransport.tzCombos)do +local tzc=_tzc +if tzc.assetsCargo and tzc.assetsCargo[OpsGroup:GetName()]then +self.opstransport:AddCargoGroups(OpsGroup,tzc) +end +end +end +return self +end +function AUFTRAG:DelOpsGroup(OpsGroup) +self:T(self.lid..string.format("Removing OPS group %s",OpsGroup and OpsGroup.groupname or"nil (ERROR)!")) +if OpsGroup then +OpsGroup:RemoveMission(self) +self.groupdata[OpsGroup.groupname]=nil +end +return self +end +function AUFTRAG:IsPlanned() +return self.status==AUFTRAG.Status.PLANNED +end +function AUFTRAG:IsQueued(Legion) +local is=self.status==AUFTRAG.Status.QUEUED +if Legion then +is=self:GetLegionStatus(Legion)==AUFTRAG.Status.QUEUED +end +return is +end +function AUFTRAG:IsRequested(Legion) +local is=self.status==AUFTRAG.Status.REQUESTED +if Legion then +is=self:GetLegionStatus(Legion)==AUFTRAG.Status.REQUESTED +end +return is +end +function AUFTRAG:IsScheduled() +return self.status==AUFTRAG.Status.SCHEDULED +end +function AUFTRAG:IsStarted() +return self.status==AUFTRAG.Status.STARTED +end +function AUFTRAG:IsExecuting(AllGroups) +local isExecuting=self.status==AUFTRAG.Status.EXECUTING +if AllGroups and isExecuting then +local n=self:CountOpsGroupsInStatus(AUFTRAG.GroupStatus.EXECUTING) +local N +if self.Nassigned then +N=self.Nassigned-self.Ndead +else +N=self:CountOpsGroups() +end +if n==N then +return true +else +return false +end +end +return isExecuting +end +function AUFTRAG:IsCancelled() +return self.status==AUFTRAG.Status.CANCELLED +end +function AUFTRAG:IsDone() +return self.status==AUFTRAG.Status.DONE +end +function AUFTRAG:IsSuccess() +return self.status==AUFTRAG.Status.SUCCESS +end +function AUFTRAG:IsOver() +local over=self.status==AUFTRAG.Status.DONE or self.status==AUFTRAG.Status.CANCELLED or self.status==AUFTRAG.Status.SUCCESS or self.status==AUFTRAG.Status.FAILED +return over +end +function AUFTRAG:IsRepeatable() +local repeatmeS=self.repeatedSuccess<self.NrepeatSuccess or self.repeated<self.Nrepeat +local repeatmeF=self.repeatedFailure<self.NrepeatFailure or self.repeated<self.Nrepeat +if repeatmeS==true or repeatmeF==true then return true else return false end +return false +end +function AUFTRAG:IsNotRepeatable() +return not self:IsRepeatable() +end +function AUFTRAG:IsNotOver() +return not self:IsOver() +end +function AUFTRAG:IsAircraft() +for _,category in pairs(self.categories)do +if category==AUFTRAG.Category.AIRCRAFT or category==AUFTRAG.Category.AIRPLANE or category==AUFTRAG.Category.HELICOPTER then +return true +end +end +return false +end +function AUFTRAG:IsAirplane() +for _,category in pairs(self.categories)do +if category==AUFTRAG.Category.AIRPLANE then +return true +end +end +return false +end +function AUFTRAG:IsHelicopters() +for _,category in pairs(self.categories)do +if category==AUFTRAG.Category.HELICOPTER then +return true +end +end +return false +end +function AUFTRAG:IsGround() +for _,category in pairs(self.categories)do +if category==AUFTRAG.Category.GROUND then +return true +end +end +return false +end +function AUFTRAG:IsNaval() +for _,category in pairs(self.categories)do +if category==AUFTRAG.Category.NAVAL then +return true +end +end +return false +end +function AUFTRAG:IsReadyToGo() +local Tnow=timer.getAbsTime() +if self.Tstart and Tnow<self.Tstart then +return false +end +if self.Tstop and Tnow>self.Tstop then +return false +end +local startme=self:EvalConditionsAll(self.conditionStart) +if not startme then +return false +end +return true +end +function AUFTRAG:IsReadyToCancel() +local Tnow=timer.getAbsTime() +if self.Tstop and Tnow>=self.Tstop then +return true +end +local failure=self:EvalConditionsAny(self.conditionFailure) +if failure then +self.failurecondition=true +return true +end +local success=self:EvalConditionsAny(self.conditionSuccess) +if success then +self.successcondition=true +return true +end +return false +end +function AUFTRAG:IsReadyToPush() +local Tnow=timer.getAbsTime() +if self.Tpush and Tnow<=self.Tpush then +return false +end +local push=self:EvalConditionsAll(self.conditionPush) +return push +end +function AUFTRAG:EvalConditionsAll(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if not istrue then +return false +end +end +return true +end +function AUFTRAG:EvalConditionsAny(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if istrue then +return true +end +end +return false +end +function AUFTRAG:onafterStatus(From,Event,To) +local Tnow=timer.getAbsTime() +if self.escortGroupName then +local group=GROUP:FindByName(self.escortGroupName) +if group and group:IsAlive()then +self:T(self.lid..string.format("ESCORT group %s is now alive. Updating DCS task and adding group to TARGET",tostring(self.escortGroupName))) +self.engageTarget:AddObject(group) +self.DCStask=self:GetDCSMissionTask() +self.escortGroupName=nil +end +end +local Ntargets=self:CountMissionTargets() +local Ntargets0=self:GetTargetInitialNumber() +local Ngroups=self:CountOpsGroups() +local Nassigned=self.Nassigned and self.Nassigned-self.Ndead or 0 +local conditionDone=false +if self.conditionFailureSet then +conditionDone=self:EvalConditionsAny(self.conditionFailure) +end +if self.conditionSuccessSet and not conditionDone then +conditionDone=self:EvalConditionsAny(self.conditionSuccess) +end +if self:IsNotOver()then +if self:CheckGroupsDone()then +self:Done() +elseif(self.Tstop and Tnow>self.Tstop+10)then +self:Cancel() +elseif conditionDone then +self:Cancel() +elseif self.durationExe and self.Texecuting and Tnow-self.Texecuting>self.durationExe then +local Nrepeat=self.Nrepeat +local NrepeatS=self.NrepeatSuccess +local NrepeatF=self.NrepeatFailure +self:Cancel() +self.Nrepeat=Nrepeat +self.NrepeatSuccess=NrepeatS +self.NrepeatFailure=NrepeatF +elseif(Ntargets0>0 and Ntargets==0)then +self:T(self.lid.."No targets left cancelling mission!") +self:Cancel() +elseif self:IsExecuting()and self:_IsNotReinforcing()then +if Ngroups==0 then +self:Done() +else +local done=true +for groupname,data in pairs(self.groupdata or{})do +local groupdata=data +local opsgroup=groupdata.opsgroup +if opsgroup:IsAlive()then +done=false +end +end +if done then +self:Done() +end +end +end +end +local fsmstate=self:GetState() +if fsmstate~=self.status then +self:T(self.lid..string.format("ERROR: FSM state %s != %s mission status!",fsmstate,self.status)) +end +if self.verbose>=1 then +local Cstart=UTILS.SecondsToClock(self.Tstart,true) +local Cstop=self.Tstop and UTILS.SecondsToClock(self.Tstop,true)or"INF" +local targetname=self:GetTargetName()or"unknown" +local Nlegions=#self.legions +local commander=self.commander and self.statusCommander or"N/A" +local chief=self.chief and self.statusChief or"N/A" +self:T(self.lid..string.format("Status %s: Target=%s, T=%s-%s, assets=%d, groups=%d, targets=%d, legions=%d, commander=%s, chief=%s", +self.status,targetname,Cstart,Cstop,#self.assets,Ngroups,Ntargets,Nlegions,commander,chief)) +end +if self.verbose>=2 then +local text="Group data:" +for groupname,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +text=text..string.format("\n- %s: status mission=%s opsgroup=%s",groupname,groupdata.status,groupdata.opsgroup and groupdata.opsgroup:GetState()or"N/A") +end +self:I(self.lid..text) +end +if self.verbose>=3 then +local text=string.format("Assets [N=%d,Nassigned=%s, Ndead=%s]:",self.Nassets or 0,self.Nassigned or 0,self.Ndead or 0) +for i,_asset in pairs(self.assets or{})do +local asset=_asset +text=text..string.format("\n[%d] %s: spawned=%s, requested=%s, reserved=%s",i,asset.spawngroupname,tostring(asset.spawned),tostring(asset.requested),tostring(asset.reserved)) +end +self:I(self.lid..text) +end +local ready2evaluate=self.Tover and Tnow-self.Tover>=self.dTevaluate or false +if self:IsOver()and ready2evaluate then +self:Evaluate() +else +self:__Status(-30) +end +if self.markerOn then +self:UpdateMarker() +end +end +function AUFTRAG:Evaluate() +local failed=false +local targetdamage=self:GetTargetDamage() +local owndamage=self.Ncasualties/self.Nelements*100 +local Ntargets=self:CountMissionTargets() +local Ntargets0=self:GetTargetInitialNumber() +local Life=self:GetTargetLife() +local Life0=self:GetTargetInitialLife() +if Ntargets0>0 then +if self.type==AUFTRAG.Type.TROOPTRANSPORT or self.type==AUFTRAG.Type.ESCORT then +if Ntargets<Ntargets0 then +failed=true +end +elseif self.type==AUFTRAG.Type.CARGOTRANSPORT then +local zone=self.DCStask.params.zone +local cargo=self.DCStask.params.cargo +if cargo and zone then +failed=not cargo:IsInZone(zone) +else +failed=true +end +elseif self.type==AUFTRAG.Type.RESCUEHELO then +if self.Nelements==self.Ncasualties then +failed=true +end +else +if Ntargets>0 then +failed=true +end +end +else +if self.Nelements==self.Ncasualties then +failed=true +end +end +local successCondition=self:EvalConditionsAny(self.conditionSuccess) +local failureCondition=self:EvalConditionsAny(self.conditionFailure) +if failureCondition then +failed=true +elseif successCondition then +failed=false +end +if self.verbose>0 then +local text=string.format("Evaluating mission:\n") +text=text..string.format("Own casualties = %d/%d\n",self.Ncasualties,self.Nelements) +text=text..string.format("Own losses = %.1f %%\n",owndamage) +text=text..string.format("Killed units = %d\n",self.Nkills) +text=text..string.format("--------------------------\n") +text=text..string.format("Targets left = %d/%d\n",Ntargets,Ntargets0) +text=text..string.format("Targets life = %.1f/%.1f\n",Life,Life0) +text=text..string.format("Enemy losses = %.1f %%\n",targetdamage) +text=text..string.format("--------------------------\n") +text=text..string.format("Success Cond = %s\n",tostring(successCondition)) +text=text..string.format("Failure Cond = %s\n",tostring(failureCondition)) +text=text..string.format("--------------------------\n") +text=text..string.format("Final Success = %s\n",tostring(not failed)) +text=text..string.format("=========================") +self:I(self.lid..text) +end +if failed then +self:I(self.lid..string.format("Mission %d [%s] failed!",self.auftragsnummer,self.type)) +if self.chief then +self.chief.Nfailure=self.chief.Nfailure+1 +end +self:Failed() +else +self:I(self.lid..string.format("Mission %d [%s] success!",self.auftragsnummer,self.type)) +if self.chief then +self.chief.Nsuccess=self.chief.Nsuccess+1 +end +self:Success() +end +return self +end +function AUFTRAG:GetOpsGroups() +local opsgroups={} +for _,_groupdata in pairs(self.groupdata or{})do +local groupdata=_groupdata +table.insert(opsgroups,groupdata.opsgroup) +end +return opsgroups +end +function AUFTRAG:GetAssetDataByName(AssetName) +return self.groupdata[tostring(AssetName)] +end +function AUFTRAG:GetGroupData(opsgroup) +if opsgroup and self.groupdata then +return self.groupdata[opsgroup.groupname] +end +return nil +end +function AUFTRAG:SetGroupStatus(opsgroup,status) +local oldstatus=self:GetGroupStatus(opsgroup) +self:T(self.lid..string.format("Setting OPSGROUP %s to status %s-->%s",opsgroup and opsgroup.groupname or"nil",tostring(oldstatus),tostring(status))) +if oldstatus==AUFTRAG.GroupStatus.CANCELLED and status==AUFTRAG.GroupStatus.DONE then +else +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +groupdata.status=status +else +self:T(self.lid.."WARNING: Could not SET flight data for flight group. Setting status to DONE") +end +end +local isNotOver=self:IsNotOver() +local groupsDone=self:CheckGroupsDone() +self:T2(self.lid..string.format("Setting OPSGROUP %s status to %s. IsNotOver=%s CheckGroupsDone=%s",opsgroup.groupname,self:GetGroupStatus(opsgroup),tostring(self:IsNotOver()),tostring(groupsDone))) +if isNotOver and groupsDone then +self:T3(self.lid.."All assigned OPSGROUPs done ==> mission DONE!") +self:Done() +else +self:T3(self.lid.."Mission NOT DONE yet!") +end +return self +end +function AUFTRAG:GetGroupStatus(opsgroup) +self:T3(self.lid..string.format("Trying to get Flight status for flight group %s",opsgroup and opsgroup.groupname or"nil")) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +return groupdata.status +else +self:T(self.lid..string.format("WARNING: Could not GET groupdata for opsgroup %s. Returning status DONE.",opsgroup and opsgroup.groupname or"nil")) +return AUFTRAG.GroupStatus.DONE +end +end +function AUFTRAG:AddLegion(Legion) +self:T(self.lid..string.format("Adding legion %s",Legion.alias)) +table.insert(self.legions,Legion) +return self +end +function AUFTRAG:RemoveLegion(Legion) +for i=#self.legions,1,-1 do +local legion=self.legions[i] +if legion.alias==Legion.alias then +self:T(self.lid..string.format("Removing legion %s",Legion.alias)) +table.remove(self.legions,i) +self.statusLegion[Legion.alias]=nil +return self +end +end +self:T(self.lid..string.format("ERROR: Legion %s not found and could not be removed!",Legion.alias)) +return self +end +function AUFTRAG:SetLegionStatus(Legion,Status) +local status=self:GetLegionStatus(Legion) +self:T(self.lid..string.format("Setting LEGION %s to status %s-->%s",Legion.alias,tostring(status),tostring(Status))) +self.statusLegion[Legion.alias]=Status +return self +end +function AUFTRAG:GetLegionStatus(Legion) +local status=self.statusLegion[Legion.alias]or"unknown" +return status +end +function AUFTRAG:SetGroupWaypointCoordinate(opsgroup,coordinate) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +groupdata.waypointcoordinate=coordinate +end +return self +end +function AUFTRAG:SetIngressCoordinate(coordinate) +self.missionIngressCoord=coordinate +self.missionIngressCoordAlt=UTILS.MetersToFeet(coordinate.y)or 10000 +return self +end +function AUFTRAG:GetGroupWaypointCoordinate(opsgroup) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +return groupdata.waypointcoordinate +end +end +function AUFTRAG:SetGroupWaypointTask(opsgroup,task) +self:T2(self.lid..string.format("Setting waypoint task %s",task and task.description or"WTF")) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +groupdata.waypointtask=task +end +end +function AUFTRAG:GetGroupWaypointTask(opsgroup) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +return groupdata.waypointtask +end +end +function AUFTRAG:SetGroupWaypointIndex(opsgroup,waypointindex) +self:T2(self.lid..string.format("Setting Mission waypoint UID=%d",waypointindex)) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +groupdata.waypointindex=waypointindex +end +return self +end +function AUFTRAG:GetGroupWaypointIndex(opsgroup) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +return groupdata.waypointindex +end +end +function AUFTRAG:SetGroupEgressWaypointUID(opsgroup,waypointindex) +self:T2(self.lid..string.format("Setting Egress waypoint UID=%d",waypointindex)) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +groupdata.waypointEgressUID=waypointindex +end +return self +end +function AUFTRAG:GetGroupEgressWaypointUID(opsgroup) +local groupdata=self:GetGroupData(opsgroup) +if groupdata then +return groupdata.waypointEgressUID +end +end +function AUFTRAG:CheckGroupsDone() +local fsmState=self:GetState() +for groupname,data in pairs(self.groupdata)do +local groupdata=data +if groupdata then +if not(groupdata.status==AUFTRAG.GroupStatus.DONE or groupdata.status==AUFTRAG.GroupStatus.CANCELLED)then +self:T2(self.lid..string.format("CheckGroupsDone: OPSGROUP %s is not DONE or CANCELLED but in state %s. Mission NOT DONE!",groupdata.opsgroup.groupname,groupdata.status:upper())) +return false +end +end +end +for _,_legion in pairs(self.legions)do +local legion=_legion +local status=self:GetLegionStatus(legion) +if not status==AUFTRAG.Status.CANCELLED then +self:T2(self.lid..string.format("CheckGroupsDone: LEGION %s is not CANCELLED but in state %s. Mission NOT DONE!",legion.alias,status)) +return false +end +end +if self.commander then +if not self.statusCommander==AUFTRAG.Status.CANCELLED then +self:T2(self.lid..string.format("CheckGroupsDone: COMMANDER is not CANCELLED but in state %s. Mission NOT DONE!",self.statusCommander)) +return false +end +end +if self.chief then +if not self.statusChief==AUFTRAG.Status.CANCELLED then +self:T2(self.lid..string.format("CheckGroupsDone: CHIEF is not CANCELLED but in state %s. Mission NOT DONE!",self.statusChief)) +return false +end +end +if self:IsPlanned()or self:IsQueued()or self:IsRequested()then +self:T2(self.lid..string.format("CheckGroupsDone: Mission is still in state %s [FSM=%s] (PLANNED or QUEUED or REQUESTED). Mission NOT DONE!",self.status,self:GetState())) +return false +end +if self:IsExecuting()and self:_IsReinforcing()then +self:T2(self.lid..string.format("CheckGroupsDone: Mission is still in state %s [FSM=%s] and reinfoce=%d. Mission NOT DONE!",self.status,self:GetState(),self.reinforce)) +return false +end +if self:IsStarted()and self:CountOpsGroups()==0 then +self:T(self.lid..string.format("CheckGroupsDone: Mission is STARTED state %s [FSM=%s] but count of alive OPSGROUP is zero. Mission DONE!",self.status,self:GetState())) +return true +end +if(self:IsStarted()or self:IsExecuting())and(fsmState==AUFTRAG.Status.STARTED or fsmState==AUFTRAG.Status.EXECUTING)and self:CountOpsGroups()>0 then +self:T(self.lid..string.format("CheckGroupsDone: Mission is STARTED state %s [FSM=%s] and count of alive OPSGROUP > zero. Mission NOT DONE!",self.status,self:GetState())) +return false +end +return true +end +function AUFTRAG:OnEventUnitLost(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +for _,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +if groupdata and groupdata.opsgroup and groupdata.opsgroup.groupname==EventData.IniGroupName then +self:T(self.lid..string.format("UNIT LOST event for opsgroup %s unit %s",groupdata.opsgroup.groupname,EventData.IniUnitName)) +end +end +end +end +function AUFTRAG:onafterPlanned(From,Event,To) +self.status=AUFTRAG.Status.PLANNED +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterQueued(From,Event,To,Airwing) +self.status=AUFTRAG.Status.QUEUED +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterRequested(From,Event,To) +self.status=AUFTRAG.Status.REQUESTED +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterAssign(From,Event,To) +self.status=AUFTRAG.Status.ASSIGNED +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterScheduled(From,Event,To) +self.status=AUFTRAG.Status.SCHEDULED +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterStarted(From,Event,To) +self.status=AUFTRAG.Status.STARTED +self.Tstarted=timer.getAbsTime() +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterExecuting(From,Event,To) +self.status=AUFTRAG.Status.EXECUTING +self.Texecuting=timer.getAbsTime() +self:T(self.lid..string.format("New mission status=%s",self.status)) +end +function AUFTRAG:onafterElementDestroyed(From,Event,To,OpsGroup,Element) +self.Ncasualties=self.Ncasualties+1 +end +function AUFTRAG:onafterGroupDead(From,Event,To,OpsGroup) +local asset=self:GetAssetByName(OpsGroup.groupname) +if asset then +self:AssetDead(asset) +end +self.Ndead=self.Ndead+1 +end +function AUFTRAG:onafterAssetDead(From,Event,To,Asset) +local N=self:CountOpsGroups() +local notreinforcing=self:_IsNotReinforcing() +self:T(self.lid..string.format("Asset %s dead! Number of ops groups remaining %d (reinforcing=%s)",tostring(Asset.spawngroupname),N,tostring(not notreinforcing))) +if N==0 and notreinforcing then +if self:IsNotOver()then +self:Cancel() +else +end +end +self:DelAsset(Asset) +end +function AUFTRAG:onafterCancel(From,Event,To) +local Ngroups=self:CountOpsGroups() +self:T(self.lid..string.format("CANCELLING mission in status %s. Will wait for %d groups to report mission DONE before evaluation",self.status,Ngroups)) +self.Tover=timer.getAbsTime() +self.Nrepeat=self.repeated +self.NrepeatFailure=self.repeatedFailure +self.NrepeatSuccess=self.repeatedSuccess +self.dTevaluate=0 +if self.chief then +self:T(self.lid..string.format("CHIEF will cancel the mission. Will wait for mission DONE before evaluation!")) +self.chief:MissionCancel(self) +elseif self.commander then +self:T(self.lid..string.format("COMMANDER will cancel the mission. Will wait for mission DONE before evaluation!")) +self.commander:MissionCancel(self) +elseif self.legions and#self.legions>0 then +for _,_legion in pairs(self.legions or{})do +local legion=_legion +self:T(self.lid..string.format("LEGION %s will cancel the mission. Will wait for mission DONE before evaluation!",legion.alias)) +legion:MissionCancel(self) +end +else +self:T(self.lid..string.format("No legion, commander or chief. Attached groups will cancel the mission on their own. Will wait for mission DONE before evaluation!")) +for _,_groupdata in pairs(self.groupdata or{})do +local groupdata=_groupdata +groupdata.opsgroup:MissionCancel(self) +end +end +if self:IsPlanned()or self:IsQueued()or self:IsRequested()or Ngroups==0 then +self:T(self.lid..string.format("Cancelled mission was in %s stage with %d groups assigned and alive. Call it done!",self.status,Ngroups)) +self:Done() +end +end +function AUFTRAG:onafterDone(From,Event,To) +self.status=AUFTRAG.Status.DONE +self:T(self.lid..string.format("New mission status=%s",self.status)) +self.Tover=timer.getAbsTime() +self.Texecuting=nil +self.statusChief=AUFTRAG.Status.DONE +self.statusCommander=AUFTRAG.Status.DONE +for _,_legion in pairs(self.legions)do +local Legion=_legion +self:SetLegionStatus(Legion,AUFTRAG.Status.DONE) +if self.type==AUFTRAG.Type.RELOCATECOHORT then +local requestid=self.requestID[Legion.alias] +if requestid then +self:T(self.lid.."Removing request from pending queue") +Legion:_DeleteQueueItemByID(requestid,Legion.pending) +local Cohort=self.DCStask.params.cohort +Legion:DelCohort(Cohort) +else +self:E(self.lid.."WARNING: Could NOT remove relocation request from from pending queue (all assets were spawned?)") +end +end +end +if self.type==AUFTRAG.Type.RELOCATECOHORT then +local cohort=self.DCStask.params.cohort +cohort:Relocated() +end +end +function AUFTRAG:onafterSuccess(From,Event,To) +self.status=AUFTRAG.Status.SUCCESS +self:T(self.lid..string.format("New mission status=%s",self.status)) +self.statusChief=self.status +self.statusCommander=self.status +for _,_legion in pairs(self.legions)do +local Legion=_legion +self:SetLegionStatus(Legion,self.status) +end +local repeatme=self.repeatedSuccess<self.NrepeatSuccess or self.repeated<self.Nrepeat +if repeatme then +self.repeatedSuccess=self.repeatedSuccess+1 +local N=math.max(self.NrepeatSuccess,self.Nrepeat) +self:T(self.lid..string.format("Mission SUCCESS! Repeating mission for the %d time (max %d times) ==> Repeat mission!",self.repeated+1,N)) +self:__Repeat(self.repeatDelay) +else +self:T(self.lid..string.format("Mission SUCCESS! Number of max repeats %d reached ==> Stopping mission!",self.repeated+1)) +self:Stop() +end +end +function AUFTRAG:onafterFailed(From,Event,To) +self.status=AUFTRAG.Status.FAILED +self:T(self.lid..string.format("New mission status=%s",self.status)) +self.statusChief=self.status +self.statusCommander=self.status +for _,_legion in pairs(self.legions)do +local Legion=_legion +self:SetLegionStatus(Legion,self.status) +end +local repeatme=self.repeatedFailure<self.NrepeatFailure or self.repeated<self.Nrepeat +if repeatme then +self.repeatedFailure=self.repeatedFailure+1 +local N=math.max(self.NrepeatFailure,self.Nrepeat) +self:T(self.lid..string.format("Mission FAILED! Repeating mission for the %d time (max %d times) ==> Repeat mission!",self.repeated+1,N)) +self:__Repeat(self.repeatDelay) +else +self:T(self.lid..string.format("Mission FAILED! Number of max repeats %d reached ==> Stopping mission!",self.repeated+1)) +self:Stop() +end +end +function AUFTRAG:onbeforeRepeat(From,Event,To) +if not(self.chief or self.commander or#self.legions>0)then +self:E(self.lid.."ERROR: Mission can only be repeated by a CHIEF, COMMANDER or LEGION! Stopping AUFTRAG") +self:Stop() +return false +end +return true +end +function AUFTRAG:onafterRepeat(From,Event,To) +self.status=AUFTRAG.Status.PLANNED +self:T(self.lid..string.format("New mission status=%s (on Repeat)",self.status)) +self.statusChief=self.status +self.statusCommander=self.status +for _,_legion in pairs(self.legions)do +local Legion=_legion +self:SetLegionStatus(Legion,self.status) +end +self.repeated=self.repeated+1 +if self.chief then +self.statusChief=AUFTRAG.Status.PLANNED +if self.commander then +self.statusCommander=AUFTRAG.Status.PLANNED +end +for _,_legion in pairs(self.legions)do +local legion=_legion +legion:RemoveMission(self) +end +elseif self.commander then +self.statusCommander=AUFTRAG.Status.PLANNED +for _,_legion in pairs(self.legions)do +local legion=_legion +legion:RemoveMission(self) +self:SetLegionStatus(legion,AUFTRAG.Status.PLANNED) +end +elseif#self.legions>0 then +for _,_legion in pairs(self.legions)do +local legion=_legion +legion:RemoveMission(self) +self:SetLegionStatus(legion,AUFTRAG.Status.PLANNED) +legion:AddMission(self) +end +else +self:E(self.lid.."ERROR: Mission can only be repeated by a CHIEF, COMMANDER or LEGION! Stopping AUFTRAG") +self:Stop() +return +end +self.assets={} +for groupname,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +local opsgroup=groupdata.opsgroup +if opsgroup then +self:DelOpsGroup(opsgroup) +end +end +self.groupdata={} +self.Ncasualties=0 +self.Nelements=0 +self.Ngroups=0 +self.Nassigned=nil +self.Ndead=0 +self.DCStask=self:GetDCSMissionTask() +self:__Status(-30) +end +function AUFTRAG:onafterStop(From,Event,To) +self:T(self.lid..string.format("STOPPED mission in status=%s. Removing missions from queues. Stopping CallScheduler!",self.status)) +if self.chief then +self.chief:RemoveMission(self) +end +if self.commander then +self.commander:RemoveMission(self) +end +if#self.legions>0 then +for _,_legion in pairs(self.legions)do +local legion=_legion +legion:RemoveMission(self) +end +end +for _,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +groupdata.opsgroup:RemoveMission(self) +end +self.assets={} +self.groupdata={} +self.CallScheduler:Clear() +end +function AUFTRAG:_TargetFromObject(Object) +if not self.engageTarget then +if Object and Object:IsInstanceOf("TARGET")then +self.engageTarget=Object +else +self.engageTarget=TARGET:New(Object) +end +else +end +return self +end +function AUFTRAG:CountMissionTargets() +local N=0 +local Coalitions=self.coalition and UTILS.GetCoalitionEnemy(self.coalition,true)or nil +if self.engageTarget then +N=self.engageTarget:CountTargets(Coalitions) +end +return N +end +function AUFTRAG:GetTargetInitialNumber() +local target=self:GetTargetData() +if target then +return target.N0 +else +return 0 +end +end +function AUFTRAG:GetTargetInitialLife() +local target=self:GetTargetData() +if target then +return target.life0 +else +return 0 +end +end +function AUFTRAG:GetTargetDamage() +local target=self:GetTargetData() +if target then +return target:GetDamage() +else +return 0 +end +end +function AUFTRAG:GetTargetLife() +local target=self:GetTargetData() +if target then +return target:GetLife() +else +return 0 +end +end +function AUFTRAG:GetTargetData() +return self.engageTarget +end +function AUFTRAG:GetObjective(RefCoordinate,Coalitions) +local objective=self:GetTargetData():GetObject(RefCoordinate,Coalitions) +return objective +end +function AUFTRAG:GetTargetType() +local target=self.engageTarget +if target then +local to=target:GetObjective() +if to then +return to.Type +else +return"Unknown" +end +else +return"Unknown" +end +end +function AUFTRAG:GetTargetVec2() +local coord=self:GetTargetCoordinate() +if coord then +local vec2=coord:GetVec2() +return vec2 +end +return nil +end +function AUFTRAG:GetTargetCoordinate() +if self.transportPickup then +return self.transportPickup +elseif self.missionZoneSet and self.type==AUFTRAG.Type.RECON then +return self.missionZoneSet:GetAverageCoordinate() +elseif self.engageTarget then +local coord=self.engageTarget:GetCoordinate() +return coord +elseif self.type==AUFTRAG.Type.ALERT5 then +return nil +else +self:T(self.lid.."ERROR: Cannot get target coordinate!") +end +return nil +end +function AUFTRAG:GetTargetHeading() +if self.engageTarget then +local heading=self.engageTarget:GetHeading() +return heading +end +return nil +end +function AUFTRAG:GetTargetName() +if self.engageTarget then +local name=self.engageTarget:GetName() +return name +end +return"N/A" +end +function AUFTRAG:GetTargetDistance(FromCoord) +local TargetCoord=self:GetTargetCoordinate() +if TargetCoord and FromCoord then +return TargetCoord:Get2DDistance(FromCoord) +else +self:T(self.lid.."ERROR: TargetCoord or FromCoord does not exist in AUFTRAG:GetTargetDistance() function! Returning 0") +end +return 0 +end +function AUFTRAG:AddAsset(Asset) +self:T(self.lid..string.format("Adding asset \"%s\" to mission",tostring(Asset.spawngroupname))) +self.assets=self.assets or{} +local asset=self:GetAssetByName(Asset.spawngroupname) +if not asset then +table.insert(self.assets,Asset) +self.Nassigned=self.Nassigned or 0 +self.Nassigned=self.Nassigned+1 +end +return self +end +function AUFTRAG:_AddAssets(Assets) +for _,asset in pairs(Assets)do +self:AddAsset(asset) +end +return self +end +function AUFTRAG:DelAsset(Asset) +for i,_asset in pairs(self.assets or{})do +local asset=_asset +if asset.uid==Asset.uid then +self:T(self.lid..string.format("Removing asset \"%s\" from mission",tostring(Asset.spawngroupname))) +table.remove(self.assets,i) +return self +end +end +return self +end +function AUFTRAG:GetAssetByName(Name) +for i,_asset in pairs(self.assets or{})do +local asset=_asset +if asset.spawngroupname==Name then +return asset +end +end +return nil +end +function AUFTRAG:CountOpsGroups() +local N=0 +for _,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +if groupdata and groupdata.opsgroup and groupdata.opsgroup:IsAlive()and not groupdata.opsgroup:IsDead()then +N=N+1 +end +end +return N +end +function AUFTRAG:CountOpsGroupsInStatus(Status) +local N=0 +for _,_groupdata in pairs(self.groupdata)do +local groupdata=_groupdata +if groupdata and groupdata.status==Status then +N=N+1 +end +end +return N +end +function AUFTRAG:GetMissionTypesText(MissionTypes) +local text="" +for _,missiontype in pairs(MissionTypes)do +text=text..string.format("%s, ",missiontype) +end +return text +end +function AUFTRAG:SetMissionWaypointCoord(Coordinate) +if Coordinate:IsInstanceOf("ZONE_BASE")then +Coordinate=Coordinate:GetCoordinate() +end +self.missionWaypointCoord=Coordinate +return self +end +function AUFTRAG:SetMissionWaypointRandomization(Radius) +self.missionWaypointRadius=Radius +return self +end +function AUFTRAG:SetMissionEgressCoord(Coordinate,Altitude,Speed) +if Coordinate:IsInstanceOf("ZONE_BASE")then +Coordinate=Coordinate:GetCoordinate() +end +self.missionEgressCoord=Coordinate +if Altitude then +self.missionEgressCoord.y=UTILS.FeetToMeters(Altitude) +self.missionEgressCoordAlt=UTILS.FeetToMeters(Altitude) +end +self.missionEgressCoordSpeed=Speed and Speed or nil +return self +end +function AUFTRAG:SetMissionIngressCoord(Coordinate,Altitude,Speed) +if Coordinate:IsInstanceOf("ZONE_BASE")then +Coordinate=Coordinate:GetCoordinate() +end +self.missionIngressCoord=Coordinate +if Altitude then +self.missionIngressCoord.y=UTILS.FeetToMeters(Altitude) +self.missionIngressCoordAlt=UTILS.FeetToMeters(Altitude or 10000) +end +self.missionIngressCoordSpeed=Speed and Speed or nil +return self +end +function AUFTRAG:SetMissionHoldingCoord(Coordinate,Altitude,Speed,Duration) +if Coordinate:IsInstanceOf("ZONE_BASE")then +Coordinate=Coordinate:GetCoordinate() +end +self.missionHoldingCoord=Coordinate +self.missionHoldingDuration=Duration or 900 +if Altitude then +self.missionHoldingCoord.y=UTILS.FeetToMeters(Altitude) +self.missionHoldingCoordAlt=UTILS.FeetToMeters(Altitude or 10000) +end +self.missionHoldingCoordSpeed=Speed and Speed or nil +return self +end +function AUFTRAG:GetMissionEgressCoord() +return self.missionEgressCoord +end +function AUFTRAG:GetMissionIngressCoord() +return self.missionIngressCoord +end +function AUFTRAG:GetMissionHoldingCoord() +return self.missionHoldingCoord +end +function AUFTRAG:_GetMissionWaypointCoordSet() +if self.missionWaypointCoord then +local coord=self.missionWaypointCoord +if self.missionAltitude then +coord.y=self.missionAltitude +end +return coord +end +end +function AUFTRAG:GetMissionWaypointCoord(group,randomradius,surfacetypes) +if self.missionWaypointCoord then +local coord=self.missionWaypointCoord +if self.missionAltitude then +coord.y=self.missionAltitude +end +return coord +end +local coord=group:GetCoordinate() +if self.missionHoldingCoord then +coord=self.missionHoldingCoord +if self.missionHoldingCoorddAlt then +coord:SetAltitude(self.missionHoldingCoordAlt,true) +end +end +if self.missionIngressCoord then +coord=self.missionIngressCoord +if self.missionIngressCoordAlt then +coord:SetAltitude(self.missionIngressCoordAlt,true) +end +end +local waypointcoord=COORDINATE:New(0,0,0) +if coord then +waypointcoord=coord:GetIntermediateCoordinate(self:GetTargetCoordinate(),self.missionFraction) +else +self:E(self.lid..string.format("ERROR: Cannot get coordinate of group %s (alive=%s)!",tostring(group:GetName()),tostring(group:IsAlive()))) +end +local alt=waypointcoord.y +if randomradius then +waypointcoord=ZONE_RADIUS:New("Temp",waypointcoord:GetVec2(),randomradius):GetRandomCoordinate(nil,nil,surfacetypes):SetAltitude(alt,false) +end +if self.missionAltitude then +waypointcoord:SetAltitude(self.missionAltitude,true) +end +return waypointcoord +end +function AUFTRAG:_SetLogID() +self.lid=string.format("Auftrag #%d %s | ",self.auftragsnummer,tostring(self.type)) +return self +end +function AUFTRAG:_GetRequestID(Legion) +local requestid=nil +local name=nil +if type(Legion)=="string"then +name=Legion +else +name=Legion.alias +end +if name then +requestid=self.requestID[name] +end +return nil +end +function AUFTRAG:_GetRequest(Legion) +local request=nil +local requestID=self:_GetRequestID(Legion) +if requestID then +request=Legion:GetRequestByID(requestID) +end +return request +end +function AUFTRAG:_SetRequestID(Legion,RequestID) +local requestid=nil +local name=nil +if type(Legion)=="string"then +name=Legion +else +name=Legion.alias +end +if name then +if self.requestID[name]then +self:I(self.lid..string.format("WARNING: Mission already has a request ID=%d!",self.requestID[name])) +end +self.requestID[name]=RequestID +end +return self +end +function AUFTRAG:_IsNotReinforcing() +local Nassigned=self.Nassigned and self.Nassigned-self.Ndead or 0 +local notreinforcing=((not self.reinforce)or(self.reinforce==0 and Nassigned<=0)) +return notreinforcing +end +function AUFTRAG:_IsReinforcing() +local reinforcing=not self:_IsNotReinforcing() +return reinforcing +end +function AUFTRAG:UpdateMarker() +local text=string.format("%s %s: %s",self.name,self.type:upper(),self.status:upper()) +text=text..string.format("\n%s",self:GetTargetName()) +text=text..string.format("\nTargets %d/%d, Life Points=%d/%d",self:CountMissionTargets(),self:GetTargetInitialNumber(),self:GetTargetLife(),self:GetTargetInitialLife()) +text=text..string.format("\nOpsGroups %d/%d",self:CountOpsGroups(),self:GetNumberOfRequiredAssets()) +if not self.marker then +local targetcoord=self:GetTargetCoordinate() +if targetcoord then +if self.markerCoaliton and self.markerCoaliton>=0 then +self.marker=MARKER:New(targetcoord,text):ReadOnly():ToCoalition(self.markerCoaliton) +else +self.marker=MARKER:New(targetcoord,text):ReadOnly():ToAll() +end +end +else +if self.marker:GetText()~=text then +self.marker:UpdateText(text) +end +end +return self +end +function AUFTRAG:GetDCSMissionTask() +local DCStasks={} +if self.type==AUFTRAG.Type.ANTISHIP then +local DCStask=CONTROLLABLE.EnRouteTaskAntiShip(nil) +table.insert(self.enrouteTasks,DCStask) +self:_GetDCSAttackTask(self.engageTarget,DCStasks) +elseif self.type==AUFTRAG.Type.AWACS then +local DCStask=CONTROLLABLE.EnRouteTaskAWACS(nil) +table.insert(self.enrouteTasks,DCStask) +elseif self.type==AUFTRAG.Type.BAI then +self:_GetDCSAttackTask(self.engageTarget,DCStasks) +elseif self.type==AUFTRAG.Type.BOMBING then +local coords=self.engageTarget:GetCoordinates() +for _,coord in pairs(coords)do +local DCStask=CONTROLLABLE.TaskBombing(nil,coord:GetVec2(),self.engageAsGroup,self.engageWeaponExpend,self.engageQuantity,self.engageDirection,self.engageAltitude,self.engageWeaponType,self.optionDivebomb) +table.insert(DCStasks,DCStask) +end +elseif self.type==AUFTRAG.Type.STRAFING then +local DCStask=CONTROLLABLE.TaskStrafing(nil,self:GetTargetVec2(),self.engageQuantity,self.engageLength,self.engageWeaponType,self.engageWeaponExpend,self.engageDirection,self.engageAsGroup) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.BOMBRUNWAY then +local DCStask=CONTROLLABLE.TaskBombingRunway(nil,self.engageTarget:GetObject(),self.engageWeaponType,self.engageWeaponExpend,self.engageQuantity,self.engageDirection,self.engageAsGroup) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.BOMBCARPET then +local DCStask=CONTROLLABLE.TaskCarpetBombing(nil,self:GetTargetVec2(),self.engageAsGroup,self.engageWeaponExpend,self.engageQuantity,self.engageDirection,self.engageAltitude,self.engageWeaponType,self.engageLength) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.CAP then +local Vec2=self.engageZone:GetVec2() +local Radius +if self.engageZone:IsInstanceOf("COORDINATE")then +Radius=UTILS.NMToMeters(20) +else +Radius=self.engageZone:GetRadius() +end +local DCStask=CONTROLLABLE.EnRouteTaskEngageTargetsInZone(nil,Vec2,Radius,self.engageTargetTypes,Priority) +table.insert(self.enrouteTasks,DCStask) +elseif self.type==AUFTRAG.Type.CAS then +local DCStask=CONTROLLABLE.EnRouteTaskEngageTargetsInZone(nil,self.engageZone:GetVec2(),self.engageZone:GetRadius(),self.engageTargetTypes,Priority) +table.insert(self.enrouteTasks,DCStask) +elseif self.type==AUFTRAG.Type.ESCORT then +local DCStask=CONTROLLABLE.TaskEscort(nil,self.engageTarget:GetObject(),self.escortVec3,nil,self.engageMaxDistance,self.engageTargetTypes) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.GROUNDESCORT then +local DCSTask=CONTROLLABLE.TaskGroundEscort(nil,self.engageTarget:GetObject(),nil,self.orbitDistance,self.engageTargetTypes) +table.insert(DCStasks,DCSTask) +elseif self.type==AUFTRAG.Type.FACA then +local DCStask=CONTROLLABLE.TaskFAC_AttackGroup(nil,self.engageTarget:GetObject(),self.engageWeaponType,self.facDesignation,self.facDatalink,self.facFreq,self.facModu,CallsignName,CallsignNumber) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.FAC then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.PATROLZONE +local param={} +param.zone=self:GetObjective() +param.altitude=self.missionAltitude +param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed)or nil +DCStask.params=param +table.insert(DCStasks,DCStask) +local DCSenroute=CONTROLLABLE.EnRouteTaskFAC(self,self.facFreq,self.facModu) +table.insert(self.enrouteTasks,DCSenroute) +elseif self.type==AUFTRAG.Type.FERRY then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.FERRY +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.RELOCATECOHORT then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.RELOCATECOHORT +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.INTERCEPT then +self:_GetDCSAttackTask(self.engageTarget,DCStasks) +elseif self.type==AUFTRAG.Type.ORBIT then +elseif self.type==AUFTRAG.Type.GCICAP then +elseif self.type==AUFTRAG.Type.RECON then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.RECON +local param={} +param.target=self.engageTarget +param.altitude=self.missionAltitude +param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed)or nil +param.lastindex=nil +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.SEAD then +if self.engageZone then +self.engageZone:Scan({Object.Category.UNIT},{Unit.Category.GROUND_UNIT}) +local ScanUnitSet=self.engageZone:GetScannedSetUnit() +local SeadUnitSet=SET_UNIT:New() +for _,_unit in pairs(ScanUnitSet.Set)do +local unit=_unit +if unit and unit:IsAlive()and unit:HasSEAD()then +self:T("Adding UNIT for SEAD: "..unit:GetName()) +local task=CONTROLLABLE.TaskAttackUnit(nil,unit,GroupAttack,AI.Task.WeaponExpend.ALL,1,Direction,self.engageAltitude,2956984318) +table.insert(DCStasks,task) +SeadUnitSet:AddUnit(unit) +end +end +self.engageTarget=TARGET:New(SeadUnitSet) +else +self:_GetDCSAttackTask(self.engageTarget,DCStasks) +end +elseif self.type==AUFTRAG.Type.STRIKE then +local coords=self.engageTarget:GetCoordinates() +for _,coord in pairs(coords)do +local DCStask=CONTROLLABLE.TaskAttackMapObject(nil,coord:GetVec2(),self.engageAsGroup,self.engageWeaponExpend,self.engageQuantity,self.engageDirection,self.engageAltitude,self.engageWeaponType) +table.insert(DCStasks,DCStask) +end +elseif self.type==AUFTRAG.Type.TANKER or self.type==AUFTRAG.Type.RECOVERYTANKER then +local DCStask=CONTROLLABLE.EnRouteTaskTanker(nil) +table.insert(self.enrouteTasks,DCStask) +elseif self.type==AUFTRAG.Type.TROOPTRANSPORT then +local TaskEmbark=CONTROLLABLE.TaskEmbarking(TaskControllable,self.transportPickup,self.transportGroupSet,self.transportWaitForCargo) +local TaskDisEmbark=CONTROLLABLE.TaskDisembarking(TaskControllable,self.transportDropoff,self.transportGroupSet) +table.insert(DCStasks,TaskEmbark) +table.insert(DCStasks,TaskDisEmbark) +elseif self.type==AUFTRAG.Type.OPSTRANSPORT then +local DCStask={} +DCStask.id="OpsTransport" +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.CARGOTRANSPORT then +local TaskCargoTransportation={ +id="CargoTransportation", +params={} +} +table.insert(DCStasks,TaskCargoTransportation) +elseif self.type==AUFTRAG.Type.RESCUEHELO then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.FORMATION +local param={} +param.unitname=self:GetTargetName() +param.offsetX=200 +param.offsetZ=240 +param.altitude=70 +param.dtFollow=1.0 +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.ARTY then +if self.artyShots==1 or self.artyRadius<10 or true then +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,self:GetTargetVec2(),self.artyRadius,self.artyShots,self.engageWeaponType,self.artyAltitude) +table.insert(DCStasks,DCStask) +else +local Vec2=self:GetTargetVec2() +local zone=ZONE_RADIUS:New("temp",Vec2,self.artyRadius) +for i=1,self.artyShots do +local vec2=zone:GetRandomVec2() +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,vec2,0,1,self.engageWeaponType,self.artyAltitude) +table.insert(DCStasks,DCStask) +end +end +elseif self.type==AUFTRAG.Type.BARRAGE then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.BARRAGE +local param={} +param.zone=self:GetObjective() +param.altitude=self.artyAltitude +param.radius=self.artyRadius +param.heading=self.artyHeading +param.angle=self.artyAngle +param.shots=self.artyShots +param.weaponTypoe=self.engageWeaponType +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.PATROLZONE then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.PATROLZONE +local param={} +param.zone=self:GetObjective() +param.altitude=self.missionAltitude +param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed)or nil +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.CAPTUREZONE then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.CAPTUREZONE +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.CASENHANCED then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.PATROLZONE +local param={} +param.zone=self:GetObjective() +param.altitude=self.missionAltitude +param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed)or nil +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.GROUNDATTACK then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.GROUNDATTACK +local param={} +param.target=self:GetTargetData() +param.action="Wedge" +param.speed=self.missionSpeed and UTILS.KmphToMps(self.missionSpeed)or nil +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.AMMOSUPPLY then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.AMMOSUPPLY +local param={} +param.zone=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.FUELSUPPLY then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.FUELSUPPLY +local param={} +param.zone=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.REARMING then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.REARMING +local param={} +param.zone=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.ALERT5 then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.ALERT5 +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.NOTHING then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.NOTHING +local param={} +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.PATROLRACETRACK then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.PATROLRACETRACK +local param={} +param.TrackAltitude=self.TrackAltitude +param.TrackSpeed=self.TrackSpeed +param.TrackPoint1=self.TrackPoint1 +param.TrackPoint2=self.TrackPoint2 +param.missionSpeed=self.missionSpeed +param.missionAltitude=self.missionAltitude +param.TrackFormation=self.TrackFormation +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.HOVER then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.HOVER +local param={} +param.hoverAltitude=self.hoverAltitude +param.hoverTime=self.hoverTime +param.missionSpeed=self.missionSpeed +param.missionAltitude=self.missionAltitude +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.LANDATCOORDINATE then +local DCStask={} +local Vec2=self.stayAt:GetVec2() +local DCStask=CONTROLLABLE.TaskLandAtVec2(nil,Vec2,self.stayTime,self.combatLand,self.directionAfter) +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.ONGUARD or self.type==AUFTRAG.Type.ARMOREDGUARD then +local DCStask={} +DCStask.id=self.type==AUFTRAG.Type.ONGUARD and AUFTRAG.SpecialTask.ONGUARD or AUFTRAG.SpecialTask.ARMOREDGUARD +local param={} +param.coordinate=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.AIRDEFENSE then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.AIRDEFENSE +local param={} +param.zone=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +elseif self.type==AUFTRAG.Type.EWR then +local DCStask={} +DCStask.id=AUFTRAG.SpecialTask.EWR +local param={} +param.zone=self:GetObjective() +DCStask.params=param +table.insert(DCStasks,DCStask) +local Enroutetask=CONTROLLABLE.EnRouteTaskEWR() +table.insert(self.enrouteTasks,Enroutetask) +else +self:T(self.lid..string.format("ERROR: Unknown mission task!")) +return nil +end +if self.type==AUFTRAG.Type.ORBIT or +self.type==AUFTRAG.Type.CAP or +self.type==AUFTRAG.Type.CAS or +self.type==AUFTRAG.Type.GCICAP or +self.type==AUFTRAG.Type.AWACS or +self.type==AUFTRAG.Type.TANKER or +self.type==AUFTRAG.Type.RECOVERYTANKER then +self.orbitVec2=self:GetTargetVec2() +if self.orbitVec2 then +self.targetHeading=self:GetTargetHeading() +local OffsetVec2=nil +if(self.orbitOffsetVec2~=nil)then +OffsetVec2=UTILS.DeepCopy(self.orbitOffsetVec2) +end +if OffsetVec2 then +if self.orbitOffsetVec2.r then +local r=self.orbitOffsetVec2.r +local phi=(self.orbitOffsetVec2.phi or 0)+self.targetHeading +OffsetVec2.x=r*math.cos(math.rad(phi)) +OffsetVec2.y=r*math.sin(math.rad(phi)) +else +OffsetVec2.x=self.orbitOffsetVec2.x +OffsetVec2.y=self.orbitOffsetVec2.y +end +end +local orbitVec2=OffsetVec2 and UTILS.Vec2Add(self.orbitVec2,OffsetVec2)or self.orbitVec2 +local orbitRaceTrack=nil +if self.orbitLeg then +local heading=0 +if self.orbitHeading then +if self.orbitHeadingRel then +heading=self.targetHeading+self.orbitHeading +else +heading=self.orbitHeading +end +else +heading=self.targetHeading or 0 +end +orbitRaceTrack=UTILS.Vec2Translate(orbitVec2,self.orbitLeg,heading) +end +local orbitRaceTrackCoord=nil +if orbitRaceTrack then +orbitRaceTrackCoord=COORDINATE:NewFromVec2(orbitRaceTrack) +end +local DCStask=CONTROLLABLE.TaskOrbit(nil,COORDINATE:NewFromVec2(orbitVec2),self.orbitAltitude,self.orbitSpeed,orbitRaceTrackCoord) +table.insert(DCStasks,DCStask) +end +end +self:T3({missiontask=DCStasks}) +if#DCStasks==1 then +return DCStasks[1] +else +return CONTROLLABLE.TaskCombo(nil,DCStasks) +end +end +function AUFTRAG:_GetDCSAttackTask(Target,DCStasks) +DCStasks=DCStasks or{} +for _,_target in pairs(Target.targets)do +local target=_target +if target.Type==TARGET.ObjectType.GROUP then +local DCStask=CONTROLLABLE.TaskAttackGroup(nil,target.Object,self.engageWeaponType,self.engageWeaponExpend,self.engageQuantity,self.engageDirection,self.engageAltitude,self.engageAsGroup) +table.insert(DCStasks,DCStask) +elseif target.Type==TARGET.ObjectType.UNIT or target.Type==TARGET.ObjectType.STATIC then +local DCStask=CONTROLLABLE.TaskAttackUnit(nil,target.Object,self.engageAsGroup,self.WeaponExpend,self.engageQuantity,self.engageDirection,self.engageAltitude,self.engageWeaponType) +table.insert(DCStasks,DCStask) +end +end +return DCStasks +end +function AUFTRAG:GetMissionTaskforMissionType(MissionType) +local mtask=ENUMS.MissionTask.NOTHING +if MissionType==AUFTRAG.Type.ANTISHIP then +mtask=ENUMS.MissionTask.ANTISHIPSTRIKE +elseif MissionType==AUFTRAG.Type.AWACS then +mtask=ENUMS.MissionTask.AWACS +elseif MissionType==AUFTRAG.Type.BAI then +mtask=ENUMS.MissionTask.GROUNDATTACK +elseif MissionType==AUFTRAG.Type.BOMBCARPET then +mtask=ENUMS.MissionTask.GROUNDATTACK +elseif MissionType==AUFTRAG.Type.BOMBING then +mtask=ENUMS.MissionTask.GROUNDATTACK +elseif MissionType==AUFTRAG.Type.BOMBRUNWAY then +mtask=ENUMS.MissionTask.RUNWAYATTACK +elseif MissionType==AUFTRAG.Type.CAP then +mtask=ENUMS.MissionTask.CAP +elseif MissionType==AUFTRAG.Type.GCICAP then +mtask=ENUMS.MissionTask.CAP +elseif MissionType==AUFTRAG.Type.CAS then +mtask=ENUMS.MissionTask.CAS +elseif MissionType==AUFTRAG.Type.PATROLZONE then +mtask=ENUMS.MissionTask.CAS +elseif MissionType==AUFTRAG.Type.CASENHANCED then +mtask=ENUMS.MissionTask.CAS +elseif MissionType==AUFTRAG.Type.ESCORT then +mtask=ENUMS.MissionTask.ESCORT +elseif MissionType==AUFTRAG.Type.FACA then +mtask=ENUMS.MissionTask.AFAC +elseif MissionType==AUFTRAG.Type.FAC then +mtask=ENUMS.MissionTask.AFAC +elseif MissionType==AUFTRAG.Type.FERRY then +mtask=ENUMS.MissionTask.NOTHING +elseif MissionType==AUFTRAG.Type.GROUNDESCORT then +mtask=ENUMS.MissionTask.GROUNDESCORT +elseif MissionType==AUFTRAG.Type.INTERCEPT then +mtask=ENUMS.MissionTask.INTERCEPT +elseif MissionType==AUFTRAG.Type.RECON then +mtask=ENUMS.MissionTask.RECONNAISSANCE +elseif MissionType==AUFTRAG.Type.SEAD then +mtask=ENUMS.MissionTask.SEAD +elseif MissionType==AUFTRAG.Type.STRIKE then +mtask=ENUMS.MissionTask.GROUNDATTACK +elseif MissionType==AUFTRAG.Type.TANKER then +mtask=ENUMS.MissionTask.REFUELING +elseif MissionType==AUFTRAG.Type.TROOPTRANSPORT then +mtask=ENUMS.MissionTask.TRANSPORT +elseif MissionType==AUFTRAG.Type.CARGOTRANSPORT then +mtask=ENUMS.MissionTask.TRANSPORT +elseif MissionType==AUFTRAG.Type.ARMORATTACK then +mtask=ENUMS.MissionTask.NOTHING +elseif MissionType==AUFTRAG.Type.HOVER then +mtask=ENUMS.MissionTask.NOTHING +elseif MissionType==AUFTRAG.Type.PATROLRACETRACK then +mtask=ENUMS.MissionTask.CAP +end +return mtask +end +function AUFTRAG.CheckMissionType(MissionType,PossibleTypes) +if type(PossibleTypes)=="string"then +PossibleTypes={PossibleTypes} +end +for _,canmission in pairs(PossibleTypes)do +if canmission==MissionType then +return true +end +end +return false +end +function AUFTRAG.CheckMissionCapability(MissionTypes,Capabilities,All) +if type(MissionTypes)~="table"then +MissionTypes={MissionTypes} +end +for _,cap in pairs(Capabilities)do +local capability=cap +for _,MissionType in pairs(MissionTypes)do +if All==true then +if capability.MissionType~=MissionType then +return false +end +else +if capability.MissionType==MissionType then +return true +end +end +end +end +if All==true then +return true +else +return false +end +end +function AUFTRAG.CheckMissionCapabilityAny(MissionTypes,Capabilities) +local res=AUFTRAG.CheckMissionCapability(MissionTypes,Capabilities,false) +return res +end +function AUFTRAG.CheckMissionCapabilityAll(MissionTypes,Capabilities) +local res=AUFTRAG.CheckMissionCapability(MissionTypes,Capabilities,true) +return res +end +do +AWACS={ +ClassName="AWACS", +version="0.2.73", +lid="", +coalition=coalition.side.BLUE, +coalitiontxt="blue", +OpsZone=nil, +StationZone=nil, +AirWing=nil, +Frequency=271, +Modulation=radio.modulation.AM, +Airbase=nil, +AwacsAngels=25, +OrbitZone=nil, +CallSign=CALLSIGN.AWACS.Magic, +CallSignNo=1, +debug=false, +verbose=false, +ManagedGrps={}, +ManagedGrpID=0, +ManagedTaskID=0, +AnchorStacks={}, +CAPIdleAI={}, +CAPIdleHuman={}, +TaskedCAPAI={}, +TaskedCAPHuman={}, +OpenTasks={}, +ManagedTasks={}, +PictureAO={}, +PictureEWR={}, +Contacts={}, +Countactcounter=0, +ContactsAO={}, +RadioQueue={}, +PrioRadioQueue={}, +TacticalQueue={}, +AwacsTimeOnStation=4, +AwacsTimeStamp=0, +EscortsTimeOnStation=4, +EscortsTimeStamp=0, +CAPTimeOnStation=4, +AwacsROE="", +AwacsROT="", +MenuStrict=true, +MaxAIonCAP=3, +AIonCAP=0, +AICAPMissions={}, +ShiftChangeAwacsFlag=false, +ShiftChangeEscortsFlag=false, +ShiftChangeAwacsRequested=false, +ShiftChangeEscortsRequested=false, +CAPAirwings={}, +MonitoringData={}, +MonitoringOn=false, +FlightGroups={}, +AwacsMission=nil, +AwacsInZone=false, +AwacsReady=false, +CatchAllMissions={}, +CatchAllFGs={}, +PictureInterval=300, +ReassignTime=120, +PictureTimeStamp=0, +BorderZone=nil, +RejectZone=nil, +maxassigndistance=100, +PlayerGuidance=true, +ModernEra=true, +callsignshort=true, +keepnumber=true, +callsignTranslations=nil, +TacDistance=45, +MeldDistance=35, +ThreatDistance=25, +AOName="Rock", +AOCoordinate=nil, +clientmenus=nil, +RadarBlur=15, +ReassignmentPause=180, +NoGroupTags=false, +SuppressScreenOutput=false, +NoMissileCalls=true, +GoogleTTSPadding=1, +WindowsTTSPadding=2.5, +PlayerCapAssignment=true, +AllowMarkers=false, +PlayerStationName=nil, +GCI=false, +GCIGroup=nil, +locale="en", +IncludeHelicopters=false, +TacticalMenu=false, +TacticalFrequencies={}, +TacticalSubscribers={}, +TacticalBaseFreq=130, +TacticalIncrFreq=0.5, +TacticalModulation=radio.modulation.AM, +TacticalInterval=120, +DetectionSet=nil, +MaxMissionRange=125, +} +AWACS.CallSignClear={ +[1]="Overlord", +[2]="Magic", +[3]="Wizard", +[4]="Focus", +[5]="Darkstar", +} +AWACS.AnchorNames={ +[1]="One", +[2]="Two", +[3]="Three", +[4]="Four", +[5]="Five", +[6]="Six", +[7]="Seven", +[8]="Eight", +[9]="Nine", +[10]="Ten", +} +AWACS.IFF= +{ +SPADES="Spades", +NEUTRAL="Neutral", +FRIENDLY="Friendly", +ENEMY="Hostile", +BOGEY="Bogey", +} +AWACS.Phonetic= +{ +[1]='Alpha', +[2]='Bravo', +[3]='Charlie', +[4]='Delta', +[5]='Echo', +[6]='Foxtrot', +[7]='Golf', +[8]='Hotel', +[9]='India', +[10]='Juliett', +[11]='Kilo', +[12]='Lima', +[13]='Mike', +[14]='November', +[15]='Oscar', +[16]='Papa', +[17]='Quebec', +[18]='Romeo', +[19]='Sierra', +[20]='Tango', +[21]='Uniform', +[22]='Victor', +[23]='Whiskey', +[24]='Xray', +[25]='Yankee', +[26]='Zulu', +} +AWACS.Shipsize= +{ +[1]="Singleton", +[2]="Two-Ship", +[3]="Heavy", +[4]="Gorilla", +} +AWACS.ROE={ +POLICE="Police", +VID="Visual ID", +IFF="IFF", +BVR="Beyond Visual Range", +} +AWACS.ROT={ +BYPASSESCAPE="Bypass and Escape", +EVADE="Evade Fire", +PASSIVE="Passive Defense", +RETURNFIRE="Return Fire", +OPENFIRE="Open Fire", +} +AWACS.THREATLEVEL={ +GREEN=3, +AMBER=7, +RED=10, +} +AWACS.CapVoices={ +[1]="de-DE-Wavenet-A", +[2]="de-DE-Wavenet-B", +[3]="fr-FR-Wavenet-A", +[4]="fr-FR-Wavenet-B", +[5]="en-GB-Wavenet-A", +[6]="en-GB-Wavenet-B", +[7]="en-GB-Wavenet-D", +[8]="en-AU-Wavenet-B", +[9]="en-US-Wavenet-J", +[10]="en-US-Wavenet-H", +} +AWACS.Messages={ +EN= +{ +DEFEND="%s, %s! %s! %s! Defend!", +VECTORTO="%s, %s. Vector%s %s", +VECTORTOTTS="%s, %s, Vector%s %s", +ANGELS=". Angels ", +ZERO="zero", +VANISHED="%s, %s Group. Vanished.", +VANISHEDTTS="%s, %s group vanished.", +SHIFTCHANGE="%s shift change for %s control.", +GROUPCAP="Group", +GROUP="group", +MILES="miles", +THOUSAND="thousand", +BOGEY="Bogey", +ALLSTATIONS="All Stations", +PICCLEAN="%s. %s. Picture Clean.", +PICTURE="Picture", +ONE="One", +GROUPMULTI="groups", +NOTCHECKEDIN="%s. %s. Negative. You are not checked in.", +CLEAN="%s. %s. Clean.", +DOPE="%s. %s. Bogey Dope. ", +VIDPOS="%s. %s. Copy, target identified as %s.", +VIDNEG="%s. %s. Negative, get closer to target.", +FFNEUTRAL="Neutral", +FFFRIEND="Friendly", +FFHOSTILE="Hostile", +FFSPADES="Spades", +FFCLEAN="Clean", +COPY="%s. %s. Copy.", +TARGETEDBY="Targeted by %s.", +STATUS="Status", +ALREADYCHECKEDIN="%s. %s. Negative. You are already checked in.", +ALPHACHECK="Alpha Check", +CHECKINAI="%s. %s. Checking in as fragged. Expected playtime %d hours. Request Alpha Check %s.", +SAFEFLIGHT="%s. %s. Copy. Have a safe flight home.", +VERYLOW="very low", +AIONSTATION="%s. %s. On station over anchor %d at angels %d. Ready for tasking.", +POPUP="Pop-up", +NEWGROUP="New group", +HIGH=" High.", +VERYFAST=" Very fast.", +FAST=" Fast.", +THREAT="Threat", +MERGED="Merged", +SCREENVID="Intercept and VID %s group.", +SCREENINTER="Intercept %s group.", +ENGAGETAG="Targeted by %s.", +REQCOMMIT="%s. %s group. %s. %s, request commit.", +AICOMMIT="%s. %s group. %s. %s, commit.", +COMMIT="Commit", +SUNRISE="%s. All stations, SUNRISE SUNRISE SUNRISE, %s.", +AWONSTATION="%s on station for %s control.", +STATIONAT="%s. %s. Station at %s at angels %d.", +STATIONATLONG="%s. %s. Station at %s at angels %d doing %d knots.", +STATIONSCREEN="%s. %s.\nStation at %s\nAngels %d\nSpeed %d knots\nCoord %s\nROE %s.", +STATIONTASK="Station at %s\nAngels %d\nSpeed %d knots\nCoord %s\nROE %s", +VECTORSTATION=" to Station", +TEXTOPTIONS1="Lost friendly flight", +TEXTOPTIONS2="Vanished friendly flight", +TEXTOPTIONS3="Faded friendly contact", +TEXTOPTIONS4="Lost contact with", +}, +} +AWACS.TaskDescription={ +ANCHOR="Anchor", +REANCHOR="Re-Anchor", +VID="VID", +IFF="IFF", +INTERCEPT="Intercept", +SWEEP="Sweep", +RTB="RTB", +} +AWACS.TaskStatus={ +IDLE="Idle", +UNASSIGNED="Unassigned", +REQUESTED="Requested", +ASSIGNED="Assigned", +EXECUTING="Executing", +SUCCESS="Success", +FAILED="Failed", +DEAD="Dead", +} +function AWACS:New(Name,AirWing,Coalition,AirbaseName,AwacsOrbit,OpsZone,StationZone,Frequency,Modulation) +local self=BASE:Inherit(self,FSM:New()) +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +self.coalition=coalition.side.BLUE +self.coalitiontxt=Coalition +elseif Coalition=="red"then +self.coalition=coalition.side.RED +self.coalitiontxt=Coalition +elseif Coalition=="neutral"then +self.coalition=coalition.side.NEUTRAL +self.coalitiontxt=Coalition +else +self:E("ERROR: Unknown coalition in AWACS!") +end +else +self.coalition=Coalition +self.coalitiontxt=string.lower(UTILS.GetCoalitionName(self.coalition)) +end +self.Name=Name +self.AirWing=AirWing +AirWing:SetUsingOpsAwacs(self) +self.CAPAirwings=FIFO:New() +self.CAPAirwings:Push(AirWing,1) +self.AwacsFG=nil +self.RadarBlur=15 +if type(OpsZone)=="string"then +self.OpsZone=ZONE:New(OpsZone) +elseif type(OpsZone)=="table"and OpsZone.ClassName and string.find(OpsZone.ClassName,"ZONE")then +self.OpsZone=OpsZone +else +self:E("AWACS - Invalid Zone passed!") +return +end +self.AOCoordinate=COORDINATE:NewFromVec3(coalition.getMainRefPoint(self.coalition)) +self.AOName=self.OpsZone:GetName() +self.UseBullsAO=true +self.ControlZoneRadius=100 +self.StationZone=ZONE:New(StationZone) +self.StationZoneName=StationZone +self.Frequency=Frequency or 271 +self.Modulation=Modulation or radio.modulation.AM +self.MultiFrequency={self.Frequency} +self.MultiModulation={self.Modulation} +self.Airbase=AIRBASE:FindByName(AirbaseName) +self.AwacsAngels=25 +if AwacsOrbit then +self.OrbitZone=ZONE:New(AwacsOrbit) +end +self.BorderZone=nil +self.CallSign=CALLSIGN.AWACS.Magic +self.CallSignNo=1 +self.NoHelos=true +self.AIRequested=0 +self.AIonCAP=0 +self.AICAPMissions=FIFO:New() +self.FlightGroups=FIFO:New() +self.Countactcounter=0 +self.PictureInterval=300 +self.PictureTimeStamp=0 +self.ReassignTime=120 +self.intelstarted=false +self.sunrisedone=false +local speed=250 +self.SpeedBase=speed +self.Speed=speed +self.Heading=0 +self.Leg=50 +self.invisible=false +self.immortal=false +self.callsigntxt="AWACS" +self.AwacsTimeOnStation=4 +self.AwacsTimeStamp=0 +self.EscortsTimeOnStation=4 +self.EscortsTimeStamp=0 +self.ShiftChangeTime=0.25 +self.ShiftChangeAwacsFlag=false +self.ShiftChangeEscortsFlag=false +self.CapSpeedBase=270 +self.CAPTimeOnStation=4 +self.MaxAIonCAP=4 +self.AICAPCAllName=CALLSIGN.Aircraft.Colt +self.AICAPCAllNumber=0 +self.CAPGender="male" +self.CAPCulture="en-US" +self.CAPVoice=nil +self.AwacsMission=nil +self.AwacsInZone=false +self.AwacsReady=false +self.AwacsROE=AWACS.ROE.IFF +self.AwacsROT=AWACS.ROT.BYPASSESCAPE +self.HasEscorts=false +self.EscortTemplate="" +self.EscortMission={} +self.EscortMissionReplacement={} +self.PathToSRS="C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.Gender="female" +self.Culture="en-GB" +self.Voice=nil +self.Port=5002 +self.Volume=1.0 +self.RadioQueue=FIFO:New() +self.PrioRadioQueue=FIFO:New() +self.TacticalQueue=FIFO:New() +self.maxspeakentries=3 +self.GoogleTTSPadding=1 +self.WindowsTTSPadding=2.5 +self.clientset=SET_CLIENT:New():FilterActive(true):FilterCoalitions(self.coalitiontxt):FilterCategories("plane"):FilterStart() +self.PlayerGuidance=true +self.ModernEra=true +self.NoGroupTags=false +self.SuppressScreenOutput=false +self.ReassignmentPause=180 +self.callsignshort=true +self.DeclareRadius=5 +self.MenuStrict=true +self.maxassigndistance=100 +self.NoMissileCalls=true +self.PlayerCapAssignment=true +self.ManagedGrps={} +self.ManagedGrpID=0 +self.callsignTranslations=nil +self.AnchorStacks=FIFO:New() +self.AnchorBaseAngels=22 +self.AnchorStackDistance=2 +self.AnchorMaxStacks=4 +self.AnchorMaxAnchors=2 +self.AnchorMaxZones=6 +self.AnchorCurrZones=1 +self.AnchorTurn=-(360/self.AnchorMaxZones) +self:_CreateAnchorStack() +self.ManagedTasks=FIFO:New() +local MonitoringData={} +MonitoringData.AICAPCurrent=0 +MonitoringData.AICAPMax=self.MaxAIonCAP +MonitoringData.Airwings=1 +MonitoringData.PlayersCheckedin=0 +MonitoringData.Players=0 +MonitoringData.AwacsShiftChange=false +MonitoringData.AwacsStateFG="unknown" +MonitoringData.AwacsStateMission="unknown" +MonitoringData.EscortsShiftChange=false +MonitoringData.EscortsStateFG={} +MonitoringData.EscortsStateMission={} +self.MonitoringOn=false +self.MonitoringData=MonitoringData +self.CatchAllMissions={} +self.CatchAllFGs={} +self.PictureAO=FIFO:New() +self.PictureEWR=FIFO:New() +self.Contacts=FIFO:New() +self.CID=0 +self.ContactsAO=FIFO:New() +self.clientmenus=FIFO:New() +self.TacticalMenu=false +self.TacticalBaseFreq=130 +self.TacticalIncrFreq=0.5 +self.TacticalModulation=radio.modulation.AM +self.acticalFrequencies={} +self.TacticalSubscribers={} +self.TacticalInterval=120 +self.DetectionSet=SET_GROUP:New() +self.lid=string.format("%s (%s) | ",self.Name,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","StartUp") +self:AddTransition("StartUp","Started","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","CheckedIn","*") +self:AddTransition("*","CheckedOut","*") +self:AddTransition("*","AssignAnchor","*") +self:AddTransition("*","AssignedAnchor","*") +self:AddTransition("*","ReAnchor","*") +self:AddTransition("*","NewCluster","*") +self:AddTransition("*","NewContact","*") +self:AddTransition("*","LostCluster","*") +self:AddTransition("*","LostContact","*") +self:AddTransition("*","CheckRadioQueue","*") +self:AddTransition("*","CheckTacticalQueue","*") +self:AddTransition("*","EscortShiftChange","*") +self:AddTransition("*","AwacsShiftChange","*") +self:AddTransition("*","FlightOnMission","*") +self:AddTransition("*","Intercept","*") +self:AddTransition("*","InterceptSuccess","*") +self:AddTransition("*","InterceptFailure","*") +self:AddTransition("*","VIDSuccess","*") +self:AddTransition("*","VIDFailure","*") +self:AddTransition("*","Stop","Stopped") +local text=string.format("%sAWACS Version %s Initiated",self.lid,self.version) +self:I(text) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterUnit,self._EventHandler) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.Crash,self._EventHandler) +self:HandleEvent(EVENTS.Dead,self._EventHandler) +self:HandleEvent(EVENTS.UnitLost,self._EventHandler) +self:HandleEvent(EVENTS.BDA,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +self:HandleEvent(EVENTS.Shot,self._EventHandler) +self:_InitLocalization() +return self +end +function AWACS:SetTacticalRadios(BaseFreq,Increase,Modulation,Interval,Number) +self:T(self.lid.."SetTacticalRadios") +if not self.AwacsSRS then +MESSAGE:New("AWACS: Setup SRS in your code BEFORE trying to add tac radios please!",30,"ERROR",true):ToLog():ToAll() +return self +end +self.TacticalMenu=true +self.TacticalBaseFreq=BaseFreq or 130 +self.TacticalIncrFreq=Increase or 0.5 +self.TacticalModulation=Modulation or radio.modulation.AM +self.TacticalInterval=Interval or 120 +local number=Number or 10 +if number<1 then number=1 end +if number>10 then number=10 end +for i=1,number do +local freq=self.TacticalBaseFreq+((i-1)*self.TacticalIncrFreq) +self.TacticalFrequencies[freq]=freq +end +if self.AwacsSRS then +self.TacticalSRS=MSRS:New(self.PathToSRS,self.TacticalBaseFreq,self.TacticalModulation,self.Backend) +self.TacticalSRS:SetCoalition(self.coalition) +self.TacticalSRS:SetGender(self.Gender) +self.TacticalSRS:SetCulture(self.Culture) +self.TacticalSRS:SetVoice(self.Voice) +self.TacticalSRS:SetPort(self.Port) +self.TacticalSRS:SetLabel("AWACS") +self.TacticalSRS:SetVolume(self.Volume) +if self.PathToGoogleKey then +self.TacticalSRS:SetProviderOptionsGoogle(self.PathToGoogleKey,self.AccessKey) +self.TacticalSRS:SetProvider(MSRS.Provider.GOOGLE) +end +self.TacticalSRSQ=MSRSQUEUE:New("Tactical AWACS") +end +return self +end +function AWACS:_RefreshMenuNonSubscribed() +self:T(self.lid.."_RefreshMenuNonSubscribed") +local aliveset=self.clientset:GetAliveSet() +for _,_group in pairs(aliveset)do +local grp=_group +local Group=grp:GetGroup() +local gname=nil +if Group and Group:IsAlive()then +gname=Group:GetName() +self:T(gname) +end +local menustr=self.clientmenus:ReadByID(gname) +local menu=menustr.tactical +if not self.TacticalSubscribers[gname]and menu then +menu:RemoveSubMenus() +for _,_freq in UTILS.spairs(self.TacticalFrequencies)do +local modu=UTILS.GetModulationName(self.TacticalModulation) +local text=string.format("Subscribe to %.3f %s",_freq,modu) +local entry=MENU_GROUP_COMMAND:New(Group,text,menu,self._SubScribeTactRadio,self,Group,_freq) +end +end +end +return self +end +function AWACS:_UnsubScribeTactRadio(Group) +self:T(self.lid.."_UnsubScribeTactRadio") +local text="" +local textScreen="" +local GID,Outcome=self:_GetManagedGrpID(Group) +local gcallsign=self:_GetCallSign(Group,GID)or"Ghost 1" +local gname=Group:GetName()or"unknown" +if Outcome and self.TacticalSubscribers[gname]then +local Freq=self.TacticalSubscribers[gname] +self.TacticalFrequencies[Freq]=Freq +self.TacticalSubscribers[gname]=nil +local modu=self.TacticalModulation==0 and"AM"or"FM" +text=string.format("%s, %s, switch back to AWACS main frequency!",gcallsign,self.callsigntxt) +self:_NewRadioEntry(text,text,GID,true,true,true,false,true) +self:_RefreshMenuNonSubscribed() +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_SubScribeTactRadio(Group,Frequency) +self:T(self.lid.."_SubScribeTactRadio") +local text="" +local textScreen="" +local GID,Outcome=self:_GetManagedGrpID(Group) +local gcallsign=self:_GetCallSign(Group,GID)or"Ghost 1" +local gname=Group:GetName()or"unknown" +if Outcome then +self.TacticalSubscribers[gname]=Frequency +self.TacticalFrequencies[Frequency]=nil +local modu=self.TacticalModulation==0 and"AM"or"FM" +text=string.format("%s, %s, switch to %.3f %s for tactical information!",gcallsign,self.callsigntxt,Frequency,modu) +self:_NewRadioEntry(text,text,GID,true,true,true,false,true) +local menustr=self.clientmenus:ReadByID(gname) +local menu=menustr.tactical +if menu then +menu:RemoveSubMenus() +local text=string.format("Unsubscribe %.3f %s",Frequency,modu) +local entry=MENU_GROUP_COMMAND:New(Group,text,menu,self._UnsubScribeTactRadio,self,Group) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_CheckSubscribers() +self:T(self.lid.."_InitLocalization") +for _name,_freq in pairs(self.TacticalSubscribers or{})do +local grp=GROUP:FindByName(_name) +if(not grp)or(not grp:IsAlive())then +self.TacticalFrequencies[_freq]=_freq +self.TacticalSubscribers[_name]=nil +end +end +return self +end +function AWACS:_InitLocalization() +self:T(self.lid.."_InitLocalization") +self.gettext=TEXTANDSOUND:New("AWACS","en") +self.locale="en" +for locale,table in pairs(self.Messages)do +local Locale=string.lower(tostring(locale)) +self:T("**** Adding locale: "..Locale) +for ID,Text in pairs(table)do +self:T(string.format('Adding ID %s',tostring(ID))) +self.gettext:AddEntry(Locale,tostring(ID),Text) +end +end +return self +end +function AWACS:SetLocale(Locale) +self:T(self.lid.."SetLocale") +self.locale=Locale or"en" +return self +end +function AWACS:SetBullsCoordinate(Coordinate) +self:T(self.lid.."SetBullsCoordinate") +self.AOCoordinate=Coordinate +return self +end +function AWACS:SetMaxMissionRange(NM) +self.MaxMissionRange=NM or 125 +return self +end +function AWACS:AddFrequencyAndModulation(Frequency,Modulation) +self:T(self.lid.."AddFrequencyAndModulation") +table.insert(self.MultiFrequency,Frequency) +table.insert(self.MultiModulation,Modulation) +if self.AwacsSRS then +self.AwacsSRS:SetFrequencies(self.MultiFrequency) +self.AwacsSRS:SetModulations(self.MultiModulation) +end +return self +end +function AWACS:SetAsGCI(EWR,Delay) +self:T(self.lid.."SetGCI") +local delay=Delay or-5 +if type(EWR)=="string"then +self.GCIGroup=GROUP:FindByName(EWR) +else +self.GCIGroup=EWR +end +self.GCI=true +self:SetEscort(0) +return self +end +function AWACS:_NewRadioEntry(TextTTS,TextScreen,GID,IsGroup,ToScreen,IsNew,FromAI,IsPrio,Tactical) +self:T(self.lid.."_NewRadioEntry") +local RadioEntry={} +RadioEntry.IsNew=IsNew +RadioEntry.TextTTS=TextTTS +RadioEntry.TextScreen=TextScreen or TextTTS +RadioEntry.GroupID=GID +RadioEntry.ToScreen=ToScreen +RadioEntry.Duration=MSRS.getSpeechTime(TextTTS,0.95,false)or 8 +RadioEntry.FromAI=FromAI +RadioEntry.IsGroup=IsGroup +if Tactical then +self.TacticalQueue:Push(RadioEntry) +elseif IsPrio then +self.PrioRadioQueue:Push(RadioEntry) +else +self.RadioQueue:Push(RadioEntry) +end +return self +end +function AWACS:SetBullsEyeAlias(Name) +self:T(self.lid.."_SetBullsEyeAlias") +self.AOName=Name or"Rock" +return self +end +function AWACS:SetTOS(AICHours,CapHours) +self:T(self.lid.."SetTOS") +self.AwacsTimeOnStation=AICHours or 4 +self.CAPTimeOnStation=CapHours or 4 +return self +end +function AWACS:SetReassignmentPause(Seconds) +self.ReassignmentPause=Seconds or 180 +return self +end +function AWACS:SuppressScreenMessages(Switch) +self:T(self.lid.."_SetBullsEyeAlias") +self.SuppressScreenOutput=Switch or false +return self +end +function AWACS:ZipLip() +self:T(self.lid.."ZipLip") +self:SuppressScreenMessages(true) +self.PlayerGuidance=false +self.callsignshort=true +self.NoMissileCalls=true +return self +end +function AWACS:SetCustomCallsigns(translationTable) +self.callsignTranslations=translationTable +end +function AWACS:_GetGIDFromGroupOrName(Group) +self:T(self.lid.."_GetGIDFromGroupOrName") +self:T({Group}) +local GID=0 +local Outcome=false +local CallSign="Ghost 1" +local nametocheck=CallSign +if Group and type(Group)=="string"then +nametocheck=Group +elseif Group and Group:IsInstanceOf("GROUP")then +nametocheck=Group:GetName() +else +return false,0,CallSign +end +local managedgrps=self.ManagedGrps or{} +for _,_managed in pairs(managedgrps)do +local managed=_managed +if managed.GroupName==nametocheck then +GID=managed.GID +Outcome=true +CallSign=managed.CallSign +end +end +self:T({Outcome,GID,CallSign}) +return Outcome,GID,CallSign +end +function AWACS:_EventHandler(EventData) +self:T(self.lid.."_EventHandler") +self:T({Event=EventData.id}) +local Event=EventData +if Event.id==EVENTS.PlayerEnterAircraft or Event.id==EVENTS.PlayerEnterUnit then +if Event.IniCoalition==self.coalition then +self:_SetClientMenus() +end +end +if Event.id==EVENTS.PlayerLeaveUnit and Event.IniGroupName then +self:T("Player group left unit: "..Event.IniGroupName) +self:T("Player name left: "..Event.IniPlayerName) +self:T("Coalition = "..UTILS.GetCoalitionName(Event.IniCoalition)) +if Event.IniCoalition==self.coalition then +local Outcome,GID,CallSign=self:_GetGIDFromGroupOrName(Event.IniGroupName) +if Outcome and GID>0 then +self:T("Task Abort and Checkout Called") +self:_TaskAbort(Event.IniGroupName) +self:_CheckOut(nil,GID,true) +end +end +end +if Event.id==EVENTS.Ejection or Event.id==EVENTS.Crash or Event.id==EVENTS.Dead or Event.id==EVENTS.PilotDead then +if Event.IniCoalition==self.coalition then +local Outcome,GID,CallSign=self:_GetGIDFromGroupOrName(Event.IniGroupName) +if Outcome and GID>0 then +self:_TaskAbort(Event.IniGroupName) +self:_CheckOut(nil,GID,true) +end +end +end +if Event.id==EVENTS.Shot and self.PlayerGuidance and not self.NoMissileCalls then +if Event.IniCoalition~=self.coalition then +self:T("Shot from: "..Event.IniGroupName) +local position=Event.IniGroup:GetCoordinate() +if not position then return self end +local Category=Event.WeaponCategory +local WeaponDesc=EventData.Weapon:getDesc() +self:T({WeaponDesc}) +if WeaponDesc.category==1 and(WeaponDesc.missileCategory==1 or WeaponDesc.missileCategory==2)then +self:T("AAM or SAM Missile fired") +local warndist=25 +local Type="SAM" +if WeaponDesc.category==1 then +Type="Missile" +local guidance=WeaponDesc.guidance or 4 +if guidance==2 then +warndist=10 +elseif guidance==3 then +warndist=25 +elseif guidance==4 then +warndist=15 +elseif guidance==5 then +warndist=10 +end +end +self:_MissileWarning(position,Type,warndist) +end +end +end +return self +end +function AWACS:_MissileWarning(Coordinate,Type,Warndist) +self:T(self.lid.."_MissileWarning Type="..Type.." WarnDist="..Warndist) +if not Coordinate then return self end +local shotzone=ZONE_RADIUS:New("WarningZone",Coordinate:GetVec2(),UTILS.NMToMeters(Warndist)) +local targetgrpset=SET_GROUP:New():FilterCoalitions(self.coalitiontxt):FilterCategoryAirplane():FilterActive():FilterZones({shotzone}):FilterOnce() +if targetgrpset:Count()>0 then +local targets=targetgrpset:GetSetObjects() +for _,_grp in pairs(targets)do +if _grp and _grp:IsAlive()then +local isPlayer=_grp:IsPlayer() +if isPlayer then +local callsign=self:_GetCallSign(_grp) +local defend=self.gettext:GetEntry("DEFEND",self.locale) +local text=string.format(defend,callsign,Type,Type,Type) +self:_NewRadioEntry(text,text,0,false,self.debug,true,false,true) +end +end +end +end +return self +end +function AWACS:SetRadarBlur(Percent) +local percent=Percent or 15 +if percent<0 then percent=0 end +if percent>100 then percent=100 end +self.RadarBlur=Percent +return self +end +function AWACS:SetColdWar() +self.ModernEra=false +self.AwacsROT=AWACS.ROT.PASSIVE +self.AwacsROE=AWACS.ROE.VID +self.RadarBlur=25 +self:SetInterceptTimeline(35,25,15) +return self +end +function AWACS:SetModernEra() +self.ModernEra=true +self.AwacsROT=AWACS.ROT.EVADE +self.AwacsROE=AWACS.ROE.BVR +self.RadarBlur=15 +return self +end +function AWACS:SetModernEraDefensive() +self.ModernEra=true +self.AwacsROT=AWACS.ROT.EVADE +self.AwacsROE=AWACS.ROE.IFF +self.RadarBlur=15 +return self +end +function AWACS:SetModernEraAggressive() +self.ModernEra=true +self.AwacsROT=AWACS.ROT.RETURNFIRE +self.AwacsROE=AWACS.ROE.BVR +self.RadarBlur=15 +return self +end +function AWACS:SetPolicingModern() +self.ModernEra=true +self.AwacsROT=AWACS.ROT.BYPASSESCAPE +self.AwacsROE=AWACS.ROE.VID +self.RadarBlur=15 +return self +end +function AWACS:SetPolicingColdWar() +self.ModernEra=false +self.AwacsROT=AWACS.ROT.BYPASSESCAPE +self.AwacsROE=AWACS.ROE.VID +self.RadarBlur=25 +self:SetInterceptTimeline(35,25,15) +return self +end +function AWACS:SetPlayerGuidance(Switch) +if(Switch==nil)or(Switch==true)then +self.PlayerGuidance=true +else +self.PlayerGuidance=false +end +return self +end +function AWACS:GetName() +return self.Name or"not set" +end +function AWACS:SetInterceptTimeline(TacDistance,MeldDistance,ThreatDistance) +self.TacDistance=TacDistance or 45 +self.MeldDistance=MeldDistance or 35 +self.ThreatDistance=ThreatDistance or 25 +return self +end +function AWACS:SetAdditionalZone(Zone,Draw) +self:T(self.lid.."SetAdditionalZone") +self.BorderZone=Zone +if self.debug then +Zone:DrawZone(self.coalition,{1,0.64,0},1,{1,0.64,0},0.2,1,true) +if self.AllowMarkers then +MARKER:New(Zone:GetCoordinate(),"Defensive Zone"):ToCoalition(self.coalition) +end +elseif Draw then +Zone:DrawZone(self.coalition,{1,0.64,0},1,{1,0.64,0},0.2,1,true) +end +return self +end +function AWACS:SetRejectionZone(Zone,Draw) +self:T(self.lid.."SetRejectionZone") +self.RejectZone=Zone +if Draw then +Zone:DrawZone(self.coalition,{1,0.64,0},1,{1,0.64,0},0.2,1,true) +elseif self.debug then +Zone:DrawZone(self.coalition,{1,0.64,0},1,{1,0.64,0},0.2,1,true) +if self.AllowMarkers then +MARKER:New(Zone:GetCoordinate(),"Rejection Zone"):ToCoalition(self.coalition) +end +end +return self +end +function AWACS:DrawFEZ() +self.OpsZone:DrawZone(self.coalition,{1,0,0},1,{1,0,0},0.2,5,true) +return self +end +function AWACS:SetAwacsDetails(CallSign,CallSignNo,Angels,Speed,Heading,Leg) +self:T(self.lid.."SetAwacsDetails") +self.CallSign=CallSign or CALLSIGN.AWACS.Magic +self.CallSignNo=CallSignNo or 1 +self.AwacsAngels=Angels or 25 +local speed=Speed or 250 +self.SpeedBase=speed +self.Speed=speed +self.Heading=Heading or 0 +self.Leg=Leg or 25 +return self +end +function AWACS:SetCustomAWACSCallSign(CallsignTable) +self:T(self.lid.."SetCustomAWACSCallSign") +self.CallSignClear=CallsignTable +return self +end +function AWACS:AddGroupToDetection(Group) +self:T(self.lid.."AddGroupToDetection") +if Group and Group.ClassName and Group.ClassName=="GROUP"then +self.DetectionSet:AddGroup(Group) +elseif Group and Group.ClassName and Group.ClassName=="SET_GROUP"then +self.DetectionSet:AddSet(Group) +end +return self +end +function AWACS:SetSRS(PathToSRS,Gender,Culture,Port,Voice,Volume,PathToGoogleKey,AccessKey,Backend) +self:T(self.lid.."SetSRS") +self.PathToSRS=PathToSRS or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.Gender=Gender or MSRS.gender or"male" +self.Culture=Culture or MSRS.culture or"en-US" +self.Port=Port or MSRS.port or 5002 +self.Voice=Voice or MSRS.voice +self.PathToGoogleKey=PathToGoogleKey +self.AccessKey=AccessKey +self.Volume=Volume or 1.0 +self.Backend=Backend or MSRS.backend +BASE:I({backend=self.Backend}) +self.AwacsSRS=MSRS:New(self.PathToSRS,self.MultiFrequency,self.MultiModulation,self.Backend) +self.AwacsSRS:SetCoalition(self.coalition) +self.AwacsSRS:SetGender(self.Gender) +self.AwacsSRS:SetCulture(self.Culture) +self.AwacsSRS:SetPort(self.Port) +self.AwacsSRS:SetLabel("AWACS") +self.AwacsSRS:SetVolume(Volume) +if self.PathToGoogleKey then +self.AwacsSRS:SetProviderOptionsGoogle(self.PathToGoogleKey,self.AccessKey) +self.AwacsSRS:SetProvider(MSRS.Provider.GOOGLE) +end +if(not PathToGoogleKey)and self.AwacsSRS:GetProvider()==MSRS.Provider.GOOGLE then +self.PathToGoogleKey=MSRS.poptions.gcloud.credentials +self.Voice=Voice or MSRS.poptions.gcloud.voice +self.AccessKey=AccessKey or MSRS.poptions.gcloud.key +end +self.AwacsSRS:SetVoice(self.Voice) +return self +end +function AWACS:SetSRSVoiceCAP(Gender,Culture,Voice) +self:T(self.lid.."SetSRSVoiceCAP") +self.CAPGender=Gender or"male" +self.CAPCulture=Culture or"en-US" +self.CAPVoice=Voice or"en-GB-Standard-B" +return self +end +function AWACS:SetAICAPDetails(Callsign,MaxAICap,TOS,Speed) +self:T(self.lid.."SetAICAPDetails") +self.CapSpeedBase=Speed or 270 +self.CAPTimeOnStation=TOS or 4 +self.MaxAIonCAP=MaxAICap or 4 +self.AICAPCAllName=Callsign or CALLSIGN.Aircraft.Colt +return self +end +function AWACS:SetEscort(EscortNumber,Formation,OffsetVector,EscortEngageMaxDistance) +self:T(self.lid.."SetEscort") +if EscortNumber and EscortNumber>0 then +self.HasEscorts=true +self.EscortNumber=EscortNumber +else +self.HasEscorts=false +self.EscortNumber=0 +end +self.EscortFormation=Formation +self.OffsetVec=OffsetVector or{x=500,y=100,z=500} +self.EscortEngageMaxDistance=EscortEngageMaxDistance or 45 +return self +end +function AWACS:_MessageVector(GID,Tag,Coordinate,Angels) +self:T(self.lid.."_MessageVector") +local managedgroup=self.ManagedGrps[GID] +local Tag=Tag or"" +if managedgroup and Coordinate then +local tocallsign=managedgroup.CallSign or"Ghost 1" +local group=managedgroup.Group +local groupposition=group:GetCoordinate() +local BRtext,BRtextTTS=self:_ToStringBR(groupposition,Coordinate) +local vector=self.gettext:GetEntry("VECTORTO",self.locale) +local vectortts=self.gettext:GetEntry("VECTORTOTTS",self.locale) +local angelstxt=self.gettext:GetEntry("ANGELS",self.locale) +local text=string.format(vectortts,tocallsign,self.callsigntxt,Tag,BRtextTTS) +local textScreen=string.format(vector,tocallsign,self.callsigntxt,Tag,BRtext) +if Angels then +text=text..angelstxt..tostring(Angels).."." +textScreen=textScreen..angelstxt..tostring(Angels).."." +end +self:_NewRadioEntry(text,textScreen,0,false,self.debug,true,false) +end +return self +end +function AWACS:_StartEscorts(Shiftchange) +self:T(self.lid.."_StartEscorts") +local AwacsFG=self.AwacsFG +local group=AwacsFG:GetGroup() +local timeonstation=(self.EscortsTimeOnStation+self.ShiftChangeTime)*3600 +local OffsetX=500 +local OffsetY=500 +local OffsetZ=500 +if self.OffsetVec then +OffsetX=self.OffsetVec.x or 500 +OffsetY=self.OffsetVec.y or 500 +OffsetZ=self.OffsetVec.z or 500 +end +for i=1,self.EscortNumber do +local escort=AUFTRAG:NewESCORT(group,{x=OffsetX*((i+(i%2))/2),y=OffsetY*((i+(i%2))/2),z=(OffsetZ+OffsetZ*((i+(i%2))/2))*(-1)^i},self.EscortEngageMaxDistance,{"Air"}) +escort:SetTime(nil,timeonstation) +if self.Escortformation then +escort:SetFormation(self.Escortformation) +end +escort:SetMissionRange(self.MaxMissionRange) +self.AirWing:AddMission(escort) +self.CatchAllMissions[#self.CatchAllMissions+1]=escort +if Shiftchange then +self.EscortMissionReplacement[i]=escort +else +self.EscortMission[i]=escort +end +end +return self +end +function AWACS:_StartSettings(FlightGroup,Mission) +self:T(self.lid.."_StartSettings") +local Mission=Mission +local AwacsFG=FlightGroup +if self.AwacsMission:GetName()==Mission:GetName()then +self:T("Setting up Awacs") +AwacsFG:SetDefaultRadio(self.Frequency,self.Modulation,false) +AwacsFG:SwitchRadio(self.Frequency,self.Modulation) +AwacsFG:SetDefaultAltitude(self.AwacsAngels*1000) +AwacsFG:SetHomebase(self.Airbase) +AwacsFG:SetDefaultCallsign(self.CallSign,self.CallSignNo) +AwacsFG:SetDefaultROE(ENUMS.ROE.WeaponHold) +AwacsFG:SetDefaultAlarmstate(AI.Option.Ground.val.ALARM_STATE.GREEN) +AwacsFG:SetDefaultEPLRS(self.ModernEra) +AwacsFG:SetDespawnAfterLanding() +AwacsFG:SetFuelLowRTB(true) +AwacsFG:SetFuelLowThreshold(20) +local group=AwacsFG:GetGroup() +group:SetCommandInvisible(self.invisible) +group:SetCommandImmortal(self.immortal) +group:CommandSetCallsign(self.CallSign,self.CallSignNo,2) +group:CommandEPLRS(self.ModernEra,5) +self.AwacsFG=AwacsFG +self.callsigntxt=string.format("%s",self.CallSignClear[self.CallSign]) +self:__CheckRadioQueue(10) +if self.HasEscorts then +self:_StartEscorts() +end +self.AwacsTimeStamp=timer.getTime() +self.EscortsTimeStamp=timer.getTime() +self.PictureTimeStamp=timer.getTime()+10*60 +self.AwacsReady=true +self:Started() +elseif self.ShiftChangeAwacsRequested and self.AwacsMissionReplacement and self.AwacsMissionReplacement:GetName()==Mission:GetName()then +self:T("Setting up Awacs Replacement") +AwacsFG:SetDefaultRadio(self.Frequency,self.Modulation,false) +AwacsFG:SwitchRadio(self.Frequency,self.Modulation) +AwacsFG:SetDefaultAltitude(self.AwacsAngels*1000) +AwacsFG:SetHomebase(self.Airbase) +self.CallSignNo=self.CallSignNo+1 +AwacsFG:SetDefaultCallsign(self.CallSign,self.CallSignNo) +AwacsFG:SetDefaultROE(ENUMS.ROE.WeaponHold) +AwacsFG:SetDefaultAlarmstate(AI.Option.Ground.val.ALARM_STATE.GREEN) +AwacsFG:SetDefaultEPLRS(self.ModernEra) +AwacsFG:SetDespawnAfterLanding() +AwacsFG:SetFuelLowRTB(true) +AwacsFG:SetFuelLowThreshold(20) +local group=AwacsFG:GetGroup() +group:SetCommandInvisible(self.invisible) +group:SetCommandImmortal(self.immortal) +group:CommandSetCallsign(self.CallSign,self.CallSignNo,2) +self.callsigntxt=string.format("%s",self.CallSignClear[self.CallSign]) +local shifting=self.gettext:GetEntry("SHIFTCHANGE",self.locale) +local text=string.format(shifting,self.callsigntxt,self.AOName or"Rock") +self:T(self.lid..text) +AwacsFG:RadioTransmission(text,1,false) +self.AwacsFG=AwacsFG +if self.HasEscorts then +self:_StartEscorts(true) +end +self.AwacsTimeStamp=timer.getTime() +self.EscortsTimeStamp=timer.getTime() +self.AwacsReady=true +end +return self +end +function AWACS:_ToStringBULLS(Coordinate,ssml,TTS) +self:T(self.lid.."_ToStringBULLS") +local bullseyename=self.AOName or"Rock" +local BullsCoordinate=self.AOCoordinate +local DirectionVec3=BullsCoordinate:GetDirectionVec3(Coordinate) +local AngleRadians=Coordinate:GetAngleRadians(DirectionVec3) +local Distance=Coordinate:Get2DDistance(BullsCoordinate) +local AngleDegrees=UTILS.Round(UTILS.ToDegree(AngleRadians),0) +local Bearing=string.format('%03d',AngleDegrees) +local Distance=UTILS.Round(UTILS.MetersToNM(Distance),0) +if ssml then +return string.format("%s <say-as interpret-as='characters'>%03d</say-as>, %d",bullseyename,Bearing,Distance) +end +if TTS then +Bearing=self:_ToStringBullsTTS(Bearing) +local zero=self.gettext:GetEntry("ZERO",self.locale) +local BearingTTS=string.gsub(Bearing,"0",zero) +return string.format("%s %s, %d",bullseyename,BearingTTS,Distance) +else +return string.format("%s %s, %d",bullseyename,Bearing,Distance) +end +end +function AWACS:_ToStringBullsTTS(Text) +local text=Text +text=string.gsub(text,"Bullseye","Bulls eye") +text=string.gsub(text,"%d","%1 ") +text=string.gsub(text," ,",".") +text=string.gsub(text," $","") +return text +end +function AWACS:_GetManagedGrpID(Group) +if not Group or not Group:IsAlive()then +self:T(self.lid.."_GetManagedGrpID - Requested Group is not alive!") +return 0,false,"" +end +self:T(self.lid.."_GetManagedGrpID for "..Group:GetName()) +local GID=0 +local Outcome=false +local CallSign="Ghost 1" +local nametocheck=Group:GetName() +local managedgrps=self.ManagedGrps or{} +for _,_managed in pairs(managedgrps)do +local managed=_managed +if managed.GroupName==nametocheck then +GID=managed.GID +Outcome=true +CallSign=managed.CallSign +end +end +return GID,Outcome,CallSign +end +function AWACS:_GetCallSign(Group,GID,IsPlayer) +self:T(self.lid.."_GetCallSign - GID "..tostring(GID)) +if GID and type(GID)=="number"and GID>0 then +local managedgroup=self.ManagedGrps[GID] +self:T("Saved Callsign for TTS = "..tostring(managedgroup.CallSign)) +return managedgroup.CallSign +end +local callsign="Ghost 1" +if Group and Group:IsAlive()then +callsign=Group:GetCustomCallSign(self.callsignshort,self.keepnumber,self.callsignTranslations,self.callsignCustomFunc,self.callsignCustomArgs) +end +return callsign +end +function AWACS:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations,CallsignCustomFunc,...) +if not ShortCallsign or ShortCallsign==false then +self.callsignshort=false +else +self.callsignshort=true +end +self.keepnumber=Keepnumber or false +self.callsignTranslations=CallsignTranslations +self.callsignCustomFunc=CallsignCustomFunc +self.callsignCustomArgs=arg or{} +return self +end +function AWACS:_UpdateContactFromCluster(CID) +self:T(self.lid.."_UpdateContactFromCluster CID="..CID) +local existingcontact=self.Contacts:PullByID(CID) +local ContactTable=existingcontact.Cluster.Contacts or{} +local function GetFirstAliveContact(table) +for _,_contact in pairs(table)do +local contact=_contact +if contact and contact.group and contact.group:IsAlive()then +return contact +end +end +return nil +end +local NewContact=GetFirstAliveContact(ContactTable) +if NewContact then +existingcontact.Contact=NewContact +self.Contacts:Push(existingcontact,existingcontact.CID) +end +return self +end +function AWACS:_CheckMerges() +self:T(self.lid.."_CheckMerges") +for _id,_pilot in pairs(self.ManagedGrps)do +local pilot=_pilot +if pilot.Group and pilot.Group:IsAlive()then +local ppos=pilot.Group:GetCoordinate() +local pcallsign=pilot.CallSign +self:T(self.lid.."Checking for "..pcallsign) +if ppos then +self.Contacts:ForEach( +function(Contact) +local contact=Contact +local cpos=contact.Cluster.coordinate or contact.Contact.position or contact.Contact.group:GetCoordinate() +local dist=ppos:Get2DDistance(cpos) +local distnm=UTILS.Round(UTILS.MetersToNM(dist),0) +if(pilot.IsPlayer or self.debug)and distnm<=5 then +self:T(self.lid.."Merged") +self:_MergedCall(_id) +end +if(pilot.IsPlayer or self.debug)and distnm>5 and distnm<=self.ThreatDistance then +self:_ThreatRangeCall(_id,Contact) +end +if(pilot.IsPlayer or self.debug)and distnm>self.ThreatDistance and distnm<=self.MeldDistance then +self:_MeldRangeCall(_id,Contact) +end +if(pilot.IsPlayer or self.debug)and distnm>self.MeldDistance and distnm<=self.TacDistance then +self:_TACRangeCall(_id,Contact) +end +end +) +end +end +end +return self +end +function AWACS:_CleanUpContacts() +self:T(self.lid.."_CleanUpContacts") +if self.Contacts:Count()>0 then +local deadcontacts=FIFO:New() +self.Contacts:ForEach( +function(Contact) +local contact=Contact +if not contact.Contact.group:IsAlive()or contact.Target:IsDead()or contact.Target:IsDestroyed()or contact.Target:CountTargets()==0 then +deadcontacts:Push(contact,contact.CID) +self:T("DEAD contact CID="..contact.CID) +end +end +) +if deadcontacts:Count()>0 and(not self.NoGroupTags)then +self:T("DEAD count="..deadcontacts:Count()) +deadcontacts:ForEach( +function(Contact) +local contact=Contact +local vanished=self.gettext:GetEntry("VANISHED",self.locale) +local vanishedtts=self.gettext:GetEntry("VANISHEDTTS",self.locale) +local text=string.format(vanishedtts,self.callsigntxt,contact.TargetGroupNaming) +local textScreen=string.format(vanished,self.callsigntxt,contact.TargetGroupNaming) +self:_NewRadioEntry(text,textScreen,0,false,self.debug,true,false,true) +self.Contacts:PullByID(contact.CID) +end +) +end +if self.Contacts:Count()>0 then +self.Contacts:ForEach( +function(Contact) +local contact=Contact +self:_UpdateContactFromCluster(contact.CID) +end +) +end +deadcontacts:Clear() +end +return self +end +function AWACS:_GetIdlePilots() +self:T(self.lid.."_GetIdlePilots") +local AIPilots={} +local HumanPilots={} +for _name,_entry in pairs(self.ManagedGrps)do +local entry=_entry +self:T("Looking at entry "..entry.GID.." Name "..entry.GroupName) +local managedtask=self:_ReadAssignedTaskFromGID(entry.GID) +local overridetask=false +if managedtask then +self:T("Current task = "..(managedtask.ToDo or"Unknown")) +if managedtask.ToDo==AWACS.TaskDescription.ANCHOR then +overridetask=true +end +end +if entry.IsAI then +if entry.FlightGroup:IsAirborne()and((not entry.HasAssignedTask)or overridetask)then +self:T("Adding AI with Callsign: "..entry.CallSign) +AIPilots[#AIPilots+1]=_entry +end +elseif entry.IsPlayer and(not entry.Blocked)and(not entry.Group:IsHelicopter())then +if(not entry.HasAssignedTask)or overridetask then +local TNow=timer.getTime() +if entry.LastTasking and(TNow-entry.LastTasking>self.ReassignTime)then +self:T("Adding Human with Callsign: "..entry.CallSign) +HumanPilots[#HumanPilots+1]=_entry +end +end +end +end +return AIPilots,HumanPilots +end +function AWACS:_TargetSelectionProcess(Untargeted) +self:T(self.lid.."_TargetSelectionProcess") +local maxtargets=3 +local contactstable=self.Contacts:GetDataTable() +local targettable=FIFO:New() +local sortedtargets=FIFO:New() +local prefiltered=FIFO:New() +local HaveTargets=false +self:T(self.lid.."Initial count: "..self.Contacts:Count()) +if Untargeted then +self.Contacts:ForEach( +function(Contact) +local contact=Contact +if contact.Contact.group:IsAlive()and(contact.Status==AWACS.TaskStatus.IDLE or contact.Status==AWACS.TaskStatus.UNASSIGNED)then +if self.AwacsROE==AWACS.ROE.POLICE or self.AwacsROE==AWACS.ROE.VID then +if not(contact.IFF==AWACS.IFF.FRIENDLY or contact.IFF==AWACS.IFF.NEUTRAL)then +prefiltered:Push(contact,contact.CID) +end +else +prefiltered:Push(contact,contact.CID) +end +end +end +) +contactstable=prefiltered:GetDataTable() +self:T(self.lid.."Untargeted: "..prefiltered:Count()) +end +for _,_contact in pairs(contactstable)do +local contact=_contact +local checked=false +local contactname=contact.TargetGroupNaming or"ZETA" +local typename=contact.ReportingName or"Unknown" +self:T(self.lid..string.format("Looking at group %s type %s",contactname,typename)) +local contactcoord=contact.Cluster.coordinate or contact.Contact.position or contact.Contact.group:GetCoordinate() +local contactvec2=contactcoord:GetVec2() +if self.RejectZone then +local isinrejzone=self.RejectZone:IsVec2InZone(contactvec2) +if isinrejzone then +self:T(self.lid.."Across Border = YES - ignore") +checked=true +end +end +if not self.GCI then +local HVTCoordinate=self.OrbitZone:GetCoordinate() +local distance=UTILS.NMToMeters(200) +if contactcoord then +distance=HVTCoordinate:Get2DDistance(contactcoord) +end +self:T(self.lid.."HVT Distance = "..UTILS.Round(UTILS.MetersToNM(distance),0)) +if UTILS.MetersToNM(distance)<=45 and not checked then +self:T(self.lid.."In HVT Distance = YES") +targettable:Push(contact,distance) +checked=true +end +end +local isinopszone=self.OpsZone:IsVec2InZone(contactvec2) +local distance=self.OpsZone:Get2DDistance(contactcoord) +if isinopszone and not checked then +self:T(self.lid.."In FEZ = YES") +targettable:Push(contact,distance) +checked=true +end +local isinopszone=self.ControlZone:IsVec2InZone(contactvec2) +if isinopszone and not checked then +self:T(self.lid.."In Radar Zone = YES") +local distance=self.AOCoordinate:Get2DDistance(contactcoord) +local AOdist=UTILS.Round(UTILS.MetersToNM(distance),0) +if not contactcoord.Heading then +contactcoord.Heading=self.intel:CalcClusterDirection(contact.Cluster) +end +local aspect=contactcoord:ToStringAspect(self.ControlZone:GetCoordinate()) +local sizing=contact.Cluster.size or self.intel:ClusterCountUnits(contact.Cluster)or 1 +sizing=math.fmod((sizing*0.1),1) +local AOdist2=(AOdist/2)*sizing +AOdist2=UTILS.Round((AOdist/2)+((AOdist/2)-AOdist2),0) +self:T(self.lid.."Aspect = "..aspect.." | Size = "..sizing) +if(AOdist2<75)or(aspect=="Hot")then +local text=string.format("In AO(Adj) dist = %d(%d) NM",AOdist,AOdist2) +self:T(self.lid..text) +targettable:Push(contact,distance) +checked=true +end +end +if self.BorderZone then +local isinborderzone=self.BorderZone:IsVec2InZone(contactvec2) +if isinborderzone and not checked then +self:T(self.lid.."In BorderZone = YES") +targettable:Push(contact,distance) +checked=true +end +end +end +self:T(self.lid.."Post filter count: "..targettable:Count()) +if targettable:Count()>maxtargets then +local targets=targettable:GetSortedDataTable() +targettable:Clear() +for i=1,maxtargets do +targettable:Push(targets[i]) +end +end +sortedtargets:Clear() +prefiltered:Clear() +if targettable:Count()>0 then +HaveTargets=true +end +return HaveTargets,targettable +end +function AWACS:_CreatePicture(AO,Callsign,GID,MaxEntries,IsGeneral) +self:T(self.lid.."_CreatePicture AO="..tostring(AO).." for "..Callsign.." GID "..GID) +local managedgroup=nil +local group=nil +local groupcoord=nil +if not IsGeneral then +managedgroup=self.ManagedGrps[GID] +group=managedgroup.Group +groupcoord=group:GetCoordinate() +end +local fifo=self.PictureAO +local maxentries=self.maxspeakentries or 3 +if MaxEntries and MaxEntries>0 and MaxEntries<=3 then +maxentries=MaxEntries +end +local counter=0 +if not AO then +end +local entries=fifo:GetSize() +if entries<maxentries then maxentries=entries end +local text="" +local textScreen="" +while counter<maxentries do +counter=counter+1 +local contact=fifo:Pull() +self:T({contact}) +if contact and contact.Contact.group and contact.Contact.group:IsAlive()then +local coordinate=contact.Cluster.coordinate or contact.Contact.position or contact.Contact.group:GetCoordinate() +if not coordinate then +self:E(self.lid.."NO Coordinate for this cluster! CID="..contact.CID) +self:E({contact}) +break +end +if not coordinate.Heading then +coordinate.Heading=contact.Contact.heading or contact.Contact.group:GetHeading() +end +local refBRAA="" +local refBRAATTS="" +if self.NoGroupTags then +local grouptxt=self.gettext:GetEntry("GROUPCAP",self.locale) +text=grouptxt.."." +textScreen=grouptxt.."," +else +local grouptxt=self.gettext:GetEntry("GROUP",self.locale) +text=contact.TargetGroupNaming.." "..grouptxt.."." +textScreen=contact.TargetGroupNaming.." "..grouptxt.."," +end +if IsGeneral or not self.PlayerGuidance then +local milestxt=self.gettext:GetEntry("MILES",self.locale) +local thsdtxt=self.gettext:GetEntry("THOUSAND",self.locale) +refBRAA=self:_ToStringBULLS(coordinate) +refBRAATTS=self:_ToStringBULLS(coordinate,false,true) +local alt=contact.Contact.group:GetAltitude()or 8000 +alt=UTILS.Round(UTILS.MetersToFeet(alt)/1000,0) +text=string.format("%s %s %s, %d %s.",text,refBRAATTS,milestxt,alt,thsdtxt) +textScreen=string.format("%s %s %s, %d %s.",textScreen,refBRAA,milestxt,alt,thsdtxt) +else +refBRAA=coordinate:ToStringBRAANATO(groupcoord,true,true) +refBRAATTS=string.gsub(refBRAA,"BRAA","brah") +refBRAATTS=string.gsub(refBRAATTS,"BRA","brah") +if self.PathToGoogleKey then +refBRAATTS=coordinate:ToStringBRAANATO(groupcoord,true,true,true,false,true) +end +if contact.IFF~=AWACS.IFF.BOGEY then +local bogey=self.gettext:GetEntry("BOGEY",self.locale) +refBRAA=string.gsub(refBRAA,bogey,contact.IFF) +refBRAATTS=string.gsub(refBRAATTS,bogey,contact.IFF) +end +text=text.." "..refBRAATTS +textScreen=textScreen.." "..refBRAA +end +local aspect="" +local size=contact.Contact.group:CountAliveUnits() +local threatsize,threatsizetext=self:_GetBlurredSize(size) +if threatsize>1 then +text=text.." "..threatsizetext.."." +textScreen=textScreen.." "..threatsizetext.."." +end +if contact.EngagementTag then +text=text.." "..contact.EngagementTag +textScreen=textScreen.." "..contact.EngagementTag +end +local RadioEntry_IsGroup=false +local RadioEntry_ToScreen=self.debug +if managedgroup and not IsGeneral then +RadioEntry_IsGroup=managedgroup.IsPlayer +RadioEntry_ToScreen=managedgroup.IsPlayer +end +self:_NewRadioEntry(text,textScreen,GID,RadioEntry_IsGroup,RadioEntry_ToScreen,true,false) +end +end +fifo:Clear() +return self +end +function AWACS:_CreateBogeyDope(Callsign,GID,Tactical) +self:T(self.lid.."_CreateBogeyDope for "..Callsign.." GID "..GID) +local managedgroup=self.ManagedGrps[GID] +local group=managedgroup.Group +local groupcoord=group:GetCoordinate() +local fifo=self.ContactsAO +local maxentries=1 +local counter=0 +local entries=fifo:GetSize() +if entries<maxentries then maxentries=entries end +local sortedIDs=fifo:GetIDStackSorted() +while counter<maxentries do +counter=counter+1 +local contact=fifo:PullByID(sortedIDs[counter]) +self:T({contact}) +local position=contact.Cluster.coordinate or contact.Contact.position +if contact and position then +local tag=contact.TargetGroupNaming +local reportingname=contact.ReportingName +self:_AnnounceContact(contact,false,group,true,tag,false,reportingname,Tactical) +end +end +fifo:Clear() +return self +end +function AWACS:_Picture(Group,IsGeneral) +self:T(self.lid.."_Picture") +local text="" +local textScreen=text +local general=IsGeneral +local GID,Outcome,gcallsign=self:_GetManagedGrpID(Group) +if general then +local allst=self.gettext:GetEntry("ALLSTATIONS",self.locale) +gcallsign=allst +end +if Group and Outcome then +general=false +end +if not self.intel then +local picclean=self.gettext:GetEntry("PICCLEAN",self.locale) +text=string.format(picclean,gcallsign,self.callsigntxt) +textScreen=text +self:_NewRadioEntry(text,text,GID,false,true,true,false) +return self +end +if Outcome or general then +local contactstable=self.Contacts:GetDataTable() +for _,_contact in pairs(contactstable)do +local contact=_contact +local coordVec2=contact.Contact.position:GetVec2() +if self.OpsZone:IsVec2InZone(coordVec2)then +self.PictureAO:Push(contact) +elseif self.OrbitZone and self.OrbitZone:IsVec2InZone(coordVec2)then +self.PictureAO:Push(contact) +elseif self.ControlZone:IsVec2InZone(coordVec2)then +local distance=math.floor((contact.Contact.position:Get2DDistance(self.ControlZone:GetCoordinate())/1000)+1) +self.PictureEWR:Push(contact,distance) +end +end +local clustersAO=self.PictureAO:GetSize() +local clustersEWR=self.PictureEWR:GetSize() +if clustersAO<3 and clustersEWR>0 then +local IDstack=self.PictureEWR:GetSortedDataTable() +local weneed=3-clustersAO +self:T(string.format("Picture - adding %d/%d contacts from EWR",weneed,clustersEWR)) +if weneed>clustersEWR then +weneed=clustersEWR +end +for i=1,weneed do +self.PictureAO:Push(IDstack[i]) +end +end +clustersAO=self.PictureAO:GetSize() +if clustersAO==0 and clustersEWR==0 then +local picclean=self.gettext:GetEntry("PICCLEAN",self.locale) +text=string.format(picclean,gcallsign,self.callsigntxt) +textScreen=text +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +else +if clustersAO>0 then +local picture=self.gettext:GetEntry("PICTURE",self.locale) +text=string.format("%s, %s. %s. ",gcallsign,self.callsigntxt,picture) +textScreen=string.format("%s, %s. %s. ",gcallsign,self.callsigntxt,picture) +local onetxt=self.gettext:GetEntry("ONE",self.locale) +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local groupstxt=self.gettext:GetEntry("GROUPMULTI",self.locale) +if clustersAO==1 then +text=string.format("%s%s %s. ",text,onetxt,grptxt) +textScreen=string.format("%s%s %s.\n",textScreen,onetxt,grptxt) +else +text=string.format("%s%d %s. ",text,clustersAO,groupstxt) +textScreen=string.format("%s%d %s.\n",textScreen,clustersAO,groupstxt) +end +self:_NewRadioEntry(text,textScreen,GID,Outcome,true,true,false) +self:_CreatePicture(true,gcallsign,GID,3,general) +self.PictureAO:Clear() +self.PictureEWR:Clear() +end +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,gcallsign,self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_BogeyDope(Group,Tactical) +self:T(self.lid.."_BogeyDope") +local text="" +local textScreen="" +local GID,Outcome=self:_GetManagedGrpID(Group) +local gcallsign=self:_GetCallSign(Group,GID)or"Ghost 1" +if not self.intel then +local clean=self.gettext:GetEntry("CLEAN",self.locale) +text=string.format(clean,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,0,false,true,true,false,true,Tactical) +return self +end +if Outcome then +local managedgroup=self.ManagedGrps[GID] +local pilotgroup=managedgroup.Group +local pilotcoord=managedgroup.Group:GetCoordinate() +local contactstable=self.Contacts:GetDataTable() +for _,_contact in pairs(contactstable)do +local managedcontact=_contact +local contactposition=managedcontact.Cluster.coordinate or managedcontact.Contact.position +local coordVec2=contactposition:GetVec2() +local dist=pilotcoord:Get2DDistance(contactposition) +if self.ControlZone:IsVec2InZone(coordVec2)then +self.ContactsAO:Push(managedcontact,dist) +elseif self.BorderZone and self.BorderZone:IsVec2InZone(coordVec2)then +self.ContactsAO:Push(managedcontact,dist) +else +if self.OrbitZone then +local distance=contactposition:Get2DDistance(self.OrbitZone:GetCoordinate()) +if(distance<=UTILS.NMToMeters(45))then +self.ContactsAO:Push(managedcontact,distance) +end +end +end +end +local contactsAO=self.ContactsAO:GetSize() +if contactsAO==0 then +local clean=self.gettext:GetEntry("CLEAN",self.locale) +text=string.format(clean,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,Outcome,true,false,true,Tactical) +else +if contactsAO>0 then +local dope=self.gettext:GetEntry("DOPE",self.locale) +text=string.format(dope,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +textScreen=string.format(dope,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +local onetxt=self.gettext:GetEntry("ONE",self.locale) +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local groupstxt=self.gettext:GetEntry("GROUPMULTI",self.locale) +if contactsAO==1 then +text=string.format("%s%s %s. ",text,onetxt,grptxt) +textScreen=string.format("%s%s %s.\n",textScreen,onetxt,grptxt) +else +text=string.format("%s%d %s. ",text,contactsAO,groupstxt) +textScreen=string.format("%s%d %s.\n",textScreen,contactsAO,groupstxt) +end +self:_NewRadioEntry(text,textScreen,GID,Outcome,true,true,false,true,Tactical) +self:_CreateBogeyDope(self:_GetCallSign(Group,GID)or"Ghost 1",GID,Tactical) +end +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,Tactical) +end +return self +end +function AWACS:_ShowAwacsInfo(Group) +self:T(self.lid.."_ShowAwacsInfo") +local report=REPORT:New("Info") +local STN=self.STN +report:Add("====================") +report:Add(string.format("AWACS %s",self.callsigntxt)) +report:Add(string.format("Radio: %.3f %s",self.Frequency,UTILS.GetModulationName(self.Modulation))) +if STN then +report:Add(string.format("Link-16 STN: %s",STN)) +end +report:Add(string.format("Bulls Alias: %s",self.AOName)) +report:Add(string.format("Coordinate: %s",self.AOCoordinate:ToStringLLDDM())) +report:Add("====================") +report:Add(string.format("Assignment Distance: %d NM",self.maxassigndistance)) +report:Add(string.format("TAC Distance: %d NM",self.TacDistance)) +report:Add(string.format("MELD Distance: %d NM",self.MeldDistance)) +report:Add(string.format("THREAT Distance: %d NM",self.ThreatDistance)) +report:Add("====================") +report:Add(string.format("ROE/ROT: %s, %s",self.AwacsROE,self.AwacsROT)) +MESSAGE:New(report:Text(),45,"AWACS"):ToGroup(Group) +return self +end +function AWACS:_VID(Group,Declaration) +self:T(self.lid.."_VID") +local GID,Outcome,Callsign=self:_GetManagedGrpID(Group) +local text="" +local TextTTS="" +if Outcome then +local managedgroup=self.ManagedGrps[GID] +local group=managedgroup.Group +local position=group:GetCoordinate() +local radius=UTILS.NMToMeters(self.DeclareRadius)or UTILS.NMToMeters(5) +local TID=managedgroup.CurrentTask or 0 +if TID>0 then +local task=self.ManagedTasks:ReadByID(TID) +if task.ToDo~=AWACS.TaskDescription.VID then +return self +end +if task.Status~=AWACS.TaskStatus.ASSIGNED then +return self +end +local CID=task.Cluster.CID +local cluster=self.Contacts:ReadByID(CID) +if cluster then +local gposition=cluster.Contact.group:GetCoordinate() +local cposition=gposition or cluster.Cluster.coordinate or cluster.Contact.position +local distance=cposition:Get2DDistance(position) +distance=UTILS.Round(distance,0)+1 +if distance<=radius or self.debug then +self:T("Contact VID as "..Declaration) +cluster.IFF=Declaration +task.Status=AWACS.TaskStatus.SUCCESS +self.ManagedTasks:PullByID(TID) +self.ManagedTasks:Push(task,TID) +self.Contacts:PullByID(CID) +self.Contacts:Push(cluster,CID) +local vidpos=self.gettext:GetEntry("VIDPOS",self.locale) +text=string.format(vidpos,Callsign,self.callsigntxt,Declaration) +self:T(text) +self:__VIDSuccess(3,GID,group,cluster) +else +self:T("Contact VID not close enough") +local vidneg=self.gettext:GetEntry("VIDNEG",self.locale) +text=string.format(vidneg,Callsign,self.callsigntxt) +self:T(text) +self:__VIDFailure(3,GID,group,cluster) +end +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) +end +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_Declare(Group) +self:T(self.lid.."_Declare") +local GID,Outcome,Callsign=self:_GetManagedGrpID(Group) +local text="" +local TextTTS="" +if Outcome then +local managedgroup=self.ManagedGrps[GID] +local group=managedgroup.Group +local position=group:GetCoordinate() +local radius=UTILS.NMToMeters(self.DeclareRadius)or UTILS.NMToMeters(5) +local groupzone=ZONE_GROUP:New(group:GetName(),group,radius) +local Coalitions={"red","neutral"} +if self.coalition==coalition.side.NEUTRAL then +Coalitions={"red","blue"} +elseif self.coalition==coalition.side.RED then +Coalitions={"blue","neutral"} +end +local contactset=SET_GROUP:New():FilterCategoryAirplane():FilterCoalitions(Coalitions):FilterZones({groupzone}):FilterOnce() +local numbercontacts=contactset:CountAlive()or 0 +local foundcontacts={} +if numbercontacts>0 then +contactset:ForEach( +function(airpl) +local distance=position:Get2DDistance(airpl:GetCoordinate()) +distance=UTILS.Round(distance,0)+1 +foundcontacts[distance]=airpl +end +,{} +) +for _dist,_contact in UTILS.spairs(foundcontacts)do +local distanz=_dist +local contact=_contact +local ccoalition=contact:GetCoalition() +local ctypename=contact:GetTypeName() +local ffneutral=self.gettext:GetEntry("FFNEUTRAL",self.locale) +local fffriend=self.gettext:GetEntry("FFFRIEND",self.locale) +local ffhostile=self.gettext:GetEntry("FFHOSTILE",self.locale) +local ffspades=self.gettext:GetEntry("FFSPADES",self.locale) +local friendorfoe=ffneutral +if self.self.ModernEra then +if ccoalition==self.coalition then +friendorfoe=fffriend +elseif ccoalition==coalition.side.NEUTRAL then +friendorfoe=ffneutral +elseif ccoalition~=self.coalition then +friendorfoe=ffhostile +end +else +friendorfoe=ffspades +end +self:T(string.format("Distance %d ContactName %s Coalition %d (%s) TypeName %s",distanz,contact:GetName(),ccoalition,friendorfoe,ctypename)) +text=string.format("%s. %s. %s.",Callsign,self.callsigntxt,friendorfoe) +TextTTS=text +if self.ModernEra then +text=string.format("%s %s.",text,ctypename) +end +break +end +else +local ffclean=self.gettext:GetEntry("FFCLEAN",self.locale) +text=string.format("%s. %s. %s.",Callsign,self.callsigntxt,ffclean) +TextTTS=text +end +self:_NewRadioEntry(TextTTS,text,GID,Outcome,true,true,false,true) +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_Commit(Group) +self:T(self.lid.."_Commit") +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +if Outcome then +local Pilot=self.ManagedGrps[GID] +local currtaskid=Pilot.CurrentTask +local managedtask=self.ManagedTasks:ReadByID(currtaskid) +self:T(string.format("TID %d(%d) | ToDo %s | Status %s",currtaskid,managedtask.TID,managedtask.ToDo,managedtask.Status)) +if managedtask then +if managedtask.Status==AWACS.TaskStatus.REQUESTED then +managedtask=self.ManagedTasks:PullByID(currtaskid) +managedtask.Status=AWACS.TaskStatus.ASSIGNED +self.ManagedTasks:Push(managedtask,currtaskid) +self:T(string.format("COMMITTED - TID %d(%d) for GID %d | ToDo %s | Status %s",currtaskid,GID,managedtask.TID,managedtask.ToDo,managedtask.Status)) +Pilot.HasAssignedTask=true +Pilot.CurrentTask=currtaskid +self.ManagedGrps[GID]=Pilot +local copy=self.gettext:GetEntry("COPY",self.locale) +local targetedby=self.gettext:GetEntry("TARGETEDBY",self.locale) +text=string.format(copy,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +local EngagementTag=string.format(targetedby,Pilot.CallSign) +self:_UpdateContactEngagementTag(Pilot.ContactCID,EngagementTag,false,false,AWACS.TaskStatus.ASSIGNED) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) +else +self:E(self.lid.."Cannot find REQUESTED managed task with TID="..currtaskid.." for GID="..GID) +end +else +self:E(self.lid.."Cannot find managed task with TID="..currtaskid.." for GID="..GID) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_Judy(Group) +self:T(self.lid.."_Judy") +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +if Outcome then +local Pilot=self.ManagedGrps[GID] +local currtaskid=Pilot.CurrentTask +local managedtask=self.ManagedTasks:ReadByID(currtaskid) +if managedtask then +if managedtask.Status==AWACS.TaskStatus.REQUESTED or managedtask.Status==AWACS.TaskStatus.UNASSIGNED then +managedtask=self.ManagedTasks:PullByID(currtaskid) +managedtask.Status=AWACS.TaskStatus.ASSIGNED +self.ManagedTasks:Push(managedtask,currtaskid) +local copy=self.gettext:GetEntry("COPY",self.locale) +local targetedby=self.gettext:GetEntry("TARGETEDBY",self.locale) +text=string.format(copy,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +local EngagementTag=string.format(targetedby,Pilot.CallSign) +self:_UpdateContactEngagementTag(Pilot.ContactCID,EngagementTag,false,false,AWACS.TaskStatus.ASSIGNED) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) +else +self:E(self.lid.."Cannot find REQUESTED or UNASSIGNED managed task with TID="..currtaskid.." for GID="..GID) +end +else +self:E(self.lid.."Cannot find managed task with TID="..currtaskid.." for GID="..GID) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_Unable(Group) +self:T(self.lid.."_Unable") +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +if Outcome then +local Pilot=self.ManagedGrps[GID] +local currtaskid=Pilot.CurrentTask +local managedtask=self.ManagedTasks:ReadByID(currtaskid) +self:T(string.format("UNABLE for TID %d(%d) | ToDo %s | Status %s",currtaskid,managedtask.TID,managedtask.ToDo,managedtask.Status)) +if managedtask then +if managedtask.Status==AWACS.TaskStatus.REQUESTED then +managedtask=self.ManagedTasks:PullByID(currtaskid) +managedtask.IsUnassigned=true +managedtask.Status=AWACS.TaskStatus.FAILED +self.ManagedTasks:Push(managedtask,currtaskid) +self:T(string.format("REJECTED - TID %d(%d) for GID %d | ToDo %s | Status %s",currtaskid,GID,managedtask.TID,managedtask.ToDo,managedtask.Status)) +Pilot.HasAssignedTask=false +Pilot.CurrentTask=0 +Pilot.LastTasking=timer.getTime() +self.ManagedGrps[GID]=Pilot +local copy=self.gettext:GetEntry("COPY",self.locale) +text=string.format(copy,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +local EngagementTag="" +self:_UpdateContactEngagementTag(Pilot.ContactCID,EngagementTag,false,false,AWACS.TaskStatus.UNASSIGNED) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) +else +self:E(self.lid.."Cannot find REQUESTED managed task with TID="..currtaskid.." for GID="..GID) +end +else +self:E(self.lid.."Cannot find managed task with TID="..currtaskid.." for GID="..GID) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_TaskAbort(Group) +self:T(self.lid.."_TaskAbort") +local Outcome,GID=self:_GetGIDFromGroupOrName(Group) +local text="" +if Outcome then +local Pilot=self.ManagedGrps[GID] +self:T({Pilot}) +local currtaskid=Pilot.CurrentTask +local managedtask=self.ManagedTasks:ReadByID(currtaskid) +if managedtask then +self:T(string.format("ABORT for TID %d(%d) | ToDo %s | Status %s",currtaskid,managedtask.TID,managedtask.ToDo,managedtask.Status)) +if managedtask.Status==AWACS.TaskStatus.ASSIGNED then +managedtask=self.ManagedTasks:PullByID(currtaskid) +managedtask.Status=AWACS.TaskStatus.FAILED +managedtask.IsUnassigned=true +self.ManagedTasks:Push(managedtask,currtaskid) +self:T(string.format("ABORTED - TID %d(%d) for GID %d | ToDo %s | Status %s",currtaskid,GID,managedtask.TID,managedtask.ToDo,managedtask.Status)) +Pilot.HasAssignedTask=false +Pilot.CurrentTask=0 +Pilot.LastTasking=timer.getTime() +self.ManagedGrps[GID]=Pilot +local copy=self.gettext:GetEntry("COPY",self.locale) +text=string.format(copy,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +local EngagementTag="" +self:_UpdateContactEngagementTag(Pilot.ContactCID,EngagementTag,false,false,AWACS.TaskStatus.UNASSIGNED) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false,true) +else +self:E(self.lid.."Cannot find ASSIGNED managed task with TID="..currtaskid.." for GID="..GID) +end +else +self:E(self.lid.."Cannot find managed task with TID="..currtaskid.." for GID="..GID) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_Showtask(Group) +self:T(self.lid.."_Showtask") +local GID,Outcome,Callsign=self:_GetManagedGrpID(Group) +local text="" +if Outcome then +local managedgroup=self.ManagedGrps[GID] +if managedgroup.IsPlayer then +if managedgroup.CurrentTask>0 and self.ManagedTasks:HasUniqueID(managedgroup.CurrentTask)then +local currenttask=self.ManagedTasks:ReadByID(managedgroup.CurrentTask) +if currenttask then +local status=currenttask.Status +local targettype=currenttask.Target:GetCategory() +local targetstatus=currenttask.Target:GetState() +local ToDo=currenttask.ToDo +local description=currenttask.ScreenText +local descTTS=currenttask.ScreenText +local callsign=Callsign +if self.debug then +local taskreport=REPORT:New("AWACS Tasking Display") +taskreport:Add("===============") +taskreport:Add(string.format("Task for Callsign: %s",Callsign)) +taskreport:Add(string.format("Task: %s with Status: %s",ToDo,status)) +taskreport:Add(string.format("Target of Type: %s",targettype)) +taskreport:Add(string.format("Target in State: %s",targetstatus)) +taskreport:Add("===============") +self:I(taskreport:Text()) +end +local pposition=managedgroup.Group:GetCoordinate()or managedgroup.LastKnownPosition +if currenttask.ToDo==AWACS.TaskDescription.INTERCEPT or currenttask.ToDo==AWACS.TaskDescription.VID then +local targetpos=currenttask.Target:GetCoordinate() +if pposition and targetpos then +local alti=currenttask.Cluster.altitude or currenttask.Contact.altitude or currenttask.Contact.group:GetAltitude() +local direction,direcTTS=self:_ToStringBRA(pposition,targetpos,alti) +description=description.."\nBRA "..direction +descTTS=descTTS..";BRA "..direcTTS +end +elseif currenttask.ToDo==AWACS.TaskDescription.ANCHOR or currenttask.ToDo==AWACS.TaskDescription.REANCHOR then +local targetpos=currenttask.Target:GetCoordinate() +local direction,direcTTS=self:_ToStringBR(pposition,targetpos) +description=description.."\nBR "..direction +descTTS=descTTS..";BR "..direcTTS +end +local statustxt=self.gettext:GetEntry("STATUS",self.locale) +local text=string.format("%s\n%s %s",description,statustxt,status) +local ttstext=string.format("%s. %s. %s",managedgroup.CallSign,self.callsigntxt,descTTS) +ttstext=string.gsub(ttstext,"\\n",";") +ttstext=string.gsub(ttstext,"VID","V I D") +self:_NewRadioEntry(ttstext,text,GID,true,true,false,false,true) +end +end +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:_NewRadioEntry(text,text,GID,Outcome,true,true,false) +end +return self +end +function AWACS:_CheckIn(Group) +self:T(self.lid.."_CheckIn "..Group:GetName()) +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +local textTTS="" +if not Outcome then +self.ManagedGrpID=self.ManagedGrpID+1 +local managedgroup={} +managedgroup.Group=Group +managedgroup.GroupName=Group:GetName() +managedgroup.IsPlayer=true +managedgroup.IsAI=false +managedgroup.CallSign=self:_GetCallSign(Group,GID,true)or"Ghost 1" +managedgroup.CurrentAuftrag=0 +managedgroup.CurrentTask=0 +managedgroup.HasAssignedTask=true +managedgroup.Blocked=true +managedgroup.GID=self.ManagedGrpID +managedgroup.LastKnownPosition=Group:GetCoordinate() +managedgroup.LastTasking=timer.getTime() +GID=managedgroup.GID +self.ManagedGrps[self.ManagedGrpID]=managedgroup +local alphacheckbulls=self:_ToStringBULLS(Group:GetCoordinate()) +local alphacheckbullstts=self:_ToStringBULLS(Group:GetCoordinate(),false,true) +local alpha=self.gettext:GetEntry("ALPHACHECK",self.locale) +text=string.format("%s. %s. %s. %s",managedgroup.CallSign,self.callsigntxt,alpha,alphacheckbulls) +textTTS=string.format("%s. %s. %s. %s",managedgroup.CallSign,self.callsigntxt,alpha,alphacheckbullstts) +self:__CheckedIn(1,managedgroup.GID) +if self.PlayerStationName then +self:__AssignAnchor(5,managedgroup.GID,true,self.PlayerStationName) +else +self:__AssignAnchor(5,managedgroup.GID) +end +elseif self.AwacsFG then +local nocheckin=self.gettext:GetEntry("ALREADYCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +textTTS=text +end +self:_NewRadioEntry(textTTS,text,GID,Outcome,true,true,false) +return self +end +function AWACS:_CheckInAI(FlightGroup,Group,AuftragsNr) +self:T(self.lid.."_CheckInAI "..Group:GetName().." to Auftrag Nr "..AuftragsNr) +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +if not Outcome then +self.ManagedGrpID=self.ManagedGrpID+1 +local managedgroup={} +managedgroup.Group=Group +managedgroup.GroupName=Group:GetName() +managedgroup.FlightGroup=FlightGroup +managedgroup.IsPlayer=false +managedgroup.IsAI=true +local callsignstring=UTILS.GetCallsignName(self.AICAPCAllName) +if self.callsignTranslations and self.callsignTranslations[callsignstring]then +callsignstring=self.callsignTranslations[callsignstring] +end +local callsignmajor=math.fmod(self.AICAPCAllNumber,9) +local callsign=string.format("%s %d 1",callsignstring,callsignmajor) +if self.callsignshort then +callsign=string.format("%s %d",callsignstring,callsignmajor) +end +self:T("Assigned Callsign: "..callsign) +managedgroup.CallSign=callsign +managedgroup.CurrentAuftrag=AuftragsNr +managedgroup.HasAssignedTask=false +managedgroup.GID=self.ManagedGrpID +managedgroup.LastKnownPosition=Group:GetCoordinate() +self.ManagedGrps[self.ManagedGrpID]=managedgroup +FlightGroup:SetDefaultRadio(self.Frequency,self.Modulation,false) +FlightGroup:SwitchRadio(self.Frequency,self.Modulation) +local CAPVoice=self.CAPVoice +if self.PathToGoogleKey then +CAPVoice=self.CapVoices[math.floor(math.random(1,10))] +end +FlightGroup:SetSRS(self.PathToSRS,self.CAPGender,self.CAPCulture,CAPVoice,self.Port,self.PathToGoogleKey,"FLIGHT",1) +local checkai=self.gettext:GetEntry("CHECKINAI",self.locale) +text=string.format(checkai,self.callsigntxt,managedgroup.CallSign,self.CAPTimeOnStation,self.AOName) +self:_NewRadioEntry(text,text,managedgroup.GID,Outcome,false,true,true) +local alphacheckbulls=self:_ToStringBULLS(Group:GetCoordinate(),false,true) +local alpha=self.gettext:GetEntry("ALPHACHECK",self.locale) +text=string.format("%s. %s. %s. %s",managedgroup.CallSign,self.callsigntxt,alpha,alphacheckbulls) +self:__CheckedIn(1,managedgroup.GID) +local AW=FlightGroup.legion +if AW.HasOwnStation then +self:__AssignAnchor(5,managedgroup.GID,AW.HasOwnStation,AW.StationName) +else +self:__AssignAnchor(5,managedgroup.GID) +end +else +local nocheckin=self.gettext:GetEntry("ALREADYCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +end +self:_NewRadioEntry(text,text,GID,Outcome,false,true,false) +return self +end +function AWACS:_CheckOut(Group,GID,dead) +self:T(self.lid.."_CheckOut") +local GID,Outcome=self:_GetManagedGrpID(Group) +local text="" +if Outcome then +local safeflight=self.gettext:GetEntry("SAFEFLIGHT",self.locale) +text=string.format(safeflight,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +self:T(text) +local managedgroup=self.ManagedGrps[GID] +local Stack=managedgroup.AnchorStackNo +local Angels=managedgroup.AnchorStackAngels +local GroupName=managedgroup.GroupName +if managedgroup.IsPlayer then +if self.clientmenus:HasUniqueID(GroupName)then +local menus=self.clientmenus:PullByID(GroupName) +menus.basemenu:Remove() +if self.TacticalSubscribers[GroupName]then +local Freq=self.TacticalSubscribers[GroupName] +self.TacticalFrequencies[Freq]=Freq +self.TacticalSubscribers[GroupName]=nil +end +end +end +if managedgroup.CurrentTask and managedgroup.CurrentTask>0 then +self.ManagedTasks:PullByID(managedgroup.CurrentTask) +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false) +end +self.ManagedGrps[GID]=nil +self:__CheckedOut(1,GID,Stack,Angels) +else +if not dead then +local nocheckin=self.gettext:GetEntry("NOTCHECKEDIN",self.locale) +text=string.format(nocheckin,self:_GetCallSign(Group,GID)or"Ghost 1",self.callsigntxt) +end +end +if not dead then +self:_NewRadioEntry(text,text,GID,Outcome,false,true,false) +end +return self +end +function AWACS:_SetClientMenus() +self:T(self.lid.."_SetClientMenus") +local clientset=self.clientset +local aliveset=clientset:GetSetObjects()or{} +local clientcount=0 +local clientcheckedin=0 +for _,_group in pairs(aliveset)do +local grp=_group +local cgrp=grp:GetGroup() +local cgrpname=nil +if cgrp and cgrp:IsAlive()then +cgrpname=cgrp:GetName() +self:T(cgrpname) +end +if self.MenuStrict then +if cgrp and cgrp:IsAlive()then +clientcount=clientcount+1 +local GID,checkedin=self:_GetManagedGrpID(cgrp) +if checkedin then +clientcheckedin=clientcheckedin+1 +local hasclientmenu=self.clientmenus:ReadByID(cgrpname) +local basemenu=hasclientmenu.basemenu +if hasclientmenu and(not hasclientmenu.menuset)then +self:T(self.lid.."Setting Menus for "..cgrpname) +basemenu:RemoveSubMenus() +local bogeydope=MENU_GROUP_COMMAND:New(cgrp,"Bogey Dope",basemenu,self._BogeyDope,self,cgrp) +local picture=MENU_GROUP_COMMAND:New(cgrp,"Picture",basemenu,self._Picture,self,cgrp) +local declare=MENU_GROUP_COMMAND:New(cgrp,"Declare",basemenu,self._Declare,self,cgrp) +local tasking=MENU_GROUP:New(cgrp,"Tasking",basemenu) +local showtask=MENU_GROUP_COMMAND:New(cgrp,"Showtask",tasking,self._Showtask,self,cgrp) +local commit +local unable +local abort +if self.PlayerCapAssignment then +commit=MENU_GROUP_COMMAND:New(cgrp,"Commit",tasking,self._Commit,self,cgrp) +unable=MENU_GROUP_COMMAND:New(cgrp,"Unable",tasking,self._Unable,self,cgrp) +abort=MENU_GROUP_COMMAND:New(cgrp,"Abort",tasking,self._TaskAbort,self,cgrp) +end +if self.AwacsROE==AWACS.ROE.POLICE or self.AwacsROE==AWACS.ROE.VID then +local vid=MENU_GROUP:New(cgrp,"VID as",tasking) +local hostile=MENU_GROUP_COMMAND:New(cgrp,"Hostile",vid,self._VID,self,cgrp,AWACS.IFF.ENEMY) +local neutral=MENU_GROUP_COMMAND:New(cgrp,"Neutral",vid,self._VID,self,cgrp,AWACS.IFF.NEUTRAL) +local friendly=MENU_GROUP_COMMAND:New(cgrp,"Friendly",vid,self._VID,self,cgrp,AWACS.IFF.FRIENDLY) +end +local tactical +if self.TacticalMenu then +tactical=MENU_GROUP:New(cgrp,"Tactical Radio",basemenu) +if self.TacticalSubscribers[cgrpname]then +local entry=MENU_GROUP_COMMAND:New(cgrp,"Unsubscribe",tactical,self._UnsubScribeTactRadio,self,cgrp) +else +for _,_freq in UTILS.spairs(self.TacticalFrequencies)do +local modu=UTILS.GetModulationName(self.TacticalModulation) +local text=string.format("Subscribe to %.3f %s",_freq,modu) +local entry=MENU_GROUP_COMMAND:New(cgrp,text,tactical,self._SubScribeTactRadio,self,cgrp,_freq) +end +end +end +local ainfo=MENU_GROUP_COMMAND:New(cgrp,"Awacs Info",basemenu,self._ShowAwacsInfo,self,cgrp) +local checkout=MENU_GROUP_COMMAND:New(cgrp,"Check Out",basemenu,self._CheckOut,self,cgrp) +local menus={ +groupname=cgrpname, +menuset=true, +basemenu=basemenu, +checkout=checkout, +picture=picture, +bogeydope=bogeydope, +declare=declare, +tasking=tasking, +showtask=showtask, +unable=unable, +abort=abort, +commit=commit, +tactical=tactical, +} +self.clientmenus:PullByID(cgrpname) +self.clientmenus:Push(menus,cgrpname) +end +elseif not self.clientmenus:HasUniqueID(cgrpname)then +local basemenu=MENU_GROUP:New(cgrp,self.Name,nil) +local checkin=MENU_GROUP_COMMAND:New(cgrp,"Check In",basemenu,self._CheckIn,self,cgrp) +checkin:SetTag(cgrp:GetName()) +basemenu:Refresh() +local menus={ +groupname=cgrpname, +menuset=false, +basemenu=basemenu, +checkin=checkin, +} +self.clientmenus:Push(menus,cgrpname) +local GID,hasentry=self:_GetManagedGrpID(cgrp) +if hasentry then +self:_CheckOut(cgrp,GID,true) +end +end +end +else +if cgrp and cgrp:IsAlive()and not self.clientmenus:HasUniqueID(cgrpname)then +local basemenu=MENU_GROUP:New(cgrp,self.Name,nil) +local picture=MENU_GROUP_COMMAND:New(cgrp,"Picture",basemenu,self._Picture,self,cgrp) +local bogeydope=MENU_GROUP_COMMAND:New(cgrp,"Bogey Dope",basemenu,self._BogeyDope,self,cgrp) +local declare=MENU_GROUP_COMMAND:New(cgrp,"Declare",basemenu,self._Declare,self,cgrp) +local tasking=MENU_GROUP:New(cgrp,"Tasking",basemenu) +local showtask=MENU_GROUP_COMMAND:New(cgrp,"Showtask",tasking,self._Showtask,self,cgrp) +local commit=MENU_GROUP_COMMAND:New(cgrp,"Commit",tasking,self._Commit,self,cgrp) +local unable=MENU_GROUP_COMMAND:New(cgrp,"Unable",tasking,self._Unable,self,cgrp) +local abort=MENU_GROUP_COMMAND:New(cgrp,"Abort",tasking,self._TaskAbort,self,cgrp) +if self.AwacsROE==AWACS.ROE.POLICE or self.AwacsROE==AWACS.ROE.VID then +local vid=MENU_GROUP:New(cgrp,"VID as",tasking) +local hostile=MENU_GROUP_COMMAND:New(cgrp,"Hostile",vid,self._VID,self,cgrp,AWACS.IFF.ENEMY) +local neutral=MENU_GROUP_COMMAND:New(cgrp,"Neutral",vid,self._VID,self,cgrp,AWACS.IFF.NEUTRAL) +local friendly=MENU_GROUP_COMMAND:New(cgrp,"Friendly",vid,self._VID,self,cgrp,AWACS.IFF.FRIENDLY) +end +local ainfo=MENU_GROUP_COMMAND:New(cgrp,"Awacs Info",basemenu,self._ShowAwacsInfo,self,cgrp) +local checkin=MENU_GROUP_COMMAND:New(cgrp,"Check In",basemenu,self._CheckIn,self,cgrp) +local checkout=MENU_GROUP_COMMAND:New(cgrp,"Check Out",basemenu,self._CheckOut,self,cgrp) +basemenu:Refresh() +local menus={ +groupname=cgrpname, +menuset=true, +basemenu=basemenu, +checkin=checkin, +checkout=checkout, +picture=picture, +bogeydope=bogeydope, +declare=declare, +showtask=showtask, +tasking=tasking, +unable=unable, +abort=abort, +commit=commit, +} +self.clientmenus:Push(menus,cgrpname) +end +end +end +self.MonitoringData.Players=clientcount or 0 +self.MonitoringData.PlayersCheckedin=clientcheckedin or 0 +return self +end +function AWACS:_DeleteAnchorStackFromMarker(Name,Coord) +self:T(self.lid.."_DeleteAnchorStackFromMarker") +if self.AnchorStacks:HasUniqueID(Name)and self.PlayerStationName==Name then +local stack=self.AnchorStacks:ReadByID(Name) +local marker=stack.AnchorMarker +if stack.AnchorAssignedID:Count()==0 then +marker:Remove() +if self.debug then +stack.StationZone:UndrawZone() +end +self.AnchorStacks:PullByID(Name) +self.PlayerStationName=nil +else +if self.debug then +self:I(self.lid.."**** Cannot delete station, there are CAPs assigned!") +local text=marker:GetText() +marker:TextUpdate(text.."\nMarked for deletion") +end +end +end +return self +end +function AWACS:_MoveAnchorStackFromMarker(Name,Coord) +self:T(self.lid.."_MoveAnchorStackFromMarker") +if self.AnchorStacks:HasUniqueID(Name)and self.PlayerStationName==Name then +local station=self.AnchorStacks:PullByID(Name) +local stationtag=string.format("Station: %s\nCoordinate: %s",Name,Coord:ToStringLLDDM()) +local marker=station.AnchorMarker +local zone=station.StationZone +if self.debug then +zone:UndrawZone() +end +local radius=self.StationZone:GetRadius() +if radius<10000 then radius=10000 end +station.StationZone=ZONE_RADIUS:New(Name,Coord:GetVec2(),radius) +marker:UpdateCoordinate(Coord) +marker:UpdateText(stationtag) +station.AnchorMarker=marker +if self.debug then +station.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +end +self.AnchorStacks:Push(station,Name) +end +return self +end +function AWACS:_CreateAnchorStackFromMarker(Name,Coord) +self:T(self.lid.."_CreateAnchorStackFromMarker") +local AnchorStackOne={} +AnchorStackOne.AnchorBaseAngels=self.AnchorBaseAngels +AnchorStackOne.Anchors=FIFO:New() +AnchorStackOne.AnchorAssignedID=FIFO:New() +local newname=Name +for i=1,self.AnchorMaxStacks do +AnchorStackOne.Anchors:Push((i-1)*self.AnchorStackDistance+self.AnchorBaseAngels) +end +local radius=self.StationZone:GetRadius() +if radius<10000 then radius=10000 end +AnchorStackOne.StationZone=ZONE_RADIUS:New(newname,Coord:GetVec2(),radius) +AnchorStackOne.StationZoneCoordinate=Coord +AnchorStackOne.StationZoneCoordinateText=Coord:ToStringLLDDM() +AnchorStackOne.StationName=newname +if self.debug then +AnchorStackOne.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +else +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +end +self.AnchorStacks:Push(AnchorStackOne,newname) +self.PlayerStationName=newname +return self +end +function AWACS:_CreateAnchorStack() +self:T(self.lid.."_CreateAnchorStack") +local stackscreated=self.AnchorStacks:GetSize() +if stackscreated==self.AnchorMaxAnchors then +return false,0 +end +local AnchorStackOne={} +AnchorStackOne.AnchorBaseAngels=self.AnchorBaseAngels +AnchorStackOne.Anchors=FIFO:New() +AnchorStackOne.AnchorAssignedID=FIFO:New() +local newname=self.StationZone:GetName() +for i=1,self.AnchorMaxStacks do +AnchorStackOne.Anchors:Push((i-1)*self.AnchorStackDistance+self.AnchorBaseAngels) +end +if stackscreated==0 then +local newsubname=AWACS.AnchorNames[stackscreated+1]or tostring(stackscreated+1) +newname=self.StationZone:GetName().."-"..newsubname +AnchorStackOne.StationZone=self.StationZone +AnchorStackOne.StationZoneCoordinate=self.StationZone:GetCoordinate() +AnchorStackOne.StationZoneCoordinateText=self.StationZone:GetCoordinate():ToStringLLDDM() +AnchorStackOne.StationName=newname +if self.debug then +AnchorStackOne.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +else +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +end +self.AnchorStacks:Push(AnchorStackOne,newname) +else +local newsubname=AWACS.AnchorNames[stackscreated+1]or tostring(stackscreated+1) +newname=self.StationZone:GetName().."-"..newsubname +local anchorbasecoord=self.OpsZone:GetCoordinate() +local anchorradius=anchorbasecoord:Get2DDistance(self.StationZone:GetCoordinate()) +local angel=self.StationZone:GetCoordinate():GetAngleDegrees(self.OpsZone:GetVec3()) +self:T("Angel Radians= "..angel) +local turn=math.fmod(self.AnchorTurn*stackscreated,360) +if self.AnchorTurn<0 then turn=-turn end +local newanchorbasecoord=anchorbasecoord:Translate(anchorradius,turn+angel) +local radius=self.StationZone:GetRadius() +if radius<10000 then radius=10000 end +AnchorStackOne.StationZone=ZONE_RADIUS:New(newname,newanchorbasecoord:GetVec2(),radius) +AnchorStackOne.StationZoneCoordinate=newanchorbasecoord +AnchorStackOne.StationZoneCoordinateText=newanchorbasecoord:ToStringLLDDM() +AnchorStackOne.StationName=newname +if self.debug then +AnchorStackOne.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +else +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +end +self.AnchorStacks:Push(AnchorStackOne,newname) +end +return true,self.AnchorStacks:GetSize() +end +function AWACS:_GetFreeAnchorStack() +self:T(self.lid.."_GetFreeAnchorStack") +local AnchorStackNo,Free=0,false +local availablestacks=self.AnchorStacks:GetPointerStack()or{} +for _id,_entry in pairs(availablestacks)do +local entry=_entry +local data=entry.data +if data.Anchors:IsNotEmpty()then +AnchorStackNo=_id +Free=true +break +end +end +if not Free then +local created,number=self:_CreateAnchorStack() +if created then +self:_GetFreeAnchorStack() +end +end +return AnchorStackNo,Free +end +function AWACS:_AssignAnchorToID(GID,HasOwnStation,StationName) +self:T(self.lid.."_AssignAnchorToID") +if not HasOwnStation then +local AnchorStackNo,Free=self:_GetFreeAnchorStack() +if Free then +local Anchor=self.AnchorStacks:PullByPointer(AnchorStackNo) +local freeangels=Anchor.Anchors:Pull() +Anchor.AnchorAssignedID:Push(GID) +self.AnchorStacks:Push(Anchor,Anchor.StationName) +self:T({Anchor,freeangels}) +self:__AssignedAnchor(5,GID,Anchor,AnchorStackNo,freeangels) +else +self:E(self.lid.."Cannot assign free anchor stack to GID "..GID.." Trying again in 10secs.") +self:__AssignAnchor(10,GID) +end +else +local Anchor=self.AnchorStacks:PullByID(StationName) +local freeangels=Anchor.Anchors:Pull()or 25 +Anchor.AnchorAssignedID:Push(GID) +self.AnchorStacks:Push(Anchor,StationName) +self:T({Anchor,freeangels}) +local StackNo=self.AnchorStacks.stackbyid[StationName].pointer +self:__AssignedAnchor(5,GID,Anchor,StackNo,freeangels) +end +return self +end +function AWACS:_RemoveIDFromAnchor(GID,AnchorStackNo,Angels) +local gid=GID or 0 +local stack=AnchorStackNo or 0 +local angels=Angels or 0 +local debugstring=string.format("%s_RemoveIDFromAnchor for GID=%d Stack=%d Angels=%d",self.lid,gid,stack,angels) +self:T(debugstring) +if stack>0 and angels>0 then +local AnchorStackNo=AnchorStackNo or 1 +local Anchor=self.AnchorStacks:ReadByPointer(AnchorStackNo) +local removedID=Anchor.AnchorAssignedID:PullByID(GID) +Anchor.Anchors:Push(Angels) +end +return self +end +function AWACS:_StartIntel(awacs) +self:T(self.lid.."_StartIntel") +if self.intelstarted then return self end +self.DetectionSet:AddGroup(awacs) +local intel=INTEL:New(self.DetectionSet,self.coalition,self.callsigntxt) +intel:SetClusterAnalysis(true,false,false) +local acceptzoneset=SET_ZONE:New() +acceptzoneset:AddZone(self.ControlZone) +acceptzoneset:AddZone(self.OpsZone) +if not self.GCI then +self.OrbitZone:SetRadius(UTILS.NMToMeters(55)) +acceptzoneset:AddZone(self.OrbitZone) +end +if self.BorderZone then +acceptzoneset:AddZone(self.BorderZone) +end +intel:SetAcceptZones(acceptzoneset) +if self.NoHelos then +intel:SetFilterCategory({Unit.Category.AIRPLANE}) +else +intel:SetFilterCategory({Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +end +local function NewCluster(Cluster) +self:__NewCluster(5,Cluster) +end +function intel:OnAfterNewCluster(From,Event,To,Cluster) +NewCluster(Cluster) +end +local function NewContact(Contact) +self:__NewContact(5,Contact) +end +function intel:OnAfterNewContact(From,Event,To,Contact) +NewContact(Contact) +end +local function LostContact(Contact) +self:__LostContact(5,Contact) +end +function intel:OnAfterLostContact(From,Event,To,Contact) +LostContact(Contact) +end +local function LostCluster(Cluster,Mission) +self:__LostCluster(5,Cluster,Mission) +end +function intel:OnAfterLostCluster(From,Event,To,Cluster,Mission) +LostCluster(Cluster,Mission) +end +self.intelstarted=true +intel.statusupdate=-30 +intel:__Start(5) +self.intel=intel +return self +end +function AWACS:_GetBlurredSize(size) +self:T(self.lid.."_GetBlurredSize") +local threatsize=0 +local blur=self.RadarBlur +local blurmin=100-blur +local blurmax=100+blur +local actblur=math.random(blurmin,blurmax)/100 +threatsize=math.floor(size*actblur) +if threatsize==0 then threatsize=1 end +if threatsize then end +local threatsizetext=AWACS.Shipsize[1] +if threatsize==2 then +threatsizetext=AWACS.Shipsize[2] +elseif threatsize==3 then +threatsizetext=AWACS.Shipsize[3] +elseif threatsize>3 then +threatsizetext=AWACS.Shipsize[4] +end +return threatsize,threatsizetext +end +function AWACS:_GetThreatLevelText(threatlevel) +self:T(self.lid.."_GetThreatLevelText") +local threattext="GREEN" +if threatlevel<=AWACS.THREATLEVEL.GREEN then +threattext="GREEN" +elseif threatlevel<=AWACS.THREATLEVEL.AMBER then +threattext="AMBER" +else +threattext="RED" +end +return threattext +end +function AWACS:_ToStringBR(FromCoordinate,ToCoordinate) +self:T(self.lid.."_ToStringBR") +local BRText="" +local BRTextTTS="" +local DirectionVec3=FromCoordinate:GetDirectionVec3(ToCoordinate) +local AngleRadians=FromCoordinate:GetAngleRadians(DirectionVec3) +local AngleDegrees=UTILS.Round(UTILS.ToDegree(AngleRadians),0) +local AngleDegText=string.format("%03d",AngleDegrees) +local AngleDegTextTTS="" +local zero=self.gettext:GetEntry("ZERO",self.locale) +local miles=self.gettext:GetEntry("MILES",self.locale) +AngleDegText=string.gsub(AngleDegText,"%d","%1 ") +AngleDegText=string.gsub(AngleDegText," $","") +AngleDegTextTTS=string.gsub(AngleDegText,"0",zero) +local Distance=ToCoordinate:Get2DDistance(FromCoordinate) +local distancenm=UTILS.Round(UTILS.MetersToNM(Distance),0) +BRText=string.format("%03d, %d %s",AngleDegrees,distancenm,miles) +BRTextTTS=string.format("%s, %d %s",AngleDegText,distancenm,miles) +if self.PathToGoogleKey then +BRTextTTS=string.format("%s, %d %s",AngleDegTextTTS,distancenm,miles) +end +self:T(BRText,BRTextTTS) +return BRText,BRTextTTS +end +function AWACS:_ToStringBRA(FromCoordinate,ToCoordinate,Altitude) +self:T(self.lid.."_ToStringBRA") +local BRText="" +local BRTextTTS="" +local altitude=UTILS.Round(UTILS.MetersToFeet(Altitude)/1000,0) +local DirectionVec3=FromCoordinate:GetDirectionVec3(ToCoordinate) +local AngleRadians=FromCoordinate:GetAngleRadians(DirectionVec3) +local AngleDegrees=UTILS.Round(UTILS.ToDegree(AngleRadians),0) +local AngleDegText=string.format("%03d",AngleDegrees) +AngleDegText=string.gsub(AngleDegText,"%d","%1 ") +AngleDegText=string.gsub(AngleDegText," $","") +local AngleDegTextTTS=string.gsub(AngleDegText,"0","zero") +local Distance=ToCoordinate:Get2DDistance(FromCoordinate) +local distancenm=UTILS.Round(UTILS.MetersToNM(Distance),0) +local zero=self.gettext:GetEntry("ZERO",self.locale) +local miles=self.gettext:GetEntry("MILES",self.locale) +local thsd=self.gettext:GetEntry("THOUSAND",self.locale) +local vlow=self.gettext:GetEntry("VERYLOW",self.locale) +if altitude>=1 then +BRText=string.format("%03d, %d %s, %d %s",AngleDegrees,distancenm,miles,altitude,thsd) +BRTextTTS=string.format("%s, %d %s, %d %s",AngleDegText,distancenm,miles,altitude,thsd) +if self.PathToGoogleKey then +BRTextTTS=string.format("%s, %d %s, %d %s",AngleDegTextTTS,distancenm,miles,altitude,thsd) +end +else +BRText=string.format("%03d, %d %s, %s",AngleDegrees,distancenm,miles,vlow) +BRTextTTS=string.format("%s, %d %s, %s",AngleDegText,distancenm,miles,vlow) +if self.PathToGoogleKey then +BRTextTTS=string.format("%s, %d %s, %s",AngleDegTextTTS,distancenm,miles,vlow) +end +end +self:T(BRText,BRTextTTS) +return BRText,BRTextTTS +end +function AWACS:_GetBRAfromBullsOrAO(clustercoordinate) +self:T(self.lid.."_GetBRAfromBullsOrAO") +local refcoord=self.AOCoordinate +local BRAText="" +local BRATextTTS="" +local bullsname=self.AOName or"Rock" +local stringbr,stringbrtts=self:_ToStringBR(refcoord,clustercoordinate) +BRAText=string.format("%s %s",bullsname,stringbr) +BRATextTTS=string.format("%s %s",bullsname,stringbrtts) +self:T(BRAText,BRATextTTS) +return BRAText,BRATextTTS +end +function AWACS:_CreateTaskForGroup(GroupID,Description,ScreenText,Object,TaskStatus,Auftrag,Cluster,Contact) +self:T(self.lid.."_CreateTaskForGroup "..GroupID.." Description: "..Description) +local managedgroup=self.ManagedGrps[GroupID] +local task={} +self.ManagedTaskID=self.ManagedTaskID+1 +task.TID=self.ManagedTaskID +task.AssignedGroupID=GroupID +task.Status=TaskStatus or AWACS.TaskStatus.ASSIGNED +task.ToDo=Description +task.Auftrag=Auftrag +task.Cluster=Cluster +task.Contact=Contact +task.IsPlayerTask=managedgroup.IsPlayer +task.IsUnassigned=TaskStatus==AWACS.TaskStatus.UNASSIGNED and false or true +if Object and Object:IsInstanceOf("TARGET")then +task.Target=Object +else +task.Target=TARGET:New(Object) +end +task.ScreenText=ScreenText +if Description==AWACS.TaskDescription.ANCHOR or Description==AWACS.TaskDescription.REANCHOR then +task.Target.Type=TARGET.ObjectType.ZONE +end +task.RequestedTimestamp=timer.getTime() +self.ManagedTasks:Push(task,task.TID) +managedgroup.HasAssignedTask=true +managedgroup.CurrentTask=task.TID +self:T({managedgroup}) +self.ManagedGrps[GroupID]=managedgroup +return task.TID +end +function AWACS:_ReadAssignedTaskFromGID(GroupID) +self:T(self.lid.."_GetAssignedTaskFromGID "..GroupID) +local managedgroup=self.ManagedGrps[GroupID] +if managedgroup and managedgroup.HasAssignedTask and managedgroup.CurrentTask~=0 then +local TaskID=managedgroup.CurrentTask +if self.ManagedTasks:HasUniqueID(TaskID)then +return self.ManagedTasks:ReadByID(TaskID) +end +end +return nil +end +function AWACS:_ReadAssignedGroupFromTID(TaskID) +self:T(self.lid.."_ReadAssignedGroupFromTID "..TaskID) +if self.ManagedTasks:HasUniqueID(TaskID)then +local task=self.ManagedTasks:ReadByID(TaskID) +if task and task.AssignedGroupID and task.AssignedGroupID>0 then +return self.ManagedGrps[task.AssignedGroupID] +end +end +return nil +end +function AWACS:_MessageAIReadyForTasking(GID) +self:T(self.lid.."_MessageAIReadyForTasking") +if GID>0 and self.ManagedGrps[GID]then +local managedgroup=self.ManagedGrps[GID] +local GFCallsign=self:_GetCallSign(managedgroup.Group) +local aionst=self.gettext:GetEntry("AIONSTATION",self.locale) +local TextTTS=string.format(aionst,GFCallsign,self.callsigntxt,managedgroup.AnchorStackNo or 1,managedgroup.AnchorStackAngels or 25) +self:_NewRadioEntry(TextTTS,TextTTS,GID,false,false,true,true) +end +return self +end +function AWACS:_UpdateContactEngagementTag(CID,Text,TAC,MELD,TaskStatus) +self:T(self.lid.."_UpdateContactEngagementTag") +local text=Text or"" +local contact=self.Contacts:PullByID(CID) +if contact then +contact.EngagementTag=text +contact.TACCallDone=TAC or false +contact.MeldCallDone=MELD or false +contact.Status=TaskStatus or AWACS.TaskStatus.UNASSIGNED +self.Contacts:Push(contact,CID) +end +return self +end +function AWACS:_CheckTaskQueue() +self:T(self.lid.."_CheckTaskQueue") +local opentasks=0 +local assignedtasks=0 +for _id,_managedgroup in pairs(self.ManagedGrps)do +local group=_managedgroup +if group.Group and group.Group:IsAlive()then +local coordinate=group.Group:GetCoordinate() +if coordinate then +local NewCoordinate=COORDINATE:New(0,0,0) +group.LastKnownPosition=group.LastKnownPosition:UpdateFromCoordinate(coordinate) +self.ManagedGrps[_id]=group +end +end +end +if self.ManagedTasks:IsNotEmpty()then +opentasks=self.ManagedTasks:GetSize() +self:T("Assigned Tasks: "..opentasks) +local taskstack=self.ManagedTasks:GetPointerStack() +for _id,_entry in pairs(taskstack)do +local data=_entry +local entry=data.data +local target=entry.Target +local description=entry.ToDo +if description==AWACS.TaskDescription.ANCHOR or description==AWACS.TaskDescription.REANCHOR then +self:T("Open Task ANCHOR/REANCHOR") +local managedgroup=self.ManagedGrps[entry.AssignedGroupID] +if managedgroup then +local group=managedgroup.Group +if group and group:IsAlive()then +local groupcoord=group:GetCoordinate() +local zone=target:GetObject() +self:T({zone}) +if group:IsInZone(zone)then +self:T("Open Task ANCHOR/REANCHOR success for GroupID "..entry.AssignedGroupID) +target:Stop() +if managedgroup.IsAI then +self:_MessageAIReadyForTasking(managedgroup.GID) +end +managedgroup.HasAssignedTask=false +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +self.ManagedTasks:PullByID(entry.TID) +else +self:T("Open Task ANCHOR/REANCHOR executing for GroupID "..entry.AssignedGroupID) +end +else +self.ManagedTasks:PullByID(entry.TID) +end +end +elseif description==AWACS.TaskDescription.INTERCEPT then +self:T("Open Tasks INTERCEPT") +local taskstatus=entry.Status +local targetstatus=entry.Target:GetState() +if taskstatus==AWACS.TaskStatus.UNASSIGNED then +self.ManagedTasks:PullByID(entry.TID) +break +end +local managedgroup=self.ManagedGrps[entry.AssignedGroupID] +local auftrag=entry.Auftrag +local auftragstatus="Not Known" +if auftrag then +auftragstatus=auftrag:GetState() +end +local text=string.format("ID=%d | Status=%s | TargetState=%s | AuftragState=%s",entry.TID,taskstatus,targetstatus,auftragstatus) +self:T(text) +if auftrag then +if auftrag:IsExecuting()then +entry.Status=AWACS.TaskStatus.EXECUTING +elseif auftrag:IsSuccess()then +entry.Status=AWACS.TaskStatus.SUCCESS +elseif auftrag:GetState()==AUFTRAG.Status.FAILED then +entry.Status=AWACS.TaskStatus.FAILED +end +if targetstatus=="Dead"then +entry.Status=AWACS.TaskStatus.SUCCESS +elseif targetstatus=="Alive"and auftrag:IsOver()then +entry.Status=AWACS.TaskStatus.FAILED +end +elseif entry.IsPlayerTask then +if entry.Target:IsDead()or entry.Target:IsDestroyed()or entry.Target:CountTargets()==0 then +entry.Status=AWACS.TaskStatus.SUCCESS +elseif entry.Target:IsAlive()then +local targetpos=entry.Target:GetCoordinate() +local outofzones=false +self.RejectZoneSet:ForEachZone( +function(Zone,Position) +local zone=Zone +local pos=Position +if pos and zone:IsVec2InZone(pos)then +outofzones=true +end +end, +targetpos:GetVec2() +) +if not outofzones then +outofzones=true +self.ZoneSet:ForEachZone( +function(Zone,Position) +local zone=Zone +local pos=Position +if pos and zone:IsVec2InZone(pos)then +outofzones=false +end +end, +targetpos:GetVec2() +) +end +if outofzones then +entry.Status=AWACS.TaskStatus.SUCCESS +end +end +end +if entry.Status==AWACS.TaskStatus.SUCCESS then +self:T("Open Tasks INTERCEPT success for GroupID "..entry.AssignedGroupID) +if managedgroup then +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",true,true,AWACS.TaskStatus.SUCCESS) +managedgroup.HasAssignedTask=false +managedgroup.ContactCID=0 +managedgroup.LastTasking=timer.getTime() +if managedgroup.IsAI then +managedgroup.CurrentAuftrag=0 +else +managedgroup.CurrentTask=0 +end +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +self.ManagedTasks:PullByID(entry.TID) +self:__InterceptSuccess(1) +self:__ReAnchor(5,managedgroup.GID) +end +elseif entry.Status==AWACS.TaskStatus.FAILED then +self:T("Open Tasks INTERCEPT failed for GroupID "..entry.AssignedGroupID) +if managedgroup then +managedgroup.HasAssignedTask=false +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) +managedgroup.ContactCID=0 +managedgroup.LastTasking=timer.getTime() +if managedgroup.IsAI then +managedgroup.CurrentAuftrag=0 +else +managedgroup.CurrentTask=0 +end +if managedgroup.IsPlayer then +entry.IsPlayerTask=false +end +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +if managedgroup.Group:IsAlive()or(managedgroup.FlightGroup and managedgroup.FlightGroup:IsAlive())then +self:__ReAnchor(5,managedgroup.GID) +end +end +self.ManagedTasks:PullByID(entry.TID) +self:__InterceptFailure(1) +elseif entry.Status==AWACS.TaskStatus.REQUESTED then +self:T("Open Tasks INTERCEPT REQUESTED for GroupID "..entry.AssignedGroupID) +local created=entry.RequestedTimestamp or timer.getTime()-120 +local Tnow=timer.getTime() +local Trunning=(Tnow-created)/60 +local text=string.format("Task TID %s Requested %d minutes ago.",entry.TID,Trunning) +if Trunning>self.ReassignmentPause then +entry.Status=AWACS.TaskStatus.UNASSIGNED +self.ManagedTasks:PullByID(entry.TID) +end +self:T(text) +end +elseif description==AWACS.TaskDescription.VID then +local managedgroup=self.ManagedGrps[entry.AssignedGroupID] +if(not managedgroup)or(not managedgroup.Group:IsAlive())then +self.ManagedTasks:PullByID(entry.TID) +return self +end +if entry.Target:IsDead()or entry.Target:IsDestroyed()or entry.Target:CountTargets()==0 then +entry.Status=AWACS.TaskStatus.SUCCESS +elseif entry.Target:IsAlive()then +self:T("Checking VID target out of bounds") +local targetpos=entry.Target:GetCoordinate() +local outofzones=false +self.RejectZoneSet:ForEachZone( +function(Zone,Position) +local zone=Zone +local pos=Position +if pos and zone:IsVec2InZone(pos)then +outofzones=true +end +end, +targetpos:GetVec2() +) +if not outofzones then +outofzones=true +self.ZoneSet:ForEachZone( +function(Zone,Position) +local zone=Zone +local pos=Position +if pos and zone:IsVec2InZone(pos)then +outofzones=false +end +end, +targetpos:GetVec2() +) +end +if outofzones then +entry.Status=AWACS.TaskStatus.SUCCESS +self:T("Out of bounds - SUCCESS") +end +end +if entry.Status==AWACS.TaskStatus.REQUESTED then +self:T("Open Tasks VID REQUESTED for GroupID "..entry.AssignedGroupID) +local created=entry.RequestedTimestamp or timer.getTime()-120 +local Tnow=timer.getTime() +local Trunning=(Tnow-created)/60 +local text=string.format("Task TID %s Requested %d minutes ago.",entry.TID,Trunning) +if Trunning>self.ReassignmentPause then +entry.Status=AWACS.TaskStatus.UNASSIGNED +self.ManagedTasks:PullByID(entry.TID) +end +self:T(text) +elseif entry.Status==AWACS.TaskStatus.ASSIGNED then +self:T("Open Tasks VID ASSIGNED for GroupID "..entry.AssignedGroupID) +elseif entry.Status==AWACS.TaskStatus.SUCCESS then +self:T("Open Tasks VID success for GroupID "..entry.AssignedGroupID) +self.ManagedTasks:PullByID(entry.TID) +local Contact=self.Contacts:ReadByID(entry.Contact.CID) +if Contact and(Contact.IFF==AWACS.IFF.FRIENDLY or Contact.IFF==AWACS.IFF.NEUTRAL)then +self:T("IFF outcome friendly/neutral for GroupID "..entry.AssignedGroupID) +if managedgroup then +managedgroup.HasAssignedTask=false +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) +managedgroup.ContactCID=0 +managedgroup.LastTasking=timer.getTime() +if managedgroup.IsAI then +managedgroup.CurrentAuftrag=0 +else +managedgroup.CurrentTask=0 +end +if managedgroup.IsPlayer then +entry.IsPlayerTask=false +end +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +self:__ReAnchor(5,managedgroup.GID) +end +elseif Contact and Contact.IFF==AWACS.IFF.ENEMY then +self:T("IFF outcome hostile for GroupID "..entry.AssignedGroupID) +entry.ToDo=AWACS.TaskDescription.INTERCEPT +entry.Status=AWACS.TaskStatus.ASSIGNED +local cname=Contact.TargetGroupNaming +entry.ScreenText=string.format("Engage hostile %s group.",cname) +self.ManagedTasks:Push(entry,entry.TID) +local TextTTS=string.format("%s, %s. Engage hostile target!",managedgroup.CallSign,self.callsigntxt) +self:_NewRadioEntry(TextTTS,TextTTS,managedgroup.GID,true,self.debug,true,false,true) +elseif not Contact then +self:T("IFF outcome target DEAD for GroupID "..entry.AssignedGroupID) +if managedgroup then +managedgroup.HasAssignedTask=false +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) +managedgroup.ContactCID=0 +managedgroup.LastTasking=timer.getTime() +if managedgroup.IsAI then +managedgroup.CurrentAuftrag=0 +else +managedgroup.CurrentTask=0 +end +if managedgroup.IsPlayer then +entry.IsPlayerTask=false +end +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +if managedgroup.Group:IsAlive()or managedgroup.FlightGroup:IsAlive()then +self:__ReAnchor(5,managedgroup.GID) +end +end +end +elseif entry.Status==AWACS.TaskStatus.FAILED then +self:T("Open Tasks VID failed for GroupID "..entry.AssignedGroupID) +if managedgroup then +managedgroup.HasAssignedTask=false +self:_UpdateContactEngagementTag(managedgroup.ContactCID,"",false,false,AWACS.TaskStatus.UNASSIGNED) +managedgroup.ContactCID=0 +managedgroup.LastTasking=timer.getTime() +if managedgroup.IsAI then +managedgroup.CurrentAuftrag=0 +else +managedgroup.CurrentTask=0 +end +if managedgroup.IsPlayer then +entry.IsPlayerTask=false +end +self.ManagedGrps[entry.AssignedGroupID]=managedgroup +if managedgroup.Group:IsAlive()or managedgroup.FlightGroup:IsAlive()then +self:__ReAnchor(5,managedgroup.GID) +end +end +self.ManagedTasks:PullByID(entry.TID) +self:__InterceptFailure(1) +end +end +end +end +return self +end +function AWACS:_LogStatistics() +self:T(self.lid.."_LogStatistics") +local text=string.gsub(UTILS.OneLineSerialize(self.MonitoringData),",","\n") +local text=string.gsub(text,"{","\n") +local text=string.gsub(text,"}","") +local text=string.gsub(text,"="," = ") +self:T(text) +if self.MonitoringOn then +MESSAGE:New(text,20,"AWACS",false):ToAll() +end +return self +end +function AWACS:AddCAPAirWing(AirWing,Zone) +self:T(self.lid.."AddCAPAirWing") +if AirWing then +AirWing:SetUsingOpsAwacs(self) +local distance=self.AOCoordinate:Get2DDistance(AirWing:GetCoordinate()) +if Zone then +local stackscreated=self.AnchorStacks:GetSize() +if stackscreated==self.AnchorMaxAnchors then +self:E(self.lid.."Max number of stacks already created!") +else +local AnchorStackOne={} +AnchorStackOne.AnchorBaseAngels=self.AnchorBaseAngels +AnchorStackOne.Anchors=FIFO:New() +AnchorStackOne.AnchorAssignedID=FIFO:New() +local newname=Zone:GetName() +for i=1,self.AnchorMaxStacks do +AnchorStackOne.Anchors:Push((i-1)*self.AnchorStackDistance+self.AnchorBaseAngels) +end +local newsubname=AWACS.AnchorNames[stackscreated+1]or tostring(stackscreated+1) +newname=Zone:GetName().."-"..newsubname +AnchorStackOne.StationZone=Zone +AnchorStackOne.StationZoneCoordinate=Zone:GetCoordinate() +AnchorStackOne.StationZoneCoordinateText=Zone:GetCoordinate():ToStringLLDDM() +AnchorStackOne.StationName=newname +if self.debug then +AnchorStackOne.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +else +local stationtag=string.format("Station: %s\nCoordinate: %s",newname,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +AnchorStackOne.AnchorMarker=MARKER:New(AnchorStackOne.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +end +self.AnchorStacks:Push(AnchorStackOne,newname) +AirWing.HasOwnStation=true +AirWing.StationName=newname +end +end +self.CAPAirwings:Push(AirWing,distance) +end +return self +end +function AWACS:_AnnounceContact(Contact,IsNew,Group,IsBogeyDope,Tag,IsPopup,ReportingName,Tactical) +self:T(self.lid.."_AnnounceContact") +local tag="" +local Tag=Tag +local CID=0 +if not Tag then +CID=Contact.CID or 0 +Tag=Contact.TargetGroupNaming or"" +end +if self.NoGroupTags then +Tag=nil +end +local isGroup=false +local GID=0 +local grpcallsign="Ghost 1" +if Group and Group:IsAlive()then +GID,isGroup,grpcallsign=self:_GetManagedGrpID(Group) +self:T("GID="..GID.." CheckedIn = "..tostring(isGroup)) +end +local cluster=Contact.Cluster +local intel=self.intel +local size=self.intel:ClusterCountUnits(cluster) +local threatsize,threatsizetext=self:_GetBlurredSize(size) +local clustercoordinate=Contact.Cluster.coordinate or Contact.Contact.position +local heading=Contact.Contact.group:GetHeading()or self.intel:CalcClusterDirection(cluster) +clustercoordinate:SetHeading(Contact.Contact.group:GetHeading()) +local BRAfromBulls,BRAfromBullsTTS=self:_GetBRAfromBullsOrAO(clustercoordinate) +self:T(BRAfromBulls) +self:T(BRAfromBullsTTS) +BRAfromBulls=BRAfromBulls.."." +BRAfromBullsTTS=BRAfromBullsTTS.."." +if isGroup then +BRAfromBulls=clustercoordinate:ToStringBRAANATO(Group:GetCoordinate(),true,true) +BRAfromBullsTTS=string.gsub(BRAfromBulls,"BRAA","brah") +BRAfromBullsTTS=string.gsub(BRAfromBullsTTS,"BRA","brah") +if self.PathToGoogleKey then +BRAfromBullsTTS=clustercoordinate:ToStringBRAANATO(Group:GetCoordinate(),true,true,true,false,true) +end +end +local BRAText="" +local TextScreen="" +if isGroup then +BRAText=string.format("%s, %s.",grpcallsign,self.callsigntxt) +TextScreen=string.format("%s, %s.",grpcallsign,self.callsigntxt) +else +BRAText=string.format("%s.",self.callsigntxt) +TextScreen=string.format("%s.",self.callsigntxt) +end +local newgrp=self.gettext:GetEntry("NEWGROUP",self.locale) +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local GRPtxt=self.gettext:GetEntry("GROUPCAP",self.locale) +local popup=self.gettext:GetEntry("POPUP",self.locale) +if IsNew and self.PlayerGuidance then +BRAText=string.format("%s %s.",BRAText,newgrp) +TextScreen=string.format("%s %s.",TextScreen,newgrp) +elseif IsPopup then +BRAText=string.format("%s %s %s.",BRAText,popup,grptxt) +TextScreen=string.format("%s %s %s.",TextScreen,popup,grptxt) +elseif IsBogeyDope and Tag and Tag~=""then +BRAText=string.format("%s %s %s.",BRAText,Tag,grptxt) +TextScreen=string.format("%s %s %s.",TextScreen,Tag,grptxt) +else +BRAText=string.format("%s %s.",BRAText,GRPtxt) +TextScreen=string.format("%s %s.",TextScreen,GRPtxt) +end +if not IsBogeyDope then +if Tag and Tag~=""then +BRAText=BRAText.." "..Tag.."." +TextScreen=TextScreen.." "..Tag.."." +end +end +if threatsize>1 then +BRAText=BRAText.." "..BRAfromBullsTTS.." "..threatsizetext.."." +TextScreen=TextScreen.." "..BRAfromBulls.." "..threatsizetext.."." +else +BRAText=BRAText.." "..BRAfromBullsTTS +TextScreen=TextScreen.." "..BRAfromBulls +end +if self.ModernEra then +local high=self.gettext:GetEntry("HIGH",self.locale) +local vfast=self.gettext:GetEntry("VERYFAST",self.locale) +local fast=self.gettext:GetEntry("FAST",self.locale) +if ReportingName and ReportingName~="Bogey"then +ReportingName=string.gsub(ReportingName,"_"," ") +BRAText=BRAText.." "..ReportingName.."." +TextScreen=TextScreen.." "..ReportingName.."." +end +local height=Contact.Contact.group:GetHeight() +local height=UTILS.Round(UTILS.MetersToFeet(height)/1000,0) +if height>=40 then +BRAText=BRAText..high +TextScreen=TextScreen..high +end +local speed=Contact.Contact.group:GetVelocityKNOTS() +if speed>900 then +BRAText=BRAText..vfast +TextScreen=TextScreen..vfast +elseif speed>=600 and speed<=900 then +BRAText=BRAText..fast +TextScreen=TextScreen..fast +end +end +BRAText=string.gsub(BRAText,"BRAA","brah") +BRAText=string.gsub(BRAText,"BRA","brah") +local prio=IsNew or IsBogeyDope +self:_NewRadioEntry(BRAText,TextScreen,GID,isGroup,true,IsNew,false,prio,Tactical) +return self +end +function AWACS:_GetAliveOpsGroupFromTable(OpsGroups) +self:T(self.lid.."_GetAliveOpsGroupFromTable") +local handback=nil +for _,_OG in pairs(OpsGroups or{})do +local OG=_OG +if OG and OG:IsAlive()then +handback=OG +break +end +end +return handback +end +function AWACS:_CleanUpAIMissionStack() +self:T(self.lid.."_CleanUpAIMissionStack") +local CAPMissions=0 +local Alert5Missions=0 +local InterceptMissions=0 +local MissionStack=FIFO:New() +self:T("Checking MissionStack") +for _,_mission in pairs(self.CatchAllMissions)do +local mission=_mission +local type=mission:GetType() +if type==AUFTRAG.Type.ALERT5 and mission:IsNotOver()then +MissionStack:Push(mission,mission.auftragsnummer) +Alert5Missions=Alert5Missions+1 +elseif type==AUFTRAG.Type.CAP and mission:IsNotOver()then +MissionStack:Push(mission,mission.auftragsnummer) +CAPMissions=CAPMissions+1 +elseif type==AUFTRAG.Type.INTERCEPT and mission:IsNotOver()then +MissionStack:Push(mission,mission.auftragsnummer) +InterceptMissions=InterceptMissions+1 +end +end +self.AICAPMissions=nil +self.AICAPMissions=MissionStack +return CAPMissions,Alert5Missions,InterceptMissions +end +function AWACS:_ConsistencyCheck() +self:T(self.lid.."_ConsistencyCheck") +if self.debug then +self:T("CatchAllMissions") +local catchallm={} +local report1=REPORT:New("CatchAll") +report1:Add("====================") +report1:Add("CatchAllMissions") +report1:Add("====================") +for _,_mission in pairs(self.CatchAllMissions)do +local mission=_mission +local nummer=mission.auftragsnummer or 0 +local type=mission:GetType() +local state=mission:GetState() +local FG=mission:GetOpsGroups() +local OG=self:_GetAliveOpsGroupFromTable(FG) +local OGName="UnknownFromMission" +if OG then +OGName=OG:GetName() +end +report1:Add(string.format("Auftrag Nr %d Type %s State %s FlightGroup %s",nummer,type,state,OGName)) +if mission:IsNotOver()then +catchallm[#catchallm+1]=mission +end +end +self.CatchAllMissions=nil +self.CatchAllMissions=catchallm +local catchallfg={} +self:T("CatchAllFGs") +report1:Add("====================") +report1:Add("CatchAllFGs") +report1:Add("====================") +for _,_fg in pairs(self.CatchAllFGs)do +local FG=_fg +local mission=FG:GetMissionCurrent() +local OGName=FG:GetName()or"UnknownFromFG" +local nummer=0 +local type="No Type" +local state="None" +if mission then +type=mission:GetType() +nummer=mission.auftragsnummer or 0 +state=mission:GetState() +end +report1:Add(string.format("Auftrag Nr %d Type %s State %s FlightGroup %s",nummer,type,state,OGName)) +if FG:IsAlive()then +catchallfg[#catchallfg+1]=FG +end +end +report1:Add("====================") +self:T(report1:Text()) +self.CatchAllFGs=nil +self.CatchAllFGs=catchallfg +end +return self +end +function AWACS:_CheckAICAPOnStation() +self:T(self.lid.."_CheckAICAPOnStation") +self:_ConsistencyCheck() +local capmissions,alert5missions,interceptmissions=self:_CleanUpAIMissionStack() +self:T("CAP="..capmissions.." ALERT5="..alert5missions.." Requested="..self.AIRequested) +if self.MaxAIonCAP>0 then +local onstation=capmissions+alert5missions +if capmissions>self.MaxAIonCAP then +self:T(string.format("*** Onstation %d > MaxAIOnCAP %d",onstation,self.MaxAIonCAP)) +local mission=self.AICAPMissions:Pull() +local Groups=mission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(Groups) +local GID,checkedin=self:_GetManagedGrpID(OpsGroup) +mission:__Cancel(30) +self.AIRequested=self.AIRequested-1 +if checkedin then +self:_CheckOut(OpsGroup,GID) +end +end +if capmissions<self.MaxAIonCAP and alert5missions<self.MaxAIonCAP+2 then +local AnchorStackNo,free=self:_GetFreeAnchorStack() +if free then +local mission=AUFTRAG:NewALERT5(AUFTRAG.Type.CAP) +self.CatchAllMissions[#self.CatchAllMissions+1]=mission +local availableAWS=self.CAPAirwings:Count() +local AWS=self.CAPAirwings:GetDataTable() +self.AIRequested=self.AIRequested+1 +local selectedAW=AWS[(((self.AIRequested-1)%availableAWS)+1)] +selectedAW:AddMission(mission) +self:T("CAP="..capmissions.." ALERT5="..alert5missions.." Requested="..self.AIRequested) +end +end +if onstation>0 and capmissions<self.MaxAIonCAP then +local missions=self.AICAPMissions:GetDataTable() +for _,_Mission in pairs(missions)do +local mission=_Mission +self:T("Looking at AuftragsNr "..mission.auftragsnummer) +local type=mission:GetType() +local state=mission:GetState() +if type==AUFTRAG.Type.ALERT5 then +local OpsGroups=mission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +local FGstate=mission:GetGroupStatus(OpsGroup) +if OpsGroup then +FGstate=OpsGroup:GetState() +self:T("FG Object in state: "..FGstate) +end +if OpsGroup and(FGstate=="Parking"or FGstate=="Cruising")then +local GID,CheckedInAlready=self:_GetManagedGrpID(OpsGroup:GetGroup()) +if not CheckedInAlready then +self:_SetAIROE(OpsGroup,OpsGroup:GetGroup()) +self:_CheckInAI(OpsGroup,OpsGroup:GetGroup(),mission.auftragsnummer) +end +end +end +end +end +if onstation>0 then +local report=REPORT:New("CAP Mission Status") +report:Add("===============") +local missions=self.AICAPMissions:GetDataTable() +local i=1 +for _,_Mission in pairs(missions)do +local mission=_Mission +if mission then +i=i+1 +report:Add(string.format("Entry %d",i)) +report:Add(string.format("Mission No %d",mission.auftragsnummer)) +report:Add(string.format("Mission Type %s",mission:GetType())) +report:Add(string.format("Mission State %s",mission:GetState())) +local OpsGroups=mission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +if OpsGroup then +local OpsName=OpsGroup:GetName()or"Unknown" +local found,GID,OpsCallSign=self:_GetGIDFromGroupOrName(OpsGroup) +report:Add(string.format("Mission FG %s",OpsName)) +report:Add(string.format("Callsign %s",OpsCallSign)) +report:Add(string.format("Mission FG State %s",OpsGroup:GetState())) +else +report:Add("***** Cannot obtain (yet) this missions OpsGroup!") +end +report:Add(string.format("Target Type %s",mission:GetTargetType())) +end +report:Add("===============") +end +if self.debug then +self:I(report:Text()) +end +end +end +return self +end +function AWACS:_SetAIROE(FlightGroup,Group) +self:T(self.lid.."_SetAIROE") +local ROE=self.AwacsROE or AWACS.ROE.POLICE +local ROT=self.AwacsROT or AWACS.ROT.PASSIVE +Group:OptionAlarmStateGreen() +Group:OptionECM_OnlyLockByRadar() +Group:OptionROEHoldFire() +Group:OptionROTEvadeFire() +Group:OptionRTBBingoFuel(true) +Group:OptionKeepWeaponsOnThreat() +local callname=self.AICAPCAllName or CALLSIGN.Aircraft.Colt +self.AICAPCAllNumber=self.AICAPCAllNumber+1 +Group:CommandSetCallsign(callname,math.fmod(self.AICAPCAllNumber,9)) +FlightGroup:SetDefaultAlarmstate(AI.Option.Ground.val.ALARM_STATE.GREEN) +FlightGroup:SetDefaultCallsign(callname,math.fmod(self.AICAPCAllNumber,9)) +if ROE==AWACS.ROE.POLICE or ROE==AWACS.ROE.VID then +FlightGroup:SetDefaultROE(ENUMS.ROE.WeaponHold) +elseif ROE==AWACS.ROE.IFF then +FlightGroup:SetDefaultROE(ENUMS.ROE.ReturnFire) +elseif ROE==AWACS.ROE.BVR then +FlightGroup:SetDefaultROE(ENUMS.ROE.OpenFire) +end +if ROT==AWACS.ROT.BYPASSESCAPE or ROT==AWACS.ROT.PASSIVE then +FlightGroup:SetDefaultROT(ENUMS.ROT.PassiveDefense) +elseif ROT==AWACS.ROT.OPENFIRE or ROT==AWACS.ROT.RETURNFIRE then +FlightGroup:SetDefaultROT(ENUMS.ROT.BypassAndEscape) +elseif ROT==AWACS.ROT.EVADE then +FlightGroup:SetDefaultROT(ENUMS.ROT.EvadeFire) +end +FlightGroup:SetFuelLowRTB(true) +FlightGroup:SetFuelLowThreshold(0.2) +FlightGroup:SetEngageDetectedOff() +FlightGroup:SetOutOfAAMRTB(true) +return self +end +function AWACS:_TACRangeCall(GID,Contact) +self:T(self.lid.."_TACRangeCall") +if not Contact then return self end +local pilotcallsign=self:_GetCallSign(nil,GID) +local managedgroup=self.ManagedGrps[GID] +local contact=Contact.Contact +local contacttag=Contact.TargetGroupNaming +local name=managedgroup.GroupName +if contact then +local position=contact.position +if position then +local distance=position:Get2DDistance(managedgroup.Group:GetCoordinate()) +distance=UTILS.Round(UTILS.MetersToNM(distance)) +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local miles=self.gettext:GetEntry("MILES",self.locale) +local text=string.format("%s. %s. %s %s, %d %s.",self.callsigntxt,pilotcallsign,contacttag,grptxt,distance,miles) +if not self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true) +end +self:_UpdateContactEngagementTag(Contact.CID,Contact.EngagementTag,true,false,AWACS.TaskStatus.EXECUTING) +if GID and GID~=0 then +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +if self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true,true) +end +end +end +end +end +return self +end +function AWACS:_MeldRangeCall(GID,Contact) +self:T(self.lid.."_MeldRangeCall") +if not Contact then return self end +local pilotcallsign=self:_GetCallSign(nil,GID) +local managedgroup=self.ManagedGrps[GID] +local flightpos=managedgroup.Group:GetCoordinate() +local contact=Contact.Contact +local contacttag=Contact.TargetGroupNaming or"Bogey" +local name=managedgroup.GroupName +if contact then +local position=contact.position +if position then +local BRATExt="" +if self.PathToGoogleKey then +BRATExt=position:ToStringBRAANATO(flightpos,false,false,true,false,true) +else +BRATExt=position:ToStringBRAANATO(flightpos,false,false) +end +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local text=string.format("%s. %s. %s %s, %s",self.callsigntxt,pilotcallsign,contacttag,grptxt,BRATExt) +if not self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true) +end +self:_UpdateContactEngagementTag(Contact.CID,Contact.EngagementTag,true,true,AWACS.TaskStatus.EXECUTING) +if GID and GID~=0 then +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +local name=managedgroup.GroupName +if self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true,true) +end +end +end +end +end +return self +end +function AWACS:_ThreatRangeCall(GID,Contact) +self:T(self.lid.."_ThreatRangeCall") +if not Contact then return self end +local pilotcallsign=self:_GetCallSign(nil,GID) +local managedgroup=self.ManagedGrps[GID] +local flightpos=managedgroup.Group:GetCoordinate()or managedgroup.LastKnownPosition +local contact=Contact.Contact +local contacttag=Contact.TargetGroupNaming or"Bogey" +local name=managedgroup.GroupName +local IsSub=self.TacticalSubscribers[name]and true or false +if contact then +local position=contact.position or contact.group:GetCoordinate() +if position then +local BRATExt="" +if self.PathToGoogleKey then +BRATExt=position:ToStringBRAANATO(flightpos,false,false,true,false,true) +else +BRATExt=position:ToStringBRAANATO(flightpos,false,false) +end +local grptxt=self.gettext:GetEntry("GROUP",self.locale) +local thrt=self.gettext:GetEntry("THREAT",self.locale) +local text=string.format("%s. %s. %s %s, %s. %s",self.callsigntxt,pilotcallsign,contacttag,grptxt,thrt,BRATExt) +if string.find(text,"BRAA",1,true)then +text=string.gsub(text,"BRAA","brah") +elseif string.find(text,"BRA",1,true)then +text=string.gsub(text,"BRA","brah") +end +if IsSub==false then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true) +end +if GID and GID~=0 then +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +local name=managedgroup.GroupName +if self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true,true) +end +end +end +end +end +return self +end +function AWACS:_MergedCall(GID) +self:T(self.lid.."_MergedCall") +local pilotcallsign=self:_GetCallSign(nil,GID) +local merge=self.gettext:GetEntry("MERGED",self.locale) +local text=string.format("%s. %s. %s.",self.callsigntxt,pilotcallsign,merge) +local managedgroup=self.ManagedGrps[GID] +local name +if managedgroup then +name=managedgroup.GroupName or"none" +end +if not self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true) +end +if GID and GID~=0 then +local managedgroup=self.ManagedGrps[GID] +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +if self.TacticalSubscribers[name]then +self:_NewRadioEntry(text,text,GID,true,self.debug,true,false,true,true) +end +end +end +return self +end +function AWACS:_AssignPilotToTarget(Pilots,Targets) +self:T(self.lid.."_AssignPilotToTarget") +local inreach=false +local Pilot=nil +local closest=UTILS.NMToMeters(self.maxassigndistance+1) +local targets=Targets:GetDataTable() +local Target=nil +for _,_target in pairs(targets)do +local targetgroupcoord=_target.Contact.position +for _,_Pilot in pairs(Pilots)do +local pilotcoord=_Pilot.Group:GetCoordinate() +local targetdist=targetgroupcoord:Get2DDistance(pilotcoord) +if UTILS.MetersToNM(targetdist)<self.maxassigndistance and targetdist<closest then +self:T(string.format("%sTarget distance %d! Assignment %s!",self.lid,UTILS.Round(UTILS.MetersToNM(targetdist),0),_Pilot.CallSign)) +inreach=true +closest=targetdist +Pilot=_Pilot +Target=_target +Targets:PullByID(_target.CID) +break +else +self:T(self.lid.."Target distance > "..self.maxassigndistance.."NM! No Assignment!") +end +end +end +if inreach and Pilot and Pilot.IsPlayer then +local callsign=Pilot.CallSign +self.ManagedTasks:PullByID(Pilot.CurrentTask) +Pilot.HasAssignedTask=true +local TargetPosition=Target.Target:GetCoordinate() +local PlayerPositon=Pilot.LastKnownPosition +local TargetAlt=Target.Contact.altitude or Target.Cluster.altitude or Target.Contact.group:GetAltitude() +local TargetDirections,TargetDirectionsTTS=self:_ToStringBRA(PlayerPositon,TargetPosition,TargetAlt) +local ScreenText="" +local TaskType=AWACS.TaskDescription.INTERCEPT +if self.AwacsROE==AWACS.ROE.POLICE or self.AwacsROE==AWACS.ROE.VID then +local interc=self.gettext:GetEntry("SCREENVID",self.locale) +ScreenText=string.format(interc,Target.TargetGroupNaming) +TaskType=AWACS.TaskDescription.VID +else +local interc=self.gettext:GetEntry("SCREENINTER",self.locale) +ScreenText=string.format(interc,Target.TargetGroupNaming) +end +Pilot.CurrentTask=self:_CreateTaskForGroup(Pilot.GID,TaskType,ScreenText,Target.Target,AWACS.TaskStatus.REQUESTED,nil,Target.Cluster,Target.Contact) +Pilot.ContactCID=Target.CID +self.ManagedGrps[Pilot.GID]=Pilot +Target.LinkedTask=Pilot.CurrentTask +Target.LinkedGroup=Pilot.GID +Target.Status=AWACS.TaskStatus.REQUESTED +local targeted=self.gettext:GetEntry("ENGAGETAG",self.locale) +Target.EngagementTag=string.format(targeted,Pilot.CallSign) +self.Contacts:PullByID(Target.CID) +self.Contacts:Push(Target,Target.CID) +local reqcomm=self.gettext:GetEntry("REQCOMMIT",self.locale) +local text=string.format(reqcomm,self.callsigntxt,Target.TargetGroupNaming,TargetDirectionsTTS,Pilot.CallSign) +local textScreen=string.format(reqcomm,self.callsigntxt,Target.TargetGroupNaming,TargetDirections,Pilot.CallSign) +self:_NewRadioEntry(text,textScreen,Pilot.GID,true,self.debug,true,false,true) +elseif inreach and Pilot and Pilot.IsAI then +local callsign=Pilot.CallSign +local FGStatus=Pilot.FlightGroup:GetState() +self:T("Pilot AI Callsign: "..callsign) +self:T("Pilot FG State: "..FGStatus) +local targetstatus=Target.Target:GetState() +self:T("Target State: "..targetstatus) +local currmission=Pilot.FlightGroup:GetMissionCurrent() +if currmission then +self:T("Current Mission: "..currmission:GetType()) +end +local ZoneSet=self.ZoneSet +local RejectZoneSet=self.RejectZoneSet +local intercept=AUFTRAG:NewINTERCEPT(Target.Target) +intercept:SetWeaponExpend(AI.Task.WeaponExpend.ALL) +intercept:SetWeaponType(ENUMS.WeaponFlag.Auto) +intercept:SetMissionRange(self.MaxMissionRange) +intercept:AddConditionSuccess( +function(target,zoneset,rzoneset) +local success=true +local target=target +if target:IsDestroyed()or target:IsDead()or target:CountTargets()==0 then return true end +local tgtcoord=target:GetCoordinate() +local tgtvec2=nil +if tgtcoord then +tgtvec2=tgtcoord:GetVec2() +end +local zones=zoneset +local rzones=rzoneset +if tgtvec2 then +zones:ForEachZone( +function(zone) +if zone:IsVec2InZone(tgtvec2)then +success=false +end +end +) +rzones:ForEachZone( +function(zone) +if zone:IsVec2InZone(tgtvec2)then +success=true +end +end +) +end +return success +end, +Target.Target, +ZoneSet, +RejectZoneSet +) +Pilot.FlightGroup:AddMission(intercept) +local Angels=Pilot.AnchorStackAngels or 25 +Angels=Angels*1000 +local AnchorSpeed=self.CapSpeedBase or 270 +AnchorSpeed=UTILS.KnotsToAltKIAS(AnchorSpeed,Angels) +local Anchor=self.AnchorStacks:ReadByPointer(Pilot.AnchorStackNo) +local capauftrag=AUFTRAG:NewCAP(Anchor.StationZone,Angels,AnchorSpeed,Anchor.StationZoneCoordinate,0,15,{}) +capauftrag:SetMissionRange(self.MaxMissionRange) +capauftrag:SetTime(nil,((self.CAPTimeOnStation*3600)+(15*60))) +Pilot.FlightGroup:AddMission(capauftrag) +if currmission then +currmission:__Cancel(3) +end +self.CatchAllMissions[#self.CatchAllMissions+1]=intercept +self.CatchAllMissions[#self.CatchAllMissions+1]=capauftrag +self.ManagedTasks:PullByID(Pilot.CurrentTask) +Pilot.HasAssignedTask=true +Pilot.CurrentTask=self:_CreateTaskForGroup(Pilot.GID,AWACS.TaskDescription.INTERCEPT,"Intercept Task",Target.Target,AWACS.TaskStatus.ASSIGNED,intercept,Target.Cluster,Target.Contact) +Pilot.CurrentAuftrag=intercept.auftragsnummer +Pilot.ContactCID=Target.CID +self.ManagedGrps[Pilot.GID]=Pilot +Target.LinkedTask=Pilot.CurrentTask +Target.LinkedGroup=Pilot.GID +Target.Status=AWACS.TaskStatus.ASSIGNED +local targeted=self.gettext:GetEntry("ENGAGETAG",self.locale) +Target.EngagementTag=string.format(targeted,Pilot.CallSign) +self.Contacts:PullByID(Target.CID) +self.Contacts:Push(Target,Target.CID) +local altitude=Target.Contact.altitude or Target.Contact.group:GetAltitude() +local position=Target.Cluster.coordinate or Target.Contact.position +if not position then +self.intel:GetClusterCoordinate(Target.Cluster,true) +end +local bratext,bratexttts=self:_ToStringBRA(Pilot.Group:GetCoordinate(),position,altitude or 8000) +local aicomm=self.gettext:GetEntry("AICOMMIT",self.locale) +local text=string.format(aicomm,self.callsigntxt,Target.TargetGroupNaming,bratexttts,Pilot.CallSign) +local textScreen=string.format(aicomm,self.callsigntxt,Target.TargetGroupNaming,bratext,Pilot.CallSign) +self:_NewRadioEntry(text,textScreen,Pilot.GID,true,self.debug,true,false,true) +local comm=self.gettext:GetEntry("COMMIT",self.locale) +local text=string.format("%s. %s.",Pilot.CallSign,comm) +self:_NewRadioEntry(text,text,Pilot.GID,true,self.debug,true,true,true) +self:__Intercept(2) +end +return self +end +function AWACS:onbeforeStart(From,Event,To) +self:T({From,Event,To}) +if self.IncludeHelicopters then +self.clientset:FilterCategories("helicopter") +end +return self +end +function AWACS:onafterStart(From,Event,To) +self:T({From,Event,To}) +local controlzonename="FEZ-"..self.AOName +self.ControlZone=ZONE_RADIUS:New(controlzonename,self.OpsZone:GetVec2(),UTILS.NMToMeters(self.ControlZoneRadius)) +if self.debug then +self.ControlZone:DrawZone(self.coalition,{0,1,0},1,{1,0,0},0.05,3,true) +self.OpsZone:DrawZone(self.coalition,{1,0,0},1,{1,0,0},0.2,5,true) +local AOCoordString=self.AOCoordinate:ToStringLLDDM() +local Rocktag=string.format("FEZ: %s\nBulls Coordinate: %s",self.AOName,AOCoordString) +if self.AllowMarkers then +MARKER:New(self.AOCoordinate,Rocktag):ToCoalition(self.coalition) +end +self.StationZone:DrawZone(self.coalition,{0,0,1},1,{0,0,1},0.2,5,true) +local stationtag=string.format("Station: %s\nCoordinate: %s",self.StationZoneName,self.StationZone:GetCoordinate():ToStringLLDDM()) +if not self.GCI then +if self.AllowMarkers then +MARKER:New(self.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +self.OrbitZone:DrawZone(self.coalition,{0,1,0},1,{0,1,0},0.2,5,true) +if self.AllowMarkers then +MARKER:New(self.OrbitZone:GetCoordinate(),"AIC Orbit Zone"):ToCoalition(self.coalition) +end +end +else +local AOCoordString=self.AOCoordinate:ToStringLLDDM() +local Rocktag=string.format("FEZ: %s\nBulls Coordinate: %s",self.AOName,AOCoordString) +if self.AllowMarkers then +MARKER:New(self.AOCoordinate,Rocktag):ToCoalition(self.coalition) +end +if not self.GCI then +if self.AllowMarkers then +MARKER:New(self.OrbitZone:GetCoordinate(),"AIC Orbit Zone"):ToCoalition(self.coalition) +end +end +local stationtag=string.format("Station: %s\nCoordinate: %s",self.StationZoneName,self.StationZone:GetCoordinate():ToStringLLDDM()) +if self.AllowMarkers then +MARKER:New(self.StationZone:GetCoordinate(),stationtag):ToCoalition(self.coalition) +end +end +if not self.GCI then +local AwacsAW=self.AirWing +local mission=AUFTRAG:NewORBIT_RACETRACK(self.OrbitZone:GetCoordinate(),self.AwacsAngels*1000,self.Speed,self.Heading,self.Leg) +mission:SetMissionRange(self.MaxMissionRange) +mission:SetRequiredAttribute({GROUP.Attribute.AIR_AWACS}) +local timeonstation=(self.AwacsTimeOnStation+self.ShiftChangeTime)*3600 +mission:SetTime(nil,timeonstation) +self.CatchAllMissions[#self.CatchAllMissions+1]=mission +AwacsAW:AddMission(mission) +self.AwacsMission=mission +self.AwacsInZone=false +self.AwacsReady=false +else +self.AwacsInZone=true +self.AwacsReady=true +self:_StartIntel(self.GCIGroup) +if self.GCIGroup:IsGround()then +self.AwacsFG=ARMYGROUP:New(self.GCIGroup) +self.AwacsFG:SetDefaultRadio(self.Frequency,self.Modulation) +self.AwacsFG:SwitchRadio(self.Frequency,self.Modulation) +elseif self.GCIGroup:IsShip()then +self.AwacsFG=NAVYGROUP:New(self.GCIGroup) +self.AwacsFG:SetDefaultRadio(self.Frequency,self.Modulation) +self.AwacsFG:SwitchRadio(self.Frequency,self.Modulation) +else +self:E(self.lid.."**** Group unsuitable for GCI ops! Needs to be a GROUND or SHIP type group!") +self:Stop() +return self +end +self.callsigntxt=string.format("%s",self.CallSignClear[self.CallSign]) +self:__CheckRadioQueue(-10) +local sunrise=self.gettext:GetEntry("SUNRISE",self.locale) +local text=string.format(sunrise,self.callsigntxt,self.callsigntxt) +self:_NewRadioEntry(text,text,0,false,false,false,false,true) +self:T(self.lid..text) +self.sunrisedone=true +end +local ZoneSet=SET_ZONE:New() +ZoneSet:AddZone(self.ControlZone) +if not self.GCI then +ZoneSet:AddZone(self.OrbitZone) +end +if self.BorderZone then +ZoneSet:AddZone(self.BorderZone) +end +local RejectZoneSet=SET_ZONE:New() +if self.RejectZone then +RejectZoneSet:AddZone(self.RejectZone) +end +self.ZoneSet=ZoneSet +self.RejectZoneSet=RejectZoneSet +if self.AllowMarkers then +local MarkerOps=MARKEROPS_BASE:New("AWACS",{"Station","Delete","Move"}) +local function Handler(Keywords,Coord,Text) +self:T(Text) +for _,_word in pairs(Keywords)do +if string.lower(_word)=="station"then +local Name=string.match(Text," ([%a]+)$") +self:_CreateAnchorStackFromMarker(Name,Coord) +break +elseif string.lower(_word)=="delete"then +local Name=string.match(Text," ([%a]+)$") +self:_DeleteAnchorStackFromMarker(Name,Coord) +break +elseif string.lower(_word)=="move"then +local Name=string.match(Text," ([%a]+)$") +self:_MoveAnchorStackFromMarker(Name,Coord) +break +end +end +end +function MarkerOps:OnAfterMarkAdded(From,Event,To,Text,Keywords,Coord) +Handler(Keywords,Coord,Text) +end +function MarkerOps:OnAfterMarkChanged(From,Event,To,Text,Keywords,Coord) +Handler(Keywords,Coord,Text) +end +function MarkerOps:OnAfterMarkDeleted(From,Event,To) +end +self.MarkerOps=MarkerOps +end +if self.GCI then +self:__Started(-5) +end +if self.TacticalMenu then +self:__CheckTacticalQueue(55) +end +self:__Status(-30) +return self +end +function AWACS:_CheckAwacsStatus() +self:T(self.lid.."_CheckAwacsStatus") +local awacs=nil +if self.AwacsFG then +awacs=self.AwacsFG:GetGroup() +local unit=awacs:GetUnit(1) +if unit then +self.STN=tostring(unit:GetSTN()) +end +end +local monitoringdata=self.MonitoringData +if not self.GCI then +if awacs and awacs:IsAlive()and not self.AwacsInZone then +local orbitzone=self.OrbitZone +if awacs:IsInZone(orbitzone)then +self.AwacsInZone=true +self:T(self.lid.."Arrived in Orbit Zone: "..orbitzone:GetName()) +local onstationtxt=self.gettext:GetEntry("AWONSTATION",self.locale) +local text=string.format(onstationtxt,self.callsigntxt,self.AOName or"Rock") +local textScreen=text +self:_NewRadioEntry(text,textScreen,0,false,true,true,false,true) +end +end +end +if(awacs and awacs:IsAlive())then +if not self.intelstarted then +local alt=UTILS.Round(UTILS.MetersToFeet(awacs:GetAltitude())/1000,0) +if alt>=10 then +self:_StartIntel(awacs) +end +end +if self.intelstarted and not self.sunrisedone then +local alt=UTILS.Round(UTILS.MetersToFeet(awacs:GetAltitude())/1000,0) +if alt>=10 then +local sunrise=self.gettext:GetEntry("SUNRISE",self.locale) +local text=string.format(sunrise,self.callsigntxt,self.callsigntxt) +self:_NewRadioEntry(text,text,0,false,false,false,false,true) +self:T(self.lid..text) +self.sunrisedone=true +end +end +local AWmission=self.AwacsMission +local awstatus=AWmission:GetState() +local AWmissiontime=(timer.getTime()-self.AwacsTimeStamp) +local AWTOSLeft=UTILS.Round((((self.AwacsTimeOnStation+self.ShiftChangeTime)*3600)-AWmissiontime),0) +AWTOSLeft=UTILS.Round(AWTOSLeft/60,0) +local ChangeTime=UTILS.Round(((self.ShiftChangeTime*3600)/60),0) +local Changedue="No" +if not self.ShiftChangeAwacsFlag and(AWTOSLeft<=ChangeTime or AWmission:IsOver())then +Changedue="Yes" +self.ShiftChangeAwacsFlag=true +self:__AwacsShiftChange(2) +end +local report=REPORT:New("AWACS:") +report:Add("====================") +report:Add("AWACS:") +report:Add(string.format("Auftrag Status: %s",awstatus)) +report:Add(string.format("TOS Left: %d min",AWTOSLeft)) +report:Add(string.format("Needs ShiftChange: %s",Changedue)) +local OpsGroups=AWmission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +if OpsGroup then +local OpsName=OpsGroup:GetName()or"Unknown" +local OpsCallSign=OpsGroup:GetCallsignName()or"Unknown" +report:Add(string.format("Mission FG %s",OpsName)) +report:Add(string.format("Callsign %s",OpsCallSign)) +report:Add(string.format("Mission FG State %s",OpsGroup:GetState())) +else +report:Add("***** Cannot obtain (yet) this missions OpsGroup!") +end +if self.ShiftChangeAwacsFlag and self.ShiftChangeAwacsRequested then +AWmission=self.AwacsMissionReplacement +local esstatus=AWmission:GetState() +local ESmissiontime=(timer.getTime()-self.AwacsTimeStamp) +local ESTOSLeft=UTILS.Round((((self.AwacsTimeOnStation+self.ShiftChangeTime)*3600)-ESmissiontime),0) +ESTOSLeft=UTILS.Round(ESTOSLeft/60,0) +local ChangeTime=UTILS.Round(((self.ShiftChangeTime*3600)/60),0) +report:Add("AWACS REPLACEMENT:") +report:Add(string.format("Auftrag Status: %s",esstatus)) +report:Add(string.format("TOS Left: %d min",ESTOSLeft)) +local OpsGroups=AWmission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +if OpsGroup then +local OpsName=OpsGroup:GetName()or"Unknown" +local OpsCallSign=OpsGroup:GetCallsignName()or"Unknown" +report:Add(string.format("Mission FG %s",OpsName)) +report:Add(string.format("Callsign %s",OpsCallSign)) +report:Add(string.format("Mission FG State %s",OpsGroup:GetState())) +else +report:Add("***** Cannot obtain (yet) this missions OpsGroup!") +end +if AWmission:IsExecuting()then +self.ShiftChangeAwacsFlag=false +self.ShiftChangeAwacsRequested=false +self.sunrisedone=false +if self.AwacsMission and self.AwacsMission:IsNotOver()then +self.AwacsMission:Cancel() +end +self.AwacsMission=self.AwacsMissionReplacement +self.AwacsMissionReplacement=nil +self.AwacsTimeStamp=timer.getTime() +report:Add("*** Replacement DONE ***") +end +report:Add("====================") +end +if self.HasEscorts then +for i=1,self.EscortNumber do +local ESmission=self.EscortMission[i] +if not ESmission then break end +local esstatus=ESmission:GetState() +local ESmissiontime=(timer.getTime()-self.EscortsTimeStamp) +local ESTOSLeft=UTILS.Round((((self.EscortsTimeOnStation+self.ShiftChangeTime)*3600)-ESmissiontime),0) +ESTOSLeft=UTILS.Round(ESTOSLeft/60,0) +local ChangeTime=UTILS.Round(((self.ShiftChangeTime*3600)/60),0) +local Changedue="No" +if(ESTOSLeft<=ChangeTime and not self.ShiftChangeEscortsFlag)or(ESmission:IsOver()and not self.ShiftChangeEscortsFlag)then +Changedue="Yes" +self.ShiftChangeEscortsFlag=true +self:__EscortShiftChange(2) +end +report:Add("====================") +report:Add("ESCORTS:") +report:Add(string.format("Auftrag Status: %s",esstatus)) +report:Add(string.format("TOS Left: %d min",ESTOSLeft)) +report:Add(string.format("Needs ShiftChange: %s",Changedue)) +local OpsGroups=ESmission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +if OpsGroup then +local OpsName=OpsGroup:GetName()or"Unknown" +local OpsCallSign=OpsGroup:GetCallsignName()or"Unknown" +report:Add(string.format("Mission FG %s",OpsName)) +report:Add(string.format("Callsign %s",OpsCallSign)) +report:Add(string.format("Mission FG State %s",OpsGroup:GetState())) +monitoringdata.EscortsStateMission[i]=esstatus +monitoringdata.EscortsStateFG[i]=OpsGroup:GetState() +else +report:Add("***** Cannot obtain (yet) this missions OpsGroup!") +end +report:Add("====================") +local RESMission +if self.ShiftChangeEscortsFlag and self.ShiftChangeEscortsRequested then +RESMission=self.EscortMissionReplacement[i] +local esstatus=RESMission:GetState() +local RESMissiontime=(timer.getTime()-self.EscortsTimeStamp) +local ESTOSLeft=UTILS.Round((((self.EscortsTimeOnStation+self.ShiftChangeTime)*3600)-RESMissiontime),0) +ESTOSLeft=UTILS.Round(ESTOSLeft/60,0) +local ChangeTime=UTILS.Round(((self.ShiftChangeTime*3600)/60),0) +report:Add("ESCORTS REPLACEMENT:") +report:Add(string.format("Auftrag Status: %s",esstatus)) +report:Add(string.format("TOS Left: %d min",ESTOSLeft)) +local OpsGroups=RESMission:GetOpsGroups() +local OpsGroup=self:_GetAliveOpsGroupFromTable(OpsGroups) +if OpsGroup then +local OpsName=OpsGroup:GetName()or"Unknown" +local OpsCallSign=OpsGroup:GetCallsignName()or"Unknown" +report:Add(string.format("Mission FG %s",OpsName)) +report:Add(string.format("Callsign %s",OpsCallSign)) +report:Add(string.format("Mission FG State %s",OpsGroup:GetState())) +else +report:Add("***** Cannot obtain (yet) this missions OpsGroup!") +end +if RESMission and RESMission:IsExecuting()then +self.ShiftChangeEscortsFlag=false +self.ShiftChangeEscortsRequested=false +if ESmission and ESmission:IsNotOver()then +ESmission:__Cancel(1) +end +self.EscortMission[i]=self.EscortMissionReplacement[i] +self.EscortMissionReplacement[i]=nil +self.EscortsTimeStamp=timer.getTime() +report:Add("*** Replacement DONE ***") +end +report:Add("====================") +end +end +end +if self.debug then +self:T(report:Text()) +end +else +local AWmission=self.AwacsMission +local awstatus=AWmission:GetState() +if AWmission:IsOver()then +self:I(self.lid.."*****AWACS is dead!*****") +self.ShiftChangeAwacsFlag=true +self:__AwacsShiftChange(2) +end +end +return monitoringdata +end +function AWACS:onafterStatus(From,Event,To) +self:T({From,Event,To}) +self:_SetClientMenus() +local monitoringdata=self.MonitoringData +if not self.GCI then +monitoringdata=self:_CheckAwacsStatus() +end +local awacsalive=false +if self.AwacsFG then +local awacs=self.AwacsFG:GetGroup() +if awacs and awacs:IsAlive()then +awacsalive=true +end +end +if self:Is("Running")and(awacsalive or self.AwacsInZone)then +if self.AwacsSRS then +self.AwacsSRS:SetCoordinate(self.AwacsFG:GetCoordinate()) +if self.TacticalSRS then +self.TacticalSRS:SetCoordinate(self.AwacsFG:GetCoordinate()) +end +end +self:_CheckAICAPOnStation() +self:_CleanUpContacts() +self:_CheckMerges() +self:_CheckSubscribers() +local outcome,targets=self:_TargetSelectionProcess(true) +self:_CheckTaskQueue() +local AI,Humans=self:_GetIdlePilots() +if outcome and#Humans>0 and self.PlayerCapAssignment then +self:_AssignPilotToTarget(Humans,targets) +end +if outcome and#AI>0 then +self:_AssignPilotToTarget(AI,targets) +end +end +if not self.GCI then +monitoringdata.AwacsShiftChange=self.ShiftChangeAwacsFlag +if self.AwacsFG then +monitoringdata.AwacsStateFG=self.AwacsFG:GetState() +end +monitoringdata.AwacsStateMission=self.AwacsMission:GetState() +monitoringdata.EscortsShiftChange=self.ShiftChangeEscortsFlag +end +monitoringdata.AICAPCurrent=self.AICAPMissions:Count() +monitoringdata.AICAPMax=self.MaxAIonCAP +monitoringdata.Airwings=self.CAPAirwings:Count() +self.MonitoringData=monitoringdata +if self.debug then +self:_LogStatistics() +end +local picturetime=timer.getTime()-self.PictureTimeStamp +if self.AwacsInZone and picturetime>self.PictureInterval then +self.PictureTimeStamp=timer.getTime() +self:_Picture(nil,true) +end +self:__Status(30) +return self +end +function AWACS:onafterStop(From,Event,To) +self:T({From,Event,To}) +self.intel:Stop() +local AWFiFo=self.CAPAirwings +local AWStack=AWFiFo:GetPointerStack() +for _ID,_AWID in pairs(AWStack)do +local SubAW=self.CAPAirwings:ReadByPointer(_ID) +if SubAW then +SubAW:RemoveUsingOpsAwacs() +end +end +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +self:UnHandleEvent(EVENTS.PlayerEnterUnit) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.UnitLost) +self:UnHandleEvent(EVENTS.BDA) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.Shot) +return self +end +function AWACS:onafterAssignAnchor(From,Event,To,GID,HasOwnStation,StationName) +self:T({From,Event,To,"GID = "..GID}) +self:_AssignAnchorToID(GID,HasOwnStation,StationName) +return self +end +function AWACS:onafterCheckedOut(From,Event,To,GID,AnchorStackNo,Angels) +self:T({From,Event,To,"GID = "..GID}) +self:_RemoveIDFromAnchor(GID,AnchorStackNo,Angels) +return self +end +function AWACS:onafterAssignedAnchor(From,Event,To,GID,Anchor,AnchorStackNo,AnchorAngels) +self:T({From,Event,To,"GID="..GID,"Stack="..AnchorStackNo}) +local managedgroup=self.ManagedGrps[GID] +if not managedgroup then +self:E(self.lid.."**** GID "..GID.." Not Registered!") +return self +end +managedgroup.AnchorStackNo=AnchorStackNo +managedgroup.AnchorStackAngels=AnchorAngels +managedgroup.Blocked=false +local isPlayer=managedgroup.IsPlayer +local isAI=managedgroup.IsAI +local Group=managedgroup.Group +local CallSign=managedgroup.CallSign or"Ghost 1" +local AnchorName=Anchor.StationName or"unknown" +local AnchorCoordTxt=Anchor.StationZoneCoordinateText or"unknown" +local Angels=AnchorAngels or 25 +local AnchorSpeed=self.CapSpeedBase or 270 +local AuftragsNr=managedgroup.CurrentAuftrag +local textTTS="" +if self.PikesSpecialSwitch then +local stationtxt=self.gettext:GetEntry("STATIONAT",self.locale) +textTTS=string.format(stationtxt,CallSign,self.callsigntxt,AnchorName,Angels) +else +local stationtxt=self.gettext:GetEntry("STATIONATLONG",self.locale) +textTTS=string.format(stationtxt,CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed) +end +local ROEROT=self.AwacsROE..", "..self.AwacsROT +local stationtxtsc=self.gettext:GetEntry("STATIONSCREEN",self.locale) +local stationtxtta=self.gettext:GetEntry("STATIONTASK",self.locale) +local textScreen=string.format(stationtxtsc,CallSign,self.callsigntxt,AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) +local TextTasking=string.format(stationtxtta,AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) +self:_NewRadioEntry(textTTS,textScreen,GID,isPlayer,isPlayer,true,false) +managedgroup.CurrentTask=self:_CreateTaskForGroup(GID,AWACS.TaskDescription.ANCHOR,TextTasking,Anchor.StationZone) +if isAI then +local auftrag=managedgroup.FlightGroup:GetMissionCurrent() +if auftrag then +local auftragtype=auftrag:GetType() +if auftragtype==AUFTRAG.Type.ALERT5 then +local capauftrag=AUFTRAG:NewCAP(Anchor.StationZone,Angels*1000,AnchorSpeed,Anchor.StationZone:GetCoordinate(),0,15,{}) +capauftrag:SetMissionRange(self.MaxMissionRange) +capauftrag:SetTime(nil,((self.CAPTimeOnStation*3600)+(15*60))) +capauftrag:AddAsset(managedgroup.FlightGroup) +self.CatchAllMissions[#self.CatchAllMissions+1]=capauftrag +managedgroup.FlightGroup:AddMission(capauftrag) +auftrag:Cancel() +else +self:E("**** AssignedAnchor but Auftrag NOT ALERT5!") +end +else +self:E("**** AssignedAnchor but NO Auftrag!") +end +end +self.ManagedGrps[GID]=managedgroup +return self +end +function AWACS:onafterNewCluster(From,Event,To,Cluster) +self:T({From,Event,To,Cluster.index}) +self.CID=self.CID+1 +self.Countactcounter=self.Countactcounter+1 +local ContactTable=Cluster.Contacts or{} +local function GetFirstAliveContact(table) +for _,_contact in pairs(table)do +local contact=_contact +if contact and contact.group and contact.group:IsAlive()then +return contact,contact.group +end +end +return nil +end +local Contact,Group=GetFirstAliveContact(ContactTable) +if not Contact then return self end +if Group and not Group:IsAirborne()then +return self +end +local targetset=SET_GROUP:New() +for _,_grp in pairs(ContactTable)do +local grp=_grp +targetset:AddGroup(grp.group,true) +end +local managedcontact={} +managedcontact.CID=self.CID +managedcontact.Contact=Contact +managedcontact.Cluster=Cluster +managedcontact.IFF=AWACS.IFF.BOGEY +managedcontact.Target=TARGET:New(targetset) +managedcontact.LinkedGroup=0 +managedcontact.LinkedTask=0 +managedcontact.Status=AWACS.TaskStatus.IDLE +local phoneid=math.fmod(self.Countactcounter,27) +if phoneid==0 then phoneid=1 end +managedcontact.TargetGroupNaming=AWACS.Phonetic[phoneid] +managedcontact.ReportingName=Contact.group:GetNatoReportingName() +managedcontact.TACCallDone=false +managedcontact.MeldCallDone=false +managedcontact.EngagementTag="" +local IsPopup=false +if self.OpsZone:IsVec2InZone(Contact.position:GetVec2())then +IsPopup=true +end +Contact.CID=managedcontact.CID +Contact.TargetGroupNaming=managedcontact.TargetGroupNaming +Cluster.CID=managedcontact.CID +Cluster.TargetGroupNaming=managedcontact.TargetGroupNaming +self.Contacts:Push(managedcontact,self.CID) +local ContactCoordinate=Contact.position:GetVec2() +local incontrolzone=self.ControlZone:IsVec2InZone(ContactCoordinate) +local distance=1000000 +if not self.GCI then +distance=Contact.position:Get2DDistance(self.OrbitZone:GetCoordinate()) +end +local inborderzone=false +if self.BorderZone then +inborderzone=self.BorderZone:IsVec2InZone(ContactCoordinate) +end +if incontrolzone or inborderzone or(distance<=UTILS.NMToMeters(55))or IsPopup then +self:_AnnounceContact(managedcontact,true,nil,false,managedcontact.TargetGroupNaming,IsPopup,managedcontact.ReportingName) +end +return self +end +function AWACS:onafterNewContact(From,Event,To,Contact) +self:T({From,Event,To,Contact}) +local tdist=self.ThreatDistance +for _gid,_mgroup in pairs(self.ManagedGrps)do +local managedgroup=_mgroup +local group=managedgroup.Group +if group and group:IsAlive()and group:IsAirborne()then +local cpos=Contact.position or Contact.group:GetCoordinate() +local mpos=group:GetCoordinate() +local dist=cpos:Get2DDistance(mpos) +dist=UTILS.Round(UTILS.MetersToNM(dist),0) +if dist<=tdist then +self:_ThreatRangeCall(_gid,Contact) +end +end +end +return self +end +function AWACS:onafterLostContact(From,Event,To,Contact) +self:T({From,Event,To,Contact}) +return self +end +function AWACS:onafterLostCluster(From,Event,To,Cluster,Mission) +self:T({From,Event,To}) +return self +end +function AWACS:onafterCheckTacticalQueue(From,Event,To) +self:T({From,Event,To}) +if self.clientset:CountAlive()==0 then +self:T(self.lid.."No player connected.") +self:__CheckTacticalQueue(-5) +return self +end +for _name,_freq in pairs(self.TacticalSubscribers)do +local Group=nil +if _name then +Group=GROUP:FindByName(_name) +end +if Group and Group:IsAlive()then +self:_BogeyDope(Group,true) +end +end +if(self.TacticalQueue:IsNotEmpty())then +while self.TacticalQueue:Count()>0 do +local RadioEntry=self.TacticalQueue:Pull() +self:T({RadioEntry}) +local frequency=self.TacticalBaseFreq +if RadioEntry.GroupID and RadioEntry.GroupID~=0 then +local managedgroup=self.ManagedGrps[RadioEntry.GroupID] +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +local name=managedgroup.GroupName +frequency=self.TacticalSubscribers[name] +end +end +local gtext=RadioEntry.TextTTS +if self.PathToGoogleKey then +gtext=string.format("<speak><prosody rate='medium'>%s</prosody></speak>",gtext) +end +self.TacticalSRSQ:NewTransmission(gtext,nil,self.TacticalSRS,nil,0.5,nil,nil,nil,frequency,self.TacticalModulation) +self:T(RadioEntry.TextTTS) +if RadioEntry.ToScreen and RadioEntry.TextScreen and(not self.SuppressScreenOutput)then +if RadioEntry.GroupID and RadioEntry.GroupID~=0 then +local managedgroup=self.ManagedGrps[RadioEntry.GroupID] +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +MESSAGE:New(RadioEntry.TextScreen,20,"AWACS"):ToGroup(managedgroup.Group) +self:T(RadioEntry.TextScreen) +end +else +MESSAGE:New(RadioEntry.TextScreen,20,"AWACS"):ToCoalition(self.coalition) +end +end +end +end +if not self:Is("Stopped")then +self:__CheckTacticalQueue(-self.TacticalInterval) +end +return self +end +function AWACS:onafterCheckRadioQueue(From,Event,To) +self:T({From,Event,To}) +local nextcall=10 +if(self.RadioQueue:IsNotEmpty()or self.PrioRadioQueue:IsNotEmpty())then +local RadioEntry=nil +if self.PrioRadioQueue:IsNotEmpty()then +RadioEntry=self.PrioRadioQueue:Pull() +else +RadioEntry=self.RadioQueue:Pull() +end +self:T({RadioEntry}) +if self.clientset:CountAlive()==0 then +self:T(self.lid.."No player connected.") +self:__CheckRadioQueue(-5) +return self +end +if not RadioEntry.FromAI then +if self.PathToGoogleKey then +local gtext=RadioEntry.TextTTS +gtext=string.format("<speak><prosody rate='medium'>%s</prosody></speak>",gtext) +self.AwacsSRS:PlayTextExt(gtext,nil,self.MultiFrequency,self.MultiModulation,self.Gender,self.Culture,self.Voice,self.Volume,"AWACS") +else +self.AwacsSRS:PlayTextExt(RadioEntry.TextTTS,nil,self.MultiFrequency,self.MultiModulation,self.Gender,self.Culture,self.Voice,self.Volume,"AWACS") +end +self:T(RadioEntry.TextTTS) +else +if RadioEntry.GroupID and RadioEntry.GroupID~=0 then +local managedgroup=self.ManagedGrps[RadioEntry.GroupID] +if managedgroup and managedgroup.FlightGroup and managedgroup.FlightGroup:IsAlive()then +if self.PathToGoogleKey then +local gtext=RadioEntry.TextTTS +gtext=string.format("<speak><prosody rate='medium'>%s</prosody></speak>",gtext) +managedgroup.FlightGroup:RadioTransmission(gtext,1,false) +else +managedgroup.FlightGroup:RadioTransmission(RadioEntry.TextTTS,1,false) +end +self:T(RadioEntry.TextTTS) +end +end +end +if RadioEntry.Duration then nextcall=RadioEntry.Duration end +if RadioEntry.ToScreen and RadioEntry.TextScreen and(not self.SuppressScreenOutput)then +if RadioEntry.GroupID and RadioEntry.GroupID~=0 then +local managedgroup=self.ManagedGrps[RadioEntry.GroupID] +if managedgroup and managedgroup.Group and managedgroup.Group:IsAlive()then +MESSAGE:New(RadioEntry.TextScreen,20,"AWACS"):ToGroup(managedgroup.Group) +self:T(RadioEntry.TextScreen) +end +else +MESSAGE:New(RadioEntry.TextScreen,20,"AWACS"):ToCoalition(self.coalition) +end +end +end +if self:Is("Running")then +if self.PathToGoogleKey then +nextcall=nextcall+self.GoogleTTSPadding +else +nextcall=nextcall+self.WindowsTTSPadding +end +self:__CheckRadioQueue(-nextcall) +end +return self +end +function AWACS:onafterEscortShiftChange(From,Event,To) +self:T({From,Event,To}) +if self.AwacsFG and self.ShiftChangeEscortsFlag and not self.ShiftChangeEscortsRequested then +local awacs=self.AwacsFG:GetGroup() +if awacs and awacs:IsAlive()then +self.ShiftChangeEscortsRequested=true +self.EscortsTimeStamp=timer.getTime() +self:_StartEscorts(true) +else +self:E("**** AWACS group dead at onafterEscortShiftChange!") +end +end +return self +end +function AWACS:onafterAwacsShiftChange(From,Event,To) +self:T({From,Event,To}) +if self.AwacsFG and self.ShiftChangeAwacsFlag and not self.ShiftChangeAwacsRequested then +self.ShiftChangeAwacsRequested=true +self.AwacsTimeStamp=timer.getTime() +local AwacsAW=self.AirWing +local mission=AUFTRAG:NewORBIT_RACETRACK(self.OrbitZone:GetCoordinate(),self.AwacsAngels*1000,self.Speed,self.Heading,self.Leg) +self.CatchAllMissions[#self.CatchAllMissions+1]=mission +local timeonstation=(self.AwacsTimeOnStation+self.ShiftChangeTime)*3600 +mission:SetTime(nil,timeonstation) +mission:SetMissionRange(self.MaxMissionRange) +AwacsAW:AddMission(mission) +self.AwacsMissionReplacement=mission +end +return self +end +function AWACS:onafterFlightOnMission(From,Event,To,FlightGroup,Mission) +self:T({From,Event,To}) +self:T("FlightGroup "..FlightGroup:GetName().." Mission "..Mission:GetName().." Type "..Mission:GetType()) +self.CatchAllFGs[#self.CatchAllFGs+1]=FlightGroup +if not self:Is("Stopped")then +if not self.AwacsReady or self.ShiftChangeAwacsFlag or self.ShiftChangeEscortsFlag then +self:_StartSettings(FlightGroup,Mission) +elseif Mission and(Mission:GetType()==AUFTRAG.Type.CAP or Mission:GetType()==AUFTRAG.Type.ALERT5 or Mission:GetType()==AUFTRAG.Type.ORBIT)then +if not self.FlightGroups:HasUniqueID(FlightGroup:GetName())then +self:T("Pushing FG "..FlightGroup:GetName().." to stack!") +self.FlightGroups:Push(FlightGroup,FlightGroup:GetName()) +end +end +end +return self +end +function AWACS:onafterReAnchor(From,Event,To,GID) +self:T({From,Event,To,GID}) +local managedgroup=self.ManagedGrps[GID] +if managedgroup then +if managedgroup.IsAI then +local AIFG=managedgroup.FlightGroup +if AIFG and AIFG:IsAlive()then +if AIFG:IsFuelLow()or AIFG:IsOutOfMissiles()or AIFG:IsOutOfAmmo()then +local destbase=AIFG.homebase +if not destbase then destbase=self.Airbase end +AIFG:RTB(destbase) +self:_CheckOut(AIFG:GetGroup(),GID) +self.AIRequested=self.AIRequested-1 +else +local Anchor=self.AnchorStacks:ReadByPointer(managedgroup.AnchorStackNo) +local StationZone=Anchor.StationZone +managedgroup.CurrentTask=self:_CreateTaskForGroup(GID,AWACS.TaskDescription.ANCHOR,"Re-Station AI",StationZone) +managedgroup.HasAssignedTask=true +local mission=AIFG:GetMissionCurrent() +if mission then +managedgroup.CurrentAuftrag=mission.auftragsnummer or 0 +else +managedgroup.CurrentAuftrag=0 +end +managedgroup.ContactCID=0 +self.ManagedGrps[GID]=managedgroup +local tostation=self.gettext:GetEntry("VECTORSTATION",self.locale) +self:_MessageVector(GID,tostation,Anchor.StationZoneCoordinate,managedgroup.AnchorStackAngels) +end +else +local savedcallsign=managedgroup.CallSign +local textoptions={} +textoptions[1]=self.gettext:GetEntry("TEXTOPTIONS1",self.locale) +textoptions[2]=self.gettext:GetEntry("TEXTOPTIONS2",self.locale) +textoptions[3]=self.gettext:GetEntry("TEXTOPTIONS3",self.locale) +textoptions[4]=self.gettext:GetEntry("TEXTOPTIONS4",self.locale) +local allstations=self.gettext:GetEntry("ALLSTATIONS",self.locale) +local milestxt=self.gettext:GetEntry("MILES",self.locale) +if managedgroup.LastKnownPosition then +local lastknown=UTILS.DeepCopy(managedgroup.LastKnownPosition) +local faded=textoptions[math.random(1,4)] +local text=string.format("%s. %s. %s %s.",allstations,self.callsigntxt,faded,savedcallsign) +local textScreen=string.format("%s, %s. %s %s.",allstations,self.callsigntxt,faded,savedcallsign) +local brtext=self:_ToStringBULLS(lastknown) +local brtexttts=self:_ToStringBULLS(lastknown,false,true) +text=text.." "..brtexttts.." "..milestxt.."." +textScreen=textScreen.." "..brtext.." "..milestxt.."." +self:_NewRadioEntry(text,textScreen,0,false,self.debug,true,false,true) +end +self.ManagedGrps[GID]=nil +end +elseif managedgroup.IsPlayer then +local PLFG=managedgroup.Group +if PLFG and PLFG:IsAlive()then +local Anchor=self.AnchorStacks:ReadByPointer(managedgroup.AnchorStackNo) +local AnchorName=Anchor.StationName or"unknown" +local AnchorCoordTxt=Anchor.StationZoneCoordinateText or"unknown" +local Angels=managedgroup.AnchorStackAngels or 25 +local AnchorSpeed=self.CapSpeedBase or 270 +local StationZone=Anchor.StationZone +local ROEROT=self.AwacsROE.." "..self.AwacsROT +local stationtxt=self.gettext:GetEntry("STATIONTASK",self.locale) +local TextTasking=string.format(stationtxt,AnchorName,Angels,AnchorSpeed,AnchorCoordTxt,ROEROT) +managedgroup.CurrentTask=self:_CreateTaskForGroup(GID,AWACS.TaskDescription.ANCHOR,TextTasking,StationZone) +managedgroup.HasAssignedTask=true +managedgroup.ContactCID=0 +self.ManagedGrps[GID]=managedgroup +local vectortxt=self.gettext:GetEntry("VECTORSTATION",self.locale) +self:_MessageVector(GID,vectortxt,Anchor.StationZoneCoordinate,managedgroup.AnchorStackAngels) +else +local savedcallsign=managedgroup.CallSign +local textoptions={} +textoptions[1]=self.gettext:GetEntry("TEXTOPTIONS1",self.locale) +textoptions[2]=self.gettext:GetEntry("TEXTOPTIONS2",self.locale) +textoptions[3]=self.gettext:GetEntry("TEXTOPTIONS3",self.locale) +textoptions[4]=self.gettext:GetEntry("TEXTOPTIONS4",self.locale) +local allstations=self.gettext:GetEntry("ALLSTATIONS",self.locale) +local milestxt=self.gettext:GetEntry("MILES",self.locale) +local faded=textoptions[math.random(1,4)] +local text=string.format("%s. %s. %s %s.",allstations,self.callsigntxt,faded,savedcallsign) +local textScreen=string.format("%s, %s. %s %s.",allstations,self.callsigntxt,faded,savedcallsign) +if managedgroup.LastKnownPosition then +local lastknown=UTILS.DeepCopy(managedgroup.LastKnownPosition) +local brtext=self:_ToStringBULLS(lastknown) +local brtexttts=self:_ToStringBULLS(lastknown,false,true) +text=text.." "..brtexttts.." "..milestxt.."." +textScreen=textScreen.." "..brtext.." "..milestxt.."." +self:_NewRadioEntry(text,textScreen,0,false,self.debug,true,false,true) +end +self.ManagedGrps[GID]=nil +end +end +end +end +end +BRIGADE={ +ClassName="BRIGADE", +verbose=0, +rearmingZones={}, +refuellingZones={}, +} +BRIGADE.version="0.1.1" +function BRIGADE:New(WarehouseName,BrigadeName) +local self=BASE:Inherit(self,LEGION:New(WarehouseName,BrigadeName)) +if not self then +BASE:E(string.format("ERROR: Could not find warehouse %s!",WarehouseName)) +return nil +end +self.lid=string.format("BRIGADE %s | ",self.alias) +self:SetRetreatZones() +if self:IsShip()then +local wh=self.warehouse +local group=wh:GetGroup() +self.warehouseOpsGroup=NAVYGROUP:New(group) +self.warehouseOpsElement=self.warehouseOpsGroup:GetElementByName(wh:GetName()) +end +self:AddTransition("*","ArmyOnMission","*") +return self +end +function BRIGADE:AddPlatoon(Platoon) +table.insert(self.cohorts,Platoon) +self:AddAssetToPlatoon(Platoon,Platoon.Ngroups) +Platoon:SetBrigade(self) +if Platoon:IsStopped()then +Platoon:Start() +end +return self +end +function BRIGADE:AddAssetToPlatoon(Platoon,Nassets) +if Platoon then +local Group=GROUP:FindByName(Platoon.templatename) +if Group then +local text=string.format("Adding asset %s to platoon %s",Group:GetName(),Platoon.name) +self:T(self.lid..text) +self:AddAsset(Group,Nassets,nil,nil,nil,nil,Platoon.skill,Platoon.livery,Platoon.name) +else +self:E(self.lid.."ERROR: Group does not exist!") +end +else +self:E(self.lid.."ERROR: Platoon does not exit!") +end +return self +end +function BRIGADE:SetRetreatZones(RetreatZoneSet) +self.retreatZones=RetreatZoneSet or SET_ZONE:New() +return self +end +function BRIGADE:AddRetreatZone(RetreatZone) +self.retreatZones:AddZone(RetreatZone) +return self +end +function BRIGADE:GetRetreatZones() +return self.retreatZones +end +function BRIGADE:AddRearmingZone(RearmingZone) +local rearmingzone={} +rearmingzone.zone=RearmingZone +rearmingzone.mission=nil +rearmingzone.marker=MARKER:New(rearmingzone.zone:GetCoordinate(),"Rearming Zone"):ToCoalition(self:GetCoalition()) +table.insert(self.rearmingZones,rearmingzone) +return rearmingzone +end +function BRIGADE:AddRefuellingZone(RefuellingZone) +local supplyzone={} +supplyzone.zone=RefuellingZone +supplyzone.mission=nil +supplyzone.marker=MARKER:New(supplyzone.zone:GetCoordinate(),"Refuelling Zone"):ToCoalition(self:GetCoalition()) +table.insert(self.refuellingZones,supplyzone) +return supplyzone +end +function BRIGADE:GetPlatoon(PlatoonName) +local platoon=self:_GetCohort(PlatoonName) +return platoon +end +function BRIGADE:GetPlatoonOfAsset(Asset) +local platoon=self:GetPlatoon(Asset.squadname) +return platoon +end +function BRIGADE:RemoveAssetFromPlatoon(Asset) +local platoon=self:GetPlatoonOfAsset(Asset) +if platoon then +platoon:DelAsset(Asset) +end +end +function BRIGADE:LoadBackAssetInPosition(Templatename,Position) +self:T(self.lid.."LoadBackAssetInPosition: "..tostring(Templatename)) +local nametbl=UTILS.Split(Templatename,"_") +local name=nametbl[1] +self:T(string.format("*** Target Platoon = %s ***",name)) +local cohorts=self.cohorts or{} +local thisasset=nil +local found=false +for _,_cohort in pairs(cohorts)do +local asset=_cohort:GetName() +self:T(string.format("*** Looking at Platoon = %s ***",asset)) +if asset==name then +self:T("**** Found Platoon ****") +local cohassets=_cohort.assets or{} +for _,_zug in pairs(cohassets)do +local zug=_zug +if zug.assignment==name and zug.requested==false then +self:T("**** Found Asset ****") +found=true +thisasset=zug +break +end +end +end +end +if found then +thisasset.rid=thisasset.uid +thisasset.requested=false +thisasset.score=100 +thisasset.missionTask="CAS" +thisasset.spawned=true +local template=thisasset.templatename +local alias=thisasset.spawngroupname +local spawnasset=SPAWN:NewWithAlias(template,alias) +:InitDelayOff() +:SpawnFromCoordinate(Position) +local request={} +request.assignment=name +request.warehouse=self +request.assets={thisasset} +request.ntransporthome=0 +request.ndelivered=0 +request.ntransport=0 +request.cargoattribute=thisasset.attribute +request.category=thisasset.category +request.cargoassets={thisasset} +request.assetdesc=WAREHOUSE.Descriptor.ASSETLIST +request.cargocategory=thisasset.category +request.toself=true +request.transporttype=WAREHOUSE.TransportType.SELFPROPELLED +request.assetproblem={} +request.born=true +request.prio=50 +request.uid=thisasset.uid +request.airbase=nil +request.timestamp=timer.getAbsTime() +request.assetdescval={thisasset} +request.nasset=1 +request.cargogroupset=SET_GROUP:New() +request.cargogroupset:AddGroup(spawnasset) +request.iscargo=true +self:__AssetSpawned(2,spawnasset,thisasset,request) +end +return self +end +function BRIGADE:onafterStart(From,Event,To) +self:GetParent(self,BRIGADE).onafterStart(self,From,Event,To) +self:I(self.lid..string.format("Starting BRIGADE v%s",BRIGADE.version)) +end +function BRIGADE:onafterStatus(From,Event,To) +self:GetParent(self).onafterStatus(self,From,Event,To) +local fsmstate=self:GetState() +self:CheckTransportQueue() +self:CheckMissionQueue() +for _,_rearmingzone in pairs(self.rearmingZones)do +local rearmingzone=_rearmingzone +if(not rearmingzone.mission)or rearmingzone.mission:IsOver()then +rearmingzone.mission=AUFTRAG:NewAMMOSUPPLY(rearmingzone.zone) +self:AddMission(rearmingzone.mission) +end +end +for _,_supplyzone in pairs(self.refuellingZones)do +local supplyzone=_supplyzone +if(not supplyzone.mission)or supplyzone.mission:IsOver()then +supplyzone.mission=AUFTRAG:NewFUELSUPPLY(supplyzone.zone) +self:AddMission(supplyzone.mission) +end +end +self:_TacticalOverview() +if self.verbose>=1 then +local Nmissions=self:CountMissionsInQueue() +local Npq,Np,Nq=self:CountAssetsOnMission() +local assets=string.format("%d [OnMission: Total=%d, Active=%d, Queued=%d]",self:CountAssets(),Npq,Np,Nq) +local text=string.format("%s: Missions=%d, Platoons=%d, Assets=%s",fsmstate,Nmissions,#self.cohorts,assets) +self:I(self.lid..text) +end +if self.verbose>=2 then +local text=string.format("Missions Total=%d:",#self.missionqueue) +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +local prio=string.format("%d/%s",mission.prio,tostring(mission.importance));if mission.urgent then prio=prio.." (!)"end +local assets=string.format("%d/%d",mission:CountOpsGroups(),mission.Nassets or 0) +local target=string.format("%d/%d Damage=%.1f",mission:CountMissionTargets(),mission:GetTargetInitialNumber(),mission:GetTargetDamage()) +text=text..string.format("\n[%d] %s %s: Status=%s, Prio=%s, Assets=%s, Targets=%s",i,mission.name,mission.type,mission.status,prio,assets,target) +end +self:I(self.lid..text) +end +if self.verbose>=2 then +local text=string.format("Transports Total=%d:",#self.transportqueue) +for i,_transport in pairs(self.transportqueue)do +local transport=_transport +local prio=string.format("%d/%s",transport.prio,tostring(transport.importance));if transport.urgent then prio=prio.." (!)"end +local carriers=string.format("Ncargo=%d/%d, Ncarriers=%d",transport.Ncargo,transport.Ndelivered,transport.Ncarrier) +text=text..string.format("\n[%d] UID=%d: Status=%s, Prio=%s, Cargo: %s",i,transport.uid,transport:GetState(),prio,carriers) +end +self:I(self.lid..text) +end +if self.verbose>=3 then +local text="Platoons:" +for i,_platoon in pairs(self.cohorts)do +local platoon=_platoon +local callsign=platoon.callsignName and UTILS.GetCallsignName(platoon.callsignName)or"N/A" +local modex=platoon.modex and platoon.modex or-1 +local skill=platoon.skill and tostring(platoon.skill)or"N/A" +text=text..string.format("\n* %s %s: %s*%d/%d, Callsign=%s, Modex=%d, Skill=%s",platoon.name,platoon:GetState(),platoon.aircrafttype,platoon:CountAssets(true),#platoon.assets,callsign,modex,skill) +end +self:I(self.lid..text) +end +if self.verbose>=4 then +local text="Rearming Zones:" +for i,_rearmingzone in pairs(self.rearmingZones)do +local rearmingzone=_rearmingzone +text=text..string.format("\n* %s: Mission status=%s, suppliers=%d",rearmingzone.zone:GetName(),rearmingzone.mission:GetState(),rearmingzone.mission:CountOpsGroups()) +end +self:I(self.lid..text) +end +if self.verbose>=4 then +local text="Refuelling Zones:" +for i,_refuellingzone in pairs(self.refuellingZones)do +local refuellingzone=_refuellingzone +text=text..string.format("\n* %s: Mission status=%s, suppliers=%d",refuellingzone.zone:GetName(),refuellingzone.mission:GetState(),refuellingzone.mission:CountOpsGroups()) +end +self:I(self.lid..text) +end +if self.verbose>=5 then +local text="Assets in stock:" +for i,_asset in pairs(self.stock)do +local asset=_asset +text=text..string.format("\n* %s: spawned=%s",asset.spawngroupname,tostring(asset.spawned)) +end +self:I(self.lid..text) +end +end +function BRIGADE:onafterArmyOnMission(From,Event,To,ArmyGroup,Mission) +self:T(self.lid..string.format("Group %s on %s mission %s",ArmyGroup:GetName(),Mission:GetType(),Mission:GetName())) +end +CHIEF={ +ClassName="CHIEF", +verbose=0, +lid=nil, +targetqueue={}, +zonequeue={}, +borderzoneset=nil, +yellowzoneset=nil, +engagezoneset=nil, +tacview=false, +Nsuccess=0, +Nfailure=0, +} +CHIEF.DEFCON={ +GREEN="Green", +YELLOW="Yellow", +RED="Red", +} +CHIEF.Strategy={ +PASSIVE="Passive", +DEFENSIVE="Defensive", +OFFENSIVE="Offensive", +AGGRESSIVE="Aggressive", +TOTALWAR="Total War" +} +CHIEF.version="0.6.1" +function CHIEF:New(Coalition,AgentSet,Alias) +Alias=Alias or"CHIEF" +if type(Coalition)=="string"then +if string.lower(Coalition)=="blue"then +Coalition=coalition.side.BLUE +elseif string.lower(Coalition)=="red"then +Coalition=coalition.side.RED +else +Coalition=coalition.side.NEUTRAL +end +end +local self=BASE:Inherit(self,INTEL:New(AgentSet,Coalition,Alias)) +self:SetBorderZones() +self:SetConflictZones() +self:SetAttackZones() +self:SetThreatLevelRange() +self.Defcon=CHIEF.DEFCON.GREEN +self.strategy=CHIEF.Strategy.DEFENSIVE +self.TransportCategories={Group.Category.HELICOPTER} +self.commander=COMMANDER:New(Coalition) +self:AddTransition("*","MissionAssign","*") +self:AddTransition("*","MissionCancel","*") +self:AddTransition("*","TransportCancel","*") +self:AddTransition("*","OpsOnMission","*") +self:AddTransition("*","ZoneCaptured","*") +self:AddTransition("*","ZoneLost","*") +self:AddTransition("*","ZoneEmpty","*") +self:AddTransition("*","ZoneAttacked","*") +self:AddTransition("*","DefconChange","*") +self:AddTransition("*","StrategyChange","*") +self:AddTransition("*","LegionLost","*") +return self +end +function CHIEF:SetAirToAny() +self:SetFilterCategory({}) +return self +end +function CHIEF:SetAirToAir() +self:SetFilterCategory({Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +return self +end +function CHIEF:SetAirToGround() +self:SetFilterCategory({Unit.Category.GROUND_UNIT}) +return self +end +function CHIEF:SetAirToSea() +self:SetFilterCategory({Unit.Category.SHIP}) +return self +end +function CHIEF:SetAirToSurface() +self:SetFilterCategory({Unit.Category.GROUND_UNIT,Unit.Category.SHIP}) +return self +end +function CHIEF:SetThreatLevelRange(ThreatLevelMin,ThreatLevelMax) +self.threatLevelMin=ThreatLevelMin or 1 +self.threatLevelMax=ThreatLevelMax or 10 +return self +end +function CHIEF:SetDefcon(Defcon) +local gotit=false +for _,defcon in pairs(CHIEF.DEFCON)do +if defcon==Defcon then +gotit=true +end +end +if not gotit then +self:E(self.lid..string.format("ERROR: Unknown DEFCON specified! Dont know defcon=%s",tostring(Defcon))) +return self +end +if Defcon~=self.Defcon then +self:DefconChange(Defcon) +end +self.Defcon=Defcon +return self +end +function CHIEF:CreateResource(MissionType,Nmin,Nmax,Attributes,Properties,Categories) +local resources={} +local resource=self:AddToResource(resources,MissionType,Nmin,Nmax,Attributes,Properties,Categories) +return resources,resource +end +function CHIEF:AddToResource(Resource,MissionType,Nmin,Nmax,Attributes,Properties,Categories) +local resource={} +resource.MissionType=MissionType +resource.Nmin=Nmin or 1 +resource.Nmax=Nmax or Nmin +resource.Attributes=UTILS.EnsureTable(Attributes,true) +resource.Properties=UTILS.EnsureTable(Properties,true) +resource.Categories=UTILS.EnsureTable(Categories,true) +resource.carrierNmin=nil +resource.carrierNmax=nil +resource.carrierAttributes=nil +resource.carrierProperties=nil +resource.carrierCategories=nil +table.insert(Resource,resource) +if self.verbose>10 then +local text="Resource:" +for _,_r in pairs(Resource)do +local r=_r +text=text..string.format("\nmission=%s, Nmin=%d, Nmax=%d, attribute=%s, properties=%s",r.MissionType,r.Nmin,r.Nmax,tostring(r.Attributes[1]),tostring(r.Properties[1])) +end +self:I(self.lid..text) +end +return resource +end +function CHIEF:AddTransportToResource(Resource,Nmin,Nmax,CarrierAttributes,CarrierProperties,CarrierCategories) +Resource.carrierNmin=Nmin or 1 +Resource.carrierNmax=Nmax or Nmin +Resource.carrierCategories=UTILS.EnsureTable(CarrierCategories,true) +Resource.carrierAttributes=UTILS.EnsureTable(CarrierAttributes,true) +Resource.carrierProperties=UTILS.EnsureTable(CarrierProperties,true) +return self +end +function CHIEF:DeleteFromResource(Resource,MissionType) +for i=#Resource,1,-1 do +local resource=Resource[i] +if resource.MissionType==MissionType then +if resource.mission and resource.mission:IsNotOver()then +resource.mission:Cancel() +end +table.remove(Resource,i) +end +end +return self +end +function CHIEF:SetResponseOnTarget(NassetsMin,NassetsMax,ThreatLevel,TargetCategory,MissionType,Nunits,Defcon,Strategy) +local bla={} +bla.nAssetMin=NassetsMin or 1 +bla.nAssetMax=NassetsMax or bla.nAssetMin +bla.threatlevel=ThreatLevel or 0 +bla.targetCategory=TargetCategory +bla.missionType=MissionType +bla.nUnits=Nunits or 1 +bla.defcon=Defcon +bla.strategy=Strategy +self.assetNumbers=self.assetNumbers or{} +table.insert(self.assetNumbers,bla) +end +function CHIEF:_GetAssetsForTarget(Target,MissionType) +local threatlevel=Target:GetThreatLevelMax() +local nUnits=Target.N0 +local targetcategory=Target:GetCategory() +self:T(self.lid..string.format("Getting number of assets for target with TL=%d, Category=%s, nUnits=%s, MissionType=%s",threatlevel,targetcategory,nUnits,tostring(MissionType))) +local candidates={} +local threatlevelMatch=nil +for _,_assetnumber in pairs(self.assetNumbers or{})do +local assetnumber=_assetnumber +if(threatlevelMatch==nil and threatlevel>=assetnumber.threatlevel)or(threatlevelMatch~=nil and threatlevelMatch==threatlevel)then +if threatlevelMatch==nil then +threatlevelMatch=threatlevel +end +local nMatch=0 +local cand=true +if assetnumber.targetCategory~=nil then +if assetnumber.targetCategory==targetcategory then +nMatch=nMatch+1 +else +cand=false +end +end +if MissionType and assetnumber.missionType~=nil then +if assetnumber.missionType==MissionType then +nMatch=nMatch+1 +else +cand=false +end +end +if assetnumber.nUnits~=nil then +if assetnumber.nUnits>=nUnits then +nMatch=nMatch+1 +else +cand=false +end +end +if assetnumber.defcon~=nil then +if assetnumber.defcon==self.Defcon then +nMatch=nMatch+1 +else +cand=false +end +end +if assetnumber.strategy~=nil then +if assetnumber.strategy==self.strategy then +nMatch=nMatch+1 +else +cand=false +end +end +if cand then +table.insert(candidates,{assetnumber=assetnumber,nMatch=nMatch}) +end +end +end +if#candidates>0 then +local function _sort(a,b) +return a.nMatch>b.nMatch +end +table.sort(candidates,_sort) +local candidate=candidates[1] +local an=candidate.assetnumber +self:T(self.lid..string.format("Picking candidate with %d matches: NassetsMin=%d, NassetsMax=%d, ThreatLevel=%d, TargetCategory=%s, MissionType=%s, Defcon=%s, Strategy=%s", +candidate.nMatch,an.nAssetMin,an.nAssetMax,an.threatlevel,tostring(an.targetCategory),tostring(an.missionType),tostring(an.defcon),tostring(an.strategy))) +return an.nAssetMin,an.nAssetMax +else +return 1,1 +end +end +function CHIEF:GetDefcon(Defcon) +return self.Defcon +end +function CHIEF:SetLimitMission(Limit,MissionType) +self.commander:SetLimitMission(Limit,MissionType) +return self +end +function CHIEF:SetTacticalOverviewOn() +self.tacview=true +return self +end +function CHIEF:SetTacticalOverviewOff() +self.tacview=false +return self +end +function CHIEF:SetStrategy(Strategy) +if Strategy~=self.strategy then +self:StrategyChange(Strategy) +end +self.strategy=Strategy +return self +end +function CHIEF:GetStrategy() +return self.strategy +end +function CHIEF:GetDefcon(Defcon) +return self.Defcon +end +function CHIEF:GetCommander() +return self.commander +end +function CHIEF:AddAirwing(Airwing) +self:AddLegion(Airwing) +return self +end +function CHIEF:AddBrigade(Brigade) +self:AddLegion(Brigade) +return self +end +function CHIEF:AddFleet(Fleet) +self:AddLegion(Fleet) +return self +end +function CHIEF:AddLegion(Legion) +Legion.chief=self +self.commander:AddLegion(Legion) +return self +end +function CHIEF:RemoveLegion(Legion) +Legion.chief=nil +self.commander:RemoveLegion(Legion) +return self +end +function CHIEF:AddMission(Mission) +Mission.chief=self +Mission.statusChief=AUFTRAG.Status.PLANNED +self:I(self.lid..string.format("Adding mission #%d",Mission.auftragsnummer)) +self.commander:AddMission(Mission) +return self +end +function CHIEF:RemoveMission(Mission) +Mission.chief=nil +self.commander:RemoveMission(Mission) +return self +end +function CHIEF:AddOpsTransport(Transport) +Transport.chief=self +self.commander:AddOpsTransport(Transport) +return self +end +function CHIEF:RemoveTransport(Transport) +Transport.chief=nil +self.commander:RemoveTransport(Transport) +return self +end +function CHIEF:AddTarget(Target) +if not self:IsTarget(Target)then +Target.chief=self +table.insert(self.targetqueue,Target) +end +return self +end +function CHIEF:IsTarget(Target) +for _,_target in pairs(self.targetqueue)do +local target=_target +if target.uid==Target.uid or target:GetName()==Target:GetName()then +return true +end +end +return false +end +function CHIEF:RemoveTarget(Target) +for i,_target in pairs(self.targetqueue)do +local target=_target +if target.uid==Target.uid then +self:T(self.lid..string.format("Removing target %s from queue",Target.name)) +table.remove(self.targetqueue,i) +break +end +end +return self +end +function CHIEF:AddStrategicZone(OpsZone,Priority,Importance,ResourceOccupied,ResourceEmpty) +local stratzone={} +stratzone.opszone=OpsZone +stratzone.prio=Priority or 50 +stratzone.importance=Importance +stratzone.missions={} +if OpsZone:IsStopped()then +OpsZone:Start() +end +if ResourceOccupied then +stratzone.resourceOccup=UTILS.DeepCopy(ResourceOccupied) +else +stratzone.resourceOccup=self:CreateResource(AUFTRAG.Type.ARTY,1,2) +self:AddToResource(stratzone.resourceOccup,AUFTRAG.Type.CASENHANCED,1,2) +end +if ResourceEmpty then +stratzone.resourceEmpty=UTILS.DeepCopy(ResourceEmpty) +else +local resourceEmpty,resourceInfantry=self:CreateResource(AUFTRAG.Type.ONGUARD,1,3,GROUP.Attribute.GROUND_INFANTRY) +self:AddToResource(resourceEmpty,AUFTRAG.Type.ONGUARD,0,1,GROUP.Attribute.GROUND_TANK) +self:AddToResource(resourceEmpty,AUFTRAG.Type.ONGUARD,0,1,GROUP.Attribute.GROUND_IFV) +self:AddTransportToResource(resourceInfantry,0,1,{GROUP.Attribute.AIR_TRANSPORTHELO,GROUP.Attribute.GROUND_APC}) +stratzone.resourceEmpty=resourceEmpty +end +table.insert(self.zonequeue,stratzone) +OpsZone:_AddChief(self) +return stratzone +end +function CHIEF:SetStrategicZoneResourceEmpty(StrategicZone,Resource,NoCopy) +if NoCopy then +StrategicZone.resourceEmpty=Resource +else +StrategicZone.resourceEmpty=UTILS.DeepCopy(Resource) +end +return self +end +function CHIEF:SetStrategicZoneResourceOccupied(StrategicZone,Resource,NoCopy) +if NoCopy then +StrategicZone.resourceOccup=Resource +else +StrategicZone.resourceOccup=UTILS.DeepCopy(Resource) +end +return self +end +function CHIEF:GetStrategicZoneResourceEmpty(StrategicZone) +return StrategicZone.resourceEmpty +end +function CHIEF:GetStrategicZoneResourceOccupied(StrategicZone) +return StrategicZone.resourceOccup +end +function CHIEF:RemoveStrategicZone(OpsZone,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,CHIEF.RemoveStrategicZone,self,OpsZone) +else +for i=#self.zonequeue,1,-1 do +local stratzone=self.zonequeue[i] +if OpsZone.zoneName==stratzone.opszone.zoneName then +self:T(self.lid..string.format("Removing OPS zone \"%s\" from queue! All running missions will be cancelled",OpsZone.zoneName)) +for _,_resource in pairs(stratzone.resourceEmpty)do +local resource=_resource +if resource.mission and resource.mission:IsNotOver()then +resource.mission:Cancel() +end +end +for _,_resource in pairs(stratzone.resourceOccup)do +local resource=_resource +if resource.mission and resource.mission:IsNotOver()then +resource.mission:Cancel() +end +end +table.remove(self.zonequeue,i) +return self +end +end +end +return self +end +function CHIEF:AddRearmingZone(RearmingZone) +local supplyzone=self.commander:AddRearmingZone(RearmingZone) +return supplyzone +end +function CHIEF:AddRefuellingZone(RefuellingZone) +local supplyzone=self.commander:AddRefuellingZone(RefuellingZone) +return supplyzone +end +function CHIEF:AddCapZone(Zone,Altitude,Speed,Heading,Leg) +local zone=self.commander:AddCapZone(Zone,Altitude,Speed,Heading,Leg) +return zone +end +function CHIEF:AddGciCapZone(Zone,Altitude,Speed,Heading,Leg) +local zone=self.commander:AddGciCapZone(Zone,Altitude,Speed,Heading,Leg) +return zone +end +function CHIEF:RemoveGciCapZone(Zone) +local zone=self.commander:RemoveGciCapZone(Zone) +return zone +end +function CHIEF:AddAwacsZone(Zone,Altitude,Speed,Heading,Leg) +local zone=self.commander:AddAwacsZone(Zone,Altitude,Speed,Heading,Leg) +return zone +end +function CHIEF:RemoveAwacsZone(Zone) +local zone=self.commander:RemoveAwacsZone(Zone) +return zone +end +function CHIEF:AddTankerZone(Zone,Altitude,Speed,Heading,Leg,RefuelSystem) +local zone=self.commander:AddTankerZone(Zone,Altitude,Speed,Heading,Leg,RefuelSystem) +return zone +end +function CHIEF:RemoveTankerZone(Zone) +local zone=self.commander:RemoveTankerZone(Zone) +return zone +end +function CHIEF:SetBorderZones(BorderZoneSet) +self.borderzoneset=BorderZoneSet or SET_ZONE:New() +return self +end +function CHIEF:AddBorderZone(Zone) +self.borderzoneset:AddZone(Zone) +return self +end +function CHIEF:RemoveBorderZone(Zone) +self.borderzoneset:Remove(Zone:GetName()) +return self +end +function CHIEF:SetConflictZones(ZoneSet) +self.yellowzoneset=ZoneSet or SET_ZONE:New() +return self +end +function CHIEF:AddConflictZone(Zone) +self.yellowzoneset:AddZone(Zone) +return self +end +function CHIEF:RemoveConflictZone(Zone) +self.yellowzoneset:Remove(Zone:GetName()) +return self +end +function CHIEF:SetAttackZones(ZoneSet) +self.engagezoneset=ZoneSet or SET_ZONE:New() +return self +end +function CHIEF:AddAttackZone(Zone) +self.engagezoneset:AddZone(Zone) +return self +end +function CHIEF:RemoveAttackZone(Zone) +self.engagezoneset:Remove(Zone:GetName()) +return self +end +function CHIEF:AllowGroundTransport() +env.warning("WARNING: CHIEF:AllowGroundTransport() is deprecated and will be removed in the future!") +self.TransportCategories={Group.Category.GROUND,Group.Category.HELICOPTER} +return self +end +function CHIEF:ForbidGroundTransport() +env.warning("WARNING: CHIEF:ForbidGroundTransport() is deprecated and will be removed in the future!") +self.TransportCategories={Group.Category.HELICOPTER} +return self +end +function CHIEF:IsPassive() +return self.strategy==CHIEF.Strategy.PASSIVE +end +function CHIEF:IsDefensive() +return self.strategy==CHIEF.Strategy.DEFENSIVE +end +function CHIEF:IsOffensive() +return self.strategy==CHIEF.Strategy.OFFENSIVE +end +function CHIEF:IsAgressive() +return self.strategy==CHIEF.Strategy.AGGRESSIVE +end +function CHIEF:IsTotalWar() +return self.strategy==CHIEF.Strategy.TOTALWAR +end +function CHIEF:onafterStart(From,Event,To) +local text=string.format("Starting Chief of Staff") +self:I(self.lid..text) +self:GetParent(self).onafterStart(self,From,Event,To) +if self.commander then +if self.commander:GetState()=="NotReadyYet"then +self.commander:Start() +end +end +end +function CHIEF:onafterStatus(From,Event,To) +self:GetParent(self).onafterStatus(self,From,Event,To) +local fsmstate=self:GetState() +for _,_contact in pairs(self.ContactsLost)do +local contact=_contact +if contact.mission and contact.mission:IsNotOver()then +local text=string.format("Lost contact to target %s! %s mission %s will be cancelled.",contact.groupname,contact.mission.type:upper(),contact.mission.name) +MESSAGE:New(text,120,"CHIEF"):ToAll() +self:T(self.lid..text) +contact.mission:Cancel() +end +if contact.target then +self:RemoveTarget(contact.target) +end +end +self.Nborder=0;self.Nconflict=0;self.Nattack=0 +for _,_contact in pairs(self.Contacts)do +local contact=_contact +local group=contact.group +local inred=self:CheckGroupInBorder(group) +if inred then +self.Nborder=self.Nborder+1 +end +local inyellow=self:CheckGroupInConflict(group) +if inyellow then +self.Nconflict=self.Nconflict+1 +end +local inattack=self:CheckGroupInAttack(group) +if inattack then +self.Nattack=self.Nattack+1 +end +if not contact.target then +local Target=TARGET:New(contact.group) +contact.target=Target +Target.contact=contact +self:AddTarget(Target) +end +end +if self.Nborder>0 then +self:SetDefcon(CHIEF.DEFCON.RED) +elseif self.Nconflict>0 then +self:SetDefcon(CHIEF.DEFCON.YELLOW) +else +self:SetDefcon(CHIEF.DEFCON.GREEN) +end +self:CheckTargetQueue() +for _,_target in pairs(self.targetqueue)do +local target=_target +if target and target:IsAlive()and target.chief and target.mission and target.mission:IsNotOver()then +local inborder=self:CheckTargetInZones(target,self.borderzoneset) +local inyellow=self:CheckTargetInZones(target,self.yellowzoneset) +local inattack=self:CheckTargetInZones(target,self.engagezoneset) +if self.strategy==CHIEF.Strategy.PASSIVE then +self:T(self.lid..string.format("Cancelling mission for target %s as strategy is PASSIVE",target:GetName())) +target.mission:Cancel() +elseif self.strategy==CHIEF.Strategy.DEFENSIVE then +if not inborder then +self:T(self.lid..string.format("Cancelling mission for target %s as strategy is DEFENSIVE and not inside border",target:GetName())) +target.mission:Cancel() +end +elseif self.strategy==CHIEF.Strategy.OFFENSIVE then +if not(inborder or inyellow)then +self:T(self.lid..string.format("Cancelling mission for target %s as strategy is OFFENSIVE and not inside border or conflict",target:GetName())) +target.mission:Cancel() +end +elseif self.strategy==CHIEF.Strategy.AGGRESSIVE then +if not(inborder or inyellow or inattack)then +self:T(self.lid..string.format("Cancelling mission for target %s as strategy is AGGRESSIVE and not inside border, conflict or attack",target:GetName())) +target.mission:Cancel() +end +elseif self.strategy==CHIEF.Strategy.TOTALWAR then +end +end +end +self:CheckOpsZoneQueue() +self:_TacticalOverview() +if self.verbose>=1 then +local Nassets=self.commander:CountAssets() +local Ncontacts=#self.Contacts +local Nmissions=#self.commander.missionqueue +local Ntargets=#self.targetqueue +local text=string.format("Defcon=%s Strategy=%s: Assets=%d, Contacts=%d [Border=%d, Conflict=%d, Attack=%d], Targets=%d, Missions=%d", +self.Defcon,self.strategy,Nassets,Ncontacts,self.Nborder,self.Nconflict,self.Nattack,Ntargets,Nmissions) +self:I(self.lid..text) +end +if self.verbose>=2 and#self.Contacts>0 then +local text="Contacts:" +for i,_contact in pairs(self.Contacts)do +local contact=_contact +local mtext="N/A" +if contact.mission then +mtext=string.format("\"%s\" [%s] %s",contact.mission:GetName(),contact.mission:GetType(),contact.mission.status:upper()) +end +text=text..string.format("\n[%d] %s Type=%s (%s): Threat=%d Mission=%s",i,contact.groupname,contact.categoryname,contact.typename,contact.threatlevel,mtext) +end +self:I(self.lid..text) +end +if self.verbose>=3 and#self.targetqueue>0 then +local text="Targets:" +for i,_target in pairs(self.targetqueue)do +local target=_target +local mtext="N/A" +if target.mission then +mtext=string.format("\"%s\" [%s] %s",target.mission:GetName(),target.mission:GetType(),target.mission.status:upper()) +end +text=text..string.format("\n[%d] %s: Category=%s, prio=%d, importance=%d, alive=%s [%.1f/%.1f], Mission=%s", +i,target:GetName(),target.category,target.prio,target.importance or-1,tostring(target:IsAlive()),target:GetLife(),target:GetLife0(),mtext) +end +self:I(self.lid..text) +end +if self.verbose>=4 and#self.commander.missionqueue>0 then +local text="Mission queue:" +for i,_mission in pairs(self.commander.missionqueue)do +local mission=_mission +local target=mission:GetTargetName()or"unknown" +text=text..string.format("\n[%d] %s (%s): status=%s, target=%s",i,mission.name,mission.type,mission.status,target) +end +self:I(self.lid..text) +end +if self.verbose>=4 and#self.zonequeue>0 then +local text="Zone queue:" +for i,_stratzone in pairs(self.zonequeue)do +local stratzone=_stratzone +local opszone=stratzone.opszone +local owner=UTILS.GetCoalitionName(opszone.ownerCurrent) +local prevowner=UTILS.GetCoalitionName(opszone.ownerPrevious) +text=text..string.format("\n[%d] %s [%s]: owner=%s [%s] (prio=%d, importance=%s): Blue=%d, Red=%d, Neutral=%d", +i,opszone.zone:GetName(),opszone:GetState(),owner,prevowner,stratzone.prio,tostring(stratzone.importance),opszone.Nblu,opszone.Nred,opszone.Nnut) +end +self:I(self.lid..text) +end +if self.verbose>=5 then +local text="Assets:" +for _,missiontype in pairs(AUFTRAG.Type)do +local N=self.commander:CountAssets(nil,missiontype) +if N>0 then +text=text..string.format("\n- %s: %d",missiontype,N) +end +end +self:I(self.lid..text) +local text="Assets:" +for _,attribute in pairs(WAREHOUSE.Attribute)do +local N=self.commander:CountAssets(nil,nil,attribute) +if N>0 or self.verbose>=10 then +text=text..string.format("\n- %s: %d",attribute,N) +end +end +self:T(self.lid..text) +end +end +function CHIEF:onafterMissionAssign(From,Event,To,Mission,Legions) +if self.commander then +self:T(self.lid..string.format("Assigning mission %s (%s) to COMMANDER",Mission.name,Mission.type)) +Mission.chief=self +Mission.statusChief=AUFTRAG.Status.QUEUED +self.commander:MissionAssign(Mission,Legions) +else +self:E(self.lid..string.format("Mission cannot be assigned as no COMMANDER is defined!")) +end +end +function CHIEF:onafterMissionCancel(From,Event,To,Mission) +self:T(self.lid..string.format("Cancelling mission %s (%s) in status %s",Mission.name,Mission.type,Mission.status)) +Mission.statusChief=AUFTRAG.Status.CANCELLED +if Mission:IsPlanned()then +self:RemoveMission(Mission) +else +if Mission.commander then +Mission.commander:MissionCancel(Mission) +end +end +end +function CHIEF:onafterTransportCancel(From,Event,To,Transport) +self:T(self.lid..string.format("Cancelling transport UID=%d in status %s",Transport.uid,Transport:GetState())) +if Transport:IsPlanned()then +self:RemoveTransport(Transport) +else +if Transport.commander then +Transport.commander:TransportCancel(Transport) +end +end +end +function CHIEF:onafterDefconChange(From,Event,To,Defcon) +self:T(self.lid..string.format("Changing Defcon from %s --> %s",self.Defcon,Defcon)) +end +function CHIEF:onafterStrategyChange(From,Event,To,Strategy) +self:T(self.lid..string.format("Changing Strategy from %s --> %s",self.strategy,Strategy)) +end +function CHIEF:onafterOpsOnMission(From,Event,To,OpsGroup,Mission) +self:T(self.lid..string.format("Group %s on mission %s [%s]",OpsGroup:GetName(),Mission:GetName(),Mission:GetType())) +end +function CHIEF:onafterZoneCaptured(From,Event,To,OpsZone) +self:T(self.lid..string.format("Zone %s captured!",OpsZone:GetName())) +end +function CHIEF:onafterZoneLost(From,Event,To,OpsZone) +self:T(self.lid..string.format("Zone %s lost!",OpsZone:GetName())) +end +function CHIEF:onafterZoneEmpty(From,Event,To,OpsZone) +self:T(self.lid..string.format("Zone %s empty!",OpsZone:GetName())) +end +function CHIEF:onafterZoneAttacked(From,Event,To,OpsZone) +self:T(self.lid..string.format("Zone %s attacked!",OpsZone:GetName())) +end +function CHIEF:_TacticalOverview() +if self.tacview then +local NassetsTotal=self.commander:CountAssets() +local NassetsStock=self.commander:CountAssets(true) +local Ncontacts=#self.Contacts +local NmissionsTotal=#self.commander.missionqueue +local NmissionsRunni=self.commander:CountMissions(AUFTRAG.Type,true) +local Ntargets=#self.targetqueue +local Nzones=#self.zonequeue +local Nagents=self.detectionset:CountAlive() +local text=string.format("Tactical Overview\n") +text=text..string.format("=================\n") +text=text..string.format("Strategy: %s - Defcon: %s - Agents=%s\n",self.strategy,self.Defcon,Nagents) +text=text..string.format("Contacts: %d [Border=%d, Conflict=%d, Attack=%d]\n",Ncontacts,self.Nborder,self.Nconflict,self.Nattack) +text=text..string.format("Assets: %d [Active=%d, Stock=%d]\n",NassetsTotal,NassetsTotal-NassetsStock,NassetsStock) +text=text..string.format("Targets: %d\n",Ntargets) +text=text..string.format("Missions: %d [Running=%d/%d - Success=%d, Failure=%d]\n",NmissionsTotal,NmissionsRunni,self:GetMissionLimit("Total"),self.Nsuccess,self.Nfailure) +for _,mtype in pairs(AUFTRAG.Type)do +local n=self.commander:CountMissions(mtype) +if n>0 then +local N=self.commander:CountMissions(mtype,true) +local limit=self:GetMissionLimit(mtype) +text=text..string.format(" - %s: %d [Running=%d/%d]\n",mtype,n,N,limit) +end +end +text=text..string.format("Strategic Zones: %d\n",Nzones) +for _,_stratzone in pairs(self.zonequeue)do +local stratzone=_stratzone +local owner=stratzone.opszone:GetOwnerName() +text=text..string.format(" - %s: %s - %s [I=%d, P=%d]\n",stratzone.opszone:GetName(),owner,stratzone.opszone:GetState(),stratzone.importance or 0,stratzone.prio or 0) +end +local Ntransports=#self.commander.transportqueue +if Ntransports>0 then +text=text..string.format("Transports: %d\n",Ntransports) +for _,_transport in pairs(self.commander.transportqueue)do +local transport=_transport +text=text..string.format(" - %s",transport:GetState()) +end +end +MESSAGE:New(text,60,nil,true):ToCoalition(self.coalition) +if self.verbose>=4 then +self:I(self.lid..text) +end +end +end +function CHIEF:CheckTargetQueue() +local Ntargets=#self.targetqueue +if Ntargets==0 then +return nil +end +local NoLimit=self:_CheckMissionLimit("Total") +if NoLimit==false then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.threatlevel0>taskB.threatlevel0) +end +table.sort(self.targetqueue,_sort) +local vip=math.huge +for _,_target in pairs(self.targetqueue)do +local target=_target +if target:IsAlive()and target.importance and target.importance<vip then +vip=target.importance +end +end +for _,_target in pairs(self.targetqueue)do +local target=_target +local isAlive=target:IsAlive() +local isImportant=(target.importance==nil or target.importance<=vip) +local threatlevel=target:GetThreatLevelMax() +local isThreat=threatlevel>=self.threatLevelMin and threatlevel<=self.threatLevelMax +if target.category==TARGET.Category.AIRBASE or target.category==TARGET.Category.ZONE or target.Category==TARGET.Category.COORDINATE then +isThreat=true +end +local text=string.format("Target %s: Alive=%s, Threat=%s, Important=%s",target:GetName(),tostring(isAlive),tostring(isThreat),tostring(isImportant)) +if target.mission then +text=text..string.format(", Mission \"%s\" (%s) [%s]",target.mission:GetName(),target.mission:GetState(),target.mission:GetType()) +if target.mission:IsOver()then +text=text..string.format(" - DONE ==> removing mission") +target.mission=nil +end +else +text=text..string.format(", NO mission yet") +end +self:T2(self.lid..text) +if isAlive and isThreat and isImportant and not target.mission then +local valid=false +if self.strategy==CHIEF.Strategy.PASSIVE then +valid=false +elseif self.strategy==CHIEF.Strategy.DEFENSIVE then +if self:CheckTargetInZones(target,self.borderzoneset)then +valid=true +end +elseif self.strategy==CHIEF.Strategy.OFFENSIVE then +if self:CheckTargetInZones(target,self.borderzoneset)or self:CheckTargetInZones(target,self.yellowzoneset)then +valid=true +end +elseif self.strategy==CHIEF.Strategy.AGGRESSIVE then +if self:CheckTargetInZones(target,self.borderzoneset)or self:CheckTargetInZones(target,self.yellowzoneset)or self:CheckTargetInZones(target,self.engagezoneset)then +valid=true +end +elseif self.strategy==CHIEF.Strategy.TOTALWAR then +valid=true +end +if valid then +self:T(self.lid..string.format("Got valid target %s: category=%s, threatlevel=%d",target:GetName(),target.category,threatlevel)) +local MissionPerformances=self:_GetMissionPerformanceFromTarget(target) +local mission=nil +local Legions=nil +if#MissionPerformances>0 then +for _,_mp in pairs(MissionPerformances)do +local mp=_mp +local notlimited=self:_CheckMissionLimit(mp.MissionType) +if notlimited then +local NassetsMin,NassetsMax=self:_GetAssetsForTarget(target,mp.MissionType) +self:T2(self.lid..string.format("Recruiting assets for mission type %s [performance=%d] of target %s",mp.MissionType,mp.Performance,target:GetName())) +local recruited,assets,legions=self.commander:RecruitAssetsForTarget(target,mp.MissionType,NassetsMin,NassetsMax) +if recruited then +self:T(self.lid..string.format("Recruited %d assets for mission type %s [performance=%d] of target %s",#assets,mp.MissionType,mp.Performance,target:GetName())) +mission=AUFTRAG:NewFromTarget(target,mp.MissionType) +if mission then +mission:_AddAssets(assets) +Legions=legions +break +end +else +self:T(self.lid..string.format("Could NOT recruit assets for mission type %s [performance=%d] of target %s",mp.MissionType,mp.Performance,target:GetName())) +end +end +end +end +if mission and Legions then +target.mission=mission +mission.prio=target.prio +mission.importance=target.importance +self:MissionAssign(mission,Legions) +return +end +end +end +end +end +function CHIEF:_CheckMissionLimit(MissionType) +return self.commander:_CheckMissionLimit(MissionType) +end +function CHIEF:GetMissionLimit(MissionType) +local l=self.commander.limitMission[MissionType] +if not l then +l=999 +end +return l +end +function CHIEF:CheckOpsZoneQueue() +local Nzones=#self.zonequeue +if Nzones==0 then +return nil +end +for i=Nzones,1,-1 do +local stratzone=self.zonequeue[i] +if stratzone.opszone:IsStopped()then +self:RemoveStrategicZone(stratzone.opszone) +end +end +for _,_startzone in pairs(self.zonequeue)do +local stratzone=_startzone +local ownercoalition=stratzone.opszone:GetOwner() +if ownercoalition==self.coalition or stratzone.opszone:IsEmpty()then +for _,_resource in pairs(stratzone.resourceOccup or{})do +local resource=_resource +if resource.mission then +resource.mission:Cancel() +end +end +end +end +if self:IsPassive()then +return +end +local NoLimit=self:_CheckMissionLimit("Total") +if NoLimit==false then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio) +end +table.sort(self.zonequeue,_sort) +local vip=math.huge +for _,_stratzone in pairs(self.zonequeue)do +local stratzone=_stratzone +if stratzone.importance and stratzone.importance<vip and stratzone.opszone:GetOwner()~=self.coalition then +vip=stratzone.importance +end +end +for _,_startzone in pairs(self.zonequeue)do +local stratzone=_startzone +local ownercoalition=stratzone.opszone:GetOwner() +local zoneName=stratzone.opszone.zone:GetName() +if(ownercoalition~=self.coalition or(ownercoalition==self.coalition and stratzone.opszone:IsEmpty())) +and(stratzone.importance==nil or stratzone.importance<=vip) +and(not stratzone.opszone:IsStopped())then +self:T(self.lid..string.format("Zone %s [%s] is owned by coalition %d",zoneName,stratzone.opszone:GetState(),ownercoalition)) +if stratzone.opszone:IsEmpty()then +for _,_resource in pairs(stratzone.resourceEmpty or{})do +local resource=_resource +local missionType=resource.MissionType +if(not resource.mission)or resource.mission:IsOver()then +self:T2(self.lid..string.format("Zone \"%s\" is empty ==> Recruiting for mission type %s: Nmin=%d, Nmax=%d",zoneName,missionType,resource.Nmin,resource.Nmax)) +local recruited=self:RecruitAssetsForZone(stratzone,resource) +if recruited then +self:T(self.lid..string.format("Successfully recruited assets for empty zone \"%s\" [mission type=%s]",zoneName,missionType)) +else +self:T(self.lid..string.format("Could not recruited assets for empty zone \"%s\" [mission type=%s]",zoneName,missionType)) +end +end +end +else +for _,_resource in pairs(stratzone.resourceOccup or{})do +local resource=_resource +local missionType=resource.MissionType +if(not resource.mission)or resource.mission:IsOver()then +self:T2(self.lid..string.format("Zone %s is NOT empty ==> Recruiting for mission type %s: Nmin=%d, Nmax=%d",zoneName,missionType,resource.Nmin,resource.Nmax)) +local recruited=self:RecruitAssetsForZone(stratzone,resource) +if recruited then +self:T(self.lid..string.format("Successfully recruited assets for occupied zone %s, mission type=%s",zoneName,missionType)) +else +self:T(self.lid..string.format("Could not recruited assets for occupied zone %s, mission type=%s",zoneName,missionType)) +end +end +end +end +end +end +end +function CHIEF:CheckGroupInBorder(group) +local inside=self:CheckGroupInZones(group,self.borderzoneset) +return inside +end +function CHIEF:CheckGroupInConflict(group) +local inside=self:CheckGroupInZones(group,self.yellowzoneset) +return inside +end +function CHIEF:CheckGroupInAttack(group) +local inside=self:CheckGroupInZones(group,self.engagezoneset) +return inside +end +function CHIEF:CheckGroupInZones(group,zoneset) +for _,_zone in pairs(zoneset.Set or{})do +local zone=_zone +if group:IsInZone(zone)then +return true +end +end +return false +end +function CHIEF:CheckTargetInZones(target,zoneset) +for _,_zone in pairs(zoneset.Set or{})do +local zone=_zone +if zone:IsCoordinateInZone(target:GetCoordinate())then +return true +end +end +return false +end +function CHIEF:_CreateMissionPerformance(MissionType,Performance) +local mp={} +mp.MissionType=MissionType +mp.Performance=Performance +return mp +end +function CHIEF:_GetMissionPerformanceFromTarget(Target) +local group=nil +local airbase=nil +local scenery=nil +local static=nil +local coordinate=nil +local target=Target:GetObject() +if target:IsInstanceOf("GROUP")then +group=target +elseif target:IsInstanceOf("UNIT")then +group=target:GetGroup() +elseif target:IsInstanceOf("AIRBASE")then +airbase=target +elseif target:IsInstanceOf("STATIC")then +static=target +elseif target:IsInstanceOf("SCENERY")then +scenery=target +end +local TargetCategory=Target:GetCategory() +local missionperf={} +if group then +local category=group:GetCategory() +local attribute=group:GetAttribute() +if category==Group.Category.AIRPLANE or category==Group.Category.HELICOPTER then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.INTERCEPT,100)) +elseif category==Group.Category.GROUND or category==Group.Category.TRAIN then +if attribute==GROUP.Attribute.GROUND_SAM then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.SEAD,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif attribute==GROUP.Attribute.GROUND_EWR then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif attribute==GROUP.Attribute.GROUND_AAA then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARMORATTACK,40)) +elseif attribute==GROUP.Attribute.GROUND_ARTILLERY then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,75)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARMORATTACK,70)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBING,70)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif attribute==GROUP.Attribute.GROUND_INFANTRY then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARMORATTACK,40)) +elseif attribute==GROUP.Attribute.GROUND_TANK then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.CAS,90)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.CASENHANCED,90)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARMORATTACK,40)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +else +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.GROUNDATTACK,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +end +elseif category==Group.Category.SHIP then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ANTISHIP,100)) +else +self:E(self.lid.."ERROR: Unknown Group category!") +end +elseif airbase then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBRUNWAY,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif static then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBING,70)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBCARPET,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif scenery then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.STRIKE,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBING,70)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBCARPET,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +elseif coordinate then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBING,100)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBCARPET,50)) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY,30)) +end +return missionperf +end +function CHIEF:_GetMissionTypeForGroupAttribute(Attribute) +local missionperf={} +if Attribute==GROUP.Attribute.AIR_ATTACKHELO then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.INTERCEPT),100) +elseif Attribute==GROUP.Attribute.GROUND_AAA then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI),100) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBING),80) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BOMBCARPET),70) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY),30) +elseif Attribute==GROUP.Attribute.GROUND_SAM then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.SEAD),100) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI),90) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY),50) +elseif Attribute==GROUP.Attribute.GROUND_EWR then +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.SEAD),100) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.BAI),100) +table.insert(missionperf,self:_CreateMissionPerformance(AUFTRAG.Type.ARTY),50) +end +return missionperf +end +function CHIEF:RecruitAssetsForZone(StratZone,Resource) +local Cohorts=self.commander:_GetCohorts() +local MissionType=Resource.MissionType +local NassetsMin=Resource.Nmin +local NassetsMax=Resource.Nmax +local Categories=Resource.Categories +local Attributes=Resource.Attributes +local Properties=Resource.Properties +local TargetVec2=StratZone.opszone.zone:GetVec2() +local RangeMax=nil +if MissionType==AUFTRAG.Type.PATROLZONE or MissionType==AUFTRAG.Type.ONGUARD then +RangeMax=UTILS.NMToMeters(250) +end +if MissionType==AUFTRAG.Type.ARMOREDGUARD then +RangeMax=UTILS.NMToMeters(50) +end +self:T(self.lid..string.format("Recruiting assets for zone %s",StratZone.opszone:GetName())) +self:T(self.lid.."Missiontype="..MissionType) +self:T({categories=Categories}) +self:T({attributes=Attributes}) +self:T({properties=Properties}) +local recruited,assets,legions=LEGION.RecruitCohortAssets(Cohorts,MissionType,nil,NassetsMin,NassetsMax,TargetVec2,nil,RangeMax,nil,nil,nil,nil,Categories,Attributes,Properties) +if recruited then +local mission=nil +self:T2(self.lid..string.format("Recruited %d assets for %s mission STRATEGIC zone %s",#assets,MissionType,tostring(StratZone.opszone.zoneName))) +local TargetZone=StratZone.opszone.zone +local TargetCoord=TargetZone:GetCoordinate() +local transport=nil +local Ntransports=0 +if Resource.carrierNmin and Resource.carrierNmax and Resource.carrierNmax>0 then +self:T(self.lid..string.format("Recruiting carrier assets: Nmin=%s, Nmax=%s",tostring(Resource.carrierNmin),tostring(Resource.carrierNmax))) +local cargoassets=CHIEF._FilterAssets(assets,Resource.Categories,Resource.Attributes,Resource.Properties) +if#cargoassets>0 then +recruited,transport=LEGION.AssignAssetsForTransport(self.commander,self.commander.legions,cargoassets, +Resource.carrierNmin,Resource.carrierNmax,TargetZone,nil,Resource.carrierCategories,Resource.carrierAttributes,Resource.carrierProperties) +Ntransports=transport~=nil and#transport.assets or 0 +self:T(self.lid..string.format("Recruited %d transport carrier assets success=%s",Ntransports,tostring(recruited))) +end +end +if not recruited then +self:T(self.lid..string.format("Could not allocate assets or transport of OPSZONE!")) +LEGION.UnRecruitAssets(assets) +return false +end +self:T2(self.lid..string.format("Recruited %d assets for mission %s",#assets,MissionType)) +if MissionType==AUFTRAG.Type.PATROLZONE or MissionType==AUFTRAG.Type.ONGUARD then +if MissionType==AUFTRAG.Type.PATROLZONE then +mission=AUFTRAG:NewPATROLZONE(TargetZone) +elseif MissionType==AUFTRAG.Type.ONGUARD then +mission=AUFTRAG:NewONGUARD(TargetZone:GetRandomCoordinate(nil,nil,{land.SurfaceType.LAND})) +end +mission:SetEngageDetected(25,{"Ground Units","Light armed ships","Helicopters"}) +elseif MissionType==AUFTRAG.Type.CAPTUREZONE then +mission=AUFTRAG:NewCAPTUREZONE(StratZone.opszone,self.coalition) +elseif MissionType==AUFTRAG.Type.CASENHANCED then +local height=UTILS.MetersToFeet(TargetCoord:GetLandHeight())+2500 +local Speed=200 +if assets[1]then +if assets[1].speedmax then +Speed=UTILS.KmphToKnots(assets[1].speedmax*0.7)or 200 +end +end +mission=AUFTRAG:NewCASENHANCED(TargetZone,height,Speed) +elseif MissionType==AUFTRAG.Type.CAS then +local height=UTILS.MetersToFeet(TargetCoord:GetLandHeight())+2500 +local Speed=200 +if assets[1]then +if assets[1].speedmax then +Speed=UTILS.KmphToKnots(assets[1].speedmax*0.7)or 200 +end +end +TargetZone=StratZone.opszone.zoneCircular +local Leg=TargetZone:GetRadius()<=10000 and 5 or UTILS.MetersToNM(TargetZone:GetRadius()) +mission=AUFTRAG:NewCAS(TargetZone,height,Speed,TargetCoord,math.random(0,359),Leg) +elseif MissionType==AUFTRAG.Type.ARTY then +local Radius=TargetZone:GetRadius() +mission=AUFTRAG:NewARTY(TargetCoord,120,Radius) +elseif MissionType==AUFTRAG.Type.ARMOREDGUARD then +mission=AUFTRAG:NewARMOREDGUARD(TargetCoord) +elseif MissionType==AUFTRAG.Type.BOMBCARPET then +mission=AUFTRAG:NewBOMBCARPET(TargetCoord,nil,1000) +elseif MissionType==AUFTRAG.Type.BOMBING then +local coord=TargetZone:GetRandomCoordinate() +mission=AUFTRAG:NewBOMBING(TargetCoord) +elseif MissionType==AUFTRAG.Type.RECON then +mission=AUFTRAG:NewRECON(TargetZone,nil,5000) +elseif MissionType==AUFTRAG.Type.BARRAGE then +mission=AUFTRAG:NewBARRAGE(TargetZone) +elseif MissionType==AUFTRAG.Type.AMMOSUPPLY then +mission=AUFTRAG:NewAMMOSUPPLY(TargetZone) +end +if mission then +mission:_AddAssets(assets) +self:MissionAssign(mission,legions) +StratZone.opszone:_AddMission(self.coalition,MissionType,mission) +mission:SetName(string.format("Stratzone %s-%d",StratZone.opszone:GetName(),mission.auftragsnummer)) +Resource.mission=mission +if transport and Ntransports>0 then +mission.opstransport=transport +transport.opszone=StratZone.opszone +transport.chief=self +transport.commander=self.commander +end +return true +else +self:E(self.lid..string.format("ERROR: Mission type %s not supported for OPSZONE! Unrecruiting assets...",tostring(MissionType))) +LEGION.UnRecruitAssets(assets) +return false +end +end +self:T2(self.lid..string.format("Could NOT recruit assets for %s mission of STRATEGIC zone %s",MissionType,tostring(StratZone.opszone.zoneName))) +return false +end +function CHIEF._FilterAssets(Assets,Categories,Attributes,Properties) +local filtered={} +for _,_asset in pairs(Assets)do +local asset=_asset +local hasCat=CHIEF._CheckAssetCategories(asset,Categories) +local hasAtt=CHIEF._CheckAssetAttributes(asset,Attributes) +local hasPro=CHIEF._CheckAssetProperties(asset,Properties) +if hasAtt and hasCat and hasPro then +table.insert(filtered,asset) +end +end +return filtered +end +function CHIEF._CheckAssetAttributes(Asset,Attributes) +if not Attributes then +return true +end +for _,attribute in pairs(UTILS.EnsureTable(Attributes))do +if attribute==Asset.attribute then +return true +end +end +return false +end +function CHIEF._CheckAssetCategories(Asset,Categories) +if not Categories then +return true +end +for _,attribute in pairs(UTILS.EnsureTable(Categories))do +if attribute==Asset.category then +return true +end +end +return false +end +function CHIEF._CheckAssetProperties(Asset,Properties) +if not Properties then +return true +end +for _,attribute in pairs(UTILS.EnsureTable(Properties))do +if attribute==Asset.DCSdesc then +return true +end +end +return false +end +COHORT={ +ClassName="COHORT", +verbose=0, +lid=nil, +name=nil, +templatename=nil, +assets={}, +missiontypes={}, +repairtime=0, +maintenancetime=0, +livery=nil, +skill=nil, +legion=nil, +Ngroups=0, +engageRange=nil, +tacanChannel={}, +weightAsset=99999, +cargobayLimit=0, +descriptors={}, +properties={}, +operations={}, +} +COHORT.version="0.3.7" +_COHORTNAMES={} +function COHORT:New(TemplateGroupName,Ngroups,CohortName) +local name=tostring(CohortName or TemplateGroupName) +if UTILS.IsAnyInTable(_COHORTNAMES,name)then +env.error(string.format('ERROR: cannot create cohort "%s" because another cohort with that name already exists. Names must be unique!',name)) +return nil +else +table.insert(_COHORTNAMES,name) +end +local self=BASE:Inherit(self,FSM:New()) +self.templatename=TemplateGroupName +self.name=name +self.lid=string.format("COHORT %s | ",self.name) +self.templategroup=GROUP:FindByName(self.templatename) +if not self.templategroup then +self:E(self.lid..string.format("ERROR: Template group %s does not exist!",tostring(self.templatename))) +return nil +end +self.attribute=self.templategroup:GetAttribute() +self.category=self.templategroup:GetCategory() +self.aircrafttype=self.templategroup:GetTypeName() +self.descriptors=self.templategroup:GetUnit(1):GetDesc() +self.properties=self.descriptors.attributes +self.Ngroups=Ngroups or 3 +self:SetSkill(AI.Skill.GOOD) +if self.category==Group.Category.AIRPLANE then +self:SetMissionRange(200) +elseif self.category==Group.Category.HELICOPTER then +self:SetMissionRange(150) +elseif self.category==Group.Category.GROUND then +self:SetMissionRange(75) +elseif self.category==Group.Category.SHIP then +self:SetMissionRange(100) +elseif self.category==Group.Category.TRAIN then +self:SetMissionRange(100) +else +self:SetMissionRange(150) +end +local units=self.templategroup:GetUnits() +self.weightAsset=0 +for i,_unit in pairs(units)do +local unit=_unit +local desc=unit:GetDesc() +local mass=666 +if desc then +mass=desc.massMax or desc.massEmpty +end +self.weightAsset=self.weightAsset+(mass or 666) +if i==1 then +self.cargobayLimit=unit:GetCargoBayFreeWeight() +end +end +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","OnDuty") +self:AddTransition("*","Status","*") +self:AddTransition("OnDuty","Pause","Paused") +self:AddTransition("Paused","Unpause","OnDuty") +self:AddTransition("OnDuty","Relocate","Relocating") +self:AddTransition("Relocating","Relocated","OnDuty") +self:AddTransition("*","Stop","Stopped") +return self +end +function COHORT:SetLivery(LiveryName) +self.livery=LiveryName +return self +end +function COHORT:SetSkill(Skill) +self.skill=Skill +return self +end +function COHORT:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function COHORT:SetTurnoverTime(MaintenanceTime,RepairTime) +self.maintenancetime=MaintenanceTime and MaintenanceTime*60 or 0 +self.repairtime=RepairTime and RepairTime*60 or 0 +return self +end +function COHORT:SetRadio(Frequency,Modulation) +self.radioFreq=Frequency or 251 +self.radioModu=Modulation or radio.modulation.AM +return self +end +function COHORT:SetGrouping(nunits) +self.ngrouping=nunits or 2 +return self +end +function COHORT:AddMissionCapability(MissionTypes,Performance) +if MissionTypes and type(MissionTypes)~="table"then +MissionTypes={MissionTypes} +end +self.missiontypes=self.missiontypes or{} +for _,missiontype in pairs(MissionTypes)do +local Capability=self:GetMissionCapability(missiontype) +if Capability then +self:E(self.lid.."WARNING: Mission capability already present! No need to add it twice. Will update the performance though!") +Capability.Performance=Performance or 50 +else +local capability={} +capability.MissionType=missiontype +capability.Performance=Performance or 50 +table.insert(self.missiontypes,capability) +self:T(self.lid..string.format("Adding mission capability %s, performance=%d",tostring(capability.MissionType),capability.Performance)) +end +end +self:T2(self.missiontypes) +return self +end +function COHORT:GetMissionCapability(MissionType) +for _,_capability in pairs(self.missiontypes)do +local capability=_capability +if capability.MissionType==MissionType then +return capability +end +end +return nil +end +function COHORT:HasProperty(Property) +for _,property in pairs(self.properties)do +if Property==property then +return true +end +end +return false +end +function COHORT:GetMissionTypes() +local missiontypes={} +for _,Capability in pairs(self.missiontypes)do +local capability=Capability +table.insert(missiontypes,capability.MissionType) +end +return missiontypes +end +function COHORT:GetMissionCapabilities() +return self.missiontypes +end +function COHORT:GetMissionPeformance(MissionType) +for _,Capability in pairs(self.missiontypes)do +local capability=Capability +if capability.MissionType==MissionType then +return capability.Performance +end +end +return-1 +end +function COHORT:SetMissionRange(Range) +self.engageRange=UTILS.NMToMeters(Range or 150) +return self +end +function COHORT:SetCallsign(Callsign,Index,CallsignString) +self.callsignName=Callsign +self.callsignIndex=Index +self.callsignClearName=CallsignString +self.callsign={} +self.callsign.NumberSquad=Callsign +self.callsign.NumberGroup=Index +return self +end +function COHORT:SetAttribute(Attribute) +self.attribute=Attribute +return self +end +function COHORT:GetAttribute() +return self.attribute +end +function COHORT:GetCategory() +return self.category +end +function COHORT:GetProperties() +return self.properties +end +function COHORT:SetModex(Modex,Prefix,Suffix) +self.modex=Modex +self.modexPrefix=Prefix +self.modexSuffix=Suffix +return self +end +function COHORT:SetLegion(Legion) +self.legion=Legion +return self +end +function COHORT:AddAsset(Asset) +self:T(self.lid..string.format("Adding asset %s of type %s",Asset.spawngroupname,Asset.unittype)) +Asset.squadname=self.name +Asset.legion=self.legion +Asset.cohort=self +table.insert(self.assets,Asset) +return self +end +function COHORT:DelAsset(Asset) +for i,_asset in pairs(self.assets)do +local asset=_asset +if Asset.uid==asset.uid then +self:T2(self.lid..string.format("Removing asset %s",asset.spawngroupname)) +table.remove(self.assets,i) +break +end +end +return self +end +function COHORT:DelGroup(GroupName) +for i,_asset in pairs(self.assets)do +local asset=_asset +if GroupName==asset.spawngroupname then +self:T2(self.lid..string.format("Removing asset %s",asset.spawngroupname)) +table.remove(self.assets,i) +break +end +end +return self +end +function COHORT:RemoveAssets(N) +self:T2(self.lid..string.format("Remove %d assets of Cohort",N)) +N=N or 1 +local n=0 +for i=#self.assets,1,-1 do +local asset=self.assets[i] +self:T2(self.lid..string.format("Checking removing asset %s",asset.spawngroupname)) +if not(asset.requested or asset.spawned or asset.isReserved)then +self:T2(self.lid..string.format("Removing asset %s",asset.spawngroupname)) +table.remove(self.assets,i) +n=n+1 +else +self:T2(self.lid..string.format("Could NOT Remove asset %s",asset.spawngroupname)) +end +if n>=N then +break +end +end +self:T(self.lid..string.format("Removed %d/%d assets. New asset count=%d",n,N,#self.assets)) +return self +end +function COHORT:GetName() +return self.name +end +function COHORT:GetRadio() +return self.radioFreq,self.radioModu +end +function COHORT:GetCallsign(Asset) +if self.callsignName then +Asset.callsign={} +for i=1,Asset.nunits do +local callsign={} +callsign[1]=self.callsignName +callsign[2]=math.floor(self.callsigncounter/10) +callsign[3]=self.callsigncounter%10 +if callsign[3]==0 then +callsign[3]=1 +self.callsigncounter=self.callsigncounter+2 +else +self.callsigncounter=self.callsigncounter+1 +end +callsign["name"]=self.callsignClearName or UTILS.GetCallsignName(self.callsignName)or"None" +callsign["name"]=string.format("%s%d%d",callsign["name"],callsign[2],callsign[3]) +callsign[4]=callsign["name"] +Asset.callsign[i]=callsign +self:T3({callsign=callsign}) +end +end +end +function COHORT:GetModex(Asset) +if self.modex then +Asset.modex={} +for i=1,Asset.nunits do +Asset.modex[i]=string.format("%03d",self.modex+self.modexcounter) +self.modexcounter=self.modexcounter+1 +self:T3({modex=Asset.modex[i]}) +end +end +end +function COHORT:AddTacanChannel(ChannelMin,ChannelMax) +ChannelMax=ChannelMax or ChannelMin +if ChannelMin>126 then +self:E(self.lid.."ERROR: TACAN Channel must be <= 126! Will not add to available channels") +return self +end +if ChannelMax>126 then +self:E(self.lid.."WARNING: TACAN Channel must be <= 126! Adjusting ChannelMax to 126") +ChannelMax=126 +end +for i=ChannelMin,ChannelMax do +self.tacanChannel[i]=true +end +return self +end +function COHORT:FetchTacan() +local freechannel=nil +for channel,free in pairs(self.tacanChannel)do +if free then +if freechannel==nil or channel<freechannel then +freechannel=channel +end +end +end +if freechannel then +self:T(self.lid..string.format("Checking out Tacan channel %d",freechannel)) +self.tacanChannel[freechannel]=false +end +return freechannel +end +function COHORT:ReturnTacan(channel) +self:T(self.lid..string.format("Returning Tacan channel %d",channel)) +self.tacanChannel[channel]=true +end +function COHORT:AddWeaponRange(RangeMin,RangeMax,BitType) +RangeMin=UTILS.NMToMeters(RangeMin or 0) +RangeMax=UTILS.NMToMeters(RangeMax or 10) +local weapon={} +weapon.BitType=BitType or ENUMS.WeaponFlag.Auto +weapon.RangeMax=RangeMax +weapon.RangeMin=RangeMin +self.weaponData=self.weaponData or{} +self.weaponData[tostring(weapon.BitType)]=weapon +self:T(self.lid..string.format("Adding weapon data: Bit=%s, Rmin=%d m, Rmax=%d m",tostring(weapon.BitType),weapon.RangeMin,weapon.RangeMax)) +if self.verbose>=2 then +local text="Weapon data:" +for _,_weapondata in pairs(self.weaponData)do +local weapondata=_weapondata +text=text..string.format("\n- Bit=%s, Rmin=%d m, Rmax=%d m",tostring(weapondata.BitType),weapondata.RangeMin,weapondata.RangeMax) +end +self:I(self.lid..text) +end +return self +end +function COHORT:GetWeaponData(BitType) +return self.weaponData[tostring(BitType)] +end +function COHORT:IsOnDuty() +return self:Is("OnDuty") +end +function COHORT:IsStopped() +return self:Is("Stopped") +end +function COHORT:IsPaused() +return self:Is("Paused") +end +function COHORT:IsRelocating() +return self:Is("Relocating") +end +function COHORT:onafterStart(From,Event,To) +local text=string.format("Starting %s v%s %s [%s]",self.ClassName,self.version,self.name,self.attribute) +self:I(self.lid..text) +self:__Status(-1) +end +function COHORT:_CheckAssetStatus() +if self.verbose>=2 and#self.assets>0 then +local text="" +for j,_asset in pairs(self.assets)do +local asset=_asset +text=text..string.format("\n[%d] %s (%s*%d): ",j,asset.spawngroupname,asset.unittype,asset.nunits) +if asset.spawned then +local mission=self.legion and self.legion:GetAssetCurrentMission(asset)or false +if mission then +local distance=asset.flightgroup and UTILS.MetersToNM(mission:GetTargetDistance(asset.flightgroup.group:GetCoordinate()))or 0 +text=text..string.format("Mission %s - %s: Status=%s, Dist=%.1f NM",mission.name,mission.type,mission.status,distance) +else +text=text.."Mission None" +end +text=text..", Flight: " +if asset.flightgroup and asset.flightgroup:IsAlive()then +local status=asset.flightgroup:GetState() +text=text..string.format("%s",status) +if asset.flightgroup:IsFlightgroup()then +local fuelmin=asset.flightgroup:GetFuelMin() +local fuellow=asset.flightgroup:IsFuelLow() +local fuelcri=asset.flightgroup:IsFuelCritical() +text=text..string.format("Fuel=%d",fuelmin) +if fuelcri then +text=text.." (Critical!)" +elseif fuellow then +text=text.." (Low)" +end +end +local lifept,lifept0=asset.flightgroup:GetLifePoints() +text=text..string.format(", Life=%d/%d",lifept,lifept0) +local ammo=asset.flightgroup:GetAmmoTot() +text=text..string.format(", Ammo=%d [G=%d, R=%d, B=%d, M=%d]",ammo.Total,ammo.Guns,ammo.Rockets,ammo.Bombs,ammo.Missiles) +else +text=text.."N/A" +end +if asset.flightgroup:IsFlightgroup()then +local payload=asset.payload and table.concat(self.legion:GetPayloadMissionTypes(asset.payload),", ")or"None" +text=text..", Payload={"..payload.."}" +end +else +text=text..string.format("In Stock") +if self:IsRepaired(asset)then +text=text..", Combat Ready" +else +text=text..string.format(", Repaired in %d sec",self:GetRepairTime(asset)) +if asset.damage then +text=text..string.format(" (Damage=%.1f)",asset.damage) +end +end +if asset.Treturned then +local T=timer.getAbsTime()-asset.Treturned +text=text..string.format(", Returned for %d sec",T) +end +end +end +self:T(self.lid..text) +end +end +function COHORT:onafterStop(From,Event,To) +self:T(self.lid.."STOPPING Cohort and removing all assets!") +for i=#self.assets,1,-1 do +local asset=self.assets[i] +self:DelAsset(asset) +end +self.CallScheduler:Clear() +end +function COHORT:CanMission(Mission) +local cando=true +if not self:IsOnDuty()then +self:T(self.lid..string.format("Cohort in not OnDuty but in state %s. Cannot do mission %s with target %s",self:GetState(),Mission.name,Mission:GetTargetName())) +return false +end +if not AUFTRAG.CheckMissionType(Mission.type,self:GetMissionTypes())then +self:T(self.lid..string.format("INFO: Cohort cannot do mission type %s (%s, %s)",Mission.type,Mission.name,Mission:GetTargetName())) +return false +end +if Mission.type==AUFTRAG.Type.TANKER then +if Mission.refuelSystem and Mission.refuelSystem==self.tankerSystem then +self:T(self.lid..string.format("INFO: Correct refueling system requested=%s != %s=available",tostring(Mission.refuelSystem),tostring(self.tankerSystem))) +else +self:T(self.lid..string.format("INFO: Wrong refueling system requested=%s != %s=available",tostring(Mission.refuelSystem),tostring(self.tankerSystem))) +return false +end +end +local TargetDistance=Mission:GetTargetDistance(self.legion:GetCoordinate()) +local engagerange=Mission.engageRange and math.max(self.engageRange,Mission.engageRange)or self.engageRange +if TargetDistance>engagerange then +self:T(self.lid..string.format("INFO: Cohort is not in range. Target dist=%d > %d NM max mission Range",UTILS.MetersToNM(TargetDistance),UTILS.MetersToNM(engagerange))) +return false +end +return true +end +function COHORT:CountAssets(InStock,MissionTypes,Attributes) +local N=0 +for _,_asset in pairs(self.assets)do +local asset=_asset +if MissionTypes==nil or AUFTRAG.CheckMissionCapability(MissionTypes,self.missiontypes)then +if Attributes==nil or self:CheckAttribute(Attributes)then +if asset.spawned then +if InStock==false or InStock==nil then +N=N+1 +end +else +if InStock==true or InStock==nil then +N=N+1 +end +end +end +end +end +return N +end +function COHORT:GetOpsGroups(MissionTypes,Attributes) +local set=SET_OPSGROUP:New() +for _,_asset in pairs(self.assets)do +local asset=_asset +if MissionTypes==nil or AUFTRAG.CheckMissionCapability(MissionTypes,self.missiontypes)then +if Attributes==nil or self:CheckAttribute(Attributes)then +if asset.flightgroup and asset.flightgroup:IsAlive()then +set:AddGroup(asset.flightgroup) +end +end +end +end +return set +end +function COHORT:RecruitAssets(MissionType,Npayloads) +self:T2(self.lid..string.format("Recruiting asset for Mission type=%s",MissionType)) +local assets={} +for _,_asset in pairs(self.assets)do +local asset=_asset +local isRequested=asset.requested +local isReserved=asset.isReserved +local isSpawned=asset.spawned +local isOnMission=self.legion:IsAssetOnMission(asset) +local opsgroup=asset.flightgroup +self:T(self.lid..string.format("Asset %s: requested=%s, reserved=%s, spawned=%s, onmission=%s", +asset.spawngroupname,tostring(isRequested),tostring(isReserved),tostring(isSpawned),tostring(isOnMission))) +if not(isRequested or isReserved)then +if self.legion:IsAssetOnMission(asset)then +if MissionType==AUFTRAG.Type.RELOCATECOHORT then +table.insert(assets,asset) +elseif self.legion:IsAssetOnMission(asset,AUFTRAG.Type.NOTHING)then +table.insert(assets,asset) +elseif self.legion:IsAssetOnMission(asset,{AUFTRAG.Type.GCICAP,AUFTRAG.Type.PATROLRACETRACK})and MissionType==AUFTRAG.Type.INTERCEPT then +self:T(self.lid..string.format("Adding asset on GCICAP mission for an INTERCEPT mission")) +table.insert(assets,asset) +elseif self.legion:IsAssetOnMission(asset,AUFTRAG.Type.ONGUARD)and(MissionType==AUFTRAG.Type.ARTY or MissionType==AUFTRAG.Type.GROUNDATTACK)then +if not opsgroup:IsOutOfAmmo()then +self:T(self.lid..string.format("Adding asset on ONGUARD mission for an XXX mission")) +table.insert(assets,asset) +end +elseif self.legion:IsAssetOnMission(asset,AUFTRAG.Type.PATROLZONE)and(MissionType==AUFTRAG.Type.ARTY or MissionType==AUFTRAG.Type.GROUNDATTACK)then +if not opsgroup:IsOutOfAmmo()then +self:T(self.lid..string.format("Adding asset on PATROLZONE mission for an XXX mission")) +table.insert(assets,asset) +end +elseif self.legion:IsAssetOnMission(asset,AUFTRAG.Type.ALERT5)and AUFTRAG.CheckMissionCapability(MissionType,asset.payload.capabilities)and MissionType~=AUFTRAG.Type.ALERT5 then +self:T(self.lid..string.format("Adding asset on ALERT 5 mission for %s mission",MissionType)) +table.insert(assets,asset) +end +else +if asset.spawned then +local flightgroup=asset.flightgroup +if flightgroup and flightgroup:IsAlive()and not(flightgroup:IsDead()or flightgroup:IsStopped())then +local combatready=true +if flightgroup:IsFlightgroup()then +if flightgroup:IsFuelLow()then +combatready=false +end +if MissionType==AUFTRAG.Type.INTERCEPT and not flightgroup:CanAirToAir()then +combatready=false +else +local excludeguns=MissionType==AUFTRAG.Type.BOMBING or MissionType==AUFTRAG.Type.BOMBRUNWAY or MissionType==AUFTRAG.Type.BOMBCARPET or MissionType==AUFTRAG.Type.SEAD or MissionType==AUFTRAG.Type.ANTISHIP +if excludeguns and not flightgroup:CanAirToGround(excludeguns)then +combatready=false +end +end +if flightgroup:IsHolding()or flightgroup:IsLanding()or flightgroup:IsLanded()or flightgroup:IsArrived()then +combatready=false +end +if asset.payload and not AUFTRAG.CheckMissionCapability(MissionType,asset.payload.capabilities)then +combatready=false +end +else +if flightgroup:IsArmygroup()then +if asset.attribute==WAREHOUSE.Attribute.GROUND_ARTILLERY or +asset.attribute==WAREHOUSE.Attribute.GROUND_TANK or +asset.attribute==WAREHOUSE.Attribute.GROUND_INFANTRY or +asset.attribute==WAREHOUSE.Attribute.GROUND_AAA or +asset.attribute==WAREHOUSE.Attribute.GROUND_SAM +then +combatready=true +end +else +combatready=false +end +if flightgroup:IsRearming()or flightgroup:IsRetreating()or flightgroup:IsReturning()then +combatready=false +end +end +if flightgroup:IsLoading()or flightgroup:IsTransporting()or flightgroup:IsUnloading()or flightgroup:IsPickingup()or flightgroup:IsCarrier()then +combatready=false +end +if flightgroup:IsCargo()or flightgroup:IsBoarding()or flightgroup:IsAwaitingLift()then +combatready=false +end +if combatready then +self:T(self.lid.."Adding SPAWNED asset to ANOTHER mission as it is COMBATREADY") +table.insert(assets,asset) +end +end +else +if Npayloads>0 and self:IsRepaired(asset)then +table.insert(assets,asset) +Npayloads=Npayloads-1 +end +end +end +end +end +self:T2(self.lid..string.format("Recruited %d assets for Mission type=%s",#assets,MissionType)) +return assets,Npayloads +end +function COHORT:GetRepairTime(Asset) +if Asset.Treturned then +local t=self.maintenancetime +t=t+Asset.damage*self.repairtime +local dt=timer.getAbsTime()-Asset.Treturned +local T=t-dt +return T +else +return 0 +end +end +function COHORT:GetMissionRange(WeaponTypes) +if WeaponTypes and type(WeaponTypes)~="table"then +WeaponTypes={WeaponTypes} +end +local function checkWeaponType(Weapon) +local weapon=Weapon +if WeaponTypes and#WeaponTypes>0 then +for _,weapontype in pairs(WeaponTypes)do +if weapontype==weapon.BitType then +return true +end +end +return false +end +return true +end +local WeaponRange=0 +for _,_weapon in pairs(self.weaponData or{})do +local weapon=_weapon +if weapon.RangeMax>WeaponRange and checkWeaponType(weapon)then +WeaponRange=weapon.RangeMax +end +end +return self.engageRange+WeaponRange +end +function COHORT:IsRepaired(Asset) +if Asset.Treturned then +local Tnow=timer.getAbsTime() +local Trepaired=Asset.Treturned+self.maintenancetime +if Tnow>=Trepaired then +return true +else +return false +end +else +return true +end +end +function COHORT:CheckAttribute(Attributes) +if type(Attributes)~="table"then +Attributes={Attributes} +end +for _,attribute in pairs(Attributes)do +if attribute==self.attribute then +return true +end +end +return false +end +function COHORT:_CheckAmmo() +local units=self.templategroup:GetUnits() +local nammo=0 +local nguns=0 +local nshells=0 +local nrockets=0 +local nmissiles=0 +local nmissilesAA=0 +local nmissilesAG=0 +local nmissilesAS=0 +local nmissilesSA=0 +local nmissilesBM=0 +local nmissilesCR=0 +local ntorps=0 +local nbombs=0 +for _,_unit in pairs(units)do +local unit=_unit +local text=string.format("Unit %s:\n",unit:GetName()) +local ammotable=unit:GetAmmo() +if ammotable then +self:T3(ammotable) +for w=1,#ammotable do +local weapon=ammotable[w] +local Desc=weapon["desc"] +local Warhead=Desc["warhead"] +local Nammo=weapon["count"] +local Category=Desc["category"] +local MissileCategory=(Category==Weapon.Category.MISSILE)and Desc.missileCategory or nil +local TypeName=Desc["typeName"] +local weaponString=UTILS.Split(TypeName,"%.") +local WeaponName=weaponString[#weaponString] +local Rmin=Desc["rangeMin"]or 0 +local Rmax=Desc["rangeMaxAltMin"]or 0 +local Caliber=Warhead and Warhead["caliber"]or 0 +if Category==Weapon.Category.SHELL then +if Caliber<70 then +nguns=nguns+Nammo +else +nshells=nshells+Nammo +end +text=text..string.format("- %d shells [%s]: caliber=%d mm, range=%d - %d meters\n",Nammo,WeaponName,Caliber,Rmin,Rmax) +elseif Category==Weapon.Category.ROCKET then +nrockets=nrockets+Nammo +text=text..string.format("- %d rockets [%s]: caliber=%d mm, range=%d - %d meters\n",Nammo,WeaponName,Caliber,Rmin,Rmax) +elseif Category==Weapon.Category.BOMB then +nbombs=nbombs+Nammo +text=text..string.format("- %d bombs [%s]: caliber=%d mm, range=%d - %d meters\n",Nammo,WeaponName,Caliber,Rmin,Rmax) +elseif Category==Weapon.Category.MISSILE then +if MissileCategory==Weapon.MissileCategory.AAM then +nmissiles=nmissiles+Nammo +nmissilesAA=nmissilesAA+Nammo +if Rmax>0 then +self:AddWeaponRange(UTILS.MetersToNM(Rmin),UTILS.MetersToNM(Rmax),ENUMS.WeaponFlag.AnyAA) +end +elseif MissileCategory==Weapon.MissileCategory.SAM then +nmissiles=nmissiles+Nammo +nmissilesSA=nmissilesSA+Nammo +if Rmax>0 then +end +elseif MissileCategory==Weapon.MissileCategory.ANTI_SHIP then +nmissiles=nmissiles+Nammo +nmissilesAS=nmissilesAS+Nammo +if Rmax>0 then +self:AddWeaponRange(UTILS.MetersToNM(Rmin),UTILS.MetersToNM(Rmax),ENUMS.WeaponFlag.AntiShipMissile) +end +elseif MissileCategory==Weapon.MissileCategory.BM then +nmissiles=nmissiles+Nammo +nmissilesBM=nmissilesBM+Nammo +if Rmax>0 then +end +elseif MissileCategory==Weapon.MissileCategory.CRUISE then +nmissiles=nmissiles+Nammo +nmissilesCR=nmissilesCR+Nammo +if Rmax>0 then +self:AddWeaponRange(UTILS.MetersToNM(Rmin),UTILS.MetersToNM(Rmax),ENUMS.WeaponFlag.CruiseMissile) +end +elseif MissileCategory==Weapon.MissileCategory.OTHER then +nmissiles=nmissiles+Nammo +nmissilesAG=nmissilesAG+Nammo +end +text=text..string.format("- %d %s missiles [%s]: caliber=%d mm, range=%d - %d meters\n",Nammo,self:_MissileCategoryName(MissileCategory),WeaponName,Caliber,Rmin,Rmax) +elseif Category==Weapon.Category.TORPEDO then +ntorps=ntorps+Nammo +text=text..string.format("- %d torpedos [%s]: caliber=%d mm, range=%d - %d meters\n",Nammo,WeaponName,Caliber,Rmin,Rmax) +else +text=text..string.format("- %d unknown ammo of type %s (category=%d, missile category=%s)\n",Nammo,TypeName,Category,tostring(MissileCategory)) +end +end +end +if self.verbose>=5 then +self:I(self.lid..text) +else +self:T2(self.lid..text) +end +end +nammo=nguns+nshells+nrockets+nmissiles+nbombs+ntorps +local ammo={} +ammo.Total=nammo +ammo.Guns=nguns +ammo.Shells=nshells +ammo.Rockets=nrockets +ammo.Bombs=nbombs +ammo.Torpedos=ntorps +ammo.Missiles=nmissiles +ammo.MissilesAA=nmissilesAA +ammo.MissilesAG=nmissilesAG +ammo.MissilesAS=nmissilesAS +ammo.MissilesCR=nmissilesCR +ammo.MissilesBM=nmissilesBM +ammo.MissilesSA=nmissilesSA +return ammo +end +function COHORT:_MissileCategoryName(categorynumber) +local cat="unknown" +if categorynumber==Weapon.MissileCategory.AAM then +cat="air-to-air" +elseif categorynumber==Weapon.MissileCategory.SAM then +cat="surface-to-air" +elseif categorynumber==Weapon.MissileCategory.BM then +cat="ballistic" +elseif categorynumber==Weapon.MissileCategory.ANTI_SHIP then +cat="anti-ship" +elseif categorynumber==Weapon.MissileCategory.CRUISE then +cat="cruise" +elseif categorynumber==Weapon.MissileCategory.OTHER then +cat="other" +end +return cat +end +function COHORT:_AddOperation(Operation) +self.operations[Operation.name]=Operation +end +COMMANDER={ +ClassName="COMMANDER", +verbose=0, +coalition=nil, +legions={}, +missionqueue={}, +transportqueue={}, +targetqueue={}, +opsqueue={}, +rearmingZones={}, +refuellingZones={}, +capZones={}, +gcicapZones={}, +awacsZones={}, +tankerZones={}, +limitMission={}, +maxMissionsAssignPerCycle=1, +} +COMMANDER.version="0.1.4" +function COMMANDER:New(Coalition,Alias) +local self=BASE:Inherit(self,FSM:New()) +if Coalition==nil then +env.error("ERROR: Coalition parameter is nil in COMMANDER:New() call!") +return nil +end +self.coalition=Coalition +self.alias=Alias +if self.alias==nil then +if Coalition==coalition.side.BLUE then +self.alias="George S. Patton" +elseif Coalition==coalition.side.RED then +self.alias="Georgy Zhukov" +elseif Coalition==coalition.side.NEUTRAL then +self.alias="Mahatma Gandhi" +end +end +self.lid=string.format("COMMANDER %s [%s] | ",self.alias,UTILS.GetCoalitionName(self.coalition)) +self:SetStartState("NotReadyYet") +self:AddTransition("NotReadyYet","Start","OnDuty") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","MissionAssign","*") +self:AddTransition("*","MissionCancel","*") +self:AddTransition("*","TransportAssign","*") +self:AddTransition("*","TransportCancel","*") +self:AddTransition("*","OpsOnMission","*") +self:AddTransition("*","LegionLost","*") +return self +end +function COMMANDER:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function COMMANDER:SetLimitMission(Limit,MissionType) +MissionType=MissionType or"Total" +if MissionType then +self.limitMission[MissionType]=Limit or 10 +else +self:E(self.lid.."ERROR: No mission type given for setting limit!") +end +return self +end +function COMMANDER:GetCoalition() +return self.coalition +end +function COMMANDER:AddAirwing(Airwing) +self:AddLegion(Airwing) +return self +end +function COMMANDER:AddBrigade(Brigade) +self:AddLegion(Brigade) +return self +end +function COMMANDER:AddFleet(Fleet) +self:AddLegion(Fleet) +return self +end +function COMMANDER:AddLegion(Legion) +Legion.commander=self +table.insert(self.legions,Legion) +return self +end +function COMMANDER:RemoveLegion(Legion) +for i,_legion in pairs(self.legions)do +local legion=_legion +if legion.alias==Legion.alias then +table.remove(self.legions,i) +Legion.commander=nil +end +end +return self +end +function COMMANDER:AddMission(Mission) +if not self:IsMission(Mission)then +Mission.commander=self +Mission.statusCommander=AUFTRAG.Status.PLANNED +table.insert(self.missionqueue,Mission) +end +return self +end +function COMMANDER:AddOpsTransport(Transport) +Transport.commander=self +Transport.statusCommander=OPSTRANSPORT.Status.PLANNED +table.insert(self.transportqueue,Transport) +return self +end +function COMMANDER:RemoveMission(Mission) +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==Mission.auftragsnummer then +self:T(self.lid..string.format("Removing mission %s (%s) status=%s from queue",Mission.name,Mission.type,Mission.status)) +mission.commander=nil +table.remove(self.missionqueue,i) +break +end +end +return self +end +function COMMANDER:RemoveTransport(Transport) +for i,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport.uid==Transport.uid then +self:T(self.lid..string.format("Removing transport UID=%d status=%s from queue",transport.uid,transport:GetState())) +transport.commander=nil +table.remove(self.transportqueue,i) +break +end +end +return self +end +function COMMANDER:AddTarget(Target) +if not self:IsTarget(Target)then +table.insert(self.targetqueue,Target) +end +return self +end +function COMMANDER:AddOperation(Operation) +table.insert(self.opsqueue,Operation) +return self +end +function COMMANDER:IsTarget(Target) +for _,_target in pairs(self.targetqueue)do +local target=_target +if target.uid==Target.uid or target:GetName()==Target:GetName()then +return true +end +end +return false +end +function COMMANDER:RemoveTarget(Target) +for i,_target in pairs(self.targetqueue)do +local target=_target +if target.uid==Target.uid then +self:T(self.lid..string.format("Removing target %s from queue",Target.name)) +table.remove(self.targetqueue,i) +break +end +end +return self +end +function COMMANDER:AddRearmingZone(RearmingZone) +local rearmingzone={} +rearmingzone.zone=RearmingZone +rearmingzone.mission=nil +table.insert(self.rearmingZones,rearmingzone) +return rearmingzone +end +function COMMANDER:AddRefuellingZone(RefuellingZone) +local rearmingzone={} +rearmingzone.zone=RefuellingZone +rearmingzone.mission=nil +table.insert(self.refuellingZones,rearmingzone) +return rearmingzone +end +function COMMANDER:AddCapZone(Zone,Altitude,Speed,Heading,Leg) +local patrolzone={} +patrolzone.zone=Zone +patrolzone.altitude=Altitude or 12000 +patrolzone.heading=Heading or 270 +patrolzone.speed=Speed or 350 +patrolzone.leg=Leg or 30 +patrolzone.mission=nil +table.insert(self.capZones,patrolzone) +return patrolzone +end +function COMMANDER:AddGciCapZone(Zone,Altitude,Speed,Heading,Leg) +local patrolzone={} +patrolzone.zone=Zone +patrolzone.altitude=Altitude or 12000 +patrolzone.heading=Heading or 270 +patrolzone.speed=Speed or 350 +patrolzone.leg=Leg or 30 +patrolzone.mission=nil +table.insert(self.gcicapZones,patrolzone) +return patrolzone +end +function COMMANDER:RemoveGciCapZone(Zone) +local patrolzone={} +patrolzone.zone=Zone +for i,_patrolzone in pairs(self.gcicapZones)do +if _patrolzone.zone==patrolzone.zone then +if _patrolzone.mission and _patrolzone.mission:IsNotOver()then +_patrolzone.mission:Cancel() +end +table.remove(self.gcicapZones,i) +break +end +end +return patrolzone +end +function COMMANDER:AddAwacsZone(Zone,Altitude,Speed,Heading,Leg) +local awacszone={} +awacszone.zone=Zone +awacszone.altitude=Altitude or 12000 +awacszone.heading=Heading or 270 +awacszone.speed=Speed or 350 +awacszone.speed=Speed or 350 +awacszone.leg=Leg or 30 +awacszone.mission=nil +table.insert(self.awacsZones,awacszone) +return awacszone +end +function COMMANDER:RemoveAwacsZone(Zone) +local awacszone={} +awacszone.zone=Zone +for i,_awacszone in pairs(self.awacsZones)do +if _awacszone.zone==awacszone.zone then +if _awacszone.mission and _awacszone.mission:IsNotOver()then +_awacszone.mission:Cancel() +end +table.remove(self.awacsZones,i) +break +end +end +return awacszone +end +function COMMANDER:AddTankerZone(Zone,Altitude,Speed,Heading,Leg,RefuelSystem) +local tankerzone={} +tankerzone.zone=Zone +tankerzone.altitude=Altitude or 12000 +tankerzone.heading=Heading or 270 +tankerzone.speed=Speed or 350 +tankerzone.leg=Leg or 30 +tankerzone.refuelsystem=RefuelSystem +tankerzone.mission=nil +tankerzone.marker=MARKER:New(tankerzone.zone:GetCoordinate(),"Tanker Zone"):ToCoalition(self:GetCoalition()) +table.insert(self.tankerZones,tankerzone) +return tankerzone +end +function COMMANDER:RemoveTankerZone(Zone) +local tankerzone={} +tankerzone.zone=Zone +for i,_tankerzone in pairs(self.tankerZones)do +if _tankerzone.zone==tankerzone.zone then +if _tankerzone.mission and _tankerzone.mission:IsNotOver()then +_tankerzone.mission:Cancel() +end +table.remove(self.tankerZones,i) +break +end +end +return tankerzone +end +function COMMANDER:IsMission(Mission) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==Mission.auftragsnummer then +return true +end +end +return false +end +function COMMANDER:RelocateCohort(Cohort,Legion,Delay,NcarriersMin,NcarriersMax,TransportLegions) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,COMMANDER.RelocateCohort,self,Cohort,Legion,0,NcarriersMin,NcarriersMax,TransportLegions) +else +if Legion:IsCohort(Cohort.name)then +self:E(self.lid..string.format("ERROR: Cohort %s is already part of new legion %s ==> CANNOT Relocate!",Cohort.name,Legion.alias)) +return self +else +table.insert(Legion.cohorts,Cohort) +end +local LegionOld=Cohort.legion +if not LegionOld:IsCohort(Cohort.name)then +self:E(self.lid..string.format("ERROR: Cohort %s is NOT part of this legion %s ==> CANNOT Relocate!",Cohort.name,self.alias)) +return self +end +if LegionOld.alias==Legion.alias then +self:E(self.lid..string.format("ERROR: old legion %s is same as new legion %s ==> CANNOT Relocate!",LegionOld.alias,Legion.alias)) +return self +end +Cohort:Relocate() +local mission=AUFTRAG:_NewRELOCATECOHORT(Legion,Cohort) +mission:AssignCohort(Cohort) +mission:SetRequiredAssets(#Cohort.assets) +if NcarriersMin and NcarriersMin>0 then +mission:SetRequiredTransport(Legion.spawnzone,NcarriersMin,NcarriersMax) +end +if TransportLegions then +for _,legion in pairs(TransportLegions)do +mission:AssignTransportLegion(legion) +end +else +for _,legion in pairs(self.legions)do +mission:AssignTransportLegion(legion) +end +end +mission:SetMissionRange(10000) +self:AddMission(mission) +end +return self +end +function COMMANDER:onafterStart(From,Event,To) +local text=string.format("Starting Commander") +self:I(self.lid..text) +for _,_legion in pairs(self.legions)do +local legion=_legion +if legion:GetState()=="NotReadyYet"then +legion:Start() +end +end +self:__Status(-1) +end +function COMMANDER:onafterStatus(From,Event,To) +local fsmstate=self:GetState() +if self.verbose>=1 then +local text=string.format("Status %s: Legions=%d, Missions=%d, Targets=%d, Transports=%d",fsmstate,#self.legions,#self.missionqueue,#self.targetqueue,#self.transportqueue) +self:T(self.lid..text) +end +self:CheckOpsQueue() +self:CheckTargetQueue() +self:CheckMissionQueue() +self:CheckTransportQueue() +for _,_rearmingzone in pairs(self.rearmingZones)do +local rearmingzone=_rearmingzone +if(not rearmingzone.mission)or rearmingzone.mission:IsOver()then +rearmingzone.mission=AUFTRAG:NewAMMOSUPPLY(rearmingzone.zone) +self:AddMission(rearmingzone.mission) +end +end +for _,_supplyzone in pairs(self.refuellingZones)do +local supplyzone=_supplyzone +if(not supplyzone.mission)or supplyzone.mission:IsOver()then +supplyzone.mission=AUFTRAG:NewFUELSUPPLY(supplyzone.zone) +self:AddMission(supplyzone.mission) +end +end +for _,_patrolzone in pairs(self.capZones)do +local patrolzone=_patrolzone +if(not patrolzone.mission)or patrolzone.mission:IsOver()then +local Coordinate=patrolzone.zone:GetCoordinate() +patrolzone.mission=AUFTRAG:NewCAP(patrolzone.zone,patrolzone.altitude,patrolzone.speed,Coordinate,patrolzone.heading,patrolzone.leg) +self:AddMission(patrolzone.mission) +end +end +for _,_patrolzone in pairs(self.gcicapZones)do +local patrolzone=_patrolzone +if(not patrolzone.mission)or patrolzone.mission:IsOver()then +local Coordinate=patrolzone.zone:GetCoordinate() +patrolzone.mission=AUFTRAG:NewGCICAP(Coordinate,patrolzone.altitude,patrolzone.speed,patrolzone.heading,patrolzone.leg) +self:AddMission(patrolzone.mission) +end +end +for _,_awacszone in pairs(self.awacsZones)do +local awacszone=_awacszone +if(not awacszone.mission)or awacszone.mission:IsOver()then +local Coordinate=awacszone.zone:GetCoordinate() +awacszone.mission=AUFTRAG:NewAWACS(Coordinate,awacszone.altitude,awacszone.speed,awacszone.heading,awacszone.leg) +self:AddMission(awacszone.mission) +end +end +for _,_tankerzone in pairs(self.tankerZones)do +local tankerzone=_tankerzone +if(not tankerzone.mission)or tankerzone.mission:IsOver()then +local Coordinate=tankerzone.zone:GetCoordinate() +tankerzone.mission=AUFTRAG:NewTANKER(Coordinate,tankerzone.altitude,tankerzone.speed,tankerzone.heading,tankerzone.leg,tankerzone.refuelsystem) +self:AddMission(tankerzone.mission) +end +end +if self.verbose>=2 and#self.legions>0 then +local text="Legions:" +for _,_legion in pairs(self.legions)do +local legion=_legion +local Nassets=legion:CountAssets() +local Nastock=legion:CountAssets(true) +text=text..string.format("\n* %s [%s]: Assets=%s stock=%s",legion.alias,legion:GetState(),Nassets,Nastock) +for _,aname in pairs(AUFTRAG.Type)do +local na=legion:CountAssets(true,{aname}) +local np=legion:CountPayloadsInStock({aname}) +local nm=legion:CountAssetsOnMission({aname}) +if na>0 or np>0 then +text=text..string.format("\n - %s: assets=%d, payloads=%d, on mission=%d",aname,na,np,nm) +end +end +end +self:T(self.lid..text) +if self.verbose>=3 then +local Ntotal=0 +local Nspawned=0 +local Nrequested=0 +local Nreserved=0 +local Nstock=0 +local text="\n===========================================\n" +text=text.."Assets:" +for _,_legion in pairs(self.legions)do +local legion=_legion +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +for _,_asset in pairs(cohort.assets)do +local asset=_asset +local state="In Stock" +if asset.flightgroup then +state=asset.flightgroup:GetState() +local mission=legion:GetAssetCurrentMission(asset) +if mission then +state=state..string.format(", Mission \"%s\" [%s]",mission:GetName(),mission:GetType()) +end +else +if asset.spawned then +env.info("FF ERROR: asset has opsgroup but is NOT spawned!") +end +if asset.requested and asset.isReserved then +env.info("FF ERROR: asset is requested and reserved. Should not be both!") +state="Reserved+Requested!" +elseif asset.isReserved then +state="Reserved" +elseif asset.requested then +state="Requested" +end +end +text=text..string.format("\n[UID=%03d] %s Legion=%s [%s]: State=%s [RID=%s]", +asset.uid,asset.spawngroupname,legion.alias,cohort.name,state,tostring(asset.rid)) +if asset.spawned then +Nspawned=Nspawned+1 +end +if asset.requested then +Nrequested=Nrequested+1 +end +if asset.isReserved then +Nreserved=Nreserved+1 +end +if not(asset.spawned or asset.requested or asset.isReserved)then +Nstock=Nstock+1 +end +Ntotal=Ntotal+1 +end +end +end +text=text.."\n-------------------------------------------" +text=text..string.format("\nNstock = %d",Nstock) +text=text..string.format("\nNreserved = %d",Nreserved) +text=text..string.format("\nNrequested = %d",Nrequested) +text=text..string.format("\nNspawned = %d",Nspawned) +text=text..string.format("\nNtotal = %d (=%d)",Ntotal,Nstock+Nspawned+Nrequested+Nreserved) +text=text.."\n===========================================" +self:I(self.lid..text) +end +end +if self.verbose>=2 and#self.missionqueue>0 then +local text="Mission queue:" +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +local target=mission:GetTargetName()or"unknown" +text=text..string.format("\n[%d] %s (%s): status=%s, target=%s",i,mission.name,mission.type,mission.status,target) +end +self:I(self.lid..text) +end +if self.verbose>=2 and#self.targetqueue>0 then +local text="Target queue:" +for i,_target in pairs(self.targetqueue)do +local target=_target +text=text..string.format("\n[%d] %s: status=%s, life=%d",i,target:GetName(),target:GetState(),target:GetLife()) +end +self:I(self.lid..text) +end +if self.verbose>=2 and#self.transportqueue>0 then +local text="Transport queue:" +for i,_transport in pairs(self.transportqueue)do +local transport=_transport +text=text..string.format("\n[%d] UID=%d: status=%s",i,transport.uid,transport:GetState()) +end +self:I(self.lid..text) +end +self:__Status(-30) +end +function COMMANDER:onafterMissionAssign(From,Event,To,Mission,Legions) +self:AddMission(Mission) +Mission.statusCommander=AUFTRAG.Status.QUEUED +for _,_Legion in pairs(Legions)do +local Legion=_Legion +self:T(self.lid..string.format("Assigning mission \"%s\" [%s] to legion \"%s\"",Mission.name,Mission.type,Legion.alias)) +Legion:AddMission(Mission) +Legion:MissionRequest(Mission) +end +end +function COMMANDER:onafterMissionCancel(From,Event,To,Mission) +self:T(self.lid..string.format("Cancelling mission \"%s\" [%s] in status %s",Mission.name,Mission.type,Mission.status)) +Mission.statusCommander=AUFTRAG.Status.CANCELLED +if Mission:IsPlanned()then +self:RemoveMission(Mission) +else +if#Mission.legions>0 then +for _,_legion in pairs(Mission.legions)do +local legion=_legion +legion:MissionCancel(Mission) +end +end +end +end +function COMMANDER:onafterTransportAssign(From,Event,To,Transport,Legions) +Transport.statusCommander=OPSTRANSPORT.Status.QUEUED +for _,_Legion in pairs(Legions)do +local Legion=_Legion +self:T(self.lid..string.format("Assigning transport UID=%d to legion \"%s\"",Transport.uid,Legion.alias)) +Legion:AddOpsTransport(Transport) +Legion:TransportRequest(Transport) +end +end +function COMMANDER:onafterTransportCancel(From,Event,To,Transport) +self:T(self.lid..string.format("Cancelling Transport UID=%d in status %s",Transport.uid,Transport:GetState())) +Transport.statusCommander=OPSTRANSPORT.Status.CANCELLED +if Transport:IsPlanned()then +self:RemoveTransport(Transport) +else +if#Transport.legions>0 then +for _,_legion in pairs(Transport.legions)do +local legion=_legion +legion:TransportCancel(Transport) +end +end +end +end +function COMMANDER:onafterOpsOnMission(From,Event,To,OpsGroup,Mission) +self:T2(self.lid..string.format("Group \"%s\" on mission \"%s\" [%s]",OpsGroup:GetName(),Mission:GetName(),Mission:GetType())) +end +function COMMANDER:CheckOpsQueue() +local Nops=#self.opsqueue +if Nops==0 then +return nil +end +for _,_ops in pairs(self.opsqueue)do +local operation=_ops +if operation:IsRunning()then +for _,_mission in pairs(operation.missions or{})do +local mission=_mission +if mission.phase==nil or(mission.phase and mission.phase==operation.phase)and mission:IsPlanned()then +self:AddMission(mission) +end +end +for _,_target in pairs(operation.targets or{})do +local target=_target +if(target.phase==nil or(target.phase and target.phase==operation.phase))and(not self:IsTarget(target))then +self:AddTarget(target) +end +end +end +end +end +function COMMANDER:CheckTargetQueue() +local Ntargets=#self.targetqueue +if Ntargets==0 then +return nil +end +for i=#self.targetqueue,1,-1 do +local target=self.targetqueue[i] +if(not target:IsAlive())or target:EvalConditionsAny(target.conditionStop)then +for _,_resource in pairs(target.resources)do +local resource=_resource +if resource.mission and resource.mission:IsNotOver()then +self:MissionCancel(resource.mission) +end +end +table.remove(self.targetqueue,i) +end +end +local NoLimit=self:_CheckMissionLimit("Total") +if NoLimit==false then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.threatlevel0>taskB.threatlevel0) +end +table.sort(self.targetqueue,_sort) +local vip=math.huge +for _,_target in pairs(self.targetqueue)do +local target=_target +if target:IsAlive()and target.importance and target.importance<vip then +vip=target.importance +end +end +for _,_target in pairs(self.targetqueue)do +local target=_target +local isAlive=target:IsAlive() +local isImportant=(target.importance==nil or target.importance<=vip) +local isReadyStart=target:EvalConditionsAll(target.conditionStart) +local text=string.format("Target %s: Alive=%s, Important=%s",target:GetName(),tostring(isAlive),tostring(isImportant)) +self:T2(self.lid..text) +if isAlive and isImportant then +for _,_resource in pairs(target.resources or{})do +local resource=_resource +local missionType=resource.MissionType +if(not resource.mission)or resource.mission:IsOver()then +self:T2(self.lid..string.format("Target \"%s\" ==> Creating mission type %s: Nmin=%d, Nmax=%d",target:GetName(),missionType,resource.Nmin,resource.Nmax)) +local mission=AUFTRAG:NewFromTarget(target,missionType) +if mission then +mission:SetRequiredAssets(resource.Nmin,resource.Nmax) +mission:SetRequiredAttribute(resource.Attributes) +mission:SetRequiredProperty(resource.Properties) +mission.operation=target.operation +resource.mission=mission +self:AddMission(resource.mission) +end +end +end +end +end +end +function COMMANDER:CheckMissionQueue() +local Nmissions=#self.missionqueue +if Nmissions==0 then +return nil +end +local NoLimit=self:_CheckMissionLimit("Total") +if NoLimit==false then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.Tstart<taskB.Tstart) +end +table.sort(self.missionqueue,_sort) +local vip=math.huge +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.importance and mission.importance<vip then +vip=mission.importance +end +end +local missionsAssigned=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsPlanned()and mission:IsReadyToGo()and(mission.importance==nil or mission.importance<=vip)and self:_CheckMissionLimit(mission.type)then +local recruited,assets,legions=self:RecruitAssetsForMission(mission) +if recruited then +mission:_AddAssets(assets) +local EscortAvail=self:RecruitAssetsForEscort(mission,assets) +local TransportAvail=true +if EscortAvail then +if mission.NcarriersMin then +local Transport=nil +local Legions=mission.transportLegions or self.legions +TransportAvail,Transport=LEGION.AssignAssetsForTransport(self,Legions,assets,mission.NcarriersMin,mission.NcarriersMax,mission.transportDeployZone,mission.transportDisembarkZone,mission.carrierCategories,mission.carrierAttributes,mission.carrierProperties) +if TransportAvail and Transport then +mission.opstransport=Transport +end +end +end +if EscortAvail and TransportAvail then +self:MissionAssign(mission,legions) +else +LEGION.UnRecruitAssets(assets,mission) +end +missionsAssigned=missionsAssigned+1 +if missionsAssigned>=(self.maxMissionsAssignPerCycle or 1)then +return +end +end +else +end +end +end +function COMMANDER:SetMaxMissionsAssignPerCycle(MaxMissionsAssignPerCycle) +self.maxMissionsAssignPerCycle=MaxMissionsAssignPerCycle or 1 +return self +end +function COMMANDER:_GetCohorts(Legions,Cohorts,Operation) +local function CheckOperation(LegionOrCohort) +if#self.opsqueue==0 then +return true +end +local isAvail=true +if Operation then +isAvail=false +end +for _,_operation in pairs(self.opsqueue)do +local operation=_operation +local isOps=operation:IsAssignedCohortOrLegion(LegionOrCohort) +if isOps and operation:IsRunning()then +isAvail=false +if Operation==nil then +return false +else +if Operation.uid==operation.uid then +return true +end +end +end +end +return isAvail +end +local cohorts={} +if(Legions and#Legions>0)or(Cohorts and#Cohorts>0)then +for _,_legion in pairs(Legions or{})do +local legion=_legion +local Runway=true +if legion:IsAirwing()then +Runway=legion:IsRunwayOperational()and legion.airbase and legion.airbase:GetCoalition()==legion:GetCoalition() +end +if legion:IsRunning()and Runway then +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +if CheckOperation(cohort.legion)or CheckOperation(cohort)then +table.insert(cohorts,cohort) +end +end +end +end +for _,_cohort in pairs(Cohorts or{})do +local cohort=_cohort +if CheckOperation(cohort)then +table.insert(cohorts,cohort) +end +end +else +for _,_legion in pairs(self.legions)do +local legion=_legion +local Runway=true +if legion:IsAirwing()then +Runway=legion:IsRunwayOperational()and legion.airbase and legion.airbase:GetCoalition()==legion:GetCoalition() +end +if legion:IsRunning()and Runway then +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +if CheckOperation(cohort.legion)or CheckOperation(cohort)then +table.insert(cohorts,cohort) +end +end +end +end +end +return cohorts +end +function COMMANDER:RecruitAssetsForMission(Mission) +self:T2(self.lid..string.format("Recruiting assets for mission \"%s\" [%s]",Mission:GetName(),Mission:GetType())) +local NreqMin,NreqMax=Mission:GetRequiredAssets() +local TargetVec2=Mission:GetTargetVec2() +local Payloads=Mission.payloads +local MaxWeight=nil +if Mission.NcarriersMin then +local legions=self.legions +local cohorts=nil +if Mission.transportLegions or Mission.transportCohorts then +legions=Mission.transportLegions +cohorts=Mission.transportCohorts +end +local Cohorts=LEGION._GetCohorts(legions,cohorts) +local transportcohorts={} +for _,_cohort in pairs(Cohorts)do +local cohort=_cohort +local can=LEGION._CohortCan(cohort,AUFTRAG.Type.OPSTRANSPORT,Mission.carrierCategories,Mission.carrierAttributes,Mission.carrierProperties,nil,TargetVec2) +if can and(MaxWeight==nil or cohort.cargobayLimit>MaxWeight)then +MaxWeight=cohort.cargobayLimit +end +end +if MaxWeight then +self:T(self.lid..string.format("Largest cargo bay available=%.1f",MaxWeight)) +end +end +local legions=self.legions +local cohorts=nil +if Mission.specialLegions or Mission.specialCohorts then +legions=Mission.specialLegions +cohorts=Mission.specialCohorts +end +local Cohorts=LEGION._GetCohorts(legions,cohorts,Mission.operation,self.opsqueue) +self:T(self.lid..string.format("Found %d cohort candidates for mission",#Cohorts)) +local recruited,assets,legions=LEGION.RecruitCohortAssets(Cohorts,Mission.type,Mission.alert5MissionType,NreqMin,NreqMax,TargetVec2,Payloads, +Mission.engageRange,Mission.refuelSystem,nil,nil,MaxWeight,nil,Mission.attributes,Mission.properties,{Mission.engageWeaponType}) +return recruited,assets,legions +end +function COMMANDER:RecruitAssetsForEscort(Mission,Assets) +if Mission.NescortMin and Mission.NescortMax and(Mission.NescortMin>0 or Mission.NescortMax>0)then +local Cohorts=self:_GetCohorts(Mission.escortLegions,Mission.escortCohorts,Mission.operation) +local assigned=LEGION.AssignAssetsForEscort(self,Cohorts,Assets,Mission.NescortMin,Mission.NescortMax,Mission.escortMissionType,Mission.escortTargetTypes,Mission.escortEngageRange) +return assigned +end +return true +end +function COMMANDER:RecruitAssetsForTarget(Target,MissionType,NassetsMin,NassetsMax) +local Cohorts=self:_GetCohorts() +local TargetVec2=Target:GetVec2() +local recruited,assets,legions=LEGION.RecruitCohortAssets(Cohorts,MissionType,nil,NassetsMin,NassetsMax,TargetVec2) +return recruited,assets,legions +end +function COMMANDER:CheckTransportQueue() +local Ntransports=#self.transportqueue +if Ntransports==0 then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.Tstart<taskB.Tstart) +end +table.sort(self.transportqueue,_sort) +local vip=math.huge +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport.importance and transport.importance<vip then +vip=transport.importance +end +end +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport:IsPlanned()and transport:IsReadyToGo()and(transport.importance==nil or transport.importance<=vip)then +local cargoOpsGroups=transport:GetCargoOpsGroups(false) +local weightGroup=0 +local TotalWeight=0 +if#cargoOpsGroups>0 then +for _,_opsgroup in pairs(cargoOpsGroups)do +local opsgroup=_opsgroup +local weight=opsgroup:GetWeightTotal() +if weight>weightGroup then +weightGroup=weight +end +TotalWeight=TotalWeight+weight +end +end +if weightGroup>0 then +local recruited,assets,legions=self:RecruitAssetsForTransport(transport,weightGroup,TotalWeight) +if recruited then +for _,_asset in pairs(assets)do +local asset=_asset +transport:AddAsset(asset) +end +self:TransportAssign(transport,legions) +return +else +LEGION.UnRecruitAssets(assets) +end +end +else +end +end +end +function COMMANDER:RecruitAssetsForTransport(Transport,CargoWeight,TotalWeight) +if CargoWeight==0 then +return false,{},{} +end +local Cohorts=self:_GetCohorts() +local TargetVec2=Transport:GetDeployZone():GetVec2() +local NreqMin,NreqMax=Transport:GetRequiredCarriers() +local recruited,assets,legions=LEGION.RecruitCohortAssets(Cohorts,AUFTRAG.Type.OPSTRANSPORT,nil,NreqMin,NreqMax,TargetVec2,nil,nil,nil,CargoWeight,TotalWeight) +return recruited,assets,legions +end +function COMMANDER:_CheckMissionLimit(MissionType) +local limit=self.limitMission[MissionType] +if limit then +if MissionType=="Total"then +MissionType=AUFTRAG.Type +end +local N=self:CountMissions(MissionType,true) +if N>=limit then +return false +end +end +return true +end +function COMMANDER:CountAssets(InStock,MissionTypes,Attributes) +local N=0 +for _,_legion in pairs(self.legions)do +local legion=_legion +N=N+legion:CountAssets(InStock,MissionTypes,Attributes) +end +return N +end +function COMMANDER:CountMissions(MissionTypes,OnlyRunning) +local N=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if(not OnlyRunning)or(mission.statusCommander~=AUFTRAG.Status.PLANNED)then +if AUFTRAG.CheckMissionType(mission.type,MissionTypes)then +N=N+1 +end +end +end +return N +end +function COMMANDER:GetAssets(InStock,Legions,MissionTypes,Attributes) +local assets={} +for _,_legion in pairs(Legions or self.legions)do +local legion=_legion +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +for _,_asset in pairs(cohort.assets)do +local asset=_asset +if not(asset.spawned or asset.isReserved or asset.requested)then +table.insert(assets,asset) +end +end +end +end +return assets +end +function COMMANDER:GetLegionsForMission(Mission) +local legions={} +for _,_legion in pairs(self.legions)do +local legion=_legion +local Nassets=0 +if legion:IsAirwing()then +Nassets=legion:CountAssetsWithPayloadsInStock(Mission.payloads,{Mission.type},Attributes) +else +Nassets=legion:CountAssets(true,{Mission.type},Attributes) +end +if Nassets>0 and false then +local coord=Mission:GetTargetCoordinate() +if coord then +local distance=UTILS.MetersToNM(coord:Get2DDistance(legion:GetCoordinate())) +local dist=UTILS.Round(distance/10,0) +self:T(self.lid..string.format("Got legion %s with Nassets=%d and dist=%.1f NM, rounded=%.1f",legion.alias,Nassets,distance,dist)) +table.insert(legions,{airwing=legion,distance=distance,dist=dist,targetcoord=coord,nassets=Nassets}) +end +end +if Nassets>0 then +table.insert(legions,legion) +end +end +return legions +end +function COMMANDER:GetAssetsOnMission(MissionTypes) +local assets={} +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if AUFTRAG.CheckMissionType(mission.type,MissionTypes)then +for _,_asset in pairs(mission.assets or{})do +local asset=_asset +table.insert(assets,asset) +end +end +end +return assets +end +FLEET={ +ClassName="FLEET", +verbose=0, +pathfinding=false, +} +FLEET.version="0.0.1" +function FLEET:New(WarehouseName,FleetName) +local self=BASE:Inherit(self,LEGION:New(WarehouseName,FleetName)) +if not self then +BASE:E(string.format("ERROR: Could not find warehouse %s!",WarehouseName)) +return nil +end +self.lid=string.format("FLEET %s | ",self.alias) +self:SetRetreatZones() +if self:IsShip()then +local wh=self.warehouse +local group=wh:GetGroup() +self.warehouseOpsGroup=NAVYGROUP:New(group) +self.warehouseOpsElement=self.warehouseOpsGroup:GetElementByName(wh:GetName()) +end +self:AddTransition("*","NavyOnMission","*") +return self +end +function FLEET:AddFlotilla(Flotilla) +table.insert(self.cohorts,Flotilla) +self:AddAssetToFlotilla(Flotilla,Flotilla.Ngroups) +Flotilla:SetFleet(self) +if Flotilla:IsStopped()then +Flotilla:Start() +end +return self +end +function FLEET:AddAssetToFlotilla(Flotilla,Nassets) +if Flotilla then +local Group=GROUP:FindByName(Flotilla.templatename) +if Group then +local text=string.format("Adding asset %s to flotilla %s",Group:GetName(),Flotilla.name) +self:T(self.lid..text) +self:AddAsset(Group,Nassets,nil,nil,nil,nil,Flotilla.skill,Flotilla.livery,Flotilla.name) +else +self:E(self.lid.."ERROR: Group does not exist!") +end +else +self:E(self.lid.."ERROR: Flotilla does not exit!") +end +return self +end +function FLEET:SetPathfinding(Switch) +self.pathfinding=Switch +return self +end +function FLEET:SetRetreatZones(RetreatZoneSet) +self.retreatZones=RetreatZoneSet or SET_ZONE:New() +return self +end +function FLEET:AddRetreatZone(RetreatZone) +self.retreatZones:AddZone(RetreatZone) +return self +end +function FLEET:GetRetreatZones() +return self.retreatZones +end +function FLEET:GetFlotilla(FlotillaName) +local flotilla=self:_GetCohort(FlotillaName) +return flotilla +end +function FLEET:GetFlotillaOfAsset(Asset) +local flotilla=self:GetFlotilla(Asset.squadname) +return flotilla +end +function FLEET:RemoveAssetFromFlotilla(Asset) +local flotilla=self:GetFlotillaOfAsset(Asset) +if flotilla then +flotilla:DelAsset(Asset) +end +end +function FLEET:onafterStart(From,Event,To) +self:GetParent(self,FLEET).onafterStart(self,From,Event,To) +self:I(self.lid..string.format("Starting FLEET v%s",FLEET.version)) +end +function FLEET:onafterStatus(From,Event,To) +self:GetParent(self).onafterStatus(self,From,Event,To) +local fsmstate=self:GetState() +self:CheckTransportQueue() +self:CheckMissionQueue() +self:_TacticalOverview() +if self.verbose>=1 then +local Nmissions=self:CountMissionsInQueue() +local Npq,Np,Nq=self:CountAssetsOnMission() +local assets=string.format("%d [OnMission: Total=%d, Active=%d, Queued=%d]",self:CountAssets(),Npq,Np,Nq) +local text=string.format("%s: Missions=%d, Flotillas=%d, Assets=%s",fsmstate,Nmissions,#self.cohorts,assets) +self:I(self.lid..text) +end +if self.verbose>=2 then +local text=string.format("Missions Total=%d:",#self.missionqueue) +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +local prio=string.format("%d/%s",mission.prio,tostring(mission.importance));if mission.urgent then prio=prio.." (!)"end +local assets=string.format("%d/%d",mission:CountOpsGroups(),mission.Nassets or 0) +local target=string.format("%d/%d Damage=%.1f",mission:CountMissionTargets(),mission:GetTargetInitialNumber(),mission:GetTargetDamage()) +text=text..string.format("\n[%d] %s %s: Status=%s, Prio=%s, Assets=%s, Targets=%s",i,mission.name,mission.type,mission.status,prio,assets,target) +end +self:I(self.lid..text) +end +if self.verbose>=2 then +local text=string.format("Transports Total=%d:",#self.transportqueue) +for i,_transport in pairs(self.transportqueue)do +local transport=_transport +local prio=string.format("%d/%s",transport.prio,tostring(transport.importance));if transport.urgent then prio=prio.." (!)"end +local carriers=string.format("Ncargo=%d/%d, Ncarriers=%d",transport.Ncargo,transport.Ndelivered,transport.Ncarrier) +text=text..string.format("\n[%d] UID=%d: Status=%s, Prio=%s, Cargo: %s",i,transport.uid,transport:GetState(),prio,carriers) +end +self:I(self.lid..text) +end +if self.verbose>=3 then +local text="Flotillas:" +for i,_flotilla in pairs(self.cohorts)do +local flotilla=_flotilla +local callsign=flotilla.callsignName and UTILS.GetCallsignName(flotilla.callsignName)or"N/A" +local modex=flotilla.modex and flotilla.modex or-1 +local skill=flotilla.skill and tostring(flotilla.skill)or"N/A" +text=text..string.format("\n* %s %s: %s*%d/%d, Callsign=%s, Modex=%d, Skill=%s",flotilla.name,flotilla:GetState(),flotilla.aircrafttype,flotilla:CountAssets(true),#flotilla.assets,callsign,modex,skill) +end +self:I(self.lid..text) +end +end +function FLEET:onafterNavyOnMission(From,Event,To,NavyGroup,Mission) +self:T(self.lid..string.format("Group %s on %s mission %s",NavyGroup:GetName(),Mission:GetType(),Mission:GetName())) +end +FLIGHTCONTROL={ +ClassName="FLIGHTCONTROL", +verbose=0, +lid=nil, +theatre=nil, +airbasename=nil, +airbase=nil, +airbasetype=nil, +zoneAirbase=nil, +parking={}, +runways={}, +flights={}, +clients={}, +atis=nil, +Nlanding=nil, +dTlanding=nil, +Nparkingspots=nil, +holdingpatterns={}, +hpcounter=0, +nosubs=false, +Nplayers=0, +} +FLIGHTCONTROL.FlightStatus={ +UNKNOWN="Unknown", +PARKING="Parking", +READYTX="Ready To Taxi", +TAXIOUT="Taxi To Runway", +READYTO="Ready For Takeoff", +TAKEOFF="Takeoff", +INBOUND="Inbound", +HOLDING="Holding", +LANDING="Landing", +TAXIINB="Taxi To Parking", +ARRIVED="Arrived", +} +FLIGHTCONTROL.version="0.7.7" +function FLIGHTCONTROL:New(AirbaseName,Frequency,Modulation,PathToSRS,Port,GoogleKey) +local self=BASE:Inherit(self,FSM:New()) +self.airbase=AIRBASE:FindByName(AirbaseName) +self.airbasename=AirbaseName +self.lid=string.format("FLIGHTCONTROL %s | ",AirbaseName) +if not self.airbase then +self:E(string.format("ERROR: Could not find airbase %s!",tostring(AirbaseName))) +return nil +end +if self.airbase:GetAirbaseCategory()~=Airbase.Category.AIRDROME then +self:E(string.format("ERROR: Airbase %s is not an AIRDROME! Script does not handle FARPS or ships.",tostring(AirbaseName))) +return nil +end +self.airbasetype=self.airbase:GetAirbaseCategory() +self.theatre=env.mission.theatre +self.zoneAirbase=ZONE_RADIUS:New("FC",self:GetCoordinate():GetVec2(),UTILS.NMToMeters(5)) +self:_AddHoldingPatternBackup() +self.alias=self.airbasename.." Tower" +self:SetLimitLanding(2,0) +self:SetLimitTaxi(2,false,0) +self:SetLandingInterval() +self:SetFrequency(Frequency,Modulation) +self:SetMarkHoldingPattern(true) +self:SetRunwayRepairtime() +self.nosubs=false +self:SetCallSignOptions(true,true) +self.msrsqueue=MSRSQUEUE:New(self.alias) +self:SetTransmitOnlyWithPlayers(true) +local path=PathToSRS or MSRS.path +local port=Port or MSRS.port or 5002 +self:SetSRSPort(port) +self.msrsTower=MSRS:New(path,Frequency,Modulation) +self.msrsTower:SetPort(port) +if GoogleKey then +self.msrsTower:SetProviderOptionsGoogle(GoogleKey,GoogleKey) +self.msrsTower:SetProvider(MSRS.Provider.GOOGLE) +end +self.msrsTower:SetCoordinate(self:GetCoordinate()) +self:SetSRSTower() +self.msrsPilot=MSRS:New(PathToSRS,Frequency,Modulation) +self.msrsPilot:SetPort(self.Port) +if GoogleKey then +self.msrsPilot:SetProviderOptionsGoogle(GoogleKey,GoogleKey) +self.msrsPilot:SetProvider(MSRS.Provider.GOOGLE) +end +self.msrsTower:SetCoordinate(self:GetCoordinate()) +self:SetSRSPilot() +self.dTmessage=10 +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","StatusUpdate","*") +self:AddTransition("*","PlayerKilledGuard","*") +self:AddTransition("*","PlayerSpeeding","*") +self:AddTransition("*","RunwayDestroyed","*") +self:AddTransition("*","RunwayRepaired","*") +self:AddTransition("*","Stop","Stopped") +_DATABASE:AddFlightControl(self) +return self +end +function FLIGHTCONTROL:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function FLIGHTCONTROL:SetRadioOnlyIfPlayers(Switch) +if Switch==nil or Switch==true then +self.radioOnlyIfPlayers=true +else +self.radioOnlyIfPlayers=false +end +return self +end +function FLIGHTCONTROL:SetTransmitOnlyWithPlayers(Switch) +self.msrsqueue:SetTransmitOnlyWithPlayers(Switch) +return self +end +function FLIGHTCONTROL:SwitchSubtitlesOn() +self.nosubs=false +return self +end +function FLIGHTCONTROL:SwitchSubtitlesOff() +self.nosubs=true +return self +end +function FLIGHTCONTROL:SetFrequency(Frequency,Modulation) +self.frequency=Frequency or 305 +self.modulation=Modulation or radio.modulation.AM +if self.msrsPilot then +self.msrsPilot:SetFrequencies(Frequency) +self.msrsPilot:SetModulations(Modulation) +end +if self.msrsTower then +self.msrsTower:SetFrequencies(Frequency) +self.msrsTower:SetModulations(Modulation) +end +return self +end +function FLIGHTCONTROL:SetSRSPort(Port) +self.Port=Port or 5002 +return self +end +function FLIGHTCONTROL:_SetSRSOptions(msrs,Gender,Culture,Voice,Volume,Label,PathToGoogleCredentials,Port) +Gender=Gender or"female" +Culture=Culture or"en-GB" +Volume=Volume or 1.0 +if msrs then +msrs:SetGender(Gender) +msrs:SetCulture(Culture) +msrs:SetVoice(Voice) +msrs:SetVolume(Volume) +msrs:SetLabel(Label) +msrs:SetCoalition(self:GetCoalition()) +msrs:SetPort(Port or self.Port or 5002) +end +return self +end +function FLIGHTCONTROL:SetSRSTower(Gender,Culture,Voice,Volume,Label) +if self.msrsTower then +self:_SetSRSOptions(self.msrsTower,Gender or"female",Culture or"en-GB",Voice,Volume,Label or self.alias) +end +return self +end +function FLIGHTCONTROL:SetSRSPilot(Gender,Culture,Voice,Volume,Label) +if self.msrsPilot then +self:_SetSRSOptions(self.msrsPilot,Gender or"male",Culture or"en-US",Voice,Volume,Label or"Pilot") +end +return self +end +function FLIGHTCONTROL:SetLimitLanding(Nlanding,Ntakeoff) +self.NlandingTot=Nlanding or 2 +self.NlandingTakeoff=Ntakeoff or 0 +return self +end +function FLIGHTCONTROL:SetLandingInterval(dt) +self.dTlanding=dt or 180 +return self +end +function FLIGHTCONTROL:SetLimitTaxi(Ntaxi,IncludeInbound,Nlanding) +self.NtaxiTot=Ntaxi or 2 +self.NtaxiInbound=IncludeInbound +self.NtaxiLanding=Nlanding or 0 +return self +end +function FLIGHTCONTROL:AddHoldingPattern(ArrivalZone,Heading,Length,FlightlevelMin,FlightlevelMax,Prio) +if type(ArrivalZone)=="string"then +ArrivalZone=ZONE:New(ArrivalZone) +end +self.hpcounter=self.hpcounter+1 +local hp={} +hp.uid=self.hpcounter +hp.arrivalzone=ArrivalZone +hp.name=string.format("%s-%d",ArrivalZone:GetName(),hp.uid) +hp.pos0=ArrivalZone:GetCoordinate() +hp.pos1=hp.pos0:Translate(UTILS.NMToMeters(Length or 15),Heading) +hp.angelsmin=FlightlevelMin or 5 +hp.angelsmax=FlightlevelMax or 15 +hp.prio=Prio or 50 +hp.stacks={} +for i=hp.angelsmin,hp.angelsmax do +local stack={} +stack.angels=i +stack.flightgroup=nil +stack.pos0=UTILS.DeepCopy(hp.pos0) +stack.pos0:SetAltitude(UTILS.FeetToMeters(i*1000)) +stack.pos1=UTILS.DeepCopy(hp.pos1) +stack.pos1:SetAltitude(UTILS.FeetToMeters(i*1000)) +stack.heading=Heading +table.insert(hp.stacks,stack) +end +table.insert(self.holdingpatterns,hp) +local function _sort(a,b) +return a.prio<b.prio +end +table.sort(self.holdingpatterns,_sort) +return self +end +function FLIGHTCONTROL:RemoveHoldingPattern(HoldingPattern) +for i,_holdingpattern in pairs(self.holdingpatterns)do +local hp=_holdingpattern +if hp.uid==HoldingPattern.uid then +self:_UnMarkHoldingPattern(HoldingPattern) +table.remove(self.holdingpatterns,i) +return self +end +end +return self +end +function FLIGHTCONTROL:SetMarkHoldingPattern(Switch) +if Switch==nil then +Switch=true +end +self.markPatterns=Switch +return self +end +function FLIGHTCONTROL:SetSpeedLimitTaxi(SpeedLimit) +if SpeedLimit then +self.speedLimitTaxi=UTILS.KnotsToMps(SpeedLimit) +else +self.speedLimitTaxi=nil +end +return self +end +function FLIGHTCONTROL:SetParkingGuard(TemplateGroupName) +local alias=string.format("Parking Guard %s",self.airbasename) +self.parkingGuard=SPAWN:NewWithAlias(TemplateGroupName,alias) +return self +end +function FLIGHTCONTROL:SetParkingGuardStatic(TemplateStaticName) +local alias=string.format("Parking Guard %s",self.airbasename) +self.parkingGuard=SPAWNSTATIC:NewFromStatic(TemplateStaticName):InitNamePrefix(alias) +return self +end +function FLIGHTCONTROL:SetATIS(Atis) +self.atis=Atis +return self +end +function FLIGHTCONTROL:GetCoordinate() +return self.airbase:GetCoordinate() +end +function FLIGHTCONTROL:GetCoalition() +return self.airbase:GetCoalition() +end +function FLIGHTCONTROL:GetCountry() +return self.airbase:GetCountry() +end +function FLIGHTCONTROL:SetRunwayRepairtime(RepairTime) +self.runwayrepairtime=RepairTime or 3600 +return self +end +function FLIGHTCONTROL:GetRunwayRepairtime() +if self.runwaydestroyed then +local Tnow=timer.getAbsTime() +local Tsince=Tnow-self.runwaydestroyed +local Trepair=math.max(self.runwayrepairtime-Tsince,0) +return Trepair +end +return 0 +end +function FLIGHTCONTROL:IsRunwayOperational() +if self.airbase then +if self.runwaydestroyed then +return false +else +return true +end +end +return nil +end +function FLIGHTCONTROL:IsRunwayDestroyed() +if self.airbase then +if self.runwaydestroyed then +return true +else +return false +end +end +return nil +end +function FLIGHTCONTROL:IsFlight(Flight) +for _,_flight in pairs(self.flights)do +local flight=_flight +if flight.groupname==Flight.groupname then +return true +end +end +return false +end +function FLIGHTCONTROL:IsCoordinateRunway(Coordinate) +local runways=self.airbase:GetRunways() +for _,_runway in pairs(runways)do +local runway=_runway +if runway.zone:IsCoordinateInZone(Coordinate)then +return true +end +end +return false +end +function FLIGHTCONTROL:onafterStart() +self:I(self.lid..string.format("Starting FLIGHTCONTROL v%s for airbase %s of type %d on map %s",FLIGHTCONTROL.version,self.airbasename,self.airbasetype,self.theatre)) +self:_InitParkingSpots() +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.EngineStartup) +self:HandleEvent(EVENTS.Takeoff) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.Crash,FLIGHTCONTROL.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,FLIGHTCONTROL.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Kill) +self:__StatusUpdate(-1) +end +function FLIGHTCONTROL:onbeforeStatusUpdate() +local Tqueue=self.msrsqueue:CalcTransmisstionDuration() +if Tqueue>0 then +local text=string.format("Still got %d messages in the radio queue. Will call status again in %.1f sec",#self.msrsqueue,Tqueue) +self:T(self.lid..text) +self:__StatusUpdate(-Tqueue) +return false +end +return true +end +function FLIGHTCONTROL:onafterStatusUpdate() +self:T2(self.lid.."Status update") +self:_CheckMarkHoldingPatterns() +if self:IsRunwayOperational()==false then +local Trepair=self:GetRunwayRepairtime() +if Trepair==0 then +self:RunwayRepaired() +else +self:I(self.lid..string.format("Runway still destroyed! Will be repaired in %d sec",Trepair)) +end +end +self:_CheckFlights() +self:_CheckQueues() +local rwyLanding=self:GetActiveRunwayText() +local rwyTakeoff=self:GetActiveRunwayText(true) +local Nflights=self:CountFlights() +local NQparking=self:CountFlights(FLIGHTCONTROL.FlightStatus.PARKING) +local NQreadytx=self:CountFlights(FLIGHTCONTROL.FlightStatus.READYTX) +local NQtaxiout=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIOUT) +local NQreadyto=self:CountFlights(FLIGHTCONTROL.FlightStatus.READYTO) +local NQtakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF) +local NQinbound=self:CountFlights(FLIGHTCONTROL.FlightStatus.INBOUND) +local NQholding=self:CountFlights(FLIGHTCONTROL.FlightStatus.HOLDING) +local NQlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING) +local NQtaxiinb=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIINB) +local NQarrived=self:CountFlights(FLIGHTCONTROL.FlightStatus.ARRIVED) +local Nqueues=(NQparking+NQreadytx+NQtaxiout+NQreadyto+NQtakeoff)+(NQinbound+NQholding+NQlanding+NQtaxiinb+NQarrived) +local nfree=self.Nparkingspots-NQarrived-NQparking +local Nfree=self:CountParking(AIRBASE.SpotStatus.FREE) +local Noccu=self:CountParking(AIRBASE.SpotStatus.OCCUPIED) +local Nresv=self:CountParking(AIRBASE.SpotStatus.RESERVED) +if Nfree+Noccu+Nresv~=self.Nparkingspots then +self:E(self.lid..string.format("WARNING: Number of parking spots does not match! Nfree=%d, Noccu=%d, Nreserved=%d != %d total",Nfree,Noccu,Nresv,self.Nparkingspots)) +end +if self.verbose>=1 then +local text=string.format("State %s - Runway Landing=%s, Takeoff=%s - Parking F=%d/O=%d/R=%d of %d - Flights=%s: Qpark=%d Qtxout=%d Qready=%d Qto=%d | Qinbound=%d Qhold=%d Qland=%d Qtxinb=%d Qarr=%d", +self:GetState(),rwyLanding,rwyTakeoff,Nfree,Noccu,Nresv,self.Nparkingspots,Nflights,NQparking,NQtaxiout,NQreadyto,NQtakeoff,NQinbound,NQholding,NQlanding,NQtaxiinb,NQarrived) +self:I(self.lid..text) +end +if Nflights==Nqueues then +else +self:E(string.format("WARNING: Number of total flights %d!=%d number of flights in all queues!",Nflights,Nqueues)) +end +if self.verbose>=2 then +local text="Holding Patterns:" +for i,_pattern in pairs(self.holdingpatterns)do +local pattern=_pattern +text=text..string.format("\n[%d] Pattern %s [Prio=%d, UID=%d]: Stacks=%d, Angels %d - %d",i,pattern.name,pattern.prio,pattern.uid,#pattern.stacks,pattern.angelsmin,pattern.angelsmax) +if self.verbose>=4 then +for _,_stack in pairs(pattern.stacks)do +local stack=_stack +local text=string.format("",stack.angels,stack) +end +end +end +self:I(self.lid..text) +end +self:__StatusUpdate(-30) +end +function FLIGHTCONTROL:onafterStop() +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.EngineStartup) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Kill) +end +function FLIGHTCONTROL:OnEventBirth(EventData) +self:F3({EvendData=EventData}) +if EventData and EventData.IniGroupName and EventData.IniUnit then +self:T3(self.lid..string.format("BIRTH: unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("BIRTH: group = %s",tostring(EventData.IniGroupName))) +local unit=EventData.IniUnit +if unit:IsAir()then +local bornhere=EventData.Place and EventData.Place:GetName()==self.airbasename or false +local playerunit,playername=self:_GetPlayerUnitAndName(EventData.IniUnitName) +if playername or bornhere then +self:ScheduleOnce(0.5,self._CreateFlightGroup,self,EventData.IniGroup) +end +if bornhere then +self:SpawnParkingGuard(unit) +end +end +end +end +function FLIGHTCONTROL:OnEventCrashOrDead(EventData) +if EventData then +if EventData.IniUnitName then +if self.airbase and self.airbasename and self.airbasename==EventData.IniUnitName then +self:RunwayDestroyed() +end +end +end +end +function FLIGHTCONTROL:OnEventLand(EventData) +self:F3({EvendData=EventData}) +self:T2(self.lid..string.format("LAND: unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("LAND: group = %s",tostring(EventData.IniGroupName))) +end +function FLIGHTCONTROL:OnEventTakeoff(EventData) +self:F3({EvendData=EventData}) +self:T2(self.lid..string.format("TAKEOFF: unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("TAKEOFF: group = %s",tostring(EventData.IniGroupName))) +local airbase=EventData.Place +local unit=EventData.IniUnit +if not(airbase or unit)then +self:E(self.lid.."WARNING: Airbase or IniUnit is nil in takeoff event!") +return +end +end +function FLIGHTCONTROL:OnEventEngineStartup(EventData) +self:F3({EvendData=EventData}) +self:T2(self.lid..string.format("ENGINESTARTUP: unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("ENGINESTARTUP: group = %s",tostring(EventData.IniGroupName))) +end +function FLIGHTCONTROL:OnEventEngineShutdown(EventData) +self:F3({EvendData=EventData}) +self:T2(self.lid..string.format("ENGINESHUTDOWN: unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("ENGINESHUTDOWN: group = %s",tostring(EventData.IniGroupName))) +end +function FLIGHTCONTROL:OnEventKill(EventData) +self:F3({EvendData=EventData}) +self:T2(self.lid..string.format("KILL: ini unit = %s",tostring(EventData.IniUnitName))) +self:T3(self.lid..string.format("KILL: ini group = %s",tostring(EventData.IniGroupName))) +self:T2(self.lid..string.format("KILL: tgt unit = %s",tostring(EventData.TgtUnitName))) +self:T3(self.lid..string.format("KILL: tgt group = %s",tostring(EventData.TgtGroupName))) +local guardPrefix=string.format("Parking Guard %s",self.airbasename) +local victimName=EventData.IniUnitName +local killerName=EventData.TgtUnitName +if victimName and victimName:find(guardPrefix)then +env.info(string.format("Parking guard %s killed!",victimName)) +for _,_flight in pairs(self.flights)do +local flight=_flight +local element=flight:GetElementByName(killerName) +if element then +env.info(string.format("Parking guard %s killed by %s!",victimName,killerName)) +return +end +end +end +end +function FLIGHTCONTROL:onafterRunwayDestroyed(From,Event,To) +self:T(self.lid..string.format("Runway destoyed!")) +self.runwaydestroyed=timer.getAbsTime() +self:TransmissionTower("All flights, our runway was destroyed. All operations are suspended for one hour.",Flight,Delay) +end +function FLIGHTCONTROL:onafterRunwayRepaired(From,Event,To) +self:T(self.lid..string.format("Runway repaired!")) +self.runwaydestroyed=nil +end +function FLIGHTCONTROL:_CheckQueues() +if self.verbose>=2 then +self:_PrintQueue(self.flights,"All flights") +end +local flight,isholding,parking=self:_GetNextFlight() +if flight then +if isholding then +if self:_CheckFlightLanding(flight)then +local dTlanding=99999 +if self.Tlanding then +dTlanding=timer.getAbsTime()-self.Tlanding +end +if parking and dTlanding>=self.dTlanding then +local callsign=self:_GetCallsignName(flight) +local runway=self:GetActiveRunwayText() +local text=string.format("%s, %s, you are cleared to land, runway %s",callsign,self.alias,runway) +self:TransmissionTower(text,flight) +if flight.isAI then +local text=string.format("Runway %s, cleared to land, %s",runway,callsign) +self:TransmissionPilot(text,flight,10) +self:_LandAI(flight,parking) +else +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.LANDING) +end +self.Tlanding=timer.getAbsTime() +end +else +self:T3(self.lid..string.format("FYI: Landing clearance for flight %s denied",flight.groupname)) +end +else +if self:_CheckFlightTakeoff(flight)then +local callsign=self:_GetCallsignName(flight) +local runway=self:GetActiveRunwayText(true) +local text=string.format("%s, %s, taxi to runway %s, hold short",callsign,self.alias,runway) +if self:GetFlightStatus(flight)==FLIGHTCONTROL.FlightStatus.READYTO then +text=string.format("%s, %s, cleared for take-off, runway %s",callsign,self.alias,runway) +end +self:TransmissionTower(text,flight) +if flight.isAI then +local text="Wilco, " +if flight:IsUncontrolled()then +text=text..string.format("starting engines, ") +flight:StartUncontrolled() +end +text=text..string.format("runway %s, %s",runway,callsign) +self:TransmissionPilot(text,flight,10) +for _,_element in pairs(flight.elements)do +local element=_element +if element and element.parking then +local spot=self:GetParkingSpotByID(element.parking.TerminalID) +self:RemoveParkingGuard(spot) +end +end +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAKEOFF) +else +if self:GetFlightStatus(flight)==FLIGHTCONTROL.FlightStatus.READYTO then +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAKEOFF) +else +for _,_element in pairs(flight.elements)do +local element=_element +if element.parking then +local spot=self:GetParkingSpotByID(element.parking.TerminalID) +if element.ai then +self:RemoveParkingGuard(spot,15) +else +self:RemoveParkingGuard(spot,10) +end +end +end +end +end +else +self:T3(self.lid..string.format("FYI: Take off for flight %s denied",flight.groupname)) +end +end +else +self:T2(self.lid..string.format("FYI: No flight in queue for takeoff or landing")) +end +end +function FLIGHTCONTROL:_CheckFlightTakeoff(flight) +local nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING) +local ntakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF,nil,true) +local status=self:GetFlightStatus(flight) +if flight.isAI then +if nlanding>self.NtaxiLanding then +self:T(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %d>%d flight(s) landing",flight.groupname,status,nlanding,self.NtaxiLanding)) +return false +end +local ninbound=0 +if self.NtaxiInbound then +ninbound=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIINB,nil,true) +end +if ntakeoff+ninbound>=self.NtaxiTot then +self:T(self.lid..string.format("AI flight %s [status=%s] NOT cleared for taxi/takeoff as %d>=%d flight(s) taxi/takeoff",flight.groupname,status,ntakeoff,self.NtaxiTot)) +return false +end +self:T(self.lid..string.format("AI flight %s [status=%s] cleared for taxi/takeoff! nLanding=%d, nTakeoff=%d",flight.groupname,status,nlanding,ntakeoff)) +return true +else +if status==FLIGHTCONTROL.FlightStatus.READYTO then +if nlanding>self.NtaxiLanding then +self:T(self.lid..string.format("Player flight %s [status=%s] not cleared for taxi/takeoff as %d>%d flight(s) landing",flight.groupname,status,nlanding,self.NtaxiLanding)) +return false +end +end +self:T(self.lid..string.format("Player flight %s [status=%s] cleared for taxi/takeoff",flight.groupname,status)) +return true +end +end +function FLIGHTCONTROL:_CheckFlightLanding(flight) +local nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING) +local ntakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF,nil,true) +local status=self:GetFlightStatus(flight) +if flight.isAi then +if ntakeoff<=self.NlandingTakeoff and nlanding<self.NlandingTot then +return true +end +return false +else +if ntakeoff<=self.NlandingTakeoff and nlanding<self.NlandingTot then +return true +end +return false +end +end +function FLIGHTCONTROL:_GetNextFlight() +local flightholding=self:_GetNextFightHolding() +local flightparking=self:_GetNextFightParking() +if not flightholding then +return flightparking,false,nil +end +local nH=flightholding:GetNelements() +local parking=flightholding:GetParking(self.airbase) +if not flightparking then +if parking then +return flightholding,true,parking +else +self:E(self.lid..string.format("WARNING: No flight parking but not enough parking spots for holding flight nH=%d!",nH)) +return nil,nil,nil +end +end +if flightholding and flightparking then +local text=string.format("We got a flight holding %s [%s] and parking %s [%s]",flightholding:GetName(),flightholding:GetState(),flightparking:GetName(),flightparking:GetState()) +self:T(self.lid..text) +if flightholding.fuellow then +if parking then +return flightholding,true,parking +else +return flightparking,false,nil +end +end +local text=string.format("Flight holding for %d sec, flight parking for %d sec",flightholding:GetHoldingTime(),flightparking:GetParkingTime()) +self:T(self.lid..text) +if flightholding.Tholding and flightparking.Tparking and flightholding.Tholding<flightparking.Tparking and parking then +return flightholding,true,parking +else +return flightparking,false,nil +end +end +return nil,nil,nil +end +function FLIGHTCONTROL:_GetNextFightHolding() +local OnlyAI=nil +if self:IsRunwayDestroyed()then +OnlyAI=false +end +local Qholding=self:GetFlights(FLIGHTCONTROL.FlightStatus.HOLDING,nil,OnlyAI) +local TholdingMin=30 +if#Qholding==0 then +return nil +elseif#Qholding==1 then +local fg=Qholding[1] +local T=fg:GetHoldingTime() +if T>TholdingMin then +return fg +end +end +local function _sortByFuel(a,b) +local flightA=a +local flightB=b +local fuelA=flightA.group:GetFuelMin() +local fuelB=flightB.group:GetFuelMin() +return fuelA<fuelB +end +local function _sortByTholding(a,b) +local flightA=a +local flightB=b +return flightA.Tholding<flightB.Tholding +end +table.sort(Qholding,_sortByFuel) +for _,_flight in pairs(Qholding)do +local flight=_flight +if flight.fuellow then +return flight +end +end +table.sort(Qholding,_sortByTholding) +local fg=Qholding[1] +local T=fg:GetHoldingTime() +if T>TholdingMin then +return fg +end +return nil +end +function FLIGHTCONTROL:_GetNextFightParking() +local OnlyAI=nil +if self:IsRunwayDestroyed()then +OnlyAI=false +end +local QreadyTO=self:GetFlights(FLIGHTCONTROL.FlightStatus.READYTO,OPSGROUP.GroupStatus.TAXIING,OnlyAI) +if#QreadyTO>0 then +return QreadyTO[1] +end +local QreadyTX=self:GetFlights(FLIGHTCONTROL.FlightStatus.READYTX,OPSGROUP.GroupStatus.PARKING,OnlyAI) +if#QreadyTX>0 then +return QreadyTX[1] +end +if self:IsRunwayDestroyed()then +return nil +end +local Qparking=self:GetFlights(FLIGHTCONTROL.FlightStatus.PARKING,nil,true) +local Nparking=#Qparking +if Nparking==0 then +return nil +end +local function _sortByTparking(a,b) +local flightA=a +local flightB=b +return flightA.Tparking<flightB.Tparking +end +table.sort(Qparking,_sortByTparking) +if self.verbose>=2 then +local text="Parking flights:" +for i,_flight in pairs(Qparking)do +local flight=_flight +text=text..string.format("\n[%d] %s [%s], state=%s [%s]: Tparking=%.1f sec",i,flight.groupname,tostring(flight.actype),flight:GetState(),self:GetFlightStatus(flight),flight:GetParkingTime()) +end +self:I(self.lid..text) +end +for i,_flight in pairs(Qparking)do +local flight=_flight +if flight.isAI and flight.isReadyTO then +return flight +end +end +return nil +end +function FLIGHTCONTROL:_PrintQueue(queue,name) +local text=string.format("%s Queue N=%d:",name,#queue) +if#queue==0 then +text=text.." empty." +else +local time=timer.getAbsTime() +for i,_flight in ipairs(queue)do +local flight=_flight +local fuel=flight.group:GetFuelMin()*100 +local ai=tostring(flight.isAI) +local actype=tostring(flight.actype) +local holding=flight.Tholding and UTILS.SecondsToClock(time-flight.Tholding,true)or"X" +local parking=flight.Tparking and UTILS.SecondsToClock(time-flight.Tparking,true)or"X" +local holding=flight:GetHoldingTime() +if holding>=0 then +holding=UTILS.SecondsToClock(holding,true) +else +holding="X" +end +local parking=flight:GetParkingTime() +if parking>=0 then +parking=UTILS.SecondsToClock(parking,true) +else +parking="X" +end +local nunits=flight:CountElements() +local state=flight:GetState() +local status=self:GetFlightStatus(flight) +text=text..string.format("\n[%d] %s (%s*%d): status=%s | %s, ai=%s, fuel=%d, holding=%s, parking=%s", +i,flight.groupname,actype,nunits,state,status,ai,fuel,holding,parking) +for j,_element in pairs(flight.elements)do +local element=_element +local life=element.unit:GetLife() +local life0=element.unit:GetLife0() +local park=element.parking and tostring(element.parking.TerminalID)or"N/A" +text=text..string.format("\n (%d) %s (%s): status=%s, ai=%s, airborne=%s life=%d/%d spot=%s", +j,tostring(element.modex),element.name,tostring(element.status),tostring(element.ai),tostring(element.unit:InAir()),life,life0,park) +end +end +end +self:I(self.lid..text) +return text +end +function FLIGHTCONTROL:SetFlightStatus(flight,status) +self:T(self.lid..string.format("New status %s-->%s for flight %s",flight.controlstatus or"unknown",status,flight:GetName())) +if flight.controlstatus~=status and not flight.isAI then +self:T(self.lid.."Updating menu in 0.2 sec after flight status change") +flight:_UpdateMenu(0.2) +end +flight.controlstatus=status +end +function FLIGHTCONTROL:GetFlightStatus(flight) +if flight then +return flight.controlstatus or"unkonwn" +end +return"unknown" +end +function FLIGHTCONTROL:IsControlling(flight) +local is=flight.flightcontrol and flight.flightcontrol.airbasename==self.airbasename or false +return is +end +function FLIGHTCONTROL:_InQueue(queue,group) +local name=group:GetName() +for _,_flight in pairs(queue)do +local flight=_flight +if name==flight.groupname then +return true +end +end +return false +end +function FLIGHTCONTROL:GetFlights(Status,GroupStatus,AI) +if Status~=nil or GroupStatus~=nil or AI~=nil then +local flights={} +for _,_flight in pairs(self.flights)do +local flight=_flight +local status=self:GetFlightStatus(flight,Status) +if status==Status then +if AI==nil or AI==flight.isAI then +if GroupStatus==nil or GroupStatus==flight:GetState()then +table.insert(flights,flight) +end +end +end +end +return flights +else +return self.flights +end +end +function FLIGHTCONTROL:CountFlights(Status,GroupStatus,AI) +if Status~=nil or GroupStatus~=nil or AI~=nil then +local flights=self:GetFlights(Status,GroupStatus,AI) +return#flights +else +return#self.flights +end +end +function FLIGHTCONTROL:GetActiveRunway() +local rwy=self.airbase:GetActiveRunway() +return rwy +end +function FLIGHTCONTROL:GetActiveRunwayLanding() +local rwy=self.airbase:GetActiveRunwayLanding() +return rwy +end +function FLIGHTCONTROL:GetActiveRunwayTakeoff() +local rwy=self.airbase:GetActiveRunwayTakeoff() +return rwy +end +function FLIGHTCONTROL:GetActiveRunwayText(Takeoff) +local runway +if Takeoff then +runway=self:GetActiveRunwayTakeoff() +else +runway=self:GetActiveRunwayLanding() +end +local name=self.airbase:GetRunwayName(runway,true) +return name or"XX" +end +function FLIGHTCONTROL:_InitParkingSpots() +local parkingdata=self.airbase:GetParkingSpotsTable() +self.parking={} +self.Nparkingspots=0 +for _,_spot in pairs(parkingdata)do +local spot=_spot +local text=string.format("Parking ID=%d, Terminal=%d: Free=%s, Client=%s, Dist=%.1f",spot.TerminalID,spot.TerminalType,tostring(spot.Free),tostring(spot.ClientName),spot.DistToRwy) +self:T3(self.lid..text) +self.parking[spot.TerminalID]=spot +if spot.Free then +self:SetParkingFree(spot) +else +local unit=spot.Coordinate:FindClosestUnit(20) +if unit then +local unitname=unit and unit:GetName()or"unknown" +local isalive=unit:IsAlive() +self:T2(self.lid..string.format("FF parking spot %d is occupied by unit %s alive=%s",spot.TerminalID,unitname,tostring(isalive))) +if isalive then +self:SetParkingOccupied(spot,unitname) +self:SpawnParkingGuard(unit) +else +self:SetParkingFree(spot) +end +else +self:E(self.lid..string.format("ERROR: Parking spot is NOT FREE but no unit could be found there!")) +end +end +self.Nparkingspots=self.Nparkingspots+1 +end +end +function FLIGHTCONTROL:GetParkingSpotByID(TerminalID) +return self.parking[TerminalID] +end +function FLIGHTCONTROL:_UpdateSpotStatus(spot,status,unitname) +self:T2(self.lid..string.format("Updating parking spot %d status: %s --> %s (unit=%s)",spot.TerminalID,tostring(spot.Status),status,tostring(unitname))) +spot.Status=status +end +function FLIGHTCONTROL:SetParkingFree(spot) +local spot=self:GetParkingSpotByID(spot.TerminalID) +self:_UpdateSpotStatus(spot,AIRBASE.SpotStatus.FREE,spot.OccupiedBy or spot.ReservedBy) +spot.OccupiedBy=nil +spot.ReservedBy=nil +self:RemoveParkingGuard(spot) +self:UpdateParkingMarker(spot) +end +function FLIGHTCONTROL:SetParkingReserved(spot,unitname) +local spot=self:GetParkingSpotByID(spot.TerminalID) +self:_UpdateSpotStatus(spot,AIRBASE.SpotStatus.RESERVED,unitname) +spot.ReservedBy=unitname or"unknown" +self:UpdateParkingMarker(spot) +end +function FLIGHTCONTROL:SetParkingOccupied(spot,unitname) +local spot=self:GetParkingSpotByID(spot.TerminalID) +self:_UpdateSpotStatus(spot,AIRBASE.SpotStatus.OCCUPIED,unitname) +spot.OccupiedBy=unitname or"unknown" +self:UpdateParkingMarker(spot) +end +function FLIGHTCONTROL:UpdateParkingMarker(spot) +if self.markerParking then +local spot=self:GetParkingSpotByID(spot.TerminalID) +if spot.Status==AIRBASE.SpotStatus.FREE then +if spot.Marker then +spot.Marker:Remove() +end +else +local text=string.format("Spot %d (type %d): %s",spot.TerminalID,spot.TerminalType,spot.Status:upper()) +if spot.OccupiedBy then +text=text..string.format("\nOccupied by %s",tostring(spot.OccupiedBy)) +end +if spot.ReservedBy then +text=text..string.format("\nReserved for %s",tostring(spot.ReservedBy)) +end +if spot.ClientSpot then +text=text..string.format("\nClient %s",tostring(spot.ClientName)) +end +if spot.Marker then +if text~=spot.Marker.text or not spot.Marker.shown then +spot.Marker:UpdateText(text) +end +else +spot.Marker=MARKER:New(spot.Coordinate,text):ToAll() +end +end +end +end +function FLIGHTCONTROL:IsParkingFree(spot) +return spot.Status==AIRBASE.SpotStatus.FREE +end +function FLIGHTCONTROL:IsParkingOccupied(spot) +if spot.Status==AIRBASE.SpotStatus.OCCUPIED then +return tostring(spot.OccupiedBy) +else +return false +end +end +function FLIGHTCONTROL:IsParkingReserved(spot) +if spot.Status==AIRBASE.SpotStatus.RESERVED then +return tostring(spot.ReservedBy) +else +return false +end +end +function FLIGHTCONTROL:_GetFreeParkingSpots(terminal) +local freespots={} +local n=0 +for _,_parking in pairs(self.parking)do +local parking=_parking +if self:IsParkingFree(parking)then +if terminal==nil or terminal==parking.terminal then +n=n+1 +table.insert(freespots,parking) +end +end +end +return n,freespots +end +function FLIGHTCONTROL:GetClosestParkingSpot(Coordinate,TerminalType,Status) +local distmin=math.huge +local spotmin=nil +for TerminalID,Spot in pairs(self.parking)do +local spot=Spot +if(Status==nil or Status==spot.Status)and AIRBASE._CheckTerminalType(spot.TerminalType,TerminalType)then +local dist=Coordinate:Get2DDistance(spot.Coordinate) +if dist<distmin then +distmin=dist +spotmin=spot +end +end +end +return spotmin +end +function FLIGHTCONTROL:_GetPlayerSpot(UnitName) +for TerminalID,Spot in pairs(self.parking)do +local spot=Spot +if spot.ClientName and spot.ClientName==UnitName and(spot.Status==AIRBASE.SpotStatus.FREE or spot.ReservedBy==UnitName)then +return spot +end +end +return nil +end +function FLIGHTCONTROL:CountParking(SpotStatus) +local n=0 +for _,_spot in pairs(self.parking)do +local spot=_spot +if SpotStatus==nil or SpotStatus==spot.Status then +n=n+1 +end +end +return n +end +function FLIGHTCONTROL:_CreatePlayerMenu(flight,mainmenu) +local group=flight.group +local groupname=flight.groupname +local gid=group:GetID() +local flightstatus=self:GetFlightStatus(flight) +local gotcontrol=self:IsControlling(flight) +local player=flight:GetPlayerElement() +local text=string.format("Creating ATC player menu for flight %s: in state=%s status=%s, gotcontrol=%s, player=%s", +tostring(flight.groupname),flight:GetState(),flightstatus,tostring(gotcontrol),player.status) +self:T(self.lid..text) +local rootmenu=MENU_GROUP:New(group,self.airbasename,mainmenu) +local helpmenu=MENU_GROUP:New(group,"Help",rootmenu) +MENU_GROUP_COMMAND:New(group,"Radio Check",helpmenu,self._PlayerRadioCheck,self,groupname) +MENU_GROUP_COMMAND:New(group,"Confirm Status",helpmenu,self._PlayerConfirmStatus,self,groupname) +if gotcontrol and flight:IsInbound()and flight.stack then +MENU_GROUP_COMMAND:New(group,"Vector Holding",helpmenu,self._PlayerVectorInbound,self,groupname) +end +local infomenu=MENU_GROUP:New(group,"Info",rootmenu) +MENU_GROUP_COMMAND:New(group,"Airbase",infomenu,self._PlayerInfoAirbase,self,groupname) +MENU_GROUP_COMMAND:New(group,"Traffic",infomenu,self._PlayerInfoTraffic,self,groupname) +MENU_GROUP_COMMAND:New(group,"ATIS",infomenu,self._PlayerInfoATIS,self,groupname) +if gotcontrol then +local status=self:GetFlightStatus(flight) +if flight:IsParking(player)or player.status==OPSGROUP.ElementStatus.ENGINEON then +if status==FLIGHTCONTROL.FlightStatus.READYTX then +MENU_GROUP_COMMAND:New(group,"Cancel Taxi",rootmenu,self._PlayerAbortTaxi,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Request Taxi",rootmenu,self._PlayerRequestTaxi,self,groupname) +end +elseif flight:IsTaxiing(player)then +if status==FLIGHTCONTROL.FlightStatus.READYTX or status==FLIGHTCONTROL.FlightStatus.TAXIOUT then +MENU_GROUP_COMMAND:New(group,"Request Takeoff",rootmenu,self._PlayerRequestTakeoff,self,groupname) +MENU_GROUP_COMMAND:New(group,"Abort Taxi",rootmenu,self._PlayerAbortTaxi,self,groupname) +elseif status==FLIGHTCONTROL.FlightStatus.READYTO then +MENU_GROUP_COMMAND:New(group,"Abort Takeoff",rootmenu,self._PlayerAbortTakeoff,self,groupname) +elseif status==FLIGHTCONTROL.FlightStatus.TAKEOFF then +MENU_GROUP_COMMAND:New(group,"Abort Takeoff",rootmenu,self._PlayerAbortTakeoff,self,groupname) +elseif status==FLIGHTCONTROL.FlightStatus.TAXIINB then +MENU_GROUP_COMMAND:New(group,"Request Taxi",rootmenu,self._PlayerRequestTaxi,self,groupname) +if player.parking then +MENU_GROUP_COMMAND:New(group,"Cancel Parking",rootmenu,self._PlayerCancelParking,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Reserve Parking",rootmenu,self._PlayerRequestParking,self,groupname) +end +MENU_GROUP_COMMAND:New(group,"Arrived at Parking",rootmenu,self._PlayerArrived,self,groupname) +end +elseif flight:IsInbound()then +if status==FLIGHTCONTROL.FlightStatus.LANDING then +MENU_GROUP_COMMAND:New(group,"Confirm Landing!",rootmenu,self._PlayerConfirmLanding,self,groupname) +MENU_GROUP_COMMAND:New(group,"Abort Landing",rootmenu,self._PlayerAbortLanding,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Holding!",rootmenu,self._PlayerHolding,self,groupname) +MENU_GROUP_COMMAND:New(group,"Direct Approach",rootmenu,self._PlayerRequestDirectLanding,self,groupname) +MENU_GROUP_COMMAND:New(group,"Abort Inbound",rootmenu,self._PlayerAbortInbound,self,groupname) +end +if player.parking then +MENU_GROUP_COMMAND:New(group,"Cancel Parking",rootmenu,self._PlayerCancelParking,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Reserve Parking",rootmenu,self._PlayerRequestParking,self,groupname) +end +elseif flight:IsHolding()then +MENU_GROUP_COMMAND:New(group,"Confirm Landing!",rootmenu,self._PlayerConfirmLanding,self,groupname) +MENU_GROUP_COMMAND:New(group,"Abort Holding",rootmenu,self._PlayerAbortHolding,self,groupname) +if player.parking then +MENU_GROUP_COMMAND:New(group,"Cancel Parking",rootmenu,self._PlayerCancelParking,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Reserve Parking",rootmenu,self._PlayerRequestParking,self,groupname) +end +elseif flight:IsLanding(player)then +MENU_GROUP_COMMAND:New(group,"Abort Landing",rootmenu,self._PlayerAbortLanding,self,groupname) +if player.parking then +MENU_GROUP_COMMAND:New(group,"Cancel Parking",rootmenu,self._PlayerCancelParking,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Reserve Parking",rootmenu,self._PlayerRequestParking,self,groupname) +end +elseif flight:IsLanded(player)then +MENU_GROUP_COMMAND:New(group,"Arrived at Parking",rootmenu,self._PlayerArrived,self,groupname) +if player.parking then +MENU_GROUP_COMMAND:New(group,"Cancel Parking",rootmenu,self._PlayerCancelParking,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Reserve Parking",rootmenu,self._PlayerRequestParking,self,groupname) +end +elseif flight:IsArrived(player)then +if status==FLIGHTCONTROL.FlightStatus.READYTX then +MENU_GROUP_COMMAND:New(group,"Abort Taxi",rootmenu,self._PlayerAbortTaxi,self,groupname) +else +MENU_GROUP_COMMAND:New(group,"Request Taxi",rootmenu,self._PlayerRequestTaxi,self,groupname) +end +elseif flight:IsAirborne(player)then +end +else +if flight:IsAirborne()then +MENU_GROUP_COMMAND:New(group,"Inbound",rootmenu,self._PlayerRequestInbound,self,groupname) +end +end +end +function FLIGHTCONTROL:_PlayerNotImplemented(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local text=string.format("Sorry, this feature is not implemented yet!") +self:TextMessageToFlight(text,flight) +end +end +function FLIGHTCONTROL:_PlayerRadioCheck(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local text="" +if type(self.frequency)=="table"then +local multifreq="" +for _,_entry in pairs(self.frequency)do +multifreq=string.format("%s%.2f, ",multifreq,_entry) +end +multifreq=string.gsub(multifreq,", $","") +text=string.format("%s, %s, radio check %s",self.alias,callsign,multifreq) +else +text=string.format("%s, %s, radio check %.3f",self.alias,callsign,self.frequency) +end +self:TransmissionPilot(text,flight) +local text=string.format("%s, %s, reading you 5",callsign,self.alias) +self:TransmissionTower(text,flight,10) +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerConfirmStatus(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, confirm my status",self.alias,callsign) +self:TransmissionPilot(text,flight) +local s1=flight:GetState() +local text=string.format("%s, %s, your current flight status is %s.",callsign,self.alias,s1) +if flight.flightcontrol then +local s2=flight.flightcontrol:GetFlightStatus(flight) +if flight.flightcontrol.airbasename==self.airbasename then +text=text..string.format(" You are controlled by us with status %s",s2) +else +text=text..string.format(" You are controlled by %s with status %s",flight.flightcontrol.airbasename,s2) +end +else +text=text..string.format(" You are not controlled by anyone.") +end +self:TransmissionTower(text,flight,10) +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerInfoAirbase(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local text=string.format("Airbase %s Info:",self.airbasename) +text=text..string.format("\nATC Status: %s",self:GetState()) +if type(self.frequency)=="table"then +local multifreq="" +for i=1,#self.frequency do +multifreq=string.format("%s%.2f %s, ",multifreq,self.frequency[i],UTILS.GetModulationName(self.modulation[i]or 0)) +end +text=string.gsub(text,", $","") +text=text..string.format("\nFrequencies: %s",multifreq) +else +text=text..string.format("\nFrequency: %.3f %s",self.frequency,UTILS.GetModulationName(self.modulation)) +end +text=text..string.format("\nRunway Landing: %s",self:GetActiveRunwayText()) +text=text..string.format("\nRunway Takeoff: %s",self:GetActiveRunwayText(true)) +self:TextMessageToFlight(text,flight,10,true) +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerInfoATIS(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local text=string.format("Airbase %s ATIS:",self.airbasename) +local srstxt=string.format("Airbase %s ",self.airbasename) +if self.atis then +text=text..string.format("\nATIS %.3f MHz %s",self.atis.frequency,UTILS.GetModulationName(self.atis.modulation)) +srstxt=srstxt..string.format("ATIS %.3f Megahertz %s",self.atis.frequency,UTILS.GetModulationName(self.atis.modulation)) +if self.atis.towerfrequency then +local tower="" +for _,freq in pairs(self.atis.towerfrequency)do +tower=tower..string.format("%.3f, ",freq) +end +text=text..string.format("\nTower %.3f MHz",self.atis.towerfrequency[1]) +end +if self.atis.ils then +end +if self.atis.tacan then +end +if self.atis.ndbinner then +end +if self.atis.ndbouter then +end +else +text=text.." Not defined" +end +local callsign=self:_GetCallsignName(flight) +local rtext=string.format("%s, %s, request ATIS frequency.",self.alias,callsign) +self:TransmissionPilot(rtext,flight) +if self.atis then +self:TransmissionTower(srstxt,flight,10) +else +self:TransmissionTower(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerInfoTraffic(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local Nflights=self:CountFlights() +local NQparking=self:CountFlights(FLIGHTCONTROL.FlightStatus.PARKING) +local NQreadytx=self:CountFlights(FLIGHTCONTROL.FlightStatus.READYTX) +local NQtaxiout=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIOUT) +local NQreadyto=self:CountFlights(FLIGHTCONTROL.FlightStatus.READYTO) +local NQtakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF) +local NQinbound=self:CountFlights(FLIGHTCONTROL.FlightStatus.INBOUND) +local NQholding=self:CountFlights(FLIGHTCONTROL.FlightStatus.HOLDING) +local NQlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING) +local NQtaxiinb=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAXIINB) +local NQarrived=self:CountFlights(FLIGHTCONTROL.FlightStatus.ARRIVED) +local text=string.format("Traffic %s airbase:",self.airbasename) +text=text..string.format("\n- Total Flights %d",Nflights) +if NQparking>0 then +text=text..string.format("\n- Parking %d",NQparking) +end +if NQreadytx>0 then +text=text..string.format("\n- Ready to taxi %d",NQreadytx) +end +if NQtaxiout>0 then +text=text..string.format("\n- Taxi to runway %d",NQtaxiout) +end +if NQreadyto>0 then +text=text..string.format("\n- Ready for takeoff %d",NQreadyto) +end +if NQtakeoff>0 then +text=text..string.format("\n- Taking off %d",NQtakeoff) +end +if NQinbound>0 then +text=text..string.format("\n- Inbound %d",NQinbound) +end +if NQholding>0 then +text=text..string.format("\n- Holding pattern %d",NQholding) +end +if NQlanding>0 then +text=text..string.format("\n- Landing %d",NQlanding) +end +if NQtaxiinb>0 then +text=text..string.format("\n- Taxi to parking %d",NQtaxiinb) +end +if NQarrived>0 then +text=text..string.format("\n- Arrived at parking %d",NQarrived) +end +self:TextMessageToFlight(text,flight,15,true) +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerRequestInbound(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsAirborne()then +local callsign=self:_GetCallsignName(flight) +local player=flight:GetPlayerElement() +local text=string.format("%s, %s, inbound for landing",self.alias,callsign) +self:TransmissionPilot(text,flight) +local flightcoord=flight:GetCoordinate(nil,player.name) +local dist=flightcoord:Get2DDistance(self:GetCoordinate()) +if dist<UTILS.NMToMeters(50)then +flight:RTB(self.airbase) +local stack=self:_GetHoldingStack(flight) +if stack then +stack.flightgroup=flight +flight.stack=stack +local heading=flightcoord:HeadingTo(stack.pos0) +local distance=flightcoord:Get2DDistance(stack.pos0) +local dist=UTILS.MetersToNM(distance) +local text=string.format("%s, %s, roger, fly heading %03d for %d nautical miles, hold at angels %d. Report entering the pattern.", +callsign,self.alias,heading,dist,stack.angels) +self:TransmissionTower(text,flight,10) +flight:SetFlightControl(self) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.INBOUND) +else +local text=string.format("Negative, could not get a holding stack for you! Try again later...") +self:TextMessageToFlight(text,flight,10) +self:E(self.lid..string.format("WARNING: Could not get holding stack for flight %s",flight:GetName())) +end +else +local text=string.format("Negative, you have to be withing 50 nautical miles of the airbase to request inbound!") +self:TextMessageToFlight(text,flight,10) +end +else +local text=string.format("Negative, you must be AIRBORNE to call INBOUND!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerVectorInbound(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsInbound()and self:IsControlling(flight)and flight.stack then +local callsign=self:_GetCallsignName(flight) +local player=flight:GetPlayerElement() +local flightcoord=flight:GetCoordinate(nil,player.name) +local dist=flightcoord:Get2DDistance(self:GetCoordinate()) +local callsign=self:_GetCallsignName(flight) +local heading=flightcoord:HeadingTo(flight.stack.pos0) +local distance=flightcoord:Get2DDistance(flight.stack.pos0) +local dist=UTILS.MetersToNM(distance) +local text=string.format("%s, fly heading %03d for %d nautical miles, hold at angels %d.",callsign,heading,dist,flight.stack.angels) +self:TextMessageToFlight(text,flight) +else +local text="Negative, you must be INBOUND, CONTROLLED by us and have an assigned STACK!" +self:TextMessageToFlight(text,flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerAbortInbound(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsInbound()and self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, abort inbound",self.alias,callsign) +self:TransmissionPilot(text,flight) +local text=string.format("%s, %s, roger, have a nice day!",callsign,self.alias) +self:TransmissionTower(text,flight,5) +if flight.stack then +flight.stack.flightgroup=nil +flight.stack=nil +else +self:E(self.lid.."ERROR: No stack!") +end +self:_RemoveFlight(flight) +flight:Cruise() +flight.currbase=nil +else +local text=string.format("Negative, you must be INBOUND and CONTROLLED by us!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerHolding(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsInbound()then +if self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +local player=flight:GetPlayerElement() +local stack=flight.stack +if stack then +local text=string.format("%s, %s, arrived at holding pattern",self.alias,callsign) +self:TransmissionPilot(text,flight) +local Coordinate=flight:GetCoordinate(nil,player.name) +local dist=stack.pos0:Get2DDistance(Coordinate) +local dmax=UTILS.NMToMeters(500) +if dist<dmax then +local text=string.format("%s, roger, fly heading %d at angels %d and wait for landing clearance",callsign,stack.heading,stack.angels) +self:TransmissionTower(text,flight,10) +flight:Holding() +else +local text=string.format("Negative, you have to be within %d NM of the arrival zone! You still %d NM away.",UTILS.MetersToNM(dmax),UTILS.MetersToNM(dist)) +self:TextMessageToFlight(text,flight,10,true) +end +else +local text=string.format("Negative, we have no holding stack for you!") +self:TextMessageToFlight(text,flight,10,true) +end +else +local text=string.format("Negative, you are not controlled by us!") +self:TextMessageToFlight(text,flight,10,true) +end +else +local text=string.format("Negative, you must be INBOUND to call HOLDING!") +self:TextMessageToFlight(text,flight,10,true) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerAbortHolding(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsHolding()and self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, abort holding",self.alias,callsign) +self:TransmissionPilot(text,flight) +local text=string.format("%s, %s, roger, have a nice day!",callsign,self.alias) +self:TransmissionTower(text,flight,10) +flight.Tholding=nil +flight:Cruise() +flight.currbase=nil +if flight.stack then +flight.stack.flightgroup=nil +flight.stack=nil +else +self:E(self.lid.."ERROR: No stack!") +end +self:_RemoveFlight(flight) +else +local text=string.format("Negative, you must be HOLDING and CONTROLLED by us!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerConfirmLanding(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if(flight:IsHolding()or flight:IsInbound())and self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +if self:GetFlightStatus(flight)==FLIGHTCONTROL.FlightStatus.LANDING then +local runway=self:GetActiveRunwayText() +local text=string.format("Runway %s, cleared to land, %s",runway,callsign) +self:TransmissionPilot(text,flight) +flight:Landing() +flight:_UpdateMenu(0.5) +else +local text=string.format("%s, %s, leaving pattern for landing.",self.alias,callsign) +self:TransmissionPilot(text,flight) +local text=string.format("%s, negative! Hold position until you get clearance.",callsign) +self:TransmissionTower(text,flight,10) +end +else +local text=string.format("Negative, you must be HOLDING or INBOUND and CONTROLLED by us!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerAbortLanding(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local flightstatus=self:GetFlightStatus(flight) +if(flight:IsLanding()or flightstatus==FLIGHTCONTROL.FlightStatus.LANDING)and self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, abort landing",self.alias,callsign) +self:TransmissionPilot(text,flight) +local text=string.format("%s, %s, roger, have a nice day!",callsign,self.alias) +self:TransmissionTower(text,flight,10) +if flight.stack then +flight.stack.flightgroup=nil +flight.stack=nil +end +flight.Tholding=nil +flight:Cruise() +flight.currbase=nil +self:_RemoveFlight(flight) +else +local text=string.format("Negative, you must be LANDING and CONTROLLED by us!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerRequestDirectLanding(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsInbound()and self:IsControlling(flight)then +local callsign=self:_GetCallsignName(flight) +local nTakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF) +local text=string.format("%s, request direct approach.",callsign) +self:TransmissionPilot(text,flight) +if nTakeoff>self.NlandingTakeoff then +local text=string.format("%s, negative! We have currently traffic taking off!",callsign) +self:TransmissionTower(text,flight,10) +else +local runway=self:GetActiveRunwayText() +local text=string.format("%s, affirmative, runway %s. Confirm approach!",callsign,runway) +self:TransmissionTower(text,flight,10) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.LANDING) +end +else +local text=string.format("Negative, you must be INBOUND and CONTROLLED by us!") +self:TextMessageToFlight(text,flight,10) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerRequestTaxi(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, request taxi to runway.",self.alias,callsign) +self:TransmissionPilot(text,flight) +if flight:IsParking()then +local text=string.format("%s, %s, hold position until further notice.",callsign,self.alias) +self:TransmissionTower(text,flight,10) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.READYTX) +elseif flight:IsTaxiing()then +local runway=self:GetActiveRunwayText(true) +local text=string.format("%s, %s, taxi to runway %s, hold short.",callsign,self.alias,runway) +self:TransmissionTower(text,flight,10) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAXIOUT) +local playerElement=flight:GetPlayerElement() +if playerElement and playerElement.parking then +self:SetParkingFree(playerElement.parking) +end +else +self:TextMessageToFlight(string.format("Negative, you must be PARKING to request TAXI!"),flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerAbortTaxi(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, cancel my taxi request.",self.alias,callsign) +self:TransmissionPilot(text,flight) +if flight:IsParking()then +local text=string.format("%s, %s, roger, remain on your parking position.",callsign,self.alias) +self:TransmissionTower(text,flight,10) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.PARKING) +local playerElement=flight:GetPlayerElement() +if playerElement then +self:SpawnParkingGuard(playerElement.unit) +end +elseif flight:IsTaxiing()then +local text=string.format("%s, %s, roger, return to your parking position.",callsign,self.alias) +self:TransmissionTower(text,flight,10) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAXIINB) +else +self:TextMessageToFlight(string.format("Negative, you must be PARKING or TAXIING to abort TAXI!"),flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerRequestTakeoff(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +if flight:IsTaxiing()then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, ready for departure. Request takeoff.",self.alias,callsign) +self:TransmissionPilot(text,flight) +local Nlanding=self:CountFlights(FLIGHTCONTROL.FlightStatus.LANDING) +local Ntakeoff=self:CountFlights(FLIGHTCONTROL.FlightStatus.TAKEOFF) +local text=string.format("%s, %s, ",callsign,self.alias) +if Nlanding==0 then +text=text.."no current traffic. You are cleared for takeoff." +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAKEOFF) +elseif Nlanding>0 then +if Nlanding==1 then +text=text..string.format("negative, we got %d flight inbound before it's your turn. Hold position until futher notice.",Nlanding) +else +text=text..string.format("negative, we got %d flights inbound. Hold positon until futher notice.",Nlanding) +end +end +self:TransmissionTower(text,flight,10) +else +self:TextMessageToFlight(string.format("Negative, you must request TAXI before you can request TAKEOFF!"),flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerAbortTakeoff(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local status=self:GetFlightStatus(flight) +if status==FLIGHTCONTROL.FlightStatus.TAKEOFF or status==FLIGHTCONTROL.FlightStatus.READYTO then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, %s, abort takeoff.",self.alias,callsign) +self:TransmissionPilot(text,flight) +if flight:IsParking()then +text=string.format("%s, %s, affirm, remain on your parking position.",callsign,self.alias) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.PARKING) +local playerElement=flight:GetPlayerElement() +if playerElement then +self:SpawnParkingGuard(playerElement.unit) +end +elseif flight:IsTaxiing()then +text=string.format("%s, %s, roger, report whether you want to taxi back or takeoff later.",callsign,self.alias) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.TAXIOUT) +else +env.info(self.lid.."ERROR") +end +self:TransmissionTower(text,flight,10) +else +self:TextMessageToFlight("Negative, You are NOT in the takeoff queue",flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerRequestParking(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local player=flight:GetPlayerElement() +local TerminalType=AIRBASE.TerminalType.FighterAircraft +if flight.isHelo then +TerminalType=AIRBASE.TerminalType.HelicopterUsable +end +local coord=flight:GetCoordinate(nil,player.name) +local spot=self:_GetPlayerSpot(player.name) +if not spot then +spot=self:GetClosestParkingSpot(coord,TerminalType,AIRBASE.SpotStatus.FREE) +end +if spot then +local text=string.format("%s, your assigned parking position is terminal ID %d.",callsign,spot.TerminalID) +self:TransmissionTower(text,flight) +if player.parking then +self:SetParkingFree(player.parking) +end +player.parking=spot +self:SetParkingReserved(spot,player.name) +flight:_UpdateMenu(0.2) +else +local text=string.format("%s, no free parking spot available. Try again later.",callsign) +self:TransmissionTower(text,flight) +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerCancelParking(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local callsign=self:_GetCallsignName(flight) +local player=flight:GetPlayerElement() +if player.parking then +self:SetParkingFree(player.parking) +player.parking=nil +self:TextMessageToFlight(string.format("%s, your parking spot reservation at terminal ID %d was cancelled.",callsign,player.parking.TerminalID),flight) +else +self:TextMessageToFlight("You did not have a valid parking spot reservation.",flight) +end +flight:_UpdateMenu(0.2) +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_PlayerArrived(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local player=flight:GetPlayerElement() +local coord=flight:GetCoordinate(nil,player.name) +local spot=self:_GetPlayerSpot(player.name) +if player.parking then +spot=self:GetParkingSpotByID(player.parking.TerminalID) +else +if not spot then +spot=self:GetClosestParkingSpot(coord) +end +end +if spot then +local callsign=self:_GetCallsignName(flight) +local dist=coord:Get2DDistance(spot.Coordinate) +if dist<12 then +local text=string.format("%s, %s, arrived at parking position. Terminal ID %d.",self.alias,callsign,spot.TerminalID) +self:TransmissionPilot(text,flight) +local text="" +if spot.ReservedBy and spot.ReservedBy~=player.name then +text=string.format("%s, this spot is already reserved for %s. Find yourself a different parking position.",callsign,self.alias,spot.ReservedBy) +else +text=string.format("%s, %s, roger. Enjoy a cool bevarage in the officers' club.",callsign,self.alias) +flight:ElementParking(player,spot) +self:SetFlightStatus(flight,FLIGHTCONTROL.FlightStatus.PARKING) +if player then +self:SpawnParkingGuard(player.unit) +end +end +self:TransmissionTower(text,flight,10) +else +local text=string.format("%s, %s, arrived at parking position.",self.alias,callsign) +self:TransmissionPilot(text,flight) +local text="" +if spot.ReservedBy then +if spot.ReservedBy==player.name then +text=string.format("%s, %s, you are still %d meters away from your reserved parking position at terminal ID %d. Continue taxiing!",callsign,self.alias,dist,spot.TerminalID) +else +text=string.format("%s, %s, the closest parking spot is already reserved. Continue taxiing to a free spot!",callsign,self.alias) +end +else +text=string.format("%s, %s, you are still %d meters away from the closest parking position. Continue taxiing to a proper spot!",callsign,self.alias,dist) +end +self:TransmissionTower(text,flight,10) +end +else +end +else +self:E(self.lid..string.format("Cannot find flight group %s.",tostring(groupname))) +end +end +function FLIGHTCONTROL:_CreateFlightGroup(group) +if self:_InQueue(self.flights,group)then +self:E(self.lid..string.format("WARNING: Flight group %s does already exist!",group:GetName())) +return +end +self:T(self.lid..string.format("Creating new flight for group %s of aircraft type %s.",group:GetName(),group:GetTypeName())) +local flight=_DATABASE:GetOpsGroup(group:GetName()) +if not flight then +flight=FLIGHTGROUP:New(group:GetName()) +end +if flight.homebase and flight.homebase:GetName()==self.airbasename then +flight:SetFlightControl(self) +end +return flight +end +function FLIGHTCONTROL:_RemoveFlight(Flight) +for i,_flight in pairs(self.flights)do +local flight=_flight +if flight.groupname==Flight.groupname then +self:T(self.lid..string.format("Removing flight group %s",flight.groupname)) +table.remove(self.flights,i) +Flight.flightcontrol=nil +self:SetFlightStatus(Flight,FLIGHTCONTROL.FlightStatus.UNKNOWN) +return true +end +end +self:E(self.lid..string.format("WARNING: Could NOT remove flight group %s",Flight.groupname)) +end +function FLIGHTCONTROL:_GetFlightFromGroup(group) +if group then +local name=group:GetName() +for i,_flight in pairs(self.flights)do +local flight=_flight +if flight.groupname==name then +return flight,i +end +end +self:T2(self.lid..string.format("WARNING: Flight group %s could not be found in queue.",name)) +end +self:T2(self.lid..string.format("WARNING: Flight group could not be found in queue. Group is nil!")) +return nil,nil +end +function FLIGHTCONTROL:_GetFlightElement(unitname) +local unit=UNIT:FindByName(unitname) +if unit then +local flight=self:_GetFlightFromGroup(unit:GetGroup()) +if flight then +for i,_element in pairs(flight.elements)do +local element=_element +if element.unit:GetName()==unitname then +return element,i,flight +end +end +self:T2(self.lid..string.format("WARNING: Flight element %s could not be found in flight group.",unitname,flight.groupname)) +end +end +return nil,nil,nil +end +function FLIGHTCONTROL:_CheckFlights() +for i=#self.flights,1,-1 do +local flight=self.flights[i] +if flight:IsDead()then +self:T(self.lid..string.format("Removing DEAD flight %s",tostring(flight.groupname))) +self:_RemoveFlight(flight) +end +end +self.Nplayers=0 +for _,_flight in pairs(self.flights)do +local flight=_flight +if not flight.isAI then +self.Nplayers=self.Nplayers+1 +end +end +if self.speedLimitTaxi then +for _,_flight in pairs(self.flights)do +local flight=_flight +if not flight.isAI then +local playerElement=flight:GetPlayerElement() +local flightstatus=self:GetFlightStatus(flight) +if playerElement then +if(flightstatus==FLIGHTCONTROL.FlightStatus.TAXIINB or flightstatus==FLIGHTCONTROL.FlightStatus.TAXIOUT)and self.speedLimitTaxi then +local speed=playerElement.unit:GetVelocityMPS() +local coord=playerElement.unit:GetCoord() +local onRunway=self:IsCoordinateRunway(coord) +self:T(self.lid..string.format("Player %s speed %.1f knots (max=%.1f) onRunway=%s",playerElement.playerName,UTILS.MpsToKnots(speed),UTILS.MpsToKnots(self.speedLimitTaxi),tostring(onRunway))) +if speed and speed>self.speedLimitTaxi and not onRunway then +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, slow down, you are taxiing too fast!",callsign) +self:TransmissionTower(text,flight) +local PlayerData=flight:_GetPlayerData() +self:PlayerSpeeding(PlayerData) +end +end +end +end +end +end +end +function FLIGHTCONTROL:_CheckParking() +for TerminalID,_spot in pairs(self.parking)do +local spot=_spot +if spot.Reserved then +if spot.MarkerID then +spot.Coordinate:RemoveMark(spot.MarkerID) +end +spot.MarkerID=spot.Coordinate:MarkToCoalition(string.format("Parking reserved for %s",tostring(spot.Reserved)),self:GetCoalition()) +end +for i=1,#self.flights do +local flight=self.flights[i] +for _,_element in pairs(flight.elements)do +local element=_element +if element.parking and element.parking.TerminalID==TerminalID then +if spot.MarkerID then +spot.Coordinate:RemoveMark(spot.MarkerID) +end +spot.MarkerID=spot.Coordinate:MarkToCoalition(string.format("Parking spot occupied by %s",tostring(element.name)),self:GetCoalition()) +end +end +end +end +end +function FLIGHTCONTROL:_LandAI(flight,parking) +self:T(self.lid..string.format("Landing AI flight %s.",flight.groupname)) +local respawn=false +if respawn then +local Template=flight.group:GetTemplate() +Template.route.points=wp +for i,unit in pairs(Template.units)do +local spot=parking[i] +local element=flight:GetElementByName(unit.name) +if element then +unit.parking_landing=spot.TerminalID +local text=string.format("Reserving parking spot %d for unit %s",spot.TerminalID,tostring(unit.name)) +self:T(self.lid..text) +self:SetParkingReserved(spot,element.name) +else +env.info("FF error could not get element to assign parking!") +end +end +self:TextMessageToFlight(string.format("Respawning group %s",flight.groupname),flight) +flight:Respawn(Template) +else +flight:ClearToLand() +end +end +function FLIGHTCONTROL:_GetHoldingStack(flight) +self:T(self.lid..string.format("Getting holding point for flight %s",flight:GetName())) +for i,_hp in pairs(self.holdingpatterns)do +local holdingpattern=_hp +self:T(self.lid..string.format("Checking holding point %s",holdingpattern.name)) +for j,_stack in pairs(holdingpattern.stacks)do +local stack=_stack +local name=stack.flightgroup and stack.flightgroup:GetName()or"empty" +self:T(self.lid..string.format("Stack %d: %s",j,name)) +if not stack.flightgroup then +return stack +end +end +end +return nil +end +function FLIGHTCONTROL:_CountFlightsInPattern(Pattern) +local N=0 +for _,_stack in pairs(Pattern.stacks)do +local stack=_stack +if stack.flightgroup then +N=N+1 +end +end +return N +end +function FLIGHTCONTROL:_FlightOnFinal(flight) +local callsign=self:_GetCallsignName(flight) +local text=string.format("%s, final",callsign) +self:TransmissionPilot(text,flight) +return self +end +function FLIGHTCONTROL:TransmissionTower(Text,Flight,Delay) +if self.radioOnlyIfPlayers==true and self.Nplayers==0 then +self:T(self.lid.."No players ==> skipping TOWER radio transmission") +return +end +local text=self:_GetTextForSpeech(Text) +local subgroups=nil +if Flight and not Flight.isAI then +local playerData=Flight:_GetPlayerData() +if playerData.subtitles and(not self.nosubs)then +subgroups=subgroups or{} +table.insert(subgroups,Flight.group) +end +end +local transmission=self.msrsqueue:NewTransmission(text,nil,self.msrsTower,nil,1,subgroups,Text) +self.Tlastmessage=timer.getAbsTime()+(Delay or 0) +self:T(self.lid..string.format("Radio Tower: %s",Text)) +end +function FLIGHTCONTROL:TransmissionPilot(Text,Flight,Delay) +if self.radioOnlyIfPlayers==true and self.Nplayers==0 then +self:T(self.lid.."No players ==> skipping PILOT radio transmission") +return +end +local playerData=Flight:_GetPlayerData() +if playerData==nil or playerData.myvoice then +local text=self:_GetTextForSpeech(Text) +local msrs=self.msrsPilot +if Flight.useSRS and Flight.msrs then +msrs=Flight.msrs +end +local subgroups=nil +if Flight and not Flight.isAI then +local playerData=Flight:_GetPlayerData() +if playerData.subtitles and(not self.nosubs)then +subgroups=subgroups or{} +table.insert(subgroups,Flight.group) +end +end +local coordinate=Flight:GetCoordinate(true) +msrs:SetCoordinate() +self.msrsqueue:NewTransmission(text,nil,msrs,nil,1,subgroups,Text,nil,self.frequency,self.modulation) +end +self.Tlastmessage=timer.getAbsTime()+(Delay or 0) +self:T(self.lid..string.format("Radio Pilot: %s",Text)) +end +function FLIGHTCONTROL:TextMessageToFlight(Text,Flight,Duration,Clear,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,FLIGHTCONTROL.TextMessageToFlight,self,Text,Flight,Duration,Clear,0) +else +if Flight and Flight.group and Flight.group:IsAlive()then +local gid=Flight.group:GetID() +trigger.action.outTextForGroup(gid,self:_CleanText(Text),Duration or 5,Clear) +end +end +end +function FLIGHTCONTROL:_CleanText(Text) +local text=Text:gsub("\n$",""):gsub("\n$","") +return text +end +function FLIGHTCONTROL:_SpawnParkingGuard(unit) +local coordinate=unit:GetCoordinate() +local spot=self:GetClosestParkingSpot(coordinate) +if not spot.ParkingGuard then +local heading=unit:GetHeading() +local size,x,y,z=unit:GetObjectSize() +local xdiff=3 +if AIRBASE._CheckTerminalType(spot.TerminalType,AIRBASE.TerminalType.Shelter)then +xdiff=27-(x*0.5) +end +if(AIRBASE._CheckTerminalType(spot.TerminalType,AIRBASE.TerminalType.OpenMed)or AIRBASE._CheckTerminalType(spot.TerminalType,AIRBASE.TerminalType.Shelter))and self.airbasename==AIRBASE.Sinai.Ramon_Airbase then +xdiff=12 +end +self:T2(self.lid..string.format("Parking guard for %s: heading=%d, length x=%.1f m, xdiff=%.1f m",unit:GetName(),heading,x,xdiff)) +local Coordinate=coordinate:Translate(x*0.5+xdiff,heading) +local lookat=heading-180 +self.parkingGuard:InitHeading(lookat) +if self.parkingGuard:IsInstanceOf("SPAWN")then +end +spot.ParkingGuard=self.parkingGuard:SpawnFromCoordinate(Coordinate) +else +self:E(self.lid.."ERROR: Parking Guard already exists!") +end +end +function FLIGHTCONTROL:SpawnParkingGuard(unit) +if unit and self.parkingGuard then +self:ScheduleOnce(1,FLIGHTCONTROL._SpawnParkingGuard,self,unit) +end +end +function FLIGHTCONTROL:RemoveParkingGuard(spot,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,FLIGHTCONTROL.RemoveParkingGuard,self,spot) +else +if spot.ParkingGuard then +spot.ParkingGuard:Destroy() +spot.ParkingGuard=nil +end +end +end +function FLIGHTCONTROL:_IsFlightOnRunway(flight) +for _,_runway in pairs(self.airbase.runways)do +local runway=_runway +local inzone=flight:IsInZone(runway.zone) +if inzone then +return runway +end +end +return nil +end +function FLIGHTCONTROL:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations) +if not ShortCallsign or ShortCallsign==false then +self.ShortCallsign=false +else +self.ShortCallsign=true +end +self.Keepnumber=Keepnumber or false +self.CallsignTranslations=CallsignTranslations +return self +end +function FLIGHTCONTROL:_GetCallsignName(flight) +local callsign=flight:GetCallsignName(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations) +return callsign +end +function FLIGHTCONTROL:_GetTextForSpeech(text) +local function space(text) +local res="" +for i=1,#text do +local char=text:sub(i,i) +res=res..char.." " +end +return res +end +local t=text:gsub("(%d+)",space) +return t +end +function FLIGHTCONTROL:_GetPlayerUnitAndName(unitName) +if unitName then +local DCSunit=Unit.getByName(unitName) +if DCSunit then +local playername=DCSunit:getPlayerName() +local unit=UNIT:Find(DCSunit) +if DCSunit and unit and playername then +self:T(self.lid..string.format("Found DCS unit %s with player %s",tostring(unitName),tostring(playername))) +return unit,playername +end +end +end +return nil,nil +end +function FLIGHTCONTROL:_CheckMarkHoldingPatterns() +for _,pattern in pairs(self.holdingpatterns)do +local Pattern=pattern +if self.markPatterns then +self:_MarkHoldingPattern(Pattern) +else +self:_UnMarkHoldingPattern(Pattern) +end +end +end +function FLIGHTCONTROL:_MarkHoldingPattern(Pattern) +if not Pattern.markArrow then +Pattern.markArrow=Pattern.pos0:ArrowToAll(Pattern.pos1,nil,{1,0,0},1,{1,1,0},0.5,2,true) +end +if not Pattern.markArrival then +Pattern.markArrival=Pattern.arrivalzone:DrawZone() +end +end +function FLIGHTCONTROL:_UnMarkHoldingPattern(Pattern) +if Pattern.markArrow then +UTILS.RemoveMark(Pattern.markArrow) +Pattern.markArrow=nil +end +if Pattern.markArrival then +UTILS.RemoveMark(Pattern.markArrival) +Pattern.markArrival=nil +end +end +function FLIGHTCONTROL:_AddHoldingPatternBackup() +local runway=self:GetActiveRunway() +local heading=runway.heading +local vec2=self.airbase:GetVec2() +local Vec2=UTILS.Vec2Translate(vec2,UTILS.NMToMeters(5),heading+90) +local ArrivalZone=ZONE_RADIUS:New("Arrival Zone",Vec2,5000) +self.holdingBackup=self:AddHoldingPattern(ArrivalZone,heading,15,5,25,999) +return self +end +FLIGHTGROUP={ +ClassName="FLIGHTGROUP", +homebase=nil, +destbase=nil, +homezone=nil, +destzone=nil, +actype=nil, +speedMax=nil, +rangemax=nil, +ceiling=nil, +fuellow=false, +fuellowthresh=nil, +fuellowrtb=nil, +fuelcritical=nil, +fuelcriticalthresh=nil, +fuelcriticalrtb=false, +outofAAMrtb=false, +outofAGMrtb=false, +flightcontrol=nil, +flaghold=nil, +Tholding=nil, +Tparking=nil, +Twaiting=nil, +menu=nil, +isHelo=nil, +RTBRecallCount=0, +playerSettings={}, +playerWarnings={}, +prohibitAB=false, +jettisonEmptyTanks=true, +jettisonWeapons=true, +} +FLIGHTGROUP.Attribute={ +TRANSPORTPLANE="TransportPlane", +AWACS="AWACS", +FIGHTER="Fighter", +BOMBER="Bomber", +TANKER="Tanker", +TRANSPORTHELO="TransportHelo", +ATTACKHELO="AttackHelo", +UAV="UAV", +OTHER="Other", +} +FLIGHTGROUP.RadioMessage={ +AIRBORNE={normal="Airborn",enhanced="Airborn"}, +TAXIING={normal="Taxiing",enhanced="Taxiing"}, +} +FLIGHTGROUP.PlayerSkill={ +STUDENT="Student", +AVIATOR="Aviator", +GRADUATE="Graduate", +INSTRUCTOR="Instructor", +} +FLIGHTGROUP.Players={} +FLIGHTGROUP.version="1.0.3" +function FLIGHTGROUP:New(group) +local og=_DATABASE:GetOpsGroup(group) +if og then +og:I(og.lid..string.format("WARNING: OPS group already exists in data base!")) +return og +end +local self=BASE:Inherit(self,OPSGROUP:New(group)) +self.lid=string.format("FLIGHTGROUP %s | ",self.groupname or"N/A") +self:SetDefaultROE() +self:SetDefaultROT() +self:SetDefaultEPLRS(self.isEPLRS) +self:SetDetection() +self:SetFuelLowThreshold() +self:SetFuelLowRTB() +self:SetFuelCriticalThreshold() +self:SetFuelCriticalRTB() +self.flaghold=USERFLAG:New(string.format("%s_FlagHold",self.groupname)) +self.flaghold:Set(0) +self.holdtime=2*60 +self:AddTransition("*","LandAtAirbase","Inbound") +self:AddTransition("*","RTB","Inbound") +self:AddTransition("*","RTZ","Inbound") +self:AddTransition("Inbound","Holding","Holding") +self:AddTransition("*","Refuel","Going4Fuel") +self:AddTransition("Going4Fuel","Refueled","Cruising") +self:AddTransition("*","LandAt","LandingAt") +self:AddTransition("LandingAt","LandedAt","LandedAt") +self:AddTransition("*","FuelLow","*") +self:AddTransition("*","FuelCritical","*") +self:AddTransition("Cruising","EngageTarget","Engaging") +self:AddTransition("Engaging","Disengage","Cruising") +self:AddTransition("*","ElementParking","*") +self:AddTransition("*","ElementEngineOn","*") +self:AddTransition("*","ElementTaxiing","*") +self:AddTransition("*","ElementTakeoff","*") +self:AddTransition("*","ElementAirborne","*") +self:AddTransition("*","ElementLanded","*") +self:AddTransition("*","ElementArrived","*") +self:AddTransition("*","ElementOutOfAmmo","*") +self:AddTransition("*","Parking","Parking") +self:AddTransition("*","Taxiing","Taxiing") +self:AddTransition("*","Takeoff","Airborne") +self:AddTransition("*","Airborne","Airborne") +self:AddTransition("*","Cruise","Cruising") +self:AddTransition("*","Landing","Landing") +self:AddTransition("*","Landed","Landed") +self:AddTransition("*","Arrived","Arrived") +self:HandleEvent(EVENTS.Birth,self.OnEventBirth) +self:HandleEvent(EVENTS.EngineStartup,self.OnEventEngineStartup) +self:HandleEvent(EVENTS.Takeoff,self.OnEventTakeOff) +self:HandleEvent(EVENTS.Land,self.OnEventLanding) +self:HandleEvent(EVENTS.EngineShutdown,self.OnEventEngineShutdown) +self:HandleEvent(EVENTS.PilotDead,self.OnEventPilotDead) +self:HandleEvent(EVENTS.Ejection,self.OnEventEjection) +self:HandleEvent(EVENTS.Crash,self.OnEventCrash) +self:HandleEvent(EVENTS.RemoveUnit,self.OnEventRemoveUnit) +self:HandleEvent(EVENTS.UnitLost,self.OnEventUnitLost) +self:HandleEvent(EVENTS.Kill,self.OnEventKill) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventPlayerLeaveUnit) +self:_InitGroup() +self:_InitWaypoints() +self.timerStatus=TIMER:New(self.Status,self):Start(1,30) +self.timerQueueUpdate=TIMER:New(self._QueueUpdate,self):Start(2,5) +self.timerCheckZone=TIMER:New(self._CheckInZones,self):Start(3,10) +_DATABASE:AddOpsGroup(self) +return self +end +function FLIGHTGROUP:AddTaskEnrouteEngageTargetsInZone(ZoneRadius,TargetTypes,Priority) +local Task=self.group:EnRouteTaskEngageTargetsInZone(ZoneRadius:GetVec2(),ZoneRadius:GetRadius(),TargetTypes,Priority) +self:AddTaskEnroute(Task) +end +function FLIGHTGROUP:GetAirwing() +return self.legion +end +function FLIGHTGROUP:GetAirwingName() +local name=self.legion and self.legion.alias or"None" +return name +end +function FLIGHTGROUP:GetSquadron() +return self.cohort +end +function FLIGHTGROUP:GetSquadronName() +local name=self.cohort and self.cohort:GetName()or"None" +return name +end +function FLIGHTGROUP:SetVTOL() +self.isVTOL=true +return self +end +function FLIGHTGROUP:SetProhibitAfterburner() +self.prohibitAB=true +if self:GetGroup():IsAlive()then +self:GetGroup():SetOption(AI.Option.Air.id.PROHIBIT_AB,true) +end +return self +end +function FLIGHTGROUP:SetAllowAfterburner() +self.prohibitAB=false +if self:GetGroup():IsAlive()then +self:GetGroup():SetOption(AI.Option.Air.id.PROHIBIT_AB,false) +end +return self +end +function FLIGHTGROUP:SetJettisonEmptyTanks(Switch) +self.jettisonEmptyTanks=Switch +if self:GetGroup():IsAlive()then +self:GetGroup():SetOption(AI.Option.Air.id.JETT_TANKS_IF_EMPTY,Switch) +end +return self +end +function FLIGHTGROUP:SetJettisonWeapons(Switch) +self.jettisonWeapons=not Switch +if self:GetGroup():IsAlive()then +self:GetGroup():SetOption(AI.Option.Air.id.PROHIBIT_JETT,not Switch) +end +return self +end +function FLIGHTGROUP:SetOptionLandingStraightIn() +self.OptionLandingStraightIn=true +if self:GetGroup():IsAlive()then +self:GetGroup():SetOptionLandingStraightIn() +end +return self +end +function FLIGHTGROUP:SetOptionLandingForcePair() +self.OptionLandingForcePair=true +if self:GetGroup():IsAlive()then +self:GetGroup():SetOptionLandingForcePair() +end +return self +end +function FLIGHTGROUP:SetOptionLandingRestrictPair() +self.OptionLandingRestrictPair=true +if self:GetGroup():IsAlive()then +self:GetGroup():SetOptionLandingRestrictPair() +end +return self +end +function FLIGHTGROUP:SetOptionLandingOverheadBreak() +self.OptionLandingOverheadBreak=true +if self:GetGroup():IsAlive()then +self:GetGroup():SetOptionLandingOverheadBreak() +end +return self +end +function FLIGHTGROUP:SetOptionPreferVertical() +self.OptionPreferVertical=true +if self:GetGroup():IsAlive()then +self:GetGroup():OptionPreferVerticalLanding() +end +return self +end +function FLIGHTGROUP:SetReadyForTakeoff(ReadyTO,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,FLIGHTGROUP.SetReadyForTakeoff,self,ReadyTO,0) +else +self:T(self.lid.."Set Ready for Takeoff switch for flightcontrol") +self.isReadyTO=ReadyTO +end +return self +end +function FLIGHTGROUP:SetFlightControl(flightcontrol) +if self.flightcontrol then +if self.flightcontrol:IsControlling(self)then +return +else +self.flightcontrol:_RemoveFlight(self) +end +end +self:T(self.lid..string.format("Setting FLIGHTCONTROL to airbase %s",flightcontrol.airbasename)) +self.flightcontrol=flightcontrol +if not flightcontrol:IsFlight(self)then +table.insert(flightcontrol.flights,self) +end +return self +end +function FLIGHTGROUP:GetFlightControl() +return self.flightcontrol +end +function FLIGHTGROUP:SetHomebase(HomeAirbase) +if type(HomeAirbase)=="string"then +HomeAirbase=AIRBASE:FindByName(HomeAirbase) +end +self.homebase=HomeAirbase +return self +end +function FLIGHTGROUP:SetDestinationbase(DestinationAirbase) +if type(DestinationAirbase)=="string"then +DestinationAirbase=AIRBASE:FindByName(DestinationAirbase) +end +self.destbase=DestinationAirbase +return self +end +function FLIGHTGROUP:SetAirboss(airboss) +self.airboss=airboss +return self +end +function FLIGHTGROUP:SetFuelLowThreshold(threshold) +self.fuellowthresh=threshold or 25 +return self +end +function FLIGHTGROUP:SetFuelLowRTB(switch) +if switch==false then +self.fuellowrtb=false +else +self.fuellowrtb=true +end +return self +end +function FLIGHTGROUP:SetOutOfAAMRTB(switch) +if switch==false then +self.outofAAMrtb=false +else +self.outofAAMrtb=true +end +return self +end +function FLIGHTGROUP:SetOutOfAGMRTB(switch) +if switch==false then +self.outofAGMrtb=false +else +self.outofAGMrtb=true +end +return self +end +function FLIGHTGROUP:SetFuelLowRefuel(switch) +if switch==false then +self.fuellowrefuel=false +else +self.fuellowrefuel=true +end +return self +end +function FLIGHTGROUP:SetFuelCriticalThreshold(threshold) +self.fuelcriticalthresh=threshold or 10 +return self +end +function FLIGHTGROUP:SetFuelCriticalRTB(switch) +if switch==false then +self.fuelcriticalrtb=false +else +self.fuelcriticalrtb=true +end +return self +end +function FLIGHTGROUP:SetDespawnAfterLanding() +self.despawnAfterLanding=true +return self +end +function FLIGHTGROUP:SetDespawnAfterHolding() +self.despawnAfterHolding=true +return self +end +function FLIGHTGROUP:IsParking(Element) +local is=self:Is("Parking") +if Element then +is=Element.status==OPSGROUP.ElementStatus.PARKING +end +return is +end +function FLIGHTGROUP:IsTaxiing(Element) +local is=self:Is("Taxiing") +if Element then +is=Element.status==OPSGROUP.ElementStatus.TAXIING +end +return is +end +function FLIGHTGROUP:IsAirborne(Element) +local is=self:Is("Airborne")or self:Is("Cruising") +if Element then +is=Element.status==OPSGROUP.ElementStatus.AIRBORNE +end +return is +end +function FLIGHTGROUP:IsCruising() +local is=self:Is("Cruising") +return is +end +function FLIGHTGROUP:IsLanding(Element) +local is=self:Is("Landing") +if Element then +is=Element.status==OPSGROUP.ElementStatus.LANDING +end +return is +end +function FLIGHTGROUP:IsLanded(Element) +local is=self:Is("Landed") +if Element then +is=Element.status==OPSGROUP.ElementStatus.LANDED +end +return is +end +function FLIGHTGROUP:IsArrived(Element) +local is=self:Is("Arrived") +if Element then +is=Element.status==OPSGROUP.ElementStatus.ARRIVED +end +return is +end +function FLIGHTGROUP:IsInbound() +local is=self:Is("Inbound") +return is +end +function FLIGHTGROUP:IsHolding() +local is=self:Is("Holding") +return is +end +function FLIGHTGROUP:IsGoing4Fuel() +local is=self:Is("Going4Fuel") +return is +end +function FLIGHTGROUP:IsLandingAt() +local is=self:Is("LandingAt") +return is +end +function FLIGHTGROUP:IsLandedAt() +local is=self:Is("LandedAt") +return is +end +function FLIGHTGROUP:IsFuelLow() +return self.fuellow +end +function FLIGHTGROUP:IsFuelCritical() +return self.fuelcritical +end +function FLIGHTGROUP:IsFuelGood() +local isgood=not(self.fuellow or self.fuelcritical) +return isgood +end +function FLIGHTGROUP:CanAirToGround(ExcludeGuns) +local ammo=self:GetAmmoTot() +if ExcludeGuns then +return ammo.MissilesAG+ammo.Rockets+ammo.Bombs>0 +else +return ammo.MissilesAG+ammo.Rockets+ammo.Bombs+ammo.Guns>0 +end +end +function FLIGHTGROUP:CanAirToAir(ExcludeGuns) +local ammo=self:GetAmmoTot() +if ExcludeGuns then +return ammo.MissilesAA>0 +else +return ammo.MissilesAA+ammo.Guns>0 +end +end +function FLIGHTGROUP:StartUncontrolled(delay) +if delay and delay>0 then +self:T2(self.lid..string.format("Starting uncontrolled group in %d seconds",delay)) +self:ScheduleOnce(delay,FLIGHTGROUP.StartUncontrolled,self) +else +local alive=self:IsAlive() +if alive~=nil then +local _delay=0 +if alive==false then +self:Activate() +_delay=1 +end +self:T(self.lid.."Starting uncontrolled group") +self.group:StartUncontrolled(_delay) +self.isUncontrolled=false +else +self:T(self.lid.."ERROR: Could not start uncontrolled group as it is NOT alive!") +end +end +return self +end +function FLIGHTGROUP:ClearToLand(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,FLIGHTGROUP.ClearToLand,self) +else +if self:IsHolding()then +self:T(self.lid..string.format("Clear to land ==> setting holding flag to 1 (true)")) +self.flaghold:Set(1) +self.Tholding=nil +if self.stack then +self.stack.flightgroup=nil +self.stack=nil +end +end +end +return self +end +function FLIGHTGROUP:GetFuelMin() +local fuelmin=math.huge +for i,_element in pairs(self.elements)do +local element=_element +local unit=element.unit +local life=unit:GetLife() +if unit and unit:IsAlive()and life>1 then +local fuel=unit:GetFuel() +if fuel<fuelmin then +fuelmin=fuel +end +end +end +return fuelmin*100 +end +function FLIGHTGROUP:GetKills() +return self.Nkills +end +function FLIGHTGROUP:Status() +local fsmstate=self:GetState() +local alive=self:IsAlive() +if alive then +self:_UpdatePosition() +self:_CheckDetectedUnits() +self:_CheckAmmoStatus() +self:_CheckDamage() +self:_CheckStuck() +local mission=self:GetMissionCurrent() +if self:IsWaiting()then +if self.Twaiting and self.dTwait then +if timer.getAbsTime()>self.Twaiting+self.dTwait then +end +end +end +if mission and mission.missionHoldingCoord and self.isHoldingAtHoldingPoint==true then +self:T(self.lid.."...yes") +if mission:IsReadyToPush()then +self.flaghold:Set(1) +self.Twaiting=nil +self.dTwait=nil +self.isHoldingAtHoldingPoint=false +end +end +if mission and mission.updateDCSTask then +if(mission:GetType()==AUFTRAG.Type.ORBIT or mission:GetType()==AUFTRAG.Type.RECOVERYTANKER or mission:GetType()==AUFTRAG.Type.CAP)and mission.orbitVec2 then +local vec2=mission:GetTargetVec2() +local hdg=mission:GetTargetHeading() +local hdgchange=false +if mission.orbitLeg then +if UTILS.HdgDiff(hdg,mission.targetHeading)>0 then +hdgchange=true +end +end +local dist=UTILS.VecDist2D(vec2,mission.orbitVec2) +local distchange=dist>mission.orbitDeltaR +self:T3(self.lid..string.format("Checking orbit mission dist=%d meters",dist)) +if distchange or hdgchange then +self:T3(self.lid..string.format("Updating orbit!")) +local DCSTask=mission:GetDCSMissionTask() +local Task=mission:GetGroupWaypointTask(self) +self.controller:resetTask() +self:_SandwitchDCSTask(DCSTask,Task,false,1) +end +elseif mission.type==AUFTRAG.Type.CAPTUREZONE then +local Task=mission:GetGroupWaypointTask(self) +if mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.EXECUTING or mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.STARTED then +self:_UpdateTask(Task,mission) +end +end +end +if self:IsParking()then +for _,_element in pairs(self.elements)do +local element=_element +if element.parking then +local dist=self:_GetDistToParking(element.parking,element.unit:GetCoord()) +self:T(self.lid..string.format("Distance to parking spot %d = %.1f meters",element.parking.TerminalID,dist)) +if dist>12 and element.engineOn then +self:ElementTaxiing(element) +end +else +end +end +end +else +self:_CheckDamage() +end +if self.verbose>=1 then +local nelem=self:CountElements() +local Nelem=#self.elements +local nTaskTot,nTaskSched,nTaskWP=self:CountRemainingTasks() +local nMissions=self:CountRemainingMissison() +local roe=self:GetROE()or-1 +local rot=self:GetROT()or-1 +local wpidxCurr=self.currentwp +local wpuidCurr=self:GetWaypointUIDFromIndex(wpidxCurr)or 0 +local wpidxNext=self:GetWaypointIndexNext()or 0 +local wpuidNext=self:GetWaypointUIDFromIndex(wpidxNext)or 0 +local wpN=#self.waypoints or 0 +local wpF=tostring(self.passedfinalwp) +local speed=UTILS.MpsToKnots(self.velocity or 0) +local speedEx=UTILS.MpsToKnots(self:GetExpectedSpeed()) +local alt=self.position and self.position.y or 0 +local hdg=self.heading or 0 +local formation=self.option.Formation or"unknown" +local life=self.life or 0 +local ammo=self:GetAmmoTot().Total +local ndetected=self.detectionOn and tostring(self.detectedunits:Count())or"Off" +local cargo=0 +for _,_element in pairs(self.elements)do +local element=_element +cargo=cargo+element.weightCargo +end +local home=self.homebase and self.homebase:GetName()or"unknown" +local dest=self.destbase and self.destbase:GetName()or"unknown" +local curr=self.currbase and self.currbase:GetName()or"N/A" +local text=string.format("%s [%d/%d]: ROE/ROT=%d/%d | T/M=%d/%d | Wp=%d[%d]-->%d[%d]/%d [%s] | Life=%.1f | v=%.1f (%d) | Hdg=%03d | Ammo=%d | Detect=%s | Cargo=%.1f | Base=%s [%s-->%s]", +fsmstate,nelem,Nelem,roe,rot,nTaskTot,nMissions,wpidxCurr,wpuidCurr,wpidxNext,wpuidNext,wpN,wpF,life,speed,speedEx,hdg,ammo,ndetected,cargo,curr,home,dest) +self:I(self.lid..text) +end +if self.verbose>=2 then +local text="Elements:" +for i,_element in pairs(self.elements)do +local element=_element +local name=element.name +local status=element.status +local unit=element.unit +local fuel=unit:GetFuel()or 0 +local life=unit:GetLifeRelative()or 0 +local lp=unit:GetLife() +local lp0=unit:GetLife0() +local parking=element.parking and tostring(element.parking.TerminalID)or"X" +local ammo=self:GetAmmoElement(element) +text=text..string.format("\n[%d] %s: status=%s, fuel=%.1f, life=%.1f [%.1f/%.1f], guns=%d, rockets=%d, bombs=%d, missiles=%d (AA=%d, AG=%d, AS=%s), parking=%s", +i,name,status,fuel*100,life*100,lp,lp0,ammo.Guns,ammo.Rockets,ammo.Bombs,ammo.Missiles,ammo.MissilesAA,ammo.MissilesAG,ammo.MissilesAS,parking) +end +if#self.elements==0 then +text=text.." none!" +end +self:I(self.lid..text) +end +if self.verbose>=4 and alive then +local ds=self.travelds +local dt=self.dTpositionUpdate +local v=ds/dt +local TmaxFuel=math.huge +for _,_element in pairs(self.elements)do +local element=_element +local fuel=element.unit:GetFuel()or 0 +local dFrel=element.fuelrel-fuel +local dFreldt=dFrel/dt +local Tfuel=fuel/dFreldt +if Tfuel<TmaxFuel then +TmaxFuel=Tfuel +end +self:T3(self.lid..string.format("Fuel consumption %s F=%.1f: dF=%.3f dF/min=%.3f ==> Tfuel=%.1f min",element.name,fuel*100,dFrel*100,dFreldt*100*60,Tfuel/60)) +element.fuelrel=fuel +end +self:T(self.lid..string.format("Travelled ds=%.1f km dt=%.1f s ==> v=%.1f knots. Fuel left for %.1f min",self.traveldist/1000,dt,UTILS.MpsToKnots(v),TmaxFuel/60)) +end +if false then +for _,_element in pairs(self.elements)do +local element=_element +local unit=element.unit +if unit and unit:IsAlive()then +local vec3=unit:GetVec3() +if vec3 and element.pos then +local id=UTILS.GetMarkID() +trigger.action.lineToAll(-1,id,vec3,element.pos,{1,1,1,0.5},1) +end +element.pos=vec3 +end +end +end +if alive and self.group:IsAirborne(true)then +local fuelmin=self:GetFuelMin() +self:T2(self.lid..string.format("Fuel state=%d",fuelmin)) +if fuelmin>=self.fuellowthresh then +self.fuellow=false +end +if fuelmin>=self.fuelcriticalthresh then +self.fuelcritical=false +end +if fuelmin<self.fuellowthresh and not self.fuellow then +self:FuelLow() +end +if fuelmin<self.fuelcriticalthresh and not self.fuelcritical then +self:FuelCritical() +end +end +if self.isHelo and self.airboss and self:IsHolding()then +if self.airboss:IsRecovering()or self:IsFuelCritical()then +self:ClearToLand() +end +end +if self:IsAirborne()and self:IsFuelGood()and self.detectionOn and self.engagedetectedOn then +local targetgroup,targetdist=self:_GetDetectedTarget() +if targetgroup then +self:T(self.lid..string.format("Engaging target group %s at distance %d meters",targetgroup:GetName(),targetdist)) +self:EngageTarget(targetgroup) +end +end +self:_CheckCargoTransport() +self:_PrintTaskAndMissionStatus() +local mission=self:GetMissionCurrent() +if not mission then +self.Twaiting=nil +self.dTwait=nil +self:_CheckGroupDone() +end +end +function FLIGHTGROUP:OnEventEngineStartup(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element then +if self:IsAirborne()or self:IsInbound()or self:IsHolding()then +else +self:T3(self.lid..string.format("EVENT: Element %s started engines ==> taxiing (if AI)",element.name)) +self:ElementEngineOn(element) +element.engineOn=true +end +end +end +end +function FLIGHTGROUP:OnEventTakeOff(EventData) +self:T3(self.lid.."EVENT: TakeOff") +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element then +self:T2(self.lid..string.format("EVENT: Element %s took off ==> airborne",element.name)) +self:ElementTakeoff(element,EventData.Place) +end +end +end +function FLIGHTGROUP:OnEventLanding(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +local airbase=EventData.Place +local airbasename="unknown" +if airbase then +airbasename=tostring(airbase:GetName()) +end +if element then +self:T3(self.lid..string.format("EVENT: Element %s landed at %s ==> landed",element.name,airbasename)) +self:ElementLanded(element,airbase) +end +end +end +function FLIGHTGROUP:OnEventEngineShutdown(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element then +element.engineOn=false +if element.unit and element.unit:IsAlive()then +local airbase=self:GetClosestAirbase() +local parking=self:GetParkingSpot(element,100,airbase) +if airbase and parking then +self:ElementArrived(element,airbase,parking) +self:T3(self.lid..string.format("EVENT: Element %s shut down engines ==> arrived",element.name)) +else +self:T3(self.lid..string.format("EVENT: Element %s shut down engines but is not parking. Is it dead?",element.name)) +end +else +end +end +end +end +function FLIGHTGROUP:OnEventCrash(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:T(self.lid..string.format("EVENT: Element %s crashed ==> destroyed",element.name)) +self:ElementDestroyed(element) +end +end +end +function FLIGHTGROUP:OnEventUnitLost(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +self:T2(self.lid..string.format("EVENT: Unit %s lost at t=%.3f",EventData.IniUnitName,timer.getTime())) +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:T(self.lid..string.format("EVENT: Element %s unit lost ==> destroyed t=%.3f",element.name,timer.getTime())) +self:ElementDestroyed(element) +end +end +end +function FLIGHTGROUP:onafterElementSpawned(From,Event,To,Element) +self:T(self.lid..string.format("Element spawned %s",Element.name)) +if Element.playerName then +self:_InitPlayerData(Element.playerName) +end +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.SPAWNED) +if Element.unit:InAir(not self.isHelo)then +self:__ElementAirborne(0.11,Element) +else +local spot=self:GetParkingSpot(Element,10) +if spot then +self:__ElementParking(0.11,Element,spot) +else +self:T(self.lid..string.format("Element spawned not in air but not on any parking spot.")) +self:__ElementParking(0.11,Element) +end +end +end +function FLIGHTGROUP:onafterElementParking(From,Event,To,Element,Spot) +if Spot then +self:_SetElementParkingAt(Element,Spot) +end +self:T(self.lid..string.format("Element parking %s at spot %s",Element.name,Element.parking and tostring(Element.parking.TerminalID)or"N/A")) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.PARKING) +if self:IsTakeoffCold()then +elseif self:IsTakeoffHot()then +self:__ElementEngineOn(0.5,Element) +Element.engineOn=true +elseif self:IsTakeoffRunway()then +self:__ElementEngineOn(0.5,Element) +Element.engineOn=true +end +end +function FLIGHTGROUP:onafterElementEngineOn(From,Event,To,Element) +self:T(self.lid..string.format("Element %s started engines",Element.name)) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.ENGINEON) +end +function FLIGHTGROUP:onafterElementTaxiing(From,Event,To,Element) +local TerminalID=Element.parking and tostring(Element.parking.TerminalID)or"N/A" +self:T(self.lid..string.format("Element taxiing %s. Parking spot %s is now free",Element.name,TerminalID)) +self:_SetElementParkingFree(Element) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.TAXIING) +end +function FLIGHTGROUP:onafterElementTakeoff(From,Event,To,Element,airbase) +self:T(self.lid..string.format("Element takeoff %s at %s airbase.",Element.name,airbase and airbase:GetName()or"unknown")) +if Element.parking then +self:_SetElementParkingFree(Element) +end +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.TAKEOFF,airbase) +self:__ElementAirborne(0.01,Element) +end +function FLIGHTGROUP:onafterElementAirborne(From,Event,To,Element) +self:T2(self.lid..string.format("Element airborne %s",Element.name)) +self:_SetElementParkingFree(Element) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.AIRBORNE) +end +function FLIGHTGROUP:onafterElementLanded(From,Event,To,Element,airbase) +self:T2(self.lid..string.format("Element landed %s at %s airbase",Element.name,airbase and airbase:GetName()or"unknown")) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.LANDED,airbase) +if self.isHelo then +local Spot=self:GetParkingSpot(Element,10,airbase) +if Spot then +self:_SetElementParkingAt(Element,Spot) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.ARRIVED) +end +end +if self.despawnAfterLanding then +if self.legion then +if airbase and self.legion.airbase and airbase.AirbaseName==self.legion.airbase.AirbaseName then +if self:IsLanded()then +self:ReturnToLegion() +else +self:DespawnElement(Element) +end +end +else +self:DespawnElement(Element) +end +end +end +function FLIGHTGROUP:onafterElementArrived(From,Event,To,Element,airbase,Parking) +self:T(self.lid..string.format("Element arrived %s at %s airbase using parking spot %d",Element.name,airbase and airbase:GetName()or"unknown",Parking and Parking.TerminalID or-99)) +self:_SetElementParkingAt(Element,Parking) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.ARRIVED) +end +function FLIGHTGROUP:onafterElementDestroyed(From,Event,To,Element) +self:GetParent(self).onafterElementDestroyed(self,From,Event,To,Element) +end +function FLIGHTGROUP:onafterElementDead(From,Event,To,Element) +if self.flightcontrol and Element.parking then +self.flightcontrol:SetParkingFree(Element.parking) +end +self:GetParent(self).onafterElementDead(self,From,Event,To,Element) +Element.parking=nil +end +function FLIGHTGROUP:onafterSpawned(From,Event,To) +self:T(self.lid..string.format("Flight spawned")) +if self.verbose>=1 then +local text=string.format("Initialized Flight Group %s:\n",self.groupname) +text=text..string.format("Unit type = %s\n",tostring(self.actype)) +text=text..string.format("Speed max = %.1f Knots\n",UTILS.KmphToKnots(self.speedMax)) +text=text..string.format("Range max = %.1f km\n",self.rangemax/1000) +text=text..string.format("Ceiling = %.1f feet\n",UTILS.MetersToFeet(self.ceiling)) +text=text..string.format("Weight = %.1f kg\n",self:GetWeightTotal()) +text=text..string.format("Cargo bay = %.1f kg\n",self:GetFreeCargobay()) +text=text..string.format("Tanker type = %s\n",tostring(self.tankertype)) +text=text..string.format("Refuel type = %s\n",tostring(self.refueltype)) +text=text..string.format("AI = %s\n",tostring(self.isAI)) +text=text..string.format("Has EPLRS = %s\n",tostring(self.isEPLRS)) +text=text..string.format("Helicopter = %s\n",tostring(self.isHelo)) +text=text..string.format("Elements = %d\n",#self.elements) +text=text..string.format("Waypoints = %d\n",#self.waypoints) +text=text..string.format("Radio = %.1f MHz %s %s\n",self.radio.Freq,UTILS.GetModulationName(self.radio.Modu),tostring(self.radio.On)) +text=text..string.format("Ammo = %d (G=%d/R=%d/B=%d/M=%d)\n",self.ammo.Total,self.ammo.Guns,self.ammo.Rockets,self.ammo.Bombs,self.ammo.Missiles) +text=text..string.format("FSM state = %s\n",self:GetState()) +text=text..string.format("Is alive = %s\n",tostring(self.group:IsAlive())) +text=text..string.format("LateActivate = %s\n",tostring(self:IsLateActivated())) +text=text..string.format("Uncontrolled = %s\n",tostring(self:IsUncontrolled())) +text=text..string.format("Start Air = %s\n",tostring(self:IsTakeoffAir())) +text=text..string.format("Start Cold = %s\n",tostring(self:IsTakeoffCold())) +text=text..string.format("Start Hot = %s\n",tostring(self:IsTakeoffHot())) +text=text..string.format("Start Rwy = %s\n",tostring(self:IsTakeoffRunway())) +text=text..string.format("Elements:") +for i,_element in pairs(self.elements)do +local element=_element +text=text..string.format("\n[%d] %s: callsign=%s, modex=%s, player=%s",i,element.name,tostring(element.callsign),tostring(element.modex),tostring(element.playerName)) +end +self:I(self.lid..text) +end +self:_UpdatePosition() +self.isDead=false +self.isDestroyed=false +if self.isAI then +self:SwitchROE(self.option.ROE) +self:SwitchROT(self.option.ROT) +self:SwitchEPLRS(self.option.EPLRS) +self:SwitchInvisible(self.option.Invisible) +self:SwitchImmortal(self.option.Immortal) +self:SwitchFormation(self.option.Formation) +self:_SwitchTACAN() +if self.radioDefault then +self:SwitchRadio() +else +self:SetDefaultRadio(self.radio.Freq,self.radio.Modu,self.radio.On) +end +if self.callsignDefault then +self:SwitchCallsign(self.callsignDefault.NumberSquad,self.callsignDefault.NumberGroup) +else +self:SetDefaultCallsign(self.callsign.NumberSquad,self.callsign.NumberGroup) +end +self:GetGroup():SetOption(AI.Option.Air.id.PROHIBIT_JETT,self.jettisonWeapons) +self:GetGroup():SetOption(AI.Option.Air.id.PROHIBIT_AB,self.prohibitAB) +self:GetGroup():SetOption(AI.Option.Air.id.RTB_ON_BINGO,false) +self:GetGroup():SetOption(AI.Option.Air.id.JETT_TANKS_IF_EMPTY,self.jettisonEmptyTanks) +self:__UpdateRoute(-0.5) +else +if self.currbase then +local flightcontrol=_DATABASE:GetFlightControl(self.currbase:GetName()) +if flightcontrol then +self:SetFlightControl(flightcontrol) +else +self:_UpdateMenu(0.5) +end +else +self:_UpdateMenu(0.5) +end +end +end +function FLIGHTGROUP:onafterParking(From,Event,To) +local airbase=self:GetClosestAirbase() +local airbasename=airbase:GetName()or"unknown" +self:T(self.lid..string.format("Flight is parking at airbase %s",airbasename)) +self.currbase=airbase +if not self.homebase then +self.homebase=airbase +end +self.Tparking=timer.getAbsTime() +local flightcontrol=_DATABASE:GetFlightControl(airbasename) +if flightcontrol then +self:SetFlightControl(flightcontrol) +if self.flightcontrol then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.PARKING) +end +else +self:T3(self.lid.."INFO: No flight control in onAfterParking!") +end +end +function FLIGHTGROUP:onafterTaxiing(From,Event,To) +self:T(self.lid..string.format("Flight is taxiing")) +self.Tparking=nil +if self.flightcontrol and self.flightcontrol:IsControlling(self)then +if self.isAI then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.TAKEOFF) +else +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.TAXIOUT) +end +end +end +function FLIGHTGROUP:onafterTakeoff(From,Event,To,airbase) +self:T(self.lid..string.format("Flight takeoff from %s",airbase and airbase:GetName()or"unknown airbase")) +if self.flightcontrol and airbase and self.flightcontrol.airbasename==airbase:GetName()then +self.flightcontrol:_RemoveFlight(self) +self.flightcontrol=nil +end +end +function FLIGHTGROUP:onafterAirborne(From,Event,To) +self:T(self.lid..string.format("Flight airborne")) +self.currbase=nil +self:__Cruise(-0.01) +end +function FLIGHTGROUP:onafterCruise(From,Event,To) +self:T(self.lid..string.format("Flight cruising")) +self.Twaiting=nil +self.dTwait=nil +if self.isAI then +self:_CheckGroupDone(nil,120) +else +self:_UpdateMenu(0.1) +end +end +function FLIGHTGROUP:onafterLanding(From,Event,To) +self:T(self.lid..string.format("Flight is landing")) +self:_SetElementStatusAll(OPSGROUP.ElementStatus.LANDING) +if self.flightcontrol and self.flightcontrol:IsControlling(self)then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.LANDING) +end +self.Tholding=nil +if self.stack then +self.stack.flightgroup=nil +self.stack=nil +end +end +function FLIGHTGROUP:onafterLanded(From,Event,To,airbase) +self:T(self.lid..string.format("Flight landed at %s",airbase and airbase:GetName()or"unknown place")) +if self.flightcontrol and self.flightcontrol:IsControlling(self)then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.TAXIINB) +end +end +function FLIGHTGROUP:onafterLandedAt(From,Event,To) +self:T(self.lid..string.format("Flight landed at")) +if self:IsPickingup()then +self:__Loading(-1) +elseif self:IsTransporting()then +self:__Unloading(-1) +end +end +function FLIGHTGROUP:onafterArrived(From,Event,To) +self:T(self.lid..string.format("Flight arrived")) +if self.flightcontrol then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.ARRIVED) +end +if not self.isAI then +return +end +local airwing=self:GetAirwing() +if airwing and not(self:IsPickingup()or self:IsTransporting())then +self:T(self.lid..string.format("Airwing asset group %s arrived ==> Adding asset back to stock of airwing %s",self.groupname,airwing.alias)) +self:ReturnToLegion(1) +elseif self.isLandingAtAirbase then +local Template=UTILS.DeepCopy(self.template) +self.isLateActivated=false +Template.lateActivation=self.isLateActivated +self.isUncontrolled=true +Template.uncontrolled=self.isUncontrolled +local SpawnPoint=Template.route.points[1] +SpawnPoint.linkUnit=nil +SpawnPoint.helipadId=nil +SpawnPoint.airdromeId=nil +local airbase=self.isLandingAtAirbase +local AirbaseID=airbase:GetID() +if airbase:IsShip()then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif airbase:IsHelipad()then +SpawnPoint.linkUnit=AirbaseID +SpawnPoint.helipadId=AirbaseID +elseif airbase:IsAirdrome()then +SpawnPoint.airdromeId=AirbaseID +end +SpawnPoint.alt=0 +SpawnPoint.type=COORDINATE.WaypointType.TakeOffParking +SpawnPoint.action=COORDINATE.WaypointAction.FromParkingArea +local units=Template.units +for i=#units,1,-1 do +local unit=units[i] +local element=self:GetElementByName(unit.name) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +unit.parking=element.parking and element.parking.TerminalID or nil +unit.parking_id=nil +local vec3=element.unit:GetVec3() +local heading=element.unit:GetHeading() +unit.x=vec3.x +unit.y=vec3.z +unit.alt=vec3.y +unit.heading=math.rad(heading) +unit.psi=-unit.heading +else +table.remove(units,i) +end +end +self:_Respawn(0,Template) +self.isLandingAtAirbase=nil +if self:IsPickingup()then +self:__Loading(-1) +elseif self:IsTransporting()then +self:__Unloading(-1) +end +else +self:T(self.lid..string.format("Despawning group in 5 minutes after arrival!")) +self:Despawn(5*60) +end +end +function FLIGHTGROUP:onafterDead(From,Event,To) +if self.flightcontrol then +self.flightcontrol:_RemoveFlight(self) +self.flightcontrol=nil +end +self:GetParent(self).onafterDead(self,From,Event,To) +end +function FLIGHTGROUP:onbeforeUpdateRoute(From,Event,To,n,N) +local allowed=true +local trepeat=nil +if self:IsAlive()then +self:T3(self.lid.."Update route possible. Group is ALIVE") +elseif self:IsDead()then +self:T(self.lid.."Update route denied. Group is DEAD!") +allowed=false +elseif self:IsInUtero()then +self:T(self.lid.."Update route denied. Group is INUTERO!") +allowed=false +else +self:T(self.lid.."Update route denied ==> checking back in 5 sec") +trepeat=-5 +allowed=false +end +if allowed and self:IsUncontrolled()then +self:T(self.lid.."Update route denied. Group is UNCONTROLLED!") +local mission=self:GetMissionCurrent() +if mission and mission.type==AUFTRAG.Type.ALERT5 then +trepeat=nil +else +trepeat=-5 +end +allowed=false +end +if n and n<1 then +self:T(self.lid.."Update route denied because waypoint n<1!") +allowed=false +end +if not self.currentwp then +self:T(self.lid.."Update route denied because self.currentwp=nil!") +allowed=false +end +local Nn=n or self.currentwp+1 +if not Nn or Nn<1 then +self:T(self.lid.."Update route denied because N=nil or N<1") +trepeat=-5 +allowed=false +end +if self.taskcurrent>0 then +local task=self:GetTaskByID(self.taskcurrent) +if task then +if task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +self:T2(self.lid.."Allowing update route for Task: PatrolZone") +elseif task.dcstask.id==AUFTRAG.SpecialTask.CAPTUREZONE then +self:T2(self.lid.."Allowing update route for Task: CaptureZone") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RECON then +self:T2(self.lid.."Allowing update route for Task: ReconMission") +elseif task.dcstask.id==AUFTRAG.SpecialTask.PATROLRACETRACK then +self:T2(self.lid.."Allowing update route for Task: Patrol Race Track") +elseif task.dcstask.id==AUFTRAG.SpecialTask.HOVER then +self:T2(self.lid.."Allowing update route for Task: Hover") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RELOCATECOHORT then +self:T2(self.lid.."Allowing update route for Task: Relocate Cohort") +elseif task.description and task.description=="Task_Land_At"then +self:T2(self.lid.."Allowing update route for Task: Task_Land_At") +else +local taskname=task and task.description or"No description" +self:T(self.lid..string.format("WARNING: Update route denied because taskcurrent=%d>0! Task description = %s",self.taskcurrent,tostring(taskname))) +allowed=false +end +else +self:T(self.lid..string.format("WARNING: before update route taskcurrent=%d (>0!) but no task?!",self.taskcurrent)) +allowed=false +end +end +if not self.isAI then +allowed=false +end +self:T2(self.lid..string.format("Onbefore Updateroute in state %s: allowed=%s (repeat in %s)",self:GetState(),tostring(allowed),tostring(trepeat))) +if trepeat then +self:__UpdateRoute(trepeat,n) +end +return allowed +end +function FLIGHTGROUP:onafterUpdateRoute(From,Event,To,n,N) +n=n or self.currentwp+1 +N=N or#self.waypoints +N=math.min(N,#self.waypoints) +local wp={} +local speed=self.group and self.group:GetVelocityKMH()or 100 +local waypointType=COORDINATE.WaypointType.TurningPoint +local waypointAction=COORDINATE.WaypointAction.TurningPoint +if self:IsLanded()or self:IsLandedAt()or self:IsAirborne()==false then +waypointType=COORDINATE.WaypointType.TakeOff +end +local current=self:GetCoordinate():WaypointAir(COORDINATE.WaypointAltType.BARO,waypointType,waypointAction,speed,true,nil,{},"Current") +table.insert(wp,current) +for i=n,N do +table.insert(wp,self.waypoints[i]) +end +if wp[2]then +self.speedWp=wp[2].speed +end +local hb=self.homebase and self.homebase:GetName()or"unknown" +local db=self.destbase and self.destbase:GetName()or"unknown" +self:T(self.lid..string.format("Updating route for WP #%d-%d [%s], homebase=%s destination=%s",n,#wp,self:GetState(),hb,db)) +if#wp>1 then +self:Route(wp) +else +if self:IsAirborne()then +self:T(self.lid.."No waypoints left ==> CheckGroupDone") +self:_CheckGroupDone() +end +end +end +function FLIGHTGROUP:onafterOutOfMissilesAA(From,Event,To) +self:T(self.lid.."Group is out of AA Missiles!") +if self.outofAAMrtb then +local airbase=self.destbase or self.homebase +self:T(self.lid.."Calling RTB in onafterOutOfMissilesAA") +self:__RTB(-5,airbase) +end +end +function FLIGHTGROUP:onafterOutOfMissilesAG(From,Event,To) +self:T(self.lid.."Group is out of AG Missiles!") +if self.outofAGMrtb then +local airbase=self.destbase or self.homebase +self:T(self.lid.."Calling RTB in onafterOutOfMissilesAG") +self:__RTB(-5,airbase) +end +end +function FLIGHTGROUP:_CheckGroupDone(delay,waittime) +local fsmstate=self:GetState() +if self:IsAlive()and self.isAI then +if delay and delay>0 then +self:T(self.lid..string.format("Check FLIGHTGROUP [state=%s] done in %.3f seconds... (t=%.4f)",fsmstate,delay,timer.getTime())) +self:ScheduleOnce(delay,FLIGHTGROUP._CheckGroupDone,self) +else +self:T(self.lid..string.format("Check FLIGHTGROUP [state=%s] done? (t=%.4f)",fsmstate,timer.getTime())) +if self:IsEngaging()then +self:T(self.lid.."Engaging! Group NOT done...") +return +end +if self:IsGoing4Fuel()then +self:T(self.lid.."Going for FUEL! Group NOT done...") +return +end +local nTasks=self:CountRemainingTasks() +local nMissions=self:CountRemainingMissison() +local nTransports=self:CountRemainingTransports() +local nPaused=self:_CountPausedMissions() +if nPaused>0 and nPaused==nMissions then +local missionpaused=self:_GetPausedMission() +self:T(self.lid..string.format("Found paused mission %s [%s]. Unpausing mission...",missionpaused.name,missionpaused.type)) +self:UnpauseMission() +return +end +if self.isLandingAtAirbase then +self:T(self.lid..string.format("Landing at airbase %s! Group NOT done...",self.isLandingAtAirbase:GetName())) +return +end +if self:IsWaiting()then +self:T(self.lid.."Waiting! Group NOT done...") +return +end +self:T(self.lid..string.format("Remaining (final=%s): missions=%d, tasks=%d, transports=%d",tostring(self.passedfinalwp),nMissions,nTasks,nTransports)) +if self:HasPassedFinalWaypoint()or self:GetWaypointIndexNext()==1 then +if self.currentmission==nil and self.taskcurrent==0 and(self.cargoTransport==nil or self.cargoTransport:GetCarrierTransportStatus(self)==OPSTRANSPORT.Status.DELIVERED)then +if nTasks==0 and nMissions==0 and nTransports==0 then +local destbase=self.destbase or self.homebase +local destzone=self.destzone or self.homezone +if waittime then +self:T(self.lid..string.format("Passed Final WP and No current and/or future missions/tasks/transports. Waittime given ==> Waiting for %d sec!",waittime)) +self:Wait(waittime) +elseif destbase then +if self.currbase and self.currbase.AirbaseName==destbase.AirbaseName and self:IsParking()then +self:T(self.lid.."Passed Final WP and No current and/or future missions/tasks/transports AND parking at destination airbase ==> Arrived!") +self:Arrived() +else +if self.currbase==nil or self.currbase.AirbaseName~=destbase.AirbaseName then +self:T(self.lid.."Passed Final WP and No current and/or future missions/tasks/transports ==> RTB!") +self:__RTB(-0.1,destbase) +end +end +elseif destzone then +self:T(self.lid.."Passed Final WP and No current and/or future missions/tasks/transports ==> RTZ!") +self:__RTZ(-0.1,destzone) +else +self:T(self.lid.."Passed Final WP and NO Tasks/Missions left. No DestBase or DestZone ==> Wait!") +self:__Wait(-1) +end +else +if not self:IsParking()then +self:T(self.lid..string.format("Passed Final WP but Tasks=%d or Missions=%d left in the queue. Wait!",nTasks,nMissions)) +self:__Wait(-1) +end +end +else +self:T(self.lid..string.format("Passed Final WP but still have current Task (#%s) or Mission (#%s) left to do",tostring(self.taskcurrent),tostring(self.currentmission))) +end +else +self:T(self.lid..string.format("Flight (status=%s) did NOT pass the final waypoint yet ==> update route in -0.01 sec",self:GetState())) +self:__UpdateRoute(-0.01) +end +end +end +end +function FLIGHTGROUP:onbeforeRTB(From,Event,To,airbase,SpeedTo,SpeedHold) +self:T(self.lid..string.format("RTB: before event=%s: %s --> %s to %s",Event,From,To,airbase and airbase:GetName()or"None")) +if self:IsAlive()then +local allowed=true +local Tsuspend=nil +if airbase==nil then +self:T(self.lid.."ERROR: Airbase is nil in RTB() call!") +allowed=false +end +if airbase and airbase:GetCoalition()~=self.group:GetCoalition()and airbase:GetCoalition()>0 then +self:T(self.lid..string.format("ERROR: Wrong airbase coalition %d in RTB() call! We allow only same as group %d or neutral airbases 0",airbase:GetCoalition(),self.group:GetCoalition())) +return false +end +if self.currbase and self.currbase:GetName()==airbase:GetName()then +self:T(self.lid.."WARNING: Currbase is already same as RTB airbase. RTB canceled!") +return false +end +if self:IsLanded()then +self:T(self.lid.."WARNING: Flight has already landed. RTB canceled!") +return false +end +if not self.group:IsAirborne(true)then +self:T(self.lid..string.format("WARNING: Group [%s] is not AIRBORNE ==> RTB event is suspended for 20 sec",self:GetState())) +allowed=false +Tsuspend=-20 +local groupspeed=self.group:GetVelocityMPS() +if groupspeed<=1 and not self:IsParking()then +self.RTBRecallCount=self.RTBRecallCount+1 +end +if self.RTBRecallCount>6 then +self:T(self.lid..string.format("WARNING: Group [%s] is not moving and was called RTB %d times. Assuming a problem and despawning!",self:GetState(),self.RTBRecallCount)) +self.RTBRecallCount=0 +self:Despawn(5) +return +end +end +if self:IsFuelGood()then +local Ntot,Nsched,Nwp=self:CountRemainingTasks() +if self.taskcurrent>0 then +self:T(self.lid..string.format("WARNING: Got current task ==> RTB event is suspended for 10 sec")) +Tsuspend=-10 +allowed=false +end +if Nsched>0 then +self:T(self.lid..string.format("WARNING: Still got %d SCHEDULED tasks in the queue ==> RTB event is suspended for 10 sec",Nsched)) +Tsuspend=-10 +allowed=false +end +if Nwp>0 then +self:T(self.lid..string.format("WARNING: Still got %d WAYPOINT tasks in the queue ==> RTB event is suspended for 10 sec",Nwp)) +Tsuspend=-10 +allowed=false +end +if self.Twaiting and self.dTwait then +self:T(self.lid..string.format("WARNING: Group is Waiting for a specific duration ==> RTB event is canceled",Nwp)) +allowed=false +end +end +if Tsuspend and not allowed then +self:T(self.lid.."Calling RTB in onbeforeRTB") +self:__RTB(Tsuspend,airbase,SpeedTo,SpeedHold) +end +return allowed +else +self:T(self.lid.."WARNING: Group is not alive! RTB call not allowed.") +return false +end +end +function FLIGHTGROUP:onafterRTB(From,Event,To,airbase,SpeedTo,SpeedHold,SpeedLand) +self:T(self.lid..string.format("RTB: event=%s: %s --> %s to %s",Event,From,To,airbase:GetName())) +self.destbase=airbase +self:CancelAllMissions() +self:_LandAtAirbase(airbase,SpeedTo,SpeedHold,SpeedLand) +end +function FLIGHTGROUP:onbeforeLandAtAirbase(From,Event,To,airbase) +if self:IsAlive()then +local allowed=true +local Tsuspend=nil +if airbase==nil then +self:T(self.lid.."ERROR: Airbase is nil in LandAtAirbase() call!") +allowed=false +end +if airbase and airbase:GetCoalition()~=self.group:GetCoalition()and airbase:GetCoalition()>0 then +self:T(self.lid..string.format("ERROR: Wrong airbase coalition %d in LandAtAirbase() call! We allow only same as group %d or neutral airbases 0",airbase:GetCoalition(),self.group:GetCoalition())) +return false +end +if self.currbase and self.currbase:GetName()==airbase:GetName()then +self:T(self.lid.."WARNING: Currbase is already same as LandAtAirbase airbase. LandAtAirbase canceled!") +return false +end +if self:IsLanded()then +self:T(self.lid.."WARNING: Flight has already landed. LandAtAirbase canceled!") +return false +end +if self:IsParking()then +allowed=false +Tsuspend=-30 +self:T(self.lid.."WARNING: Flight is parking. LandAtAirbase call delayed by 30 sec") +elseif self:IsTaxiing()then +allowed=false +Tsuspend=-1 +self:T(self.lid.."WARNING: Flight is parking. LandAtAirbase call delayed by 1 sec") +end +if Tsuspend and not allowed then +self:__LandAtAirbase(Tsuspend,airbase) +end +return allowed +else +self:T(self.lid.."WARNING: Group is not alive! LandAtAirbase call not allowed") +return false +end +end +function FLIGHTGROUP:onafterLandAtAirbase(From,Event,To,airbase) +self.isLandingAtAirbase=airbase +self:_LandAtAirbase(airbase) +end +function FLIGHTGROUP:_LandAtAirbase(airbase,SpeedTo,SpeedHold,SpeedLand) +self.currbase=airbase +self:_PassedFinalWaypoint(true,"_LandAtAirbase") +self.Twaiting=nil +self.dTwait=nil +SpeedTo=SpeedTo or UTILS.KmphToKnots(self.speedCruise) +SpeedHold=SpeedHold or(self.isHelo and 80 or 250) +SpeedLand=SpeedLand or(self.isHelo and 40 or 170) +self.Tholding=nil +local text=string.format("Flight group set to hold at airbase %s. SpeedTo=%d, SpeedHold=%d, SpeedLand=%d",airbase:GetName(),SpeedTo,SpeedHold,SpeedLand) +self:T(self.lid..text) +local althold=self.isHelo and 1000+math.random(10)*100 or math.random(4,10)*1000 +local c0=self:GetCoordinate() +local p0=airbase:GetZone():GetRandomCoordinate():SetAltitude(UTILS.FeetToMeters(althold)) +local p1=nil +local wpap=nil +local fc=_DATABASE:GetFlightControl(airbase:GetName()) +if fc and self.isAI then +local stack=fc:_GetHoldingStack(self) +if stack then +stack.flightgroup=self +self.stack=stack +p0=stack.pos0 +p1=stack.pos1 +if false then +p0:MarkToAll(string.format("%s: Holding stack P0, alt=%d meters",self:GetName(),p0.y)) +p1:MarkToAll(string.format("%s: Holding stack P1, alt=%d meters",self:GetName(),p0.y)) +end +else +end +self:SetFlightControl(fc) +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.INBOUND) +local callsign=self:GetCallsignName() +local text=string.format("%s, %s, inbound for landing",fc.alias,callsign) +fc:TransmissionPilot(text,self) +local text=string.format("%s, %s, roger, hold at angels %d. Report entering the pattern.",callsign,fc.alias,stack.angels) +fc:TransmissionTower(text,self,10) +end +local c1=c0:GetIntermediateCoordinate(p0,0.25):SetAltitude(self.altitudeCruise,true) +local c2=c0:GetIntermediateCoordinate(p0,0.75):SetAltitude(self.altitudeCruise,true) +local x1=self.isHelo and UTILS.NMToMeters(2.0)or UTILS.NMToMeters(10) +local x2=self.isHelo and UTILS.NMToMeters(1.0)or UTILS.NMToMeters(5) +local alpha=math.rad(3) +local h1=x1*math.tan(alpha) +local h2=x2*math.tan(alpha) +local runway=airbase:GetActiveRunwayLanding() +self.flaghold:Set(0) +local holdtime=self.holdtime +if fc or self.airboss then +holdtime=nil +end +local TaskArrived=self.group:TaskFunction("FLIGHTGROUP._ReachedHolding",self) +local TaskOrbit=self.group:TaskOrbit(p0,nil,UTILS.KnotsToMps(SpeedHold),p1) +local TaskLand=self.group:TaskCondition(nil,self.flaghold.UserFlagName,1,nil,holdtime) +local TaskHold=self.group:TaskControlled(TaskOrbit,TaskLand) +local TaskKlar=self.group:TaskFunction("FLIGHTGROUP._ClearedToLand",self) +local wp={} +wp[#wp+1]=c1:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,UTILS.KnotsToKmph(SpeedTo),true,nil,{},"Climb") +wp[#wp+1]=c2:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,UTILS.KnotsToKmph(SpeedTo),true,nil,{},"Descent") +wp[#wp+1]=p0:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,UTILS.KnotsToKmph(SpeedTo),true,nil,{TaskArrived,TaskHold,TaskKlar},"Holding Point") +if airbase:IsAirdrome()then +local TaskFinal=self.group:TaskFunction("FLIGHTGROUP._OnFinal",self) +local rheading +if runway then +rheading=runway.heading-180 +else +local wind=airbase:GetCoordinate():GetWind() +rheading=-wind +end +local papp=airbase:GetCoordinate():Translate(x1,rheading):SetAltitude(h1) +wp[#wp+1]=papp:WaypointAirTurningPoint("BARO",UTILS.KnotsToKmph(SpeedLand),{TaskFinal},"Final Approach") +local pland=airbase:GetCoordinate():Translate(x2,rheading):SetAltitude(h2) +wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand),airbase,{},"Landing") +elseif airbase:IsShip()or airbase:IsHelipad()then +local pland=airbase:GetCoordinate() +wp[#wp+1]=pland:WaypointAirLanding(UTILS.KnotsToKmph(SpeedLand),airbase,{},"Landing") +end +if self.isAI then +self:Route(wp,1.0) +end +end +function FLIGHTGROUP:onbeforeWait(From,Event,To,Duration,Altitude,Speed) +local allowed=true +local Tsuspend=nil +if self.taskcurrent>0 and not self:IsLandedAt()then +self:T(self.lid..string.format("WARNING: Got current task ==> WAIT event is suspended for 30 sec!")) +Tsuspend=-30 +allowed=false +end +if self.cargoTransport and not self:IsLandedAt()then +end +if Tsuspend and not allowed then +self:__Wait(Tsuspend,Duration,Altitude,Speed) +end +return allowed +end +function FLIGHTGROUP:onafterWait(From,Event,To,Duration,Altitude,Speed) +local Coord=self:GetCoordinate() +if Altitude then +Altitude=UTILS.FeetToMeters(Altitude) +else +Altitude=self.altitudeCruise +end +Speed=Speed or(self.isHelo and 20 or 250) +local text=string.format("Group set to wait/orbit at altitude %d m and speed %.1f km/h for %s seconds",Altitude,Speed,tostring(Duration)) +self:T(self.lid..text) +self.flaghold:Set(0) +local TaskOrbit=self.group:TaskOrbit(Coord,Altitude,UTILS.KnotsToMps(Speed)) +local TaskStop=self.group:TaskCondition(nil,self.flaghold.UserFlagName,1,nil,Duration) +local TaskCntr=self.group:TaskControlled(TaskOrbit,TaskStop) +local TaskOver=self.group:TaskFunction("FLIGHTGROUP._FinishedWaiting",self) +local DCSTasks +if Duration or true then +DCSTasks=self.group:TaskCombo({TaskCntr,TaskOver}) +else +DCSTasks=self.group:TaskCombo({TaskOrbit,TaskOver}) +end +self:PushTask(DCSTasks) +self.Twaiting=timer.getAbsTime() +self.dTwait=Duration +end +function FLIGHTGROUP:onafterRefuel(From,Event,To,Coordinate) +local text=string.format("Flight group set to refuel at the nearest tanker") +self:T(self.lid..text) +self:PauseMission() +local TaskRefuel=self.group:TaskRefueling() +local TaskFunction=self.group:TaskFunction("FLIGHTGROUP._FinishedRefuelling",self) +local DCSTasks={TaskRefuel,TaskFunction} +local Speed=self.speedCruise +local coordinate=self:GetCoordinate() +Coordinate=Coordinate or coordinate:Translate(UTILS.NMToMeters(5),self.group:GetHeading(),true) +local wp0=coordinate:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true) +local wp9=Coordinate:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true,nil,DCSTasks,"Refuel") +self:Route({wp0,wp9},1) +self.group:SetOption(AI.Option.Air.id.RTB_ON_BINGO,true) +end +function FLIGHTGROUP:onafterRefueled(From,Event,To) +local text=string.format("Flight group finished refuelling") +self:T(self.lid..text) +self.group:SetOption(AI.Option.Air.id.RTB_ON_BINGO,false) +self:_CheckGroupDone(1) +end +function FLIGHTGROUP:onafterHolding(From,Event,To) +self.flaghold:Set(0) +if self.despawnAfterHolding then +if self.legion then +self:ReturnToLegion(1) +else +self:Despawn(1) +end +return +end +self.Tholding=timer.getAbsTime() +local text=string.format("Flight group %s is HOLDING now",self.groupname) +self:T(self.lid..text) +if self.flightcontrol then +self.flightcontrol:SetFlightStatus(self,FLIGHTCONTROL.FlightStatus.HOLDING) +if self.isAI then +local callsign=self:GetCallsignName() +local text=string.format("%s, %s, arrived at holding pattern",self.flightcontrol.alias,callsign) +if self.stack then +text=text..string.format(", angels %d.",self.stack.angels) +end +self.flightcontrol:TransmissionPilot(text,self) +local text=string.format("%s, roger, fly heading %d and wait for landing clearance",callsign,self.stack.heading) +self.flightcontrol:TransmissionTower(text,self,10) +end +elseif self.airboss then +if self.isHelo then +local carrierpos=self.airboss:GetCoordinate() +local carrierheading=self.airboss:GetHeading() +local Distance=UTILS.NMToMeters(5) +local Angle=carrierheading+90 +local altitude=math.random(12,25)*100 +local oc=carrierpos:Translate(Distance,Angle):SetAltitude(altitude,true) +local TaskOrbit=self.group:TaskOrbit(oc,nil,UTILS.KnotsToMps(50)) +local TaskLand=self.group:TaskCondition(nil,self.flaghold.UserFlagName,1) +local TaskHold=self.group:TaskControlled(TaskOrbit,TaskLand) +local TaskKlar=self.group:TaskFunction("FLIGHTGROUP._ClearedToLand",self) +local DCSTask=self.group:TaskCombo({TaskOrbit,TaskHold,TaskKlar}) +self:SetTask(DCSTask) +end +end +end +function FLIGHTGROUP:onafterEngageTarget(From,Event,To,Target) +local DCStask=nil +if Target:IsInstanceOf("UNIT")or Target:IsInstanceOf("STATIC")then +DCStask=self:GetGroup():TaskAttackUnit(Target,true) +elseif Target:IsInstanceOf("GROUP")then +DCStask=self:GetGroup():TaskAttackGroup(Target,nil,nil,nil,nil,nil,nil,true) +elseif Target:IsInstanceOf("SET_UNIT")then +local DCSTasks={} +for _,_unit in pairs(Target:GetSet())do +local unit=_unit +local task=self:GetGroup():TaskAttackUnit(unit,true) +table.insert(DCSTasks) +end +DCStask=self:GetGroup():TaskCombo(DCSTasks) +elseif Target:IsInstanceOf("SET_GROUP")then +local DCSTasks={} +for _,_unit in pairs(Target:GetSet())do +local unit=_unit +local task=self:GetGroup():TaskAttackGroup(Target,nil,nil,nil,nil,nil,nil,true) +table.insert(DCSTasks) +end +DCStask=self:GetGroup():TaskCombo(DCSTasks) +else +self:T("ERROR: unknown Target in EngageTarget! Needs to be a UNIT, STATIC, GROUP, SET_UNIT or SET_GROUP") +return +end +local Task=self:NewTaskScheduled(DCStask,1,"Engage_Target",0) +Task.backupROE=self:GetROE() +self:SwitchROE(ENUMS.ROE.OpenFire) +local mission=self:GetMissionCurrent() +if mission then +self:PauseMission() +end +self:TaskExecute(Task) +end +function FLIGHTGROUP:onafterDisengage(From,Event,To) +self:T(self.lid.."Disengage target") +end +function FLIGHTGROUP:onbeforeLandAt(From,Event,To,Coordinate,Duration) +return self.isHelo +end +function FLIGHTGROUP:onafterLandAt(From,Event,To,Coordinate,Duration) +self:T(self.lid..string.format("Landing at Coordinate for %s seconds",tostring(Duration))) +Coordinate=Coordinate or self:GetCoordinate() +local DCStask=self.group:TaskLandAtVec2(Coordinate:GetVec2(),Duration) +local Task=self:NewTaskScheduled(DCStask,1,"Task_Land_At",0) +self:TaskExecute(Task) +end +function FLIGHTGROUP:onafterFuelLow(From,Event,To) +local fuel=self:GetFuelMin()or 0 +local text=string.format("Low fuel %d for flight group %s",fuel,self.groupname) +self:T(self.lid..text) +self.fuellow=true +local airbase=self.destbase or self.homebase +if self.fuellowrefuel and self.refueltype then +local tanker=self:FindNearestTanker(50) +if tanker then +self:T(self.lid..string.format("Send to refuel at tanker %s",tanker:GetName())) +local coordinate=self:GetCoordinate():GetIntermediateCoordinate(tanker:GetCoordinate(),0.75) +self:Refuel(coordinate) +return +end +end +if airbase and self.fuellowrtb then +self:T(self.lid.."Calling RTB in onafterFuelLow") +self:RTB(airbase) +end +end +function FLIGHTGROUP:onafterFuelCritical(From,Event,To) +local text=string.format("Critical fuel for flight group %s",self.groupname) +self:T(self.lid..text) +self.fuelcritical=true +local airbase=self.destbase or self.homebase +if airbase and self.fuelcriticalrtb and not self:IsGoing4Fuel()then +self:T(self.lid.."Calling RTB in onafterFuelCritical") +self:RTB(airbase) +end +end +function FLIGHTGROUP._ReachedHolding(group,flightgroup) +flightgroup:T2(flightgroup.lid..string.format("Group reached holding point")) +flightgroup:__Holding(-1) +end +function FLIGHTGROUP._ClearedToLand(group,flightgroup) +flightgroup:T2(flightgroup.lid..string.format("Group was cleared to land")) +flightgroup:__Landing(-1) +end +function FLIGHTGROUP._OnFinal(group,flightgroup) +flightgroup:T2(flightgroup.lid..string.format("Group on final approach")) +local fc=flightgroup.flightcontrol +if fc and fc:IsControlling(flightgroup)then +fc:_FlightOnFinal(flightgroup) +end +end +function FLIGHTGROUP._FinishedRefuelling(group,flightgroup) +flightgroup:T2(flightgroup.lid..string.format("Group finished refueling")) +flightgroup:__Refueled(-1) +end +function FLIGHTGROUP._FinishedWaiting(group,flightgroup) +flightgroup:T(flightgroup.lid..string.format("Group finished waiting")) +flightgroup.Twaiting=nil +flightgroup.dTwait=nil +flightgroup:_CheckGroupDone(0.1) +end +function FLIGHTGROUP:_InitGroup(Template,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,FLIGHTGROUP._InitGroup,self,Template,0) +else +if self.groupinitialized then +self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!") +return +end +local group=self.group +self.isHelo=group:IsHelicopter() +self.speedMax=group:GetSpeedMax() +if self.speedMax and self.speedMax>3.6 then +self.isMobile=true +else +self.isMobile=false +self.speedMax=0 +end +local speedCruiseLimit=self.isHelo and UTILS.KnotsToKmph(110)or UTILS.KnotsToKmph(380) +self.speedCruise=math.min(self.speedMax*0.7,speedCruiseLimit) +self.ammo=self:GetAmmoTot() +local template=Template or self:_GetTemplate() +self.isUncontrolled=template~=nil and template.uncontrolled or false +self.isLateActivated=template~=nil and template.lateActivation or false +if template then +self.radio.Freq=tonumber(template.frequency) +self.radio.Modu=tonumber(template.modulation) +self.radio.On=template.communication +local callsign=template.units[1].callsign +if type(callsign)=="number"then +local cs=tostring(callsign) +callsign={} +callsign[1]=cs:sub(1,1) +callsign[2]=cs:sub(2,2) +callsign[3]=cs:sub(3,3) +end +self.callsign.NumberSquad=tonumber(callsign[1]) +self.callsign.NumberGroup=tonumber(callsign[2]) +self.callsign.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad) +end +if self.isHelo then +self.optionDefault.Formation=ENUMS.Formation.RotaryWing.EchelonLeft.D300 +else +self.optionDefault.Formation=ENUMS.Formation.FixedWing.EchelonLeft.Group +end +if not self.tacanDefault then +self:SetDefaultTACAN(nil,nil,nil,nil,true) +end +if not self.tacan then +self.tacan=UTILS.DeepCopy(self.tacanDefault) +end +self.isAI=not self:_IsHuman(group) +if not self.isAI then +self.menu=self.menu or{} +self.menu.atc=self.menu.atc or{} +self.menu.atc.root=self.menu.atc.root or MENU_GROUP:New(self.group,"ATC") +self.menu.atc.help=self.menu.atc.help or MENU_GROUP:New(self.group,"Help",self.menu.atc.root) +end +local units=self.group:GetUnits() +local dcsgroup=Group.getByName(self.groupname) +local size0=dcsgroup:getInitialSize() +if#units~=size0 then +self:T(self.lid..string.format("ERROR: Got #units=%d but group consists of %d units!",#units,size0)) +end +for _,unit in pairs(units)do +self:_AddElementByName(unit:GetName()) +end +self.groupinitialized=true +end +return self +end +function FLIGHTGROUP:GetHomebaseFromWaypoints() +local wp=self.waypoints0 and self.waypoints0[1]or nil +if wp then +if wp and wp.action and wp.action==COORDINATE.WaypointAction.FromParkingArea +or wp.action==COORDINATE.WaypointAction.FromParkingAreaHot +or wp.action==COORDINATE.WaypointAction.FromRunway then +local airbaseID=nil +if wp.airdromeId then +airbaseID=wp.airdromeId +else +airbaseID=-wp.helipadId +end +local airbase=AIRBASE:FindByID(airbaseID) +return airbase +end +end +return nil +end +function FLIGHTGROUP:FindNearestAirbase(Radius) +local coord=self:GetCoordinate() +local dmin=math.huge +local airbase=nil +for _,_airbase in pairs(AIRBASE.GetAllAirbases())do +local ab=_airbase +local coalitionAB=ab:GetCoalition() +if coalitionAB==self:GetCoalition()or coalitionAB==coalition.side.NEUTRAL then +if airbase then +local d=ab:GetCoordinate():Get2DDistance(coord) +if d<dmin then +d=dmin +airbase=ab +end +end +end +end +return airbase +end +function FLIGHTGROUP:FindNearestTanker(Radius) +Radius=UTILS.NMToMeters(Radius or 50) +if self.refueltype then +local coord=self:GetCoordinate() +local units=coord:ScanUnits(Radius) +local dmin=math.huge +local tanker=nil +for _,_unit in pairs(units.Set)do +local unit=_unit +local istanker,refuelsystem=unit:IsTanker() +if istanker and self.refueltype==refuelsystem and unit:IsAlive()and unit:GetCoalition()==self:GetCoalition()then +local d=unit:GetCoordinate():Get2DDistance(coord) +if d<dmin then +dmin=d +tanker=unit +end +end +end +if tanker then +return tanker:GetGroup() +end +end +return nil +end +function FLIGHTGROUP:GetDestinationFromWaypoints() +local wp=self.waypoints0 and self.waypoints0[#self.waypoints0]or nil +if wp then +if wp and wp.action and wp.action==COORDINATE.WaypointAction.Landing then +local airbaseID=wp.airdromeId or wp.helipadId +local airbase=AIRBASE:FindByID(airbaseID) +return airbase +end +end +return nil +end +function FLIGHTGROUP:IsTakeoffHot() +local wp=self.waypoints0 and self.waypoints0[1]or nil +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.FromParkingAreaHot then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:IsTakeoffCold() +local wp=self.waypoints0 and self.waypoints0[1]or nil +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.FromParkingArea then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:IsTakeoffRunway() +local wp=self.waypoints0 and self.waypoints0[1]or nil +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.FromRunway then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:IsTakeoffAir() +local wp=self.waypoints0 and self.waypoints0[1]or nil +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.TurningPoint or wp.action==COORDINATE.WaypointAction.FlyoverPoint then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:IsLandingAir(wp) +wp=wp or self:GetWaypointFinal() +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.TurningPoint or wp.action==COORDINATE.WaypointAction.FlyoverPoint then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:IsLandingAirbase(wp) +wp=wp or self:GetWaypointFinal() +if wp then +if wp.action and wp.action==COORDINATE.WaypointAction.Landing then +return true +else +return false +end +end +return nil +end +function FLIGHTGROUP:AddWaypoint(Coordinate,Speed,AfterWaypointWithID,Altitude,Updateroute) +local coordinate=self:_CoordinateFromObject(Coordinate) +local wpnumber=self:GetWaypointIndexAfterID(AfterWaypointWithID) +Speed=Speed or self:GetSpeedCruise() +self:T3(self.lid..string.format("Waypoint Speed=%.1f knots",Speed)) +local alttype=COORDINATE.WaypointAltType.BARO +if self.isHelo then +alttype=COORDINATE.WaypointAltType.RADIO +end +local wp=coordinate:WaypointAir(alttype,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,UTILS.KnotsToKmph(Speed),true,nil,{}) +local waypoint=self:_CreateWaypoint(wp) +if Altitude then +waypoint.alt=UTILS.FeetToMeters(Altitude) +end +self:_AddWaypoint(waypoint,wpnumber) +self:T(self.lid..string.format("Adding AIR waypoint #%d, speed=%.1f knots. Last waypoint passed was #%s. Total waypoints #%d",wpnumber,Speed,self.currentwp,#self.waypoints)) +if Updateroute==nil or Updateroute==true then +self:__UpdateRoute(-0.01) +end +return waypoint +end +function FLIGHTGROUP:AddWaypointLanding(Airbase,Speed,AfterWaypointWithID,Altitude,Updateroute) +local wpnumber=self:GetWaypointIndexAfterID(AfterWaypointWithID) +if wpnumber>self.currentwp then +self:_PassedFinalWaypoint(false,"AddWaypointLanding") +end +Speed=Speed or self.speedCruise +local Coordinate=Airbase:GetCoordinate() +local wp=Coordinate:WaypointAir(COORDINATE.WaypointAltType.BARO,COORDINATE.WaypointType.Land,COORDINATE.WaypointAction.Landing,Speed,nil,Airbase,{},"Landing Temp",nil) +local waypoint=self:_CreateWaypoint(wp) +if Altitude then +waypoint.alt=UTILS.FeetToMeters(Altitude) +end +self:_AddWaypoint(waypoint,wpnumber) +self:T(self.lid..string.format("Adding AIR waypoint #%d, speed=%.1f knots. Last waypoint passed was #%s. Total waypoints #%d",wpnumber,Speed,self.currentwp,#self.waypoints)) +if Updateroute==nil or Updateroute==true then +self:__UpdateRoute(-1) +end +return waypoint +end +function FLIGHTGROUP:GetPlayerElement() +for _,_element in pairs(self.elements)do +local element=_element +if not element.ai then +return element +end +end +return nil +end +function FLIGHTGROUP:GetPlayerName() +local playerElement=self:GetPlayerElement() +if playerElement then +return playerElement.playerName +end +return nil +end +function FLIGHTGROUP:_SetElementParkingAt(Element,Spot) +Element.parking=Spot +if Spot then +self:T(self.lid..string.format("Element %s is parking on spot %d",Element.name,Spot.TerminalID)) +local fc=_DATABASE:GetFlightControl(Spot.AirbaseName) +if fc and not self.flightcontrol then +self:SetFlightControl(fc) +end +if self.flightcontrol then +self.flightcontrol:SetParkingOccupied(Element.parking,Element.name) +end +end +end +function FLIGHTGROUP:_SetElementParkingFree(Element) +if Element.parking then +if self.flightcontrol then +self.flightcontrol:SetParkingFree(Element.parking) +end +Element.parking=nil +end +end +function FLIGHTGROUP:_GetOnboardNumber(unitname) +local group=UNIT:FindByName(unitname):GetGroup() +local units=group:GetTemplate().units +local numbers={} +for _,unit in pairs(units)do +if unitname==unit.name then +return tostring(unit.onboard_num) +end +end +return nil +end +function FLIGHTGROUP:_IsHumanUnit(unit) +local playerunit=self:_GetPlayerUnitAndName(unit:GetName()) +if playerunit then +return true +else +return false +end +end +function FLIGHTGROUP:_IsHuman(group) +local units=group:GetUnits() +for _,_unit in pairs(units)do +local human=self:_IsHumanUnit(_unit) +if human then +return true +end +end +return false +end +function FLIGHTGROUP:_GetPlayerUnitAndName(_unitName) +self:F2(_unitName) +if _unitName~=nil then +local DCSunit=Unit.getByName(_unitName) +if DCSunit then +local playername=DCSunit:getPlayerName() +local unit=UNIT:Find(DCSunit) +if DCSunit and unit and playername then +return unit,playername +end +end +end +return nil,nil +end +function FLIGHTGROUP:GetParkingSpot(element,maxdist,airbase) +local coord=element.unit:GetCoordinate() +airbase=airbase or self:GetClosestAirbase() +if airbase==nil then +self:T(self.lid.."No airbase found for element "..element.name) +return nil +end +local parking=airbase.parking +if airbase and airbase:IsShip()then +if#parking>1 then +coord=airbase:GetRelativeCoordinate(coord.x,coord.y,coord.z) +else +coord.x=0 +coord.z=0 +maxdist=500 +end +end +local spot=nil +local dist=nil +local distmin=math.huge +for _,_parking in pairs(parking)do +local parking=_parking +dist=coord:Get2DDistance(parking.Coordinate) +if dist<distmin then +distmin=dist +spot=_parking +end +end +if distmin<=maxdist and not element.unit:InAir()then +return spot +else +return nil +end +end +function FLIGHTGROUP:GetHoldingTime() +if self.Tholding then +return timer.getAbsTime()-self.Tholding +end +return-1 +end +function FLIGHTGROUP:GetParkingTime() +if self.Tparking then +return timer.getAbsTime()-self.Tparking +end +return-1 +end +function FLIGHTGROUP:GetClosestAirbase() +local group=self.group +if group and group:IsAlive()then +local coord=group:GetCoordinate() +local coalition=self:GetCoalition() +if coord then +local airbase=coord:GetClosestAirbase() +return airbase +else +return nil +end +else +return nil +end +end +function FLIGHTGROUP:GetParking(airbase) +local scanradius=50 +local scanunits=true +local scanstatics=true +local scanscenery=false +local verysafe=true +local function _overlap(l1,l2,dist) +local safedist=(l1/2+l2/2)*1.05 +local safe=(dist>safedist) +return safe +end +local function _clients() +local clients=_DATABASE.CLIENTS +local coords={} +for clientname,client in pairs(clients)do +local template=_DATABASE:GetGroupTemplateFromUnitName(clientname) +if template then +local units=template.units +for i,unit in pairs(units)do +local coord=COORDINATE:New(unit.x,unit.alt,unit.y) +coords[unit.name]=coord +end +end +end +return coords +end +local airbasecategory=airbase:GetAirbaseCategory() +local parkingdata=airbase:GetParkingSpotsTable() +local obstacles={} +for _,_parkingspot in pairs(parkingdata)do +local parkingspot=_parkingspot +local _,_,_,_units,_statics,_sceneries=parkingspot.Coordinate:ScanObjects(scanradius,scanunits,scanstatics,scanscenery) +for _,_unit in pairs(_units)do +local unit=_unit +local _coord=unit:GetCoordinate() +local _size=self:_GetObjectSize(unit:GetDCSObject()) +local _name=unit:GetName() +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="unit"}) +end +local clientcoords=_clients() +for clientname,_coord in pairs(clientcoords)do +table.insert(obstacles,{coord=_coord,size=15,name=clientname,type="client"}) +end +for _,static in pairs(_statics)do +local _vec3=static:getPoint() +local _coord=COORDINATE:NewFromVec3(_vec3) +local _name=static:getName() +local _size=self:_GetObjectSize(static) +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="static"}) +end +for _,scenery in pairs(_sceneries)do +local _vec3=scenery:getPoint() +local _coord=COORDINATE:NewFromVec3(_vec3) +local _name=scenery:getTypeName() +local _size=self:_GetObjectSize(scenery) +table.insert(obstacles,{coord=_coord,size=_size,name=_name,type="scenery"}) +end +end +local parking={} +local terminaltype=self:_GetTerminal(self.attribute,airbase:GetAirbaseCategory()) +for i,_element in pairs(self.elements)do +local element=_element +local gotit=false +for _,_parkingspot in pairs(parkingdata)do +local parkingspot=_parkingspot +if AIRBASE._CheckTerminalType(parkingspot.TerminalType,terminaltype)then +local free=true +local problem=nil +if verysafe and parkingspot.TOAC then +free=false +self:T2(self.lid..string.format("Parking spot %d is occupied by other aircraft taking off (TOAC).",parkingspot.TerminalID)) +end +for _,obstacle in pairs(obstacles)do +local dist=parkingspot.Coordinate:Get2DDistance(obstacle.coord) +local safe=_overlap(element.size,obstacle.size,dist) +if not safe then +free=false +problem=obstacle +problem.dist=dist +break +end +end +if self.flightcontrol and self.flightcontrol.airbasename==airbase:GetName()then +local problem=self.flightcontrol:IsParkingReserved(parkingspot)or self.flightcontrol:IsParkingOccupied(parkingspot) +if problem then +free=false +end +end +if free then +table.insert(parking,parkingspot) +self:T2(self.lid..string.format("Parking spot %d is free for element %s!",parkingspot.TerminalID,element.name)) +table.insert(obstacles,{coord=parkingspot.Coordinate,size=element.size,name=element.name,type="element"}) +gotit=true +break +else +self:T2(self.lid..string.format("Parking spot %d is occupied or not big enough!",parkingspot.TerminalID)) +end +end +end +if not gotit then +self:T(self.lid..string.format("WARNING: No free parking spot for element %s",element.name)) +return nil +end +end +return parking +end +function FLIGHTGROUP:_GetObjectSize(DCSobject) +local DCSdesc=DCSobject:getDesc() +if DCSdesc.box then +local x=DCSdesc.box.max.x+math.abs(DCSdesc.box.min.x) +local y=DCSdesc.box.max.y+math.abs(DCSdesc.box.min.y) +local z=DCSdesc.box.max.z+math.abs(DCSdesc.box.min.z) +return math.max(x,z),x,y,z +end +return 0,0,0,0 +end +function FLIGHTGROUP:_GetAttribute() +local attribute=FLIGHTGROUP.Attribute.OTHER +local group=self.group +if group then +local transportplane=group:HasAttribute("Transports")and group:HasAttribute("Planes") +local awacs=group:HasAttribute("AWACS") +local fighter=group:HasAttribute("Fighters")or group:HasAttribute("Interceptors")or group:HasAttribute("Multirole fighters")or(group:HasAttribute("Bombers")and not group:HasAttribute("Strategic bombers")) +local bomber=group:HasAttribute("Strategic bombers") +local tanker=group:HasAttribute("Tankers") +local uav=group:HasAttribute("UAVs") +local transporthelo=group:HasAttribute("Transport helicopters") +local attackhelicopter=group:HasAttribute("Attack helicopters") +if transportplane then +attribute=FLIGHTGROUP.Attribute.AIR_TRANSPORTPLANE +elseif awacs then +attribute=FLIGHTGROUP.Attribute.AIR_AWACS +elseif fighter then +attribute=FLIGHTGROUP.Attribute.AIR_FIGHTER +elseif bomber then +attribute=FLIGHTGROUP.Attribute.AIR_BOMBER +elseif tanker then +attribute=FLIGHTGROUP.Attribute.AIR_TANKER +elseif transporthelo then +attribute=FLIGHTGROUP.Attribute.AIR_TRANSPORTHELO +elseif attackhelicopter then +attribute=FLIGHTGROUP.Attribute.AIR_ATTACKHELO +elseif uav then +attribute=FLIGHTGROUP.Attribute.AIR_UAV +end +end +return attribute +end +function FLIGHTGROUP:_GetTerminal(_attribute,_category) +local _terminal=AIRBASE.TerminalType.OpenBig +if _attribute==FLIGHTGROUP.Attribute.AIR_FIGHTER or _attribute==FLIGHTGROUP.Attribute.AIR_UAV then +_terminal=AIRBASE.TerminalType.FighterAircraft +elseif _attribute==FLIGHTGROUP.Attribute.AIR_BOMBER or _attribute==FLIGHTGROUP.Attribute.AIR_TRANSPORTPLANE or _attribute==FLIGHTGROUP.Attribute.AIR_TANKER or _attribute==FLIGHTGROUP.Attribute.AIR_AWACS then +_terminal=AIRBASE.TerminalType.OpenBig +elseif _attribute==FLIGHTGROUP.Attribute.AIR_TRANSPORTHELO or _attribute==FLIGHTGROUP.Attribute.AIR_ATTACKHELO then +_terminal=AIRBASE.TerminalType.HelicopterUsable +else +end +if _category==Airbase.Category.SHIP then +if not(_attribute==FLIGHTGROUP.Attribute.AIR_TRANSPORTHELO or _attribute==FLIGHTGROUP.Attribute.AIR_ATTACKHELO)then +_terminal=AIRBASE.TerminalType.OpenMedOrBig +end +end +return _terminal +end +function FLIGHTGROUP:_CheckStuck(Despawn) +if not self:IsTaxiing()then +return nil +end +local Tnow=timer.getTime() +local ExpectedSpeed=5 +local speed=self:GetVelocity() +if speed<0.1 then +if ExpectedSpeed>0 and not self.stuckTimestamp then +self:T2(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected",speed,ExpectedSpeed)) +self.stuckTimestamp=Tnow +self.stuckVec3=self:GetVec3() +end +else +self.stuckTimestamp=nil +end +local holdtime=nil +if self.stuckTimestamp then +holdtime=Tnow-self.stuckTimestamp +self:Stuck(holdtime) +if holdtime>=5*60 and holdtime<15*60 then +self:T(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected for %d sec",speed,ExpectedSpeed,holdtime)) +elseif holdtime>=15*60 then +self:T(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected for %d sec",speed,ExpectedSpeed,holdtime)) +local mission=self:GetMissionCurrent() +if mission then +self:T(self.lid..string.format("WARNING: Cancelling mission %s [%s] due to being stuck",mission:GetName(),mission:GetType())) +self:MissionCancel(mission) +end +if self.stuckDespawn then +if self.legion then +self:T(self.lid..string.format("Asset is returned to its legion after being stuck!")) +self:ReturnToLegion() +else +self:T(self.lid..string.format("Despawning group after being stuck!")) +self:Despawn() +end +end +end +end +return holdtime +end +function FLIGHTGROUP:_UpdateMenu(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,FLIGHTGROUP._UpdateMenu,self) +else +local player=self:GetPlayerElement() +if player and player.status~=OPSGROUP.ElementStatus.DEAD then +if self.verbose>=2 then +local text=string.format("Updating MENU: State=%s, ATC=%s [%s]",self:GetState(), +self.flightcontrol and self.flightcontrol.airbasename or"None",self.flightcontrol and self.flightcontrol:GetFlightStatus(self)or"Unknown") +MESSAGE:New(text,5):ToGroup(self.group) +self:T(self.lid..text) +end +local position=self:GetCoordinate(nil,player.name) +local fc={} +for airbasename,_flightcontrol in pairs(_DATABASE.FLIGHTCONTROLS)do +local flightcontrol=_flightcontrol +local coord=flightcontrol:GetCoordinate() +local dist=coord:Get2DDistance(position) +table.insert(fc,{airbasename=airbasename,dist=dist}) +end +local function _sort(a,b) +return a.dist<b.dist +end +table.sort(fc,_sort) +self.menu.atc.root:RemoveSubMenus() +self:_CreateMenuAtcHelp(self.menu.atc.root) +local N=7 +local gotairbase=nil +if self.flightcontrol then +self.flightcontrol:_CreatePlayerMenu(self,self.menu.atc.root) +gotairbase=self.flightcontrol.airbasename +N=N-1 +end +for i=1,math.min(#fc,N)do +local airbasename=fc[i].airbasename +if gotairbase==nil or airbasename~=gotairbase then +local flightcontrol=_DATABASE:GetFlightControl(airbasename) +flightcontrol:_CreatePlayerMenu(self,self.menu.atc.root) +end +end +else +self:E(self.lid.."ERROR: Player dead in update menu!") +end +end +end +function FLIGHTGROUP:_CreateMenuAtcHelp(rootmenu) +local helpmenu=MENU_GROUP:New(self.group,"Help",rootmenu) +local groupname=self.groupname +local skillmenu=MENU_GROUP:New(self.group,"Skill Level",helpmenu) +MENU_GROUP_COMMAND:New(self.group,"Student",skillmenu,self._PlayerSkill,self,FLIGHTGROUP.PlayerSkill.STUDENT) +MENU_GROUP_COMMAND:New(self.group,"Aviator",skillmenu,self._PlayerSkill,self,FLIGHTGROUP.PlayerSkill.AVIATOR) +MENU_GROUP_COMMAND:New(self.group,"Graduate",skillmenu,self._PlayerSkill,self,FLIGHTGROUP.PlayerSkill.GRADUATE) +MENU_GROUP_COMMAND:New(self.group,"Instructor",skillmenu,self._PlayerSkill,self,FLIGHTGROUP.PlayerSkill.INSTRUCTOR) +MENU_GROUP_COMMAND:New(self.group,"Subtitles On/Off",helpmenu,self._PlayerSubtitles,self) +MENU_GROUP_COMMAND:New(self.group,"My Voice On/Off",helpmenu,self._MenuNotImplemented,self,groupname) +MENU_GROUP_COMMAND:New(self.group,"Mark Parking",helpmenu,self._MarkParking,self) +MENU_GROUP_COMMAND:New(self.group,"Update Menu",helpmenu,self._UpdateMenu,self,0) +MENU_GROUP_COMMAND:New(self.group,"My Status",helpmenu,self._PlayerMyStatus,self,groupname) +end +function FLIGHTGROUP:_MenuNotImplemented(groupname) +local flight=_DATABASE:GetOpsGroup(groupname) +if flight then +local text=string.format("Sorry, this feature is not implemented yet!") +MESSAGE:New(text,10,nil,true):ToGroup(flight.group) +end +end +function FLIGHTGROUP:_PlayerMyStatus() +local fc=self.flightcontrol +local playerdata=self:_GetPlayerData() +local playerElement=self:GetPlayerElement() +local text=string.format("My Status:") +text=text..string.format("\nPlayer Name: %s",tostring(playerdata.name)) +text=text..string.format("\nCallsign: %s",tostring(self:GetCallsignName())) +text=text..string.format("\nFlight status: %s",tostring(self:GetState())) +text=text..string.format("\nFlight control: %s [%s]",tostring(fc and fc.airbasename or"N/A"),tostring(fc and fc:GetFlightStatus(self)or"N/A")) +text=text..string.format("\nSubtitles: %s",tostring(playerdata.subtitles)) +text=text..string.format("\nMy Voice: %s",tostring(playerdata.myvoice)) +if fc then +if playerElement.parking then +local spot=fc:GetParkingSpotByID(playerElement.parking.TerminalID) +if spot then +text=text..string.format("\nParking spot: %d [%s]",spot.TerminalID,spot.Status or"Unknown") +end +end +end +MESSAGE:New(text,10,nil,true):ToGroup(self.group) +end +function FLIGHTGROUP:_PlayerSubtitles() +local playerData=self:_GetPlayerData() +if playerData then +playerData.subtitles=not playerData.subtitles +local onoff=playerData.subtitles==true and"ON"or"OFF" +MESSAGE:New(string.format("%s, subtitles are now %s",playerData.name,onoff),10,nil,true):ToGroup(self.group) +else +end +end +function FLIGHTGROUP:_MarkParking() +local playerElement=self:GetPlayerElement() +if playerElement then +local playerName=tostring(playerElement.playerName) +local message=string.format("No assigned parking spot for you could be found, %s",playerName) +if playerElement.parking then +local terminalID=playerElement.parking.TerminalID +local spotStatus=tostring(playerElement.parking.Status) +local text=string.format("Your parking spot, %s\nTerminal ID=%d [%s]",playerName,terminalID,spotStatus) +message=string.format("%s, your parking spot is Terminal ID=%d [%s]. Check the marker on the F10 map.",playerName,terminalID,spotStatus) +playerElement.parking.Coordinate:MarkToGroup(text,self.group) +end +MESSAGE:New(string.format(message,playerName),10):ToGroup(self.group) +end +end +function FLIGHTGROUP:_PlayerSkill(Skill) +local playerData=self:_GetPlayerData() +if playerData then +playerData.skill=Skill +MESSAGE:New(string.format("%s, your skill is %s",playerData.name,tostring(playerData.skill)),10,nil,true):ToGroup(self.group) +else +end +end +function FLIGHTGROUP:_InitPlayerData(PlayerName) +if PlayerName then +local playerData=FLIGHTGROUP.Players[PlayerName] +if not playerData then +local playerData={} +playerData.name=PlayerName +playerData.skill=FLIGHTGROUP.PlayerSkill.STUDENT +playerData.subtitles=true +playerData.myvoice=true +self:T(self.lid..string.format("Init player data for %s",PlayerName)) +FLIGHTGROUP.Players[PlayerName]=playerData +end +return playerData +else +self:E(self.lid..string.format("ERROR: Player name is nil!")) +end +return nil +end +function FLIGHTGROUP:_GetPlayerData() +local playerElement=self:GetPlayerElement() +if playerElement and playerElement.playerName then +return FLIGHTGROUP.Players[playerElement.playerName] +end +return nil +end +function FLIGHTGROUP:_GetDistToParking(Spot,Coordinate) +local dist=99999 +if Spot then +local airbase=AIRBASE:FindByName(Spot.AirbaseName) +if airbase:IsShip()then +local a=airbase:GetVec2() +local b=Spot.Coordinate:GetVec2() +local c=Coordinate:GetVec2() +local t=UTILS.Vec2Substract(c,a) +local unit=UNIT:FindByName(Spot.AirbaseName) +local hdg=unit:GetHeading() +t=UTILS.Vec2Rotate2D(t,-hdg) +dist=UTILS.VecDist2D(b,t) +else +dist=Coordinate:Get2DDistance(Spot.Coordinate) +end +end +return dist +end +FLOTILLA={ +ClassName="FLOTILLA", +verbose=0, +weaponData={}, +} +FLOTILLA.version="0.1.0" +function FLOTILLA:New(TemplateGroupName,Ngroups,FlotillaName) +local self=BASE:Inherit(self,COHORT:New(TemplateGroupName,Ngroups,FlotillaName)) +self:AddMissionCapability(AUFTRAG.Type.NOTHING,50) +self.isNaval=true +self.ammo=self:_CheckAmmo() +return self +end +function FLOTILLA:SetFleet(Fleet) +self.legion=Fleet +return self +end +function FLOTILLA:GetFleet() +return self.legion +end +function FLOTILLA:onafterStart(From,Event,To) +local text=string.format("Starting %s v%s %s",self.ClassName,self.version,self.name) +self:I(self.lid..text) +self:__Status(-1) +end +function FLOTILLA:onafterStatus(From,Event,To) +if self.verbose>=1 then +local fsmstate=self:GetState() +local callsign=self.callsignName and UTILS.GetCallsignName(self.callsignName)or"N/A" +local skill=self.skill and tostring(self.skill)or"N/A" +local NassetsTot=#self.assets +local NassetsInS=self:CountAssets(true) +local NassetsQP=0;local NassetsP=0;local NassetsQ=0 +if self.legion then +NassetsQP,NassetsP,NassetsQ=self.legion:CountAssetsOnMission(nil,self) +end +local text=string.format("%s [Type=%s, Call=%s, Skill=%s]: Assets Total=%d, Stock=%d, Mission=%d [Active=%d, Queue=%d]", +fsmstate,self.aircrafttype,callsign,skill,NassetsTot,NassetsInS,NassetsQP,NassetsP,NassetsQ) +self:T(self.lid..text) +if self.verbose>=3 and self.weaponData then +local text="Weapon Data:" +for bit,_weapondata in pairs(self.weaponData)do +local weapondata=_weapondata +text=text..string.format("\n- Bit=%s: Rmin=%.1f km, Rmax=%.1f km",bit,weapondata.RangeMin/1000,weapondata.RangeMax/1000) +end +self:I(self.lid..text) +end +self:_CheckAssetStatus() +end +if not self:IsStopped()then +self:__Status(-60) +end +end +INTEL={ +ClassName="INTEL", +verbose=0, +lid=nil, +alias=nil, +filterCategory={}, +detectionset=nil, +Contacts={}, +ContactsLost={}, +ContactsUnknown={}, +Clusters={}, +clustercounter=1, +clusterradius=15000, +clusteranalysis=true, +clustermarkers=false, +clusterarrows=false, +prediction=300, +detectStatics=false, +} +INTEL.Ctype={ +GROUND="Ground", +NAVAL="Naval", +AIRCRAFT="Aircraft", +STRUCTURE="Structure" +} +INTEL.version="0.3.6" +function INTEL:New(DetectionSet,Coalition,Alias) +local self=BASE:Inherit(self,FSM:New()) +self.detectionset=DetectionSet or SET_GROUP:New() +if Coalition and type(Coalition)=="string"then +if Coalition=="blue"then +Coalition=coalition.side.BLUE +elseif Coalition=="red"then +Coalition=coalition.side.RED +elseif Coalition=="neutral"then +Coalition=coalition.side.NEUTRAL +else +self:E("ERROR: Unknown coalition in INTEL!") +end +end +self.coalition=Coalition or DetectionSet:CountAlive()>0 and DetectionSet:GetFirst():GetCoalition()or nil +if self.coalition then +local coalitionname=UTILS.GetCoalitionName(self.coalition):lower() +self.detectionset:FilterCoalitions(coalitionname) +end +self.detectionset:FilterOnce() +if Alias then +self.alias=tostring(Alias) +else +self.alias="INTEL SPECTRE" +if self.coalition then +if self.coalition==coalition.side.RED then +self.alias="INTEL KGB" +elseif self.coalition==coalition.side.BLUE then +self.alias="INTEL CIA" +end +end +end +self.DetectVisual=true +self.DetectOptical=true +self.DetectRadar=true +self.DetectIRST=true +self.DetectRWR=true +self.DetectDLINK=true +self.statusupdate=-60 +self.lid=string.format("%s (%s) | ",self.alias,self.coalition and UTILS.GetCoalitionName(self.coalition)or"unknown") +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","Detect","*") +self:AddTransition("*","NewContact","*") +self:AddTransition("*","LostContact","*") +self:AddTransition("*","NewCluster","*") +self:AddTransition("*","LostCluster","*") +self:SetForgetTime() +self:SetAcceptZones() +self:SetRejectZones() +self:SetConflictZones() +return self +end +function INTEL:SetAcceptZones(AcceptZoneSet) +self.acceptzoneset=AcceptZoneSet or SET_ZONE:New() +return self +end +function INTEL:AddAcceptZone(AcceptZone) +self.acceptzoneset:AddZone(AcceptZone) +return self +end +function INTEL:RemoveAcceptZone(AcceptZone) +self.acceptzoneset:Remove(AcceptZone:GetName(),true) +return self +end +function INTEL:SetRejectZones(RejectZoneSet) +self.rejectzoneset=RejectZoneSet or SET_ZONE:New() +return self +end +function INTEL:AddRejectZone(RejectZone) +self.rejectzoneset:AddZone(RejectZone) +return self +end +function INTEL:RemoveRejectZone(RejectZone) +self.rejectzoneset:Remove(RejectZone:GetName(),true) +return self +end +function INTEL:SetConflictZones(ConflictZoneSet) +self.conflictzoneset=ConflictZoneSet or SET_ZONE:New() +return self +end +function INTEL:AddConflictZone(ConflictZone) +self.conflictzoneset:AddZone(ConflictZone) +return self +end +function INTEL:RemoveConflictZone(ConflictZone) +self.conflictzoneset:Remove(ConflictZone:GetName(),true) +return self +end +function INTEL:SetForgetTime(TimeInterval) +return self +end +function INTEL:SetFilterCategory(Categories) +if type(Categories)~="table"then +Categories={Categories} +end +self.filterCategory=Categories +local text="Filter categories: " +for _,category in pairs(self.filterCategory)do +text=text..string.format("%d,",category) +end +self:T(self.lid..text) +return self +end +function INTEL:SetRadarBlur(minheight,thresheight,thresblur,closing) +self.RadarBlur=true +self.RadarBlurMinHeight=minheight or 250 +self.RadarBlurThresHeight=thresheight or 90 +self.RadarBlurThresBlur=thresblur or 85 +self.RadarBlurClosing=closing or 20 +self.RadarBlurClosingSquare=self.RadarBlurClosing*self.RadarBlurClosing +return self +end +function INTEL:SetAcceptRange(Range) +self.RadarAcceptRange=true +self.RadarAcceptRangeKilometers=Range or 75 +return self +end +function INTEL:FilterCategoryGroup(GroupCategories) +if type(GroupCategories)~="table"then +GroupCategories={GroupCategories} +end +self.filterCategoryGroup=GroupCategories +local text="Filter group categories: " +for _,category in pairs(self.filterCategoryGroup)do +text=text..string.format("%d,",category) +end +self:T(self.lid..text) +return self +end +function INTEL:AddAgent(AgentGroup) +if AgentGroup:IsInstanceOf("OPSGROUP")then +AgentGroup=AgentGroup:GetGroup() +end +self.detectionset:AddGroup(AgentGroup,true) +return self +end +function INTEL:SetClusterAnalysis(Switch,Markers,Arrows) +self.clusteranalysis=Switch +self.clustermarkers=Markers +self.clusterarrows=Arrows +return self +end +function INTEL:SetDetectStatics(Switch) +if Switch and Switch==true then +self.detectStatics=true +else +self.detectStatics=false +end +return self +end +function INTEL:SetVerbosity(Verbosity) +self.verbose=Verbosity or 2 +return self +end +function INTEL:AddMissionToContact(Contact,Mission) +if Mission and Contact then +Contact.mission=Mission +end +return self +end +function INTEL:AddMissionToCluster(Cluster,Mission) +if Mission and Cluster then +Cluster.mission=Mission +end +return self +end +function INTEL:SetClusterRadius(radius) +self.clusterradius=(radius or 15)*1000 +return self +end +function INTEL:SetDetectionTypes(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +self.DetectVisual=DetectVisual and true +self.DetectOptical=DetectOptical and true +self.DetectRadar=DetectRadar and true +self.DetectIRST=DetectIRST and true +self.DetectRWR=DetectRWR and true +self.DetectDLINK=DetectDLINK and true +return self +end +function INTEL:GetContactTable() +if self:Is("Running")then +return self.Contacts +else +return nil +end +end +function INTEL:GetClusterTable() +if self:Is("Running")and self.clusteranalysis then +return self.Clusters +else +return nil +end +end +function INTEL:GetContactName(Contact) +return Contact.groupname +end +function INTEL:GetContactGroup(Contact) +return Contact.group +end +function INTEL:GetContactThreatlevel(Contact) +return Contact.threatlevel +end +function INTEL:GetContactTypeName(Contact) +return Contact.typename +end +function INTEL:GetContactCategoryName(Contact) +return Contact.categoryname +end +function INTEL:GetContactCoordinate(Contact) +return Contact.position +end +function INTEL:onafterStart(From,Event,To) +local text=string.format("Starting INTEL v%s",self.version) +self:I(self.lid..text) +self:__Status(-math.random(10)) +return self +end +function INTEL:onafterStatus(From,Event,To) +local fsmstate=self:GetState() +self.ContactsLost={} +self.ContactsUnknown={} +self:UpdateIntel() +local Ncontacts=#self.Contacts +local Nclusters=#self.Clusters +if self.verbose>=1 then +local text=string.format("Status %s [Agents=%s]: Contacts=%d, Clusters=%d, New=%d, Lost=%d",fsmstate,self.detectionset:CountAlive(),Ncontacts,Nclusters,#self.ContactsUnknown,#self.ContactsLost) +self:I(self.lid..text) +end +if self.verbose>=2 and Ncontacts>0 then +local text="Detected Contacts:" +for _,_contact in pairs(self.Contacts)do +local contact=_contact +local dT=timer.getAbsTime()-contact.Tdetected +text=text..string.format("\n- %s (%s): %s, units=%d, T=%d sec",contact.categoryname,contact.attribute,contact.groupname,contact.isStatic and 1 or contact.group:CountAliveUnits(),dT) +if contact.mission then +local mission=contact.mission +text=text..string.format(" mission name=%s type=%s target=%s",mission.name,mission.type,mission:GetTargetName()or"unknown") +end +end +self:I(self.lid..text) +end +self:__Status(self.statusupdate) +return self +end +function INTEL:UpdateIntel() +local DetectedUnits={} +local RecceDetecting={} +for _,_group in pairs(self.detectionset.Set or{})do +local group=_group +if group and group:IsAlive()then +for _,_recce in pairs(group:GetUnits())do +local recce=_recce +self:GetDetectedUnits(recce,DetectedUnits,RecceDetecting,self.DetectVisual,self.DetectOptical,self.DetectRadar,self.DetectIRST,self.DetectRWR,self.DetectDLINK) +end +end +end +local remove={} +for unitname,_unit in pairs(DetectedUnits)do +local unit=_unit +local inconflictzone=false +if self.conflictzoneset:Count()>0 then +for _,_zone in pairs(self.conflictzoneset.Set)do +local zone=_zone +if unit:IsInZone(zone)then +inconflictzone=true +break +end +end +end +if self.acceptzoneset:Count()>0 then +local inzone=false +for _,_zone in pairs(self.acceptzoneset.Set)do +local zone=_zone +if unit:IsInZone(zone)then +inzone=true +break +end +end +if(not inzone)and(not inconflictzone)then +table.insert(remove,unitname) +end +end +if self.rejectzoneset:Count()>0 then +local inzone=false +for _,_zone in pairs(self.rejectzoneset.Set)do +local zone=_zone +if unit:IsInZone(zone)then +inzone=true +break +end +end +if inzone and(not inconflictzone)then +table.insert(remove,unitname) +end +end +if#self.filterCategory>0 and unit:IsInstanceOf("UNIT")then +local unitcategory=unit:GetUnitCategory() +local keepit=false +for _,filtercategory in pairs(self.filterCategory)do +if unitcategory==filtercategory then +keepit=true +break +end +end +if not keepit then +self:T(self.lid..string.format("Removing unit %s category=%d",unitname,unit:GetCategory())) +table.insert(remove,unitname) +end +end +end +for _,unitname in pairs(remove)do +DetectedUnits[unitname]=nil +end +local DetectedGroups={} +local DetectedStatics={} +local RecceGroups={} +for unitname,_unit in pairs(DetectedUnits)do +local unit=_unit +if unit:IsInstanceOf("UNIT")then +local group=unit:GetGroup() +if group then +local groupname=group:GetName() +DetectedGroups[groupname]=group +RecceGroups[groupname]=RecceDetecting[unitname] +end +else +if self.detectStatics then +DetectedStatics[unitname]=unit +RecceGroups[unitname]=RecceDetecting[unitname] +end +end +end +self:CreateDetectedItems(DetectedGroups,DetectedStatics,RecceGroups) +if self.clusteranalysis then +self:PaintPicture() +end +return self +end +function INTEL:_UpdateContact(Contact) +if Contact.isStatic then +else +if Contact.group and Contact.group:IsAlive()then +Contact.Tdetected=timer.getAbsTime() +Contact.position=Contact.group:GetCoordinate() +Contact.velocity=Contact.group:GetVelocityVec3() +Contact.speed=Contact.group:GetVelocityMPS() +if Contact.group:IsAir()then +Contact.altitude=Contact.group:GetAltitude() +local oldheading=Contact.heading or 1 +local newheading=Contact.group:GetHeading() +if newheading==0 then newheading=1 end +local changeh=math.abs(((oldheading-newheading)+360)%360) +Contact.heading=newheading +if changeh>10 then +Contact.maneuvering=true +else +Contact.maneuvering=false +end +end +end +end +return self +end +function INTEL:_CreateContact(Positionable,RecceName) +if Positionable and Positionable:IsAlive()then +local item={} +if Positionable:IsInstanceOf("GROUP")then +local group=Positionable +item.groupname=group:GetName() +item.group=group +item.Tdetected=timer.getAbsTime() +item.typename=group:GetTypeName() +item.attribute=group:GetAttribute() +item.category=group:GetCategory() +item.categoryname=group:GetCategoryName() +item.threatlevel=group:GetThreatLevel() +item.position=group:GetCoordinate() +item.velocity=group:GetVelocityVec3() +item.speed=group:GetVelocityMPS() +item.recce=RecceName +item.isground=group:IsGround()or false +item.isship=group:IsShip()or false +item.isStatic=false +if group:IsAir()then +item.platform=group:GetNatoReportingName() +item.heading=group:GetHeading() +item.maneuvering=false +item.altitude=group:GetAltitude() +else +item.platform="Unknown" +item.altitude=group:GetAltitude(true) +end +if item.category==Group.Category.AIRPLANE or item.category==Group.Category.HELICOPTER then +item.ctype=INTEL.Ctype.AIRCRAFT +elseif item.category==Group.Category.GROUND or item.category==Group.Category.TRAIN then +item.ctype=INTEL.Ctype.GROUND +elseif item.category==Group.Category.SHIP then +item.ctype=INTEL.Ctype.NAVAL +end +return item +elseif Positionable:IsInstanceOf("STATIC")then +local static=Positionable +item.groupname=static:GetName() +item.group=static +item.Tdetected=timer.getAbsTime() +item.typename=static:GetTypeName()or"Unknown" +item.attribute="Static" +item.category=3 +item.categoryname=static:GetCategoryName()or"Unknown" +item.threatlevel=static:GetThreatLevel()or 0 +item.position=static:GetCoordinate() +item.velocity=static:GetVelocityVec3() +item.speed=0 +item.recce=RecceName +item.isground=true +item.isship=false +item.isStatic=true +item.ctype=INTEL.Ctype.STRUCTURE +return item +else +self:E(self.lid..string.format("ERROR: object needs to be a GROUP or STATIC!")) +end +end +return nil +end +function INTEL:CreateDetectedItems(DetectedGroups,DetectedStatics,RecceDetecting) +self:F({RecceDetecting=RecceDetecting}) +local Tnow=timer.getAbsTime() +for groupname,_group in pairs(DetectedGroups)do +local group=_group +self:KnowObject(group,RecceDetecting[groupname]) +end +for staticname,_static in pairs(DetectedStatics)do +local static=_static +self:KnowObject(static,RecceDetecting[staticname]) +end +for i=#self.Contacts,1,-1 do +local item=self.Contacts[i] +if self:_CheckContactLost(item)then +self:LostContact(item) +self:RemoveContact(item) +end +end +return self +end +function INTEL:GetDetectedUnits(Unit,DetectedUnits,RecceDetecting,DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +local reccename=Unit:GetName() +local detectedtargets=Unit:GetDetectedTargets(DetectVisual,DetectOptical,DetectRadar,DetectIRST,DetectRWR,DetectDLINK) +for DetectionObjectID,Detection in pairs(detectedtargets or{})do +local DetectedObject=Detection.object +if DetectedObject and DetectedObject:isExist()and DetectedObject.id_<50000000 then +local status,name=pcall( +function() +local name=DetectedObject:getName() +return name +end) +if status then +local unit=UNIT:FindByName(name) +if unit and unit:IsAlive()then +local DetectionAccepted=true +if self.RadarAcceptRange then +local reccecoord=Unit:GetCoordinate() +local coord=unit:GetCoordinate() +local dist=math.floor(coord:Get2DDistance(reccecoord)/1000) +if dist>self.RadarAcceptRangeKilometers then DetectionAccepted=false end +end +if self.RadarBlur then +local reccecoord=Unit:GetCoordinate() +local coord=unit:GetCoordinate() +local dist=math.floor(coord:Get2DDistance(reccecoord)/1000) +local AGL=unit:GetAltitude(true) +local minheight=self.RadarBlurMinHeight or 250 +local thresheight=self.RadarBlurThresHeight or 90 +local thresblur=self.RadarBlurThresBlur or 85 +if dist<=self.RadarBlurClosing then +thresheight=(((dist*dist)/self.RadarBlurClosingSquare)*thresheight) +thresblur=(((dist*dist)/self.RadarBlurClosingSquare)*thresblur) +end +local fheight=math.floor(math.random(1,10000)/100) +local fblur=math.floor(math.random(1,10000)/100) +if fblur>thresblur then DetectionAccepted=false end +if AGL<=minheight and fheight<thresheight then DetectionAccepted=false end +if self.debug or self.verbose>1 then +MESSAGE:New("Radar Blur",10):ToLogIf(self.debug):ToAllIf(self.verbose>1) +MESSAGE:New("Unit "..name.." is at "..math.floor(AGL).."m. Distance "..math.floor(dist).."km.",10):ToLogIf(self.debug):ToAllIf(self.verbose>1) +MESSAGE:New(string.format("fheight = %d/%d | fblur = %d/%d",fheight,thresheight,fblur,thresblur),10):ToLogIf(self.debug):ToAllIf(self.verbose>1) +MESSAGE:New("Detection Accepted = "..tostring(DetectionAccepted),10):ToLogIf(self.debug):ToAllIf(self.verbose>1) +end +end +if DetectionAccepted then +DetectedUnits[name]=unit +RecceDetecting[name]=reccename +self:T(string.format("Unit %s detect by %s",name,reccename)) +end +else +if self.detectStatics then +local static=STATIC:FindByName(name,false) +if static then +DetectedUnits[name]=static +RecceDetecting[name]=reccename +end +end +end +else +self:T(self.lid..string.format("WARNING: Could not get name of detected object ID=%s! Detected by %s",DetectedObject.id_,reccename)) +end +end +end +end +function INTEL:onafterNewContact(From,Event,To,Contact) +self:F(self.lid..string.format("NEW contact %s",Contact.groupname)) +table.insert(self.ContactsUnknown,Contact) +return self +end +function INTEL:onafterLostContact(From,Event,To,Contact) +self:F(self.lid..string.format("LOST contact %s",Contact.groupname)) +table.insert(self.ContactsLost,Contact) +return self +end +function INTEL:onafterNewCluster(From,Event,To,Cluster) +self:F(self.lid..string.format("NEW cluster #%d [%s] of size %d",Cluster.index,Cluster.ctype,Cluster.size)) +self:_AddCluster(Cluster) +return self +end +function INTEL:onafterLostCluster(From,Event,To,Cluster,Mission) +local text=self.lid..string.format("LOST cluster #%d [%s]",Cluster.index,Cluster.ctype) +if Mission then +local mission=Mission +text=text..string.format(" mission name=%s type=%s target=%s",mission.name,mission.type,mission:GetTargetName()or"unknown") +end +self:T(text) +return self +end +function INTEL:KnowObject(Positionable,RecceName,Tdetected) +local Tnow=timer.getAbsTime() +Tdetected=Tdetected or Tnow +if Positionable and Positionable:IsAlive()then +if Tdetected>Tnow then +self:ScheduleOnce(Tdetected-Tnow,self.KnowObject,self,Positionable,RecceName) +else +local name=Positionable:GetName() +local contact=self:GetContactByName(name) +if contact then +self:_UpdateContact(contact) +else +contact=self:_CreateContact(Positionable,RecceName) +if contact then +self:T(string.format("%s contact detected by %s",contact.groupname,RecceName or"unknown")) +self:AddContact(contact) +self:NewContact(contact) +end +end +end +end +return self +end +function INTEL:GetContactByName(groupname) +for i,_contact in pairs(self.Contacts)do +local contact=_contact +if contact.groupname==groupname then +return contact +end +end +return nil +end +function INTEL:_IsContactKnown(Contact) +for i,_contact in pairs(self.Contacts)do +local contact=_contact +if contact.groupname==Contact.groupname then +return true +end +end +return false +end +function INTEL:AddContact(Contact) +if self:_IsContactKnown(Contact)then +self:E(self.lid..string.format("WARNING: Contact %s is already in the contact table!",tostring(Contact.groupname))) +else +self:T(self.lid..string.format("Adding new Contact %s to table",tostring(Contact.groupname))) +table.insert(self.Contacts,Contact) +end +return self +end +function INTEL:RemoveContact(Contact) +for i,_contact in pairs(self.Contacts)do +local contact=_contact +if contact.groupname==Contact.groupname then +table.remove(self.Contacts,i) +end +end +return self +end +function INTEL:_CheckContactLost(Contact) +if Contact.group==nil or not Contact.group:IsAlive()then +return true +end +if Contact.isStatic then +return false +end +local dT=timer.getAbsTime()-Contact.Tdetected +local dTforget=nil +if Contact.category==Group.Category.GROUND then +dTforget=60*60*2 +elseif Contact.category==Group.Category.AIRPLANE then +dTforget=60*10 +elseif Contact.category==Group.Category.HELICOPTER then +dTforget=60*20 +elseif Contact.category==Group.Category.SHIP then +dTforget=60*60 +elseif Contact.category==Group.Category.TRAIN then +dTforget=60*60 +end +if dT>dTforget then +return true +else +return false +end +end +function INTEL:PaintPicture() +self:F(self.lid.."Painting Picture!") +for _,_contact in pairs(self.ContactsLost)do +local contact=_contact +local cluster=self:GetClusterOfContact(contact) +if cluster then +self:RemoveContactFromCluster(contact,cluster) +end +end +local ClusterSet={} +for _i,_cluster in pairs(self.Clusters)do +local cluster=_cluster +if cluster.size>0 and self:ClusterCountUnits(cluster)>0 then +table.insert(ClusterSet,_cluster) +else +if cluster.marker then +cluster.marker:Remove() +end +if cluster.markerID then +COORDINATE:RemoveMark(cluster.markerID) +end +self:LostCluster(cluster,cluster.mission) +end +end +self.Clusters=ClusterSet +self:_UpdateClusterPositions() +for _,_contact in pairs(self.Contacts)do +local contact=_contact +self:T(string.format("Paint Picture: checking for %s",contact.groupname)) +local currentcluster=self:GetClusterOfContact(contact) +if currentcluster then +local isconnected=self:IsContactConnectedToCluster(contact,currentcluster) +if isconnected then +else +self:RemoveContactFromCluster(contact,currentcluster) +local cluster=self:_GetClosestClusterOfContact(contact) +if cluster then +self:AddContactToCluster(contact,cluster) +else +local newcluster=self:_CreateClusterFromContact(contact) +self:NewCluster(newcluster) +end +end +else +self:T(self.lid..string.format("Paint Picture: contact %s has NO current cluster",contact.groupname)) +local cluster=self:_GetClosestClusterOfContact(contact) +if cluster then +self:T(self.lid..string.format("Paint Picture: contact %s has closest cluster #%d",contact.groupname,cluster.index)) +self:AddContactToCluster(contact,cluster) +else +self:T(self.lid..string.format("Paint Picture: contact %s has no closest cluster ==> Create new cluster",contact.groupname)) +local newcluster=self:_CreateClusterFromContact(contact) +self:NewCluster(newcluster) +end +end +end +self:_UpdateClusterPositions() +if self.clustermarkers then +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +if self.verbose>=1 then +BASE:I("Updating cluster marker and future position") +end +self:UpdateClusterMarker(cluster) +self:CalcClusterFuturePosition(cluster,300) +end +end +return self +end +function INTEL:_CreateCluster() +local cluster={} +cluster.index=self.clustercounter +cluster.coordinate=COORDINATE:New(0,0,0) +cluster.threatlevelSum=0 +cluster.threatlevelMax=0 +cluster.size=0 +cluster.Contacts={} +cluster.altitude=0 +self.clustercounter=self.clustercounter+1 +return cluster +end +function INTEL:_CreateClusterFromContact(Contact) +local cluster=self:_CreateCluster() +self:T(self.lid..string.format("Created NEW cluster #%d with first contact %s",cluster.index,Contact.groupname)) +cluster.coordinate:UpdateFromCoordinate(Contact.position) +cluster.ctype=Contact.ctype +self:AddContactToCluster(Contact,cluster) +return cluster +end +function INTEL:_AddCluster(Cluster) +table.insert(self.Clusters,Cluster) +return self +end +function INTEL:AddContactToCluster(contact,cluster) +if contact and cluster then +table.insert(cluster.Contacts,contact) +cluster.threatlevelSum=cluster.threatlevelSum+contact.threatlevel +cluster.size=cluster.size+1 +self:GetClusterAltitude(cluster,true) +self:T(self.lid..string.format("Adding contact %s to cluster #%d [%s] ==> New size=%d",contact.groupname,cluster.index,cluster.ctype,cluster.size)) +end +return self +end +function INTEL:RemoveContactFromCluster(contact,cluster) +if contact and cluster then +for i=#cluster.Contacts,1,-1 do +local Contact=cluster.Contacts[i] +if Contact.groupname==contact.groupname then +cluster.threatlevelSum=cluster.threatlevelSum-contact.threatlevel +cluster.size=cluster.size-1 +table.remove(cluster.Contacts,i) +self:T(self.lid..string.format("Removing contact %s from cluster #%d ==> New cluster size=%d",contact.groupname,cluster.index,cluster.size)) +return self +end +end +end +return self +end +function INTEL:CalcClusterThreatlevelSum(cluster) +local threatlevel=0 +for _,_contact in pairs(cluster.Contacts)do +local contact=_contact +threatlevel=threatlevel+contact.threatlevel +end +cluster.threatlevelSum=threatlevel +return threatlevel +end +function INTEL:CalcClusterThreatlevelAverage(cluster) +local threatlevel=self:CalcClusterThreatlevelSum(cluster) +threatlevel=threatlevel/cluster.size +cluster.threatlevelAve=threatlevel +return threatlevel +end +function INTEL:CalcClusterThreatlevelMax(cluster) +local threatlevel=0 +for _,_contact in pairs(cluster.Contacts)do +local contact=_contact +if contact.threatlevel>threatlevel then +threatlevel=contact.threatlevel +end +end +cluster.threatlevelMax=threatlevel +return threatlevel +end +function INTEL:CalcClusterDirection(cluster) +local direction=0 +local speedsum=0 +local n=0 +for _,_contact in pairs(cluster.Contacts)do +local contact=_contact +if(not contact.isStatic)and contact.group:IsAlive()then +local speed=contact.group:GetVelocityKNOTS() +direction=direction+(contact.group:GetHeading()*speed) +n=n+1 +speedsum=speedsum+speed +end +end +if n==0 then +return 0 +else +return math.floor(direction/(speedsum*n)) +end +end +function INTEL:CalcClusterSpeed(cluster) +local velocity=0;local n=0 +for _,_contact in pairs(cluster.Contacts)do +local contact=_contact +if(not contact.isStatic)and contact.group:IsAlive()then +velocity=velocity+contact.group:GetVelocityMPS() +n=n+1 +end +end +if n==0 then +return 0 +else +return math.floor(velocity/n) +end +end +function INTEL:CalcClusterVelocityVec3(cluster) +local v={x=0,y=0,z=0} +for _,_contact in pairs(cluster.Contacts)do +local contact=_contact +if(not contact.isStatic)and contact.group:IsAlive()then +local vec=contact.group:GetVelocityVec3() +v.x=v.x+vec.x +v.y=v.y+vec.y +v.z=v.y+vec.z +end +end +return v +end +function INTEL:CalcClusterFuturePosition(cluster,seconds) +local p=self:GetClusterCoordinate(cluster) +local v=self:CalcClusterVelocityVec3(cluster) +local t=seconds or self.prediction +local Vec3={x=p.x+v.x*t,y=p.y+v.y*t,z=p.z+v.z*t} +local futureposition=COORDINATE:NewFromVec3(Vec3) +if self.clustermarkers and self.clusterarrows then +if cluster.markerID then +COORDINATE:RemoveMark(cluster.markerID) +end +cluster.markerID=p:ArrowToAll(futureposition,self.coalition,{1,0,0},1,{1,1,0},0.5,2,true,"Position Calc") +end +return futureposition +end +function INTEL:CheckContactInClusters(contact) +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +for _,_contact in pairs(cluster.Contacts)do +local Contact=_contact +if Contact.groupname==contact.groupname then +return true +end +end +end +return false +end +function INTEL:IsContactConnectedToCluster(contact,cluster) +if contact.ctype~=cluster.ctype then +return false,math.huge +end +for _,_contact in pairs(cluster.Contacts)do +local Contact=_contact +if Contact.groupname~=contact.groupname or cluster.size==1 then +local dist=Contact.position:DistanceFromPointVec2(contact.position) +local airprox=true +if contact.ctype==INTEL.Ctype.AIRCRAFT then +self:T(string.format("Cluster Alt=%d | Contact Alt=%d",cluster.altitude,contact.altitude)) +local adist=math.abs(cluster.altitude-contact.altitude) +if adist>UTILS.FeetToMeters(10000)then +airprox=false +end +end +if dist<self.clusterradius and airprox then +return true,dist +end +end +end +return false +end +function INTEL:IsContactPartOfAnyClusters(contact) +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +if self:IsContactConnectedToCluster(contact,cluster)then +return cluster +end +end +return nil +end +function INTEL:_GetDistContactToCluster(Contact,Cluster) +local distmin=math.huge +for _,_contact in pairs(Cluster.Contacts)do +local contact=_contact +if contact.group and contact.group:IsAlive()and Contact.groupname~=contact.groupname then +local dist=Contact.position:Get2DDistance(contact.position) +if dist<distmin then +distmin=dist +end +end +end +return distmin +end +function INTEL:_GetClosestClusterOfContact(Contact) +local Cluster=nil +local distmin=self.clusterradius +if not Contact.altitude then +Contact.altitude=Contact.group:GetAltitude() +end +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +if cluster.ctype==Contact.ctype then +local dist=self:_GetDistContactToCluster(Contact,cluster) +local airprox=true +if Contact.ctype==INTEL.Ctype.AIRCRAFT then +if not cluster.altitude then +cluster.altitude=self:GetClusterAltitude(cluster,true) +end +local adist=math.abs(cluster.altitude-Contact.altitude) +self:T(string.format("Cluster Alt=%d | Contact Alt=%d",cluster.altitude,Contact.altitude)) +if adist>UTILS.FeetToMeters(10000)then +airprox=false +end +end +if dist<distmin and airprox then +Cluster=cluster +distmin=dist +end +end +end +return Cluster,distmin +end +function INTEL:GetClusterOfContact(contact) +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +for _,_contact in pairs(cluster.Contacts)do +local Contact=_contact +if Contact.groupname==contact.groupname then +return cluster +end +end +end +return nil +end +function INTEL:GetClusterAltitude(Cluster,Update) +local newalt=0 +local n=0 +for _,_contact in pairs(Cluster.Contacts)do +local contact=_contact +if contact.altitude then +newalt=newalt+contact.altitude +n=n+1 +end +end +local avgalt=0 +if n>0 then +avgalt=newalt/n +end +Cluster.altitude=avgalt +self:T(string.format("Updating Cluster Altitude: %d",Cluster.altitude)) +return Cluster.altitude +end +function INTEL:GetClusterCoordinate(Cluster,Update) +local x=0;local y=0;local z=0;local n=0 +for _,_contact in pairs(Cluster.Contacts)do +local contact=_contact +local vec3=nil +if Update and contact.group and contact.group:IsAlive()then +vec3=contact.group:GetVec3() +end +if not vec3 then +vec3=contact.position +end +if vec3 then +x=x+vec3.x +y=y+vec3.y +z=z+vec3.z +n=n+1 +end +end +if n>0 then +local Vec3={x=x/n,y=y/n,z=z/n} +Cluster.coordinate:UpdateFromVec3(Vec3) +end +return Cluster.coordinate +end +function INTEL:_CheckClusterCoordinateChanged(Cluster,Coordinate,Threshold) +Threshold=Threshold or 100 +Coordinate=Coordinate or Cluster.coordinate +local a=Coordinate:GetVec3() +local b=self:GetClusterCoordinate(Cluster,true):GetVec3() +local dist=UTILS.VecDist3D(a,b) +if dist>Threshold then +return true +else +return false +end +end +function INTEL:_UpdateClusterPositions() +for _,_cluster in pairs(self.Clusters)do +local cluster=_cluster +local coord=self:GetClusterCoordinate(cluster,true) +local alt=self:GetClusterAltitude(cluster,true) +self:T(self.lid..string.format("Updating Cluster position size: %s",cluster.size)) +end +return self +end +function INTEL:ContactCountUnits(Contact) +if Contact.isStatic then +if Contact.group and Contact.group:IsAlive()then +return 1 +else +return 0 +end +else +if Contact.group then +local n=Contact.group:CountAliveUnits() +return n +else +return 0 +end +end +end +function INTEL:ClusterCountUnits(Cluster) +local unitcount=0 +for _,_contact in pairs(Cluster.Contacts)do +local contact=_contact +unitcount=unitcount+self:ContactCountUnits(contact) +end +return unitcount +end +function INTEL:UpdateClusterMarker(cluster) +local unitcount=self:ClusterCountUnits(cluster) +local text=string.format("Cluster #%d: %s\nSize %d\nUnits %d\nTLsum=%d",cluster.index,cluster.ctype,cluster.size,unitcount,cluster.threatlevelSum) +if not cluster.marker then +cluster.marker=MARKER:New(cluster.coordinate,text):ToCoalition(self.coalition) +else +local refresh=false +if cluster.marker.text~=text then +cluster.marker.text=text +refresh=true +end +local coordchange=self:_CheckClusterCoordinateChanged(cluster,cluster.marker.coordinate) +if coordchange then +cluster.marker.coordinate:UpdateFromCoordinate(cluster.coordinate) +refresh=true +end +if refresh then +cluster.marker:Refresh() +end +end +return self +end +function INTEL:GetHighestThreatContact(Cluster) +local threatlevel=-1 +local rcontact=nil +for _,_contact in pairs(Cluster.Contacts)do +local contact=_contact +if contact.threatlevel>threatlevel then +threatlevel=contact.threatlevel +rcontact=contact +end +end +return rcontact +end +INTEL_DLINK={ +ClassName="INTEL_DLINK", +verbose=0, +lid=nil, +alias=nil, +cachetime=120, +interval=20, +contacts={}, +clusters={}, +contactcoords={}, +} +INTEL_DLINK.version="0.0.2" +function INTEL_DLINK:New(Intels,Alias,Interval,Cachetime) +local self=BASE:Inherit(self,FSM:New()) +self.intels=Intels or{} +self.contacts={} +self.clusters={} +self.contactcoords={} +if Alias then +self.alias=tostring(Alias) +else +self.alias="SPECTRE" +end +self.interval=Interval or 20 +self.lid=string.format("INTEL_DLINK %s | ",self.alias) +self:SetDLinkCacheTime(Cachetime or 120) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Collect","*") +self:AddTransition("*","Collected","*") +self:AddTransition("*","Stop","Stopped") +return self +end +function INTEL_DLINK:AddIntel(Intel) +self:T(self.lid.."AddIntel") +if Intel then +table.insert(self.intels,Intel) +end +return self +end +function INTEL_DLINK:onafterStart(From,Event,To) +self:T({From,Event,To}) +local text=string.format("Version %s started.",self.version) +self:I(self.lid..text) +self:__Collect(-math.random(1,10)) +return self +end +function INTEL_DLINK:SetDLinkCacheTime(seconds) +self.cachetime=math.abs(seconds or 120) +self:I(self.lid.."Caching for "..self.cachetime.." seconds.") +return self +end +function INTEL_DLINK:onbeforeCollect(From,Event,To) +self:T({From,Event,To}) +self:T("Contacts Data Gathering") +local newcontacts={} +local intels=self.intels +for _,_intel in pairs(intels)do +_intel=_intel +if _intel:Is("Running")then +local ctable=_intel:GetContactTable()or{} +for _,_contact in pairs(ctable)do +local _ID=string.format("%s-%d",_contact.groupname,_contact.Tdetected) +self:T(string.format("Adding %s",_ID)) +newcontacts[_ID]=_contact +end +end +end +self:T("Cleanup") +local contacttable={} +local coordtable={} +local TNow=timer.getAbsTime() +local Tcache=self.cachetime +for _ind,_contact in pairs(newcontacts)do +if TNow-_contact.Tdetected<Tcache then +if(not contacttable[_contact.groupname])or(contacttable[_contact.groupname]and contacttable[_contact.groupname].Tdetected<_contact.Tdetected)then +self:T(string.format("Adding %s",_contact.groupname)) +contacttable[_contact.groupname]=_contact +table.insert(coordtable,_contact.position) +end +end +end +self:T("Clusters Data Gathering") +local newclusters={} +local intels=self.intels +for _,_intel in pairs(intels)do +_intel=_intel +if _intel:Is("Running")then +local ctable=_intel:GetClusterTable()or{} +for _,_cluster in pairs(ctable)do +local _ID=string.format("%s-%d",_intel.alias,_cluster.index) +self:T(string.format("Adding %s",_ID)) +table.insert(newclusters,_cluster) +end +end +end +self.contacts=contacttable +self.contactcoords=coordtable +self.clusters=newclusters +self:__Collected(1,contacttable,newclusters) +local interv=self.interval*-1 +self:__Collect(interv) +return self +end +function INTEL_DLINK:onbeforeCollected(From,Event,To,Contacts,Clusters) +self:T({From,Event,To}) +return self +end +function INTEL_DLINK:onafterStop(From,Event,To) +self:T({From,Event,To}) +local text=string.format("Version %s stopped.",self.version) +self:I(self.lid..text) +return self +end +function INTEL_DLINK:GetContactTable() +self:T(self.lid.."GetContactTable") +return self.contacts +end +function INTEL_DLINK:GetClusterTable() +self:T(self.lid.."GetClusterTable") +return self.clusters +end +function INTEL_DLINK:GetDetectedItemCoordinates() +self:T(self.lid.."GetDetectedItemCoordinates") +return self.contactcoords +end +LEGION={ +ClassName="LEGION", +verbose=0, +lid=nil, +missionqueue={}, +transportqueue={}, +cohorts={}, +} +LEGION.RandomAssetScore=1 +LEGION.version="0.5.1" +function LEGION:New(WarehouseName,LegionName) +local self=BASE:Inherit(self,WAREHOUSE:New(WarehouseName,LegionName)) +if not self then +BASE:E(string.format("ERROR: Could not find warehouse %s!",WarehouseName)) +return nil +end +self.lid=string.format("LEGION %s | ",self.alias) +self:SetMarker(false) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.Dead) +self:AddTransition("*","MissionRequest","*") +self:AddTransition("*","MissionCancel","*") +self:AddTransition("*","MissionAssign","*") +self:AddTransition("*","TransportRequest","*") +self:AddTransition("*","TransportCancel","*") +self:AddTransition("*","TransportAssign","*") +self:AddTransition("*","OpsOnMission","*") +self:AddTransition("*","LegionAssetReturned","*") +return self +end +function LEGION:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function LEGION:SetTacticalOverviewOn() +self.tacview=true +return self +end +function LEGION:AddMission(Mission) +Mission:Queued() +Mission:SetLegionStatus(self,AUFTRAG.Status.QUEUED) +Mission:AddLegion(self) +if Mission.type==AUFTRAG.Type.ALERT5 then +Mission:_TargetFromObject(self:GetCoordinate()) +end +table.insert(self.missionqueue,Mission) +local text=string.format("Added mission %s (type=%s). Starting at %s. Stopping at %s", +tostring(Mission.name),tostring(Mission.type),UTILS.SecondsToClock(Mission.Tstart,true),Mission.Tstop and UTILS.SecondsToClock(Mission.Tstop,true)or"INF") +self:T(self.lid..text) +return self +end +function LEGION:RemoveMission(Mission) +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==Mission.auftragsnummer then +mission:RemoveLegion(self) +table.remove(self.missionqueue,i) +break +end +end +return self +end +function LEGION:AddOpsTransport(OpsTransport) +OpsTransport:Queued() +OpsTransport:SetLegionStatus(self,AUFTRAG.Status.QUEUED) +table.insert(self.transportqueue,OpsTransport) +OpsTransport:AddLegion(self) +local text=string.format("Added Transport %s. Starting at %s-%s", +tostring(OpsTransport.uid),UTILS.SecondsToClock(OpsTransport.Tstart,true),OpsTransport.Tstop and UTILS.SecondsToClock(OpsTransport.Tstop,true)or"INF") +self:T(self.lid..text) +return self +end +function LEGION:AddCohort(Cohort) +if self:IsCohort(Cohort.name)then +self:E(self.lid..string.format("ERROR: A cohort with name %s already exists in this legion. Cohorts must have UNIQUE names!")) +else +table.insert(self.cohorts,Cohort) +end +return self +end +function LEGION:DelCohort(Cohort) +for i=#self.cohorts,1,-1 do +local cohort=self.cohorts[i] +if cohort.name==Cohort.name then +self:T(self.lid..string.format("Removing Cohort %s",tostring(cohort.name))) +table.remove(self.cohorts,i) +end +end +return self +end +function LEGION:DelAsset(Asset) +if Asset.cohort then +Asset.cohort:DelAsset(Asset) +else +self:E(self.lid..string.format("ERROR: Asset has not cohort attached. Cannot remove it from legion!")) +end +return self +end +function LEGION:RelocateCohort(Cohort,Legion,Delay,NcarriersMin,NcarriersMax,TransportLegions) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,LEGION.RelocateCohort,self,Cohort,Legion,0,NcarriersMin,NcarriersMax,TransportLegions) +else +if Legion:IsCohort(Cohort.name)then +self:E(self.lid..string.format("ERROR: Cohort %s is already part of new legion %s ==> CANNOT Relocate!",Cohort.name,Legion.alias)) +return self +else +table.insert(Legion.cohorts,Cohort) +end +if not self:IsCohort(Cohort.name)then +self:E(self.lid..string.format("ERROR: Cohort %s is NOT part of this legion %s ==> CANNOT Relocate!",Cohort.name,self.alias)) +return self +end +if self.alias==Legion.alias then +self:E(self.lid..string.format("ERROR: old legion %s is same as new legion %s ==> CANNOT Relocate!",self.alias,Legion.alias)) +return self +end +Cohort:Relocate() +local mission=AUFTRAG:_NewRELOCATECOHORT(Legion,Cohort) +if false then +mission:_AddAssets(Cohort.assets) +self:I(self.lid..string.format("Relocating Cohort %s [nassets=%d] to legion %s",Cohort.name,#Cohort.assets,Legion.alias)) +self:MissionAssign(mission,{self}) +else +mission:AssignCohort(Cohort) +mission:SetRequiredAssets(#Cohort.assets) +if NcarriersMin and NcarriersMin>0 then +mission:SetRequiredTransport(Legion.spawnzone,NcarriersMin,NcarriersMax) +end +if TransportLegions then +for _,legion in pairs(TransportLegions)do +mission:AssignTransportLegion(legion) +end +end +mission:SetMissionRange(10000) +self:AddMission(mission) +end +end +return self +end +function LEGION:_GetCohort(CohortName) +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +if cohort.name==CohortName then +return cohort +end +end +return nil +end +function LEGION:IsCohort(CohortName) +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +if cohort.name==CohortName then +return true +end +end +return false +end +function LEGION:GetName() +return self.alias +end +function LEGION:_GetCohortOfAsset(Asset) +local cohort=self:_GetCohort(Asset.squadname) +return cohort +end +function LEGION:IsBrigade() +local is=self.ClassName==BRIGADE.ClassName +return is +end +function LEGION:IsAirwing() +local is=self.ClassName==AIRWING.ClassName +return is +end +function LEGION:IsFleet() +local is=self.ClassName==FLEET.ClassName +return is +end +function LEGION:onafterStart(From,Event,To) +self:GetParent(self,LEGION).onafterStart(self,From,Event,To) +self:T3(self.lid..string.format("Starting LEGION v%s",LEGION.version)) +end +function LEGION:CheckMissionQueue() +local Nmissions=#self.missionqueue +if Nmissions==0 then +return nil +end +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and mission:IsReadyToCancel()then +mission:Cancel() +end +local TNow=timer.getTime() +if mission:IsOver()and mission:IsNotRepeatable()and mission.DeletionTimstamp==nil then +mission.DeletionTimstamp=TNow +end +if mission.DeletionTimstamp~=nil and TNow-mission.DeletionTimstamp>1800 then +mission=nil +end +end +if self:IsAirwing()then +if self:IsRunwayOperational()==false then +return nil +end +local airboss=self.airboss +if airboss then +if not airboss:IsIdle()then +return nil +end +end +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.Tstart<taskB.Tstart) +end +table.sort(self.missionqueue,_sort) +local vip=math.huge +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.importance and mission.importance<vip then +vip=mission.importance +end +end +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +local reinforce=false +if mission:IsExecuting()and mission.reinforce and mission.reinforce>0 then +local N=mission.Nassigned-mission.Ndead +if N<mission.NassetsMin then +reinforce=true +end +self:T(self.lid..string.format("Checking Reinforcement Nreinf=%d, Nops=%d, Nassigned=%d, Ndead=%d, Nmin=%d ==> Reinforce=%s", +mission.reinforce,N,mission.Nassigned,mission.Ndead,mission.NassetsMin,tostring(reinforce))) +end +if(mission:IsQueued(self)or reinforce)and mission:IsReadyToGo()and(mission.importance==nil or mission.importance<=vip)then +local recruited,assets,legions=self:RecruitAssetsForMission(mission) +if recruited then +local EscortAvail=self:RecruitAssetsForEscort(mission,assets) +local TransportAvail=true +if EscortAvail then +local Transport=nil +if mission.NcarriersMin then +local Legions=mission.transportLegions or{self} +TransportAvail,Transport=self:AssignAssetsForTransport(Legions,assets,mission.NcarriersMin,mission.NcarriersMax,mission.transportDeployZone,mission.transportDisembarkZone,mission.carrierCategories,mission.carrierAttributes,mission.carrierProperties) +end +if TransportAvail and Transport then +mission.opstransport=Transport +end +end +if EscortAvail and TransportAvail then +self:MissionRequest(mission,assets) +if reinforce then +mission.reinforce=mission.reinforce-#assets +self:T(self.lid..string.format("Reinforced with N=%d Nreinforce=%d",#assets,mission.reinforce)) +end +return true +else +LEGION.UnRecruitAssets(assets,mission) +end +end +end +end +return nil +end +function LEGION:CheckTransportQueue() +local Ntransports=#self.transportqueue +if Ntransports==0 then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.Tstart<taskB.Tstart) +end +table.sort(self.transportqueue,_sort) +local vip=math.huge +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport.importance and transport.importance<vip then +vip=transport.importance +end +end +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport:IsQueued(self)and transport:IsReadyToGo()and(transport.importance==nil or transport.importance<=vip)then +local recruited,assets,_=self:RecruitAssetsForTransport(transport) +if recruited then +for _,_asset in pairs(assets)do +local asset=_asset +transport:AddAsset(asset) +end +self:TransportRequest(transport) +return true +end +end +end +return nil +end +function LEGION:onafterMissionAssign(From,Event,To,Mission,Legions) +for _,_Legion in pairs(Legions)do +local Legion=_Legion +self:T(self.lid..string.format("Assigning mission %s (%s) to legion %s",Mission.name,Mission.type,Legion.alias)) +Legion:AddMission(Mission) +Legion:MissionRequest(Mission) +end +end +function LEGION:_AddRequest(AssetDescriptor,AssetDescriptorValue,nAsset,Prio,Assignment) +nAsset=nAsset or 1 +Prio=Prio or 50 +self.queueid=self.queueid+1 +local request={ +uid=self.queueid, +prio=Prio, +warehouse=self, +assetdesc=AssetDescriptor, +assetdescval=AssetDescriptorValue, +nasset=nAsset, +transporttype=WAREHOUSE.TransportType.SELFPROPELLED, +ntransport=0, +assignment=tostring(Assignment), +airbase=self:GetAirbase(), +category=self:GetAirbaseCategory(), +ndelivered=0, +ntransporthome=0, +assets={}, +toself=true, +} +table.insert(self.queue,request) +local descval="assetlist" +if request.assetdesc==WAREHOUSE.Descriptor.ASSETLIST then +else +descval=tostring(request.assetdescval) +end +local text=string.format("Warehouse %s: New request from warehouse %s.\nDescriptor %s=%s, #assets=%s; Transport=%s, #transports=%s.", +self.alias,self.alias,request.assetdesc,descval,tostring(request.nasset),request.transporttype,tostring(request.ntransport)) +self:_DebugMessage(text,5) +return request +end +function LEGION:onafterMissionRequest(From,Event,To,Mission,Assets) +self:T(self.lid..string.format("MissionRequest for mission %s [%s]",Mission:GetName(),Mission:GetType())) +Assets=Assets or Mission.assets +Mission:Requested() +Mission:SetLegionStatus(self,AUFTRAG.Status.REQUESTED) +local Assetlist={} +for _,_asset in pairs(Assets)do +local asset=_asset +if asset.wid==self.uid then +if asset.spawned then +if asset.flightgroup and not asset.flightgroup:IsMissionInQueue(Mission)then +asset.flightgroup:AddMission(Mission) +local currM=asset.flightgroup:GetMissionCurrent() +if currM then +local cancel=false +local pause=false +if(currM.type==AUFTRAG.Type.GCICAP or currM.type==AUFTRAG.Type.PATROLRACETRACK)and Mission.type==AUFTRAG.Type.INTERCEPT then +pause=true +elseif(currM.type==AUFTRAG.Type.ONGUARD or currM.type==AUFTRAG.Type.PATROLZONE)and(Mission.type==AUFTRAG.Type.ARTY or Mission.type==AUFTRAG.Type.GROUNDATTACK)then +pause=true +elseif currM.type==AUFTRAG.Type.NOTHING then +pause=true +end +if currM.type==AUFTRAG.Type.ALERT5 then +cancel=true +end +if Mission.type==AUFTRAG.Type.RELOCATECOHORT then +cancel=true +local request=currM:_GetRequest(self) +if request then +self:T2(self.lid.."Removing group from cargoset") +request.cargogroupset:Remove(asset.spawngroupname,true) +else +self:E(self.lid.."ERROR: no request for spawned asset!") +end +end +if cancel then +self:T(self.lid..string.format("Cancel current mission %s [%s] to send group on mission %s [%s]",currM.name,currM.type,Mission.name,Mission.type)) +asset.flightgroup:MissionCancel(currM) +elseif pause then +self:T(self.lid..string.format("Pausing current mission %s [%s] to send group on mission %s [%s]",currM.name,currM.type,Mission.name,Mission.type)) +asset.flightgroup:PauseMission() +end +asset.isReserved=false +end +Mission:AddAsset(asset) +self:__OpsOnMission(2,asset.flightgroup,Mission) +else +self:T(self.lid.."ERROR: OPSGROUP for asset does NOT exist but it seems to be SPAWNED (asset.spawned=true)!") +end +else +table.insert(Assetlist,asset) +end +end +end +if#Assetlist>0 then +for i,_asset in pairs(Assetlist)do +local asset=_asset +asset.requested=true +if asset.spawned then +asset.requested=false +end +asset.isReserved=false +if Mission.missionTask then +asset.missionTask=Mission.missionTask +end +if Mission.type==AUFTRAG.Type.ALERT5 then +asset.takeoffType=COORDINATE.WaypointType.TakeOffParking +end +Mission:AddAsset(asset) +end +local assignment=string.format("Mission-%d",Mission.auftragsnummer) +local request=self:_AddRequest(WAREHOUSE.Descriptor.ASSETLIST,Assetlist,#Assetlist,Mission.prio,assignment) +self:T(self.lid..string.format("Added request=%d for Nasssets=%d",request.uid,#Assetlist)) +Mission:_SetRequestID(self,self.queueid) +self:T(self.lid..string.format("Mission %s [%s] got Request ID=%d",Mission:GetName(),Mission:GetType(),self.queueid)) +if request then +if self:IsShip()then +self:T(self.lid.."Warehouse physical structure is SHIP. Requestes assets will be late activated!") +request.lateActivation=true +end +end +end +end +function LEGION:onafterTransportAssign(From,Event,To,Transport,Legions) +for _,_Legion in pairs(Legions)do +local Legion=_Legion +self:T(self.lid..string.format("Assigning transport %d to legion %s",Transport.uid,Legion.alias)) +Legion:AddOpsTransport(Transport) +Legion:TransportRequest(Transport) +end +end +function LEGION:onafterTransportRequest(From,Event,To,OpsTransport) +local AssetList={} +for i,_asset in pairs(OpsTransport.assets)do +local asset=_asset +if asset.wid==self.uid then +asset.requested=true +asset.isReserved=false +asset.missionTask=ENUMS.MissionTask.TRANSPORT +table.insert(AssetList,asset) +end +end +if#AssetList>0 then +OpsTransport:Requested() +OpsTransport:SetLegionStatus(self,OPSTRANSPORT.Status.REQUESTED) +local assignment=string.format("Transport-%d",OpsTransport.uid) +self:_AddRequest(WAREHOUSE.Descriptor.ASSETLIST,AssetList,#AssetList,OpsTransport.prio,assignment) +OpsTransport.requestID[self.alias]=self.queueid +end +end +function LEGION:onafterTransportCancel(From,Event,To,Transport) +self:T(self.lid..string.format("Cancel transport UID=%d",Transport.uid)) +Transport:SetLegionStatus(self,OPSTRANSPORT.Status.CANCELLED) +for i=#Transport.assets,1,-1 do +local asset=Transport.assets[i] +if asset.wid==self.uid then +local opsgroup=asset.flightgroup +if opsgroup then +opsgroup:TransportCancel(Transport) +end +local cargos=Transport:GetCargoOpsGroups(false) +for _,_cargo in pairs(cargos)do +local cargo=_cargo +cargo:_DelMyLift(Transport) +local legion=cargo.legion +if legion then +legion:T(self.lid..string.format("Adding cargo group %s back to legion",cargo:GetName())) +legion:__AddAsset(0.1,cargo.group,1) +end +end +Transport:DelAsset(asset) +asset.requested=nil +asset.isReserved=nil +end +end +if Transport.requestID[self.alias]then +self:_DeleteQueueItemByID(Transport.requestID[self.alias],self.queue) +end +end +function LEGION:onafterMissionCancel(From,Event,To,Mission) +self:T(self.lid..string.format("Cancel mission %s",Mission.name)) +Mission:SetLegionStatus(self,AUFTRAG.Status.CANCELLED) +for i=#Mission.assets,1,-1 do +local asset=Mission.assets[i] +if asset.wid==self.uid then +local opsgroup=asset.flightgroup +if opsgroup then +opsgroup:MissionCancel(Mission) +end +Mission:DelAsset(asset) +asset.requested=nil +asset.isReserved=nil +end +end +local requestID=Mission:_GetRequestID(self) +if requestID then +self:_DeleteQueueItemByID(requestID,self.queue) +end +end +function LEGION:onafterOpsOnMission(From,Event,To,OpsGroup,Mission) +self:T2(self.lid..string.format("Group %s on mission %s [%s]",OpsGroup:GetName(),Mission:GetName(),Mission:GetType())) +if self:IsAirwing()then +self:FlightOnMission(OpsGroup,Mission) +elseif self:IsBrigade()then +self:ArmyOnMission(OpsGroup,Mission) +else +self:NavyOnMission(OpsGroup,Mission) +end +if self:IsBrigade()and self:IsShip()then +OpsGroup:PauseMission() +self.warehouseOpsGroup:Load(OpsGroup,self.warehouseOpsElement) +end +if self.chief then +self.chief:OpsOnMission(OpsGroup,Mission) +end +if self.commander then +self.commander:OpsOnMission(OpsGroup,Mission) +end +end +function LEGION:onafterNewAsset(From,Event,To,asset,assignment) +self:GetParent(self,LEGION).onafterNewAsset(self,From,Event,To,asset,assignment) +local text=string.format("New asset %s with assignment %s and request assignment %s",asset.spawngroupname,tostring(asset.assignment),tostring(assignment)) +self:T(self.lid..text) +local cohort=self:_GetCohort(asset.assignment) +if cohort then +if asset.assignment==assignment then +local nunits=#asset.template.units +local text=string.format("Adding asset to cohort %s: assignment=%s, type=%s, attribute=%s, nunits=%d ngroup=%s",cohort.name,assignment,asset.unittype,asset.attribute,nunits,tostring(cohort.ngrouping)) +self:T(self.lid..text) +if cohort.ngrouping then +local template=asset.template +local N=math.max(#template.units,cohort.ngrouping) +asset.weight=0 +asset.cargobaytot=0 +for i=1,N do +local unit=template.units[i] +if i>nunits then +table.insert(template.units,UTILS.DeepCopy(template.units[1])) +asset.cargobaytot=asset.cargobaytot+asset.cargobay[1] +asset.weight=asset.weight+asset.weights[1] +template.units[i].x=template.units[1].x+5*(i-nunits) +template.units[i].y=template.units[1].y+5*(i-nunits) +else +if i<=cohort.ngrouping then +asset.weight=asset.weight+asset.weights[i] +asset.cargobaytot=asset.cargobaytot+asset.cargobay[i] +end +end +if i>cohort.ngrouping then +template.units[i]=nil +end +end +asset.nunits=cohort.ngrouping +self:T(self.lid..string.format("After regrouping: Nunits=%d, weight=%.1f cargobaytot=%.1f kg",#asset.template.units,asset.weight,asset.cargobaytot)) +end +asset.takeoffType=cohort.takeoffType~=nil and cohort.takeoffType or self.takeoffType +asset.parkingIDs=cohort.parkingIDs +cohort:GetCallsign(asset) +cohort:GetModex(asset) +asset.spawngroupname=string.format("%s_AID-%d",cohort.name,asset.uid) +cohort:AddAsset(asset) +else +self:T(self.lid..string.format("Asset returned to legion ==> calling LegionAssetReturned event")) +asset.takeoffType=cohort.takeoffType +self:LegionAssetReturned(cohort,asset) +end +end +end +function LEGION:onafterLegionAssetReturned(From,Event,To,Cohort,Asset) +self:T(self.lid..string.format("Asset %s from Cohort %s returned! asset.assignment=\"%s\"",Asset.spawngroupname,Cohort.name,tostring(Asset.assignment))) +if Asset.flightgroup and not Asset.flightgroup:IsStopped()then +Asset.flightgroup:Stop() +end +if Asset.flightgroup:IsFlightgroup()then +self:ReturnPayloadFromAsset(Asset) +end +if Asset.tacan then +Cohort:ReturnTacan(Asset.tacan) +end +Asset.Treturned=timer.getAbsTime() +end +function LEGION:onafterAssetSpawned(From,Event,To,group,asset,request) +self:T({From,Event,To,group:GetName(),asset.assignment,request.assignment}) +self:GetParent(self,LEGION).onafterAssetSpawned(self,From,Event,To,group,asset,request) +local cohort=self:_GetCohortOfAsset(asset) +if cohort then +self:T(self.lid..string.format("Cohort asset spawned %s",asset.spawngroupname)) +local flightgroup=self:_CreateFlightGroup(asset) +asset.flightgroup=flightgroup +asset.requested=nil +asset.Treturned=nil +local Tacan=cohort:FetchTacan() +if Tacan then +asset.tacan=Tacan +flightgroup:SwitchTACAN(Tacan,Morse,UnitName,Band) +end +local radioFreq,radioModu=cohort:GetRadio() +if radioFreq then +flightgroup:SwitchRadio(radioFreq,radioModu) +end +if cohort.fuellow then +flightgroup:SetFuelLowThreshold(cohort.fuellow) +end +if cohort.fuellowRefuel then +flightgroup:SetFuelLowRefuel(cohort.fuellowRefuel) +end +local assignment=request.assignment +if self:IsFleet()then +flightgroup:SetPathfinding(self.pathfinding) +end +if string.find(assignment,"Mission-")then +local uid=UTILS.Split(assignment,"-")[2] +local mission=self:GetMissionByID(uid) +local despawnLanding=cohort.despawnAfterLanding~=nil and cohort.despawnAfterLanding or self.despawnAfterLanding +if despawnLanding then +flightgroup:SetDespawnAfterLanding() +end +local despawnHolding=cohort.despawnAfterHolding~=nil and cohort.despawnAfterHolding or self.despawnAfterHolding +if despawnHolding then +flightgroup:SetDespawnAfterHolding() +end +if mission then +if Tacan then +end +flightgroup:AddMission(mission) +if self:IsBrigade()or self:IsFleet()then +flightgroup:SetReturnOnOutOfAmmo() +end +self:__OpsOnMission(5,flightgroup,mission) +else +if Tacan then +end +end +local chief=self.chief or(self.commander and self.commander.chief or nil) +if chief then +self:T(self.lid..string.format("Adding group %s to agents of CHIEF",group:GetName())) +chief.detectionset:AddGroup(asset.flightgroup.group) +end +elseif string.find(assignment,"Transport-")then +local uid=UTILS.Split(assignment,"-")[2] +local transport=self:GetTransportByID(uid) +if transport then +flightgroup:AddOpsTransport(transport) +end +end +end +end +function LEGION:onafterAssetDead(From,Event,To,asset,request) +self:GetParent(self,LEGION).onafterAssetDead(self,From,Event,To,asset,request) +if self.commander and self.commander.chief then +self.commander.chief.detectionset:RemoveGroupsByName({asset.spawngroupname}) +end +self:DelAsset(asset) +end +function LEGION:onafterDestroyed(From,Event,To) +self:T(self.lid.."Legion warehouse destroyed!") +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +mission:Cancel() +end +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +cohort:Stop() +end +self:GetParent(self,LEGION).onafterDestroyed(self,From,Event,To) +end +function LEGION:onafterRequest(From,Event,To,Request) +if Request.toself then +local assets=Request.cargoassets +local Mission=self:GetMissionByID(Request.assignment) +if Mission and assets then +for _,_asset in pairs(assets)do +local asset=_asset +end +end +end +self:GetParent(self,LEGION).onafterRequest(self,From,Event,To,Request) +end +function LEGION:onafterSelfRequest(From,Event,To,groupset,request) +self:GetParent(self,LEGION).onafterSelfRequest(self,From,Event,To,groupset,request) +local mission=self:GetMissionByID(request.assignment) +for _,_asset in pairs(request.assets)do +local asset=_asset +end +for _,_group in pairs(groupset:GetSet())do +local group=_group +end +end +function LEGION:onafterRequestSpawned(From,Event,To,Request,CargoGroupSet,TransportGroupSet) +self:GetParent(self,LEGION).onafterRequestSpawned(self,From,Event,To,Request,CargoGroupSet,TransportGroupSet) +end +function LEGION:onafterCaptured(From,Event,To,Coalition,Country) +self:GetParent(self,LEGION).onafterCaptured(self,From,Event,To,Coalition,Country) +if self.chief then +self.chief.commander:LegionLost(self,Coalition,Country) +self.chief:LegionLost(self,Coalition,Country) +self.chief:RemoveLegion(self) +elseif self.commander then +self.commander:LegionLost(self,Coalition,Country) +self.commander:RemoveLegion(self) +end +end +function LEGION:_CreateFlightGroup(asset) +local opsgroup=nil +if self:IsAirwing()then +opsgroup=FLIGHTGROUP:New(asset.spawngroupname) +elseif self:IsBrigade()then +opsgroup=ARMYGROUP:New(asset.spawngroupname) +opsgroup:SetValidateAndRepositionGroundUnits(self.ValidateAndRepositionGroundUnits) +elseif self:IsFleet()then +opsgroup=NAVYGROUP:New(asset.spawngroupname) +else +self:E(self.lid.."ERROR: not airwing or brigade!") +end +opsgroup:_SetLegion(self) +opsgroup.cohort=self:_GetCohortOfAsset(asset) +opsgroup.homebase=self.airbase +opsgroup.destbase=self.airbase +opsgroup.homezone=self.spawnzone +if opsgroup.cohort.weaponData then +local text="Weapon data for group:" +opsgroup.weaponData=opsgroup.weaponData or{} +for bittype,_weapondata in pairs(opsgroup.cohort.weaponData)do +local weapondata=_weapondata +opsgroup.weaponData[bittype]=UTILS.DeepCopy(weapondata) +text=text..string.format("\n- Bit=%s: Rmin=%.1f km, Rmax=%.1f km",bittype,weapondata.RangeMin/1000,weapondata.RangeMax/1000) +end +self:T3(self.lid..text) +end +return opsgroup +end +function LEGION:_TacticalOverview() +if self.tacview then +local NassetsTotal=self:CountAssets(nil) +local NassetsStock=self:CountAssets(true) +local NassetsActiv=self:CountAssets(false) +local NmissionsTotal=#self.missionqueue +local NmissionsRunni=self:CountMissionsInQueue() +local text=string.format("Tactical Overview %s\n",self.alias) +text=text..string.format("===================================\n") +text=text..string.format("Assets: %d [Active=%d, Stock=%d]\n",NassetsTotal,NassetsActiv,NassetsStock) +text=text..string.format("Missions: %d [Running=%d]\n",NmissionsTotal,NmissionsRunni) +for _,mtype in pairs(AUFTRAG.Type)do +local n=self:CountMissionsInQueue(mtype) +if n>0 then +local N=self:CountMissionsInQueue(mtype) +text=text..string.format(" - %s: %d [Running=%d]\n",mtype,n,N) +end +end +local Ntransports=#self.transportqueue +if Ntransports>0 then +text=text..string.format("Transports: %d\n",Ntransports) +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +text=text..string.format(" - %s",transport:GetState()) +end +end +MESSAGE:New(text,60,nil,true):ToCoalition(self:GetCoalition()) +end +end +function LEGION:IsAssetOnMission(asset,MissionTypes) +if MissionTypes then +if type(MissionTypes)~="table"then +MissionTypes={MissionTypes} +end +else +MissionTypes=AUFTRAG.Type +end +if asset.flightgroup and asset.flightgroup:IsAlive()then +for _,_mission in pairs(asset.flightgroup.missionqueue or{})do +local mission=_mission +if mission:IsNotOver()then +local status=mission:GetGroupStatus(asset.flightgroup) +if(status==AUFTRAG.GroupStatus.STARTED or status==AUFTRAG.GroupStatus.EXECUTING)and AUFTRAG.CheckMissionType(mission.type,MissionTypes)then +return true +end +end +end +end +return false +end +function LEGION:GetAssetCurrentMission(asset) +if asset.flightgroup then +return asset.flightgroup:GetMissionCurrent() +end +return nil +end +function LEGION:CountPayloadsInStock(MissionTypes,UnitTypes,Payloads) +if MissionTypes then +if type(MissionTypes)=="string"then +MissionTypes={MissionTypes} +end +end +if UnitTypes then +if type(UnitTypes)=="string"then +UnitTypes={UnitTypes} +end +end +local function _checkUnitTypes(payload) +if UnitTypes then +for _,unittype in pairs(UnitTypes)do +if unittype==payload.aircrafttype then +return true +end +end +else +return true +end +return false +end +local function _checkPayloads(payload) +if Payloads then +for _,Payload in pairs(Payloads)do +if Payload.uid==payload.uid then +return true +end +end +else +return nil +end +return false +end +local n=0 +for _,_payload in pairs(self.payloads or{})do +local payload=_payload +for _,MissionType in pairs(MissionTypes)do +local specialpayload=_checkPayloads(payload) +local compatible=AUFTRAG.CheckMissionCapability(MissionType,payload.capabilities) +local goforit=specialpayload or(specialpayload==nil and compatible) +if goforit and _checkUnitTypes(payload)then +if payload.unlimited then +return 999 +else +n=n+payload.navail +end +end +end +end +return n +end +function LEGION:CountMissionsInQueue(MissionTypes) +MissionTypes=MissionTypes or AUFTRAG.Type +local N=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:IsNotOver()and AUFTRAG.CheckMissionType(mission.type,MissionTypes)then +N=N+1 +end +end +return N +end +function LEGION:CountAssets(InStock,MissionTypes,Attributes) +local N=0 +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +N=N+cohort:CountAssets(InStock,MissionTypes,Attributes) +end +return N +end +function LEGION:GetOpsGroups(MissionTypes,Attributes) +local setLegion=SET_OPSGROUP:New() +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +local setCohort=cohort:GetOpsGroups(MissionTypes,Attributes) +self:T2(self.lid..string.format("Found %d opsgroups of cohort %s",setCohort:Count(),cohort.name)) +setLegion:AddSet(setCohort) +end +return setLegion +end +function LEGION:CountAssetsWithPayloadsInStock(Payloads,MissionTypes,Attributes) +local N=0 +local Npayloads={} +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +if Npayloads[cohort.aircrafttype]==nil then +Npayloads[cohort.aircrafttype]=self:CountPayloadsInStock(MissionTypes,cohort.aircrafttype,Payloads) +self:T3(self.lid..string.format("Got Npayloads=%d for type=%s",Npayloads[cohort.aircrafttype],cohort.aircrafttype)) +end +end +for _,_cohort in pairs(self.cohorts)do +local cohort=_cohort +local n=cohort:CountAssets(true,MissionTypes,Attributes) +local p=Npayloads[cohort.aircrafttype]or 0 +local m=math.min(n,p) +N=N+m +Npayloads[cohort.aircrafttype]=Npayloads[cohort.aircrafttype]-m +end +return N +end +function LEGION:CountAssetsOnMission(MissionTypes,Cohort) +local Nq=0 +local Np=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if AUFTRAG.CheckMissionType(mission.type,MissionTypes or AUFTRAG.Type)then +for _,_asset in pairs(mission.assets or{})do +local asset=_asset +if asset.wid==self.uid then +if Cohort==nil or Cohort.name==asset.squadname then +local request,isqueued=self:GetRequestByID(mission.requestID[self.alias]) +if isqueued then +Nq=Nq+1 +else +Np=Np+1 +end +end +end +end +end +end +return Np+Nq,Np,Nq +end +function LEGION:GetAssetsOnMission(MissionTypes) +local assets={} +local Np=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if AUFTRAG.CheckMissionType(mission.type,MissionTypes)then +for _,_asset in pairs(mission.assets or{})do +local asset=_asset +if asset.wid==self.uid then +table.insert(assets,asset) +end +end +end +end +return assets +end +function LEGION:GetAircraftTypes(onlyactive,cohorts) +local unittypes={} +for _,_cohort in pairs(cohorts or self.cohorts)do +local cohort=_cohort +if(not onlyactive)or cohort:IsOnDuty()then +local gotit=false +for _,unittype in pairs(unittypes)do +if cohort.aircrafttype==unittype then +gotit=true +break +end +end +if not gotit then +table.insert(unittypes,cohort.aircrafttype) +end +end +end +return unittypes +end +function LEGION:_CountPayloads(MissionType,Cohorts,Payloads) +local Npayloads={} +for _,_cohort in pairs(Cohorts)do +local cohort=_cohort +if Npayloads[cohort.aircrafttype]==nil then +Npayloads[cohort.aircrafttype]=cohort.legion:IsAirwing()and self:CountPayloadsInStock(MissionType,cohort.aircrafttype,Payloads)or 999 +self:T2(self.lid..string.format("Got N=%d payloads for mission type=%s and unit type=%s",Npayloads[cohort.aircrafttype],MissionType,cohort.aircrafttype)) +end +end +return Npayloads +end +function LEGION:RecruitAssetsForMission(Mission) +local NreqMin,NreqMax=Mission:GetRequiredAssets() +local TargetVec2=Mission:GetTargetVec2() +local Payloads=Mission.payloads +local MaxWeight=nil +if Mission.NcarriersMin then +local legions={self} +local cohorts=self.cohorts +if Mission.transportLegions or Mission.transportCohorts then +legions=Mission.transportLegions +cohorts=Mission.transportCohorts +end +local Cohorts=LEGION._GetCohorts(legions,cohorts) +local transportcohorts={} +for _,_cohort in pairs(Cohorts)do +local cohort=_cohort +local can=LEGION._CohortCan(cohort,AUFTRAG.Type.OPSTRANSPORT,Mission.carrierCategories,Mission.carrierAttributes,Mission.carrierProperties,nil,TargetVec2) +if can and(MaxWeight==nil or cohort.cargobayLimit>MaxWeight)then +MaxWeight=cohort.cargobayLimit +end +end +self:T(self.lid..string.format("Largest cargo bay available=%.1f",MaxWeight or 0)) +end +local legions={self} +local cohorts=self.cohorts +if Mission.specialLegions or Mission.specialCohorts then +legions=Mission.specialLegions +cohorts=Mission.specialCohorts +end +local Cohorts=LEGION._GetCohorts(legions,cohorts,Operation,OpsQueue) +local recruited,assets,legions=LEGION.RecruitCohortAssets(Cohorts,Mission.type,Mission.alert5MissionType,NreqMin,NreqMax,TargetVec2,Payloads, +Mission.engageRange,Mission.refuelSystem,nil,nil,MaxWeight,nil,Mission.attributes,Mission.properties,{Mission.engageWeaponType}) +return recruited,assets,legions +end +function LEGION:RecruitAssetsForTransport(Transport) +local cargoOpsGroups=Transport:GetCargoOpsGroups(false) +local weightGroup=0 +local TotalWeight=nil +if#cargoOpsGroups>0 then +TotalWeight=0 +for _,_opsgroup in pairs(cargoOpsGroups)do +local opsgroup=_opsgroup +local weight=opsgroup:GetWeightTotal() +if weight>weightGroup then +weightGroup=weight +end +TotalWeight=TotalWeight+weight +end +else +return false +end +local TargetVec2=Transport:GetDeployZone():GetVec2() +local NreqMin,NreqMax=Transport:GetRequiredCarriers() +local recruited,assets,legions=LEGION.RecruitCohortAssets(self.cohorts,AUFTRAG.Type.OPSTRANSPORT,nil,NreqMin,NreqMax,TargetVec2,nil,nil,nil,weightGroup,TotalWeight) +return recruited,assets,legions +end +function LEGION:RecruitAssetsForEscort(Mission,Assets) +if Mission.NescortMin and Mission.NescortMax and(Mission.NescortMin>0 or Mission.NescortMax>0)then +self:T(self.lid..string.format("Requested escort for mission %s [%s]. Required assets=%d-%d",Mission:GetName(),Mission:GetType(),Mission.NescortMin,Mission.NescortMax)) +local Cohorts={} +for _,_legion in pairs(Mission.escortLegions or{})do +local legion=_legion +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +table.insert(Cohorts,cohort) +end +end +for _,_cohort in pairs(Mission.escortCohorts or{})do +local cohort=_cohort +table.insert(Cohorts,cohort) +end +if#Cohorts==0 then +Cohorts=self.cohorts +end +local assigned=LEGION.AssignAssetsForEscort(self,Cohorts,Assets,Mission.NescortMin,Mission.NescortMax,Mission.escortMissionType,Mission.escortTargetTypes) +return assigned +end +return true +end +function LEGION._GetCohorts(Legions,Cohorts,Operation,OpsQueue) +OpsQueue=OpsQueue or{} +local function CheckOperation(LegionOrCohort) +if#OpsQueue==0 then +return true +end +local isAvail=true +if Operation then +isAvail=false +end +for _,_operation in pairs(OpsQueue)do +local operation=_operation +local isOps=operation:IsAssignedCohortOrLegion(LegionOrCohort) +if isOps and operation:IsRunning()then +isAvail=false +if Operation==nil then +return false +else +if Operation.uid==operation.uid then +return true +end +end +end +end +return isAvail +end +local cohorts={} +if(Legions and#Legions>0)or(Cohorts and#Cohorts>0)then +for _,_legion in pairs(Legions or{})do +local legion=_legion +local Runway=true +if legion:IsAirwing()then +Runway=legion:IsRunwayOperational()and legion.airbase and legion.airbase:GetCoalition()==legion:GetCoalition() +end +if legion:IsRunning()and Runway then +for _,_cohort in pairs(legion.cohorts)do +local cohort=_cohort +if(CheckOperation(cohort.legion)or CheckOperation(cohort))and not UTILS.IsInTable(cohorts,cohort,"name")then +table.insert(cohorts,cohort) +end +end +end +end +for _,_cohort in pairs(Cohorts or{})do +local cohort=_cohort +if CheckOperation(cohort)and not UTILS.IsInTable(cohorts,cohort,"name")then +table.insert(cohorts,cohort) +end +end +end +return cohorts +end +function LEGION._CohortCan(Cohort,MissionType,Categories,Attributes,Properties,WeaponTypes,TargetVec2,RangeMax,RefuelSystem,CargoWeight,MaxWeight) +local function CheckCategory(_cohort) +local cohort=_cohort +if Categories and#Categories>0 then +for _,category in pairs(Categories)do +if category==cohort.category then +return true +end +end +else +return true +end +end +local function CheckAttribute(_cohort) +local cohort=_cohort +if Attributes and#Attributes>0 then +for _,attribute in pairs(Attributes)do +if attribute==cohort.attribute then +return true +end +end +else +return true +end +end +local function CheckProperty(_cohort) +local cohort=_cohort +if Properties and#Properties>0 then +for _,Property in pairs(Properties)do +for property,value in pairs(cohort.properties)do +if Property==property then +return true +end +end +end +else +return true +end +end +local function CheckWeapon(_cohort) +local cohort=_cohort +if WeaponTypes and#WeaponTypes>0 then +for _,WeaponType in pairs(WeaponTypes)do +if WeaponType==ENUMS.WeaponFlag.Auto then +return true +else +for _,_weaponData in pairs(cohort.weaponData or{})do +local weaponData=_weaponData +if weaponData.BitType==WeaponType then +return true +end +end +end +end +return false +else +return true +end +end +local function CheckRange(_cohort) +local cohort=_cohort +local TargetDistance=TargetVec2 and UTILS.VecDist2D(TargetVec2,cohort.legion:GetVec2())or 0 +local Rmax=cohort:GetMissionRange(WeaponTypes) +local RangeMax=RangeMax or 0 +local InRange=(RangeMax and math.max(RangeMax,Rmax)or Rmax)>=TargetDistance +return InRange +end +local function CheckRefueling(_cohort) +local cohort=_cohort +if RefuelSystem then +if cohort.tankerSystem then +return RefuelSystem==cohort.tankerSystem +else +return false +end +else +return true +end +end +local function CheckCargoWeight(_cohort) +local cohort=_cohort +if CargoWeight~=nil then +return cohort.cargobayLimit>=CargoWeight +else +return true +end +end +local function CheckMaxWeight(_cohort) +local cohort=_cohort +if MaxWeight~=nil then +cohort:T(string.format("Cohort weight=%.1f | max weight=%.1f",cohort.weightAsset,MaxWeight)) +return cohort.weightAsset<=MaxWeight +else +return true +end +end +local can=AUFTRAG.CheckMissionCapability(MissionType,Cohort.missiontypes) +if can then +can=CheckCategory(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of mission types",Cohort.name)) +return false +end +if can then +if MissionType==AUFTRAG.Type.RELOCATECOHORT then +can=Cohort:IsRelocating() +else +can=Cohort:IsOnDuty() +end +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of category",Cohort.name)) +return false +end +if can then +can=CheckAttribute(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of readyiness",Cohort.name)) +return false +end +if can then +can=CheckProperty(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of attribute",Cohort.name)) +return false +end +if can then +can=CheckWeapon(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of property",Cohort.name)) +return false +end +if can then +can=CheckRange(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of weapon type",Cohort.name)) +return false +end +if can then +can=CheckRefueling(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of range",Cohort.name)) +return false +end +if can then +can=CheckCargoWeight(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of refueling system",Cohort.name)) +return false +end +if can then +can=CheckMaxWeight(Cohort) +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of cargo weight",Cohort.name)) +return false +end +if can then +return true +else +Cohort:T(Cohort.lid..string.format("Cohort %s cannot because of max weight",Cohort.name)) +return false +end +return nil +end +function LEGION.RecruitCohortAssets(Cohorts,MissionTypeRecruit,MissionTypeOpt,NreqMin,NreqMax,TargetVec2,Payloads,RangeMax,RefuelSystem,CargoWeight,TotalWeight,MaxWeight,Categories,Attributes,Properties,WeaponTypes) +local Assets={} +local Legions={} +if MissionTypeOpt==nil then +MissionTypeOpt=MissionTypeRecruit +end +for _,_cohort in pairs(Cohorts)do +local cohort=_cohort +local can=LEGION._CohortCan(cohort,MissionTypeRecruit,Categories,Attributes,Properties,WeaponTypes,TargetVec2,RangeMax,RefuelSystem,CargoWeight,MaxWeight) +if can then +local assets,npayloads=cohort:RecruitAssets(MissionTypeRecruit,999) +for _,asset in pairs(assets)do +table.insert(Assets,asset) +end +end +end +if#Assets==0 then +return false,{},{} +end +LEGION._OptimizeAssetSelection(Assets,MissionTypeOpt,TargetVec2,false,TotalWeight) +for _,_asset in pairs(Assets)do +local asset=_asset +if asset.legion:IsAirwing()and not asset.payload then +asset.payload=asset.legion:FetchPayloadFromStock(asset.unittype,MissionTypeOpt,Payloads) +end +end +for i=#Assets,1,-1 do +local asset=Assets[i] +if asset.legion:IsAirwing()and not asset.payload then +table.remove(Assets,i) +end +end +LEGION._OptimizeAssetSelection(Assets,MissionTypeOpt,TargetVec2,true,TotalWeight) +local Nassets=math.min(#Assets,NreqMax) +if#Assets>=NreqMin then +local cargobay=0 +for i=1,Nassets do +local asset=Assets[i] +asset.isReserved=true +Legions[asset.legion.alias]=asset.legion +if TotalWeight then +local N=math.floor(asset.cargobaytot/asset.nunits/CargoWeight)*asset.nunits +cargobay=cargobay+N*CargoWeight +if cargobay>=TotalWeight then +Nassets=i +break +end +end +end +for i=#Assets,Nassets+1,-1 do +local asset=Assets[i] +if asset.legion:IsAirwing()and not asset.spawned then +asset.legion:T2(asset.legion.lid..string.format("Returning payload from asset %s",asset.spawngroupname)) +asset.legion:ReturnPayloadFromAsset(asset) +end +table.remove(Assets,i) +end +return true,Assets,Legions +else +for i=1,#Assets do +local asset=Assets[i] +if asset.legion:IsAirwing()and not asset.spawned then +asset.legion:T2(asset.legion.lid..string.format("Returning payload from asset %s",asset.spawngroupname)) +asset.legion:ReturnPayloadFromAsset(asset) +end +end +return false,{},{} +end +return false,{},{} +end +function LEGION.UnRecruitAssets(Assets,Mission) +for i=1,#Assets do +local asset=Assets[i] +asset.isReserved=false +if asset.legion:IsAirwing()and not asset.spawned then +asset.legion:T2(asset.legion.lid..string.format("Returning payload from asset %s",asset.spawngroupname)) +asset.legion:ReturnPayloadFromAsset(asset) +end +if Mission then +Mission:DelAsset(asset) +end +end +end +function LEGION:AssignAssetsForEscort(Cohorts,Assets,NescortMin,NescortMax,MissionType,TargetTypes,EngageRange) +if NescortMin and NescortMax and(NescortMin>0 or NescortMax>0)then +self:T(self.lid..string.format("Requested escort for %d assets from %d cohorts. Required escort assets=%d-%d",#Assets,#Cohorts,NescortMin,NescortMax)) +local Escorts={} +local EscortAvail=true +for _,_asset in pairs(Assets)do +local asset=_asset +local TargetVec2=asset.legion:GetVec2() +local Categories={Group.Category.HELICOPTER} +local targetTypes={"Ground Units"} +if asset.category==Group.Category.AIRPLANE then +Categories={Group.Category.AIRPLANE} +targetTypes={"Air"} +end +TargetTypes=TargetTypes or targetTypes +local Erecruited,eassets,elegions=LEGION.RecruitCohortAssets(Cohorts,AUFTRAG.Type.ESCORT,MissionType,NescortMin,NescortMax,TargetVec2,nil,nil,nil,nil,nil,nil,Categories) +if Erecruited then +Escorts[asset.spawngroupname]={EscortLegions=elegions,EscortAssets=eassets,ecategory=asset.category} +else +EscortAvail=false +break +end +end +if EscortAvail then +local N=0 +for groupname,value in pairs(Escorts)do +local Elegions=value.EscortLegions +local Eassets=value.EscortAssets +local ecategory=value.ecategory +for _,_legion in pairs(Elegions)do +local legion=_legion +local OffsetVector=nil +if ecategory==Group.Category.GROUND then +OffsetVector={} +OffsetVector.x=0 +OffsetVector.y=UTILS.FeetToMeters(1000) +OffsetVector.z=0 +elseif MissionType==AUFTRAG.Type.SEAD then +OffsetVector={} +OffsetVector.x=-100 +OffsetVector.y=500 +OffsetVector.z=500 +end +local escort=AUFTRAG:NewESCORT(groupname,OffsetVector,EngageRange,TargetTypes) +if MissionType==AUFTRAG.Type.SEAD then +escort.missionTask=ENUMS.MissionTask.SEAD +local DCStask=CONTROLLABLE.EnRouteTaskSEAD(nil) +table.insert(escort.enrouteTasks,DCStask) +end +for _,_asset in pairs(Eassets)do +local asset=_asset +escort:AddAsset(asset) +N=N+1 +end +self:MissionAssign(escort,{legion}) +end +end +self:T(self.lid..string.format("Recruited %d escort assets",N)) +return true +else +self:T(self.lid..string.format("Could not get at least one escort!")) +for groupname,value in pairs(Escorts)do +local Eassets=value.EscortAssets +LEGION.UnRecruitAssets(Eassets) +end +return false +end +else +self:T(self.lid..string.format("No escort required! NescortMin=%s, NescortMax=%s",tostring(NescortMin),tostring(NescortMax))) +return true +end +end +function LEGION:AssignAssetsForTransport(Legions,CargoAssets,NcarriersMin,NcarriersMax,DeployZone,DisembarkZone,Categories,Attributes,Properties) +if NcarriersMin and NcarriersMax and(NcarriersMin>0 or NcarriersMax>0)then +local Cohorts=LEGION._GetCohorts(Legions) +local CargoLegions={};local CargoWeight=nil;local TotalWeight=0 +for _,_asset in pairs(CargoAssets)do +local asset=_asset +CargoLegions[asset.legion.alias]=asset.legion +if CargoWeight==nil or asset.weight>CargoWeight then +CargoWeight=asset.weight +end +TotalWeight=TotalWeight+asset.weight +end +self:T(self.lid..string.format("Cargo weight=%.1f",CargoWeight)) +self:T(self.lid..string.format("Total weight=%.1f",TotalWeight)) +local TargetVec2=DeployZone:GetVec2() +local TransportAvail,CarrierAssets,CarrierLegions= +LEGION.RecruitCohortAssets(Cohorts,AUFTRAG.Type.OPSTRANSPORT,nil,NcarriersMin,NcarriersMax,TargetVec2,nil,nil,nil,CargoWeight,TotalWeight,nil,Categories,Attributes,Properties) +if TransportAvail then +local Transport=OPSTRANSPORT:New(nil,nil,DeployZone) +if DisembarkZone then +Transport:SetDisembarkZone(DisembarkZone) +end +self:T(self.lid..string.format("Transport available with %d carrier assets",#CarrierAssets)) +for _,_legion in pairs(CargoLegions)do +local legion=_legion +local pickupzone=legion.spawnzone +local tpz=Transport:AddTransportZoneCombo(nil,pickupzone,Transport:GetDeployZone()) +tpz.PickupAirbase=legion:IsRunwayOperational()and legion.airbase or nil +Transport:SetEmbarkZone(legion.spawnzone,tpz) +for _,_asset in pairs(CargoAssets)do +local asset=_asset +if asset.legion.alias==legion.alias then +Transport:AddAssetCargo(asset,tpz) +end +end +end +for _,_asset in pairs(CarrierAssets)do +local asset=_asset +Transport:AddAsset(asset) +end +self:TransportAssign(Transport,CarrierLegions) +return true,Transport +else +self:T(self.lid..string.format("Transport assets could not be allocated ==> Unrecruiting assets")) +LEGION.UnRecruitAssets(CarrierAssets) +return false,nil +end +return nil,nil +end +return true,nil +end +function LEGION.CalculateAssetMissionScore(asset,MissionType,TargetVec2,IncludePayload,TotalWeight) +local score=0 +if asset.skill==AI.Skill.AVERAGE then +score=score+0 +elseif asset.skill==AI.Skill.GOOD then +score=score+10 +elseif asset.skill==AI.Skill.HIGH then +score=score+20 +elseif asset.skill==AI.Skill.EXCELLENT then +score=score+30 +end +score=score+asset.cohort:GetMissionPeformance(MissionType) +local function scorePayload(Payload,MissionType) +for _,Capability in pairs(Payload.capabilities)do +local capability=Capability +if capability.MissionType==MissionType then +return capability.Performance +end +end +return 0 +end +if IncludePayload and asset.payload then +score=score+scorePayload(asset.payload,MissionType) +end +local OrigVec2=asset.flightgroup and asset.flightgroup:GetVec2()or asset.legion:GetVec2() +local distance=0 +if TargetVec2 and OrigVec2 then +distance=UTILS.MetersToNM(UTILS.VecDist2D(OrigVec2,TargetVec2)) +if asset.category==Group.Category.AIRPLANE or asset.category==Group.Category.HELICOPTER then +distance=UTILS.Round(distance/10,0) +else +distance=UTILS.Round(distance,0) +end +end +score=score-distance +if asset.spawned and asset.flightgroup and asset.flightgroup:IsAlive()then +local currmission=asset.flightgroup:GetMissionCurrent() +if currmission then +if currmission.type==AUFTRAG.Type.ALERT5 and currmission.alert5MissionType==MissionType then +score=score+25 +elseif(currmission.type==AUFTRAG.Type.GCICAP or currmission.type==AUFTRAG.Type.PATROLRACETRACK)and MissionType==AUFTRAG.Type.INTERCEPT then +score=score+35 +elseif(currmission.type==AUFTRAG.Type.ONGUARD or currmission.type==AUFTRAG.Type.PATROLZONE)and(MissionType==AUFTRAG.Type.ARTY or MissionType==AUFTRAG.Type.GROUNDATTACK)then +score=score+25 +elseif currmission.type==AUFTRAG.Type.NOTHING then +score=score+30 +end +end +if MissionType==AUFTRAG.Type.OPSTRANSPORT or MissionType==AUFTRAG.Type.AMMOSUPPLY or MissionType==AUFTRAG.Type.AWACS or MissionType==AUFTRAG.Type.FUELSUPPLY or MissionType==AUFTRAG.Type.TANKER then +score=score-10 +else +if asset.flightgroup:IsOutOfAmmo()then +score=score-1000 +end +end +end +if MissionType==AUFTRAG.Type.OPSTRANSPORT then +if TotalWeight then +if asset.cargobaymax<TotalWeight then +score=score+UTILS.Round(asset.cargobaymax/10,0) +else +score=score+UTILS.Round(TotalWeight/10,0) +end +else +score=score+UTILS.Round(asset.cargobaymax/10,0) +end +end +if asset.legion and asset.legion.verbose>=2 then +asset.legion:I(asset.legion.lid..string.format("Asset %s [spawned=%s] score=%d",asset.spawngroupname,tostring(asset.spawned),score)) +end +return score +end +function LEGION._OptimizeAssetSelection(assets,MissionType,TargetVec2,IncludePayload,TotalWeight) +for _,_asset in pairs(assets)do +local asset=_asset +asset.score=LEGION.CalculateAssetMissionScore(asset,MissionType,TargetVec2,IncludePayload,TotalWeight) +if IncludePayload then +local RandomScoreMax=asset.legion and asset.legion.RandomAssetScore or LEGION.RandomAssetScore +local RandomScore=math.random(0,RandomScoreMax) +asset.score=asset.score+RandomScore +end +end +local function optimize(a,b) +local assetA=a +local assetB=b +return(assetA.score>assetB.score) +end +table.sort(assets,optimize) +if LEGION.verbose>0 then +local text=string.format("Optimized %d assets for %s mission/transport (payload=%s):",#assets,MissionType,tostring(IncludePayload)) +for i,Asset in pairs(assets)do +local asset=Asset +text=text..string.format("\n%d. %s [%s]: score=%d",i,asset.spawngroupname,asset.squadname,asset.score or-1) +asset.score=nil +end +env.info(text) +end +end +function LEGION:GetMissionByID(mid) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==tonumber(mid)then +return mission +end +end +return nil +end +function LEGION:GetTransportByID(uid) +for _,_transport in pairs(self.transportqueue)do +local transport=_transport +if transport.uid==tonumber(uid)then +return transport +end +end +return nil +end +function LEGION:GetMissionFromRequestID(RequestID) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +local mid=mission.requestID[self.alias] +if mid and mid==RequestID then +return mission +end +end +return nil +end +function LEGION:GetMissionFromRequest(Request) +return self:GetMissionFromRequestID(Request.uid) +end +function LEGION:FetchPayloadFromStock(UnitType,MissionType,Payloads) +return nil +end +function LEGION:ReturnPayloadFromAsset(asset) +return nil +end +NAVYGROUP={ +ClassName="NAVYGROUP", +turning=false, +intowind=nil, +intowindcounter=0, +Qintowind={}, +pathCorridor=400, +engage={}, +} +NAVYGROUP.version="1.0.3" +function NAVYGROUP:New(group) +local og=_DATABASE:GetOpsGroup(group) +if og then +og:I(og.lid..string.format("WARNING: OPS group already exists in data base!")) +return og +end +local self=BASE:Inherit(self,OPSGROUP:New(group)) +self.lid=string.format("NAVYGROUP %s | ",self.groupname) +self:SetDefaultROE() +self:SetDefaultAlarmstate() +self:SetDefaultEPLRS(self.isEPLRS) +self:SetDefaultEmission() +self:SetDetection() +self:SetPatrolAdInfinitum(true) +self:SetPathfinding(false) +self:AddTransition("*","FullStop","Holding") +self:AddTransition("*","Cruise","Cruising") +self:AddTransition("*","RTZ","Returning") +self:AddTransition("Returning","Returned","Returned") +self:AddTransition("*","Detour","Cruising") +self:AddTransition("*","DetourReached","*") +self:AddTransition("*","Retreat","Retreating") +self:AddTransition("Retreating","Retreated","Retreated") +self:AddTransition("Cruising","EngageTarget","Engaging") +self:AddTransition("Holding","EngageTarget","Engaging") +self:AddTransition("OnDetour","EngageTarget","Engaging") +self:AddTransition("Engaging","Disengage","Cruising") +self:AddTransition("*","TurnIntoWind","Cruising") +self:AddTransition("*","TurnedIntoWind","*") +self:AddTransition("*","TurnIntoWindStop","*") +self:AddTransition("*","TurnIntoWindOver","*") +self:AddTransition("*","TurningStarted","*") +self:AddTransition("*","TurningStopped","*") +self:AddTransition("*","CollisionWarning","*") +self:AddTransition("*","ClearAhead","*") +self:AddTransition("Cruising","Dive","Cruising") +self:AddTransition("Engaging","Dive","Engaging") +self:AddTransition("Cruising","Surface","Cruising") +self:AddTransition("Engaging","Surface","Engaging") +self:_InitWaypoints() +self:_InitGroup() +self:HandleEvent(EVENTS.Birth,self.OnEventBirth) +self:HandleEvent(EVENTS.Dead,self.OnEventDead) +self:HandleEvent(EVENTS.RemoveUnit,self.OnEventRemoveUnit) +self:HandleEvent(EVENTS.UnitLost,self.OnEventRemoveUnit) +self.timerStatus=TIMER:New(self.Status,self):Start(1,30) +self.timerQueueUpdate=TIMER:New(self._QueueUpdate,self):Start(2,5) +self.timerCheckZone=TIMER:New(self._CheckInZones,self):Start(2,60) +_DATABASE:AddOpsGroup(self) +return self +end +function NAVYGROUP:SetPatrolAdInfinitum(switch) +if switch==false then +self.adinfinitum=false +else +self.adinfinitum=true +end +return self +end +function NAVYGROUP:SetPathfinding(Switch,CorridorWidth) +self.pathfindingOn=Switch +self.pathCorridor=CorridorWidth or 400 +return self +end +function NAVYGROUP:SetPathfindingOn(CorridorWidth) +self:SetPathfinding(true,CorridorWidth) +return self +end +function NAVYGROUP:SetPathfindingOff() +self:SetPathfinding(false,self.pathCorridor) +return self +end +function NAVYGROUP:SetIntoWindLegacy(SwitchOn) +if SwitchOn==nil then +SwitchOn=true +end +self.intowindold=SwitchOn +return self +end +function NAVYGROUP:AddTaskFireAtPoint(Coordinate,Clock,Radius,Nshots,WeaponType,Prio) +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,Coordinate:GetVec2(),Radius,Nshots,WeaponType) +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function NAVYGROUP:AddTaskWaypointFireAtPoint(Coordinate,Waypoint,Radius,Nshots,WeaponType,Prio,Duration) +Waypoint=Waypoint or self:GetWaypointNext() +local DCStask=CONTROLLABLE.TaskFireAtPoint(nil,Coordinate:GetVec2(),Radius,Nshots,WeaponType) +local task=self:AddTaskWaypoint(DCStask,Waypoint,nil,Prio,Duration) +return task +end +function NAVYGROUP:AddTaskAttackGroup(TargetGroup,WeaponExpend,WeaponType,Clock,Prio) +local DCStask=CONTROLLABLE.TaskAttackGroup(nil,TargetGroup,WeaponType,WeaponExpend,AttackQty,Direction,Altitude,AttackQtyLimit,GroupAttack) +local task=self:AddTask(DCStask,Clock,nil,Prio) +return task +end +function NAVYGROUP:_CreateTurnIntoWind(starttime,stoptime,speed,uturn,offset) +local Tnow=timer.getAbsTime() +if starttime and type(starttime)=="number"then +starttime=UTILS.SecondsToClock(Tnow+starttime) +end +starttime=starttime or UTILS.SecondsToClock(Tnow) +local Tstart=UTILS.ClockToSeconds(starttime) +if uturn==nil then +uturn=true +end +local Tstop=Tstart+90*60 +if stoptime==nil then +Tstop=Tstart+90*60 +elseif type(stoptime)=="number"then +Tstop=Tstart+stoptime +else +Tstop=UTILS.ClockToSeconds(stoptime) +end +if Tstart>Tstop then +self:E(string.format("ERROR:Into wind stop time %s lies before start time %s. Input rejected!",UTILS.SecondsToClock(Tstart),UTILS.SecondsToClock(Tstop))) +return self +end +if Tstop<=Tnow then +self:E(string.format("WARNING: Into wind stop time %s already over. Tnow=%s! Input rejected.",UTILS.SecondsToClock(Tstop),UTILS.SecondsToClock(Tnow))) +return self +end +self.intowindcounter=self.intowindcounter+1 +local recovery={} +recovery.Tstart=Tstart +recovery.Tstop=Tstop +recovery.Open=false +recovery.Over=false +recovery.Speed=speed or 20 +recovery.Uturn=uturn and uturn or false +recovery.Offset=offset or 0 +recovery.Id=self.intowindcounter +return recovery +end +function NAVYGROUP:AddTurnIntoWind(starttime,stoptime,speed,uturn,offset) +local recovery=self:_CreateTurnIntoWind(starttime,stoptime,speed,uturn,offset) +table.insert(self.Qintowind,recovery) +return recovery +end +function NAVYGROUP:GetTurnIntoWind(TID) +if TID then +for _,_turn in pairs(self.Qintowind)do +local turn=_turn +if turn.Id==TID then +return turn +end +end +else +return self.intowind +end +return nil +end +function NAVYGROUP:ExtendTurnIntoWind(Duration,TurnIntoWind) +Duration=Duration or 300 +local TID=TurnIntoWind and TurnIntoWind.Id or nil +local turn=self:GetTurnIntoWind(TID) +if turn then +turn.Tstop=turn.Tstop+Duration +self:T(self.lid..string.format("Extending turn into wind by %d seconds. New stop time is %s",Duration,UTILS.SecondsToClock(turn.Tstop))) +else +self:E(self.lid.."Could not get turn into wind to extend!") +end +return self +end +function NAVYGROUP:RemoveTurnIntoWind(IntoWindData) +if self.intowind and self.intowind.Id==IntoWindData.Id then +self:TurnIntoWindStop() +return +end +for i,_tiw in pairs(self.Qintowind)do +local tiw=_tiw +if tiw.Id==IntoWindData.Id then +table.remove(self.Qintowind,i) +break +end +end +return self +end +function NAVYGROUP:IsHolding() +return self:Is("Holding") +end +function NAVYGROUP:IsCruising() +return self:Is("Cruising") +end +function NAVYGROUP:IsOnDetour() +return self:Is("OnDetour") +end +function NAVYGROUP:IsDiving() +return self:Is("Diving") +end +function NAVYGROUP:IsTurning() +return self.turning +end +function NAVYGROUP:IsSteamingIntoWind() +if self.intowind then +return true +else +return false +end +end +function NAVYGROUP:IsRecovering() +if self.intowind then +if self.intowind.Recovery==true then +return true +else +return false +end +else +return false +end +end +function NAVYGROUP:IsLaunching() +if self.intowind then +if self.intowind.Recovery==false then +return true +else +return false +end +else +return false +end +end +function NAVYGROUP:Status() +local fsmstate=self:GetState() +local alive=self:IsAlive() +local freepath=0 +if alive then +self:_UpdatePosition() +self:_CheckDetectedUnits() +self:_CheckTurning() +local disttoWP=math.min(self:GetDistanceToWaypoint(),UTILS.NMToMeters(10)) +freepath=disttoWP +if not self:IsTurning()then +freepath=self:_CheckFreePath(freepath,100) +if disttoWP>1 and freepath<disttoWP then +if not self.collisionwarning then +self:CollisionWarning(freepath) +end +if self.pathfindingOn and not self.ispathfinding then +self.ispathfinding=self:_FindPathToNextWaypoint() +end +end +end +self:_CheckTurnsIntoWind() +self:_CheckAmmoStatus() +self:_CheckDamage() +self:_CheckStuck() +if self:IsWaiting()then +if self.Twaiting and self.dTwait then +if timer.getAbsTime()>self.Twaiting+self.dTwait then +self.Twaiting=nil +self.dTwait=nil +if self:_CountPausedMissions()>0 then +self:UnpauseMission() +else +self:Cruise() +end +end +end +end +local mission=self:GetMissionCurrent() +if mission and mission.updateDCSTask then +if mission.type==AUFTRAG.Type.CAPTUREZONE then +local Task=mission:GetGroupWaypointTask(self) +if mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.EXECUTING or mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.STARTED then +self:_UpdateTask(Task,mission) +end +end +end +else +self:_CheckDamage() +end +if alive~=nil then +if self.verbose>=1 then +local nelem=self:CountElements() +local Nelem=#self.elements +local nTaskTot,nTaskSched,nTaskWP=self:CountRemainingTasks() +local nMissions=self:CountRemainingMissison() +local roe=self:GetROE()or-1 +local als=self:GetAlarmstate()or-1 +local wpidxCurr=self.currentwp +local wpuidCurr=self:GetWaypointUIDFromIndex(wpidxCurr)or 0 +local wpidxNext=self:GetWaypointIndexNext()or 0 +local wpuidNext=self:GetWaypointUIDFromIndex(wpidxNext)or 0 +local wpN=#self.waypoints or 0 +local wpF=tostring(self.passedfinalwp) +local speed=UTILS.MpsToKnots(self.velocity or 0) +local speedEx=UTILS.MpsToKnots(self:GetExpectedSpeed()) +local alt=self.position and self.position.y or 0 +local hdg=self.heading or 0 +local life=self.life or 0 +local ammo=self:GetAmmoTot().Total +local ndetected=self.detectionOn and tostring(self.detectedunits:Count())or"Off" +local cargo=0 +for _,_element in pairs(self.elements)do +local element=_element +cargo=cargo+element.weightCargo +end +local intowind=self:IsSteamingIntoWind()and UTILS.SecondsToClock(self.intowind.Tstop-timer.getAbsTime(),true)or"N/A" +local turning=tostring(self:IsTurning()) +local text=string.format("%s [%d/%d]: ROE/AS=%d/%d | T/M=%d/%d | Wp=%d[%d]-->%d[%d]/%d [%s] | Life=%.1f | v=%.1f (%d) | Hdg=%03d | Ammo=%d | Detect=%s | Cargo=%.1f | Turn=%s Collision=%d IntoWind=%s", +fsmstate,nelem,Nelem,roe,als,nTaskTot,nMissions,wpidxCurr,wpuidCurr,wpidxNext,wpuidNext,wpN,wpF,life,speed,speedEx,hdg,ammo,ndetected,cargo,turning,freepath,intowind) +self:I(self.lid..text) +end +else +local text=string.format("State %s: Alive=%s",fsmstate,tostring(self:IsAlive())) +self:T(self.lid..text) +end +if alive and self.verbose>=2 and#self.Qintowind>0 then +local text=string.format(self.lid.."Turn into wind time windows:") +if#self.Qintowind==0 then +text=text.." none!" +end +for i,_recovery in pairs(self.Qintowind)do +local recovery=_recovery +local Cstart=UTILS.SecondsToClock(recovery.Tstart) +local Cstop=UTILS.SecondsToClock(recovery.Tstop) +text=text..string.format("\n[%d] ID=%d Start=%s Stop=%s Open=%s Over=%s",i,recovery.Id,Cstart,Cstop,tostring(recovery.Open),tostring(recovery.Over)) +end +self:I(self.lid..text) +end +if self.verbose>=2 then +local text="Elements:" +for i,_element in pairs(self.elements)do +local element=_element +local name=element.name +local status=element.status +local unit=element.unit +local life,life0=self:GetLifePoints(element) +local life0=element.life0 +local ammo=self:GetAmmoElement(element) +text=text..string.format("\n[%d] %s: status=%s, life=%.1f/%.1f, guns=%d, rockets=%d, bombs=%d, missiles=%d, cargo=%d/%d kg", +i,name,status,life,life0,ammo.Guns,ammo.Rockets,ammo.Bombs,ammo.Missiles,element.weightCargo,element.weightMaxCargo) +end +if#self.elements==0 then +text=text.." none!" +end +self:I(self.lid..text) +end +if self:IsCruising()and self.detectionOn and self.engagedetectedOn then +local targetgroup,targetdist=self:_GetDetectedTarget() +if targetgroup then +self:I(self.lid..string.format("Engaging target group %s at distance %d meters",targetgroup:GetName(),targetdist)) +self:EngageTarget(targetgroup) +end +end +self:_CheckCargoTransport() +self:_PrintTaskAndMissionStatus() +end +function NAVYGROUP:onafterElementSpawned(From,Event,To,Element) +self:T(self.lid..string.format("Element spawned %s",Element.name)) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.SPAWNED) +end +function NAVYGROUP:onafterSpawned(From,Event,To) +self:T(self.lid..string.format("Group spawned!")) +if self.verbose>=1 then +local text=string.format("Initialized Navy Group %s [GID=%d]:\n",self.groupname,self.group:GetID()) +text=text..string.format("Unit type = %s\n",self.actype) +text=text..string.format("Speed max = %.1f Knots\n",UTILS.KmphToKnots(self.speedMax)) +text=text..string.format("Speed cruise = %.1f Knots\n",UTILS.KmphToKnots(self.speedCruise)) +text=text..string.format("Weight = %.1f kg\n",self:GetWeightTotal()) +text=text..string.format("Cargo bay = %.1f kg\n",self:GetFreeCargobay()) +text=text..string.format("Has EPLRS = %s\n",tostring(self.isEPLRS)) +text=text..string.format("Is Submarine = %s\n",tostring(self.isSubmarine)) +text=text..string.format("Elements = %d\n",#self.elements) +text=text..string.format("Waypoints = %d\n",#self.waypoints) +text=text..string.format("Radio = %.1f MHz %s %s\n",self.radio.Freq,UTILS.GetModulationName(self.radio.Modu),tostring(self.radio.On)) +text=text..string.format("Ammo = %d (G=%d/R=%d/M=%d/T=%d)\n",self.ammo.Total,self.ammo.Guns,self.ammo.Rockets,self.ammo.Missiles,self.ammo.Torpedos) +text=text..string.format("FSM state = %s\n",self:GetState()) +text=text..string.format("Is alive = %s\n",tostring(self:IsAlive())) +text=text..string.format("LateActivate = %s\n",tostring(self:IsLateActivated())) +self:I(self.lid..text) +end +self:_UpdatePosition() +self.isDead=false +self.isDestroyed=false +if self.isAI then +self:SwitchROE(self.option.ROE) +self:SwitchAlarmstate(self.option.Alarm) +self:SwitchEmission(self.option.Emission) +self:SwitchEPLRS(self.option.EPLRS) +self:SwitchInvisible(self.option.Invisible) +self:SwitchImmortal(self.option.Immortal) +self:_SwitchTACAN() +self:_SwitchICLS() +if self.radioDefault then +else +self:SetDefaultRadio(self.radio.Freq,self.radio.Modu,false) +end +if#self.waypoints>1 then +self:__Cruise(-0.1) +else +self:FullStop() +end +end +end +function NAVYGROUP:onbeforeUpdateRoute(From,Event,To,n,Speed,Depth) +local allowed=true +local trepeat=nil +if self:IsWaiting()then +self:T(self.lid.."Update route denied. Group is WAITING!") +return false +elseif self:IsInUtero()then +self:T(self.lid.."Update route denied. Group is INUTERO!") +return false +elseif self:IsDead()then +self:T(self.lid.."Update route denied. Group is DEAD!") +return false +elseif self:IsStopped()then +self:T(self.lid.."Update route denied. Group is STOPPED!") +return false +elseif self:IsHolding()then +self:T(self.lid.."Update route denied. Group is holding position!") +return false +elseif self:IsEngaging()then +self:T(self.lid.."Update route allowed. Group is engaging!") +return true +end +if self.taskcurrent>0 then +local task=self:GetTaskByID(self.taskcurrent) +if task then +if task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +self:T2(self.lid.."Allowing update route for Task: PatrolZone") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RECON then +self:T2(self.lid.."Allowing update route for Task: ReconMission") +elseif task.dcstask.id==AUFTRAG.SpecialTask.RELOCATECOHORT then +self:T2(self.lid.."Allowing update route for Task: Relocate Cohort") +elseif task.dcstask.id==AUFTRAG.SpecialTask.REARMING then +self:T2(self.lid.."Allowing update route for Task: Rearming") +else +local taskname=task and task.description or"No description" +self:T(self.lid..string.format("WARNING: Update route denied because taskcurrent=%d>0! Task description = %s",self.taskcurrent,tostring(taskname))) +allowed=false +end +else +self:T(self.lid..string.format("WARNING: before update route taskcurrent=%d (>0!) but no task?!",self.taskcurrent)) +allowed=false +end +end +if not self.isAI then +allowed=false +end +self:T2(self.lid..string.format("Onbefore Updateroute in state %s: allowed=%s (repeat in %s)",self:GetState(),tostring(allowed),tostring(trepeat))) +if trepeat then +self:__UpdateRoute(trepeat,n) +end +return allowed +end +function NAVYGROUP:onafterUpdateRoute(From,Event,To,n,N,Speed,Depth) +n=n or self:GetWaypointIndexNext() +N=N or#self.waypoints +N=math.min(N,#self.waypoints) +local waypoints={} +for i=n,N do +local wp=UTILS.DeepCopy(self.waypoints[i]) +if Speed then +wp.speed=UTILS.KnotsToMps(Speed) +else +if wp.speed<0.1 then +wp.speed=UTILS.KmphToMps(self.speedCruise) +end +end +if Depth then +wp.alt=-Depth +elseif self.depth then +wp.alt=-self.depth +else +wp.alt=wp.alt or 0 +end +if i==n then +self.speedWp=wp.speed +self.altWp=wp.alt +end +table.insert(waypoints,wp) +end +local current=self:GetCoordinate():WaypointNaval(UTILS.MpsToKmph(self.speedWp),self.altWp) +table.insert(waypoints,1,current) +if self:IsEngaging()or not self.passedfinalwp then +if self.verbose>=10 then +for i=1,#waypoints do +local wp=waypoints[i] +local text=string.format("%s Waypoint [%d] UID=%d speed=%d m/s",self.groupname,i-1,wp.uid or-1,wp.speed) +self:I(self.lid..text) +COORDINATE:NewFromWaypoint(wp):MarkToAll(text) +end +end +self:T(self.lid..string.format("Updateing route: WP %d-->%d (%d/%d), Speed=%.1f knots, Depth=%d m",self.currentwp,n,#waypoints,#self.waypoints,UTILS.MpsToKnots(self.speedWp),self.altWp)) +self:Route(waypoints) +else +self:E(self.lid..string.format("WARNING: Passed final WP ==> Full Stop!")) +self:FullStop() +end +end +function NAVYGROUP:onafterDetour(From,Event,To,Coordinate,Speed,Depth,ResumeRoute) +Depth=Depth or 0 +Speed=Speed or self:GetSpeedCruise() +local uid=self:GetWaypointCurrent().uid +local wp=self:AddWaypoint(Coordinate,Speed,uid,Depth,true) +if ResumeRoute then +wp.detour=1 +else +wp.detour=0 +end +end +function NAVYGROUP:onafterDetourReached(From,Event,To) +self:T(self.lid.."Group reached detour coordinate.") +end +function NAVYGROUP:onafterTurnIntoWind(From,Event,To,IntoWind) +local heading,speed=self:GetHeadingIntoWind(IntoWind.Offset,IntoWind.Speed) +IntoWind.Heading=heading +IntoWind.Open=true +IntoWind.Coordinate=self:GetCoordinate(true) +self.intowind=IntoWind +self:T(self.lid..string.format("Steaming into wind: Heading=%03d Speed=%.1f, Tstart=%d Tstop=%d",IntoWind.Heading,speed,IntoWind.Tstart,IntoWind.Tstop)) +local distance=UTILS.NMToMeters(1000) +local coord=self:GetCoordinate() +local Coord=coord:Translate(distance,IntoWind.Heading) +local uid=self:GetWaypointCurrent().uid +local wptiw=self:AddWaypoint(Coord,speed,uid) +wptiw.intowind=true +IntoWind.waypoint=wptiw +if IntoWind.Uturn and false then +IntoWind.Coordinate:MarkToAll("Return coord") +end +end +function NAVYGROUP:onbeforeTurnIntoWindStop(From,Event,To) +if self.intowind then +return true +else +return false +end +end +function NAVYGROUP:onafterTurnIntoWindStop(From,Event,To) +self:TurnIntoWindOver(self.intowind) +end +function NAVYGROUP:onafterTurnIntoWindOver(From,Event,To,IntoWindData) +if IntoWindData and self.intowind and IntoWindData.Id==self.intowind.Id then +self:T2(self.lid.."Turn Into Wind Over!") +self.intowind.Over=true +self.intowind.Open=false +self:RemoveWaypointByID(self.intowind.waypoint.uid) +if self.intowind.Uturn then +self:T(self.lid.."FF Turn Into Wind Over ==> Uturn!") +local uid=self:GetWaypointCurrent().uid +local wp=self:AddWaypoint(self.intowind.Coordinate,self:GetSpeedCruise(),uid);wp.temp=true +else +local indx=self:GetWaypointIndexNext() +local speed=self:GetSpeedToWaypoint(indx) +self:T(self.lid..string.format("FF Turn Into Wind Over ==> Next WP Index=%d at %.1f knots via update route!",indx,speed)) +self:__UpdateRoute(-1,indx,nil,speed) +end +self.intowind=nil +self:RemoveTurnIntoWind(IntoWindData) +end +end +function NAVYGROUP:onafterFullStop(From,Event,To) +self:T(self.lid.."Full stop ==> holding") +local pos=self:GetCoordinate() +local wp=pos:WaypointNaval(0) +self:Route({wp}) +end +function NAVYGROUP:onafterCruise(From,Event,To,Speed) +self.Twaiting=nil +self.dTwait=nil +self.depth=nil +self:__UpdateRoute(-0.1,nil,nil,Speed) +end +function NAVYGROUP:onafterDive(From,Event,To,Depth,Speed) +Depth=Depth or 50 +self:I(self.lid..string.format("Diving to %d meters",Depth)) +self.depth=Depth +self:__UpdateRoute(-1,nil,nil,Speed) +end +function NAVYGROUP:onafterSurface(From,Event,To,Speed) +self.depth=0 +self:__UpdateRoute(-1,nil,nil,Speed) +end +function NAVYGROUP:onafterTurningStarted(From,Event,To) +self.turning=true +end +function NAVYGROUP:onafterTurningStopped(From,Event,To) +self.turning=false +self.collisionwarning=false +if self:IsSteamingIntoWind()then +self:TurnedIntoWind() +end +end +function NAVYGROUP:onafterCollisionWarning(From,Event,To,Distance) +self:T(self.lid..string.format("Iceberg ahead in %d meters!",Distance or-1)) +self.collisionwarning=true +end +function NAVYGROUP:onafterEngageTarget(From,Event,To,Target) +self:T(self.lid.."Engaging Target") +if Target:IsInstanceOf("TARGET")then +self.engage.Target=Target +else +self.engage.Target=TARGET:New(Target) +end +self.engage.Coordinate=UTILS.DeepCopy(self.engage.Target:GetCoordinate()) +local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate,0.9) +self.engage.roe=self:GetROE() +self.engage.alarmstate=self:GetAlarmstate() +self:SwitchAlarmstate(ENUMS.AlarmState.Auto) +self:SwitchROE(ENUMS.ROE.OpenFire) +local uid=self:GetWaypointCurrent().uid +self.engage.Waypoint=self:AddWaypoint(intercoord,nil,uid,Formation,true) +self.engage.Waypoint.detour=1 +end +function NAVYGROUP:_UpdateEngageTarget() +if self.engage.Target and self.engage.Target:IsAlive()then +local vec3=self.engage.Target:GetVec3() +if vec3 then +local dist=UTILS.VecDist3D(vec3,self.engage.Coordinate:GetVec3()) +if dist>100 then +self.engage.Coordinate:UpdateFromVec3(vec3) +local uid=self:GetWaypointCurrent().uid +self:RemoveWaypointByID(self.engage.Waypoint.uid) +local intercoord=self:GetCoordinate():GetIntermediateCoordinate(self.engage.Coordinate,0.9) +self.engage.Waypoint=self:AddWaypoint(intercoord,nil,uid,Formation,true) +self.engage.Waypoint.detour=0 +end +else +self:Disengage() +end +else +self:Disengage() +end +end +function NAVYGROUP:onafterDisengage(From,Event,To) +self:T(self.lid.."Disengage Target") +self:SwitchROE(self.engage.roe) +self:SwitchAlarmstate(self.engage.alarmstate) +local task=self:GetTaskCurrent() +if task and task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK then +self:T(self.lid.."Disengage with current task GROUNDATTACK ==> Task Done!") +self:TaskDone(task) +end +if self.engage.Waypoint then +self:RemoveWaypointByID(self.engage.Waypoint.uid) +end +self:_CheckGroupDone(1) +end +function NAVYGROUP:onafterOutOfAmmo(From,Event,To) +self:T(self.lid..string.format("Group is out of ammo at t=%.3f",timer.getTime())) +if self.retreatOnOutOfAmmo then +self:__Retreat(-1) +return +end +if self.rtzOnOutOfAmmo then +self:__RTZ(-1) +end +local task=self:GetTaskCurrent() +if task then +if task.dcstask.id=="FireAtPoint"or task.dcstask.id==AUFTRAG.SpecialTask.BARRAGE then +self:T(self.lid..string.format("Cancelling current %s task because out of ammo!",task.dcstask.id)) +self:TaskCancel(task) +end +end +end +function NAVYGROUP:onafterRTZ(From,Event,To,Zone,Formation) +local zone=Zone or self.homezone +self:CancelAllMissions() +if zone then +if self:IsInZone(zone)then +self:Returned() +else +self:T(self.lid..string.format("RTZ to Zone %s",zone:GetName())) +local Coordinate=zone:GetRandomCoordinate() +local uid=self:GetWaypointCurrentUID() +local wp=self:AddWaypoint(Coordinate,nil,uid,Formation,true) +wp.detour=0 +end +else +self:T(self.lid.."ERROR: No RTZ zone given!") +end +end +function NAVYGROUP:onafterReturned(From,Event,To) +self:T(self.lid..string.format("Group returned")) +if self.legion then +self:T(self.lid..string.format("Adding group back to warehouse stock")) +self.legion:__AddAsset(10,self.group,1) +end +end +function NAVYGROUP:AddWaypoint(Coordinate,Speed,AfterWaypointWithID,Depth,Updateroute) +local coordinate=self:_CoordinateFromObject(Coordinate) +local wpnumber=self:GetWaypointIndexAfterID(AfterWaypointWithID) +Speed=Speed or self:GetSpeedCruise() +local wp=coordinate:WaypointNaval(UTILS.KnotsToKmph(Speed),Depth) +local waypoint=self:_CreateWaypoint(wp) +if Depth then +waypoint.alt=UTILS.FeetToMeters(Depth) +end +self:_AddWaypoint(waypoint,wpnumber) +self:T(self.lid..string.format("Adding NAVAL waypoint index=%d uid=%d, speed=%.1f knots. Last waypoint passed was #%d. Total waypoints #%d",wpnumber,waypoint.uid,Speed,self.currentwp,#self.waypoints)) +if Updateroute==nil or Updateroute==true then +self:__UpdateRoute(-0.01) +end +return waypoint +end +function NAVYGROUP:_InitGroup(Template,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,NAVYGROUP._InitGroup,self,Template,0) +else +if self.groupinitialized then +self:T(self.lid.."WARNING: Group was already initialized! Will NOT do it again!") +return +end +local template=Template or self:_GetTemplate() +self.isAI=true +self.isLateActivated=template.lateActivation +self.isUncontrolled=false +self.speedMax=self.group:GetSpeedMax() +if self.speedMax and self.speedMax>3.6 then +self.isMobile=true +else +self.isMobile=false +self.speedMax=0 +end +self.speedCruise=self.speedMax*0.7 +self.ammo=self:GetAmmoTot() +self.radio.On=true +self.radio.Freq=tonumber(template.units[1].frequency)/1000000 +self.radio.Modu=tonumber(template.units[1].modulation) +self.optionDefault.Formation="Off Road" +self.option.Formation=self.optionDefault.Formation +if not self.tacanDefault then +self:SetDefaultTACAN(nil,nil,nil,nil,true) +end +if not self.tacan then +self.tacan=UTILS.DeepCopy(self.tacanDefault) +end +if not self.iclsDefault then +self:SetDefaultICLS(nil,nil,nil,true) +end +if not self.icls then +self.icls=UTILS.DeepCopy(self.iclsDefault) +end +local units=self.group:GetUnits() +local dcsgroup=Group.getByName(self.groupname) +local size0=dcsgroup:getInitialSize() +if#units~=size0 then +self:E(self.lid..string.format("ERROR: Got #units=%d but group consists of %d units!",#units,size0)) +end +for _,unit in pairs(units)do +self:_AddElementByName(unit:GetName()) +end +self.groupinitialized=true +end +return self +end +function NAVYGROUP:_CheckFreePath(DistanceMax,dx) +local distance=DistanceMax or 5000 +local dx=dx or 100 +if self:IsTurning()then +return distance +end +local offsetY=0.1 +if UTILS.GetDCSMap()==DCSMAP.Caucasus then +offsetY=5.01 +end +local vec3=self:GetVec3() +vec3.y=offsetY +local heading=self:GetHeading() +local function LoS(dist) +local checkvec3=UTILS.VecTranslate(vec3,dist,heading) +local los=land.isVisible(vec3,checkvec3) +return los +end +if LoS(DistanceMax)then +return DistanceMax +end +local function check() +local xmin=0 +local xmax=DistanceMax +local Nmax=100 +local eps=100 +local N=1 +while N<=Nmax do +local d=xmax-xmin +local x=xmin+d/2 +local los=LoS(x) +self:T(self.lid..string.format("N=%d: xmin=%.1f xmax=%.1f x=%.1f d=%.3f los=%s",N,xmin,xmax,x,d,tostring(los))) +if los and d<=eps then +return x +end +if los then +xmin=x +else +xmax=x +end +N=N+1 +end +return 0 +end +local _check=check() +return _check +end +function NAVYGROUP:_CheckTurning() +local unit=self.group:GetUnit(1) +if unit and unit:IsAlive()then +local vNew=self.orientX +local vLast=self.orientXLast +vNew.y=0;vLast.y=0 +local deltaLast=math.deg(math.acos(UTILS.VecDot(vNew,vLast)/UTILS.VecNorm(vNew)/UTILS.VecNorm(vLast))) +local turning=math.abs(deltaLast)>=2 +if self.turning and not turning then +self:TurningStopped() +elseif turning and not self.turning then +self:TurningStarted() +end +self.turning=turning +end +end +function NAVYGROUP:_CheckTurnsIntoWind() +local time=timer.getAbsTime() +if self.intowind then +if time>=self.intowind.Tstop then +self:TurnIntoWindOver(self.intowind) +end +else +local IntoWind=self:GetTurnIntoWindNext() +if IntoWind then +self:TurnIntoWind(IntoWind) +end +end +end +function NAVYGROUP:GetTurnIntoWindNext() +if#self.Qintowind>0 then +local time=timer.getAbsTime() +table.sort(self.Qintowind,function(a,b)return a.Tstart<b.Tstart end) +for _,_recovery in pairs(self.Qintowind)do +local recovery=_recovery +if time>=recovery.Tstart and time<recovery.Tstop and not(recovery.Open or recovery.Over)then +return recovery +end +end +end +return nil +end +function NAVYGROUP:GetTurnIntoWindCurrent() +return self.intowind +end +function NAVYGROUP:GetWind(Altitude) +local coord=self:GetCoordinate() +local Wdir,Wspeed=coord:GetWind(Altitude or 18) +return Wdir,Wspeed +end +function NAVYGROUP:GetHeadingIntoWind_old(Offset,vdeck) +local function adjustDegreesForWindSpeed(windSpeed) +local degreesAdjustment=0 +if windSpeed>0 and windSpeed<3 then +degreesAdjustment=30 +elseif windSpeed>=3 and windSpeed<5 then +degreesAdjustment=20 +elseif windSpeed>=5 and windSpeed<8 then +degreesAdjustment=8 +elseif windSpeed>=8 and windSpeed<13 then +degreesAdjustment=4 +elseif windSpeed>=13 then +degreesAdjustment=0 +end +return degreesAdjustment +end +Offset=Offset or 0 +local windfrom,vwind=self:GetWind() +local intowind=windfrom-Offset+adjustDegreesForWindSpeed(vwind) +if vwind<0.1 then +intowind=self:GetHeading() +end +if intowind<0 then +intowind=intowind+360 +end +local vtot=math.max(vdeck-UTILS.MpsToKnots(vwind),4) +return intowind,vtot +end +function NAVYGROUP:GetHeadingIntoWind_new(Offset,vdeck) +Offset=Offset or 0 +local windfrom,vwind=self:GetWind(18) +vwind=UTILS.MpsToKnots(vwind) +local windto=(windfrom+180)%360 +local alpha=math.rad(-Offset) +local Vmin=4 +local Vmax=UTILS.KmphToKnots(self.speedMax) +local C=math.sqrt(math.cos(alpha)^2/math.sin(alpha)^2+1) +local vdeckMax=vwind+math.cos(alpha)*Vmax +local vdeckMin=vwind+math.cos(alpha)*Vmin +local v=0 +local theta=0 +if vdeck>vdeckMax then +v=Vmax +theta=math.asin(v/(vwind*C))-math.asin(-1/C) +elseif vdeck<vdeckMin then +v=Vmin +theta=math.asin(v/(vwind*C))-math.asin(-1/C) +elseif vdeck*math.sin(alpha)>vwind then +theta=math.pi/2 +v=math.sqrt(vdeck^2-vwind^2) +else +theta=math.asin(vdeck*math.sin(alpha)/vwind) +v=vdeck*math.cos(alpha)-vwind*math.cos(theta) +end +local intowind=(540+(windto+math.deg(theta)))%360 +self:T(self.lid..string.format("Heading into Wind: vship=%.1f, vwind=%.1f, WindTo=%03d°, Theta=%03d°, Heading=%03d",v,vwind,windto,theta,intowind)) +return intowind,v +end +function NAVYGROUP:GetHeadingIntoWind(Offset,vdeck) +if self.intowindold then +return self:GetHeadingIntoWind_old(Offset,vdeck) +else +return self:GetHeadingIntoWind_new(Offset,vdeck) +end +end +function NAVYGROUP:_FindPathToNextWaypoint() +self:T3(self.lid.."Path finding") +local astar=ASTAR:New() +local position=self:GetCoordinate() +local wpnext=self:GetWaypointNext() +if wpnext==nil then +return +end +local nextwp=wpnext.coordinate +if wpnext.intowind then +local hdg=self:GetHeading() +nextwp=position:Translate(UTILS.NMToMeters(20),hdg,true) +end +local speed=UTILS.MpsToKnots(wpnext.speed) +astar:SetStartCoordinate(position) +astar:SetEndCoordinate(nextwp) +local dist=position:Get2DDistance(nextwp) +if dist<5 then +return +end +local boxwidth=dist*2 +local spacex=dist*0.1 +local delta=dist/10 +astar:CreateGrid({land.SurfaceType.WATER},boxwidth,spacex,delta,delta,self.verbose>10) +astar:SetValidNeighbourLoS(self.pathCorridor) +local function findpath() +local path=astar:GetPath(true,true) +if path then +local uid=self:GetWaypointCurrent().uid +for i,_node in ipairs(path)do +local node=_node +local wp=self:AddWaypoint(node.coordinate,speed,uid) +wp.astar=true +uid=wp.uid +if self.verbose>=10 then +node.coordinate:MarkToAll(string.format("Path node #%d",i)) +end +end +return#path>0 +else +return false +end +end +return findpath() +end +OPERATION={ +ClassName="OPERATION", +verbose=0, +branches={}, +counterPhase=0, +counterBranch=0, +counterEdge=0, +cohorts={}, +legions={}, +targets={}, +missions={}, +} +_OPERATIONID=0 +OPERATION.PhaseStatus={ +PLANNED="Planned", +ACTIVE="Active", +OVER="Over", +} +OPERATION.version="0.2.0" +function OPERATION:New(Name) +local self=BASE:Inherit(self,FSM:New()) +_OPERATIONID=_OPERATIONID+1 +self.uid=_OPERATIONID +self.name=Name or string.format("Operation-%02d",_OPERATIONID) +self.lid=string.format("%s | ",self.name) +self:SetStartState("Planned") +self.branchMaster=self:AddBranch("Master") +self.conditionStart=CONDITION:New("Operation %s start",self.name) +self.conditionStart:SetNoneResult(false) +self.conditionStart:SetDefaultPersistence(false) +self.conditionOver=CONDITION:New("Operation %s over",self.name) +self.conditionOver:SetNoneResult(false) +self.conditionOver:SetDefaultPersistence(false) +self.branchActive=self.branchMaster +self:AddTransition("*","Start","Running") +self:AddTransition("*","StatusUpdate","*") +self:AddTransition("Running","Pause","Paused") +self:AddTransition("Paused","Unpause","Running") +self:AddTransition("*","PhaseOver","*") +self:AddTransition("*","PhaseNext","*") +self:AddTransition("*","PhaseChange","*") +self:AddTransition("*","BranchSwitch","*") +self:AddTransition("*","Over","Over") +self:AddTransition("*","Stop","Stopped") +self:__StatusUpdate(-1) +return self +end +function OPERATION:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function OPERATION:SetTime(ClockStart,ClockStop) +local Tnow=timer.getAbsTime() +local Tstart=Tnow+5 +if ClockStart and type(ClockStart)=="number"then +Tstart=Tnow+ClockStart +elseif ClockStart and type(ClockStart)=="string"then +Tstart=UTILS.ClockToSeconds(ClockStart) +end +local Tstop=nil +if ClockStop and type(ClockStop)=="number"then +Tstop=Tnow+ClockStop +elseif ClockStop and type(ClockStop)=="string"then +Tstop=UTILS.ClockToSeconds(ClockStop) +end +self.Tstart=Tstart +self.Tstop=Tstop +if Tstop then +self.duration=self.Tstop-self.Tstart +end +return self +end +function OPERATION:AddConditonOverAll(Function,...) +local cf=self.conditionOver:AddFunctionAll(Function,...) +return cf +end +function OPERATION:AddConditonOverAny(Phase,Function,...) +local cf=self.conditionOver:AddFunctionAny(Function,...) +return cf +end +function OPERATION:AddPhase(Name,Branch,Duration) +Branch=Branch or self.branchMaster +local phase=self:_CreatePhase(Name) +phase.branch=Branch +phase.duration=Duration +self:T(self.lid..string.format("Adding phase %s to branch %s",phase.name,Branch.name)) +table.insert(Branch.phases,phase) +return phase +end +function OPERATION:InsertPhaseAfter(PhaseAfter,Name) +for i=1,#self.phases do +local phase=self.phases[i] +if PhaseAfter.uid==phase.uid then +local phase=self:_CreatePhase(Name) +end +end +return nil +end +function OPERATION:GetName() +return self.name or"Unknown" +end +function OPERATION:GetPhaseByName(Name) +for _,_branch in pairs(self.branches)do +local branch=_branch +for _,_phase in pairs(branch.phases or{})do +local phase=_phase +if phase.name==Name then +return phase +end +end +end +return nil +end +function OPERATION:SetPhaseStatus(Phase,Status) +if Phase then +self:T(self.lid..string.format("Phase %s status: %s-->%s",tostring(Phase.name),tostring(Phase.status),tostring(Status))) +Phase.status=Status +if Phase.status==OPERATION.PhaseStatus.ACTIVE then +Phase.Tstart=timer.getAbsTime() +Phase.nActive=Phase.nActive+1 +elseif Phase.status==OPERATION.PhaseStatus.OVER then +self:PhaseOver(Phase) +end +end +return self +end +function OPERATION:GetPhaseStatus(Phase) +return Phase.status +end +function OPERATION:SetPhaseConditonOver(Phase,Condition) +if Phase then +self:T(self.lid..string.format("Setting phase %s conditon over %s",self:GetPhaseName(Phase),Condition and Condition.name or"None")) +Phase.conditionOver=Condition +end +return self +end +function OPERATION:AddPhaseConditonOverAll(Phase,Function,...) +if Phase then +local cf=Phase.conditionOver:AddFunctionAll(Function,...) +return cf +end +return nil +end +function OPERATION:AddPhaseConditonOverAny(Phase,Function,...) +if Phase then +local cf=Phase.conditionOver:AddFunctionAny(Function,...) +return cf +end +return nil +end +function OPERATION:SetConditionFunctionPersistence(ConditionFunction,IsPersistent) +ConditionFunction.persistence=IsPersistent +return self +end +function OPERATION:AddPhaseConditonRepeatAll(Phase,Function,...) +if Phase then +Phase.conditionRepeat:AddFunctionAll(Function,...) +end +return self +end +function OPERATION:GetPhaseConditonOver(Phase,Condition) +return Phase.conditionOver +end +function OPERATION:GetPhaseNactive(Phase) +return Phase.nActive +end +function OPERATION:GetPhaseName(Phase) +Phase=Phase or self.phase +if Phase then +return Phase.name +end +return"None" +end +function OPERATION:GetPhaseActive() +return self.phase +end +function OPERATION:GetPhaseIndex(Phase) +local branch=Phase.branch +for i,_phase in pairs(branch.phases)do +local phase=_phase +if phase.uid==Phase.uid then +return i,branch +end +end +return nil +end +function OPERATION:GetPhaseNext(Branch,PhaseStatus) +Branch=Branch or self:GetBranchActive() +local phases=Branch.phases or{} +local phase=nil +if self.phase and self.phase.branch.uid==Branch.uid then +phase=self.phase +end +local N=#phases +self:T(self.lid..string.format("Getting next phase! Branch=%s, Phases=%d, Status=%s",Branch.name,N,tostring(PhaseStatus))) +if N>0 then +if phase==nil and PhaseStatus==nil then +return phases[1] +end +local n=1 +if phase then +n=self:GetPhaseIndex(phase)+1 +end +for i=n,N do +local phase=phases[i] +if PhaseStatus==nil or PhaseStatus==phase.status then +return phase +end +end +end +return nil +end +function OPERATION:CountPhases(Status,Branch) +Branch=Branch or self.branchActive +local N=0 +for _,_phase in pairs(Branch.phases)do +local phase=_phase +if Status==nil or Status==phase.status then +N=N+1 +end +end +return N +end +function OPERATION:AddBranch(Name) +local branch=self:_CreateBranch(Name) +table.insert(self.branches,branch) +return branch +end +function OPERATION:GetBranchMaster() +return self.branchMaster +end +function OPERATION:GetBranchActive() +return self.branchActive or self.branchMaster +end +function OPERATION:GetBranchName(Branch) +Branch=Branch or self:GetBranchActive() +if Branch then +return Branch.name +end +return"None" +end +function OPERATION:AddEdge(PhaseFrom,PhaseTo,ConditionSwitch) +local edge={} +edge.phaseFrom=PhaseFrom +edge.phaseTo=PhaseTo +edge.branchFrom=PhaseFrom.branch +edge.branchTo=PhaseTo.branch +if ConditionSwitch then +edge.conditionSwitch=ConditionSwitch +else +edge.conditionSwitch=CONDITION:New("Edge") +edge.conditionSwitch:SetNoneResult(true) +end +table.insert(edge.branchFrom.edges,edge) +return edge +end +function OPERATION:AddEdgeConditonSwitchAll(Edge,Function,...) +if Edge then +local cf=Edge.conditionSwitch:AddFunctionAll(Function,...) +return cf +end +return nil +end +function OPERATION:AddMission(Mission,Phase) +Mission.phase=Phase +Mission.operation=self +table.insert(self.missions,Mission) +return self +end +function OPERATION:AddTarget(Target,Phase) +Target.phase=Phase +Target.operation=self +table.insert(self.targets,Target) +return self +end +function OPERATION:GetTargets(Phase) +local N={} +for _,_target in pairs(self.targets)do +local target=_target +if target:IsAlive()and(Phase==nil or target.phase==Phase)then +table.insert(N,target) +end +end +return N +end +function OPERATION:CountTargets(Phase) +local N=0 +for _,_target in pairs(self.targets)do +local target=_target +if target:IsAlive()and(Phase==nil or target.phase==Phase)then +N=N+1 +end +end +return N +end +function OPERATION:AssignCohort(Cohort) +self:T(self.lid..string.format("Assiging Cohort %s to operation",Cohort.name)) +self.cohorts[Cohort.name]=Cohort +end +function OPERATION:AssignLegion(Legion) +self.legions[Legion.alias]=Legion +end +function OPERATION:IsAssignedLegion(Legion) +local legion=self.legions[Legion.alias] +if legion then +self:T(self.lid..string.format("Legion %s is assigned to this operation",Legion.alias)) +return true +else +self:T(self.lid..string.format("Legion %s is NOT assigned to this operation",Legion.alias)) +return false +end +end +function OPERATION:IsAssignedCohort(Cohort) +local cohort=self.cohorts[Cohort.name] +if cohort then +self:T(self.lid..string.format("Cohort %s is assigned to this operation",Cohort.name)) +return true +else +local Legion=Cohort.legion +if Legion and self:IsAssignedLegion(Legion)then +self:T(self.lid..string.format("Legion %s of Cohort %s is assigned to this operation",Legion.alias,Cohort.name)) +return true +end +self:T(self.lid..string.format("Cohort %s is NOT assigned to this operation",Cohort.name)) +return false +end +return nil +end +function OPERATION:IsAssignedCohortOrLegion(Object) +local isAssigned=nil +if Object:IsInstanceOf("COHORT")then +isAssigned=self:IsAssignedCohort(Object) +elseif Object:IsInstanceOf("LEGION")then +isAssigned=self:IsAssignedLegion(Object) +else +self:E(self.lid.."ERROR: Unknown Object!") +end +return isAssigned +end +function OPERATION:IsPlanned() +local is=self:is("Planned") +return is +end +function OPERATION:IsRunning() +local is=self:is("Running") +return is +end +function OPERATION:IsPaused() +local is=self:is("Paused") +return is +end +function OPERATION:IsOver() +local is=self:is("Over") +return is +end +function OPERATION:IsStopped() +local is=self:is("Stopped") +return is +end +function OPERATION:IsNotOver() +local is=not(self:IsOver()or self:IsStopped()) +return is +end +function OPERATION:IsPhaseActive(Phase) +if Phase and Phase.status and Phase.status==OPERATION.PhaseStatus.ACTIVE then +return true +end +return false +end +function OPERATION:IsPhaseActive(Phase) +local phase=self:GetPhaseActive() +if phase and phase.uid==Phase.uid then +return true +else +return false +end +return nil +end +function OPERATION:IsPhasePlanned(Phase) +if Phase and Phase.status and Phase.status==OPERATION.PhaseStatus.PLANNED then +return true +end +return false +end +function OPERATION:IsPhaseOver(Phase) +if Phase and Phase.status and Phase.status==OPERATION.PhaseStatus.OVER then +return true +end +return false +end +function OPERATION:onafterStart(From,Event,To) +self:T(self.lid..string.format("Starting Operation!")) +return self +end +function OPERATION:onafterStatusUpdate(From,Event,To) +local Tnow=timer.getAbsTime() +local fsmstate=self:GetState() +if self:IsPlanned()then +if(self.Tstart and Tnow>self.Tstart or self.Tstart==nil)and(self.conditionStart==nil or self.conditionStart:Evaluate())then +self:Start() +end +elseif self:IsNotOver()then +if(self.Tstop and Tnow>self.Tstop or self.Tstop==nil)and(self.conditionOver==nil or self.conditionOver:Evaluate())then +self:Over() +end +end +if self:IsRunning()then +self:_CheckPhases() +end +if self.verbose>=1 then +local phaseName=self:GetPhaseName() +local branchName=self:GetBranchName() +local NphaseTot=self:CountPhases() +local NphaseAct=self:CountPhases(OPERATION.PhaseStatus.ACTIVE) +local NphasePla=self:CountPhases(OPERATION.PhaseStatus.PLANNED) +local NphaseOvr=self:CountPhases(OPERATION.PhaseStatus.OVER) +local text=string.format("State=%s: Phase=%s [%s], Phases=%d [Active=%d, Planned=%d, Over=%d]",fsmstate,phaseName,branchName,NphaseTot,NphaseAct,NphasePla,NphaseOvr) +self:I(self.lid..text) +end +if self.verbose>=2 then +local text="Phases:" +for i,_phase in pairs(self.branchActive.phases)do +local phase=_phase +text=text..string.format("\n[%d] %s [uid=%d]: status=%s Nact=%d",i,phase.name,phase.uid,tostring(phase.status),phase.nActive) +end +if text=="Phases:"then text=text.." None"end +self:I(self.lid..text) +end +self:__StatusUpdate(-30) +return self +end +function OPERATION:onafterPhaseNext(From,Event,To) +local Phase=self:GetPhaseNext() +if Phase then +self:PhaseChange(Phase) +else +self:Over() +end +return self +end +function OPERATION:onafterPhaseChange(From,Event,To,Phase) +local oldphase="None" +if self.phase then +if self.phase.status~=OPERATION.PhaseStatus.OVER then +self:SetPhaseStatus(self.phase,OPERATION.PhaseStatus.OVER) +end +oldphase=self.phase.name +end +self:I(self.lid..string.format("Phase change: %s --> %s",oldphase,Phase.name)) +self.phase=Phase +self:SetPhaseStatus(Phase,OPERATION.PhaseStatus.ACTIVE) +return self +end +function OPERATION:onafterPhaseOver(From,Event,To,Phase) +Phase.conditionOver:RemoveNonPersistant() +end +function OPERATION:onafterBranchSwitch(From,Event,To,Branch,Phase) +self:T(self.lid..string.format("Switching to branch %s",Branch.name)) +self.branchActive=Branch +self:PhaseChange(Phase) +return self +end +function OPERATION:onafterOver(From,Event,To) +self:T(self.lid..string.format("Operation is over!")) +self.phase=nil +for _,_branch in pairs(self.branches)do +local branch=_branch +for _,_phase in pairs(branch.phases)do +local phase=_phase +if not self:IsPhaseOver(phase)then +self:SetPhaseStatus(phase,OPERATION.PhaseStatus.OVER) +end +end +end +return self +end +function OPERATION:_CheckPhases() +local phase=self:GetPhaseActive() +if phase and phase.conditionOver then +local isOver=phase.conditionOver:Evaluate() +local Tnow=timer.getAbsTime() +if phase.duration and phase.Tstart and Tnow-phase.Tstart>phase.duration then +isOver=true +end +if isOver then +self:SetPhaseStatus(phase,OPERATION.PhaseStatus.OVER) +end +end +if phase==nil or phase.status==OPERATION.PhaseStatus.OVER then +for _,_edge in pairs(self.branchActive.edges)do +local edge=_edge +if phase then +end +if(edge.phaseFrom==nil)or(phase and edge.phaseFrom.uid==phase.uid)then +local switch=edge.conditionSwitch:Evaluate() +if switch then +local phaseTo=edge.phaseTo or self:GetPhaseNext(edge.branchTo,nil) +if phaseTo then +self:BranchSwitch(edge.branchTo,phaseTo) +else +self:Over() +end +return +end +end +end +self:PhaseNext() +end +end +function OPERATION:_CreatePhase(Name) +self.counterPhase=self.counterPhase+1 +local phase={} +phase.uid=self.counterPhase +phase.name=Name or string.format("Phase-%02d",self.counterPhase) +phase.conditionOver=CONDITION:New(Name.." Over") +phase.conditionOver:SetDefaultPersistence(false) +phase.status=OPERATION.PhaseStatus.PLANNED +phase.nActive=0 +return phase +end +function OPERATION:_CreateBranch(Name) +self.counterBranch=self.counterBranch+1 +local branch={} +branch.uid=self.counterBranch +branch.name=Name or string.format("Branch-%02d",self.counterBranch) +branch.phases={} +branch.edges={} +return branch +end +OPSGROUP={ +ClassName="OPSGROUP", +verbose=0, +lid=nil, +groupname=nil, +group=nil, +template=nil, +isLateActivated=nil, +waypoints=nil, +waypoints0=nil, +currentwp=1, +elements={}, +taskqueue={}, +taskcounter=nil, +taskcurrent=nil, +taskenroute=nil, +taskpaused={}, +missionqueue={}, +currentmission=nil, +detectedunits={}, +detectedgroups={}, +attribute=nil, +checkzones=nil, +inzones=nil, +groupinitialized=nil, +wpcounter=1, +radio={}, +option={}, +optionDefault={}, +tacan={}, +icls={}, +callsign={}, +Ndestroyed=0, +Nkills=0, +Nhit=0, +weaponData={}, +cargoqueue={}, +cargoBay={}, +mycarrier={}, +carrierLoader={}, +carrierUnloader={}, +useMEtasks=false, +pausedmissions={}, +} +OPSGROUP.ElementStatus={ +INUTERO="InUtero", +SPAWNED="Spawned", +PARKING="Parking", +ENGINEON="Engine On", +TAXIING="Taxiing", +TAKEOFF="Takeoff", +AIRBORNE="Airborne", +LANDING="Landing", +LANDED="Landed", +ARRIVED="Arrived", +DEAD="Dead", +} +OPSGROUP.GroupStatus={ +INUTERO="InUtero", +PARKING="Parking", +TAXIING="Taxiing", +AIRBORNE="Airborne", +INBOUND="Inbound", +LANDING="Landing", +LANDED="Landed", +ARRIVED="Arrived", +DEAD="Dead", +} +OPSGROUP.TaskStatus={ +SCHEDULED="scheduled", +EXECUTING="executing", +PAUSED="paused", +DONE="done", +} +OPSGROUP.TaskType={ +SCHEDULED="scheduled", +WAYPOINT="waypoint", +} +OPSGROUP.CarrierStatus={ +NOTCARRIER="not carrier", +PICKUP="pickup", +LOADING="loading", +LOADED="loaded", +TRANSPORTING="transporting", +UNLOADING="unloading", +} +OPSGROUP.CargoStatus={ +AWAITING="Awaiting carrier", +NOTCARGO="not cargo", +ASSIGNED="assigned to carrier", +BOARDING="boarding", +LOADED="loaded", +} +OPSGROUP.version="1.0.4" +function OPSGROUP:New(group) +local self=BASE:Inherit(self,FSM:New()) +if type(group)=="string"then +self.groupname=group +self.group=GROUP:FindByName(self.groupname) +else +self.group=group +self.groupname=group:GetName() +end +self.lid=string.format("OPSGROUP %s | ",tostring(self.groupname)) +if self.group then +if not self:IsExist()then +self:E(self.lid.."ERROR: GROUP does not exist! Returning nil") +return nil +end +end +if UTILS.IsInstanceOf(group,"OPSGROUP")then +self:E(self.lid.."ERROR: GROUP is already an OPSGROUP: "..tostring(self.groupname).."!") +return group +end +self:_SetTemplate() +self.dcsgroup=self:GetDCSGroup() +self.controller=self.dcsgroup:getController() +self.category=self.dcsgroup:getCategory() +if self.category==Group.Category.GROUND then +self.isArmygroup=true +elseif self.category==Group.Category.TRAIN then +self.isArmygroup=true +self.isTrain=true +elseif self.category==Group.Category.SHIP then +self.isNavygroup=true +elseif self.category==Group.Category.AIRPLANE then +self.isFlightgroup=true +elseif self.category==Group.Category.HELICOPTER then +self.isFlightgroup=true +self.isHelo=true +else +end +self.attribute=self.group:GetAttribute() +local units=self.group:GetUnits() +if units then +local masterunit=units[1] +if masterunit then +self.descriptors=masterunit:GetDesc() +self.actype=masterunit:GetTypeName() +self.isSubmarine=masterunit:HasAttribute("Submarines") +self.isEPLRS=masterunit:HasAttribute("Datalink") +if self:IsFlightgroup()then +self.rangemax=self.descriptors.range and self.descriptors.range*1000 or 500*1000 +self.ceiling=self.descriptors.Hmax +self.tankertype=select(2,masterunit:IsTanker()) +self.refueltype=select(2,masterunit:IsRefuelable()) +end +end +end +self.detectedunits=SET_UNIT:New() +self.detectedgroups=SET_GROUP:New() +self.inzones=SET_ZONE:New() +self:SetDefaultAltitude() +self:SetReturnToLegion() +self.spot={} +self.spot.On=false +self.spot.timer=TIMER:New(self._UpdateLaser,self) +self.spot.Coordinate=COORDINATE:New(0,0,0) +self:SetLaser(1688,true,false,0.5) +self.cargoStatus=OPSGROUP.CargoStatus.NOTCARGO +self.carrierStatus=OPSGROUP.CarrierStatus.NOTCARRIER +self:SetCarrierLoaderAllAspect() +self:SetCarrierUnloaderAllAspect() +self.taskcurrent=0 +self.taskcounter=0 +self:SetStartState("InUtero") +self:AddTransition("InUtero","Spawned","Spawned") +self:AddTransition("*","Respawn","InUtero") +self:AddTransition("*","Dead","InUtero") +self:AddTransition("*","InUtero","InUtero") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","Hit","*") +self:AddTransition("*","Damaged","*") +self:AddTransition("*","Destroyed","*") +self:AddTransition("*","UpdateRoute","*") +self:AddTransition("*","PassingWaypoint","*") +self:AddTransition("*","PassedFinalWaypoint","*") +self:AddTransition("*","GotoWaypoint","*") +self:AddTransition("*","Wait","*") +self:AddTransition("*","Stuck","*") +self:AddTransition("*","DetectedUnit","*") +self:AddTransition("*","DetectedUnitNew","*") +self:AddTransition("*","DetectedUnitKnown","*") +self:AddTransition("*","DetectedUnitLost","*") +self:AddTransition("*","DetectedGroup","*") +self:AddTransition("*","DetectedGroupNew","*") +self:AddTransition("*","DetectedGroupKnown","*") +self:AddTransition("*","DetectedGroupLost","*") +self:AddTransition("*","OutOfAmmo","*") +self:AddTransition("*","OutOfGuns","*") +self:AddTransition("*","OutOfRockets","*") +self:AddTransition("*","OutOfBombs","*") +self:AddTransition("*","OutOfMissiles","*") +self:AddTransition("*","OutOfTorpedos","*") +self:AddTransition("*","OutOfMissilesAA","*") +self:AddTransition("*","OutOfMissilesAG","*") +self:AddTransition("*","OutOfMissilesAS","*") +self:AddTransition("*","EnterZone","*") +self:AddTransition("*","LeaveZone","*") +self:AddTransition("*","LaserOn","*") +self:AddTransition("*","LaserOff","*") +self:AddTransition("*","LaserCode","*") +self:AddTransition("*","LaserPause","*") +self:AddTransition("*","LaserResume","*") +self:AddTransition("*","LaserLostLOS","*") +self:AddTransition("*","LaserGotLOS","*") +self:AddTransition("*","TaskExecute","*") +self:AddTransition("*","TaskPause","*") +self:AddTransition("*","TaskCancel","*") +self:AddTransition("*","TaskDone","*") +self:AddTransition("*","MissionStart","*") +self:AddTransition("*","MissionExecute","*") +self:AddTransition("*","MissionCancel","*") +self:AddTransition("*","PauseMission","*") +self:AddTransition("*","UnpauseMission","*") +self:AddTransition("*","MissionDone","*") +self:AddTransition("*","ElementInUtero","*") +self:AddTransition("*","ElementSpawned","*") +self:AddTransition("*","ElementDestroyed","*") +self:AddTransition("*","ElementDead","*") +self:AddTransition("*","ElementDamaged","*") +self:AddTransition("*","ElementHit","*") +self:AddTransition("*","Board","*") +self:AddTransition("*","Embarked","*") +self:AddTransition("*","Disembarked","*") +self:AddTransition("*","Pickup","*") +self:AddTransition("*","Loading","*") +self:AddTransition("*","Load","*") +self:AddTransition("*","Loaded","*") +self:AddTransition("*","LoadingDone","*") +self:AddTransition("*","Transport","*") +self:AddTransition("*","Unloading","*") +self:AddTransition("*","Unload","*") +self:AddTransition("*","Unloaded","*") +self:AddTransition("*","UnloadingDone","*") +self:AddTransition("*","Delivered","*") +self:AddTransition("*","TransportCancel","*") +self:AddTransition("*","HoverStart","*") +self:AddTransition("*","HoverEnd","*") +return self +end +function OPSGROUP:GetCoalition() +return self.group:GetCoalition() +end +function OPSGROUP:GetLifePoints(Element) +local life=0 +local life0=0 +if Element then +local unit=Element.unit +if unit then +life=unit:GetLife() +life0=unit:GetLife0() +life=math.min(life,life0) +end +else +for _,element in pairs(self.elements)do +local l,l0=self:GetLifePoints(element) +life=life+l +life0=life0+l0 +end +end +return life,life0 +end +function OPSGROUP:GetAttribute() +return self.attribute +end +function OPSGROUP:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function OPSGROUP:_SetLegion(Legion) +self:T2(self.lid..string.format("Adding opsgroup to legion %s",Legion.alias)) +self.legion=Legion +return self +end +function OPSGROUP:SetReturnToLegion(Switch) +if Switch==false then +self.legionReturn=false +else +self.legionReturn=true +end +self:T(self.lid..string.format("Setting ReturnToLegion=%s",tostring(self.legionReturn))) +return self +end +function OPSGROUP:SetDefaultSpeed(Speed) +if Speed then +self.speedCruise=UTILS.KnotsToKmph(Speed) +end +return self +end +function OPSGROUP:GetSpeedCruise() +local speed=UTILS.KmphToKnots(self.speedCruise or self.speedMax*0.7) +return speed +end +function OPSGROUP:SetDefaultAltitude(Altitude) +if Altitude then +self.altitudeCruise=UTILS.FeetToMeters(Altitude) +else +if self:IsFlightgroup()then +if self.isHelo then +self.altitudeCruise=UTILS.FeetToMeters(1500) +else +self.altitudeCruise=UTILS.FeetToMeters(10000) +end +else +self.altitudeCruise=0 +end +end +return self +end +function OPSGROUP:GetCruiseAltitude() +local alt=UTILS.MetersToFeet(self.altitudeCruise) +return alt +end +function OPSGROUP:SetAltitude(Altitude,Keep,RadarAlt) +if Altitude then +Altitude=UTILS.FeetToMeters(Altitude) +else +if self:IsFlightgroup()then +if self.isHelo then +Altitude=UTILS.FeetToMeters(1500) +else +Altitude=UTILS.FeetToMeters(10000) +end +else +Altitude=0 +end +end +local AltType="BARO" +if RadarAlt then +AltType="RADIO" +end +if self.controller then +self.controller:setAltitude(Altitude,Keep,AltType) +end +return self +end +function OPSGROUP:GetAltitude() +local alt=0 +if self.group then +alt=self.group:GetAltitude() +alt=UTILS.MetersToFeet(alt) +end +return alt +end +function OPSGROUP:SetSpeed(Speed,Keep,AltCorrected) +if Speed then +else +Speed=UTILS.KmphToKnots(self.speedMax) +end +if AltCorrected then +local altitude=self:GetAltitude() +Speed=UTILS.KnotsToAltKIAS(Speed,altitude) +end +Speed=UTILS.KnotsToMps(Speed) +if self.controller then +self.controller:setSpeed(Speed,Keep) +end +return self +end +function OPSGROUP:SetDetection(Switch) +self:T(self.lid..string.format("Detection is %s",tostring(Switch))) +self.detectionOn=Switch +return self +end +function OPSGROUP:GetDCSObject() +return self.dcsgroup +end +function OPSGROUP:KnowTarget(TargetObject,KnowType,KnowDist,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.KnowTarget,self,TargetObject,KnowType,KnowDist,0) +else +if TargetObject:IsInstanceOf("GROUP")then +TargetObject=TargetObject:GetUnit(1) +elseif TargetObject:IsInstanceOf("OPSGROUP")then +TargetObject=TargetObject.group:GetUnit(1) +end +local object=TargetObject:GetDCSObject() +for _,_element in pairs(self.elements)do +local element=_element +if element.controller then +element.controller:knowTarget(object,true,true) +end +end +self:T(self.lid..string.format("We should now know target %s",TargetObject:GetName())) +end +return self +end +function OPSGROUP:IsTargetDetected(TargetObject) +local objects={} +if TargetObject:IsInstanceOf("GROUP")then +for _,unit in pairs(TargetObject:GetUnits())do +table.insert(objects,unit:GetDCSObject()) +end +elseif TargetObject:IsInstanceOf("OPSGROUP")then +for _,unit in pairs(TargetObject.group:GetUnits())do +table.insert(objects,unit:GetDCSObject()) +end +elseif TargetObject:IsInstanceOf("UNIT")or TargetObject:IsInstanceOf("STATIC")then +table.insert(objects,TargetObject:GetDCSObject()) +end +for _,object in pairs(objects or{})do +local detected,visible,lastTime,type,distance,lastPos,lastVel=self.controller:isTargetDetected(object,1,2,4,8,16,32) +if detected then +return true +end +for _,_element in pairs(self.elements)do +local element=_element +if element.controller then +local detected,visible,lastTime,type,distance,lastPos,lastVel= +element.controller:isTargetDetected(object,1,2,4,8,16,32) +if detected then +return true +end +end +end +end +return false +end +function OPSGROUP:InWeaponRange(TargetCoord,WeaponBitType,RefCoord) +RefCoord=RefCoord or self:GetCoordinate() +local dist=TargetCoord:Get2DDistance(RefCoord) +if WeaponBitType then +local weapondata=self:GetWeaponData(WeaponBitType) +if weapondata then +if dist>=weapondata.RangeMin and dist<=weapondata.RangeMax then +return true +else +return false +end +end +else +for _,_weapondata in pairs(self.weaponData or{})do +local weapondata=_weapondata +if dist>=weapondata.RangeMin and dist<=weapondata.RangeMax then +return true +end +end +return false +end +return nil +end +function OPSGROUP:GetCoordinateInRange(TargetCoord,WeaponBitType,RefCoord,SurfaceTypes) +local coordInRange=nil +RefCoord=RefCoord or self:GetCoordinate() +local weapondata=self:GetWeaponData(WeaponBitType) +local dh={0,-5,5,-10,10,-15,15,-20,20,-25,25,-30,30,-35,35,-40,40,-45,45,-50,50,-55,55,-60,60,-65,65,-70,70,-75,75,-80,80} +local function _checkSurface(point) +if SurfaceTypes then +local stype=point:GetSurfaceType() +for _,sf in pairs(SurfaceTypes)do +if sf==stype then +return true +end +end +return false +else +return true +end +end +if weapondata then +local heading=TargetCoord:HeadingTo(RefCoord) +local dist=RefCoord:Get2DDistance(TargetCoord) +local range=nil +if dist>weapondata.RangeMax then +range=weapondata.RangeMax +self:T(self.lid..string.format("Out of max range = %.1f km by %.1f km for weapon %s",weapondata.RangeMax/1000,(weapondata.RangeMax-dist)/1000,tostring(WeaponBitType))) +elseif dist<weapondata.RangeMin then +range=weapondata.RangeMin +self:T(self.lid..string.format("Out of min range = %.1f km by %.1f km for weapon %s",weapondata.RangeMin/1000,(weapondata.RangeMin-dist)/1000,tostring(WeaponBitType))) +end +if range then +for _,delta in pairs(dh)do +local h=heading+delta +coordInRange=TargetCoord:Translate(range,h) +if _checkSurface(coordInRange)then +break +end +end +else +self:T(self.lid..string.format("Already in range for weapon %s",tostring(WeaponBitType))) +end +else +self:T(self.lid..string.format("No weapon data for weapon type %s",tostring(WeaponBitType))) +end +return coordInRange +end +function OPSGROUP:SetLaser(Code,CheckLOS,IROff,UpdateTime) +self.spot.Code=Code or 1688 +if CheckLOS~=nil then +self.spot.CheckLOS=CheckLOS +else +self.spot.CheckLOS=true +end +self.spot.IRon=not IROff +self.spot.dt=UpdateTime or 0.5 +return self +end +function OPSGROUP:GetLaserCode() +return self.spot.Code +end +function OPSGROUP:GetLaserCoordinate() +return self.spot.Coordinate +end +function OPSGROUP:GetLaserTarget() +return self.spot.TargetUnit +end +function OPSGROUP:SetCheckZones(CheckZonesSet) +self.checkzones=CheckZonesSet +return self +end +function OPSGROUP:AddCheckZone(CheckZone) +if not self.checkzones then +self.checkzones=SET_ZONE:New() +end +self.checkzones:AddZone(CheckZone) +return self +end +function OPSGROUP:AddWeaponRange(RangeMin,RangeMax,BitType,ConversionToMeters) +ConversionToMeters=ConversionToMeters or UTILS.NMToMeters +RangeMin=ConversionToMeters(RangeMin or 0) +RangeMax=ConversionToMeters(RangeMax or 10) +local weapon={} +weapon.BitType=BitType or ENUMS.WeaponFlag.Auto +weapon.RangeMax=RangeMax +weapon.RangeMin=RangeMin +self.weaponData=self.weaponData or{} +self.weaponData[tostring(weapon.BitType)]=weapon +return self +end +function OPSGROUP:GetWeaponData(BitType) +BitType=tostring(BitType or ENUMS.WeaponFlag.Auto) +if self.weaponData[BitType]then +return self.weaponData[BitType] +else +return self.weaponData[tostring(ENUMS.WeaponFlag.Auto)] +end +end +function OPSGROUP:GetDetectedUnits() +return self.detectedunits or{} +end +function OPSGROUP:GetDetectedGroups() +return self.detectedgroups or{} +end +function OPSGROUP:GetAmmo0() +return self.ammo +end +function OPSGROUP:GetThreat(ThreatLevelMin,ThreatLevelMax) +ThreatLevelMin=ThreatLevelMin or 1 +ThreatLevelMax=ThreatLevelMax or 10 +local threat=nil +local level=0 +for _,_unit in pairs(self.detectedunits:GetSet())do +local unit=_unit +local threatlevel=unit:GetThreatLevel() +if threatlevel>=ThreatLevelMin and threatlevel<=ThreatLevelMax then +if threatlevel<level then +level=threatlevel +threat=unit +end +end +end +return threat,level +end +function OPSGROUP:GetHighestThreat() +local threat=nil +local levelmax=-1 +for _,_unit in pairs(self.detectedunits:GetSet())do +local unit=_unit +local threatlevel=unit:GetThreatLevel() +if threatlevel>levelmax then +threat=unit +levelmax=threatlevel +end +end +return threat,levelmax +end +function OPSGROUP:SetEngageDetectedOn(RangeMax,TargetTypes,EngageZoneSet,NoEngageZoneSet) +if TargetTypes then +if type(TargetTypes)~="table"then +TargetTypes={TargetTypes} +end +else +TargetTypes={"All"} +end +if EngageZoneSet and EngageZoneSet:IsInstanceOf("ZONE_BASE")then +local zoneset=SET_ZONE:New():AddZone(EngageZoneSet) +EngageZoneSet=zoneset +end +if NoEngageZoneSet and NoEngageZoneSet:IsInstanceOf("ZONE_BASE")then +local zoneset=SET_ZONE:New():AddZone(NoEngageZoneSet) +NoEngageZoneSet=zoneset +end +self.engagedetectedOn=true +self.engagedetectedRmax=UTILS.NMToMeters(RangeMax or 25) +self.engagedetectedTypes=TargetTypes +self.engagedetectedEngageZones=EngageZoneSet +self.engagedetectedNoEngageZones=NoEngageZoneSet +self:T(self.lid..string.format("Engage detected ON: Rmax=%d NM",UTILS.MetersToNM(self.engagedetectedRmax))) +self:SetDetection(true) +return self +end +function OPSGROUP:SetEngageDetectedOff() +self:T(self.lid..string.format("Engage detected OFF")) +self.engagedetectedOn=false +return self +end +function OPSGROUP:SetRearmOnOutOfAmmo() +self.rearmOnOutOfAmmo=true +return self +end +function OPSGROUP:SetRetreatOnOutOfAmmo() +self.retreatOnOutOfAmmo=true +return self +end +function OPSGROUP:SetReturnOnOutOfAmmo() +self.rtzOnOutOfAmmo=true +return self +end +function OPSGROUP:SetCargoBayLimit(Weight,UnitName) +for _,_element in pairs(self.elements)do +local element=_element +if UnitName==nil or UnitName==element.name then +element.weightMaxCargo=Weight +if element.unit then +element.unit:SetCargoBayWeightLimit(Weight) +end +end +end +return self +end +function OPSGROUP:HasLoS(Coordinate,Element,OffsetElement,OffsetCoordinate) +if Coordinate then +local Vec3={x=Coordinate.x,y=Coordinate.y,z=Coordinate.z} +if OffsetCoordinate then +Vec3=UTILS.VecAdd(Vec3,OffsetCoordinate) +end +local function checklos(vec3) +if vec3 then +if OffsetElement then +vec3=UTILS.VecAdd(vec3,OffsetElement) +end +local _los=land.isVisible(vec3,Vec3) +return _los +end +return nil +end +if Element then +if Element.unit and Element.unit:IsAlive()then +local vec3=Element.unit:GetVec3() +local los=checklos(vec3) +return los +end +else +local gotit=false +for _,_element in pairs(self.elements)do +local element=_element +if element and element.unit and element.unit:IsAlive()then +gotit=true +local vec3=element.unit:GetVec3() +local los=checklos(vec3) +if los then +return true +end +end +end +if gotit then +return false +end +end +end +return nil +end +function OPSGROUP:GetGroup() +return self.group +end +function OPSGROUP:GetName() +return self.groupname +end +function OPSGROUP:GetDCSGroup() +local DCSGroup=Group.getByName(self.groupname) +return DCSGroup +end +function OPSGROUP:GetUnit(UnitNumber) +local DCSUnit=self:GetDCSUnit(UnitNumber) +if DCSUnit then +local unit=UNIT:Find(DCSUnit) +return unit +end +return nil +end +function OPSGROUP:GetDCSUnit(UnitNumber) +local DCSGroup=self:GetDCSGroup() +if DCSGroup then +local unit=DCSGroup:getUnit(UnitNumber or 1) +return unit +else +self:E(self.lid..string.format("ERROR: DCS group does not exist! Cannot get unit")) +end +return nil +end +function OPSGROUP:GetDCSUnits() +local DCSGroup=self:GetDCSGroup() +if DCSGroup then +local units=DCSGroup:getUnits() +return units +end +return nil +end +function OPSGROUP:GetVec2(UnitName) +local vec3=self:GetVec3(UnitName) +if vec3 then +local vec2={x=vec3.x,y=vec3.z} +return vec2 +end +return nil +end +function OPSGROUP:GetVec3(UnitName) +local vec3=nil +local carrier=self:_GetMyCarrierElement() +if carrier and carrier.status~=OPSGROUP.ElementStatus.DEAD and self:IsLoaded()then +local unit=carrier.unit +if unit and unit:IsExist()then +vec3=unit:GetVec3() +return vec3 +end +end +if self:IsExist()then +local unit=nil +if UnitName then +unit=Unit.getByName(UnitName) +else +unit=self:GetDCSUnit() +end +if unit then +local vec3=unit:getPoint() +return vec3 +end +end +if self.position then +return self.position +end +return nil +end +function OPSGROUP:GetCoordinate(NewObject,UnitName) +local vec3=self:GetVec3(UnitName)or self.position +if vec3 then +self.coordinate=self.coordinate or COORDINATE:New(0,0,0) +self.coordinate.x=vec3.x +self.coordinate.y=vec3.y +self.coordinate.z=vec3.z +if NewObject then +local coord=COORDINATE:NewFromCoordinate(self.coordinate) +return coord +else +return self.coordinate +end +else +self:T(self.lid.."WARNING: Cannot get coordinate!") +end +return nil +end +function OPSGROUP:GetVelocity(UnitName) +if self:IsExist()then +local unit=nil +if UnitName then +unit=Unit.getByName(UnitName) +else +unit=self:GetDCSUnit() +end +if unit then +local velvec3=unit:getVelocity() +local vel=UTILS.VecNorm(velvec3) +return vel +else +self:T(self.lid.."WARNING: Unit does not exist. Cannot get velocity!") +end +else +self:T(self.lid.."WARNING: Group does not exist. Cannot get velocity!") +end +return nil +end +function OPSGROUP:GetHeading(UnitName) +if self:IsExist()then +local unit=nil +if UnitName then +unit=Unit.getByName(UnitName) +else +unit=self:GetDCSUnit() +end +if unit then +local pos=unit:getPosition() +local heading=math.atan2(pos.x.z,pos.x.x) +if heading<0 then +heading=heading+2*math.pi +end +heading=math.deg(heading) +return heading +end +else +self:T(self.lid.."WARNING: Group does not exist. Cannot get heading!") +end +return nil +end +function OPSGROUP:GetOrientation(UnitName) +if self:IsExist()then +local unit=nil +if UnitName then +unit=Unit.getByName(UnitName) +else +unit=self:GetDCSUnit() +end +if unit then +local pos=unit:getPosition() +return pos.x,pos.y,pos.z +end +else +self:T(self.lid.."WARNING: Group does not exist. Cannot get orientation!") +end +return nil +end +function OPSGROUP:GetOrientationX(UnitName) +local X,Y,Z=self:GetOrientation(UnitName) +return X +end +function OPSGROUP:CheckTaskDescriptionUnique(description) +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.description==description then +return false +end +end +return true +end +function OPSGROUP:DespawnUnit(UnitName,Delay,NoEventRemoveUnit) +self:T(self.lid.."Despawn element "..tostring(UnitName)) +local element=self:GetElementByName(UnitName) +if element then +local DCSunit=Unit.getByName(UnitName) +if DCSunit then +DCSunit:destroy() +self:ElementInUtero(element) +if not NoEventRemoveUnit then +self:CreateEventRemoveUnit(timer.getTime(),DCSunit) +end +end +end +end +function OPSGROUP:DespawnElement(Element,Delay,NoEventRemoveUnit) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.DespawnElement,self,Element,0,NoEventRemoveUnit) +else +if Element then +local DCSunit=Unit.getByName(Element.name) +if DCSunit then +DCSunit:destroy() +if not NoEventRemoveUnit then +self:CreateEventRemoveUnit(timer.getTime(),DCSunit) +end +end +end +end +return self +end +function OPSGROUP:Despawn(Delay,NoEventRemoveUnit) +if Delay and Delay>0 then +self.scheduleIDDespawn=self:ScheduleOnce(Delay,OPSGROUP.Despawn,self,0,NoEventRemoveUnit) +else +self:T(self.lid..string.format("Despawning Group!")) +local DCSGroup=self:GetDCSGroup() +if DCSGroup then +local units=self:GetDCSUnits() +for i=1,#units do +local unit=units[i] +if unit then +local name=unit:getName() +if name then +self:DespawnUnit(name,0,NoEventRemoveUnit) +end +end +end +end +end +return self +end +function OPSGROUP:ReturnToLegion(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.ReturnToLegion,self) +else +if self.legion then +self:T(self.lid..string.format("Adding asset back to LEGION")) +self.legion:AddAsset(self.group,1) +else +self:E(self.lid..string.format("ERROR: Group does not belong to a LEGION!")) +end +end +return self +end +function OPSGROUP:DestroyUnit(UnitName,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.DestroyUnit,self,UnitName,0) +else +local unit=Unit.getByName(UnitName) +if unit then +local EventTime=timer.getTime() +if self:IsFlightgroup()then +self:CreateEventUnitLost(EventTime,unit) +else +self:CreateEventDead(EventTime,unit) +end +unit:destroy() +end +end +end +function OPSGROUP:Destroy(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.Destroy,self,0) +else +self:T(self.lid.."Destroying group!") +local units=self:GetDCSUnits() +if units then +for _,unit in pairs(units)do +if unit then +self:DestroyUnit(unit:getName()) +end +end +end +end +return self +end +function OPSGROUP:Activate(delay) +if delay and delay>0 then +self:T2(self.lid..string.format("Activating late activated group in %d seconds",delay)) +self:ScheduleOnce(delay,OPSGROUP.Activate,self) +else +if self:IsAlive()==false then +self:T(self.lid.."Activating late activated group") +self.group:Activate() +self.isLateActivated=false +elseif self:IsAlive()==true then +self:T(self.lid.."WARNING: Activating group that is already activated") +else +self:T(self.lid.."ERROR: Activating group that is does not exist!") +end +end +return self +end +function OPSGROUP:Deactivate(delay) +if delay and delay>0 then +self:ScheduleOnce(delay,OPSGROUP.Deactivate,self) +else +if self:IsAlive()==true then +self.template.lateActivation=true +local template=UTILS.DeepCopy(self.template) +self:_Respawn(0,template) +end +end +return self +end +function OPSGROUP:SelfDestruction(Delay,ExplosionPower,ElementName) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.SelfDestruction,self,0,ExplosionPower,ElementName) +else +for i,_element in pairs(self.elements)do +local element=_element +if ElementName==nil or ElementName==element.name then +local unit=element.unit +if unit and unit:IsAlive()then +unit:Explode(ExplosionPower or 100) +end +end +end +end +return self +end +function OPSGROUP:SetSRS(PathToSRS,Gender,Culture,Voice,Port,PathToGoogleKey,Label,Volume) +self.useSRS=true +local path=PathToSRS or MSRS.path +local port=Port or MSRS.port +self.msrs=MSRS:New(path,self.frequency,self.modulation) +self.msrs:SetGender(Gender) +self.msrs:SetCulture(Culture) +self.msrs:SetVoice(Voice) +self.msrs:SetPort(port) +self.msrs:SetLabel(Label) +if PathToGoogleKey then +self.msrs:SetProviderOptionsGoogle(PathToGoogleKey,PathToGoogleKey) +self.msrs:SetProvider(MSRS.Provider.GOOGLE) +end +self.msrs:SetCoalition(self:GetCoalition()) +self.msrs:SetVolume(Volume) +return self +end +function OPSGROUP:RadioTransmission(Text,Delay,SayCallsign,Frequency) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.RadioTransmission,self,Text,0,SayCallsign) +else +if self.useSRS and self.msrs then +local freq,modu,radioon=self:GetRadio() +local coord=self:GetCoordinate() +self.msrs:SetCoordinate(coord) +if Frequency then +self.msrs:SetFrequencies(Frequency) +else +self.msrs:SetFrequencies(freq) +end +self.msrs:SetModulations(modu) +if SayCallsign then +local callsign=self:GetCallsignName() +Text=string.format("%s, %s",callsign,Text) +end +self:T(self.lid..string.format("Radio transmission on %.3f MHz %s: %s",freq,UTILS.GetModulationName(modu),Text)) +self.msrs:PlayText(Text) +end +end +return self +end +function OPSGROUP:SetCarrierLoaderAllAspect(Length,Width) +self.carrierLoader.type="front" +self.carrierLoader.length=Length or 50 +self.carrierLoader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierLoaderFront(Length,Width) +self.carrierLoader.type="front" +self.carrierLoader.length=Length or 50 +self.carrierLoader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierLoaderBack(Length,Width) +self.carrierLoader.type="back" +self.carrierLoader.length=Length or 50 +self.carrierLoader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierLoaderStarboard(Length,Width) +self.carrierLoader.type="right" +self.carrierLoader.length=Length or 50 +self.carrierLoader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierLoaderPort(Length,Width) +self.carrierLoader.type="left" +self.carrierLoader.length=Length or 50 +self.carrierLoader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierUnloaderAllAspect(Length,Width) +self.carrierUnloader.type="front" +self.carrierUnloader.length=Length or 50 +self.carrierUnloader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierUnloaderFront(Length,Width) +self.carrierUnloader.type="front" +self.carrierUnloader.length=Length or 50 +self.carrierUnloader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierUnloaderBack(Length,Width) +self.carrierUnloader.type="back" +self.carrierUnloader.length=Length or 50 +self.carrierUnloader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierUnloaderStarboard(Length,Width) +self.carrierUnloader.type="right" +self.carrierUnloader.length=Length or 50 +self.carrierUnloader.width=Width or 20 +return self +end +function OPSGROUP:SetCarrierUnloaderPort(Length,Width) +self.carrierUnloader.type="left" +self.carrierUnloader.length=Length or 50 +self.carrierUnloader.width=Width or 20 +return self +end +function OPSGROUP:IsInZone(Zone) +local vec2=self:GetVec2() +local is=false +if vec2 then +is=Zone:IsVec2InZone(vec2) +else +self:T3(self.lid.."WARNING: Cannot get vec2 at IsInZone()!") +end +return is +end +function OPSGROUP:Get2DDistance(Coordinate) +local a=self:GetVec2() +local b={} +if Coordinate.z then +b.x=Coordinate.x +b.y=Coordinate.z +else +b.x=Coordinate.x +b.y=Coordinate.y +end +local dist=UTILS.VecDist2D(a,b) +return dist +end +function OPSGROUP:IsFlightgroup() +return self.isFlightgroup +end +function OPSGROUP:IsArmygroup() +return self.isArmygroup +end +function OPSGROUP:IsNavygroup() +return self.isNavygroup +end +function OPSGROUP:IsExist() +local DCSGroup=self:GetDCSGroup() +if DCSGroup then +local exists=DCSGroup:isExist() +return exists +end +return nil +end +function OPSGROUP:IsActive() +if self.group then +local active=self.group:IsActive() +return active +end +return nil +end +function OPSGROUP:IsAlive() +if self.group then +local alive=self.group:IsAlive() +return alive +end +return nil +end +function OPSGROUP:IsLateActivated() +return self.isLateActivated +end +function OPSGROUP:IsInUtero() +local is=self:Is("InUtero")and not self:IsDead() +return is +end +function OPSGROUP:IsSpawned() +local is=self:Is("Spawned") +return is +end +function OPSGROUP:IsDead() +return self.isDead +end +function OPSGROUP:IsDestroyed() +return self.isDestroyed +end +function OPSGROUP:IsStopped() +local is=self:Is("Stopped") +return is +end +function OPSGROUP:IsUncontrolled() +return self.isUncontrolled +end +function OPSGROUP:HasPassedFinalWaypoint() +return self.passedfinalwp +end +function OPSGROUP:IsRearming() +local rearming=self:Is("Rearming")or self:Is("Rearm") +return rearming +end +function OPSGROUP:IsOutOfAmmo() +return self.outofAmmo +end +function OPSGROUP:IsOutOfBombs() +return self.outofBombs +end +function OPSGROUP:IsOutOfGuns() +return self.outofGuns +end +function OPSGROUP:IsOutOfMissiles() +return self.outofMissiles +end +function OPSGROUP:IsOutOfTorpedos() +return self.outofTorpedos +end +function OPSGROUP:IsLasing() +return self.spot.On +end +function OPSGROUP:IsRetreating() +local is=self:is("Retreating")or self:is("Retreated") +return is +end +function OPSGROUP:IsRetreated() +local is=self:is("Retreated") +return is +end +function OPSGROUP:IsReturning() +local is=self:is("Returning") +return is +end +function OPSGROUP:IsEngaging() +local is=self:is("Engaging") +return is +end +function OPSGROUP:IsWaiting() +if self.Twaiting then +return true +end +return false +end +function OPSGROUP:IsNotCarrier() +return self.carrierStatus==OPSGROUP.CarrierStatus.NOTCARRIER +end +function OPSGROUP:IsCarrier() +return not self:IsNotCarrier() +end +function OPSGROUP:IsPickingup() +return self.carrierStatus==OPSGROUP.CarrierStatus.PICKUP +end +function OPSGROUP:IsLoading() +return self.carrierStatus==OPSGROUP.CarrierStatus.LOADING +end +function OPSGROUP:IsTransporting() +return self.carrierStatus==OPSGROUP.CarrierStatus.TRANSPORTING +end +function OPSGROUP:IsUnloading() +return self.carrierStatus==OPSGROUP.CarrierStatus.UNLOADING +end +function OPSGROUP:IsCargo(CheckTransport) +return not self:IsNotCargo(CheckTransport) +end +function OPSGROUP:IsNotCargo(CheckTransport) +local notcargo=self.cargoStatus==OPSGROUP.CargoStatus.NOTCARGO +if notcargo then +return true +else +if CheckTransport then +if self.cargoTransportUID==nil then +return true +else +return false +end +else +return false +end +end +return notcargo +end +function OPSGROUP:_AddMyLift(Transport) +self.mylifts=self.mylifts or{} +self.mylifts[Transport.uid]=true +return self +end +function OPSGROUP:_DelMyLift(Transport) +if self.mylifts then +self.mylifts[Transport.uid]=nil +end +return self +end +function OPSGROUP:IsAwaitingLift(Transport) +if self.mylifts then +for uid,iswaiting in pairs(self.mylifts)do +if Transport==nil or Transport.uid==uid then +if iswaiting==true then +return true +end +end +end +end +return false +end +function OPSGROUP:_GetPausedMission() +if self.pausedmissions and#self.pausedmissions>0 then +for _,mid in pairs(self.pausedmissions)do +if mid then +local mission=self:GetMissionByID(mid) +if mission and mission:IsNotOver()then +return mission +end +end +end +end +return nil +end +function OPSGROUP:_CountPausedMissions() +local N=0 +if self.pausedmissions and#self.pausedmissions>0 then +for _,mid in pairs(self.pausedmissions)do +local mission=self:GetMissionByID(mid) +if mission and mission:IsNotOver()then +N=N+1 +end +end +end +return N +end +function OPSGROUP:_RemovePausedMission(AuftragsNummer) +if self.pausedmissions and#self.pausedmissions>0 then +for i=#self.pausedmissions,1,-1 do +local mid=self.pausedmissions[i] +if mid==AuftragsNummer then +table.remove(self.pausedmissions,i) +return self +end +end +end +return self +end +function OPSGROUP:IsBoarding(CarrierGroupName) +if CarrierGroupName then +local carrierGroup=self:_GetMyCarrierGroup() +if carrierGroup and carrierGroup.groupname~=CarrierGroupName then +return false +end +end +return self.cargoStatus==OPSGROUP.CargoStatus.BOARDING +end +function OPSGROUP:IsLoaded(CarrierGroupName) +local isloaded=self.cargoStatus==OPSGROUP.CargoStatus.LOADED +if not isloaded then +return false +end +if CarrierGroupName then +if type(CarrierGroupName)~="table"then +CarrierGroupName={CarrierGroupName} +end +for _,CarrierName in pairs(CarrierGroupName)do +local carrierGroup=self:_GetMyCarrierGroup() +if carrierGroup and carrierGroup.groupname==CarrierName then +return isloaded +end +end +return false +end +return isloaded +end +function OPSGROUP:IsBusy() +if self:IsBoarding()then +return true +end +if self:IsRearming()then +return true +end +if self:IsReturning()then +return true +end +if self:IsPickingup()or self:IsLoading()or self:IsTransporting()or self:IsUnloading()then +return true +end +if self:IsEngaging()then +return true +end +return false +end +function OPSGROUP:GetWaypoints() +return self.waypoints +end +function OPSGROUP:MarkWaypoints(Duration) +for i,_waypoint in pairs(self.waypoints or{})do +local waypoint=_waypoint +local text=string.format("Waypoint ID=%d of %s",waypoint.uid,self.groupname) +text=text..string.format("\nSpeed=%.1f kts, Alt=%d ft (%s)",UTILS.MpsToKnots(waypoint.speed),UTILS.MetersToFeet(waypoint.alt or 0),"BARO") +if waypoint.marker then +if waypoint.marker.text~=text then +waypoint.marker.text=text +end +else +waypoint.marker=MARKER:New(waypoint.coordinate,text):ToCoalition(self:GetCoalition()) +end +end +if Duration then +self:RemoveWaypointMarkers(Duration) +end +return self +end +function OPSGROUP:RemoveWaypointMarkers(Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.RemoveWaypointMarkers,self) +else +for i,_waypoint in pairs(self.waypoints or{})do +local waypoint=_waypoint +if waypoint.marker then +waypoint.marker:Remove() +end +end +end +return self +end +function OPSGROUP:GetWaypointByID(uid) +for _,_waypoint in pairs(self.waypoints or{})do +local waypoint=_waypoint +if waypoint.uid==uid then +return waypoint +end +end +return nil +end +function OPSGROUP:GetWaypointByIndex(index) +for i,_waypoint in pairs(self.waypoints)do +local waypoint=_waypoint +if i==index then +return waypoint +end +end +return nil +end +function OPSGROUP:GetWaypointUIDFromIndex(index) +for i,_waypoint in pairs(self.waypoints)do +local waypoint=_waypoint +if i==index then +return waypoint.uid +end +end +return nil +end +function OPSGROUP:GetWaypointIndex(uid) +if uid then +for i,_waypoint in pairs(self.waypoints or{})do +local waypoint=_waypoint +if waypoint.uid==uid then +return i +end +end +end +return nil +end +function OPSGROUP:GetWaypointIndexNext(cyclic,i) +if cyclic==nil then +cyclic=self.adinfinitum +end +local N=#self.waypoints +i=i or self.currentwp +local n=math.min(i+1,N) +if cyclic and i==N then +n=1 +end +return n +end +function OPSGROUP:GetWaypointIndexCurrent() +return self.currentwp or 1 +end +function OPSGROUP:GetWaypointIndexAfterID(uid) +local index=self:GetWaypointIndex(uid) +if index then +return index+1 +else +return#self.waypoints+1 +end +end +function OPSGROUP:GetWaypoint(indx) +return self.waypoints[indx] +end +function OPSGROUP:GetWaypointFinal() +return self.waypoints[#self.waypoints] +end +function OPSGROUP:GetWaypointNext(cyclic) +local n=self:GetWaypointIndexNext(cyclic) +return self.waypoints[n] +end +function OPSGROUP:GetWaypointCurrent() +return self.waypoints[self.currentwp] +end +function OPSGROUP:GetWaypointCurrentUID() +local wp=self:GetWaypointCurrent() +if wp then +return wp.uid +end +return nil +end +function OPSGROUP:GetNextWaypointCoordinate(cyclic) +local waypoint=self:GetWaypointNext(cyclic) +return waypoint.coordinate +end +function OPSGROUP:GetWaypointCoordinate(index) +local waypoint=self:GetWaypoint(index) +if waypoint then +return waypoint.coordinate +end +return nil +end +function OPSGROUP:GetWaypointSpeed(indx) +local waypoint=self:GetWaypoint(indx) +if waypoint then +return UTILS.MpsToKnots(waypoint.speed) +end +return nil +end +function OPSGROUP:GetWaypointUID(waypoint) +return waypoint.uid +end +function OPSGROUP:GetWaypointID(indx) +local waypoint=self:GetWaypoint(indx) +if waypoint then +return waypoint.uid +end +return nil +end +function OPSGROUP:GetSpeedToWaypoint(indx) +local speed=self:GetWaypointSpeed(indx) +if speed<=0.01 then +speed=self:GetSpeedCruise() +end +return speed +end +function OPSGROUP:GetDistanceToWaypoint(indx) +local dist=0 +if#self.waypoints>0 then +indx=indx or self:GetWaypointIndexNext() +local wp=self:GetWaypoint(indx) +if wp then +local coord=self:GetCoordinate() +dist=coord:Get2DDistance(wp.coordinate) +end +end +return dist +end +function OPSGROUP:GetTimeToWaypoint(indx) +local s=self:GetDistanceToWaypoint(indx) +local v=self:GetVelocity() +local t=s/v +if t==math.inf then +return 365*24*60*60 +elseif t==math.nan then +return 0 +else +return t +end +end +function OPSGROUP:GetExpectedSpeed() +if self:IsHolding()or self:Is("Rearming")or self:IsWaiting()or self:IsRetreated()then +return 0 +else +return self.speedWp or 0 +end +end +function OPSGROUP:RemoveWaypointByID(uid) +local index=self:GetWaypointIndex(uid) +if index then +self:RemoveWaypoint(index) +end +return self +end +function OPSGROUP:RemoveWaypoint(wpindex) +if self.waypoints then +local wp=self:GetWaypoint(wpindex) +local istemp=wp.temp or wp.detour or wp.astar or wp.missionUID +local N=#self.waypoints +if N==1 then +self:T(self.lid..string.format("ERROR: Cannot remove waypoint with index=%d! It is the only waypoint and a group needs at least ONE waypoint",wpindex)) +return self +end +if wpindex>N then +self:T(self.lid..string.format("ERROR: Cannot remove waypoint with index=%d as there are only N=%d waypoints!",wpindex,N)) +return self +end +if wp and wp.marker then +wp.marker:Remove() +end +table.remove(self.waypoints,wpindex) +local n=#self.waypoints +self:T(self.lid..string.format("Removing waypoint UID=%d [temp=%s]: index=%d [currentwp=%d]. N %d-->%d",wp.uid,tostring(istemp),wpindex,self.currentwp,N,n)) +if wpindex>self.currentwp then +if self.currentwp>=n and not(self.adinfinitum or istemp)then +self:_PassedFinalWaypoint(true,"Removed FUTURE waypoint we are currently moving to and that was the LAST waypoint") +end +self:_CheckGroupDone(1) +else +if self.currentwp==1 then +if self.adinfinitum then +self.currentwp=#self.waypoints +else +self.currentwp=1 +end +else +self.currentwp=self.currentwp-1 +end +if(self.adinfinitum or istemp)then +self:_PassedFinalWaypoint(false,"Removed PASSED temporary waypoint") +end +end +end +return self +end +function OPSGROUP:OnEventBirth(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +if self.isFlightgroup then +if EventData.Place then +self.homebase=self.homebase or EventData.Place +self.currbase=EventData.Place +else +self.currbase=nil +end +if self.homebase and not self.destbase then +self.destbase=self.homebase +end +self:T(self.lid..string.format("EVENT: Element %s born at airbase %s ==> spawned",unitname,self.currbase and self.currbase:GetName()or"unknown")) +else +self:T3(self.lid..string.format("EVENT: Element %s born ==> spawned",unitname)) +end +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.SPAWNED then +self:T(self.lid..string.format("EVENT: Element %s born ==> spawned",unitname)) +self:T2(self.lid..string.format("DCS unit=%s isExist=%s",tostring(EventData.IniDCSUnit:getName()),tostring(EventData.IniDCSUnit:isExist()))) +self:ElementSpawned(element) +end +end +end +function OPSGROUP:OnEventHit(EventData) +if EventData and EventData.TgtGroup and EventData.TgtUnit and EventData.TgtGroupName and EventData.TgtGroupName==self.groupname then +self:T2(self.lid..string.format("EVENT: Unit %s hit!",EventData.TgtUnitName)) +local unit=EventData.TgtUnit +local group=EventData.TgtGroup +local unitname=EventData.TgtUnitName +local element=self:GetElementByName(unitname) +self.Nhit=self.Nhit or 0 +self.Nhit=self.Nhit+1 +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:ElementHit(element,EventData.IniUnit) +end +end +end +function OPSGROUP:OnEventDead(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +self:T2(self.lid..string.format("EVENT: Unit %s dead!",EventData.IniUnitName)) +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:T(self.lid..string.format("EVENT: Element %s dead ==> destroyed",element.name)) +self:ElementDestroyed(element) +end +end +end +function OPSGROUP:OnEventRemoveUnit(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +self:T2(self.lid..string.format("EVENT: Unit %s removed!",EventData.IniUnitName)) +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:T(self.lid..string.format("EVENT: Element %s removed ==> dead",element.name)) +self:ElementDead(element) +end +end +end +function OPSGROUP:OnEventPlayerLeaveUnit(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +self:T2(self.lid..string.format("EVENT: Player left Unit %s!",EventData.IniUnitName)) +local unit=EventData.IniUnit +local group=EventData.IniGroup +local unitname=EventData.IniUnitName +local element=self:GetElementByName(unitname) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:T(self.lid..string.format("EVENT: Player left Element %s ==> dead",element.name)) +self:ElementDead(element) +end +end +end +function OPSGROUP:OnEventKill(EventData) +if EventData and EventData.IniGroup and EventData.IniUnit and EventData.IniGroupName and EventData.IniGroupName==self.groupname then +local targetname=tostring(EventData.TgtUnitName) +self:T2(self.lid..string.format("EVENT: Unit %s killed object %s!",tostring(EventData.IniUnitName),targetname)) +local target=UNIT:FindByName(targetname) +if not target then +target=STATIC:FindByName(targetname,false) +end +if target then +self:T(self.lid..string.format("EVENT: Unit %s killed unit/static %s!",tostring(EventData.IniUnitName),targetname)) +self.Nkills=self.Nkills+1 +local mission=self:GetMissionCurrent() +if mission then +mission.Nkills=mission.Nkills+1 +end +end +end +end +function OPSGROUP:SetTask(DCSTask) +if self:IsAlive()then +if self.taskenroute and#self.taskenroute>0 then +if tostring(DCSTask.id)=="ComboTask"then +for _,task in pairs(self.taskenroute)do +table.insert(DCSTask.params.tasks,1,task) +end +else +local tasks=UTILS.DeepCopy(self.taskenroute) +table.insert(tasks,DCSTask) +DCSTask=self.group.TaskCombo(self,tasks) +end +end +self.controller:setTask(DCSTask) +local text=string.format("SETTING Task %s",tostring(DCSTask.id)) +if tostring(DCSTask.id)=="ComboTask"then +for i,task in pairs(DCSTask.params.tasks)do +text=text..string.format("\n[%d] %s",i,tostring(task.id)) +end +end +self:T(self.lid..text) +end +return self +end +function OPSGROUP:PushTask(DCSTask) +if self:IsAlive()then +if self.taskenroute and#self.taskenroute>0 then +if tostring(DCSTask.id)=="ComboTask"then +for _,task in pairs(self.taskenroute)do +table.insert(DCSTask.params.tasks,1,task) +end +else +local tasks=UTILS.DeepCopy(self.taskenroute) +table.insert(tasks,DCSTask) +DCSTask=self.group.TaskCombo(self,tasks) +end +end +self.controller:pushTask(DCSTask) +local text=string.format("PUSHING Task %s",tostring(DCSTask.id)) +if tostring(DCSTask.id)=="ComboTask"then +for i,task in pairs(DCSTask.params.tasks)do +text=text..string.format("\n[%d] %s",i,tostring(task.id)) +end +end +self:T(self.lid..text) +end +return self +end +function OPSGROUP:HasTaskController() +local hastask=nil +if self.controller then +hastask=self.controller:hasTask() +end +self:T3(self.lid..string.format("Controller hasTask=%s",tostring(hastask))) +return hastask +end +function OPSGROUP:ClearTasks() +local hastask=self:HasTaskController() +if self:IsAlive()and self.controller and self:HasTaskController()then +self:T(self.lid..string.format("CLEARING Tasks")) +self.controller:resetTask() +end +return self +end +function OPSGROUP:AddTask(task,clock,description,prio,duration) +local newtask=self:NewTaskScheduled(task,clock,description,prio,duration) +table.insert(self.taskqueue,newtask) +self:T(self.lid..string.format("Adding SCHEDULED task %s starting at %s",newtask.description,UTILS.SecondsToClock(newtask.time,true))) +self:T3({newtask=newtask}) +return newtask +end +function OPSGROUP:NewTaskScheduled(task,clock,description,prio,duration) +self.taskcounter=self.taskcounter+1 +local time=timer.getAbsTime()+5 +if clock then +if type(clock)=="string"then +time=UTILS.ClockToSeconds(clock) +elseif type(clock)=="number"then +time=timer.getAbsTime()+clock +end +end +local newtask={} +newtask.status=OPSGROUP.TaskStatus.SCHEDULED +newtask.dcstask=task +newtask.description=description or task.id +newtask.prio=prio or 50 +newtask.time=time +newtask.id=self.taskcounter +newtask.duration=duration +newtask.waypoint=-1 +newtask.type=OPSGROUP.TaskType.SCHEDULED +newtask.stopflag=USERFLAG:New(string.format("%s StopTaskFlag %d",self.groupname,newtask.id)) +newtask.stopflag:Set(0) +return newtask +end +function OPSGROUP:AddTaskWaypoint(task,Waypoint,description,prio,duration) +Waypoint=Waypoint or self:GetWaypointNext() +if Waypoint then +self.taskcounter=self.taskcounter+1 +local newtask={} +newtask.description=description or string.format("Task #%d",self.taskcounter) +newtask.status=OPSGROUP.TaskStatus.SCHEDULED +newtask.dcstask=task +newtask.prio=prio or 50 +newtask.id=self.taskcounter +newtask.duration=duration +newtask.time=0 +newtask.waypoint=Waypoint.uid +newtask.type=OPSGROUP.TaskType.WAYPOINT +newtask.stopflag=USERFLAG:New(string.format("%s StopTaskFlag %d",self.groupname,newtask.id)) +newtask.stopflag:Set(0) +table.insert(self.taskqueue,newtask) +self:T(self.lid..string.format("Adding WAYPOINT task %s at WP ID=%d",newtask.description,newtask.waypoint)) +self:T3({newtask=newtask}) +return newtask +end +return nil +end +function OPSGROUP:AddTaskEnroute(task) +if not self.taskenroute then +self.taskenroute={} +end +local gotit=false +for _,Task in pairs(self.taskenroute)do +if Task.id==task.id then +gotit=true +break +end +end +if not gotit then +self:T(self.lid..string.format("Adding enroute task")) +table.insert(self.taskenroute,task) +end +end +function OPSGROUP:GetTasksWaypoint(id) +local tasks={} +self:_SortTaskQueue() +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.type==OPSGROUP.TaskType.WAYPOINT and task.status==OPSGROUP.TaskStatus.SCHEDULED and task.waypoint==id then +table.insert(tasks,task) +end +end +return tasks +end +function OPSGROUP:CountTasksWaypoint(id) +local n=0 +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.type==OPSGROUP.TaskType.WAYPOINT and task.status==OPSGROUP.TaskStatus.SCHEDULED and task.waypoint==id then +n=n+1 +end +end +return n +end +function OPSGROUP:_SortTaskQueue() +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.time<taskB.time) +end +table.sort(self.taskqueue,_sort) +end +function OPSGROUP:CountRemainingTasks() +local Ntot=0 +local Nwp=0 +local Nsched=0 +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.status==OPSGROUP.TaskStatus.SCHEDULED then +Ntot=Ntot+1 +if task.type==OPSGROUP.TaskType.WAYPOINT then +Nwp=Nwp+1 +elseif task.type==OPSGROUP.TaskType.SCHEDULED then +Nsched=Nsched+1 +end +end +end +return Ntot,Nsched,Nwp +end +function OPSGROUP:RemoveTask(Task) +for i=#self.taskqueue,1,-1 do +local task=self.taskqueue[i] +if task.id==Task.id then +table.remove(self.taskqueue,i) +if task.type==OPSGROUP.TaskType.WAYPOINT and task.status==OPSGROUP.TaskStatus.SCHEDULED then +self:_CheckGroupDone(1) +end +return true +end +end +return false +end +function OPSGROUP:_GetNextTask() +if self.taskpaused then +end +if#self.taskqueue==0 then +return nil +end +self:_SortTaskQueue() +local time=timer.getAbsTime() +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.type==OPSGROUP.TaskType.SCHEDULED and task.status==OPSGROUP.TaskStatus.SCHEDULED and time>=task.time then +return task +end +end +return nil +end +function OPSGROUP:GetTaskCurrent() +local task=self:GetTaskByID(self.taskcurrent,OPSGROUP.TaskStatus.EXECUTING) +return task +end +function OPSGROUP:GetTaskByID(id,status) +for _,_task in pairs(self.taskqueue)do +local task=_task +if task.id==id then +if status==nil or status==task.status then +return task +end +end +end +return nil +end +function OPSGROUP:onbeforeTaskExecute(From,Event,To,Task) +local Mission=self:GetMissionByTaskID(Task.id) +if Mission and(Mission.Tpush or#Mission.conditionPush>0)then +if Mission:IsReadyToPush()then +if self:IsWaiting()then +self.Twaiting=nil +self.dTwait=nil +if self:IsFlightgroup()then +self.flaghold:Set(1) +end +end +else +if self:IsWaiting()then +else +local alt=Mission.missionAltitude and UTILS.MetersToFeet(Mission.missionAltitude)or nil +self:Wait(nil,alt) +end +local dt=Mission.Tpush and Mission.Tpush-timer.getAbsTime()or 20 +self:T(self.lid..string.format("Mission %s task execute suspended for %d seconds",Mission.name,dt)) +self:__TaskExecute(-dt,Task) +return false +end +end +if Mission and Mission.opstransport then +local delivered=Mission.opstransport:IsCargoDelivered(self.groupname) +if not delivered then +local dt=30 +self:T(self.lid..string.format("Mission %s task execute suspended for %d seconds because we were not delivered",Mission.name,dt)) +self:__TaskExecute(-dt,Task) +if(self:IsArmygroup()or self:IsNavygroup())and self:IsCruising()then +self:FullStop() +end +return false +end +end +return true +end +function OPSGROUP:onafterTaskExecute(From,Event,To,Task) +local text=string.format("Task %s ID=%d execute",tostring(Task.description),Task.id) +self:T(self.lid..text) +self:T2({Task}) +if self.taskcurrent>0 then +self:TaskCancel() +end +self.taskcurrent=Task.id +Task.timestamp=timer.getAbsTime() +Task.status=OPSGROUP.TaskStatus.EXECUTING +if self:GetTaskCurrent()==nil then +table.insert(self.taskqueue,Task) +end +local Mission=self:GetMissionByTaskID(self.taskcurrent) +self:_UpdateTask(Task,Mission) +if Mission then +self:MissionExecute(Mission) +end +end +function OPSGROUP:_UpdateTask(Task,Mission) +Mission=Mission or self:GetMissionByTaskID(self.taskcurrent) +if Task.dcstask.id==AUFTRAG.SpecialTask.FORMATION then +local followSet=SET_GROUP:New():AddGroup(self.group) +local param=Task.dcstask.params +local followUnit=UNIT:FindByName(param.unitname) +Task.formation=AI_FORMATION:New(followUnit,followSet,AUFTRAG.SpecialTask.FORMATION,"Follow X at given parameters.") +Task.formation:FormationCenterWing(-param.offsetX,50,math.abs(param.altitude),50,param.offsetZ,50) +Task.formation:SetFollowTimeInterval(param.dtFollow) +Task.formation:SetFlightModeFormation(self.group) +Task.formation:Start() +elseif Task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +local zone=Task.dcstask.params.zone +local surfacetypes=nil +if self:IsArmygroup()then +surfacetypes={land.SurfaceType.LAND,land.SurfaceType.ROAD} +elseif self:IsNavygroup()then +surfacetypes={land.SurfaceType.WATER,land.SurfaceType.SHALLOW_WATER} +end +local Coordinate=zone:GetRandomCoordinate(nil,nil,surfacetypes) +local Speed=Task.dcstask.params.speed and UTILS.MpsToKnots(Task.dcstask.params.speed)or UTILS.KmphToKnots(self.speedCruise) +local Altitude=Task.dcstask.params.altitude and UTILS.MetersToFeet(Task.dcstask.params.altitude)or nil +local currUID=self:GetWaypointCurrent().uid +local wp=nil +if self.isFlightgroup then +wp=FLIGHTGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +elseif self.isArmygroup then +wp=ARMYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Task.dcstask.params.formation) +elseif self.isNavygroup then +wp=NAVYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +end +wp.missionUID=Mission and Mission.auftragsnummer or nil +elseif Task.dcstask.id==AUFTRAG.SpecialTask.RECON then +local target=Task.dcstask.params.target +self.reconindecies={} +for i=1,#target.targets do +table.insert(self.reconindecies,i) +end +local n=1 +if Task.dcstask.params.randomly then +n=UTILS.GetRandomTableElement(self.reconindecies) +else +table.remove(self.reconindecies,n) +end +local object=target.targets[n] +local zone=object.Object +local Coordinate=zone:GetRandomCoordinate() +local Speed=Task.dcstask.params.speed and UTILS.MpsToKnots(Task.dcstask.params.speed)or UTILS.KmphToKnots(self.speedCruise) +local Altitude=Task.dcstask.params.altitude and UTILS.MetersToFeet(Task.dcstask.params.altitude)or nil +local currUID=self:GetWaypointCurrent().uid +local wp=nil +if self.isFlightgroup then +wp=FLIGHTGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +elseif self.isArmygroup then +wp=ARMYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Task.dcstask.params.formation) +elseif self.isNavygroup then +wp=NAVYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +end +wp.missionUID=Mission and Mission.auftragsnummer or nil +elseif Task.dcstask.id==AUFTRAG.SpecialTask.AMMOSUPPLY or Task.dcstask.id==AUFTRAG.SpecialTask.FUELSUPPLY then +elseif Task.dcstask.id==AUFTRAG.SpecialTask.REARMING then +local rearmed=self:_CheckAmmoFull() +if rearmed then +self:T2(self.lid.."Ammo already full ==> reaming task done!") +self:TaskDone(Task) +else +self:T2(self.lid.."Ammo not full ==> Rearm()") +self:Rearm() +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.ALERT5 then +elseif Task.dcstask.id==AUFTRAG.SpecialTask.ONGUARD or Task.dcstask.id==AUFTRAG.SpecialTask.ARMOREDGUARD then +if self:IsArmygroup()or self:IsNavygroup()then +self:FullStop() +else +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.NOTHING then +if self:IsArmygroup()or self:IsNavygroup()then +self:__FullStop(0.1) +else +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.AIRDEFENSE or Task.dcstask.id==AUFTRAG.SpecialTask.EWR then +if self:IsArmygroup()or self:IsNavygroup()then +self:FullStop() +else +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK or Task.dcstask.id==AUFTRAG.SpecialTask.ARMORATTACK then +local target=Task.dcstask.params.target +local speed=self.speedMax and UTILS.KmphToKnots(self.speedMax)or nil +if Task.dcstask.params.speed then +speed=UTILS.MpsToKnots(Task.dcstask.params.speed) +end +if target then +self:EngageTarget(target,speed,Task.dcstask.params.formation) +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.PATROLRACETRACK then +if self.isFlightgroup then +self:T("We are Special Auftrag Patrol Race Track, starting now ...") +local aircraft=self:GetGroup() +aircraft:PatrolRaceTrack(Task.dcstask.params.TrackPoint1,Task.dcstask.params.TrackPoint2,Task.dcstask.params.TrackAltitude,Task.dcstask.params.TrackSpeed,Task.dcstask.params.TrackFormation,false,1) +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.HOVER then +if self.isFlightgroup then +self:T("We are Special Auftrag HOVER, hovering now ...") +local alt=Task.dcstask.params.hoverAltitude +local time=Task.dcstask.params.hoverTime +local mSpeed=Task.dcstask.params.missionSpeed or self.speedCruise or 150 +local Speed=UTILS.KmphToKnots(mSpeed) +local CruiseAlt=UTILS.FeetToMeters(Task.dcstask.params.missionAltitude or 1000) +local helo=self:GetGroup() +helo:SetSpeed(0.01,true) +helo:SetAltitude(alt,true,"BARO") +self:HoverStart() +local function FlyOn(Helo,Speed,CruiseAlt,Task) +if Helo then +Helo:SetSpeed(Speed,true) +Helo:SetAltitude(CruiseAlt,true,"BARO") +self:T("We are Special Auftrag HOVER, end of hovering now ...") +self:TaskDone(Task) +self:HoverEnd() +end +end +local timer=TIMER:New(FlyOn,helo,Speed,CruiseAlt,Task) +timer:Start(time) +end +elseif Task.dcstask.id==AUFTRAG.SpecialTask.RELOCATECOHORT then +self:T(self.lid.."Executing task for relocation mission") +local legion=Task.dcstask.params.legion +local Coordinate=legion.spawnzone:GetRandomCoordinate() +local currUID=self:GetWaypointCurrent().uid +local wp=nil +if self.isArmygroup then +self:T2(self.lid.."Routing group to spawn zone of new legion") +wp=ARMYGROUP.AddWaypoint(self,Coordinate,UTILS.KmphToKnots(self.speedCruise),currUID,Mission.optionFormation) +elseif self.isFlightgroup then +self:T2(self.lid.."Routing group to intermediate point near new legion") +Coordinate=self:GetCoordinate():GetIntermediateCoordinate(Coordinate,0.8) +wp=FLIGHTGROUP.AddWaypoint(self,Coordinate,UTILS.KmphToKnots(self.speedCruise),currUID,UTILS.MetersToFeet(self.altitudeCruise)) +elseif self.isNavygroup then +self:T2(self.lid.."Routing group to spawn zone of new legion") +wp=NAVYGROUP.AddWaypoint(self,Coordinate,UTILS.KmphToKnots(self.speedCruise),currUID) +else +end +wp.missionUID=Mission and Mission.auftragsnummer or nil +elseif Task.dcstask.id==AUFTRAG.SpecialTask.CAPTUREZONE then +if self:IsEngaging()then +self:T2(self.lid..string.format("CaptureZone: Engaging currently!")) +else +local Coalitions=UTILS.GetCoalitionEnemy(self:GetCoalition(),false) +local zoneCurr=Task.target +if zoneCurr then +self:T(self.lid..string.format("Current target zone=%s owner=%s",zoneCurr:GetName(),zoneCurr:GetOwnerName())) +if zoneCurr:GetOwner()==self:GetCoalition()then +self:T(self.lid..string.format("Zone %s captured ==> Task DONE!",zoneCurr:GetName())) +if Task.StayInZoneTime then +local stay=Task.StayInZoneTime +self:__TaskDone(stay,Task) +else +self:TaskDone(Task) +end +else +self:T(self.lid..string.format("Zone %s NOT captured!",zoneCurr:GetName())) +if Mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.EXECUTING then +self:T(self.lid..string.format("Zone %s NOT captured and EXECUTING ==> Find target",zoneCurr:GetName())) +local targetgroup=zoneCurr:GetScannedGroupSet():GetClosestGroup(self.coordinate,Coalitions) +if targetgroup then +self:T(self.lid..string.format("Zone %s NOT captured: engaging target %s",zoneCurr:GetName(),targetgroup:GetName())) +self:EngageTarget(targetgroup) +else +if self:IsFlightgroup()then +self:T(self.lid..string.format("Zone %s not captured but no target group could be found ==> TaskDone as FLIGHTGROUPS cannot capture zones",zoneCurr:GetName())) +self:TaskDone(Task) +else +self:T(self.lid..string.format("Zone %s not captured but no target group could be found. Should be captured in the next zone evaluation.",zoneCurr:GetName())) +end +end +else +self:T(self.lid..string.format("Zone %s NOT captured and NOT EXECUTING",zoneCurr:GetName())) +end +end +else +self:T(self.lid..string.format("NO Current target zone=%s")) +end +end +else +if Task.type==OPSGROUP.TaskType.SCHEDULED or Task.ismission then +local DCSTask=nil +if Task.dcstask.id==AUFTRAG.SpecialTask.BARRAGE then +local vec2=self:GetVec2() +local param=Task.dcstask.params +local heading=param.heading or math.random(1,360) +local Altitude=param.altitude or 500 +local Alpha=param.angle or math.random(45,85) +local distance=Altitude/math.tan(math.rad(Alpha)) +local tvec2=UTILS.Vec2Translate(vec2,distance,heading) +self:T(self.lid..string.format("Barrage: Shots=%s, Altitude=%d m, Angle=%d°, heading=%03d°, distance=%d m",tostring(param.shots),Altitude,Alpha,heading,distance)) +DCSTask=CONTROLLABLE.TaskFireAtPoint(nil,tvec2,param.radius,param.shots,param.weaponType,Altitude) +elseif Task.ismission and Task.dcstask.id=='FireAtPoint'then +DCSTask=UTILS.DeepCopy(Task.dcstask) +local ammo=self:GetAmmoTot() +local nAmmo=ammo.Total +local weaponType=DCSTask.params.weaponType or-1 +if weaponType==ENUMS.WeaponFlag.CruiseMissile then +nAmmo=ammo.MissilesCR +elseif weaponType==ENUMS.WeaponFlag.AnyRocket then +nAmmo=ammo.Rockets +elseif weaponType==ENUMS.WeaponFlag.Cannons then +nAmmo=ammo.Guns +end +local nShots=DCSTask.params.expendQty or 1 +self:T(self.lid..string.format("Fire at point with nshots=%d of %d",nShots,nAmmo)) +if nShots==-1 then +nShots=nAmmo +self:T(self.lid..string.format("Fire at point taking max amount of ammo = %d",nShots)) +elseif nShots<1 then +local p=nShots +nShots=UTILS.Round(p*nAmmo,0) +self:T(self.lid..string.format("Fire at point taking %.1f percent amount of ammo = %d",p,nShots)) +else +nShots=math.min(nShots,nAmmo) +end +DCSTask.params.expendQty=nShots +else +DCSTask=Task.dcstask +end +self:_SandwitchDCSTask(DCSTask,Task) +elseif Task.type==OPSGROUP.TaskType.WAYPOINT then +else +self:T(self.lid.."ERROR: Unknown task type: ") +end +end +end +function OPSGROUP:_SandwitchDCSTask(DCSTask,Task,SetTask,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP._SandwitchDCSTask,self,DCSTask,Task,SetTask) +else +local DCStasks={} +if DCSTask.id=='ComboTask'then +for TaskID,Task in ipairs(DCSTask.params.tasks)do +table.insert(DCStasks,Task) +end +else +table.insert(DCStasks,DCSTask) +end +local TaskCombo=self.group:TaskCombo(DCStasks) +local TaskCondition=self.group:TaskCondition(nil,Task.stopflag:GetName(),1,nil,Task.duration) +local TaskControlled=self.group:TaskControlled(TaskCombo,TaskCondition) +local TaskDone=self.group:TaskFunction("OPSGROUP._TaskDone",self,Task) +local TaskFinal=self.group:TaskCombo({TaskControlled,TaskDone}) +if SetTask then +self:SetTask(TaskFinal) +else +self:PushTask(TaskFinal) +end +end +end +function OPSGROUP:onafterTaskCancel(From,Event,To,Task) +local currenttask=self:GetTaskCurrent() +Task=Task or currenttask +if Task then +if currenttask and Task.id==currenttask.id then +local stopflag=Task.stopflag:Get() +local text=string.format("Current task %s ID=%d cancelled (flag %s=%d)",Task.description,Task.id,Task.stopflag:GetName(),stopflag) +self:T(self.lid..text) +Task.stopflag:Set(1) +local done=false +if Task.dcstask.id==AUFTRAG.SpecialTask.FORMATION then +Task.formation:Stop() +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.RECON then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.AMMOSUPPLY then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.FUELSUPPLY then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.REARMING then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.ALERT5 then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.ONGUARD or Task.dcstask.id==AUFTRAG.SpecialTask.ARMOREDGUARD then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.GROUNDATTACK or Task.dcstask.id==AUFTRAG.SpecialTask.ARMORATTACK then +done=true +elseif Task.dcstask.id==AUFTRAG.SpecialTask.NOTHING then +done=true +elseif stopflag==1 or(not self:IsAlive())or self:IsDead()or self:IsStopped()then +done=true +end +if done then +self:TaskDone(Task) +end +else +self:T(self.lid..string.format("TaskCancel: Setting task %s ID=%d to DONE",Task.description,Task.id)) +self:TaskDone(Task) +end +else +local text=string.format("WARNING: No (current) task to cancel!") +self:T(self.lid..text) +end +end +function OPSGROUP:onbeforeTaskDone(From,Event,To,Task) +local allowed=true +if Task.status==OPSGROUP.TaskStatus.PAUSED then +allowed=false +end +return allowed +end +function OPSGROUP:onafterTaskDone(From,Event,To,Task) +local text=string.format("Task done: %s ID=%d",Task.description,Task.id) +self:T(self.lid..text) +if Task.id==self.taskcurrent then +self.taskcurrent=0 +end +Task.status=OPSGROUP.TaskStatus.DONE +if Task.backupROE then +self:SwitchROE(Task.backupROE) +end +local Mission=self:GetMissionByTaskID(Task.id) +if Mission and Mission:IsNotOver()then +local status=Mission:GetGroupStatus(self) +if status~=AUFTRAG.GroupStatus.PAUSED then +if Mission.type==AUFTRAG.Type.CAPTUREZONE and Mission:CountMissionTargets()>0 then +self:T(self.lid.."Remove mission waypoints") +self:_RemoveMissionWaypoints(Mission,false) +if self:IsFlightgroup()then +else +self:T(self.lid.."Task done ==> Route to mission for next opszone") +self:MissionStart(Mission) +return +end +end +local EgressUID=Mission:GetGroupEgressWaypointUID(self) +if EgressUID then +self:T(self.lid..string.format("Task Done but Egress waypoint defined ==> Will call Mission Done once group passed waypoint UID=%d!",EgressUID)) +else +self:T(self.lid.."Task Done ==> Mission Done!") +self:MissionDone(Mission) +end +else +if self:IsOnMission(Mission.auftragsnummer)then +self.currentmission=nil +end +self:T(self.lid.."Remove mission waypoints") +self:_RemoveMissionWaypoints(Mission,false) +end +else +if Task.description=="Engage_Target"then +self:T(self.lid.."Task DONE Engage_Target ==> Cruise") +self:Disengage() +end +if Task.description==AUFTRAG.SpecialTask.ONGUARD or Task.description==AUFTRAG.SpecialTask.ARMOREDGUARD or Task.description==AUFTRAG.SpecialTask.NOTHING then +self:T(self.lid.."Task DONE OnGuard ==> Cruise") +self:Cruise() +end +if Task.description=="Task_Land_At"then +self:T(self.lid.."Taske DONE Task_Land_At ==> Wait") +self:Cruise() +self:Wait(20,100) +else +self:T(self.lid.."Task Done but NO mission found ==> _CheckGroupDone in 1 sec") +self:_CheckGroupDone(1) +end +end +end +function OPSGROUP:AddMission(Mission) +Mission:AddOpsGroup(self) +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.SCHEDULED) +Mission:Scheduled() +Mission.Nelements=Mission.Nelements+#self.elements +Mission.Ngroups=Mission.Ngroups+1 +table.insert(self.missionqueue,Mission) +self.adinfinitum=Mission.DCStask.params.adinfinitum and Mission.DCStask.params.adinfinitum or false +local text=string.format("Added %s mission %s starting at %s, stopping at %s", +tostring(Mission.type),tostring(Mission.name),UTILS.SecondsToClock(Mission.Tstart,true),Mission.Tstop and UTILS.SecondsToClock(Mission.Tstop,true)or"INF") +self:T(self.lid..text) +return self +end +function OPSGROUP:RemoveMission(Mission) +for i=#self.missionqueue,1,-1 do +local mission=self.missionqueue[i] +if mission.auftragsnummer==Mission.auftragsnummer then +local Task=Mission:GetGroupWaypointTask(self) +if Task then +self:RemoveTask(Task) +end +for j=#self.pausedmissions,1,-1 do +local mid=self.pausedmissions[j] +if Mission.auftragsnummer==mid then +table.remove(self.pausedmissions,j) +end +end +table.remove(self.missionqueue,i) +return self +end +end +return self +end +function OPSGROUP:CancelAllMissions() +self:T(self.lid.."Cancelling ALL missions!") +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +local mystatus=mission:GetGroupStatus(self) +if not(mystatus==AUFTRAG.GroupStatus.DONE or mystatus==AUFTRAG.GroupStatus.CANCELLED)then +self:T(self.lid.."Cancelling mission "..tostring(mission:GetName())) +self:MissionCancel(mission) +end +end +end +function OPSGROUP:CountRemainingMissison() +local N=0 +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission and mission:IsNotOver()then +local status=mission:GetGroupStatus(self) +if status~=AUFTRAG.GroupStatus.DONE and status~=AUFTRAG.GroupStatus.CANCELLED then +N=N+1 +end +end +end +return N +end +function OPSGROUP:CountRemainingTransports() +local N=0 +for _,_transport in pairs(self.cargoqueue)do +local transport=_transport +local mystatus=transport:GetCarrierTransportStatus(self) +local status=transport:GetState() +self:T(self.lid..string.format("Transport my status=%s [%s]",mystatus,status)) +if transport and mystatus==OPSTRANSPORT.Status.SCHEDULED and status~=OPSTRANSPORT.Status.DELIVERED and status~=OPSTRANSPORT.Status.CANCELLED then +N=N+1 +end +end +if N==0 and self.cargoTransport and +self.cargoTransport:GetState()~=OPSTRANSPORT.Status.DELIVERED and self.cargoTransport:GetCarrierTransportStatus(self)~=OPSTRANSPORT.Status.DELIVERED and +self.cargoTransport:GetState()~=OPSTRANSPORT.Status.CANCELLED and self.cargoTransport:GetCarrierTransportStatus(self)~=OPSTRANSPORT.Status.CANCELLED then +N=1 +end +return N +end +function OPSGROUP:_GetNextMission() +if self:IsPickingup()or self:IsLoading()or self:IsTransporting()or self:IsUnloading()or self:IsLoaded()then +return nil +end +local Nmissions=#self.missionqueue +if Nmissions==0 then +return nil +end +local function _sort(a,b) +local taskA=a +local taskB=b +return(taskA.prio<taskB.prio)or(taskA.prio==taskB.prio and taskA.Tstart<taskB.Tstart) +end +table.sort(self.missionqueue,_sort) +local vip=math.huge +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.importance and mission.importance<vip then +vip=mission.importance +end +end +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +local isEscort=true +if mission.type==AUFTRAG.Type.ESCORT then +local target=mission:GetTargetData() +if not target:IsAlive()then +isEscort=false +end +end +local isTransport=true +if mission.opstransport then +local cargos=mission.opstransport:GetCargoOpsGroups(false)or{} +for _,_opsgroup in pairs(cargos)do +local opscargo=_opsgroup +if opscargo.groupname==self.groupname then +break +end +end +end +local isScheduled=mission:GetGroupStatus(self)==AUFTRAG.GroupStatus.SCHEDULED +local isReadyToGo=(mission:IsReadyToGo()or self.legion) +local isImportant=(mission.importance==nil or mission.importance<=vip) +local go=isScheduled and isReadyToGo and isImportant and isTransport and isEscort +self:T3(self.lid..string.format("Mission %s [%s]: Go=%s [Scheduled=%s, Ready=%s, Important=%s, Transport=%s, Escort=%s]",mission:GetName(),mission:GetType(),tostring(go), +tostring(isScheduled),tostring(isReadyToGo),tostring(isImportant),tostring(isTransport),tostring(isEscort))) +if go then +return mission +end +end +return nil +end +function OPSGROUP:GetMissionByID(id) +if not id then +return nil +end +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==id then +return mission +end +end +return nil +end +function OPSGROUP:IsMissionInQueue(Mission) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission.auftragsnummer==Mission.auftragsnummer then +return true +end +end +return false +end +function OPSGROUP:IsMissionTypeInQueue(MissionType) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +if mission:GetType()==MissionType then +return true +end +end +return false +end +function OPSGROUP:GetMissionByTaskID(taskid) +if taskid then +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +local task=mission:GetGroupWaypointTask(self) +if task and task.id and task.id==taskid then +return mission +end +end +end +return nil +end +function OPSGROUP:GetMissionCurrent() +return self:GetMissionByID(self.currentmission) +end +function OPSGROUP:IsOnMission(MissionUID) +if self.currentmission==nil then +return false +else +if MissionUID then +return MissionUID==self.currentmission +else +return true +end +end +return true +end +function OPSGROUP:onbeforeMissionStart(From,Event,To,Mission) +self:T(self.lid..string.format("Starting mission %s, FSM=%s, LateActivated=%s, UnControlled=%s",tostring(Mission.name),self:GetState(),tostring(self:IsLateActivated()),tostring(self:IsUncontrolled()))) +local delay=0 +if self:IsInUtero()then +if self:IsLateActivated()then +self:Activate(delay) +delay=delay+1 +end +end +if self:IsFlightgroup()and self:IsUncontrolled()and Mission.type~=AUFTRAG.Type.ALERT5 then +local fc=FLIGHTGROUP.GetFlightControl(self) +if fc and fc:IsControlling(self)then +FLIGHTGROUP.SetReadyForTakeoff(self,true) +else +self:StartUncontrolled(delay) +end +end +return true +end +function OPSGROUP:onafterMissionStart(From,Event,To,Mission) +local text=string.format("Starting %s Mission %s, target %s",Mission.type,tostring(Mission.name),Mission:GetTargetName()) +self:T(self.lid..text) +self.currentmission=Mission.auftragsnummer +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.STARTED) +Mission:__Started(3) +if self.speedMax>3.6 or true then +self:RouteToMission(Mission,3) +else +self:T(self.lid.."Immobile GROUP!") +local Clock=Mission.Tpush and UTILS.SecondsToClock(Mission.Tpush)or 5 +local Task=self:AddTask(Mission.DCStask,Clock,Mission.name,Mission.prio,Mission.duration) +Task.ismission=true +Mission:SetGroupWaypointTask(self,Task) +self:__TaskExecute(3,Task) +end +end +function OPSGROUP:onafterMissionExecute(From,Event,To,Mission) +local text=string.format("Executing %s Mission %s, target %s",Mission.type,tostring(Mission.name),Mission:GetTargetName()) +self:T(self.lid..text) +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.EXECUTING) +Mission:Executing() +if self:IsHolding()and not self:HasPassedFinalWaypoint()then +self:Cruise() +end +if Mission.engagedetectedOn then +self:SetEngageDetectedOn(UTILS.MetersToNM(Mission.engagedetectedRmax),Mission.engagedetectedTypes,Mission.engagedetectedEngageZones,Mission.engagedetectedNoEngageZones) +end +if self.isFlightgroup then +if Mission.prohibitABExecute==true then +self:SetProhibitAfterburner() +self:T(self.lid.."Set prohibit AB") +elseif Mission.prohibitABExecute==false then +self:SetAllowAfterburner() +self:T2(self.lid.."Set allow AB") +end +end +end +function OPSGROUP:onafterPauseMission(From,Event,To) +local Mission=self:GetMissionCurrent() +if Mission then +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.PAUSED) +local Task=Mission:GetGroupWaypointTask(self) +self:T(self.lid..string.format("Pausing current mission %s. Task=%s",tostring(Mission.name),tostring(Task and Task.description or"WTF"))) +self:TaskCancel(Task) +self:_RemoveMissionWaypoints(Mission) +table.insert(self.pausedmissions,1,Mission.auftragsnummer) +end +end +function OPSGROUP:onafterUnpauseMission(From,Event,To) +local mission=self:_GetPausedMission() +if mission then +self:T(self.lid..string.format("Unpausing mission %s [%s]",mission:GetName(),mission:GetType())) +mission.unpaused=true +self:MissionStart(mission) +for i,mid in pairs(self.pausedmissions)do +if mid==mission.auftragsnummer then +self:T(self.lid..string.format("Removing paused mission id=%d",mid)) +table.remove(self.pausedmissions,i) +break +end +end +else +self:T(self.lid.."ERROR: No mission to unpause!") +end +end +function OPSGROUP:onafterMissionCancel(From,Event,To,Mission) +if self:IsOnMission(Mission.auftragsnummer)then +local Task=Mission:GetGroupWaypointTask(self) +if Task then +self:T(self.lid..string.format("Cancel current mission %s. Task=%s",tostring(Mission.name),tostring(Task and Task.description or"WTF"))) +self:TaskCancel(Task) +else +self:MissionDone(Mission) +end +else +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.CANCELLED) +self:RemoveMission(Mission) +self:_CheckGroupDone(1) +end +end +function OPSGROUP:_RemoveMissionWaypoints(Mission,Silently) +for i=#self.waypoints,1,-1 do +local wp=self.waypoints[i] +if wp.missionUID==Mission.auftragsnummer then +if Silently then +table.remove(self.waypoints,i) +else +self:RemoveWaypoint(i) +end +end +end +end +function OPSGROUP:onafterMissionDone(From,Event,To,Mission) +local text=string.format("Mission %s DONE!",Mission.name) +self:T(self.lid..text) +Mission:SetGroupStatus(self,AUFTRAG.GroupStatus.DONE) +if self:IsOnMission(Mission.auftragsnummer)then +self.currentmission=nil +end +self:_RemoveMissionWaypoints(Mission) +if Mission.patroldata then +Mission.patroldata.noccupied=Mission.patroldata.noccupied-1 +AIRWING.UpdatePatrolPointMarker(self,Mission.patroldata) +end +if Mission.engagedetectedOn then +self:SetEngageDetectedOff() +end +if Mission.optionROE then +self:SwitchROE() +end +if self:IsFlightgroup()and Mission.optionROT then +self:SwitchROT() +end +if Mission.optionAlarm then +self:SwitchAlarmstate() +end +if Mission.optionEPLRS then +self:SwitchEPLRS() +end +if Mission.optionEmission then +self:SwitchEmission() +end +if Mission.optionInvisible then +self:SwitchInvisible() +end +if Mission.optionImmortal then +self:SwitchImmortal() +end +if Mission.optionFormation and self:IsFlightgroup()then +self:SwitchFormation() +end +if Mission.radio then +self:SwitchRadio() +end +if Mission.tacan then +self:_SwitchTACAN() +local cohort=self.cohort +if cohort then +cohort:ReturnTacan(Mission.tacan.Channel) +end +local asset=Mission:GetAssetByName(self.groupname) +if asset then +asset.tacan=nil +end +end +if Mission.icls then +self:_SwitchICLS() +end +if self.legion and Mission.legionReturn~=nil then +self:SetReturnToLegion(Mission.legionReturn) +end +local delay=1 +if Mission.type==AUFTRAG.Type.ARTY then +delay=60 +elseif Mission.type==AUFTRAG.Type.RELOCATECOHORT then +local legion=Mission.DCStask.params.legion +self:T(self.lid..string.format("Asset relocated to new legion=%s",tostring(legion.alias))) +local asset=Mission:GetAssetByName(self.groupname) +if asset then +asset.wid=legion.uid +end +self.legion=legion +if self.isArmygroup then +self:T2(self.lid.."Adding asset via ReturnToLegion()") +self:ReturnToLegion() +elseif self.isFlightgroup then +self:T2(self.lid.."Adding asset via RTB to new legion airbase") +self:RTB(self.legion.airbase) +end +return +end +if self.isFlightgroup then +if Mission.prohibitAB==true then +self:T2("Setting prohibit AB") +self:SetProhibitAfterburner() +elseif Mission.prohibitAB==false then +self:T2("Setting allow AB") +self:SetAllowAfterburner() +end +end +if self.legion and self.legionReturn==false and self.waypoints and#self.waypoints==1 then +local Coordinate=self:GetCoordinate() +if self.isArmygroup then +ARMYGROUP.AddWaypoint(self,Coordinate,0,nil,nil,false) +elseif self.isNavygroup then +NAVYGROUP.AddWaypoint(self,Coordinate,0,nil,nil,false) +end +self:RemoveWaypoint(1) +self:_PassedFinalWaypoint(true,"Passed final waypoint as group is done with mission but should NOT return to its legion") +end +self:_CheckGroupDone(delay) +end +function OPSGROUP:RouteToMission(mission,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,OPSGROUP.RouteToMission,self,mission) +else +self:T(self.lid..string.format("Route To Mission")) +if self:IsDead()or self:IsStopped()then +self:T(self.lid..string.format("Route To Mission: I am DEAD or STOPPED! Ooops...")) +return +end +if self:IsCargo()then +self:T(self.lid..string.format("Route To Mission: I am CARGO! You cannot route me...")) +return +end +if mission.type==AUFTRAG.Type.OPSTRANSPORT then +self:T(self.lid..string.format("Route To Mission: I am OPSTRANSPORT! Add transport and return...")) +self:AddOpsTransport(mission.opstransport) +return +end +if mission.type==AUFTRAG.Type.ALERT5 then +self:T(self.lid..string.format("Route To Mission: I am ALERT5! Go right to MissionExecute()...")) +self:MissionExecute(mission) +return +end +local uid=self:GetWaypointCurrentUID() +local waypointcoord=nil +local currentcoord=self:GetCoordinate() +local roadcoord=currentcoord:GetClosestPointToRoad() +local roaddist=nil +if roadcoord then +roaddist=currentcoord:Get2DDistance(roadcoord) +end +local targetzone=nil +local randomradius=mission.missionWaypointRadius or 1000 +local surfacetypes=nil +if self:IsArmygroup()then +surfacetypes={land.SurfaceType.LAND,land.SurfaceType.ROAD} +elseif self:IsNavygroup()then +surfacetypes={land.SurfaceType.WATER,land.SurfaceType.SHALLOW_WATER} +end +local targetobject=mission:GetObjective(currentcoord,UTILS.GetCoalitionEnemy(self:GetCoalition(),true)) +if targetobject then +self:T(self.lid..string.format("Route to mission target object %s",targetobject:GetName())) +end +if mission.opstransport and not mission.opstransport:IsCargoDelivered(self.groupname)then +local tzc=mission.opstransport:GetTZCofCargo(self.groupname) +local pickupzone=tzc.PickupZone +if self:IsInZone(pickupzone)then +self:PauseMission() +self:FullStop() +return +else +waypointcoord=pickupzone:GetRandomCoordinate() +end +elseif mission.type==AUFTRAG.Type.PATROLZONE or +mission.type==AUFTRAG.Type.BARRAGE or +mission.type==AUFTRAG.Type.AMMOSUPPLY or +mission.type==AUFTRAG.Type.FUELSUPPLY or +mission.type==AUFTRAG.Type.REARMING or +mission.type==AUFTRAG.Type.AIRDEFENSE or +mission.type==AUFTRAG.Type.EWR then +targetzone=targetobject +waypointcoord=targetzone:GetRandomCoordinate(nil,nil,surfacetypes) +elseif mission.type==AUFTRAG.Type.ONGUARD or mission.type==AUFTRAG.Type.ARMOREDGUARD then +waypointcoord=mission:GetMissionWaypointCoord(self.group,nil,surfacetypes) +elseif mission.type==AUFTRAG.Type.NOTHING then +targetzone=targetobject +waypointcoord=targetzone:GetRandomCoordinate(nil,nil,surfacetypes) +elseif mission.type==AUFTRAG.Type.HOVER then +local zone=targetobject +waypointcoord=zone:GetCoordinate() +elseif mission.type==AUFTRAG.Type.RELOCATECOHORT then +local ToCoordinate=mission.DCStask.params.legion:GetCoordinate() +if self.isFlightgroup then +waypointcoord=currentcoord:GetIntermediateCoordinate(ToCoordinate,0.2):SetAltitude(self.altitudeCruise) +elseif self.isArmygroup then +if roadcoord then +waypointcoord=roadcoord +else +waypointcoord=currentcoord:GetIntermediateCoordinate(ToCoordinate,100) +end +else +waypointcoord=currentcoord:GetIntermediateCoordinate(ToCoordinate,0.05) +end +elseif mission.type==AUFTRAG.Type.CAPTUREZONE then +targetzone=targetobject:GetZone() +waypointcoord=targetzone:GetRandomCoordinate(nil,nil,surfacetypes) +else +waypointcoord=mission:GetMissionWaypointCoord(self.group,randomradius,surfacetypes) +end +for _,task in pairs(mission.enrouteTasks)do +self:AddTaskEnroute(task) +end +local SpeedToMission=mission.missionSpeed and UTILS.KmphToKnots(mission.missionSpeed)or self:GetSpeedCruise() +if mission.type==AUFTRAG.Type.TROOPTRANSPORT then +mission.DCStask=mission:GetDCSMissionTask(self.group) +local pradius=mission.transportPickupRadius +local pickupZone=ZONE_RADIUS:New("Pickup Zone",mission.transportPickup:GetVec2(),pradius) +for _,_group in pairs(mission.transportGroupSet.Set)do +local group=_group +if group and group:IsAlive()then +local pcoord=pickupZone:GetRandomCoordinate(20,pradius,{land.SurfaceType.LAND,land.SurfaceType.ROAD}) +local DCSTask=group:TaskEmbarkToTransport(pcoord,pradius) +group:SetTask(DCSTask,5) +end +end +elseif mission.type==AUFTRAG.Type.ARTY then +local targetcoord=mission:GetTargetCoordinate() +local inRange=self:InWeaponRange(targetcoord,mission.engageWeaponType,waypointcoord) +if inRange then +else +local coordInRange=self:GetCoordinateInRange(targetcoord,mission.engageWeaponType,waypointcoord,surfacetypes) +if coordInRange then +local waypoint=nil +if self:IsFlightgroup()then +waypoint=FLIGHTGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,UTILS.MetersToFeet(mission.missionAltitude or self.altitudeCruise),false) +elseif self:IsArmygroup()then +waypoint=ARMYGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,mission.optionFormation,false) +elseif self:IsNavygroup()then +waypoint=NAVYGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,UTILS.MetersToFeet(mission.missionAltitude or self.altitudeCruise),false) +end +waypoint.missionUID=mission.auftragsnummer +waypointcoord=coordInRange +uid=waypoint.uid +end +end +end +local d=currentcoord:Get2DDistance(waypointcoord) +self:T(self.lid..string.format("Distance to ingress waypoint=%.1f m",d)) +local waypoint=nil +if self:IsFlightgroup()then +local ingresscoord=mission:GetMissionIngressCoord() +local holdingcoord=mission:GetMissionHoldingCoord() +if holdingcoord then +waypoint=FLIGHTGROUP.AddWaypoint(self,holdingcoord,mission.missionHoldingCoordSpeed or SpeedToMission,uid,UTILS.MetersToFeet(mission.missionHoldingCoordAlt or self.altitudeCruise),false) +uid=waypoint.uid +self.flaghold:Set(0) +local TaskOrbit=self.group:TaskOrbit(holdingcoord,mission.missionHoldingCoordAlt,UTILS.KnotsToMps(mission.missionHoldingCoordSpeed or SpeedToMission)) +local TaskStop=self.group:TaskCondition(nil,self.flaghold.UserFlagName,1,nil,mission.missionHoldingDuration or 900) +local TaskCntr=self.group:TaskControlled(TaskOrbit,TaskStop) +local TaskOver=self.group:TaskFunction("FLIGHTGROUP._FinishedWaiting",self) +local DCSTasks=self.group:TaskCombo({TaskCntr,TaskOver}) +local waypointtask=self:AddTaskWaypoint(DCSTasks,waypoint,"Holding") +waypointtask.ismission=false +self.isHoldingAtHoldingPoint=true +end +if ingresscoord then +waypoint=FLIGHTGROUP.AddWaypoint(self,ingresscoord,mission.missionIngressCoordSpeed or SpeedToMission,uid,UTILS.MetersToFeet(mission.missionIngressCoordAlt or self.altitudeCruise),false) +uid=waypoint.uid +end +waypoint=FLIGHTGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,UTILS.MetersToFeet(mission.missionAltitude or self.altitudeCruise),false) +elseif self:IsArmygroup()then +local formation=mission.optionFormation +if d<1000 or mission.type==AUFTRAG.Type.RELOCATECOHORT then +formation=ENUMS.Formation.Vehicle.OffRoad +end +waypoint=ARMYGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,formation,false) +elseif self:IsNavygroup()then +waypoint=NAVYGROUP.AddWaypoint(self,waypointcoord,SpeedToMission,uid,UTILS.MetersToFeet(mission.missionAltitude or self.altitudeCruise),false) +end +waypoint.missionUID=mission.auftragsnummer +local waypointtask=self:AddTaskWaypoint(mission.DCStask,waypoint,mission.name,mission.prio,mission.duration) +waypointtask.ismission=true +waypointtask.target=targetobject +mission:SetGroupWaypointTask(self,waypointtask) +mission:SetGroupWaypointIndex(self,waypoint.uid) +local egresscoord=mission:GetMissionEgressCoord() +if egresscoord then +local Ewaypoint=nil +if self:IsFlightgroup()then +Ewaypoint=FLIGHTGROUP.AddWaypoint(self,egresscoord,mission.missionEgressCoordSpeed or SpeedToMission,waypoint.uid,UTILS.MetersToFeet(mission.missionEgressCoordAlt or self.altitudeCruise),false) +elseif self:IsArmygroup()then +Ewaypoint=ARMYGROUP.AddWaypoint(self,egresscoord,SpeedToMission,waypoint.uid,mission.optionFormation,false) +elseif self:IsNavygroup()then +Ewaypoint=NAVYGROUP.AddWaypoint(self,egresscoord,SpeedToMission,waypoint.uid,UTILS.MetersToFeet(mission.missionAltitude or self.altitudeCruise),false) +end +Ewaypoint.missionUID=mission.auftragsnummer +mission:SetGroupEgressWaypointUID(self,Ewaypoint.uid) +end +if targetzone and self:IsInZone(targetzone)then +self:T(self.lid.."Already in mission zone ==> TaskExecute()") +self:TaskExecute(waypointtask) +return +elseif d<25 then +self:T(self.lid.."Already within 25 meters of mission waypoint ==> TaskExecute()") +self:TaskExecute(waypointtask) +return +end +if(self.speedMax<=3.6 or mission.teleport)and not mission.unpaused then +self:Teleport(waypointcoord,nil,true) +self:__TaskExecute(-1,waypointtask) +else +if self:IsArmygroup()then +self:Cruise(SpeedToMission) +elseif self:IsNavygroup()then +self:Cruise(SpeedToMission) +elseif self:IsFlightgroup()then +self:UpdateRoute() +end +end +self:_SetMissionOptions(mission) +end +end +function OPSGROUP:_SetMissionOptions(mission) +if mission.optionROE then +self:SwitchROE(mission.optionROE) +end +if mission.optionROT then +self:SwitchROT(mission.optionROT) +end +if mission.optionAlarm then +self:SwitchAlarmstate(mission.optionAlarm) +end +if mission.optionEPLRS then +self:SwitchEPLRS(mission.optionEPLRS) +end +if mission.optionEmission then +self:SwitchEmission(mission.optionEmission) +end +if mission.optionInvisible then +self:SwitchInvisible(mission.optionInvisible) +end +if mission.optionImmortal then +self:SwitchImmortal(mission.optionImmortal) +end +if mission.optionFormation and self:IsFlightgroup()then +self:SwitchFormation(mission.optionFormation) +end +if mission.radio then +self:SwitchRadio(mission.radio.Freq,mission.radio.Modu) +end +if mission.tacan then +self:SwitchTACAN(mission.tacan.Channel,mission.tacan.Morse,mission.tacan.BeaconName,mission.tacan.Band) +end +if mission.icls then +self:SwitchICLS(mission.icls.Channel,mission.icls.Morse,mission.icls.UnitName) +end +if self.isFlightgroup then +if mission.prohibitAB==true then +self:SetProhibitAfterburner() +self:T2("Set prohibit AB") +elseif mission.prohibitAB==false then +self:SetAllowAfterburner() +self:T2("Set allow AB") +end +end +return self +end +function OPSGROUP:_QueueUpdate() +if self:IsExist()then +local mission=self:_GetNextMission() +if mission then +local currentmission=self:GetMissionCurrent() +if currentmission then +if mission.urgent and mission.prio<currentmission.prio then +self:T(self.lid.."FF got urgent mission with higher prio!") +self:MissionCancel(currentmission) +self:__MissionStart(1,mission) +end +else +self:MissionStart(mission) +end +end +end +local ready=true +if self:IsFlightgroup()then +ready=self:IsAirborne() +end +if ready and self.taskcurrent<=0 then +local task=self:_GetNextTask() +if task then +self:TaskExecute(task) +end +end +end +function OPSGROUP:onbeforeWait(From,Event,To,Duration) +local allowed=true +local Tsuspend=nil +local mission=self:GetMissionCurrent() +if mission then +self:PauseMission() +return true +end +if self.taskcurrent>0 then +self:T(self.lid..string.format("WARNING: Got current task ==> WAIT event is suspended for 30 sec!")) +Tsuspend=-30 +allowed=false +end +if self.cargoTransport then +self:T(self.lid..string.format("WARNING: Got current TRANSPORT assignment ==> WAIT event is suspended for 30 sec!")) +Tsuspend=-30 +allowed=false +end +if Tsuspend and not allowed then +self:__Wait(Tsuspend,Duration) +end +return allowed +end +function OPSGROUP:onafterWait(From,Event,To,Duration) +self:FullStop() +self.Twaiting=timer.getAbsTime() +self.dTwait=Duration +end +function OPSGROUP:onafterPassingWaypoint(From,Event,To,Waypoint) +local task=self:GetTaskCurrent() +local mission=nil +if task then +mission=self:GetMissionByTaskID(task.id) +end +if task and task.dcstask.id==AUFTRAG.SpecialTask.PATROLZONE then +self:RemoveWaypointByID(Waypoint.uid) +local zone=task.dcstask.params.zone +local surfacetypes=nil +if self:IsArmygroup()then +surfacetypes={land.SurfaceType.LAND,land.SurfaceType.ROAD} +elseif self:IsNavygroup()then +surfacetypes={land.SurfaceType.WATER,land.SurfaceType.SHALLOW_WATER} +end +local Coordinate=zone:GetRandomCoordinate(nil,nil,surfacetypes) +local Speed=task.dcstask.params.speed and UTILS.MpsToKnots(task.dcstask.params.speed)or UTILS.KmphToKnots(self.speedCruise) +local Altitude=UTILS.MetersToFeet(task.dcstask.params.altitude or self.altitudeCruise) +local currUID=self:GetWaypointCurrent().uid +local wp=nil +if self.isFlightgroup then +wp=FLIGHTGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +elseif self.isArmygroup then +wp=ARMYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,task.dcstask.params.formation) +elseif self.isNavygroup then +wp=NAVYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +end +wp.missionUID=mission and mission.auftragsnummer or nil +elseif task and task.dcstask.id==AUFTRAG.SpecialTask.RECON then +local target=task.dcstask.params.target +if self.adinfinitum and#self.reconindecies==0 then +self.reconindecies={} +for i=1,#target.targets do +table.insert(self.reconindecies,i) +end +end +if#self.reconindecies>0 then +local n=1 +if task.dcstask.params.randomly then +n=UTILS.GetRandomTableElement(self.reconindecies) +else +n=self.reconindecies[1] +table.remove(self.reconindecies,1) +end +local object=target.targets[n] +local zone=object.Object +local Coordinate=zone:GetRandomCoordinate() +local Speed=task.dcstask.params.speed and UTILS.MpsToKnots(task.dcstask.params.speed)or UTILS.KmphToKnots(self.speedCruise) +local Altitude=task.dcstask.params.altitude and UTILS.MetersToFeet(task.dcstask.params.altitude)or nil +local currUID=self:GetWaypointCurrent().uid +local wp=nil +if self.isFlightgroup then +wp=FLIGHTGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +elseif self.isArmygroup then +wp=ARMYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,task.dcstask.params.formation) +elseif self.isNavygroup then +wp=NAVYGROUP.AddWaypoint(self,Coordinate,Speed,currUID,Altitude) +end +wp.missionUID=mission and mission.auftragsnummer or nil +else +local wpindex=self:GetWaypointIndex(Waypoint.uid) +if wpindex==nil or wpindex==#self.waypoints then +if not self.adinfinitum or#self.waypoints<=1 then +self:_PassedFinalWaypoint(true,"Passing waypoint and NOT adinfinitum and #self.waypoints<=1") +end +end +self:TaskDone(task) +end +elseif task and task.dcstask.id==AUFTRAG.SpecialTask.RELOCATECOHORT then +local legion=task.dcstask.params.legion +self:T(self.lid..string.format("Asset arrived at relocation task waypoint ==> Task Done!")) +self:TaskDone(task) +elseif task and task.dcstask.id==AUFTRAG.SpecialTask.REARMING then +self:T(self.lid..string.format("FF Rearming Mission ==> Rearm()")) +self:Rearm() +else +local ntasks=self:_SetWaypointTasks(Waypoint) +local wpindex=self:GetWaypointIndex(Waypoint.uid) +if wpindex==nil or wpindex==#self.waypoints then +if self.adinfinitum then +if Waypoint.missionUID then +else +if#self.waypoints<=1 then +self:_PassedFinalWaypoint(true,"PassingWaypoint: adinfinitum but only ONE WAYPOINT left") +else +self:__UpdateRoute(-0.01,1,1) +end +end +else +self:_PassedFinalWaypoint(true,"PassingWaypoint: wpindex=#self.waypoints (or wpindex=nil)") +end +elseif wpindex==1 then +if self.adinfinitum then +if#self.waypoints<=1 then +self:_PassedFinalWaypoint(true,"PassingWaypoint: adinfinitum but only ONE WAYPOINT left") +else +if not Waypoint.missionUID then +self:__UpdateRoute(-0.01,2) +end +end +end +end +local isEgress=false +if Waypoint.missionUID then +self:T2(self.lid..string.format("Passing mission waypoint UID=%s",tostring(Waypoint.uid))) +local mission=self:GetMissionByID(Waypoint.missionUID) +local EgressUID=mission and mission:GetGroupEgressWaypointUID(self)or nil +isEgress=EgressUID and Waypoint.uid==EgressUID +if isEgress and mission:GetGroupStatus(self)~=AUFTRAG.GroupStatus.DONE then +self:MissionDone(mission) +end +end +if ntasks==0 and self:HasPassedFinalWaypoint()and not isEgress then +self:_CheckGroupDone(0.01) +end +local text=string.format("Group passed waypoint %s/%d ID=%d: final=%s detour=%s astar=%s", +tostring(wpindex),#self.waypoints,Waypoint.uid,tostring(self.passedfinalwp),tostring(Waypoint.detour),tostring(Waypoint.astar)) +self:T(self.lid..text) +end +local wpnext=self:GetWaypointNext() +if wpnext then +self.speedWp=wpnext.speed +self:T(self.lid..string.format("Expected/waypoint speed=%.1f m/s",self.speedWp)) +end +end +function OPSGROUP:_SetWaypointTasks(Waypoint) +local tasks=self:GetTasksWaypoint(Waypoint.uid) +local text=string.format("WP uid=%d tasks:",Waypoint.uid) +local missiontask=nil +if#tasks>0 then +for i,_task in pairs(tasks)do +local task=_task +text=text..string.format("\n[%d] %s",i,task.description) +if task.ismission then +missiontask=task +end +end +else +text=text.." None" +end +self:T(self.lid..text) +if missiontask then +self:T(self.lid.."Executing mission task") +local mission=self:GetMissionByTaskID(missiontask.id) +if mission then +if mission.opstransport and not mission.opstransport:IsCargoDelivered(self.groupname)then +self:PauseMission() +return +end +end +self:TaskExecute(missiontask) +return 1 +end +local taskswp={} +for _,task in pairs(tasks)do +local Task=task +table.insert(taskswp,self.group:TaskFunction("OPSGROUP._TaskExecute",self,Task)) +local TaskCondition=self.group:TaskCondition(nil,Task.stopflag:GetName(),1,nil,Task.duration) +table.insert(taskswp,self.group:TaskControlled(Task.dcstask,TaskCondition)) +table.insert(taskswp,self.group:TaskFunction("OPSGROUP._TaskDone",self,Task)) +end +if#taskswp>0 then +self:SetTask(self.group:TaskCombo(taskswp)) +end +return#taskswp +end +function OPSGROUP:onafterPassedFinalWaypoint(From,Event,To) +self:T(self.lid..string.format("Group passed final waypoint")) +end +function OPSGROUP:onafterGotoWaypoint(From,Event,To,UID,Speed) +local n=self:GetWaypointIndex(UID) +if n then +Speed=Speed or self:GetSpeedToWaypoint(n) +self:T(self.lid..string.format("Goto Waypoint UID=%d index=%d from %d at speed %.1f knots",UID,n,self.currentwp,Speed)) +self:__UpdateRoute(0.1,n,nil,Speed) +end +end +function OPSGROUP:onafterDetectedUnit(From,Event,To,Unit) +local unitname=Unit and Unit:GetName()or"unknown" +self:T2(self.lid..string.format("Detected unit %s",unitname)) +if self.detectedunits:FindUnit(unitname)then +self:DetectedUnitKnown(Unit) +else +self:DetectedUnitNew(Unit) +end +end +function OPSGROUP:onafterDetectedUnitNew(From,Event,To,Unit) +self:T(self.lid..string.format("Detected New unit %s",Unit:GetName())) +self.detectedunits:AddUnit(Unit) +end +function OPSGROUP:onafterDetectedGroup(From,Event,To,Group) +local groupname=Group and Group:GetName()or"unknown" +self:T(self.lid..string.format("Detected group %s",groupname)) +if self.detectedgroups:FindGroup(groupname)then +self:DetectedGroupKnown(Group) +else +self:DetectedGroupNew(Group) +end +end +function OPSGROUP:onafterDetectedGroupNew(From,Event,To,Group) +self:T(self.lid..string.format("Detected New group %s",Group:GetName())) +self.detectedgroups:AddGroup(Group) +end +function OPSGROUP:onafterEnterZone(From,Event,To,Zone) +local zonename=Zone and Zone:GetName()or"unknown" +self:T2(self.lid..string.format("Entered Zone %s",zonename)) +self.inzones:Add(Zone:GetName(),Zone) +end +function OPSGROUP:onafterLeaveZone(From,Event,To,Zone) +local zonename=Zone and Zone:GetName()or"unknown" +self:T2(self.lid..string.format("Left Zone %s",zonename)) +self.inzones:Remove(zonename,true) +end +function OPSGROUP:onbeforeLaserOn(From,Event,To,Target) +if self.spot.On then +return false +end +if Target then +self:SetLaserTarget(Target) +else +self:T(self.lid.."ERROR: No target provided for LASER!") +return false +end +local element=self:GetElementAlive() +if element then +self.spot.element=element +local offsetY=2 +if self.isFlightgroup or self.isNavygroup then +offsetY=element.height +end +self.spot.offset={x=0,y=offsetY,z=0} +if self.spot.CheckLOS then +local los=self:HasLoS(self.spot.Coordinate,self.spot.element,self.spot.offset) +if los then +self:LaserGotLOS() +else +self:T(self.lid.."LASER got no LOS currently. Trying to switch the laser on again in 10 sec") +self:__LaserOn(-10,Target) +return false +end +end +else +self:T(self.lid.."ERROR: No element alive for lasing") +return false +end +return true +end +function OPSGROUP:onafterLaserOn(From,Event,To,Target) +if not self.spot.timer:IsRunning()then +self.spot.timer:Start(nil,self.spot.dt) +end +local DCSunit=self.spot.element.unit:GetDCSObject() +self.spot.Laser=Spot.createLaser(DCSunit,self.spot.offset,self.spot.vec3,self.spot.Code or 1688) +if self.spot.IRon then +self.spot.IR=Spot.createInfraRed(DCSunit,self.spot.offset,self.spot.vec3) +end +self.spot.On=true +self.spot.Paused=false +self:T(self.lid.."Switching LASER on") +end +function OPSGROUP:onbeforeLaserOff(From,Event,To) +return self.spot.On or self.spot.Paused +end +function OPSGROUP:onafterLaserOff(From,Event,To) +self:T(self.lid.."Switching LASER off") +if self.spot.On then +self.spot.Laser:destroy() +self.spot.IR:destroy() +self.spot.Laser=nil +self.spot.IR=nil +end +self.spot.timer:Stop() +self.spot.TargetUnit=nil +self.spot.On=false +self.spot.Paused=false +end +function OPSGROUP:onafterLaserPause(From,Event,To) +self:T(self.lid.."Switching LASER off temporarily") +self.spot.Laser:destroy() +self.spot.IR:destroy() +self.spot.Laser=nil +self.spot.IR=nil +self.spot.On=false +self.spot.Paused=true +end +function OPSGROUP:onbeforeLaserResume(From,Event,To) +return self.spot.Paused +end +function OPSGROUP:onafterLaserResume(From,Event,To) +self:T(self.lid.."Resuming LASER") +self.spot.Paused=false +local target=nil +if self.spot.TargetType==0 then +target=self.spot.Coordinate +elseif self.spot.TargetType==1 or self.spot.TargetType==2 then +target=self.spot.TargetUnit +elseif self.spot.TargetType==3 then +target=self.spot.TargetGroup +end +if target then +self:T(self.lid.."Switching LASER on again") +self:LaserOn(target) +end +end +function OPSGROUP:onafterLaserCode(From,Event,To,Code) +self.spot.Code=Code or 1688 +self:T2(self.lid..string.format("Setting LASER Code to %d",self.spot.Code)) +if self.spot.On then +self:T(self.lid..string.format("New LASER Code is %d",self.spot.Code)) +self.spot.Laser:setCode(self.spot.Code) +end +end +function OPSGROUP:onafterLaserLostLOS(From,Event,To) +self.spot.LOS=false +self.spot.lostLOS=true +if self.spot.On then +self:LaserPause() +end +end +function OPSGROUP:onafterLaserGotLOS(From,Event,To) +self.spot.LOS=true +if self.spot.lostLOS then +self.spot.lostLOS=false +if self.spot.Paused then +self:LaserResume() +end +end +end +function OPSGROUP:SetLaserTarget(Target) +if Target then +if Target:IsInstanceOf("SCENERY")then +self.spot.TargetType=0 +self.spot.offsetTarget={x=0,y=3,z=0} +elseif Target:IsInstanceOf("POSITIONABLE")then +local target=Target +if target:IsAlive()then +if target:IsInstanceOf("GROUP")then +self.spot.TargetGroup=target +self.spot.TargetUnit=target:GetHighestThreat() +self.spot.TargetType=3 +else +self.spot.TargetUnit=target +if target:IsInstanceOf("STATIC")then +self.spot.TargetType=1 +elseif target:IsInstanceOf("UNIT")then +self.spot.TargetType=2 +end +end +local size,x,y,z=self.spot.TargetUnit:GetObjectSize() +if y then +self.spot.offsetTarget={x=0,y=y*0.75,z=0} +else +self.spot.offsetTarget={x=0,2,z=0} +end +else +self:T("WARNING: LASER target is not alive!") +return +end +elseif Target:IsInstanceOf("COORDINATE")then +self.spot.TargetType=0 +self.spot.offsetTarget={x=0,y=0,z=0} +else +self:T(self.lid.."ERROR: LASER target should be a POSITIONABLE (GROUP, UNIT or STATIC) or a COORDINATE object!") +return +end +self.spot.vec3=UTILS.VecAdd(Target:GetVec3(),self.spot.offsetTarget) +self.spot.Coordinate:UpdateFromVec3(self.spot.vec3) +end +end +function OPSGROUP:_UpdateLaser() +if self.spot.TargetUnit then +if self.spot.TargetUnit:IsAlive()then +local vec3=self.spot.TargetUnit:GetVec3() +vec3=UTILS.VecAdd(vec3,self.spot.offsetTarget) +local dist=UTILS.VecDist3D(vec3,self.spot.vec3) +self.spot.vec3=vec3 +self.spot.Coordinate:UpdateFromVec3(vec3) +if dist>1 then +if self.spot.On then +self.spot.Laser:setPoint(vec3) +if self.spot.IRon then +self.spot.IR:setPoint(vec3) +end +end +end +else +if self.spot.TargetGroup and self.spot.TargetGroup:IsAlive()then +local unit=self.spot.TargetGroup:GetHighestThreat() +if unit then +self:T(self.lid..string.format("Switching to target unit %s in the group",unit:GetName())) +self.spot.TargetUnit=unit +return +else +self:T(self.lid.."Target is not alive any more ==> switching LASER off") +self:LaserOff() +return +end +else +self:T(self.lid.."Target is not alive any more ==> switching LASER off") +self:LaserOff() +return +end +end +end +if self.spot.CheckLOS then +local los=self:HasLoS(self.spot.Coordinate,self.spot.element,self.spot.offset) +if los then +if self.spot.lostLOS then +self:LaserGotLOS() +end +else +if not self.spot.lostLOS then +self:LaserLostLOS() +end +end +end +end +function OPSGROUP:onbeforeElementSpawned(From,Event,To,Element) +if Element and Element.status==OPSGROUP.ElementStatus.SPAWNED then +self:T2(self.lid..string.format("Element %s is already spawned ==> Transition denied!",Element.name)) +return false +end +return true +end +function OPSGROUP:onafterElementInUtero(From,Event,To,Element) +self:T(self.lid..string.format("Element in utero %s",Element.name)) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.INUTERO) +end +function OPSGROUP:onafterElementDamaged(From,Event,To,Element) +self:T(self.lid..string.format("Element damaged %s",Element.name)) +if Element and(Element.status~=OPSGROUP.ElementStatus.DEAD and Element.status~=OPSGROUP.ElementStatus.INUTERO)then +local lifepoints=0 +if Element.DCSunit and Element.DCSunit:isExist()then +lifepoints=Element.DCSunit:getLife() +self:T(self.lid..string.format("Element life %s: %.2f/%.2f",Element.name,lifepoints,Element.life0)) +else +self:T(self.lid..string.format("Element.DCSunit %s does not exist!",Element.name)) +end +if lifepoints<=1.0 then +self:T(self.lid..string.format("Element %s life %.2f <= 1.0 ==> Destroyed!",Element.name,lifepoints)) +self:ElementDestroyed(Element) +end +end +end +function OPSGROUP:onafterElementHit(From,Event,To,Element,Enemy) +Element.Nhit=Element.Nhit+1 +self:T(self.lid..string.format("Element hit %s by %s [n=%d, N=%d]",Element.name,Enemy and Enemy:GetName()or"unknown",Element.Nhit,self.Nhit)) +self:__Hit(-3,Enemy) +end +function OPSGROUP:onafterHit(From,Event,To,Enemy) +self:T(self.lid..string.format("Group hit by %s",Enemy and Enemy:GetName()or"unknown")) +end +function OPSGROUP:onafterElementDestroyed(From,Event,To,Element) +self:T(self.lid..string.format("Element destroyed %s",Element.name)) +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +mission:ElementDestroyed(self,Element) +end +self.Ndestroyed=self.Ndestroyed+1 +self:ElementDead(Element) +end +function OPSGROUP:onafterElementDead(From,Event,To,Element) +self:T(self.lid..string.format("Element dead %s at t=%.3f",Element.name,timer.getTime())) +self:_UpdateStatus(Element,OPSGROUP.ElementStatus.DEAD) +if self.spot.On and self.spot.element.name==Element.name then +self:LaserOff() +if self:GetNelements()>0 then +local target=nil +if self.spot.TargetType==0 then +target=self.spot.Coordinate +elseif self.spot.TargetType==1 or self.spot.TargetType==2 then +if self.spot.TargetUnit and self.spot.TargetUnit:IsAlive()then +target=self.spot.TargetUnit +end +elseif self.spot.TargetType==3 then +if self.spot.TargetGroup and self.spot.TargetGroup:IsAlive()then +target=self.spot.TargetGroup +end +end +if target then +self:__LaserOn(-1,target) +end +end +end +for i=#Element.cargoBay,1,-1 do +local mycargo=Element.cargoBay[i] +if mycargo.group then +self:_DelCargobay(mycargo.group) +if mycargo.group and not(mycargo.group:IsDead()or mycargo.group:IsStopped())then +mycargo.group:_RemoveMyCarrier() +if mycargo.reserved then +mycargo.group:_NewCargoStatus(OPSGROUP.CargoStatus.NOTCARGO) +else +for _,cargoelement in pairs(mycargo.group.elements)do +self:T2(self.lid.."Cargo element dead "..cargoelement.name) +mycargo.group:ElementDead(cargoelement) +end +end +end +else +if self.cargoTZC then +for _,_cargo in pairs(self.cargoTZC.Cargos)do +local cargo=_cargo +if cargo.uid==mycargo.cargoUID then +cargo.storage.cargoLost=cargo.storage.cargoLost+mycargo.storageAmount +end +end +end +self:_DelCargobayElement(Element,mycargo) +end +end +end +function OPSGROUP:onafterRespawn(From,Event,To,Template) +self:T(self.lid.."Respawning group!") +local template=UTILS.DeepCopy(Template or self.template) +template.lateActivation=false +self:_Respawn(0,template) +end +function OPSGROUP:Teleport(Coordinate,Delay,NoPauseMission) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP.Teleport,self,Coordinate,0,NoPauseMission) +else +self:T(self.lid.."FF Teleporting...") +if self:IsOnMission()and not NoPauseMission then +self:T(self.lid.."Pausing current mission for telport") +self:PauseMission() +end +local Template=UTILS.DeepCopy(self.template) +Template.lateActivation=self:IsLateActivated() +Template.uncontrolled=false +if self:IsFlightgroup()then +Template.route.points[1]=Coordinate:WaypointAir("BARO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,300,true,nil,nil,"Spawnpoint") +elseif self:IsArmygroup()then +Template.route.points[1]=Coordinate:WaypointGround(0) +elseif self:IsNavygroup()then +Template.route.points[1]=Coordinate:WaypointNaval(0) +end +local units=Template.units +local d={} +for i=1,#units do +local unit=units[i] +d[i]={x=Coordinate.x+(units[i].x-units[1].x),y=Coordinate.z+units[i].y-units[1].y} +end +for i=#units,1,-1 do +local unit=units[i] +local element=self:GetElementByName(unit.name) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +unit.parking=nil +unit.parking_id=nil +local vec3=element.unit:GetVec3() +local heading=element.unit:GetHeading() +unit.x=d[i].x +unit.y=d[i].y +unit.alt=Coordinate.y +unit.heading=math.rad(heading) +unit.psi=-unit.heading +else +table.remove(units,i) +end +end +self:_Respawn(0,Template,true) +end +end +function OPSGROUP:_Respawn(Delay,Template,Reset) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP._Respawn,self,0,Template,Reset) +else +self:T2(self.lid.."FF _Respawn") +Template=Template or self:_GetTemplate(true) +self.Ndestroyed=0 +self.Nhit=0 +if self:IsAlive()then +local units=Template.units +for i=#units,1,-1 do +local unit=units[i] +local element=self:GetElementByName(unit.name) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +if not Reset then +unit.parking=element.parking and element.parking.TerminalID or unit.parking +unit.parking_id=nil +local vec3=element.unit:GetVec3() +local heading=element.unit:GetHeading() +unit.x=vec3.x +unit.y=vec3.z +unit.alt=vec3.y +unit.heading=math.rad(heading) +unit.psi=-unit.heading +end +else +table.remove(units,i) +self.Ndestroyed=self.Ndestroyed+1 +end +end +self:Despawn(0,true) +end +for _,_element in pairs(self.elements)do +local element=_element +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +self:ElementInUtero(element) +end +end +self:_Spawn(0.01,Template) +end +return self +end +function OPSGROUP:_Spawn(Delay,Template) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSGROUP._Spawn,self,0,Template) +else +self:T2({Template=Template}) +if self:IsArmygroup()and self.ValidateAndRepositionGroundUnits then +UTILS.ValidateAndRepositionGroundUnits(Template.units) +end +self.group=_DATABASE:Spawn(Template) +self.group:SetValidateAndRepositionGroundUnits(self.ValidateAndRepositionGroundUnits) +self.dcsgroup=self:GetDCSGroup() +self.controller=self.dcsgroup:getController() +self.isLateActivated=Template.lateActivation +self.isUncontrolled=Template.uncontrolled +self.isDead=false +self.isDestroyed=false +self.groupinitialized=false +self.wpcounter=1 +self.currentwp=1 +self:_InitWaypoints() +self:_InitGroup(Template,0.001) +end +end +function OPSGROUP:onafterInUtero(From,Event,To) +self:T(self.lid..string.format("Group inutero at t=%.3f",timer.getTime())) +end +function OPSGROUP:onafterDamaged(From,Event,To) +self:T(self.lid..string.format("Group damaged at t=%.3f",timer.getTime())) +end +function OPSGROUP:onafterDestroyed(From,Event,To) +self:T(self.lid..string.format("Group destroyed at t=%.3f",timer.getTime())) +self.isDestroyed=true +end +function OPSGROUP:onbeforeDead(From,Event,To) +if self.Ndestroyed==#self.elements then +self:Destroyed() +end +end +function OPSGROUP:onafterDead(From,Event,To) +self:T(self.lid..string.format("Group dead at t=%.3f",timer.getTime())) +self.isDead=true +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +self:T(self.lid.."Cancelling mission because group is dead! Mission name "..tostring(mission:GetName())) +self:MissionCancel(mission) +mission:GroupDead(self) +end +self:ClearWaypoints() +self.groupinitialized=false +self.cargoStatus=OPSGROUP.CargoStatus.NOTCARGO +self.carrierStatus=OPSGROUP.CarrierStatus.NOTCARRIER +local mycarrier=self:_GetMyCarrierGroup() +if mycarrier and not mycarrier:IsDead()then +mycarrier:_DelCargobay(self) +self:_RemoveMyCarrier() +end +for i,_transport in pairs(self.cargoqueue)do +local transport=_transport +transport:__DeadCarrierGroup(1,self) +end +self.cargoqueue={} +self.cargoTransport=nil +self.cargoTZC=nil +if self.Ndestroyed==#self.elements then +if self.cohort then +self.cohort:DelGroup(self.groupname) +end +else +end +if self.legion then +if not self:IsInUtero()then +local asset=self.legion:GetAssetByName(self.groupname) +local request=self.legion:GetRequestByID(asset.rid) +self.legion:AssetDead(asset,request) +end +self:__Stop(-5) +elseif not self.isAI then +self:__Stop(-1) +end +end +function OPSGROUP:onbeforeStop(From,Event,To) +if self:IsAlive()then +self:T(self.lid..string.format("WARNING: Group is still alive! Will not stop the FSM. Use :Despawn() instead")) +return false +end +return true +end +function OPSGROUP:onafterStop(From,Event,To) +self:UnHandleEvent(EVENTS.Birth) +self:UnHandleEvent(EVENTS.Dead) +self:UnHandleEvent(EVENTS.RemoveUnit) +if self.isFlightgroup then +self:UnHandleEvent(EVENTS.EngineStartup) +self:UnHandleEvent(EVENTS.Takeoff) +self:UnHandleEvent(EVENTS.Land) +self:UnHandleEvent(EVENTS.EngineShutdown) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.Crash) +self.currbase=nil +elseif self.isArmygroup then +self:UnHandleEvent(EVENTS.Hit) +end +for _,_mission in pairs(self.missionqueue)do +local mission=_mission +self:MissionCancel(mission) +end +self.timerCheckZone:Stop() +self.timerQueueUpdate:Stop() +self.timerStatus:Stop() +self.CallScheduler:Clear() +if self.Scheduler then +self.Scheduler:Clear() +end +if self.flightcontrol then +for _,_element in pairs(self.elements)do +local element=_element +if element.parking then +self.flightcontrol:SetParkingFree(element.parking) +end +end +self.flightcontrol:_RemoveFlight(self) +end +if self:IsAlive()and not(self:IsDead()or self:IsStopped())then +local life,life0=self:GetLifePoints() +local state=self:GetState() +local text=string.format("WARNING: Group is still alive! Current state=%s. Life points=%d/%d. Use OPSGROUP:Destroy() or OPSGROUP:Despawn() for a clean stop",state,life,life0) +self:T(self.lid..text) +end +_DATABASE.FLIGHTGROUPS[self.groupname]=nil +self:T(self.lid.."STOPPED! Unhandled events, cleared scheduler and removed from _DATABASE") +end +function OPSGROUP:onafterOutOfAmmo(From,Event,To) +self:T(self.lid..string.format("Group is out of ammo at t=%.3f",timer.getTime())) +end +function OPSGROUP:_CheckCargoTransport() +local Time=timer.getAbsTime() +if self.verbose>=1 then +local text="" +for _,_element in pairs(self.elements)do +local element=_element +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +if cargo.group then +text=text..string.format("\n- %s in carrier %s, reserved=%s",tostring(cargo.group:GetName()),tostring(element.name),tostring(cargo.reserved)) +else +text=text..string.format("\n- storage %s=%d kg in carrier %s [UID=%s]", +tostring(cargo.storageType),tostring(cargo.storageAmount*cargo.storageWeight),tostring(element.name),tostring(cargo.cargoUID)) +end +end +end +if text==""then +text=" empty" +end +self:T(self.lid.."Cargo bay:"..text) +end +if self.verbose>=3 then +local text="" +for i,_transport in pairs(self.cargoqueue)do +local transport=_transport +local pickupzone=transport:GetPickupZone() +local deployzone=transport:GetDeployZone() +local pickupname=pickupzone and pickupzone:GetName()or"unknown" +local deployname=deployzone and deployzone:GetName()or"unknown" +text=text..string.format("\n[%d] UID=%d Status=%s: %s --> %s",i,transport.uid,transport:GetState(),pickupname,deployname) +for j,_cargo in pairs(transport:GetCargos())do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local state=cargo.opsgroup:GetState() +local status=cargo.opsgroup.cargoStatus +local name=cargo.opsgroup.groupname +local carriergroup,carrierelement,reserved=cargo.opsgroup:_GetMyCarrier() +local carrierGroupname=carriergroup and carriergroup.groupname or"none" +local carrierElementname=carrierelement and carrierelement.name or"none" +text=text..string.format("\n (%d) %s [%s]: %s, carrier=%s(%s), delivered=%s",j,name,state,status,carrierGroupname,carrierElementname,tostring(cargo.delivered)) +else +end +end +end +if text~=""then +self:T(self.lid.."Cargo queue:"..text) +end +end +if self.cargoTransport and self.cargoTransport:GetCarrierTransportStatus(self)==OPSTRANSPORT.Status.DELIVERED then +self:DelOpsTransport(self.cargoTransport) +self.cargoTransport=nil +self.cargoTZC=nil +end +local mission=self:GetMissionCurrent() +if(not self.cargoTransport)and(mission==nil or mission.type==AUFTRAG.Type.NOTHING)then +self.cargoTransport=self:_GetNextCargoTransport() +if self.cargoTransport and mission then +self:MissionCancel(mission) +end +if self.cargoTransport and not self:IsActive()then +self:Activate() +end +end +if self.cargoTransport then +if self:IsNotCarrier()then +self.Tpickingup=nil +self.Tloading=nil +self.Ttransporting=nil +self.Tunloading=nil +self.cargoTZC=self.cargoTransport:_GetTransportZoneCombo(self) +if self.cargoTZC then +self:T(self.lid..string.format("Not carrier ==> pickup at %s [TZC UID=%d]",self.cargoTZC.PickupZone and self.cargoTZC.PickupZone:GetName()or"unknown",self.cargoTZC.uid)) +self:__Pickup(-1) +else +self:T2(self.lid.."Not carrier ==> No TZC found") +end +elseif self:IsPickingup()then +self.Tpickingup=self.Tpickingup or Time +local tpickingup=Time-self.Tpickingup +self:T(self.lid..string.format("Picking up at %s [TZC UID=%d] for %s sec...",self.cargoTZC.PickupZone and self.cargoTZC.PickupZone:GetName()or"unknown",self.cargoTZC.uid,tpickingup)) +elseif self:IsLoading()then +self.Tloading=self.Tloading or Time +local tloading=Time-self.Tloading +self:T(self.lid..string.format("Loading at %s [TZC UID=%d] for %.1f sec...",self.cargoTZC.PickupZone and self.cargoTZC.PickupZone:GetName()or"unknown",self.cargoTZC.uid,tloading)) +local boarding=false +local gotcargo=false +for _,_cargo in pairs(self.cargoTZC.Cargos)do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +if cargo.opsgroup and cargo.opsgroup:IsBoarding(self.groupname)then +boarding=true +end +if cargo.opsgroup and cargo.opsgroup:IsLoaded(self.groupname)then +gotcargo=true +end +else +local mycargo=self:_GetMyCargoBayFromUID(cargo.uid) +if mycargo and mycargo.storageAmount>0 then +gotcargo=true +end +end +end +if gotcargo and self.cargoTransport:_CheckRequiredCargos(self.cargoTZC,self)and not boarding then +self:T(self.lid.."Boarding/loading finished ==> Loaded") +self.Tloading=nil +self:LoadingDone() +else +self:Loading() +end +elseif self:IsTransporting()then +self.Ttransporting=self.Ttransporting or Time +local ttransporting=Time-self.Ttransporting +self:T(self.lid.."Transporting (nothing to do)") +elseif self:IsUnloading()then +self.Tunloading=self.Tunloading or Time +local tunloading=Time-self.Tunloading +self:T(self.lid.."Unloading ==> Checking if all cargo was delivered") +local delivered=true +for _,_cargo in pairs(self.cargoTZC.Cargos)do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local carrierGroup=cargo.opsgroup:_GetMyCarrierGroup() +if(carrierGroup and carrierGroup:GetName()==self:GetName())and not cargo.delivered then +delivered=false +break +end +else +local mycargo=self:_GetMyCargoBayFromUID(cargo.uid) +if mycargo and not cargo.delivered then +delivered=false +break +end +end +end +if delivered then +self:T(self.lid.."Unloading finished ==> UnloadingDone") +self:UnloadingDone() +else +self:Unloading() +end +end +if self.verbose>=2 and self.cargoTransport then +local pickupzone=self.cargoTransport:GetPickupZone(self.cargoTZC) +local deployzone=self.cargoTransport:GetDeployZone(self.cargoTZC) +local pickupname=pickupzone and pickupzone:GetName()or"unknown" +local deployname=deployzone and deployzone:GetName()or"unknown" +local text=string.format("Carrier [%s]: %s --> %s",self.carrierStatus,pickupname,deployname) +for _,_cargo in pairs(self.cargoTransport:GetCargos(self.cargoTZC))do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local name=cargo.opsgroup:GetName() +local gstatus=cargo.opsgroup:GetState() +local cstatus=cargo.opsgroup.cargoStatus +local weight=cargo.opsgroup:GetWeightTotal() +local carriergroup,carrierelement,reserved=cargo.opsgroup:_GetMyCarrier() +local carrierGroupname=carriergroup and carriergroup.groupname or"none" +local carrierElementname=carrierelement and carrierelement.name or"none" +text=text..string.format("\n- %s (%.1f kg) [%s]: %s, carrier=%s (%s), delivered=%s",name,weight,gstatus,cstatus,carrierElementname,carrierGroupname,tostring(cargo.delivered)) +else +end +end +self:I(self.lid..text) +end +end +return self +end +function OPSGROUP:_IsInCargobay(OpsGroup) +for _,_element in pairs(self.elements)do +local element=_element +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +if cargo.group.groupname==OpsGroup.groupname then +return true +end +end +end +return false +end +function OPSGROUP:_AddCargobay(CargoGroup,CarrierElement,Reserved) +local cargo=self:_GetCargobay(CargoGroup) +if cargo then +cargo.reserved=Reserved +else +cargo={} +cargo.group=CargoGroup +cargo.reserved=Reserved +table.insert(CarrierElement.cargoBay,cargo) +end +CargoGroup:_SetMyCarrier(self,CarrierElement,Reserved) +self.cargoBay[CargoGroup.groupname]=CarrierElement.name +if not Reserved then +local weight=CargoGroup:GetWeightTotal() +self:AddWeightCargo(CarrierElement.name,weight) +end +return self +end +function OPSGROUP:_AddCargobayStorage(CarrierElement,CargoUID,StorageType,StorageAmount,StorageWeight) +local MyCargo=self:_CreateMyCargo(CargoUID,nil,StorageType,StorageAmount,StorageWeight) +self:_AddMyCargoBay(MyCargo,CarrierElement) +end +function OPSGROUP:_CreateMyCargo(CargoUID,OpsGroup,StorageType,StorageAmount,StorageWeight) +local cargo={} +cargo.cargoUID=CargoUID +cargo.group=OpsGroup +cargo.storageType=StorageType +cargo.storageAmount=StorageAmount +cargo.storageWeight=StorageWeight +cargo.reserved=false +return cargo +end +function OPSGROUP:_AddMyCargoBay(MyCargo,CarrierElement) +table.insert(CarrierElement.cargoBay,MyCargo) +if not MyCargo.reserved then +local weight=0 +if MyCargo.group then +weight=MyCargo.group:GetWeightTotal() +else +weight=MyCargo.storageAmount*MyCargo.storageWeight +end +self:AddWeightCargo(CarrierElement.name,weight) +end +end +function OPSGROUP:_GetMyCargoBayFromUID(uid) +for _,_element in pairs(self.elements)do +local element=_element +for i,_mycargo in pairs(element.cargoBay)do +local mycargo=_mycargo +if mycargo.cargoUID and mycargo.cargoUID==uid then +return mycargo,element,i +end +end +end +return nil,nil,nil +end +function OPSGROUP:GetCargoGroups(CarrierName) +local cargos={} +for _,_element in pairs(self.elements)do +local element=_element +if CarrierName==nil or element.name==CarrierName then +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +if not cargo.reserved then +table.insert(cargos,cargo.group) +end +end +end +end +return cargos +end +function OPSGROUP:_GetCargobay(CargoGroup) +local CarrierElement=nil +local cargobayIndex=nil +local reserved=nil +for i,_element in pairs(self.elements)do +local element=_element +for j,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +if cargo.group and cargo.group.groupname==CargoGroup.groupname then +return cargo,j,element +end +end +end +return nil,nil,nil +end +function OPSGROUP:_GetCargobayElement(Element,CargoUID) +self:T3({Element=Element,CargoUID=CargoUID}) +for i,_mycargo in pairs(Element.cargoBay)do +local mycargo=_mycargo +if mycargo.cargoUID and mycargo.cargoUID==CargoUID then +return mycargo +end +end +return nil +end +function OPSGROUP:_DelCargobayElement(Element,MyCargo) +for i,_mycargo in pairs(Element.cargoBay)do +local mycargo=_mycargo +if mycargo.cargoUID and MyCargo.cargoUID and mycargo.cargoUID==MyCargo.cargoUID then +if MyCargo.group then +self:RedWeightCargo(Element.name,MyCargo.group:GetWeightTotal()) +else +self:RedWeightCargo(Element.name,MyCargo.storageAmount*MyCargo.storageWeight) +end +table.remove(Element.cargoBay,i) +return true +end +end +return false +end +function OPSGROUP:_DelCargobay(CargoGroup) +if self.cargoBay[CargoGroup.groupname]then +self.cargoBay[CargoGroup.groupname]=nil +end +local cargoBayItem,cargoBayIndex,CarrierElement=self:_GetCargobay(CargoGroup) +if cargoBayItem and cargoBayIndex then +self:T(self.lid..string.format("Removing cargo group %s from cargo bay (index=%d) of carrier %s",CargoGroup:GetName(),cargoBayIndex,CarrierElement.name)) +table.remove(CarrierElement.cargoBay,cargoBayIndex) +if not cargoBayItem.reserved then +local weight=CargoGroup:GetWeightTotal() +self:RedWeightCargo(CarrierElement.name,weight) +end +return true +end +self:T(self.lid.."ERROR: Group is not in cargo bay. Cannot remove it!") +return false +end +function OPSGROUP:_GetNextCargoTransport() +local coord=self:GetCoordinate() +local function _sort(a,b) +local transportA=a +local transportB=b +return(transportA.prio<transportB.prio) +end +table.sort(self.cargoqueue,_sort) +local vip=math.huge +for _,_cargotransport in pairs(self.cargoqueue)do +local cargotransport=_cargotransport +if cargotransport.importance and cargotransport.importance<vip then +vip=cargotransport.importance +end +end +for _,_cargotransport in pairs(self.cargoqueue)do +local cargotransport=_cargotransport +local carrierstatusScheduled=cargotransport:GetCarrierTransportStatus(self)==OPSTRANSPORT.Status.SCHEDULED +if cargotransport:IsReadyToGo()and carrierstatusScheduled and(cargotransport.importance==nil or cargotransport.importance<=vip)and not self:_CheckDelivered(cargotransport)then +cargotransport:Executing() +cargotransport:SetCarrierTransportStatus(self,OPSTRANSPORT.Status.EXECUTING) +return cargotransport +end +end +return nil +end +function OPSGROUP:_CheckDelivered(CargoTransport) +local done=true +for _,_cargo in pairs(CargoTransport:GetCargos())do +local cargo=_cargo +if self:CanCargo(cargo)then +if cargo.delivered then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup==nil then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and(cargo.opsgroup:IsDead()or cargo.opsgroup:IsStopped())then +else +done=false +end +end +end +self:T(self.lid..string.format("Cargotransport UID=%d Status=%s: delivered=%s",CargoTransport.uid,CargoTransport:GetState(),tostring(done))) +return done +end +function OPSGROUP:_CheckGoPickup(CargoTransport) +local done=true +if CargoTransport then +for _,_cargo in pairs(CargoTransport:GetCargos())do +local cargo=_cargo +if self:CanCargo(cargo)then +if cargo.delivered then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and(cargo.opsgroup==nil or cargo.opsgroup:IsDead()or cargo.opsgroup:IsStopped())then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and(cargo.opsgroup:IsLoaded(CargoTransport:_GetCarrierNames()))then +else +done=false +end +end +end +self:T(self.lid..string.format("Cargotransport UID=%d Status=%s: delivered=%s",CargoTransport.uid,CargoTransport:GetState(),tostring(done))) +end +return done +end +function OPSGROUP:AddOpsTransport(OpsTransport) +OpsTransport:Scheduled() +OpsTransport:_AddCarrier(self) +table.insert(self.cargoqueue,OpsTransport) +self:T(self.lid.."Adding transport to carrier, #self.cargoqueue="..#self.cargoqueue) +return self +end +function OPSGROUP:DelOpsTransport(CargoTransport) +for i=#self.cargoqueue,1,-1 do +local transport=self.cargoqueue[i] +if transport.uid==CargoTransport.uid then +self:T(self.lid..string.format("Removing transport UID=%d",transport.uid)) +table.remove(self.cargoqueue,i) +CargoTransport:_DelCarrier(self) +return self +end +end +return self +end +function OPSGROUP:GetOpsTransportByUID(uid) +for i=#self.cargoqueue,1,-1 do +local transport=self.cargoqueue[i] +if transport.uid==uid then +return transport +end +end +return nil +end +function OPSGROUP:GetWeightTotal(UnitName,IncludeReserved) +local weight=0 +for _,_element in pairs(self.elements)do +local element=_element +if(UnitName==nil or UnitName==element.name)and element.status~=OPSGROUP.ElementStatus.DEAD then +weight=weight+element.weightEmpty +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +local wcargo=0 +if(not cargo.reserved)or(cargo.reserved==true and(IncludeReserved==true or IncludeReserved==nil))then +wcargo=cargo.group:GetWeightTotal(element.name) +end +weight=weight+wcargo +end +end +end +return weight +end +function OPSGROUP:GetFreeCargobay(UnitName,IncludeReserved) +local weightCargoMax=self:GetWeightCargoMax(UnitName) +local weightCargo=self:GetWeightCargo(UnitName,IncludeReserved) +local Free=weightCargoMax-weightCargo +self:T(self.lid..string.format("Free cargo bay=%d kg (unit=%s)",Free,(UnitName or"whole group"))) +return Free +end +function OPSGROUP:GetFreeCargobayRelative(UnitName,IncludeReserved) +local free=self:GetFreeCargobay(UnitName,IncludeReserved) +local total=self:GetWeightCargoMax(UnitName) +local percent=free/total*100 +return percent +end +function OPSGROUP:GetUsedCargobayRelative(UnitName,IncludeReserved) +local free=self:GetFreeCargobayRelative(UnitName,IncludeReserved) +return 100-free +end +function OPSGROUP:GetFreeCargobayMax(Currently) +local maxweight=0 +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +local weight=element.weightMaxCargo +if Currently then +weight=weight-element.weightCargo +end +if weight>maxweight then +maxweight=weight +end +end +end +return maxweight +end +function OPSGROUP:GetWeightCargo(UnitName,IncludeReserved) +local weight=0 +for _,_element in pairs(self.elements)do +local element=_element +if(UnitName==nil or UnitName==element.name)and element.status~=OPSGROUP.ElementStatus.DEAD then +weight=weight+element.weightCargo or 0 +end +end +local gewicht=0 +for _,_element in pairs(self.elements)do +local element=_element +if(UnitName==nil or UnitName==element.name)and(element and element.status~=OPSGROUP.ElementStatus.DEAD)then +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +if(not cargo.reserved)or(cargo.reserved==true and(IncludeReserved==true or IncludeReserved==nil))then +if cargo.group then +gewicht=gewicht+cargo.group:GetWeightTotal() +else +gewicht=gewicht+cargo.storageAmount*cargo.storageWeight +end +end +end +end +end +self:T3(self.lid..string.format("Unit=%s (reserved=%s): weight=%d, gewicht=%d",tostring(UnitName),tostring(IncludeReserved),weight,gewicht)) +if IncludeReserved==false and gewicht~=weight then +self:T(self.lid..string.format("ERROR: FF weight!=gewicht: weight=%.1f, gewicht=%.1f",weight,gewicht)) +end +return gewicht +end +function OPSGROUP:GetWeightCargoMax(UnitName) +local weight=0 +for _,_element in pairs(self.elements)do +local element=_element +if(UnitName==nil or UnitName==element.name)and element.status~=OPSGROUP.ElementStatus.DEAD then +weight=weight+element.weightMaxCargo +end +end +return weight +end +function OPSGROUP:GetCargoOpsGroups() +local opsgroups={} +for _,_element in pairs(self.elements)do +local element=_element +for _,_cargo in pairs(element.cargoBay)do +local cargo=_cargo +table.insert(opsgroups,cargo.group) +end +end +return opsgroups +end +function OPSGROUP:AddWeightCargo(UnitName,Weight) +local element=self:GetElementByName(UnitName) +if element then +element.weightCargo=element.weightCargo+Weight +self:T(self.lid..string.format("%s: Adding %.1f kg cargo weight. New cargo weight=%.1f kg",UnitName,Weight,element.weightCargo)) +if self.isFlightgroup and element.unit and element.unit:IsAlive()then +trigger.action.setUnitInternalCargo(element.name,element.weightCargo) +end +end +return self +end +function OPSGROUP:RedWeightCargo(UnitName,Weight) +self:AddWeightCargo(UnitName,-Weight) +return self +end +function OPSGROUP:_GetWeightStorage(Storage,Total,Reserved,Amount) +local weight=Storage.cargoAmount +if not Total then +weight=weight-Storage.cargoLost-Storage.cargoLoaded-Storage.cargoDelivered +end +if Reserved then +weight=weight-Storage.cargoReserved +end +if not Amount then +weight=weight*Storage.cargoWeight +end +return weight +end +function OPSGROUP:CanCargo(Cargo) +if Cargo then +local weight=math.huge +if Cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local weight=Cargo.opsgroup:GetWeightTotal() +for _,_element in pairs(self.elements)do +local element=_element +if element and element.status~=OPSGROUP.ElementStatus.DEAD and element.weightMaxCargo>=weight then +return true +end +end +else +weight=Cargo.storage.cargoWeight +end +local bay=0 +for _,_element in pairs(self.elements)do +local element=_element +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +bay=bay+element.weightMaxCargo +end +end +if bay>=weight then +return true +end +end +return false +end +function OPSGROUP:FindCarrierForCargo(Weight) +for _,_element in pairs(self.elements)do +local element=_element +local free=self:GetFreeCargobay(element.name) +if free>=Weight then +return element +else +self:T3(self.lid..string.format("%s: Weight %d>%d free cargo bay",element.name,Weight,free)) +end +end +return nil +end +function OPSGROUP:_SetMyCarrier(CarrierGroup,CarrierElement,Reserved) +self:T(self.lid..string.format("Setting My Carrier: %s (%s), reserved=%s",CarrierGroup:GetName(),tostring(CarrierElement.name),tostring(Reserved))) +self.mycarrier.group=CarrierGroup +self.mycarrier.element=CarrierElement +self.mycarrier.reserved=Reserved +self.cargoTransportUID=CarrierGroup.cargoTransport and CarrierGroup.cargoTransport.uid or nil +end +function OPSGROUP:_GetMyCarrierGroup() +if self.mycarrier and self.mycarrier.group then +return self.mycarrier.group +end +return nil +end +function OPSGROUP:_GetMyCarrierElement() +if self.mycarrier and self.mycarrier.element then +return self.mycarrier.element +end +return nil +end +function OPSGROUP:_IsMyCarrierReserved() +if self.mycarrier then +return self.mycarrier.reserved +end +return nil +end +function OPSGROUP:_GetMyCarrier() +return self.mycarrier.group,self.mycarrier.element,self.mycarrier.reserved +end +function OPSGROUP:_RemoveMyCarrier() +self:T(self.lid..string.format("Removing my carrier!")) +self.mycarrier.group=nil +self.mycarrier.element=nil +self.mycarrier.reserved=nil +self.mycarrier={} +self.cargoTransportUID=nil +return self +end +function OPSGROUP:onafterPickup(From,Event,To) +local oldstatus=self.carrierStatus +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.PICKUP) +local TZC=self.cargoTZC +local Zone=TZC.PickupZone +local inzone=self:IsInZone(Zone) +local airbasePickup=TZC.PickupAirbase +local ready4loading=false +if self:IsArmygroup()or self:IsNavygroup()then +ready4loading=inzone +else +ready4loading=self.currbase and airbasePickup and self.currbase:GetName()==airbasePickup:GetName()and self:IsParking() +if ready4loading==false and self.isHelo and self:IsLandedAt()and inzone then +ready4loading=true +end +end +if ready4loading then +if(self:IsArmygroup()or self:IsNavygroup())and not self:IsHolding()then +self:FullStop() +end +self:__Loading(-5) +else +local surfacetypes=nil +if self:IsArmygroup()or self:IsFlightgroup()then +surfacetypes={land.SurfaceType.LAND} +elseif self:IsNavygroup()then +surfacetypes={land.SurfaceType.WATER} +end +local Coordinate=Zone:GetRandomCoordinate(nil,nil,surfacetypes) +local uid=self:GetWaypointCurrentUID() +if self:IsFlightgroup()then +if self:IsParking()and self:IsUncontrolled()then +self:StartUncontrolled() +end +if airbasePickup then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +if path and oldstatus~=OPSGROUP.CarrierStatus.NOTCARRIER then +for i=#path.waypoints,1,-1 do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=FLIGHTGROUP.AddWaypoint(self,coordinate,nil,uid,nil,false);waypoint.temp=true +uid=waypoint.uid +if i==1 then +waypoint.temp=false +waypoint.detour=1 +end +end +else +local coordinate=self:GetCoordinate():GetIntermediateCoordinate(Coordinate,0.5) +local waypoint=FLIGHTGROUP.AddWaypoint(self,coordinate,nil,uid,UTILS.MetersToFeet(self.altitudeCruise),true);waypoint.detour=1 +end +elseif self.isHelo then +local waypoint=FLIGHTGROUP.AddWaypoint(self,Coordinate,nil,uid,UTILS.MetersToFeet(self.altitudeCruise),false);waypoint.detour=1 +else +self:T(self.lid.."ERROR: Transportcarrier aircraft cannot land in Pickup zone! Specify a ZONE_AIRBASE as pickup zone") +end +if self.isHelo and self:IsLandedAt()then +local Task=self:GetTaskCurrent() +if Task then +self:TaskCancel(Task) +else +self:T(self.lid.."ERROR: No current task but landed at?!") +end +end +if self:IsWaiting()then +self:__Cruise(-2) +end +elseif self:IsNavygroup()then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +if path then +for i=#path.waypoints,1,-1 do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=NAVYGROUP.AddWaypoint(self,coordinate,nil,uid,nil,false);waypoint.temp=true +uid=waypoint.uid +end +end +local waypoint=NAVYGROUP.AddWaypoint(self,Coordinate,nil,uid,self.altitudeCruise,false);waypoint.detour=1 +self:__Cruise(-2) +elseif self:IsArmygroup()then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +local Formation=self.cargoTransport:_GetFormationPickup(self.cargoTZC,self) +if path and oldstatus~=OPSGROUP.CarrierStatus.NOTCARRIER then +for i=#path.waypoints,1,-1 do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=ARMYGROUP.AddWaypoint(self,coordinate,nil,uid,wp.action,false);waypoint.temp=true +uid=waypoint.uid +end +end +local waypoint=ARMYGROUP.AddWaypoint(self,Coordinate,nil,uid,Formation,false);waypoint.detour=1 +self:__Cruise(-2,nil,Formation) +end +end +end +function OPSGROUP:_SortCargo(Cargos) +local function _sort(a,b) +local cargoA=a +local cargoB=b +local weightA=0 +local weightB=0 +if cargoA.opsgroup then +weightA=cargoA.opsgroup:GetWeightTotal() +else +weightA=self:_GetWeightStorage(cargoA.storage) +end +if cargoB.opsgroup then +weightB=cargoB.opsgroup:GetWeightTotal() +else +weightB=self:_GetWeightStorage(cargoB.storage) +end +return weightA>weightB +end +table.sort(Cargos,_sort) +return Cargos +end +function OPSGROUP:onafterLoading(From,Event,To) +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.LOADING) +local cargos={} +for _,_cargo in pairs(self.cargoTZC.Cargos)do +local cargo=_cargo +local canCargo=self:CanCargo(cargo) +local isCarrier=false +local isNotCargo=true +local isHolding=cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and(cargo.opsgroup:IsHolding()or cargo.opsgroup:IsLoaded())or true +local inZone=cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and(cargo.opsgroup:IsInZone(self.cargoTZC.EmbarkZone)or cargo.opsgroup:IsInUtero())or true +local isOnMission=cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup:IsOnMission()or false +if isOnMission then +local mission=cargo.opsgroup:GetMissionCurrent() +if mission and((mission.opstransport and mission.opstransport.uid==self.cargoTransport.uid)or mission.type==AUFTRAG.Type.NOTHING)then +isOnMission=not isHolding +end +end +local isAvail=true +if cargo.type==OPSTRANSPORT.CargoType.STORAGE then +local nAvail=cargo.storage.storageFrom:GetAmount(cargo.storage.cargoType) +if nAvail>0 then +isAvail=true +else +isAvail=false +end +else +isCarrier=cargo.opsgroup:IsPickingup()or cargo.opsgroup:IsLoading()or cargo.opsgroup:IsTransporting()or cargo.opsgroup:IsUnloading() +isNotCargo=cargo.opsgroup:IsNotCargo(true) +end +local isDead=cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup:IsDead()or false +self:T(self.lid..string.format("Loading: canCargo=%s, isCarrier=%s, isNotCargo=%s, isHolding=%s, isOnMission=%s", +tostring(canCargo),tostring(isCarrier),tostring(isNotCargo),tostring(isHolding),tostring(isOnMission))) +if canCargo and inZone and isNotCargo and isHolding and isAvail and(not(cargo.delivered or isDead or isCarrier or isOnMission))then +table.insert(cargos,cargo) +end +end +self:_SortCargo(cargos) +for _,_cargo in pairs(cargos)do +local cargo=_cargo +local weight=nil +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +weight=cargo.opsgroup:GetWeightTotal() +local carrier=self:FindCarrierForCargo(weight) +if carrier then +cargo.opsgroup:Board(self,carrier) +end +else +weight=self:_GetWeightStorage(cargo.storage,false) +local Amount=cargo.storage.storageFrom:GetAmount(cargo.storage.cargoType) +local Weight=Amount*cargo.storage.cargoWeight +weight=math.min(weight,Weight) +self:T(self.lid..string.format("Loading storage weight=%d kg (warehouse has %d kg)!",weight,Weight)) +for _,_element in pairs(self.elements)do +local element=_element +local free=self:GetFreeCargobay(element.name) +local w=math.min(weight,free) +if w>=cargo.storage.cargoWeight then +local amount=math.floor(w/cargo.storage.cargoWeight) +cargo.storage.storageFrom:RemoveAmount(cargo.storage.cargoType,amount) +cargo.storage.cargoLoaded=cargo.storage.cargoLoaded+amount +self:_AddCargobayStorage(element,cargo.uid,cargo.storage.cargoType,amount,cargo.storage.cargoWeight) +weight=weight-amount*cargo.storage.cargoWeight +local text=string.format("Element %s: loaded amount=%d (weight=%d) ==> left=%d kg",element.name,amount,amount*cargo.storage.cargoWeight,weight) +self:T(self.lid..text) +if weight<=0 then +break +end +end +end +end +end +end +function OPSGROUP:_NewCargoStatus(Status) +if self.verbose>=2 then +self:I(self.lid..string.format("New cargo status: %s --> %s",tostring(self.cargoStatus),tostring(Status))) +end +self.cargoStatus=Status +end +function OPSGROUP:_NewCarrierStatus(Status) +if self.verbose>=2 then +self:I(self.lid..string.format("New carrier status: %s --> %s",tostring(self.carrierStatus),tostring(Status))) +end +self.carrierStatus=Status +end +function OPSGROUP:_TransferCargo(CargoGroup,CarrierGroup,CarrierElement) +self:T(self.lid..string.format("Transferring cargo %s to new carrier group %s",CargoGroup:GetName(),CarrierGroup:GetName())) +self:Unload(CargoGroup) +CarrierGroup:Load(CargoGroup,CarrierElement) +end +function OPSGROUP:onafterLoad(From,Event,To,CargoGroup,Carrier) +self:T(self.lid..string.format("Loading group %s",tostring(CargoGroup.groupname))) +local carrier=Carrier or CargoGroup:_GetMyCarrierElement() +if not carrier then +local weight=CargoGroup:GetWeightTotal() +carrier=self:FindCarrierForCargo(weight) +end +if carrier then +CargoGroup:_NewCargoStatus(OPSGROUP.CargoStatus.LOADED) +CargoGroup:ClearWaypoints() +self:_AddCargobay(CargoGroup,carrier,false) +if CargoGroup:IsAlive()then +CargoGroup:Despawn(0,true) +end +CargoGroup:Embarked(self,carrier) +self:Loaded(CargoGroup) +if self.cargoTransport then +CargoGroup:_DelMyLift(self.cargoTransport) +self.cargoTransport:Loaded(CargoGroup,self,carrier) +else +self:T(self.lid..string.format("WARNING: Loaded cargo but no current OPSTRANSPORT assignment!")) +end +else +self:T(self.lid.."ERROR: Cargo has no carrier on Load event!") +end +end +function OPSGROUP:onafterLoadingDone(From,Event,To) +self:T(self.lid.."Carrier Loading Done ==> Transport") +self:__Transport(1) +end +function OPSGROUP:onbeforeTransport(From,Event,To) +if self.cargoTransport==nil then +return false +elseif self.cargoTransport:IsDelivered()then +return false +end +return true +end +function OPSGROUP:onafterTransport(From,Event,To) +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.TRANSPORTING) +local Zone=self.cargoTZC.DeployZone +local inzone=self:IsInZone(Zone) +local airbaseDeploy=self.cargoTZC.DeployAirbase +local ready2deploy=false +if self:IsArmygroup()or self:IsNavygroup()then +ready2deploy=inzone +else +ready2deploy=self.currbase and airbaseDeploy and self.currbase:GetName()==airbaseDeploy:GetName()and self:IsParking() +if ready2deploy==false and(self.isHelo or self.isVTOL)and self:IsLandedAt()and inzone then +ready2deploy=true +end +end +if inzone then +if(self:IsArmygroup()or self:IsNavygroup())and not self:IsHolding()then +self:FullStop() +end +self:__Unloading(-5) +else +local surfacetypes=nil +if self:IsArmygroup()or self:IsFlightgroup()then +surfacetypes={land.SurfaceType.LAND} +elseif self:IsNavygroup()then +surfacetypes={land.SurfaceType.WATER,land.SurfaceType.SHALLOW_WATER} +end +local Coordinate=Zone:GetRandomCoordinate(nil,nil,surfacetypes) +local uid=self:GetWaypointCurrentUID() +if self:IsFlightgroup()then +if self:IsParking()and self:IsUncontrolled()then +self:StartUncontrolled() +end +if airbaseDeploy then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +if path then +for i=1,#path.waypoints do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=FLIGHTGROUP.AddWaypoint(self,coordinate,nil,uid,nil,false);waypoint.temp=true +uid=waypoint.uid +if i==#path.waypoints then +waypoint.temp=false +waypoint.detour=1 +end +end +else +local coordinate=self:GetCoordinate():GetIntermediateCoordinate(Coordinate,0.5) +local waypoint=FLIGHTGROUP.AddWaypoint(self,coordinate,nil,uid,UTILS.MetersToFeet(self.altitudeCruise),true);waypoint.detour=1 +end +elseif self.isHelo then +local waypoint=FLIGHTGROUP.AddWaypoint(self,Coordinate,nil,uid,UTILS.MetersToFeet(self.altitudeCruise),false);waypoint.detour=1 +else +self:T(self.lid.."ERROR: Aircraft (cargo carrier) cannot land in Deploy zone! Specify a ZONE_AIRBASE as deploy zone") +end +if self.isHelo and self:IsLandedAt()then +local Task=self:GetTaskCurrent() +if Task then +self:TaskCancel(Task) +else +self:T(self.lid.."ERROR: No current task but landed at?!") +end +end +elseif self:IsArmygroup()then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +local Formation=self.cargoTransport:_GetFormationTransport(self.cargoTZC,self) +if path then +for i=1,#path.waypoints do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=ARMYGROUP.AddWaypoint(self,coordinate,nil,uid,wp.action,false);waypoint.temp=true +uid=waypoint.uid +end +end +local waypoint=ARMYGROUP.AddWaypoint(self,Coordinate,nil,uid,Formation,false);waypoint.detour=1 +self:Cruise(nil,Formation) +elseif self:IsNavygroup()then +local path=self.cargoTransport:_GetPathTransport(self.category,self.cargoTZC) +if path then +for i=1,#path.waypoints do +local wp=path.waypoints[i] +local coordinate=COORDINATE:NewFromWaypoint(wp) +local waypoint=NAVYGROUP.AddWaypoint(self,coordinate,nil,uid,nil,false);waypoint.temp=true +uid=waypoint.uid +end +end +local waypoint=NAVYGROUP.AddWaypoint(self,Coordinate,nil,uid,self.altitudeCruise,false);waypoint.detour=1 +self:Cruise() +end +end +end +function OPSGROUP:onafterUnloading(From,Event,To) +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.UNLOADING) +self:T(self.lid.."Unloading..") +local zone=self.cargoTZC.DisembarkZone or self.cargoTZC.DeployZone +for _,_cargo in pairs(self.cargoTZC.Cargos)do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +if cargo.opsgroup:IsLoaded(self.groupname)and not cargo.opsgroup:IsDead()then +local carrier=nil +local carrierGroup=nil +local disembarkToCarriers=cargo.disembarkCarriers~=nil or self.cargoTZC.disembarkToCarriers +if cargo.disembarkZone then +zone=cargo.disembarkZone +end +self:T(self.lid..string.format("Unloading cargo %s to zone %s",cargo.opsgroup:GetName(),zone and zone:GetName()or"No Zone Found!")) +if zone and zone:IsInstanceOf("ZONE_AIRBASE")and zone:GetAirbase():IsShip()then +local shipname=zone:GetAirbase():GetName() +local ship=UNIT:FindByName(shipname) +local group=ship:GetGroup() +carrierGroup=_DATABASE:GetOpsGroup(group:GetName()) +carrier=carrierGroup:GetElementByName(shipname) +end +if disembarkToCarriers then +self:T(self.lid..string.format("Trying to find disembark carriers in zone %s",zone:GetName())) +local disembarkCarriers=cargo.disembarkCarriers or self.cargoTZC.DisembarkCarriers +carrier,carrierGroup=self.cargoTransport:FindTransferCarrierForCargo(cargo.opsgroup,zone,disembarkCarriers,self.cargoTZC.DeployAirbase) +end +if(disembarkToCarriers and carrier and carrierGroup)or(not disembarkToCarriers)then +cargo.delivered=true +self.cargoTransport.Ndelivered=self.cargoTransport.Ndelivered+1 +if carrier and carrierGroup then +self:_TransferCargo(cargo.opsgroup,carrierGroup,carrier) +elseif zone and zone:IsInstanceOf("ZONE_AIRBASE")and zone:GetAirbase():IsShip()then +self:T(self.lid.."ERROR: Deploy/disembark zone is a ZONE_AIRBASE of a ship! Where to put the cargo? Dumping into the sea, sorry!") +self:Unload(cargo.opsgroup) +else +if self.cargoTransport:GetDisembarkInUtero(self.cargoTZC)then +self:Unload(cargo.opsgroup) +else +local DisembarkZone=cargo.disembarkZone or self.cargoTransport:GetDisembarkZone(self.cargoTZC) +local Coordinate=nil +if DisembarkZone then +Coordinate=DisembarkZone:GetRandomCoordinate() +else +local element=cargo.opsgroup:_GetMyCarrierElement() +if element then +local zoneCarrier=self:GetElementZoneUnload(element.name) +Coordinate=zoneCarrier:GetRandomCoordinate() +else +self:E(self.lid..string.format("ERROR carrier element nil!")) +end +end +local Heading=math.random(0,359) +local activation=self.cargoTransport:GetDisembarkActivation(self.cargoTZC) +if cargo.disembarkActivation~=nil then +activation=cargo.disembarkActivation +end +self:Unload(cargo.opsgroup,Coordinate,activation,Heading) +end +self.cargoTransport:Unloaded(cargo.opsgroup,self) +end +else +self:T(self.lid.."Cargo needs carrier but no carrier is avaiable (yet)!") +end +else +end +else +if not cargo.delivered then +for _,_element in pairs(self.elements)do +local element=_element +local mycargo=self:_GetCargobayElement(element,cargo.uid) +if mycargo then +cargo.storage.storageTo:AddAmount(mycargo.storageType,mycargo.storageAmount) +cargo.storage.cargoDelivered=cargo.storage.cargoDelivered+mycargo.storageAmount +cargo.storage.cargoLoaded=cargo.storage.cargoLoaded-mycargo.storageAmount +self:_DelCargobayElement(element,mycargo) +self:T2(self.lid..string.format("Cargo loaded=%d, delivered=%d, lost=%d",cargo.storage.cargoLoaded,cargo.storage.cargoDelivered,cargo.storage.cargoLost)) +end +end +local amountToDeliver=self:_GetWeightStorage(cargo.storage,false,false,true) +local amountTotal=self:_GetWeightStorage(cargo.storage,true,false,true) +local text=string.format("Amount delivered=%d, total=%d",amountToDeliver,amountTotal) +self:T(self.lid..text) +if amountToDeliver<=0 then +cargo.delivered=true +self.cargoTransport.Ndelivered=self.cargoTransport.Ndelivered+1 +local text=string.format("Ndelivered=%d delivered=%s",self.cargoTransport.Ndelivered,tostring(cargo.delivered)) +self:T(self.lid..text) +end +end +end +end +end +function OPSGROUP:onbeforeUnload(From,Event,To,OpsGroup,Coordinate,Heading) +local removed=self:_DelCargobay(OpsGroup) +return removed +end +function OPSGROUP:onafterUnload(From,Event,To,OpsGroup,Coordinate,Activated,Heading) +OpsGroup:_NewCargoStatus(OPSGROUP.CargoStatus.NOTCARGO) +if Coordinate then +local Template=UTILS.DeepCopy(OpsGroup.template) +if Activated==false then +Template.lateActivation=true +else +Template.lateActivation=false +end +for _,Unit in pairs(Template.units)do +local element=OpsGroup:GetElementByName(Unit.name) +if element then +local vec3=element.vec3 +local rvec2={x=Unit.x-Template.x,y=Unit.y-Template.y} +local cvec2={x=Coordinate.x,y=Coordinate.z} +Unit.x=cvec2.x+rvec2.x +Unit.y=cvec2.y+rvec2.y +Unit.alt=land.getHeight({x=Unit.x,y=Unit.y}) +Unit.heading=Heading and math.rad(Heading)or Unit.heading +Unit.psi=-Unit.heading +end +end +OpsGroup:_Respawn(0,Template) +if OpsGroup:IsNavygroup()then +OpsGroup:ClearWaypoints() +OpsGroup.currentwp=1 +OpsGroup.passedfinalwp=true +NAVYGROUP.AddWaypoint(OpsGroup,Coordinate,nil,nil,nil,false) +elseif OpsGroup:IsArmygroup()then +OpsGroup:ClearWaypoints() +OpsGroup.currentwp=1 +OpsGroup.passedfinalwp=true +ARMYGROUP.AddWaypoint(OpsGroup,Coordinate,nil,nil,nil,false) +end +else +OpsGroup.position=self:GetVec3() +end +OpsGroup:Disembarked(OpsGroup:_GetMyCarrierGroup(),OpsGroup:_GetMyCarrierElement()) +self:Unloaded(OpsGroup) +OpsGroup:_RemoveMyCarrier() +end +function OPSGROUP:onafterUnloaded(From,Event,To,OpsGroupCargo) +self:T(self.lid..string.format("Unloaded OPSGROUP %s",OpsGroupCargo:GetName())) +if OpsGroupCargo.legion and OpsGroupCargo:IsInZone(OpsGroupCargo.legion.spawnzone)then +self:T(self.lid..string.format("Unloaded group %s returned to legion",OpsGroupCargo:GetName())) +OpsGroupCargo:Returned() +end +local paused=OpsGroupCargo:_CountPausedMissions()>0 +if paused then +OpsGroupCargo:UnpauseMission() +end +end +function OPSGROUP:onafterUnloadingDone(From,Event,To) +self:T(self.lid.."Cargo unloading done..") +if self:IsFlightgroup()and self:IsLandedAt()then +local Task=self:GetTaskCurrent() +self:__TaskCancel(5,Task) +end +local delivered=self:_CheckGoPickup(self.cargoTransport) +if not delivered then +self.cargoTZC=self.cargoTransport:_GetTransportZoneCombo(self) +if self.cargoTZC then +self:T(self.lid.."Unloaded: Still cargo left ==> Pickup") +self:Pickup() +else +self:T(self.lid..string.format("WARNING: Not all cargo was delivered but could not get a transport zone combo ==> setting carrier state to NOT CARRIER")) +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.NOTCARRIER) +end +else +self:T(self.lid.."Unloaded: ALL cargo unloaded ==> Delivered (current)") +self:Delivered(self.cargoTransport) +end +end +function OPSGROUP:onafterDelivered(From,Event,To,CargoTransport) +if self.cargoTransport and self.cargoTransport.uid==CargoTransport.uid then +if self:IsPickingup()then +local wpindex=self:GetWaypointIndexNext(false) +if wpindex then +self:RemoveWaypoint(wpindex) +end +self.isLandingAtAirbase=nil +elseif self:IsLoading()then +elseif self:IsTransporting()then +elseif self:IsUnloading()then +end +self:_NewCarrierStatus(OPSGROUP.CarrierStatus.NOTCARRIER) +if self:IsFlightgroup()then +local function atbase(_airbase) +local airbase=_airbase +if airbase and self.currbase then +if airbase.AirbaseName==self.currbase.AirbaseName then +return true +end +end +return false +end +if self:IsUncontrolled()and not atbase(self.destbase)then +self:StartUncontrolled() +end +if self:IsLandedAt()then +local Task=self:GetTaskCurrent() +self:TaskCancel(Task) +end +else +self:__Cruise(-0.1) +end +self.cargoTransport:SetCarrierTransportStatus(self,OPSTRANSPORT.Status.DELIVERED) +self:T(self.lid..string.format("All cargo of transport UID=%d delivered ==> check group done in 0.2 sec",self.cargoTransport.uid)) +self:_CheckGroupDone(0.2) +end +end +function OPSGROUP:onafterTransportCancel(From,Event,To,Transport) +if self.cargoTransport and self.cargoTransport.uid==Transport.uid then +self:T(self.lid..string.format("Cancel current transport %d",Transport.uid)) +local calldelivered=false +if self:IsPickingup()then +calldelivered=true +elseif self:IsLoading()then +local cargos=Transport:GetCargoOpsGroups(false) +for _,_opsgroup in pairs(cargos)do +local opsgroup=_opsgroup +if opsgroup:IsBoarding(self.groupname)then +opsgroup:RemoveWaypoint(self.currentwp+1) +self:_DelCargobay(opsgroup) +opsgroup:_RemoveMyCarrier() +opsgroup:_NewCargoStatus(OPSGROUP.CargoStatus.NOTCARGO) +elseif opsgroup:IsLoaded(self.groupname)then +local zoneCarrier=self:GetElementZoneUnload(opsgroup:_GetMyCarrierElement().name) +local Coordinate=zoneCarrier and zoneCarrier:GetRandomCoordinate()or self.cargoTransport:GetEmbarkZone(self.cargoTZC):GetRandomCoordinate() +local Heading=math.random(0,359) +self:Unload(opsgroup,Coordinate,self.cargoTransport:GetDisembarkActivation(self.cargoTZC),Heading) +self.cargoTransport:Unloaded(opsgroup,self) +end +end +calldelivered=true +elseif self:IsTransporting()then +elseif self:IsUnloading()then +else +end +if calldelivered then +self:__Delivered(-2,Transport) +end +else +Transport:SetCarrierTransportStatus(self,AUFTRAG.GroupStatus.CANCELLED) +self:DelOpsTransport(Transport) +self:_CheckGroupDone(1) +end +end +function OPSGROUP:onbeforeBoard(From,Event,To,CarrierGroup,Carrier) +if self:IsDead()then +self:T(self.lid.."Group DEAD ==> Deny Board transition!") +return false +elseif CarrierGroup:IsDead()then +self:T(self.lid.."Carrier Group DEAD ==> Deny Board transition!") +self:_NewCargoStatus(OPSGROUP.CargoStatus.NOTCARGO) +return false +elseif Carrier.status==OPSGROUP.ElementStatus.DEAD then +self:T(self.lid.."Carrier Element DEAD ==> Deny Board transition!") +self:_NewCargoStatus(OPSGROUP.CargoStatus.NOTCARGO) +return false +end +return true +end +function OPSGROUP:onafterBoard(From,Event,To,CarrierGroup,Carrier) +local CarrierIsArmyOrNavy=CarrierGroup:IsArmygroup()or CarrierGroup:IsNavygroup() +local CargoIsArmyOrNavy=self:IsArmygroup()or self:IsNavygroup() +if(CarrierIsArmyOrNavy and(CarrierGroup:GetVelocity(Carrier.name)<=1))or(CarrierGroup:IsFlightgroup()and(CarrierGroup:IsParking()or CarrierGroup:IsLandedAt()))then +local board=self.speedMax>0 and CargoIsArmyOrNavy and self:IsAlive()and CarrierGroup:IsAlive() +if self:IsArmygroup()and CarrierGroup:IsNavygroup()then +board=false +end +if self:IsLoaded()then +self:T(self.lid..string.format("Group is loaded currently ==> Moving directly to new carrier - No Unload(), Disembart() events triggered!")) +self:_RemoveMyCarrier() +CarrierGroup:Load(self) +elseif board then +self:_NewCargoStatus(OPSGROUP.CargoStatus.BOARDING) +self:T(self.lid..string.format("Boarding group=%s [%s], carrier=%s",CarrierGroup:GetName(),CarrierGroup:GetState(),tostring(Carrier.name))) +local Coordinate=Carrier.unit:GetCoordinate() +self:ClearWaypoints(self.currentwp+1) +if self.isArmygroup then +local waypoint=ARMYGROUP.AddWaypoint(self,Coordinate,nil,nil,ENUMS.Formation.Vehicle.Diamond);waypoint.detour=1 +self:Cruise() +else +local waypoint=NAVYGROUP.AddWaypoint(self,Coordinate);waypoint.detour=1 +self:Cruise() +end +CarrierGroup:_AddCargobay(self,Carrier,true) +else +self:T(self.lid..string.format("Board [loaded=%s] with direct load to carrier group=%s, element=%s",tostring(self:IsLoaded()),CarrierGroup:GetName(),tostring(Carrier.name))) +local mycarriergroup=self:_GetMyCarrierGroup() +if mycarriergroup then +self:T(self.lid..string.format("Current carrier group %s",mycarriergroup:GetName())) +end +if mycarriergroup and mycarriergroup:GetName()~=CarrierGroup:GetName()then +self:T(self.lid.."Unloading from mycarrier") +mycarriergroup:Unload(self) +end +CarrierGroup:Load(self) +end +else +self:T(self.lid.."Carrier not ready for boarding yet ==> repeating boarding call in 10 sec") +self:__Board(-10,CarrierGroup,Carrier) +CarrierGroup:_AddCargobay(self,Carrier,true) +end +end +function OPSGROUP:_CheckInZones() +if self.checkzones and self:IsAlive()then +local Ncheck=self.checkzones:Count() +local Ninside=self.inzones:Count() +self:T(self.lid..string.format("Check if group is in %d zones. Currently it is in %d zones.",self.checkzones:Count(),self.inzones:Count())) +local leftzones={} +for inzonename,inzone in pairs(self.inzones:GetSet())do +local isstillinzone=self.group:IsInZone(inzone) +if not isstillinzone then +table.insert(leftzones,inzone) +end +end +for _,leftzone in pairs(leftzones)do +self:LeaveZone(leftzone) +end +local enterzones={} +for checkzonename,_checkzone in pairs(self.checkzones:GetSet())do +local checkzone=_checkzone +local isincheckzone=self.group:IsInZone(checkzone) +if isincheckzone and not self.inzones:_Find(checkzonename)then +table.insert(enterzones,checkzone) +end +end +for _,enterzone in pairs(enterzones)do +self:EnterZone(enterzone) +end +end +end +function OPSGROUP:_CheckDetectedUnits() +if self.detectionOn and self.group and not self:IsDead()then +local detectedtargets=self.group:GetDetectedTargets() +local detected={} +local groups={} +for DetectionObjectID,Detection in pairs(detectedtargets or{})do +local DetectedObject=Detection.object +if DetectedObject and DetectedObject:isExist()and DetectedObject.id_<50000000 then +local unit=UNIT:Find(DetectedObject) +if unit and unit:IsAlive()then +local unitname=unit:GetName() +table.insert(detected,unit) +self:DetectedUnit(unit) +local group=unit:GetGroup() +if group then +groups[group:GetName()]=group +end +end +end +end +for groupname,group in pairs(groups)do +self:DetectedGroup(group) +end +local lost={} +for _,_unit in pairs(self.detectedunits:GetSet())do +local unit=_unit +local gotit=false +for _,_du in pairs(detected)do +local du=_du +if unit:GetName()==du:GetName()then +gotit=true +end +end +if not gotit then +table.insert(lost,unit:GetName()) +self:DetectedUnitLost(unit) +end +end +self.detectedunits:RemoveUnitsByName(lost) +local lost={} +for _,_group in pairs(self.detectedgroups:GetSet())do +local group=_group +local gotit=false +for _,_du in pairs(groups)do +local du=_du +if group:GetName()==du:GetName()then +gotit=true +end +end +if not gotit then +table.insert(lost,group:GetName()) +self:DetectedGroupLost(group) +end +end +self.detectedgroups:RemoveGroupsByName(lost) +end +end +function OPSGROUP:_CheckGroupDone(delay) +local fsmstate=self:GetState() +if self:IsAlive()and self.isAI then +if delay and delay>0 then +self:T(self.lid..string.format("Check OPSGROUP done? [state=%s] in %.3f seconds...",fsmstate,delay)) +self:ScheduleOnce(delay,self._CheckGroupDone,self) +else +self:T(self.lid..string.format("Check OSGROUP done? [state=%s]",fsmstate)) +if self:IsEngaging()then +self:T(self.lid.."Engaging! Group NOT done ==> UpdateRoute()") +self:UpdateRoute() +return +end +if self:IsReturning()then +self:T(self.lid.."Returning! Group NOT done...") +return +end +if self:IsRearming()then +self:T(self.lid.."Rearming! Group NOT done...") +return +end +if self:IsRetreating()then +self:T(self.lid.."Retreating! Group NOT done...") +return +end +if self:IsBoarding()then +self:T(self.lid.."Boarding! Group NOT done...") +return +end +if self:IsWaiting()then +self:T(self.lid.."Waiting! Group NOT done...") +return +end +local nTasks=self:CountRemainingTasks() +local nMissions=self:CountRemainingMissison() +local nTransports=self:CountRemainingTransports() +local nPaused=self:_CountPausedMissions() +if nPaused>0 and nPaused==nMissions then +local missionpaused=self:_GetPausedMission() +self:T(self.lid..string.format("Found paused mission %s [%s]. Unpausing mission...",missionpaused.name,missionpaused.type)) +self:UnpauseMission() +return +end +if nTasks>0 or nMissions>0 or nTransports>0 then +self:T(self.lid..string.format("Group still has tasks, missions or transports ==> NOT DONE")) +return +end +local waypoint=self:GetWaypoint(self.currentwp) +if waypoint then +local ntasks=self:CountTasksWaypoint(waypoint.uid) +if ntasks>0 then +self:T(self.lid..string.format("Still got %d tasks for the current waypoint UID=%d ==> RETURN (no action)",ntasks,waypoint.uid)) +return +end +end +if self.adinfinitum then +if#self.waypoints>0 then +local i=self:GetWaypointIndexNext(true) +local speed=self:GetSpeedToWaypoint(i) +self:Cruise(speed) +self:T(self.lid..string.format("Adinfinitum=TRUE ==> Goto WP index=%d at speed=%d knots",i,speed)) +else +self:T(self.lid..string.format("WARNING: No waypoints left! Commanding a Full Stop")) +self:__FullStop(-1) +end +else +if self:HasPassedFinalWaypoint()then +if self.legion and self.legionReturn then +self:T(self.lid..string.format("Passed final WP, adinfinitum=FALSE, LEGION set ==> RTZ")) +if self.isArmygroup then +self:T2(self.lid.."RTZ to legion spawn zone") +self:RTZ(self.legion.spawnzone) +elseif self.isNavygroup then +self:T2(self.lid.."RTZ to legion port zone") +self:RTZ(self.legion.portzone) +end +else +self:__FullStop(-1) +self:T(self.lid..string.format("Passed final WP, adinfinitum=FALSE ==> Full Stop")) +end +else +if#self.waypoints>0 then +self:T(self.lid..string.format("NOT Passed final WP, #WP>0 ==> Update Route")) +self:Cruise() +else +self:T(self.lid..string.format("WARNING: No waypoints left! Commanding a Full Stop")) +self:__FullStop(-1) +end +end +end +end +end +end +function OPSGROUP:_CheckStuck() +if self:IsHolding()or self:Is("Rearming")or self:IsWaiting()or self:HasPassedFinalWaypoint()then +return +end +local Tnow=timer.getTime() +local ExpectedSpeed=self:GetExpectedSpeed() +local speed=self:GetVelocity() +if speed<0.1 then +if ExpectedSpeed>0 and not self.stuckTimestamp then +self:T2(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected",speed,ExpectedSpeed)) +self.stuckTimestamp=Tnow +self.stuckVec3=self:GetVec3() +end +else +self.stuckTimestamp=nil +end +if self.stuckTimestamp then +local holdtime=Tnow-self.stuckTimestamp +if holdtime>=5*60 and holdtime<10*60 then +self:T(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected for %d sec",speed,ExpectedSpeed,holdtime)) +if self:IsEngaging()then +self:__Disengage(1) +elseif self:IsReturning()then +self:T2(self.lid.."RTZ because of stuck") +self:__RTZ(1) +else +self:__Cruise(1) +end +elseif holdtime>=10*60 and holdtime<30*60 then +self:T(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected for %d sec",speed,ExpectedSpeed,holdtime)) +local mission=self:GetMissionCurrent() +if mission then +self:T(self.lid..string.format("WARNING: Cancelling mission %s [%s] due to being stuck",mission:GetName(),mission:GetType())) +self:MissionCancel(mission) +else +if self:IsReturning()then +self:T2(self.lid.."RTZ because of stuck") +self:__RTZ(1) +else +self:__Cruise(1) +end +end +elseif holdtime>=30*60 then +self:T(self.lid..string.format("WARNING: Group came to an unexpected standstill. Speed=%.1f<%.1f m/s expected for %d sec",speed,ExpectedSpeed,holdtime)) +if self.legion then +self:T(self.lid..string.format("Asset is returned to its legion after being stuck!")) +self:ReturnToLegion() +end +end +end +end +function OPSGROUP:_CheckDamage() +self:T(self.lid..string.format("Checking damage...")) +self.life=0 +local damaged=false +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD and element.status~=OPSGROUP.ElementStatus.INUTERO then +local life=element.unit:GetLife() +self.life=self.life+life +if life<element.life then +element.life=life +self:ElementDamaged(element) +damaged=true +end +end +end +if damaged then +self:Damaged() +end +return self +end +function OPSGROUP:_CheckAmmoFull() +local ammo=self:GetAmmoTot() +for key,value in pairs(self.ammo)do +if ammo[key]<value then +return false +end +end +return true +end +function OPSGROUP:_CheckAmmoStatus() +if self.ammo.Total>0 then +local ammo=self:GetAmmoTot() +if self:IsRearming()then +if ammo.Total>=self.ammo.Total then +self:Rearmed() +end +end +if self.outofAmmo and ammo.Total>0 then +self.outofAmmo=false +end +if ammo.Total==0 and not self.outofAmmo then +self.outofAmmo=true +self:OutOfAmmo() +end +if self.outofGuns and ammo.Guns>0 then +self.outofGuns=false +end +if ammo.Guns==0 and self.ammo.Guns>0 and not self.outofGuns then +self.outofGuns=true +self:OutOfGuns() +end +if self.outofRockets and ammo.Rockets>0 then +self.outofRockets=false +end +if ammo.Rockets==0 and self.ammo.Rockets>0 and not self.outofRockets then +self.outofRockets=true +self:OutOfRockets() +end +if self.outofBombs and ammo.Bombs>0 then +self.outofBombs=false +end +if ammo.Bombs==0 and self.ammo.Bombs>0 and not self.outofBombs then +self.outofBombs=true +self:OutOfBombs() +end +if self.outofMissiles and ammo.Missiles>0 then +self.outofMissiles=false +end +if ammo.Missiles==0 and self.ammo.Missiles>0 and not self.outofMissiles then +self.outofMissiles=true +self:OutOfMissiles() +end +if self.outofMissilesAA and ammo.MissilesAA>0 then +self.outofMissilesAA=false +end +if ammo.MissilesAA==0 and self.ammo.MissilesAA>0 and not self.outofMissilesAA then +self.outofMissilesAA=true +self:OutOfMissilesAA() +end +if self.outofMissilesAG and ammo.MissilesAG>0 then +self.outofMissilesAG=false +end +if ammo.MissilesAG==0 and self.ammo.MissilesAG>0 and not self.outofMissilesAG then +self.outofMissilesAG=true +self:OutOfMissilesAG() +end +if self.outofMissilesAS and ammo.MissilesAS>0 then +self.outofMissilesAS=false +end +if ammo.MissilesAS==0 and self.ammo.MissilesAS>0 and not self.outofMissilesAS then +self.outofMissilesAS=true +self:OutOfMissilesAS() +end +if self.outofTorpedos and ammo.Torpedos>0 then +self.outofTorpedos=false +end +if ammo.Torpedos==0 and self.ammo.Torpedos>0 and not self.outofTorpedos then +self.outofTorpedos=true +self:OutOfTorpedos() +end +if self:IsEngaging()and ammo.Total==0 then +self:Disengage() +end +end +end +function OPSGROUP:_PrintTaskAndMissionStatus() +if self.verbose>=3 and#self.taskqueue>0 then +local text=string.format("Tasks #%d",#self.taskqueue) +for i,_task in pairs(self.taskqueue)do +local task=_task +local name=task.description +local taskid=task.dcstask.id or"unknown" +local status=task.status +local clock=UTILS.SecondsToClock(task.time,true) +local eta=task.time-timer.getAbsTime() +local started=task.timestamp and UTILS.SecondsToClock(task.timestamp,true)or"N/A" +local duration=-1 +if task.duration then +duration=task.duration +if task.timestamp then +duration=task.duration-(timer.getAbsTime()-task.timestamp) +else +duration=task.duration +end +end +if task.type==OPSGROUP.TaskType.SCHEDULED then +text=text..string.format("\n[%d] %s (%s): status=%s, scheduled=%s (%d sec), started=%s, duration=%d",i,taskid,name,status,clock,eta,started,duration) +elseif task.type==OPSGROUP.TaskType.WAYPOINT then +text=text..string.format("\n[%d] %s (%s): status=%s, waypoint=%d, started=%s, duration=%d, stopflag=%d",i,taskid,name,status,task.waypoint,started,duration,task.stopflag:Get()) +end +end +self:I(self.lid..text) +end +if self.verbose>=2 then +local Mission=self:GetMissionByID(self.currentmission) +local text=string.format("Missions %d, Current: %s",self:CountRemainingMissison(),Mission and Mission.name or"none") +for i,_mission in pairs(self.missionqueue)do +local mission=_mission +local Cstart=UTILS.SecondsToClock(mission.Tstart,true) +local Cstop=mission.Tstop and UTILS.SecondsToClock(mission.Tstop,true)or"INF" +text=text..string.format("\n[%d] %s (%s) status=%s (%s), Time=%s-%s, prio=%d wp=%s targets=%d", +i,tostring(mission.name),mission.type,mission:GetGroupStatus(self),tostring(mission.status),Cstart,Cstop,mission.prio,tostring(mission:GetGroupWaypointIndex(self)),mission:CountMissionTargets()) +end +self:I(self.lid..text) +end +end +function OPSGROUP:_SimpleTaskFunction(Function,uid) +local DCSScript={} +DCSScript[#DCSScript+1]=string.format('local mygroup = _DATABASE:FindOpsGroup(\"%s\") ',self.groupname) +DCSScript[#DCSScript+1]=string.format('%s(mygroup, %d)',Function,uid) +local DCSTask=CONTROLLABLE.TaskWrappedAction(self,CONTROLLABLE.CommandDoScript(self,table.concat(DCSScript))) +return DCSTask +end +function OPSGROUP:_CreateWaypoint(waypoint) +waypoint.uid=self.wpcounter +waypoint.npassed=0 +waypoint.coordinate=COORDINATE:New(waypoint.x,waypoint.alt,waypoint.y) +waypoint.name=string.format("Waypoint UID=%d",waypoint.uid) +waypoint.patrol=false +waypoint.detour=false +waypoint.astar=false +waypoint.temp=false +local taskswp={} +local TaskPassingWaypoint=self:_SimpleTaskFunction("OPSGROUP._PassingWaypoint",waypoint.uid) +table.insert(taskswp,TaskPassingWaypoint) +waypoint.task=self.group:TaskCombo(taskswp) +self.wpcounter=self.wpcounter+1 +return waypoint +end +function OPSGROUP:_AddWaypoint(waypoint,wpnumber) +wpnumber=wpnumber or#self.waypoints+1 +table.insert(self.waypoints,wpnumber,waypoint) +self:T(self.lid..string.format("Adding waypoint at index=%d with UID=%d",wpnumber,waypoint.uid)) +if self.currentwp and wpnumber>self.currentwp then +self:_PassedFinalWaypoint(false,string.format("_AddWaypoint: wpnumber/index %d>%d self.currentwp",wpnumber,self.currentwp)) +end +end +function OPSGROUP:_InitWaypoints(WpIndexMin,WpIndexMax) +self.waypoints={} +self.waypoints0={} +local template=_DATABASE:GetGroupTemplate(self.groupname) +if template==nil then +return self +end +self.waypoints0=UTILS.DeepCopy(template.route.points) +WpIndexMin=WpIndexMin or 1 +WpIndexMax=WpIndexMax or#self.waypoints0 +WpIndexMax=math.min(WpIndexMax,#self.waypoints0) +for i=WpIndexMin,WpIndexMax do +local wp=self.waypoints0[i] +local Coordinate=COORDINATE:NewFromWaypoint(wp) +wp.speed=wp.speed or 0 +local speedknots=UTILS.MpsToKnots(wp.speed) +if i<=2 then +self.speedWp=wp.speed +self:T(self.lid..string.format("Expected/waypoint speed=%.1f m/s",self.speedWp)) +end +local Speed=UTILS.MpsToKnots(wp.speed) +local Waypoint=nil +if self:IsFlightgroup()then +Waypoint=FLIGHTGROUP.AddWaypoint(self,Coordinate,Speed,nil,Altitude,false) +elseif self:IsArmygroup()then +Waypoint=ARMYGROUP.AddWaypoint(self,Coordinate,Speed,nil,wp.action,false) +elseif self:IsNavygroup()then +Waypoint=NAVYGROUP.AddWaypoint(self,Coordinate,Speed,nil,Depth,false) +end +local DCStasks=wp.task and wp.task.params.tasks or nil +if DCStasks and self.useMEtasks then +for _,DCStask in pairs(DCStasks)do +if DCStask.id and DCStask.id~="WrappedAction"then +self:AddTaskWaypoint(DCStask,Waypoint,"ME Task") +end +end +end +end +self:T(self.lid..string.format("Initializing %d waypoints",#self.waypoints)) +if self:IsFlightgroup()then +self.homebase=self.homebase or self:GetHomebaseFromWaypoints() +local destbase=self:GetDestinationFromWaypoints() +self.destbase=self.destbase or destbase +self.currbase=self:GetHomebaseFromWaypoints() +if destbase and#self.waypoints>1 then +table.remove(self.waypoints,#self.waypoints) +end +if self.destbase==nil then +self.destbase=self.homebase +end +end +if#self.waypoints>0 then +if#self.waypoints==1 then +self:_PassedFinalWaypoint(true,"_InitWaypoints: #self.waypoints==1") +end +else +self:T(self.lid.."WARNING: No waypoints initialized. Number of waypoints is 0!") +end +return self +end +function OPSGROUP:Route(waypoints,delay) +if delay and delay>0 then +self:ScheduleOnce(delay,OPSGROUP.Route,self,waypoints) +else +if self:IsAlive()then +local DCSTask={ +id='Mission', +params={ +airborne=self:IsFlightgroup(), +route={points=waypoints}, +}, +} +self:SetTask(DCSTask) +else +self:T(self.lid.."ERROR: Group is not alive! Cannot route group.") +end +end +return self +end +function OPSGROUP:_UpdateWaypointTasks(n) +local waypoints=self.waypoints or{} +local nwaypoints=#waypoints +for i,_wp in pairs(waypoints)do +local wp=_wp +if i>=n or nwaypoints==1 then +self:T2(self.lid..string.format("Updating waypoint task for waypoint %d/%d ID=%d. Last waypoint passed %d",i,nwaypoints,wp.uid,self.currentwp)) +local taskswp={} +local TaskPassingWaypoint=self.group:TaskFunction("OPSGROUP._PassingWaypoint",self,wp.uid) +table.insert(taskswp,TaskPassingWaypoint) +wp.task=self.group:TaskCombo(taskswp) +end +end +end +function OPSGROUP._PassingWaypoint(opsgroup,uid) +local text=string.format("Group passing waypoint uid=%d",uid) +opsgroup:T(opsgroup.lid..text) +local waypoint=opsgroup:GetWaypointByID(uid) +if waypoint then +waypoint.npassed=waypoint.npassed+1 +local currentwp=opsgroup.currentwp +opsgroup.currentwp=opsgroup:GetWaypointIndex(uid) +local wpistemp=waypoint.temp or waypoint.detour or waypoint.astar +if wpistemp then +opsgroup:RemoveWaypointByID(uid) +end +local wpnext=opsgroup:GetWaypointNext() +if wpnext then +opsgroup:T(opsgroup.lid..string.format("Next waypoint UID=%d index=%d",wpnext.uid,opsgroup:GetWaypointIndex(wpnext.uid))) +if opsgroup.isArmygroup then +opsgroup.option.Formation=wpnext.action +end +opsgroup.speed=wpnext.speed +if opsgroup.speed<0.01 then +opsgroup.speed=UTILS.KmphToMps(opsgroup.speedCruise) +end +else +opsgroup:_PassedFinalWaypoint(true,"_PassingWaypoint No next Waypoint found") +end +if opsgroup.currentwp==#opsgroup.waypoints and not(opsgroup.adinfinitum or wpistemp)then +opsgroup:_PassedFinalWaypoint(true,"_PassingWaypoint currentwp==#waypoints and NOT adinfinitum and NOT a temporary waypoint") +end +if waypoint.temp then +if(opsgroup:IsNavygroup()or opsgroup:IsArmygroup())and opsgroup.currentwp==#opsgroup.waypoints then +opsgroup:Cruise() +end +elseif waypoint.astar then +opsgroup:Cruise() +elseif waypoint.detour then +if opsgroup:IsRearming()then +opsgroup:Rearming() +elseif opsgroup:IsRetreating()then +opsgroup:Retreated() +elseif opsgroup:IsReturning()then +opsgroup:Returned() +elseif opsgroup:IsPickingup()then +if opsgroup:IsFlightgroup()then +if opsgroup.cargoTZC then +if opsgroup.cargoTZC.PickupAirbase then +opsgroup:LandAtAirbase(opsgroup.cargoTZC.PickupAirbase) +else +local coordinate=opsgroup.cargoTZC.PickupZone:GetRandomCoordinate(nil,nil,{land.SurfaceType.LAND}) +opsgroup:LandAt(coordinate,60*60) +end +else +local coordinate=opsgroup:GetCoordinate() +opsgroup:LandAt(coordinate,60*60) +end +else +opsgroup:FullStop() +opsgroup:__Loading(-5) +end +elseif opsgroup:IsTransporting()then +if opsgroup:IsFlightgroup()then +if opsgroup.cargoTZC then +if opsgroup.cargoTZC.DeployAirbase then +opsgroup:LandAtAirbase(opsgroup.cargoTZC.DeployAirbase) +else +local coordinate=opsgroup.cargoTZC.DeployZone:GetRandomCoordinate(nil,nil,{land.SurfaceType.LAND}) +opsgroup:LandAt(coordinate,60*60) +end +else +local coordinate=opsgroup:GetCoordinate() +opsgroup:LandAt(coordinate,60*60) +end +else +opsgroup:FullStop() +opsgroup:Unloading() +end +elseif opsgroup:IsBoarding()then +local carrierGroup=opsgroup:_GetMyCarrierGroup() +local carrier=opsgroup:_GetMyCarrierElement() +if carrierGroup and carrierGroup:IsAlive()then +if carrier and carrier.unit and carrier.unit:IsAlive()then +carrierGroup:Load(opsgroup) +else +opsgroup:E(opsgroup.lid.."ERROR: Group cannot board assigned carrier UNIT as it is NOT alive!") +end +else +opsgroup:E(opsgroup.lid.."ERROR: Group cannot board assigned carrier GROUP as it is NOT alive!") +end +elseif opsgroup:IsEngaging()then +opsgroup:T(opsgroup.lid.."Passing engaging waypoint") +else +opsgroup:DetourReached() +if waypoint.detour==0 then +opsgroup:FullStop() +elseif waypoint.detour==1 then +opsgroup:Cruise() +else +opsgroup:E("ERROR: waypoint.detour should be 0 or 1") +opsgroup:FullStop() +end +end +else +if opsgroup.ispathfinding then +opsgroup.ispathfinding=false +end +opsgroup:PassingWaypoint(waypoint) +end +end +end +function OPSGROUP._TaskExecute(group,opsgroup,task) +local text=string.format("_TaskExecute %s",task.description) +opsgroup:T3(opsgroup.lid..text) +if opsgroup then +opsgroup:TaskExecute(task) +end +end +function OPSGROUP._TaskDone(group,opsgroup,task) +local text=string.format("_TaskDone %s",task.description) +opsgroup:T(opsgroup.lid..text) +if opsgroup then +opsgroup:TaskDone(task) +end +end +function OPSGROUP:SetDefaultROE(roe) +self.optionDefault.ROE=roe or ENUMS.ROE.ReturnFire +return self +end +function OPSGROUP:SwitchROE(roe) +if self:IsAlive()or self:IsInUtero()then +self.option.ROE=roe or self.optionDefault.ROE +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current ROE=%d when GROUP is SPAWNED",self.option.ROE)) +else +self.group:OptionROE(self.option.ROE) +self:T(self.lid..string.format("Setting current ROE=%d (%s)",self.option.ROE,self:_GetROEName(self.option.ROE))) +end +else +self:T(self.lid.."WARNING: Cannot switch ROE! Group is not alive") +end +return self +end +function OPSGROUP:_GetROEName(roe) +local name="unknown" +if roe==0 then +name="Weapon Free" +elseif roe==1 then +name="Open Fire/Weapon Free" +elseif roe==2 then +name="Open Fire" +elseif roe==3 then +name="Return Fire" +elseif roe==4 then +name="Weapon Hold" +end +return name +end +function OPSGROUP:GetROE() +return self.option.ROE or self.optionDefault.ROE +end +function OPSGROUP:SetDefaultROT(rot) +self.optionDefault.ROT=rot or ENUMS.ROT.PassiveDefense +return self +end +function OPSGROUP:SwitchROT(rot) +if self:IsFlightgroup()then +if self:IsAlive()or self:IsInUtero()then +self.option.ROT=rot or self.optionDefault.ROT +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current ROT=%d when GROUP is SPAWNED",self.option.ROT)) +else +self.group:OptionROT(self.option.ROT) +self:T(self.lid..string.format("Setting current ROT=%d (0=NoReaction, 1=Passive, 2=Evade, 3=ByPass, 4=AllowAbort)",self.option.ROT)) +end +else +self:T(self.lid.."WARNING: Cannot switch ROT! Group is not alive") +end +end +return self +end +function OPSGROUP:GetROT() +return self.option.ROT or self.optionDefault.ROT +end +function OPSGROUP:SetDefaultAlarmstate(alarmstate) +self.optionDefault.Alarm=alarmstate or 0 +return self +end +function OPSGROUP:SwitchAlarmstate(alarmstate) +if self:IsAlive()or self:IsInUtero()then +if self.isArmygroup or self.isNavygroup then +self.option.Alarm=alarmstate or self.optionDefault.Alarm +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current Alarm State=%d when GROUP is SPAWNED",self.option.Alarm)) +else +if self.option.Alarm==0 then +self.group:OptionAlarmStateAuto() +elseif self.option.Alarm==1 then +self.group:OptionAlarmStateGreen() +elseif self.option.Alarm==2 then +self.group:OptionAlarmStateRed() +else +self:T("ERROR: Unknown Alarm State! Setting to AUTO") +self.group:OptionAlarmStateAuto() +self.option.Alarm=0 +end +self:T(self.lid..string.format("Setting current Alarm State=%d (0=Auto, 1=Green, 2=Red)",self.option.Alarm)) +end +end +else +self:T(self.lid.."WARNING: Cannot switch Alarm State! Group is not alive.") +end +return self +end +function OPSGROUP:GetAlarmstate() +return self.option.Alarm or self.optionDefault.Alarm +end +function OPSGROUP:SetDefaultEPLRS(OnOffSwitch) +if OnOffSwitch==nil then +self.optionDefault.EPLRS=self.isEPLRS +else +self.optionDefault.EPLRS=OnOffSwitch +end +return self +end +function OPSGROUP:SwitchEPLRS(OnOffSwitch) +if self:IsAlive()or self:IsInUtero()then +if OnOffSwitch==nil then +self.option.EPLRS=self.optionDefault.EPLRS +else +self.option.EPLRS=OnOffSwitch +end +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current EPLRS=%s when GROUP is SPAWNED",tostring(self.option.EPLRS))) +else +self.group:CommandEPLRS(self.option.EPLRS) +self:T(self.lid..string.format("Setting current EPLRS=%s",tostring(self.option.EPLRS))) +end +else +self:E(self.lid.."WARNING: Cannot switch EPLRS! Group is not alive") +end +return self +end +function OPSGROUP:GetEPLRS() +return self.option.EPLRS or self.optionDefault.EPLRS +end +function OPSGROUP:SetDefaultEmission(OnOffSwitch) +if OnOffSwitch==nil then +self.optionDefault.Emission=true +else +self.optionDefault.Emission=OnOffSwitch +end +return self +end +function OPSGROUP:SwitchEmission(OnOffSwitch) +if self:IsAlive()or self:IsInUtero()then +if OnOffSwitch==nil then +self.option.Emission=self.optionDefault.Emission +else +self.option.Emission=OnOffSwitch +end +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current EMISSION=%s when GROUP is SPAWNED",tostring(self.option.Emission))) +else +self.group:EnableEmission(self.option.Emission) +self:T(self.lid..string.format("Setting current EMISSION=%s",tostring(self.option.Emission))) +end +else +self:E(self.lid.."WARNING: Cannot switch Emission! Group is not alive") +end +return self +end +function OPSGROUP:GetEmission() +return self.option.Emission or self.optionDefault.Emission +end +function OPSGROUP:SetDefaultInvisible(OnOffSwitch) +if OnOffSwitch==nil then +self.optionDefault.Invisible=true +else +self.optionDefault.Invisible=OnOffSwitch +end +return self +end +function OPSGROUP:SwitchInvisible(OnOffSwitch) +if self:IsAlive()or self:IsInUtero()then +if OnOffSwitch==nil then +self.option.Invisible=self.optionDefault.Invisible +else +self.option.Invisible=OnOffSwitch +end +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current INVISIBLE=%s when GROUP is SPAWNED",tostring(self.option.Invisible))) +else +self.group:SetCommandInvisible(self.option.Invisible) +self:T(self.lid..string.format("Setting current INVISIBLE=%s",tostring(self.option.Invisible))) +end +else +self:E(self.lid.."WARNING: Cannot switch Invisible! Group is not alive") +end +return self +end +function OPSGROUP:SetDefaultImmortal(OnOffSwitch) +if OnOffSwitch==nil then +self.optionDefault.Immortal=true +else +self.optionDefault.Immortal=OnOffSwitch +end +return self +end +function OPSGROUP:SwitchImmortal(OnOffSwitch) +if self:IsAlive()or self:IsInUtero()then +if OnOffSwitch==nil then +self.option.Immortal=self.optionDefault.Immortal +else +self.option.Immortal=OnOffSwitch +end +if self:IsInUtero()then +self:T2(self.lid..string.format("Setting current IMMORTAL=%s when GROUP is SPAWNED",tostring(self.option.Immortal))) +else +self.group:SetCommandImmortal(self.option.Immortal) +self:T(self.lid..string.format("Setting current IMMORTAL=%s",tostring(self.option.Immortal))) +end +else +self:E(self.lid.."WARNING: Cannot switch Immortal! Group is not alive") +end +return self +end +function OPSGROUP:SetDefaultTACAN(Channel,Morse,UnitName,Band,OffSwitch) +self.tacanDefault={} +self.tacanDefault.Channel=Channel or 74 +self.tacanDefault.Morse=Morse or"XXX" +self.tacanDefault.BeaconName=UnitName +if self:IsFlightgroup()then +Band=Band or"Y" +else +Band=Band or"X" +end +self.tacanDefault.Band=Band +if OffSwitch then +self.tacanDefault.On=false +else +self.tacanDefault.On=true +end +return self +end +function OPSGROUP:_SwitchTACAN(Tacan) +if Tacan then +self:SwitchTACAN(Tacan.Channel,Tacan.Morse,Tacan.BeaconName,Tacan.Band) +else +if self.tacanDefault.On then +self:SwitchTACAN() +else +self:TurnOffTACAN() +end +end +end +function OPSGROUP:SwitchTACAN(Channel,Morse,UnitName,Band) +if self:IsInUtero()then +self:T(self.lid..string.format("Switching TACAN to DEFAULT when group is spawned")) +self:SetDefaultTACAN(Channel,Morse,UnitName,Band) +elseif self:IsAlive()then +Channel=Channel or self.tacanDefault.Channel +Morse=Morse or self.tacanDefault.Morse +Band=Band or self.tacanDefault.Band +UnitName=UnitName or self.tacanDefault.BeaconName +local unit=self:GetUnit(1) +if UnitName then +if type(UnitName)=="number"then +unit=self.group:GetUnit(UnitName) +else +unit=UNIT:FindByName(UnitName) +end +end +if not unit then +self:T(self.lid.."WARNING: Could not get TACAN unit. Trying first unit in the group") +unit=self:GetUnit(1) +end +if unit and unit:IsAlive()then +local UnitID=unit:GetID() +local Type=BEACON.Type.TACAN +local System=BEACON.System.TACAN +if self:IsFlightgroup()then +System=BEACON.System.TACAN_TANKER_Y +end +local Frequency=UTILS.TACANToFrequency(Channel,Band) +unit:CommandActivateBeacon(Type,System,Frequency,UnitID,Channel,Band,true,Morse,true) +self.tacan.Channel=Channel +self.tacan.Morse=Morse +self.tacan.Band=Band +self.tacan.BeaconName=unit:GetName() +self.tacan.BeaconUnit=unit +self.tacan.On=true +self:T(self.lid..string.format("Switching TACAN to Channel %d%s Morse %s on unit %s",self.tacan.Channel,self.tacan.Band,tostring(self.tacan.Morse),self.tacan.BeaconName)) +else +self:T(self.lid.."ERROR: Cound not set TACAN! Unit is not alive") +end +else +self:T(self.lid.."ERROR: Cound not set TACAN! Group is not alive and not in utero any more") +end +return self +end +function OPSGROUP:TurnOffTACAN() +if self.tacan.BeaconUnit and self.tacan.BeaconUnit:IsAlive()then +self.tacan.BeaconUnit:CommandDeactivateBeacon() +end +self:T(self.lid..string.format("Switching TACAN OFF")) +self.tacan.On=false +end +function OPSGROUP:GetTACAN() +return self.tacan.Channel,self.tacan.Morse,self.tacan.Band,self.tacan.On,self.tacan.BeaconName +end +function OPSGROUP:GetBeaconTACAN() +return self.tacan +end +function OPSGROUP:SetDefaultICLS(Channel,Morse,UnitName,OffSwitch) +self.iclsDefault={} +self.iclsDefault.Channel=Channel or 1 +self.iclsDefault.Morse=Morse or"XXX" +self.iclsDefault.BeaconName=UnitName +if OffSwitch then +self.iclsDefault.On=false +else +self.iclsDefault.On=true +end +return self +end +function OPSGROUP:_SwitchICLS(Icls) +if Icls then +self:SwitchICLS(Icls.Channel,Icls.Morse,Icls.BeaconName) +else +if self.iclsDefault.On then +self:SwitchICLS() +else +self:TurnOffICLS() +end +end +end +function OPSGROUP:SwitchICLS(Channel,Morse,UnitName) +if self:IsInUtero()then +self:SetDefaultICLS(Channel,Morse,UnitName) +self:T2(self.lid..string.format("Switching ICLS to Channel %d Morse %s on unit %s when GROUP is SPAWNED",self.iclsDefault.Channel,tostring(self.iclsDefault.Morse),tostring(self.iclsDefault.BeaconName))) +elseif self:IsAlive()then +Channel=Channel or self.iclsDefault.Channel +Morse=Morse or self.iclsDefault.Morse +local unit=self:GetUnit(1) +if UnitName then +if type(UnitName)=="number"then +unit=self:GetUnit(UnitName) +else +unit=UNIT:FindByName(UnitName) +end +end +if not unit then +self:T(self.lid.."WARNING: Could not get ICLS unit. Trying first unit in the group") +unit=self:GetUnit(1) +end +if unit and unit:IsAlive()then +local UnitID=unit:GetID() +unit:CommandActivateICLS(Channel,UnitID,Morse) +self.icls.Channel=Channel +self.icls.Morse=Morse +self.icls.Band=nil +self.icls.BeaconName=unit:GetName() +self.icls.BeaconUnit=unit +self.icls.On=true +self:T(self.lid..string.format("Switching ICLS to Channel %d Morse %s on unit %s",self.icls.Channel,tostring(self.icls.Morse),self.icls.BeaconName)) +else +self:T(self.lid.."ERROR: Cound not set ICLS! Unit is not alive.") +end +end +return self +end +function OPSGROUP:TurnOffICLS() +if self.icls.BeaconUnit and self.icls.BeaconUnit:IsAlive()then +self.icls.BeaconUnit:CommandDeactivateICLS() +end +self:T(self.lid..string.format("Switching ICLS OFF")) +self.icls.On=false +end +function OPSGROUP:SetDefaultRadio(Frequency,Modulation,OffSwitch) +self.radioDefault={} +self.radioDefault.Freq=Frequency or 251 +self.radioDefault.Modu=Modulation or radio.modulation.AM +if OffSwitch then +self.radioDefault.On=false +else +self.radioDefault.On=true +end +return self +end +function OPSGROUP:GetRadio() +return self.radio.Freq,self.radio.Modu,self.radio.On +end +function OPSGROUP:SwitchRadio(Frequency,Modulation) +if self:IsInUtero()then +self:SetDefaultRadio(Frequency,Modulation) +self:T2(self.lid..string.format("Switching radio to frequency %.3f MHz %s when GROUP is SPAWNED",self.radioDefault.Freq,UTILS.GetModulationName(self.radioDefault.Modu))) +elseif self:IsAlive()then +Frequency=Frequency or self.radioDefault.Freq +Modulation=Modulation or self.radioDefault.Modu +if self:IsFlightgroup()and not self.radio.On then +self.group:SetOption(AI.Option.Air.id.SILENCE,false) +end +self.group:CommandSetFrequency(Frequency,Modulation) +self.radio.Freq=Frequency +self.radio.Modu=Modulation +self.radio.On=true +self:T(self.lid..string.format("Switching radio to frequency %.3f MHz %s",self.radio.Freq,UTILS.GetModulationName(self.radio.Modu))) +else +self:T(self.lid.."ERROR: Cound not set Radio! Group is not alive or not in utero any more") +end +return self +end +function OPSGROUP:TurnOffRadio() +if self:IsAlive()then +if self:IsFlightgroup()then +self.group:SetOption(AI.Option.Air.id.SILENCE,true) +self.radio.On=false +self:T(self.lid..string.format("Switching radio OFF")) +else +self:T(self.lid.."ERROR: Radio can only be turned off for aircraft!") +end +end +return self +end +function OPSGROUP:SetDefaultFormation(Formation) +self.optionDefault.Formation=Formation +return self +end +function OPSGROUP:SwitchFormation(Formation) +if self:IsAlive()then +Formation=Formation or self.optionDefault.Formation +if self:IsFlightgroup()then +self.group:SetOption(AI.Option.Air.id.FORMATION,Formation) +elseif self.isArmygroup then +else +self:T(self.lid.."ERROR: Formation can only be set for aircraft or ground units!") +return self +end +self.option.Formation=Formation +self:T(self.lid..string.format("Switching formation to %s",tostring(self.option.Formation))) +end +return self +end +function OPSGROUP:SetDefaultCallsign(CallsignName,CallsignNumber) +self:T(self.lid..string.format("Setting Default callsing %s-%s",tostring(CallsignName),tostring(CallsignNumber))) +self.callsignDefault={} +self.callsignDefault.NumberSquad=CallsignName +self.callsignDefault.NumberGroup=CallsignNumber or 1 +self.callsignDefault.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad) +return self +end +function OPSGROUP:SwitchCallsign(CallsignName,CallsignNumber) +if self:IsInUtero()then +self:SetDefaultCallsign(CallsignName,CallsignNumber) +elseif self:IsAlive()then +CallsignName=CallsignName or self.callsignDefault.NumberSquad +CallsignNumber=CallsignNumber or self.callsignDefault.NumberGroup +self.callsign.NumberSquad=CallsignName +self.callsign.NumberGroup=CallsignNumber +self:T(self.lid..string.format("Switching callsign to %d-%d",self.callsign.NumberSquad,self.callsign.NumberGroup)) +self.group:CommandSetCallsign(self.callsign.NumberSquad,self.callsign.NumberGroup) +self.callsignName=UTILS.GetCallsignName(self.callsign.NumberSquad).."-"..self.callsign.NumberGroup +self.callsign.NameSquad=UTILS.GetCallsignName(self.callsign.NumberSquad) +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +element.callsign=element.unit:GetCallsign() +end +end +else +self:T(self.lid.."ERROR: Group is not alive and not in utero! Cannot switch callsign") +end +return self +end +function OPSGROUP:GetCallsignName(ShortCallsign,Keepnumber,CallsignTranslations) +local element=self:GetElementAlive() +if element then +self:T2(self.lid..string.format("Callsign %s",tostring(element.callsign))) +local name=element.callsign or"Ghostrider11" +name=name:gsub("-","") +if self.group:IsPlayer()or CallsignTranslations then +name=self.group:GetCustomCallSign(ShortCallsign,Keepnumber,CallsignTranslations) +end +return name +end +return"Ghostrider11" +end +function OPSGROUP:_UpdatePosition() +if self:IsExist()then +self.positionLast=self.position or self:GetVec3() +self.headingLast=self.heading or self:GetHeading() +self.orientXLast=self.orientX or self:GetOrientationX() +self.velocityLast=self.velocity or self.group:GetVelocityMPS() +self.position=self:GetVec3() +self.heading=self:GetHeading() +self.orientX=self:GetOrientationX() +self.velocity=self:GetVelocity() +for _,_element in pairs(self.elements)do +local element=_element +element.vec3=self:GetVec3(element.name) +end +local Tnow=timer.getTime() +self.dTpositionUpdate=self.TpositionUpdate and Tnow-self.TpositionUpdate or 0 +self.TpositionUpdate=Tnow +if not self.traveldist then +self.traveldist=0 +end +self.travelds=UTILS.VecNorm(UTILS.VecSubstract(self.position,self.positionLast)) +self.traveldist=self.traveldist+self.travelds +end +return self +end +function OPSGROUP:_AllSameStatus(status) +for _,_element in pairs(self.elements)do +local element=_element +if element.status==OPSGROUP.ElementStatus.DEAD then +elseif element.status~=status then +return false +end +end +return true +end +function OPSGROUP:_AllSimilarStatus(status) +if status==OPSGROUP.ElementStatus.DEAD then +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +return false +end +end +return true +end +for _,_element in pairs(self.elements)do +local element=_element +self:T2(self.lid..string.format("Status=%s, element %s status=%s",status,element.name,element.status)) +if element.status~=OPSGROUP.ElementStatus.DEAD then +if status==OPSGROUP.ElementStatus.INUTERO then +if element.status~=status then +return false +end +elseif status==OPSGROUP.ElementStatus.SPAWNED then +if element.status~=status and +element.status==OPSGROUP.ElementStatus.INUTERO then +return false +end +elseif status==OPSGROUP.ElementStatus.PARKING then +if element.status~=status or +(element.status==OPSGROUP.ElementStatus.INUTERO or +element.status==OPSGROUP.ElementStatus.SPAWNED)then +return false +end +elseif status==OPSGROUP.ElementStatus.ENGINEON then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.INUTERO or +element.status==OPSGROUP.ElementStatus.SPAWNED or +element.status==OPSGROUP.ElementStatus.PARKING)then +return false +end +elseif status==OPSGROUP.ElementStatus.TAXIING then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.INUTERO or +element.status==OPSGROUP.ElementStatus.SPAWNED or +element.status==OPSGROUP.ElementStatus.PARKING or +element.status==OPSGROUP.ElementStatus.ENGINEON)then +return false +end +elseif status==OPSGROUP.ElementStatus.TAKEOFF then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.INUTERO or +element.status==OPSGROUP.ElementStatus.SPAWNED or +element.status==OPSGROUP.ElementStatus.PARKING or +element.status==OPSGROUP.ElementStatus.ENGINEON or +element.status==OPSGROUP.ElementStatus.TAXIING)then +return false +end +elseif status==OPSGROUP.ElementStatus.AIRBORNE then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.INUTERO or +element.status==OPSGROUP.ElementStatus.SPAWNED or +element.status==OPSGROUP.ElementStatus.PARKING or +element.status==OPSGROUP.ElementStatus.ENGINEON or +element.status==OPSGROUP.ElementStatus.TAXIING or +element.status==OPSGROUP.ElementStatus.TAKEOFF)then +return false +end +elseif status==OPSGROUP.ElementStatus.LANDED then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.AIRBORNE or +element.status==OPSGROUP.ElementStatus.LANDING)then +return false +end +elseif status==OPSGROUP.ElementStatus.ARRIVED then +if element.status~=status and +(element.status==OPSGROUP.ElementStatus.AIRBORNE or +element.status==OPSGROUP.ElementStatus.LANDING or +element.status==OPSGROUP.ElementStatus.LANDED)then +return false +end +end +else +end +end +self:T2(self.lid..string.format("All %d elements have similar status %s ==> returning TRUE",#self.elements,status)) +return true +end +function OPSGROUP:_UpdateStatus(element,newstatus,airbase) +local oldstatus=element.status +element.status=newstatus +self:T3(self.lid..string.format("UpdateStatus element=%s: %s --> %s",element.name,oldstatus,newstatus)) +for _,_element in pairs(self.elements)do +local Element=_element +self:T3(self.lid..string.format("Element %s: %s",Element.name,Element.status)) +end +if newstatus==OPSGROUP.ElementStatus.INUTERO then +if self:_AllSimilarStatus(newstatus)then +self:InUtero() +end +elseif newstatus==OPSGROUP.ElementStatus.SPAWNED then +if self:_AllSimilarStatus(newstatus)then +self:Spawned() +end +elseif newstatus==OPSGROUP.ElementStatus.PARKING then +if self:_AllSimilarStatus(newstatus)then +self:Parking() +end +elseif newstatus==OPSGROUP.ElementStatus.ENGINEON then +elseif newstatus==OPSGROUP.ElementStatus.TAXIING then +if self:_AllSimilarStatus(newstatus)then +self:Taxiing() +end +elseif newstatus==OPSGROUP.ElementStatus.TAKEOFF then +if self:_AllSimilarStatus(newstatus)then +self:Takeoff(airbase) +end +elseif newstatus==OPSGROUP.ElementStatus.AIRBORNE then +if self:_AllSimilarStatus(newstatus)then +self:Airborne() +end +elseif newstatus==OPSGROUP.ElementStatus.LANDED then +if self:_AllSimilarStatus(newstatus)then +if self:IsLandingAt()then +self:LandedAt() +else +self:Landed(airbase) +end +end +elseif newstatus==OPSGROUP.ElementStatus.ARRIVED then +if self:_AllSimilarStatus(newstatus)then +if self:IsLanded()then +self:Arrived() +elseif self:IsAirborne()then +self:Landed() +self:Arrived() +end +end +elseif newstatus==OPSGROUP.ElementStatus.DEAD then +if self:_AllSimilarStatus(newstatus)then +self:Dead() +end +end +end +function OPSGROUP:_SetElementStatusAll(status) +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +element.status=status +end +end +end +function OPSGROUP:GetElementByName(unitname) +if unitname and type(unitname)=="string"then +for _,_element in pairs(self.elements)do +local element=_element +if element.name==unitname then +return element +end +end +end +return nil +end +function OPSGROUP:GetElementZoneBoundingBox(UnitName) +local element=self:GetElementByName(UnitName) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +element.zoneBoundingbox=element.zoneBoundingbox or ZONE_POLYGON_BASE:New(element.name.." Zone Bounding Box",{}) +local l=element.length +local w=element.width +local X=self:GetOrientationX(element.name) +local heading=math.deg(math.atan2(X.z,X.x)) +self:T(self.lid..string.format("Element %s bouding box: l=%d w=%d heading=%d",element.name,l,w,heading)) +local b={} +b[1]={x=l/2,y=-w/2} +b[2]={x=l/2,y=w/2} +b[3]={x=-l/2,y=w/2} +b[4]={x=-l/2,y=-w/2} +for i,p in pairs(b)do +b[i]=UTILS.Vec2Rotate2D(p,heading) +end +local vec2=self:GetVec2(element.name) +local d=UTILS.Vec2Norm(vec2) +local h=UTILS.Vec2Hdg(vec2) +for i,p in pairs(b)do +b[i]=UTILS.Vec2Translate(p,d,h) +end +element.zoneBoundingbox:UpdateFromVec2(b) +return element.zoneBoundingbox +end +return nil +end +function OPSGROUP:GetElementZoneLoad(UnitName) +local element=self:GetElementByName(UnitName) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +element.zoneLoad=element.zoneLoad or ZONE_POLYGON_BASE:New(element.name.." Zone Load",{}) +self:_GetElementZoneLoader(element,element.zoneLoad,self.carrierLoader) +return element.zoneLoad +end +return nil +end +function OPSGROUP:GetElementZoneUnload(UnitName) +local element=self:GetElementByName(UnitName) +if element and element.status~=OPSGROUP.ElementStatus.DEAD then +element.zoneUnload=element.zoneUnload or ZONE_POLYGON_BASE:New(element.name.." Zone Unload",{}) +self:_GetElementZoneLoader(element,element.zoneUnload,self.carrierUnloader) +return element.zoneUnload +end +return nil +end +function OPSGROUP:_GetElementZoneLoader(Element,Zone,Loader) +if Element.status~=OPSGROUP.ElementStatus.DEAD then +local l=Element.length +local w=Element.width +local X=self:GetOrientationX(Element.name) +local heading=math.deg(math.atan2(X.z,X.x)) +local b={} +if Loader.type:lower()=="front"then +table.insert(b,{x=l/2,y=-Loader.width/2}) +table.insert(b,{x=l/2+Loader.length,y=-Loader.width/2}) +table.insert(b,{x=l/2+Loader.length,y=Loader.width/2}) +table.insert(b,{x=l/2,y=Loader.width/2}) +elseif Loader.type:lower()=="back"then +table.insert(b,{x=-l/2,y=-Loader.width/2}) +table.insert(b,{x=-l/2-Loader.length,y=-Loader.width/2}) +table.insert(b,{x=-l/2-Loader.length,y=Loader.width/2}) +table.insert(b,{x=-l/2,y=Loader.width/2}) +elseif Loader.type:lower()=="left"then +table.insert(b,{x=Loader.length/2,y=-w/2}) +table.insert(b,{x=Loader.length/2,y=-w/2-Loader.width}) +table.insert(b,{x=-Loader.length/2,y=-w/2-Loader.width}) +table.insert(b,{x=-Loader.length/2,y=-w/2}) +elseif Loader.type:lower()=="right"then +table.insert(b,{x=Loader.length/2,y=w/2}) +table.insert(b,{x=Loader.length/2,y=w/2+Loader.width}) +table.insert(b,{x=-Loader.length/2,y=w/2+Loader.width}) +table.insert(b,{x=-Loader.length/2,y=w/2}) +else +b[1]={x=l/2,y=-w/2} +b[2]={x=l/2,y=w/2} +b[3]={x=-l/2,y=w/2} +b[4]={x=-l/2,y=-w/2} +table.insert(b,{x=b[1].x+Loader.length,y=b[1].y-Loader.width}) +table.insert(b,{x=b[2].x+Loader.length,y=b[2].y+Loader.width}) +table.insert(b,{x=b[3].x-Loader.length,y=b[3].y+Loader.width}) +table.insert(b,{x=b[4].x-Loader.length,y=b[4].y-Loader.width}) +end +for i,p in pairs(b)do +b[i]=UTILS.Vec2Rotate2D(p,heading) +end +local vec2=self:GetVec2(Element.name) +local d=UTILS.Vec2Norm(vec2) +local h=UTILS.Vec2Hdg(vec2) +for i,p in pairs(b)do +b[i]=UTILS.Vec2Translate(p,d,h) +end +Zone:UpdateFromVec2(b) +return Zone +end +return nil +end +function OPSGROUP:GetElementAlive() +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +if element.unit and element.unit:IsAlive()then +return element +end +end +end +return nil +end +function OPSGROUP:GetNelements(status) +local n=0 +for _,_element in pairs(self.elements)do +local element=_element +if element.status~=OPSGROUP.ElementStatus.DEAD then +if element.unit and element.unit:IsAlive()then +if status==nil or element.status==status then +n=n+1 +end +end +end +end +return n +end +function OPSGROUP:GetAmmoElement(element) +return self:GetAmmoUnit(element.unit) +end +function OPSGROUP:GetAmmoTot() +local units=self.group:GetUnits() +local Ammo={} +Ammo.Total=0 +Ammo.Guns=0 +Ammo.Rockets=0 +Ammo.Bombs=0 +Ammo.Torpedos=0 +Ammo.Missiles=0 +Ammo.MissilesAA=0 +Ammo.MissilesAG=0 +Ammo.MissilesAS=0 +Ammo.MissilesCR=0 +Ammo.MissilesSA=0 +for _,_unit in pairs(units or{})do +local unit=_unit +if unit and unit:IsExist()then +local ammo=self:GetAmmoUnit(unit) +Ammo.Total=Ammo.Total+ammo.Total +Ammo.Guns=Ammo.Guns+ammo.Guns +Ammo.Rockets=Ammo.Rockets+ammo.Rockets +Ammo.Bombs=Ammo.Bombs+ammo.Bombs +Ammo.Torpedos=Ammo.Torpedos+ammo.Torpedos +Ammo.Missiles=Ammo.Missiles+ammo.Missiles +Ammo.MissilesAA=Ammo.MissilesAA+ammo.MissilesAA +Ammo.MissilesAG=Ammo.MissilesAG+ammo.MissilesAG +Ammo.MissilesAS=Ammo.MissilesAS+ammo.MissilesAS +Ammo.MissilesCR=Ammo.MissilesCR+ammo.MissilesCR +Ammo.MissilesSA=Ammo.MissilesSA+ammo.MissilesSA +end +end +return Ammo +end +function OPSGROUP:GetAmmoUnit(unit,display) +if display==nil then +display=false +end +local nammo=0 +local nshells=0 +local nrockets=0 +local nmissiles=0 +local nmissilesAA=0 +local nmissilesAG=0 +local nmissilesAS=0 +local nmissilesSA=0 +local nmissilesBM=0 +local nmissilesCR=0 +local ntorps=0 +local nbombs=0 +unit=unit or self.group:GetUnit(1) +if unit and unit:IsExist()then +local text=string.format("OPSGROUP group %s - unit %s:\n",self.groupname,unit:GetName()) +local ammotable=unit:GetAmmo() +if ammotable then +local weapons=#ammotable +for w=1,weapons do +local Nammo=ammotable[w]["count"] +local rmin=ammotable[w]["desc"]["rangeMin"]or 0 +local rmax=ammotable[w]["desc"]["rangeMaxAltMin"]or 0 +local Tammo=ammotable[w]["desc"]["typeName"] +local _weaponString=UTILS.Split(Tammo,"%.") +local _weaponName=_weaponString[#_weaponString] +local Category=ammotable[w].desc.category +local MissileCategory=nil +if Category==Weapon.Category.MISSILE then +MissileCategory=ammotable[w].desc.missileCategory +end +if Category==Weapon.Category.SHELL then +nshells=nshells+Nammo +text=text..string.format("- %d shells of type %s, range=%d - %d meters\n",Nammo,_weaponName,rmin,rmax) +elseif Category==Weapon.Category.ROCKET then +nrockets=nrockets+Nammo +text=text..string.format("- %d rockets of type %s, \n",Nammo,_weaponName,rmin,rmax) +elseif Category==Weapon.Category.BOMB then +nbombs=nbombs+Nammo +text=text..string.format("- %d bombs of type %s\n",Nammo,_weaponName) +elseif Category==Weapon.Category.MISSILE then +if MissileCategory==Weapon.MissileCategory.AAM then +nmissiles=nmissiles+Nammo +nmissilesAA=nmissilesAA+Nammo +elseif MissileCategory==Weapon.MissileCategory.SAM then +nmissiles=nmissiles+Nammo +nmissilesSA=nmissilesSA+Nammo +elseif MissileCategory==Weapon.MissileCategory.ANTI_SHIP then +nmissiles=nmissiles+Nammo +nmissilesAS=nmissilesAS+Nammo +elseif MissileCategory==Weapon.MissileCategory.BM then +nmissiles=nmissiles+Nammo +nmissilesBM=nmissilesBM+Nammo +elseif MissileCategory==Weapon.MissileCategory.CRUISE then +nmissiles=nmissiles+Nammo +nmissilesCR=nmissilesCR+Nammo +elseif MissileCategory==Weapon.MissileCategory.OTHER then +nmissiles=nmissiles+Nammo +nmissilesAG=nmissilesAG+Nammo +end +text=text..string.format("- %d %s missiles of type %s, range=%d - %d meters\n",Nammo,self:_MissileCategoryName(MissileCategory),_weaponName,rmin,rmax) +elseif Category==Weapon.Category.TORPEDO then +ntorps=ntorps+Nammo +text=text..string.format("- %d torpedos of type %s\n",Nammo,_weaponName) +else +text=text..string.format("- %d unknown ammo of type %s (category=%d, missile category=%s)\n",Nammo,Tammo,Category,tostring(MissileCategory)) +end +end +end +if display then +self:I(self.lid..text) +else +self:T3(self.lid..text) +end +end +nammo=nshells+nrockets+nmissiles+nbombs+ntorps +local ammo={} +ammo.Total=nammo +ammo.Guns=nshells +ammo.Rockets=nrockets +ammo.Bombs=nbombs +ammo.Torpedos=ntorps +ammo.Missiles=nmissiles +ammo.MissilesAA=nmissilesAA +ammo.MissilesAG=nmissilesAG +ammo.MissilesAS=nmissilesAS +ammo.MissilesCR=nmissilesCR +ammo.MissilesBM=nmissilesBM +ammo.MissilesSA=nmissilesSA +return ammo +end +function OPSGROUP:_MissileCategoryName(categorynumber) +local cat="unknown" +if categorynumber==Weapon.MissileCategory.AAM then +cat="air-to-air" +elseif categorynumber==Weapon.MissileCategory.SAM then +cat="surface-to-air" +elseif categorynumber==Weapon.MissileCategory.BM then +cat="ballistic" +elseif categorynumber==Weapon.MissileCategory.ANTI_SHIP then +cat="anti-ship" +elseif categorynumber==Weapon.MissileCategory.CRUISE then +cat="cruise" +elseif categorynumber==Weapon.MissileCategory.OTHER then +cat="other" +end +return cat +end +function OPSGROUP:_PassedFinalWaypoint(final,comment) +self:T(self.lid..string.format("Passed final waypoint=%s [from %s]: comment \"%s\"",tostring(final),tostring(self.passedfinalwp),tostring(comment))) +if final==true and not self.passedfinalwp then +self:PassedFinalWaypoint() +end +self.passedfinalwp=final +end +function OPSGROUP:_CoordinateFromObject(Object) +if Object then +if Object:IsInstanceOf("COORDINATE")then +return Object +else +if Object:IsInstanceOf("POSITIONABLE")or Object:IsInstanceOf("ZONE_BASE")then +self:T(self.lid.."WARNING: Coordinate is not a COORDINATE but a POSITIONABLE or ZONE. Trying to get coordinate") +local coord=Object:GetCoordinate() +return coord +else +self:T(self.lid.."ERROR: Coordinate is neither a COORDINATE nor any POSITIONABLE or ZONE!") +end +end +else +self:T(self.lid.."ERROR: Object passed is nil!") +end +return nil +end +function OPSGROUP:_IsElement(unitname) +for _,_element in pairs(self.elements)do +local element=_element +if element.name==unitname then +return true +end +end +return false +end +function OPSGROUP:CountElements(States) +if States then +if type(States)=="string"then +States={States} +end +else +States=OPSGROUP.ElementStatus +end +local IncludeDeads=true +local N=0 +for _,_element in pairs(self.elements)do +local element=_element +if element and(IncludeDeads or element.status~=OPSGROUP.ElementStatus.DEAD)then +for _,state in pairs(States)do +if element.status==state then +N=N+1 +break +end +end +end +end +return N +end +function OPSGROUP:_AddElementByName(unitname) +local unit=UNIT:FindByName(unitname) +if unit then +local element=self:GetElementByName(unitname) +if element then +else +element={} +element.status=OPSGROUP.ElementStatus.INUTERO +table.insert(self.elements,element) +end +element.name=unitname +element.unit=unit +element.DCSunit=Unit.getByName(unitname) +element.gid=element.DCSunit:getNumber() +element.uid=element.DCSunit:getID() +element.controller=element.DCSunit:getController() +element.Nhit=0 +element.opsgroup=self +local unittemplate=unit:GetTemplate() +if unittemplate==nil then +if element.DCSunit:getPlayerName()then +element.skill="Client" +end +else +element.skill=unittemplate~=nil and unittemplate.skill or"Unknown" +end +if element.skill=="Client"or element.skill=="Player"then +element.ai=false +element.client=CLIENT:FindByName(unitname) +element.playerName=element.DCSunit:getPlayerName() +else +element.ai=true +end +element.descriptors=unit:GetDesc() +element.category=unit:GetUnitCategory() +element.categoryname=unit:GetCategoryName() +element.typename=unit:GetTypeName() +element.ammo0=self:GetAmmoUnit(unit,false) +element.life=unit:GetLife() +element.life0=math.max(unit:GetLife0(),element.life) +element.size,element.length,element.height,element.width=unit:GetObjectSize() +element.weightEmpty=element.descriptors.massEmpty or 666 +if self.isArmygroup then +element.weightMaxTotal=element.weightEmpty+10*95 +elseif self.isNavygroup then +element.weightMaxTotal=element.weightEmpty+10*1000 +else +element.weightMaxTotal=element.descriptors.massMax or element.weightEmpty+8*95 +end +unit:SetCargoBayWeightLimit() +element.weightMaxCargo=unit.__.CargoBayWeightLimit +if element.cargoBay then +element.weightCargo=self:GetWeightCargo(element.name,false) +else +element.cargoBay={} +element.weightCargo=0 +end +element.weight=element.weightEmpty+element.weightCargo +element.callsign=element.unit:GetCallsign() +element.fuelmass=element.fuelmass0 or 99999 +element.fuelrel=element.unit:GetFuel()or 1 +if self.isFlightgroup and unittemplate then +element.modex=unittemplate.onboard_num +element.payload=unittemplate.payload +element.pylons=unittemplate.payload and unittemplate.payload.pylons or nil +element.fuelmass0=unittemplate.payload and unittemplate.payload.fuel or 0 +else +element.callsign="Peter-1-1" +element.modex="000" +element.payload={} +element.pylons={} +end +local text=string.format("Adding element %s: status=%s, skill=%s, life=%.1f/%.1f category=%s (%d), type=%s, size=%.1f (L=%.1f H=%.1f W=%.1f), weight=%.1f/%.1f (cargo=%.1f/%.1f)", +element.name,element.status,element.skill,element.life,element.life0,element.categoryname,element.category,element.typename, +element.size,element.length,element.height,element.width,element.weight,element.weightMaxTotal,element.weightCargo,element.weightMaxCargo) +self:T(self.lid..text) +if unit:IsAlive()and element.status~=OPSGROUP.ElementStatus.SPAWNED then +self:__ElementSpawned(0.05,element) +end +return element +end +return nil +end +function OPSGROUP:_SetTemplate(Template) +self.template=Template or UTILS.DeepCopy(_DATABASE:GetGroupTemplate(self.groupname)) +self:T3(self.lid.."Setting group template") +return self +end +function OPSGROUP:_GetTemplate(Copy) +if self.template then +if Copy then +local template=UTILS.DeepCopy(self.template) +return template +else +return self.template +end +else +self:T(self.lid..string.format("ERROR: No template was set yet!")) +end +return nil +end +function OPSGROUP:ClearWaypoints(IndexMin,IndexMax) +IndexMin=IndexMin or 1 +IndexMax=IndexMax or#self.waypoints +for i=IndexMax,IndexMin,-1 do +table.remove(self.waypoints,i) +end +end +function OPSGROUP:_GetDetectedTarget() +local targetgroup=nil +local targetdist=math.huge +for _,_group in pairs(self.detectedgroups:GetSet())do +local group=_group +if group and group:IsAlive()then +local targetVec3=group:GetVec3() +local distance=UTILS.VecDist3D(self.position,targetVec3) +if distance<=self.engagedetectedRmax and distance<targetdist then +local righttype=false +for _,attribute in pairs(self.engagedetectedTypes)do +local gotit=group:HasAttribute(attribute,false) +self:T(self.lid..string.format("Group %s has attribute %s = %s",group:GetName(),attribute,tostring(gotit))) +if gotit then +righttype=true +break +end +end +if righttype then +local insideEngage=true +local insideNoEngage=false +if self.engagedetectedEngageZones then +insideEngage=false +for _,_zone in pairs(self.engagedetectedEngageZones.Set)do +local zone=_zone +local inzone=zone:IsVec3InZone(targetVec3) +if inzone then +insideEngage=true +break +end +end +end +if self.engagedetectedNoEngageZones then +for _,_zone in pairs(self.engagedetectedNoEngageZones.Set)do +local zone=_zone +local inzone=zone:IsVec3InZone(targetVec3) +if inzone then +insideNoEngage=true +break +end +end +end +if insideEngage and not insideNoEngage then +targetdist=distance +targetgroup=group +end +end +end +end +end +return targetgroup,targetdist +end +function OPSGROUP:SetValidateAndRepositionGroundUnits(Enabled) +self.ValidateAndRepositionGroundUnits=Enabled +end +OPSTRANSPORT={ +ClassName="OPSTRANSPORT", +verbose=0, +carriers={}, +carrierTransportStatus={}, +tzCombos={}, +tzcCounter=0, +conditionStart={}, +assets={}, +legions={}, +statusLegion={}, +requestID={}, +cargocounter=0, +} +OPSTRANSPORT.Status={ +PLANNED="planned", +QUEUED="queued", +REQUESTED="requested", +SCHEDULED="scheduled", +EXECUTING="executing", +DELIVERED="delivered", +CANCELLED="cancelled", +SUCCESS="success", +FAILED="failed", +} +OPSTRANSPORT.CargoType={ +OPSGROUP="OPSGROUP", +STORAGE="STORAGE", +} +_OPSTRANSPORTID=0 +OPSTRANSPORT.version="0.8.0" +function OPSTRANSPORT:New(CargoGroups,PickupZone,DeployZone) +local self=BASE:Inherit(self,FSM:New()) +_OPSTRANSPORTID=_OPSTRANSPORTID+1 +self.lid=string.format("OPSTRANSPORT [UID=%d] | ",_OPSTRANSPORTID) +self.uid=_OPSTRANSPORTID +self:SetPriority() +self:SetTime() +self:SetRequiredCarriers() +self.formationArmy=ENUMS.Formation.Vehicle.OnRoad +self.formationHelo=ENUMS.Formation.RotaryWing.Wedge +self.formationPlane=ENUMS.Formation.FixedWing.Wedge +self.carriers={} +self.Ncargo=0 +self.Ncarrier=0 +self.Ndelivered=0 +self.NcargoDead=0 +self.NcarrierDead=0 +self.tzcDefault=self:AddTransportZoneCombo(CargoGroups,PickupZone,DeployZone) +self:SetStartState(OPSTRANSPORT.Status.PLANNED) +self:AddTransition("*","Planned",OPSTRANSPORT.Status.PLANNED) +self:AddTransition(OPSTRANSPORT.Status.PLANNED,"Queued",OPSTRANSPORT.Status.QUEUED) +self:AddTransition(OPSTRANSPORT.Status.QUEUED,"Requested",OPSTRANSPORT.Status.REQUESTED) +self:AddTransition(OPSTRANSPORT.Status.REQUESTED,"Scheduled",OPSTRANSPORT.Status.SCHEDULED) +self:AddTransition(OPSTRANSPORT.Status.PLANNED,"Scheduled",OPSTRANSPORT.Status.SCHEDULED) +self:AddTransition(OPSTRANSPORT.Status.SCHEDULED,"Executing",OPSTRANSPORT.Status.EXECUTING) +self:AddTransition("*","Delivered",OPSTRANSPORT.Status.DELIVERED) +self:AddTransition("*","StatusUpdate","*") +self:AddTransition("*","Stop","*") +self:AddTransition("*","Cancel",OPSTRANSPORT.Status.CANCELLED) +self:AddTransition("*","Loaded","*") +self:AddTransition("*","Unloaded","*") +self:AddTransition("*","DeadCarrierUnit","*") +self:AddTransition("*","DeadCarrierGroup","*") +self:AddTransition("*","DeadCarrierAll","*") +self:__StatusUpdate(-1) +return self +end +function OPSTRANSPORT:AddTransportZoneCombo(CargoGroups,PickupZone,DeployZone) +self.tzcCounter=self.tzcCounter+1 +local tzcombo={} +tzcombo.uid=self.tzcCounter +tzcombo.Ncarriers=0 +tzcombo.Ncargo=0 +tzcombo.Cargos={} +tzcombo.RequiredCargos={} +tzcombo.DisembarkCarriers={} +tzcombo.PickupPaths={} +tzcombo.TransportPaths={} +self:SetPickupZone(PickupZone,tzcombo) +self:SetDeployZone(DeployZone,tzcombo) +self:SetEmbarkZone(nil,tzcombo) +if CargoGroups then +self:AddCargoGroups(CargoGroups,tzcombo) +end +table.insert(self.tzCombos,tzcombo) +return tzcombo +end +function OPSTRANSPORT:AddCargoGroups(GroupSet,TransportZoneCombo,DisembarkActivation,DisembarkZone,DisembarkCarriers) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +if GroupSet:IsInstanceOf("GROUP")or GroupSet:IsInstanceOf("OPSGROUP")then +local cargo=self:_CreateCargoGroupData(GroupSet,TransportZoneCombo,DisembarkActivation,DisembarkZone,DisembarkCarriers) +if cargo then +self.Ncargo=self.Ncargo+1 +table.insert(TransportZoneCombo.Cargos,cargo) +TransportZoneCombo.Ncargo=TransportZoneCombo.Ncargo+1 +cargo.opsgroup:_AddMyLift(self) +end +else +for _,group in pairs(GroupSet.Set)do +self:AddCargoGroups(group,TransportZoneCombo,DisembarkActivation) +end +local groupset=GroupSet +function groupset.OnAfterAdded(groupset,From,Event,To,ObjectName,Object) +self:T(self.lid..string.format("Adding Cargo Group %s",tostring(ObjectName))) +self:AddCargoGroups(Object,TransportZoneCombo,DisembarkActivation,DisembarkZone,DisembarkCarriers) +end +end +if self.verbose>=1 then +local text=string.format("Added cargo groups:") +local Weight=0 +for _,_cargo in pairs(self:GetCargos())do +local cargo=_cargo +local weight=cargo.opsgroup:GetWeightTotal() +Weight=Weight+weight +text=text..string.format("\n- %s [%s] weight=%.1f kg",cargo.opsgroup:GetName(),cargo.opsgroup:GetState(),weight) +end +text=text..string.format("\nTOTAL: Ncargo=%d, Weight=%.1f kg",self.Ncargo,Weight) +self:I(self.lid..text) +end +return self +end +function OPSTRANSPORT:AddCargoStorage(StorageFrom,StorageTo,CargoType,CargoAmount,CargoWeight,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +local cargo=self:_CreateCargoStorage(StorageFrom,StorageTo,CargoType,CargoAmount,CargoWeight,TransportZoneCombo) +if cargo then +self.Ncargo=self.Ncargo+1 +table.insert(TransportZoneCombo.Cargos,cargo) +end +end +function OPSTRANSPORT:SetPickupZone(PickupZone,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.PickupZone=PickupZone +if PickupZone and PickupZone:IsInstanceOf("ZONE_AIRBASE")then +TransportZoneCombo.PickupAirbase=PickupZone._.ZoneAirbase +end +return self +end +function OPSTRANSPORT:GetPickupZone(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.PickupZone +end +function OPSTRANSPORT:SetDeployZone(DeployZone,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.DeployZone=DeployZone +if DeployZone and DeployZone:IsInstanceOf("ZONE_AIRBASE")then +TransportZoneCombo.DeployAirbase=DeployZone._.ZoneAirbase +end +return self +end +function OPSTRANSPORT:GetDeployZone(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.DeployZone +end +function OPSTRANSPORT:SetEmbarkZone(EmbarkZone,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.EmbarkZone=EmbarkZone or TransportZoneCombo.PickupZone +return self +end +function OPSTRANSPORT:GetEmbarkZone(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.EmbarkZone +end +function OPSTRANSPORT:SetDisembarkZone(DisembarkZone,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.DisembarkZone=DisembarkZone +return self +end +function OPSTRANSPORT:GetDisembarkZone(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.DisembarkZone +end +function OPSTRANSPORT:SetDisembarkActivation(Active,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +if Active==true or Active==nil then +TransportZoneCombo.disembarkActivation=true +else +TransportZoneCombo.disembarkActivation=false +end +return self +end +function OPSTRANSPORT:GetDisembarkActivation(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.disembarkActivation +end +function OPSTRANSPORT:SetDisembarkCarriers(Carriers,TransportZoneCombo) +self:T(self.lid.."Setting transfer carriers!") +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.disembarkToCarriers=true +self:_AddDisembarkCarriers(Carriers,TransportZoneCombo.DisembarkCarriers) +return self +end +function OPSTRANSPORT:_AddDisembarkCarriers(Carriers,Table) +if Carriers:IsInstanceOf("GROUP")or Carriers:IsInstanceOf("OPSGROUP")then +local carrier=self:_GetOpsGroupFromObject(Carriers) +if carrier then +table.insert(Table,carrier) +end +elseif Carriers:IsInstanceOf("SET_GROUP")or Carriers:IsInstanceOf("SET_OPSGROUP")then +for _,object in pairs(Carriers:GetSet())do +local carrier=self:_GetOpsGroupFromObject(object) +if carrier then +table.insert(Table,carrier) +end +end +else +self:E(self.lid.."ERROR: Carriers must be a GROUP, OPSGROUP, SET_GROUP or SET_OPSGROUP object!") +end +end +function OPSTRANSPORT:GetDisembarkCarriers(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.DisembarkCarriers +end +function OPSTRANSPORT:SetDisembarkInUtero(InUtero,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +if InUtero==true or InUtero==nil then +TransportZoneCombo.disembarkInUtero=true +else +TransportZoneCombo.disembarkInUtero=false +end +return self +end +function OPSTRANSPORT:GetDisembarkInUtero(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.disembarkInUtero +end +function OPSTRANSPORT:SetFormationPickup(Formation,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.PickupFormation=Formation +return self +end +function OPSTRANSPORT:_GetFormationDefault(OpsGroup) +if OpsGroup.isArmygroup then +return self.formationArmy +elseif OpsGroup.isFlightgroup then +if OpsGroup.isHelo then +return self.formationHelo +else +return self.formationPlane +end +else +return ENUMS.Formation.Vehicle.OffRoad +end +return nil +end +function OPSTRANSPORT:_GetFormationPickup(TransportZoneCombo,OpsGroup) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +local formation=TransportZoneCombo.PickupFormation or self:_GetFormationDefault(OpsGroup) +return formation +end +function OPSTRANSPORT:SetFormationTransport(Formation,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.TransportFormation=Formation +return self +end +function OPSTRANSPORT:_GetFormationTransport(TransportZoneCombo,OpsGroup) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +local formation=TransportZoneCombo.TransportFormation or self:_GetFormationDefault(OpsGroup) +return formation +end +function OPSTRANSPORT:SetRequiredCargos(Cargos,TransportZoneCombo) +self:T(self.lid.."Setting required cargos!") +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +TransportZoneCombo.RequiredCargos=TransportZoneCombo.RequiredCargos or{} +if Cargos:IsInstanceOf("GROUP")or Cargos:IsInstanceOf("OPSGROUP")then +local cargo=self:_GetOpsGroupFromObject(Cargos) +if cargo then +table.insert(TransportZoneCombo.RequiredCargos,cargo) +end +elseif Cargos:IsInstanceOf("SET_GROUP")or Cargos:IsInstanceOf("SET_OPSGROUP")then +for _,object in pairs(Cargos:GetSet())do +local cargo=self:_GetOpsGroupFromObject(object) +if cargo then +table.insert(TransportZoneCombo.RequiredCargos,cargo) +end +end +else +self:E(self.lid.."ERROR: Required Cargos must be a GROUP, OPSGROUP, SET_GROUP or SET_OPSGROUP object!") +end +return self +end +function OPSTRANSPORT:GetRequiredCargos(TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +return TransportZoneCombo.RequiredCargos +end +function OPSTRANSPORT:SetRequiredCarriers(NcarriersMin,NcarriersMax) +self.nCarriersMin=NcarriersMin or 1 +self.nCarriersMax=NcarriersMax or self.nCarriersMin +if self.nCarriersMax<self.nCarriersMin then +self.nCarriersMax=self.nCarriersMin +end +return self +end +function OPSTRANSPORT:GetRequiredCarriers() +return self.nCarriersMin,self.nCarriersMax +end +function OPSTRANSPORT:_AddCarrier(CarrierGroup) +if not self:IsCarrier(CarrierGroup)then +self.Ncarrier=self.Ncarrier+1 +self:SetCarrierTransportStatus(CarrierGroup,OPSTRANSPORT.Status.SCHEDULED) +self:Scheduled() +table.insert(self.carriers,CarrierGroup) +end +return self +end +function OPSTRANSPORT:_DelCarrier(CarrierGroup,Delay) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,OPSTRANSPORT._DelCarrier,self,CarrierGroup) +else +if self:IsCarrier(CarrierGroup)then +for i=#self.carriers,1,-1 do +local carrier=self.carriers[i] +if carrier.groupname==CarrierGroup.groupname then +self:T(self.lid..string.format("Removing carrier %s",CarrierGroup.groupname)) +table.remove(self.carriers,i) +end +end +end +end +return self +end +function OPSTRANSPORT:_GetCarrierNames() +local names={} +for _,_carrier in pairs(self.carriers)do +local carrier=_carrier +if carrier:IsAlive()~=nil then +table.insert(names,carrier.groupname) +end +end +return names +end +function OPSTRANSPORT:GetCargoOpsGroups(Delivered,Carrier,TransportZoneCombo) +local cargos=self:GetCargos(TransportZoneCombo,Carrier,Delivered) +local opsgroups={} +for _,_cargo in pairs(cargos)do +local cargo=_cargo +if cargo.type=="OPSGROUP"then +if cargo.opsgroup and not(cargo.opsgroup:IsDead()or cargo.opsgroup:IsStopped())then +table.insert(opsgroups,cargo.opsgroup) +end +end +end +return opsgroups +end +function OPSTRANSPORT:GetCargoStorages(Delivered,Carrier,TransportZoneCombo) +local cargos=self:GetCargos(TransportZoneCombo,Carrier,Delivered) +local opsgroups={} +for _,_cargo in pairs(cargos)do +local cargo=_cargo +if cargo.type=="STORAGE"then +table.insert(opsgroups,cargo.storage) +end +end +return opsgroups +end +function OPSTRANSPORT:GetCarriers() +return self.carriers +end +function OPSTRANSPORT:GetCargos(TransportZoneCombo,Carrier,Delivered) +local tczs=self.tzCombos +if TransportZoneCombo then +tczs={TransportZoneCombo} +end +local cargos={} +for _,_tcz in pairs(tczs)do +local tcz=_tcz +for _,_cargo in pairs(tcz.Cargos)do +local cargo=_cargo +if Delivered==nil or cargo.delivered==Delivered then +if Carrier==nil or Carrier:CanCargo(cargo)then +table.insert(cargos,cargo) +end +end +end +end +return cargos +end +function OPSTRANSPORT:GetCargoTotalWeight(Cargo,IncludeReserved) +local weight=0 +if Cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +weight=Cargo.opsgroup:GetWeightTotal(nil,IncludeReserved) +else +if type(Cargo.storage.cargoType)=="number"then +if IncludeReserved then +return Cargo.storage.cargoAmount+Cargo.storage.cargoReserved +else +return Cargo.storage.cargoAmount +end +else +if IncludeReserved then +return Cargo.storage.cargoAmount*100 +else +return(Cargo.storage.cargoAmount+Cargo.storage.cargoReserved)*100 +end +end +end +return weight +end +function OPSTRANSPORT:SetTime(ClockStart,ClockStop) +local Tnow=timer.getAbsTime() +local Tstart=Tnow+5 +if ClockStart and type(ClockStart)=="number"then +Tstart=Tnow+ClockStart +elseif ClockStart and type(ClockStart)=="string"then +Tstart=UTILS.ClockToSeconds(ClockStart) +end +local Tstop=nil +if ClockStop and type(ClockStop)=="number"then +Tstop=Tnow+ClockStop +elseif ClockStop and type(ClockStop)=="string"then +Tstop=UTILS.ClockToSeconds(ClockStop) +end +self.Tstart=Tstart +self.Tstop=Tstop +if Tstop then +self.duration=self.Tstop-self.Tstart +end +return self +end +function OPSTRANSPORT:SetPriority(Prio,Importance,Urgent) +self.prio=Prio or 50 +self.urgent=Urgent +self.importance=Importance +return self +end +function OPSTRANSPORT:SetVerbosity(Verbosity) +self.verbose=Verbosity or 0 +return self +end +function OPSTRANSPORT:AddConditionStart(ConditionFunction,...) +if ConditionFunction then +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionStart,condition) +end +return self +end +function OPSTRANSPORT:AddPathTransport(PathGroup,Reversed,Radius,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +if type(PathGroup)=="string"then +PathGroup=GROUP:FindByName(PathGroup) +end +local path={} +path.category=PathGroup:GetCategory() +path.radius=Radius or 0 +path.waypoints=PathGroup:GetTaskRoute() +table.insert(TransportZoneCombo.TransportPaths,path) +return self +end +function OPSTRANSPORT:_GetPathTransport(Category,TransportZoneCombo) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +local pathsTransport=TransportZoneCombo.TransportPaths +if pathsTransport and#pathsTransport>0 then +local paths={} +for _,_path in pairs(pathsTransport)do +local path=_path +if path.category==Category then +table.insert(paths,path) +end +end +if#paths>0 then +local path=paths[math.random(#paths)] +return path +end +end +return nil +end +function OPSTRANSPORT:SetCarrierTransportStatus(CarrierGroup,Status) +local oldstatus=self:GetCarrierTransportStatus(CarrierGroup) +self:T(self.lid..string.format("New carrier transport status for %s: %s --> %s",CarrierGroup:GetName(),oldstatus,Status)) +self.carrierTransportStatus[CarrierGroup.groupname]=Status +return self +end +function OPSTRANSPORT:GetCarrierTransportStatus(CarrierGroup) +local status=self.carrierTransportStatus[CarrierGroup.groupname]or"unknown" +return status +end +function OPSTRANSPORT:GetUID() +return self.uid +end +function OPSTRANSPORT:GetNcargoDelivered() +return self.Ndelivered +end +function OPSTRANSPORT:GetNcargoTotal() +return self.Ncargo +end +function OPSTRANSPORT:GetNcarrier() +return self.Ncarrier +end +function OPSTRANSPORT:AddAsset(Asset,TransportZoneCombo) +self:T(self.lid..string.format("Adding asset carrier \"%s\" to transport",tostring(Asset.spawngroupname))) +self.assets=self.assets or{} +table.insert(self.assets,Asset) +return self +end +function OPSTRANSPORT:DelAsset(Asset) +for i,_asset in pairs(self.assets or{})do +local asset=_asset +if asset.uid==Asset.uid then +self:T(self.lid..string.format("Removing asset \"%s\" from transport",tostring(Asset.spawngroupname))) +table.remove(self.assets,i) +return self +end +end +return self +end +function OPSTRANSPORT:AddAssetCargo(Asset,TransportZoneCombo) +self:T(self.lid..string.format("Adding asset cargo \"%s\" to transport and TZC=%s",tostring(Asset.spawngroupname),TransportZoneCombo and TransportZoneCombo.uid or"N/A")) +self.assetsCargo=self.assetsCargo or{} +table.insert(self.assetsCargo,Asset) +TransportZoneCombo.assetsCargo=TransportZoneCombo.assetsCargo or{} +TransportZoneCombo.assetsCargo[Asset.spawngroupname]=Asset +return self +end +function OPSTRANSPORT:GetTZCofCargo(GroupName) +for _,_tzc in pairs(self.tzCombos)do +local tzc=_tzc +for _,_cargo in pairs(tzc.Cargos)do +local cargo=_cargo +if cargo.opsgroup:GetName()==GroupName then +return tzc +end +end +end +return nil +end +function OPSTRANSPORT:AddLegion(Legion) +self:T(self.lid..string.format("Adding legion %s",Legion.alias)) +table.insert(self.legions,Legion) +return self +end +function OPSTRANSPORT:RemoveLegion(Legion) +for i=#self.legions,1,-1 do +local legion=self.legions[i] +if legion.alias==Legion.alias then +self:T(self.lid..string.format("Removing legion %s",Legion.alias)) +table.remove(self.legions,i) +return self +end +end +self:E(self.lid..string.format("ERROR: Legion %s not found and could not be removed!",Legion.alias)) +return self +end +function OPSTRANSPORT:IsCarrier(CarrierGroup) +if CarrierGroup then +for _,_carrier in pairs(self.carriers)do +local carrier=_carrier +if carrier.groupname==CarrierGroup.groupname then +return true +end +end +end +return false +end +function OPSTRANSPORT:IsReadyToGo() +local text=self.lid.."Is ReadyToGo? " +local Tnow=timer.getAbsTime() +local gotzones=false +for _,_tz in pairs(self.tzCombos)do +local tz=_tz +if tz.PickupZone and tz.DeployZone then +gotzones=true +break +end +end +if not gotzones then +text=text.."No, pickup/deploy zone combo not yet defined!" +return false +end +if self.Tstart and Tnow<self.Tstart then +text=text.."No, start time not passed!" +return false +end +if self.Tstop and Tnow>self.Tstop then +text=text.."Nope, stop time already passed!" +self:T(text) +return false +end +local startme=self:EvalConditionsAll(self.conditionStart) +if not startme then +text=text..("No way, at least one start condition is not true!") +self:T(text) +return false +end +text=text.."Yes!" +self:T(text) +return true +end +function OPSTRANSPORT:SetLegionStatus(Legion,Status) +local status=self:GetLegionStatus(Legion) +self:T(self.lid..string.format("Setting LEGION %s to status %s-->%s",Legion.alias,tostring(status),tostring(Status))) +self.statusLegion[Legion.alias]=Status +return self +end +function OPSTRANSPORT:GetLegionStatus(Legion) +local status=self.statusLegion[Legion.alias]or"unknown" +return status +end +function OPSTRANSPORT:IsPlanned() +local is=self:is(OPSTRANSPORT.Status.PLANNED) +return is +end +function OPSTRANSPORT:IsQueued(Legion) +local is=self:is(OPSTRANSPORT.Status.QUEUED) +if Legion then +is=self:GetLegionStatus(Legion)==OPSTRANSPORT.Status.QUEUED +end +return is +end +function OPSTRANSPORT:IsRequested(Legion) +local is=self:is(OPSTRANSPORT.Status.REQUESTED) +if Legion then +is=self:GetLegionStatus(Legion)==OPSTRANSPORT.Status.REQUESTED +end +return is +end +function OPSTRANSPORT:IsScheduled() +local is=self:is(OPSTRANSPORT.Status.SCHEDULED) +return is +end +function OPSTRANSPORT:IsExecuting() +local is=self:is(OPSTRANSPORT.Status.EXECUTING) +return is +end +function OPSTRANSPORT:IsDelivered(Nmin) +local is=self:is(OPSTRANSPORT.Status.DELIVERED) +if is==false and Nmin and self.Ndelivered>=math.min(self.Ncargo,Nmin)then +is=true +end +return is +end +function OPSTRANSPORT:onafterStatusUpdate(From,Event,To) +local fsmstate=self:GetState() +if self.verbose>=1 then +local text=string.format("%s: Ncargo=%d/%d, Ncarrier=%d/%d, Nlegions=%d",fsmstate:upper(),self.Ncargo,self.Ndelivered,#self.carriers,self.Ncarrier,#self.legions) +if self.verbose>=2 then +for i,_tz in pairs(self.tzCombos)do +local tz=_tz +local pickupzone=tz.PickupZone and tz.PickupZone:GetName()or"Unknown" +local deployzone=tz.DeployZone and tz.DeployZone:GetName()or"Unknown" +text=text..string.format("\n[%d] %s --> %s: Ncarriers=%d, Ncargo=%d (%d)",i,pickupzone,deployzone,tz.Ncarriers,#tz.Cargos,tz.Ncargo) +end +end +if self.verbose>=3 then +text=text..string.format("\nCargos:") +for _,_cargo in pairs(self:GetCargos())do +local cargo=_cargo +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local carrier=cargo.opsgroup:_GetMyCarrierElement() +local name=carrier and carrier.name or"none" +local cstate=carrier and carrier.status or"N/A" +text=text..string.format("\n- %s: %s [%s], weight=%d kg, carrier=%s [%s], delivered=%s [UID=%s]", +cargo.opsgroup:GetName(),cargo.opsgroup.cargoStatus:upper(),cargo.opsgroup:GetState(),cargo.opsgroup:GetWeightTotal(),name,cstate,tostring(cargo.delivered),tostring(cargo.opsgroup.cargoTransportUID)) +else +local storage=cargo.storage +text=text..string.format("\n- storage type=%s: amount: total=%d loaded=%d, lost=%d, delivered=%d, delivered=%s [UID=%s]", +storage.cargoType,storage.cargoAmount,storage.cargoLoaded,storage.cargoLost,storage.cargoDelivered,tostring(cargo.delivered),tostring(cargo.uid)) +end +end +text=text..string.format("\nCarriers:") +for _,_carrier in pairs(self.carriers)do +local carrier=_carrier +text=text..string.format("\n- %s: %s [%s], Cargo Bay [current/reserved/total]=%d/%d/%d kg [free %d/%d/%d kg]", +carrier:GetName(),carrier.carrierStatus:upper(),carrier:GetState(), +carrier:GetWeightCargo(nil,false),carrier:GetWeightCargo(),carrier:GetWeightCargoMax(), +carrier:GetFreeCargobay(nil,false),carrier:GetFreeCargobay(),carrier:GetFreeCargobayMax()) +end +end +self:I(self.lid..text) +end +self:_CheckDelivered() +if not self:IsDelivered()then +self:__StatusUpdate(-30) +end +end +function OPSTRANSPORT:IsCargoDelivered(GroupName) +for _,_cargo in pairs(self:GetCargos())do +local cargo=_cargo +if cargo.opsgroup:GetName()==GroupName then +return cargo.delivered +end +end +return nil +end +function OPSTRANSPORT:onafterPlanned(From,Event,To) +self:T(self.lid..string.format("New status: %s-->%s",From,To)) +end +function OPSTRANSPORT:onafterScheduled(From,Event,To) +self:T(self.lid..string.format("New status: %s-->%s",From,To)) +end +function OPSTRANSPORT:onafterExecuting(From,Event,To) +self:T(self.lid..string.format("New status: %s-->%s",From,To)) +end +function OPSTRANSPORT:onbeforeDelivered(From,Event,To) +if From==OPSTRANSPORT.Status.DELIVERED then +return false +end +return true +end +function OPSTRANSPORT:onafterDelivered(From,Event,To) +self:T(self.lid..string.format("New status: %s-->%s",From,To)) +for i=#self.carriers,1,-1 do +local carrier=self.carriers[i] +if self:GetCarrierTransportStatus(carrier)~=OPSTRANSPORT.Status.DELIVERED then +carrier:Delivered(self) +end +end +end +function OPSTRANSPORT:onafterLoaded(From,Event,To,OpsGroupCargo,OpsGroupCarrier,CarrierElement) +self:I(self.lid..string.format("Loaded OPSGROUP %s into carrier %s",OpsGroupCargo:GetName(),tostring(CarrierElement.name))) +end +function OPSTRANSPORT:onafterUnloaded(From,Event,To,OpsGroupCargo,OpsGroupCarrier) +self:I(self.lid..string.format("Unloaded OPSGROUP %s",OpsGroupCargo:GetName())) +end +function OPSTRANSPORT:onafterDeadCarrierGroup(From,Event,To,OpsGroup) +self:I(self.lid..string.format("Carrier OPSGROUP %s dead!",OpsGroup:GetName())) +self.NcarrierDead=self.NcarrierDead+1 +self:_DelCarrier(OpsGroup) +if#self.carriers==0 then +self:DeadCarrierAll() +end +end +function OPSTRANSPORT:onafterDeadCarrierAll(From,Event,To) +self:I(self.lid..string.format("ALL Carrier OPSGROUPs are dead!")) +if self.opszone then +self:I(self.lid..string.format("Cancelling transport on CHIEF level")) +self.chief:TransportCancel(self) +else +self:_CheckDelivered() +if not self:IsDelivered()then +self:Planned() +end +end +end +function OPSTRANSPORT:onafterCancel(From,Event,To) +local Ngroups=#self.carriers +self:I(self.lid..string.format("CANCELLING transport in status %s. Will wait for %d carrier groups to report DONE before evaluation",self:GetState(),Ngroups)) +self.Tover=timer.getAbsTime() +if self.chief then +self:T(self.lid..string.format("CHIEF will cancel the transport. Will wait for mission DONE before evaluation!")) +self.chief:TransportCancel(self) +elseif self.commander then +self:T(self.lid..string.format("COMMANDER will cancel the transport. Will wait for transport DELIVERED before evaluation!")) +self.commander:TransportCancel(self) +elseif self.legions and#self.legions>0 then +for _,_legion in pairs(self.legions or{})do +local legion=_legion +self:T(self.lid..string.format("LEGION %s will cancel the transport. Will wait for transport DELIVERED before evaluation!",legion.alias)) +legion:TransportCancel(self) +end +else +self:T(self.lid..string.format("No legion, commander or chief. Attached OPS groups will cancel the transport on their own. Will wait for transport DELIVERED before evaluation!")) +for _,_carrier in pairs(self:GetCarriers())do +local carrier=_carrier +carrier:TransportCancel(self) +end +local cargos=self:GetCargoOpsGroups(false) +for _,_cargo in pairs(cargos)do +local cargo=_cargo +cargo:_DelMyLift(self) +end +end +if self:IsPlanned()or self:IsQueued()or self:IsRequested()or Ngroups==0 then +self:T(self.lid..string.format("Cancelled transport was in %s stage with %d carrier groups assigned and alive. Call it DELIVERED!",self:GetState(),Ngroups)) +self:Delivered() +end +end +function OPSTRANSPORT:_CheckDelivered() +if self.Ncargo>0 then +local done=true +local dead=true +for _,_cargo in pairs(self:GetCargos())do +local cargo=_cargo +if cargo.delivered then +dead=false +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup==nil then +dead=false +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup:IsDestroyed()then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup:IsDead()then +elseif cargo.type==OPSTRANSPORT.CargoType.OPSGROUP and cargo.opsgroup:IsStopped()then +dead=false +else +done=false +dead=false +end +end +if dead then +self:I(self.lid.."All cargo DEAD ==> Delivered!") +self:Delivered() +elseif done then +self:I(self.lid.."All cargo DONE ==> Delivered!") +self:Delivered() +end +end +end +function OPSTRANSPORT:_CheckRequiredCargos(TransportZoneCombo,CarrierGroup) +TransportZoneCombo=TransportZoneCombo or self.tzcDefault +local requiredCargos=TransportZoneCombo.Cargos +if TransportZoneCombo.RequiredCargos and#TransportZoneCombo.RequiredCargos>0 then +requiredCargos=TransportZoneCombo.RequiredCargos +else +requiredCargos={} +for _,_cargo in pairs(TransportZoneCombo.Cargos)do +local cargo=_cargo +table.insert(requiredCargos,cargo.opsgroup) +end +end +if requiredCargos==nil or#requiredCargos==0 then +return true +end +local carrierNames=self:_GetCarrierNames() +local weightmin=nil +for _,_cargo in pairs(requiredCargos)do +local cargo=_cargo +local isLoaded=cargo:IsLoaded(carrierNames) +if not isLoaded then +local weight=cargo:GetWeightTotal() +if weightmin==nil or weight<weightmin then +weightmin=weight +end +end +end +if weightmin then +local freeSpace=CarrierGroup:GetFreeCargobayMax(true) +self:T(self.lid..string.format("Check required cargos for carrier=%s free=%.1f, weight=%.1f",CarrierGroup:GetName(),freeSpace,weightmin)) +if weightmin<freeSpace then +return false +else +return true +end +end +return true +end +function OPSTRANSPORT:EvalConditionsAll(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if not istrue then +return false +end +end +return true +end +function OPSTRANSPORT:FindTransferCarrierForCargo(CargoGroup,Zone,DisembarkCarriers,DeployAirbase) +local carrier=nil +local carrierGroup=nil +for _,_carrier in pairs(DisembarkCarriers or{})do +local carrierGroup=_carrier +if carrierGroup and carrierGroup:IsAlive()and(carrierGroup:IsLoading()or DeployAirbase)then +carrier=carrierGroup:FindCarrierForCargo(CargoGroup) +if carrier then +if Zone==nil or Zone:IsVec2InZone(carrier.unit:GetVec2())then +return carrier,carrierGroup +else +self:T2(self.lid.."Got transfer carrier but carrier not in zone (yet)!") +end +else +self:T2(self.lid.."No transfer carrier available!") +end +end +end +self:T2(self.lid.."Could NOT find any carrier that is ALIVE and LOADING (or DELOYAIRBASE))!") +return nil,nil +end +function OPSTRANSPORT:_CreateCargoGroupData(group,TransportZoneCombo,DisembarkActivation,DisembarkZone,DisembarkCarriers) +local opsgroup=self:_GetOpsGroupFromObject(group) +for _,_cargo in pairs(TransportZoneCombo.Cargos or{})do +local cargo=_cargo +if cargo.opsgroup.groupname==opsgroup.groupname then +return nil +end +end +self.cargocounter=self.cargocounter+1 +local cargo={} +cargo.uid=self.cargocounter +cargo.type="OPSGROUP" +cargo.opsgroup=opsgroup +cargo.delivered=false +cargo.status="Unknown" +cargo.tzcUID=TransportZoneCombo +cargo.disembarkZone=DisembarkZone +if DisembarkCarriers then +cargo.disembarkCarriers={} +self:_AddDisembarkCarriers(DisembarkCarriers,cargo.disembarkCarriers) +end +return cargo +end +function OPSTRANSPORT:_CreateCargoStorage(StorageFrom,StorageTo,CargoType,CargoAmount,CargoWeight,TransportZoneCombo) +local storage={} +storage.storageFrom=StorageFrom +storage.storageTo=StorageTo +storage.cargoType=CargoType +storage.cargoAmount=CargoAmount +storage.cargoDelivered=0 +storage.cargoLost=0 +storage.cargoReserved=0 +storage.cargoLoaded=0 +storage.cargoWeight=CargoWeight or 1 +self.cargocounter=self.cargocounter+1 +local cargo={} +cargo.uid=self.cargocounter +cargo.type="STORAGE" +cargo.opsgroup=nil +cargo.storage=storage +cargo.delivered=false +cargo.status="Unknown" +cargo.tzcUID=TransportZoneCombo +cargo.disembarkZone=nil +cargo.disembarkCarriers=nil +return cargo +end +function OPSTRANSPORT:_CountCargosInZone(Zone,Delivered,Carrier,TransportZoneCombo) +local cargos=self:GetCargos(TransportZoneCombo,Carrier,Delivered) +local function iscarrier(_cargo) +local cargo=_cargo +local mycarrier=cargo:_GetMyCarrierGroup() +if mycarrier and mycarrier:IsUnloading()then +local carriers=mycarrier.cargoTransport:GetDisembarkCarriers(mycarrier.cargoTZC) +for _,_carrier in pairs(carriers)do +local carrier=_carrier +if Carrier:GetName()==carrier:GetName()then +return true +end +end +if mycarrier.cargoTZC and mycarrier.cargoTZC.Cargos then +for _,_cargodata in pairs(mycarrier.cargoTZC.Cargos)do +local cargodata=_cargodata +if cargo:GetName()==cargodata.opsgroup:GetName()then +for _,_carrier in pairs(cargodata.disembarkCarriers)do +local carrier=_carrier +if Carrier:GetName()==carrier:GetName()then +return true +end +end +end +end +end +end +return false +end +local N=0 +for _,_cargo in pairs(cargos)do +local cargo=_cargo +local isNotCargo=true +local isInZone=true +local isInUtero=true +if cargo.type==OPSTRANSPORT.CargoType.OPSGROUP then +local opsgroup=cargo.opsgroup +isNotCargo=opsgroup:IsNotCargo(true) +if not isNotCargo then +isNotCargo=iscarrier(opsgroup) +end +isInZone=opsgroup:IsInZone(Zone) +isInUtero=opsgroup:IsInUtero() +self:T(self.lid..string.format("Cargo=%s: notcargo=%s, iscarrier=%s inzone=%s, inutero=%s",opsgroup:GetName(),tostring(opsgroup:IsNotCargo(true)),tostring(iscarrier(opsgroup)),tostring(isInZone),tostring(isInUtero))) +end +if isNotCargo and(isInZone or isInUtero)then +N=N+1 +end +end +self:T(self.lid..string.format("Found %d units in zone %s",N,Zone:GetName())) +return N +end +function OPSTRANSPORT:_GetTransportZoneCombo(Carrier) +local vec2=Carrier:GetVec2() +local function penalty(candidate) +local p=candidate.ncarriers*10-candidate.ncargo+candidate.distance/10 +return p +end +local candidates={} +for i,_transportzone in pairs(self.tzCombos)do +local tz=_transportzone +if tz.PickupZone and tz.DeployZone and tz.EmbarkZone then +local ncargo=self:_CountCargosInZone(tz.EmbarkZone,false,Carrier,tz) +if ncargo>=1 then +local dist=tz.PickupZone:Get2DDistance(vec2) +local ncarriers=0 +for _,_carrier in pairs(self.carriers)do +local carrier=_carrier +if carrier and carrier:IsAlive()and carrier.cargoTZC and carrier.cargoTZC.uid==tz.uid then +ncarriers=ncarriers+1 +end +end +local candidate={tzc=tz,distance=dist/1000,ncargo=ncargo,ncarriers=ncarriers} +candidate.penalty=penalty(candidate) +table.insert(candidates,candidate) +end +end +end +if#candidates>0 then +local function optTZC(candA,candB) +return candA.penalty<candB.penalty +end +table.sort(candidates,optTZC) +if self.verbose>=3 then +local text="TZC optimized" +for i,candidate in pairs(candidates)do +text=text..string.format("\n[%d] TPZ=%d, Ncarriers=%d, Ncargo=%d, Distance=%.1f km, PENALTY=%d",i,candidate.tzc.uid,candidate.ncarriers,candidate.ncargo,candidate.distance,candidate.penalty) +end +self:I(self.lid..text) +end +return candidates[1].tzc +else +self:T(self.lid..string.format("Could NOT find a pickup zone (with cargo) for carrier group %s",Carrier:GetName())) +end +return nil +end +function OPSTRANSPORT:_GetOpsGroupFromObject(Object) +local opsgroup=nil +if Object:IsInstanceOf("OPSGROUP")then +opsgroup=Object +elseif Object:IsInstanceOf("GROUP")then +opsgroup=_DATABASE:GetOpsGroup(Object) +if not opsgroup then +if Object:IsAir()then +opsgroup=FLIGHTGROUP:New(Object) +elseif Object:IsShip()then +opsgroup=NAVYGROUP:New(Object) +else +opsgroup=ARMYGROUP:New(Object) +end +end +else +self:E(self.lid.."ERROR: Object must be a GROUP or OPSGROUP object!") +return nil +end +return opsgroup +end +OPSZONE={ +ClassName="OPSZONE", +verbose=0, +Nred=0, +Nblu=0, +Nnut=0, +Ncoal={}, +Tred=0, +Tblu=0, +Tnut=0, +chiefs={}, +Missions={}, +UpdateSeconds=120, +} +OPSZONE.ZoneType={ +Circular="Circular", +Polygon="Polygon", +} +OPSZONE.version="0.6.2" +function OPSZONE:New(Zone,CoalitionOwner) +local self=BASE:Inherit(self,FSM:New()) +if Zone then +if type(Zone)=="string"then +local Name=Zone +Zone=ZONE:FindByName(Name) +if not Zone then +local airbase=AIRBASE:FindByName(Name) +if airbase then +Zone=ZONE_AIRBASE:New(Name,2000) +end +end +if not Zone then +self:E(string.format("ERROR: No ZONE or ZONE_AIRBASE found for name: %s",Name)) +return nil +end +end +else +self:E("ERROR: First parameter Zone is nil in OPSZONE:New(Zone) call!") +return nil +end +if Zone:IsInstanceOf("ZONE_AIRBASE")then +self.airbase=Zone._.ZoneAirbase +self.airbaseName=self.airbase:GetName() +self.zoneType=OPSZONE.ZoneType.Circular +self.zoneCircular=Zone +elseif Zone:IsInstanceOf("ZONE_RADIUS")then +self.zoneType=OPSZONE.ZoneType.Circular +self.zoneCircular=Zone +elseif Zone:IsInstanceOf("ZONE_POLYGON_BASE")then +self.zoneType=OPSZONE.ZoneType.Polygon +local zone=Zone +self.zoneCircular=zone:GetZoneRadius(nil,true) +else +self:E("ERROR: OPSZONE must be a SPHERICAL zone due to DCS restrictions!") +return nil +end +self.lid=string.format("OPSZONE %s | ",Zone:GetName()) +self.zone=Zone +self.zoneName=Zone:GetName() +self.zoneRadius=self.zoneCircular:GetRadius() +self.Missions={} +self.ScanUnitSet=SET_UNIT:New():FilterZones({Zone}) +self.ScanGroupSet=SET_GROUP:New():FilterZones({Zone}) +_DATABASE:AddOpsZone(self) +self.ownerCurrent=CoalitionOwner or coalition.side.NEUTRAL +self.ownerPrevious=CoalitionOwner or coalition.side.NEUTRAL +self.isContested=false +self.Ncoal[coalition.side.BLUE]=0 +self.Ncoal[coalition.side.RED]=0 +self.Ncoal[coalition.side.NEUTRAL]=0 +if self.airbase then +self.ownerCurrent=self.airbase:GetCoalition() +self.ownerPrevious=self.airbase:GetCoalition() +end +self:SetObjectCategories() +self:SetUnitCategories() +self:SetDrawZone() +self:SetMarkZone(true) +self:SetCaptureTime() +self:SetCaptureNunits() +self:SetCaptureThreatlevel() +self.timerStatus=TIMER:New(OPSZONE.Status,self) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Empty") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","Evaluated","*") +self:AddTransition("*","Captured","Guarded") +self:AddTransition("Empty","Guarded","Guarded") +self:AddTransition("*","Empty","Empty") +self:AddTransition("*","Attacked","Attacked") +self:AddTransition("*","Defeated","Guarded") +return self +end +function OPSZONE:SetVerbosity(VerbosityLevel) +self.verbose=VerbosityLevel or 0 +return self +end +function OPSZONE:SetObjectCategories(Categories) +if Categories and type(Categories)~="table"then +Categories={Categories} +end +self.ObjectCategories=Categories or{Object.Category.UNIT,Object.Category.STATIC} +return self +end +function OPSZONE:SetUnitCategories(Categories) +if Categories and type(Categories)~="table"then +Categories={Categories} +end +self.UnitCategories=Categories or{Unit.Category.GROUND_UNIT} +return self +end +function OPSZONE:SetCaptureThreatlevel(Threatlevel) +self.threatlevelCapture=Threatlevel or 0 +return self +end +function OPSZONE:SetCaptureNunits(Nunits) +Nunits=Nunits or 1 +self.nunitsCapture=Nunits +return self +end +function OPSZONE:SetCaptureTime(Tcapture) +self.TminCaptured=Tcapture or 0 +return self +end +function OPSZONE:SetNeutralCanCapture(CanCapture) +self.neutralCanCapture=CanCapture +return self +end +function OPSZONE:SetDrawZone(Switch) +if Switch==false then +self.drawZone=false +else +self.drawZone=true +end +return self +end +function OPSZONE:SetDrawZoneForCoalition(Switch) +if Switch==true then +self.drawZoneForCoalition=true +else +self.drawZoneForCoalition=false +end +return self +end +function OPSZONE:SetMarkZone(Switch,ReadOnly) +if Switch then +self.markZone=true +local Coordinate=self:GetCoordinate() +self.markerText=self:_GetMarkerText() +self.marker=self.marker or MARKER:New(Coordinate,self.markerText) +if ReadOnly==false then +self.marker.readonly=false +else +self.marker.readonly=true +end +self.marker:ToAll() +else +if self.marker then +self.marker:Remove() +end +self.marker=nil +self.markZone=false +end +return self +end +function OPSZONE:GetOwner() +return self.ownerCurrent +end +function OPSZONE:GetOwnerName() +return UTILS.GetCoalitionName(self.ownerCurrent) +end +function OPSZONE:GetCoordinate() +local coordinate=self.zone:GetCoordinate() +return coordinate +end +function OPSZONE:GetScannedUnitSet() +return self.ScanUnitSet +end +function OPSZONE:GetScannedGroupSet() +return self.ScanGroupSet +end +function OPSZONE:GetRandomCoordinate(inner,outer,surfacetypes) +local zone=self:GetZone() +local coord=zone:GetRandomCoordinate(inner,outer,surfacetypes) +return coord +end +function OPSZONE:GetName() +return self.zoneName +end +function OPSZONE:GetZone() +return self.zone +end +function OPSZONE:GetPreviousOwner() +return self.ownerPrevious +end +function OPSZONE:GetAttackDuration() +if self:IsAttacked()and self.Tattacked then +local dT=timer.getAbsTime()-self.Tattacked +return dT +end +return nil +end +function OPSZONE:FindByName(ZoneName) +local Found=_DATABASE:FindOpsZone(ZoneName) +return Found +end +function OPSZONE:IsRed() +local is=self.ownerCurrent==coalition.side.RED +return is +end +function OPSZONE:IsBlue() +local is=self.ownerCurrent==coalition.side.BLUE +return is +end +function OPSZONE:IsNeutral() +local is=self.ownerCurrent==coalition.side.NEUTRAL +return is +end +function OPSZONE:IsCoalition(Coalition) +local is=self.ownerCurrent==Coalition +return is +end +function OPSZONE:IsStarted() +local is=not self:IsStopped() +return is +end +function OPSZONE:IsStopped() +local is=self:is("Stopped") +return is +end +function OPSZONE:IsGuarded() +local is=self:is("Guarded") +return is +end +function OPSZONE:IsEmpty() +local is=self:is("Empty") +return is +end +function OPSZONE:IsAttacked() +local is=self:is("Attacked") +return is +end +function OPSZONE:IsContested() +return self.isContested +end +function OPSZONE:IsStopped() +local is=self:is("Stopped") +return is +end +function OPSZONE:onafterStart(From,Event,To) +self:I(self.lid..string.format("Starting OPSZONE v%s",OPSZONE.version)) +self.timerStatus=self.timerStatus or TIMER:New(OPSZONE.Status,self) +local EveryUpdateIn=self.UpdateSeconds or 120 +self.timerStatus:Start(1,EveryUpdateIn) +if self.airbase then +self:HandleEvent(EVENTS.BaseCaptured) +end +return self +end +function OPSZONE:onafterStop(From,Event,To) +self:I(self.lid..string.format("Stopping OPSZONE")) +self.timerStatus:Stop() +self.zone:UndrawZone() +if self.markZone then +self.marker:Remove() +end +self:UnHandleEvent(EVENTS.BaseCaptured) +self.CallScheduler:Clear() +if self.Scheduler then +self.Scheduler:Clear() +end +end +function OPSZONE:Status() +local fsmstate=self:GetState() +local contested=tostring(self:IsContested()) +if self.verbose>=1 then +local text=string.format("State %s: Owner %d (previous %d), contested=%s, Nunits: red=%d, blue=%d, neutral=%d",fsmstate,self.ownerCurrent,self.ownerPrevious,contested,self.Nred,self.Nblu,self.Nnut) +self:I(self.lid..text) +end +self:Scan() +self:EvaluateZone() +self:_UpdateMarker() +if self.zone.DrawID and not self.drawZone then +self.zone:UndrawZone() +end +end +function OPSZONE:onbeforeCaptured(From,Event,To,NewOwnerCoalition) +if self.ownerCurrent==NewOwnerCoalition then +self:T(self.lid.."") +end +return true +end +function OPSZONE:onafterCaptured(From,Event,To,NewOwnerCoalition) +self:T(self.lid..string.format("Zone captured by coalition=%d",NewOwnerCoalition)) +self.ownerPrevious=self.ownerCurrent +self.ownerCurrent=NewOwnerCoalition +if self.drawZone then +self.zone:UndrawZone() +local color=self:_GetZoneColor() +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) +end +for _,_chief in pairs(self.chiefs)do +local chief=_chief +if chief.coalition==self.ownerCurrent then +chief:ZoneCaptured(self) +else +chief:ZoneLost(self) +end +end +end +function OPSZONE:onafterEmpty(From,Event,To) +self:T(self.lid..string.format("Zone is empty EVENT")) +end +function OPSZONE:onafterAttacked(From,Event,To,AttackerCoalition) +self:T(self.lid..string.format("Zone is being attacked by coalition=%s!",tostring(AttackerCoalition))) +end +function OPSZONE:onafterDefeated(From,Event,To,DefeatedCoalition) +self:T(self.lid..string.format("Defeated attack on zone by coalition=%d",DefeatedCoalition)) +self.Tattacked=nil +end +function OPSZONE:onenterGuarded(From,Event,To) +if From~=To then +self:T(self.lid..string.format("Zone is guarded")) +self.Tattacked=nil +if self.drawZone then +self.zone:UndrawZone() +local color=self:_GetZoneColor() +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) +end +end +end +function OPSZONE:onenterAttacked(From,Event,To,AttackerCoalition) +if From~="Attacked"then +self:T(self.lid..string.format("Zone is Attacked")) +self.Tattacked=timer.getAbsTime() +if AttackerCoalition then +for _,_chief in pairs(self.chiefs)do +local chief=_chief +if chief.coalition~=AttackerCoalition then +chief:ZoneAttacked(self) +end +end +end +if self.drawZone then +self.zone:UndrawZone() +local color={1,204/255,204/255} +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.5) +end +self:_CleanMissionTable() +end +end +function OPSZONE:onenterEmpty(From,Event,To) +if From~=To then +self:T(self.lid..string.format("Zone is empty now")) +for _,_chief in pairs(self.chiefs)do +local chief=_chief +chief:ZoneEmpty(self) +end +if self.drawZone then +self.zone:UndrawZone() +local color=self:_GetZoneColor() +local coalition=nil +if self.drawZoneForCoalition then +coalition=self.ownerCurrent +end +self.zone:DrawZone(coalition,color,1.0,color,0.2) +end +end +end +function OPSZONE:Scan() +if self.verbose>=3 then +local text=string.format("Scanning zone %s R=%.1f m",self.zoneName,self.zoneRadius) +self:I(self.lid..text) +end +local SphereSearch={id=world.VolumeType.SPHERE,params={point=self.zone:GetVec3(),radius=self.zoneRadius}} +local Nred=0 +local Nblu=0 +local Nnut=0 +local Tred=0 +local Tblu=0 +local Tnut=0 +self.ScanGroupSet:Clear(false) +self.ScanUnitSet:Clear(false) +local function EvaluateZone(_ZoneObject) +local ZoneObject=_ZoneObject +if ZoneObject then +local ObjectCategory=Object.getCategory(ZoneObject) +if ObjectCategory==Object.Category.UNIT and ZoneObject:isExist()and ZoneObject:isActive()then +local DCSUnit=ZoneObject +local function Included() +if not self.UnitCategories then +return true +else +local CategoryDCSUnit=ZoneObject:getDesc().category +for _,UnitCategory in pairs(self.UnitCategories)do +if UnitCategory==CategoryDCSUnit then +return true +end +end +end +return false +end +if Included()then +local Coalition=DCSUnit:getCoalition() +local tl=0 +local unit=UNIT:Find(DCSUnit) +if unit then +local inzone=true +if self.zoneType==OPSZONE.ZoneType.Polygon then +inzone=unit:IsInZone(self.zone) +end +if inzone then +tl=unit:GetThreatLevel() +self.ScanUnitSet:AddUnit(unit) +local group=unit:GetGroup() +if group then +self.ScanGroupSet:AddGroup(group,true) +end +if Coalition==coalition.side.RED then +Nred=Nred+1 +Tred=Tred+tl +elseif Coalition==coalition.side.BLUE then +Nblu=Nblu+1 +Tblu=Tblu+tl +elseif Coalition==coalition.side.NEUTRAL then +Nnut=Nnut+1 +Tnut=Tnut+tl +end +if self.verbose>=4 then +self:I(self.lid..string.format("Found unit %s (coalition=%d)",DCSUnit:getName(),Coalition)) +end +end +end +end +elseif ObjectCategory==Object.Category.STATIC and ZoneObject:isExist()then +local DCSStatic=ZoneObject +local Coalition=DCSStatic:getCoalition() +local inzone=true +if self.zoneType==OPSZONE.ZoneType.Polygon then +local Vec3=DCSStatic:getPoint() +inzone=self.zone:IsVec3InZone(Vec3) +end +if inzone then +if Coalition==coalition.side.RED then +Nred=Nred+1 +elseif Coalition==coalition.side.BLUE then +Nblu=Nblu+1 +elseif Coalition==coalition.side.NEUTRAL then +Nnut=Nnut+1 +end +if self.verbose>=4 then +self:I(self.lid..string.format("Found static %s (coalition=%d)",DCSStatic:getName(),Coalition)) +end +end +elseif ObjectCategory==Object.Category.SCENERY then +local SceneryType=ZoneObject:getTypeName() +local SceneryName=ZoneObject:getName() +self:T2(self.lid..string.format("Found scenery type=%s, name=%s",SceneryType,SceneryName)) +end +end +return true +end +world.searchObjects(self.ObjectCategories,SphereSearch,EvaluateZone) +if self.verbose>=3 then +local text=string.format("Scan result Nred=%d, Nblue=%d, Nneutral=%d",Nred,Nblu,Nnut) +if self.verbose>=4 then +for _,_unit in pairs(self.ScanUnitSet:GetSet())do +local unit=_unit +text=text..string.format("\nUnit %s coalition=%s",unit:GetName(),unit:GetCoalitionName()) +end +for _,_group in pairs(self.ScanGroupSet:GetSet())do +local group=_group +text=text..string.format("\nGroup %s coalition=%s",group:GetName(),group:GetCoalitionName()) +end +end +self:I(self.lid..text) +end +self.Nred=Nred +self.Nblu=Nblu +self.Nnut=Nnut +self.Ncoal[coalition.side.BLUE]=Nblu +self.Ncoal[coalition.side.RED]=Nred +self.Ncoal[coalition.side.NEUTRAL]=Nnut +self.Tblu=Tblu +self.Tred=Tred +self.Tnut=Tnut +return self +end +function OPSZONE:EvaluateZone() +local Nred=self.Nred +local Nblu=self.Nblu +local Nnut=self.Nnut +local Tnow=timer.getAbsTime() +local function captured(coal) +if not self.airbase then +if not self.Tcaptured then +self.Tcaptured=Tnow +end +if Tnow-self.Tcaptured>=self.TminCaptured then +self:Captured(coal) +self.Tcaptured=nil +end +end +end +if self:IsRed()then +if Nred==0 then +if Nblu>=self.nunitsCapture and self.Tblu>=self.threatlevelCapture then +captured(coalition.side.BLUE) +elseif Nnut>=self.nunitsCapture and self.Tnut>=self.threatlevelCapture and self.neutralCanCapture then +captured(coalition.side.NEUTRAL) +end +else +if Nblu>0 then +if not self:IsAttacked()and self.Tblu>=self.threatlevelCapture then +self:Attacked(coalition.side.BLUE) +end +elseif Nblu==0 then +if self:IsAttacked()and self:IsContested()then +self:Defeated(coalition.side.BLUE) +elseif self:IsEmpty()then +self:Guarded() +end +end +end +if Nblu==0 then +self.isContested=false +else +self.isContested=true +end +elseif self:IsBlue()then +if Nblu==0 then +if Nred>=self.nunitsCapture and self.Tred>=self.threatlevelCapture then +captured(coalition.side.RED) +elseif Nnut>=self.nunitsCapture and self.Tnut>=self.threatlevelCapture and self.neutralCanCapture then +captured(coalition.side.NEUTRAL) +end +else +if Nred>0 then +if not self:IsAttacked()and self.Tred>=self.threatlevelCapture then +self:Attacked(coalition.side.RED) +end +elseif Nred==0 then +if self:IsAttacked()and self:IsContested()then +self:Defeated(coalition.side.RED) +elseif self:IsEmpty()then +self:Guarded() +end +end +end +if Nred==0 then +self.isContested=false +else +self.isContested=true +end +elseif self:IsNeutral()then +if Nred>0 and Nblu>0 then +self:T(self.lid.."FF neutrals left neutral zone and red and blue are present! What to do?") +if not self:IsAttacked()then +self:Attacked() +end +self.isContested=true +elseif Nred>=self.nunitsCapture and self.Tred>=self.threatlevelCapture then +captured(coalition.side.RED) +elseif Nblu>=self.nunitsCapture and self.Tblu>=self.threatlevelCapture then +captured(coalition.side.BLUE) +end +else +self:E(self.lid.."ERROR: Unknown coaliton!") +end +if Nblu==0 and Nred==0 and Nnut==0 and(not self:IsEmpty())then +self:Empty() +end +if self.airbase then +local airbasecoalition=self.airbase:GetCoalition() +if airbasecoalition~=self.ownerCurrent then +self:T(self.lid..string.format("Captured airbase %s: Coaltion %d-->%d",self.airbaseName,self.ownerCurrent,airbasecoalition)) +self:Captured(airbasecoalition) +end +end +self:Evaluated() +end +function OPSZONE:OnEventHit(EventData) +if self.HitsOn then +local UnitHit=EventData.TgtUnit +if UnitHit and UnitHit:IsInZone(self)and UnitHit:GetCoalition()==self.ownerCurrent then +self.HitTimeLast=timer.getTime() +if not self:IsAttacked()then +self:T3(self.lid.."Hit ==> Attack") +self:Attacked() +end +end +end +end +function OPSZONE:OnEventBaseCaptured(EventData) +if EventData and EventData.Place and self.airbase and self.airbaseName then +local airbase=EventData.Place +if EventData.PlaceName==self.airbaseName then +local CoalitionNew=airbase:GetCoalition() +self:I(self.lid..string.format("EVENT BASE CAPTURED: New coalition of airbase %s: %d [previous=%d]",self.airbaseName,CoalitionNew,self.ownerCurrent)) +if CoalitionNew~=self.ownerCurrent then +self:Captured(CoalitionNew) +end +end +end +end +function OPSZONE:_GetZoneColor() +local color={0,0,0} +if self.ownerCurrent==coalition.side.NEUTRAL then +color=self.ZoneOwnerNeutral or{1,1,1} +elseif self.ownerCurrent==coalition.side.BLUE then +color=self.ZoneOwnerBlue or{0,0,1} +elseif self.ownerCurrent==coalition.side.RED then +color=self.ZoneOwnerRed or{1,0,0} +else +end +return color +end +function OPSZONE:SetZoneColor(Neutral,Blue,Red) +self.ZoneOwnerNeutral=Neutral or{1,1,1} +self.ZoneOwnerBlue=Blue or{0,0,1} +self.ZoneOwnerRed=Red or{1,0,0} +return self +end +function OPSZONE:_UpdateMarker() +if self.markZone then +local text=self:_GetMarkerText() +if text~=self.markerText then +self.markerText=text +self.marker:UpdateText(self.markerText) +end +end +end +function OPSZONE:_GetMarkerText() +local owner=UTILS.GetCoalitionName(self.ownerCurrent) +local prevowner=UTILS.GetCoalitionName(self.ownerPrevious) +local text=string.format("%s [N=%d, TL=%d T=%d]:\nOwner=%s [%s]\nState=%s [Contested=%s]\nBlue=%d [TL=%d]\nRed=%d [TL=%d]\nNeutral=%d [TL=%d]", +self.zoneName,self.nunitsCapture or 0,self.threatlevelCapture or 0,self.TminCaptured or 0, +owner,prevowner,self:GetState(),tostring(self:IsContested()), +self.Nblu,self.Tblu,self.Nred,self.Tred,self.Nnut,self.Tnut) +return text +end +function OPSZONE:_AddChief(Chief) +table.insert(self.chiefs,Chief) +end +function OPSZONE:_AddMission(Coalition,Type,Auftrag) +local entry={} +entry.Coalition=Coalition or coalition.side.NEUTRAL +entry.Type=Type or"" +entry.Mission=Auftrag or nil +table.insert(self.Missions,entry) +return self +end +function OPSZONE:_GetMissions() +return self.Missions +end +function OPSZONE:_FindMissions(Coalition,Type) +local foundmissions={} +local found=false +for _,_entry in pairs(self.Missions)do +local entry=_entry +if entry.Coalition==Coalition and entry.Type==Type and entry.Mission and entry.Mission:IsNotOver()then +table.insert(foundmissions,entry.Mission) +found=true +end +end +return found,foundmissions +end +function OPSZONE:_CleanMissionTable() +local missions={} +for _,_entry in pairs(self.Missions)do +local entry=_entry +if entry.Mission and entry.Mission:IsNotOver()then +table.insert(missions,entry) +end +end +self.Missions=missions +return self +end +PLATOON={ +ClassName="PLATOON", +verbose=0, +weaponData={}, +} +PLATOON.version="0.1.0" +function PLATOON:New(TemplateGroupName,Ngroups,PlatoonName) +local self=BASE:Inherit(self,COHORT:New(TemplateGroupName,Ngroups,PlatoonName)) +self:AddMissionCapability(AUFTRAG.Type.NOTHING,50) +self.isGround=true +self.ammo=self:_CheckAmmo() +return self +end +function PLATOON:SetBrigade(Brigade) +self.legion=Brigade +return self +end +function PLATOON:GetBrigade() +return self.legion +end +function PLATOON:onafterStatus(From,Event,To) +if self.verbose>=1 then +local fsmstate=self:GetState() +local callsign=self.callsignName and UTILS.GetCallsignName(self.callsignName)or"N/A" +local skill=self.skill and tostring(self.skill)or"N/A" +local NassetsTot=#self.assets +local NassetsInS=self:CountAssets(true) +local NassetsQP=0;local NassetsP=0;local NassetsQ=0 +if self.legion then +NassetsQP,NassetsP,NassetsQ=self.legion:CountAssetsOnMission(nil,self) +end +local text=string.format("%s [Type=%s, Call=%s, Skill=%s]: Assets Total=%d, Stock=%d, Mission=%d [Active=%d, Queue=%d]", +fsmstate,self.aircrafttype,callsign,skill,NassetsTot,NassetsInS,NassetsQP,NassetsP,NassetsQ) +self:T(self.lid..text) +if self.verbose>=3 and self.weaponData then +local text="Weapon Data:" +for bit,_weapondata in pairs(self.weaponData)do +local weapondata=_weapondata +text=text..string.format("\n- Bit=%s: Rmin=%.1f km, Rmax=%.1f km",bit,weapondata.RangeMin/1000,weapondata.RangeMax/1000) +end +self:I(self.lid..text) +end +self:_CheckAssetStatus() +end +if not self:IsStopped()then +self:__Status(-60) +end +end +do +_PlayerTaskNr=0 +PLAYERTASK={ +ClassName="PLAYERTASK", +verbose=false, +lid=nil, +PlayerTaskNr=nil, +Type=nil, +TTSType=nil, +Target=nil, +Clients=nil, +Repeat=false, +repeats=0, +RepeatNo=1, +TargetMarker=nil, +SmokeColor=nil, +FlareColor=nil, +conditionSuccess={}, +conditionFailure={}, +TaskController=nil, +timestamp=0, +lastsmoketime=0, +Freetext=nil, +FreetextTTS=nil, +TaskSubType=nil, +NextTaskSuccess={}, +NextTaskFailure={}, +FinalState="none", +PreviousCount=0, +} +PLAYERTASK.version="0.1.28" +function PLAYERTASK:New(Type,Target,Repeat,Times,TTSType) +local self=BASE:Inherit(self,FSM:New()) +self.Type=Type +self.Repeat=false +self.repeats=0 +self.RepeatNo=1 +self.Clients=FIFO:New() +self.TargetMarker=nil +self.SmokeColor=SMOKECOLOR.Red +self.conditionSuccess={} +self.conditionFailure={} +self.TaskController=nil +self.timestamp=timer.getAbsTime() +self.TTSType=TTSType or"close air support" +self.lastsmoketime=0 +if type(Repeat)=="boolean"and Repeat==true and type(Times)=="number"and Times>1 then +self.Repeat=true +self.RepeatNo=Times or 1 +end +_PlayerTaskNr=_PlayerTaskNr+1 +self.PlayerTaskNr=_PlayerTaskNr +self.lid=string.format("PlayerTask #%d %s | ",self.PlayerTaskNr,tostring(self.Type)) +if Target and Target.ClassName and Target.ClassName=="TARGET"then +self.Target=Target +elseif Target and Target.ClassName then +self.Target=TARGET:New(Target) +else +self:E(self.lid.."*** NO VALID TARGET!") +return self +end +self.PreviousCount=self.Target:CountTargets() +self:T(self.lid.."Created.") +self:SetStartState("Planned") +self:AddTransition("*","Planned","Planned") +self:AddTransition("*","Requested","Requested") +self:AddTransition("*","ClientAdded","*") +self:AddTransition("*","ClientRemoved","*") +self:AddTransition("*","Executing","Executing") +self:AddTransition("*","Progress","*") +self:AddTransition("*","Done","Done") +self:AddTransition("*","Cancel","Done") +self:AddTransition("*","Success","Done") +self:AddTransition("*","ClientAborted","*") +self:AddTransition("*","Failed","Failed") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self:__Status(-5) +return self +end +function PLAYERTASK:NewFromTarget(Target,Repeat,Times,TTSType) +return PLAYERTASK:New(self:_GetTaskTypeForTarget(Target),Target,Repeat,Times,TTSType) +end +function PLAYERTASK:_GetTaskTypeForTarget(Target) +local group=nil +local auftrag=nil +if Target:IsInstanceOf("GROUP")then +group=Target +elseif Target:IsInstanceOf("SET_GROUP")then +group=Target:GetFirst() +elseif Target:IsInstanceOf("UNIT")then +group=Target:GetGroup() +elseif Target:IsInstanceOf("SET_UNIT")then +group=Target:GetFirst():GetGroup() +elseif Target:IsInstanceOf("AIRBASE")then +auftrag=AUFTRAG.Type.BOMBRUNWAY +elseif Target:IsInstanceOf("STATIC") +or Target:IsInstanceOf("SET_STATIC") +or Target:IsInstanceOf("SCENERY") +or Target:IsInstanceOf("SET_SCENERY")then +auftrag=AUFTRAG.Type.BOMBING +elseif Target:IsInstanceOf("OPSZONE") +or Target:IsInstanceOf("SET_OPSZONE")then +auftrag=AUFTRAG.Type.CAPTUREZONE +end +if group then +local category=group:GetCategory() +local attribute=group:GetAttribute() +if(category==Group.Category.AIRPLANE or category==Group.Category.HELICOPTER) +and group:InAir()then +auftrag=AUFTRAG.Type.INTERCEPT +elseif category==Group.Category.GROUND or category==Group.Category.TRAIN then +if attribute==GROUP.Attribute.GROUND_SAM +or attribute==GROUP.Attribute.GROUND_EWR then +auftrag=AUFTRAG.Type.SEAD +elseif attribute==GROUP.Attribute.GROUND_AAA +or attribute==GROUP.Attribute.GROUND_APC +or attribute==GROUP.Attribute.GROUND_IFV +or attribute==GROUP.Attribute.GROUND_TRUCK +or attribute==GROUP.Attribute.GROUND_TRAIN then +auftrag=AUFTRAG.Type.BAI +elseif attribute==GROUP.Attribute.GROUND_INFANTRY +or attribute==GROUP.Attribute.GROUND_ARTILLERY +or attribute==GROUP.Attribute.GROUND_TANK then +auftrag=AUFTRAG.Type.CAS +else +auftrag=AUFTRAG.Type.BAI +end +elseif category==Group.Category.SHIP then +auftrag=AUFTRAG.Type.ANTISHIP +else +self:T(self.lid.."ERROR: Unknown Group category!") +end +end +return auftrag +end +function PLAYERTASK:_CheckCaptureOpsZoneSuccess(OpsZone,CaptureSquadGroupNamePrefix,Coalition,CheckClientInZone) +local isClientInZone=true +if CheckClientInZone then +isClientInZone=false +for _,client in ipairs(self:GetClientObjects())do +local clientCoord=client:GetCoordinate() +if OpsZone.zone:IsCoordinateInZone(clientCoord)then +isClientInZone=true +break +end +end +end +local isCaptureGroupInZone=false +OpsZone:GetScannedGroupSet():ForEachGroup(function(group) +if string.find(group:GetName(),CaptureSquadGroupNamePrefix)then +isCaptureGroupInZone=true +end +end) +return OpsZone:GetOwner()==Coalition and isClientInZone and isCaptureGroupInZone +end +function PLAYERTASK:CanJoinTask(Group,Client) +return true +end +function PLAYERTASK:_SetController(Controller) +self:T(self.lid.."_SetController") +self.TaskController=Controller +return self +end +function PLAYERTASK:SetCoalition(Coalition) +self:T(self.lid.."SetCoalition") +self.coalition=Coalition or coalition.side.BLUE +return self +end +function PLAYERTASK:GetCoalition() +self:T(self.lid.."GetCoalition") +return self.coalition +end +function PLAYERTASK:GetTarget() +self:T(self.lid.."GetTarget") +return self.Target +end +function PLAYERTASK:AddFreetext(Text) +self:T(self.lid.."AddFreetext") +self.Freetext=Text +return self +end +function PLAYERTASK:HasFreetext() +self:T(self.lid.."HasFreetext") +return self.Freetext~=nil and true or false +end +function PLAYERTASK:HasFreetextTTS() +self:T(self.lid.."HasFreetextTTS") +return self.FreetextTTS~=nil and true or false +end +function PLAYERTASK:SetSubType(Type) +self:T(self.lid.."AddSubType") +self.TaskSubType=Type +return self +end +function PLAYERTASK:GetSubType() +self:T(self.lid.."GetSubType") +return self.TaskSubType +end +function PLAYERTASK:GetFreetext() +self:T(self.lid.."GetFreetext") +return self.Freetext or self.FreetextTTS or"No Details" +end +function PLAYERTASK:AddFreetextTTS(TextTTS) +self:T(self.lid.."AddFreetextTTS") +self.FreetextTTS=TextTTS +return self +end +function PLAYERTASK:GetFreetextTTS() +self:T(self.lid.."GetFreetextTTS") +return self.FreetextTTS or self.Freetext or"No Details" +end +function PLAYERTASK:SetMenuName(Text) +self:T(self.lid.."SetMenuName") +self.Target.name=Text +return self +end +function PLAYERTASK:AddStaticObjectSuccessCondition() +local task=self +task:AddConditionSuccess( +function(target) +if target==nil then return false end +local isDead=false +if target:IsInstanceOf("STATIC") +or target:IsInstanceOf("SCENERY") +or target:IsInstanceOf("SET_SCENERY")then +isDead=(not target)or target:GetLife()<1 or target:GetLife()<0.2*target:GetLife0() +elseif target:IsInstanceOf("SET_STATIC")then +local deadCount=0 +target:ForEachStatic(function(static) +if static:GetLife()<1 or static:GetLife()<0.2*static:GetLife0()then +deadCount=deadCount+1 +end +end) +if deadCount==target:Count()then +isDead=true +end +end +return isDead +end,task:GetTarget() +) +return self +end +function PLAYERTASK:AddOpsZoneCaptureSuccessCondition(CaptureSquadGroupNamePrefix,Coalition,CheckClientInZone) +local task=self +task:AddConditionSuccess( +function(target) +if target:IsInstanceOf("OPSZONE")then +return task:_CheckCaptureOpsZoneSuccess(target,CaptureSquadGroupNamePrefix,Coalition,CheckClientInZone or true) +elseif target:IsInstanceOf("SET_OPSZONE")then +local successes=0 +local isClientInZone=false +target:ForEachZone(function(opszone) +if task:_CheckCaptureOpsZoneSuccess(opszone,CaptureSquadGroupNamePrefix,Coalition,CheckClientInZone or true)then +successes=successes+1 +end +for _,client in ipairs(task:GetClientObjects())do +local clientCoord=client:GetCoordinate() +if opszone.zone:IsCoordinateInZone(clientCoord)then +isClientInZone=true +break +end +end +end) +return successes==target:Count()and isClientInZone +end +return false +end,task:GetTarget() +) +return self +end +function PLAYERTASK:AddReconSuccessCondition(MinDistance) +local task=self +task:AddConditionSuccess( +function(target) +local targetLocation=target:GetCoordinate() +local minD=MinDistance or UTILS.NMToMeters(5) +for _,client in ipairs(task:GetClientObjects())do +local clientCoord=client:GetCoordinate() +local distance=clientCoord:Get2DDistance(targetLocation) +local isLos=land.isVisible(clientCoord:GetVec3(),targetLocation:GetVec3()) +if distance<minD and isLos then +return true +end +end +return false +end,task:GetTarget()) +return self +end +function PLAYERTASK:AddTimeLimitFailureCondition(TimeLimit) +local task=self +TimeLimit=TimeLimit or 0 +task.StartTime=-1 +task:AddConditionFailure( +function() +if task.StartTime==-1 then +task.StartTime=timer.getTime() +end +return TimeLimit>0 and timer.getTime()-task.StartTime>TimeLimit +end) +return self +end +function PLAYERTASK:AddNextTaskAfterSuccess(Task) +self:T(self.lid.."AddNextTaskAfterSuccess") +table.insert(self.NextTaskSuccess,Task) +return self +end +function PLAYERTASK:AddNextTaskAfterFailure(Task) +self:T(self.lid.."AddNextTaskAfterFailure") +table.insert(self.NextTaskFailure,Task) +return self +end +function PLAYERTASK:IsDone() +self:T(self.lid.."IsDone?") +local IsDone=false +local state=self:GetState() +if state=="Done"or state=="Stopped"then +IsDone=true +end +return IsDone +end +function PLAYERTASK:IsNotDone() +self:T(self.lid.."IsNotDone?") +local IsNotDone=not self:IsDone() +return IsNotDone +end +function PLAYERTASK:HasClients() +self:T(self.lid.."HasClients?") +local hasclients=self:CountClients()>0 and true or false +return hasclients +end +function PLAYERTASK:GetClients() +self:T(self.lid.."GetClients") +local clientlist=self.Clients:GetIDStackSorted()or{} +local count=self.Clients:Count() +return clientlist,count +end +function PLAYERTASK:GetClientObjects() +self:T(self.lid.."GetClientObjects") +local clientlist=self.Clients:GetDataTable()or{} +local count=self.Clients:Count() +return clientlist,count +end +function PLAYERTASK:CountClients() +self:T(self.lid.."CountClients") +return self.Clients:Count() +end +function PLAYERTASK:HasPlayerName(Name) +self:T(self.lid.."HasPlayerName?") +return self.Clients:HasUniqueID(Name) +end +function PLAYERTASK:AddClient(Client) +self:T(self.lid.."AddClient") +local name=Client:GetPlayerName() +if not self.Clients:HasUniqueID(name)then +self.Clients:Push(Client,name) +self:__ClientAdded(-2,Client) +end +if self.TaskController and self.TaskController.Scoring then +self.TaskController.Scoring:_AddPlayerFromUnit(Client) +end +return self +end +function PLAYERTASK:RemoveClient(Client,Name) +self:T(self.lid.."RemoveClient") +local name=Name or Client:GetPlayerName() +if self.Clients:HasUniqueID(name)then +self.Clients:PullByID(name) +if self.verbose then +self.Clients:Flush() +end +self:__ClientRemoved(-2,Client) +if self.Clients:Count()==0 then +self:__Failed(-1) +end +end +return self +end +function PLAYERTASK:ClientAbort(Client) +self:T(self.lid.."ClientAbort") +if Client and Client:IsAlive()then +self:RemoveClient(Client) +self:__ClientAborted(-1,Client) +return self +else +if self.Clients:Count()==0 then +self:__Failed(-1) +end +end +return self +end +function PLAYERTASK:MarkTargetOnF10Map(Text,Coalition,ReadOnly) +self:T(self.lid.."MarkTargetOnF10Map") +if self.Target then +local coordinate=self.Target:GetCoordinate() +if coordinate then +if self.TargetMarker then +self.TargetMarker:Remove() +end +local text=Text or("Target of "..self.lid) +self.TargetMarker=MARKER:New(coordinate,text) +if ReadOnly then +self.TargetMarker:ReadOnly() +end +if Coalition then +self.TargetMarker:ToCoalition(Coalition) +else +self.TargetMarker:ToAll() +end +end +end +return self +end +function PLAYERTASK:SmokeTarget(Color) +self:T(self.lid.."SmokeTarget") +local color=Color or SMOKECOLOR.Red +if not self.lastsmoketime then self.lastsmoketime=0 end +local TDiff=timer.getAbsTime()-self.lastsmoketime +if self.Target and TDiff>299 then +local coordinate=self.Target:GetAverageCoordinate() +if coordinate then +coordinate:Smoke(color) +self.lastsmoketime=timer.getAbsTime() +end +end +return self +end +function PLAYERTASK:FlareTarget(Color) +self:T(self.lid.."SmokeTarget") +local color=Color or FLARECOLOR.Red +if self.Target then +local coordinate=self.Target:GetAverageCoordinate() +if coordinate then +coordinate:Flare(color,0) +end +end +return self +end +function PLAYERTASK:IlluminateTarget(Power,Height) +self:T(self.lid.."IlluminateTarget") +local Power=Power or 1000 +local Height=Height or 150 +if self.Target then +local coordinate=self.Target:GetAverageCoordinate() +if coordinate then +local bcoord=COORDINATE:NewFromVec2(coordinate:GetVec2(),Height) +bcoord:IlluminationBomb(Power) +end +end +return self +end +function PLAYERTASK:AddConditionSuccess(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionSuccess,condition) +return self +end +function PLAYERTASK:AddConditionFailure(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionFailure,condition) +return self +end +function PLAYERTASK:_EvalConditionsAny(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if istrue then +return true +end +end +return false +end +function PLAYERTASK:onafterStatus(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid.."onafterStatus") +local status=self:GetState() +if status=="Stopped"then return self end +if self.TargetMarker then +local coordinate=self.Target:GetCoordinate() +self.TargetMarker:UpdateCoordinate(coordinate,0.5) +end +local targetdead=false +if self.Type~=AUFTRAG.Type.CTLD and self.Type~=AUFTRAG.Type.CSAR then +if self.Target:IsDead()or self.Target:IsDestroyed()or self.Target:CountTargets()==0 then +targetdead=true +self:__Success(-2) +status="Success" +return self +end +end +local clientsalive=false +if status=="Executing"then +local ClientTable=self.Clients:GetDataTable() +for _,_client in pairs(ClientTable)do +local client=_client +if client:IsAlive()then +clientsalive=true +end +end +if status=="Executing"and(not clientsalive)and(not targetdead)then +self:__Failed(-2) +status="Failed" +end +end +if status~="Done"and status~="Stopped"then +local successCondition=self:_EvalConditionsAny(self.conditionSuccess) +local failureCondition=self:_EvalConditionsAny(self.conditionFailure) +if failureCondition and status~="Failed"then +self:__Failed(-2) +status="Failed" +elseif successCondition then +self:__Success(-2) +status="Success" +end +if status~="Failed"and status~="Success"then +local targetcount=self.Target:CountTargets() +if targetcount<self.PreviousCount then +self:__Progress(-2,targetcount) +self.PreviousCount=targetcount +end +end +if self.verbose then +self:I(self.lid.."Target dead: "..tostring(targetdead).." | Clients alive: "..tostring(clientsalive)) +end +self:__Status(-20) +elseif status~="Stopped"then +self:__Stop(-1) +end +return self +end +function PLAYERTASK:onafterProgress(From,Event,To,TargetCount) +self:T({From,Event,To}) +if self.TaskController then +if self.TaskController.Scoring then +local clients,count=self:GetClientObjects() +if count>0 then +for _,_client in pairs(clients)do +self.TaskController.Scoring:AddGoalScore(_client,self.Type,nil,10) +end +end +end +self.TaskController:__TaskProgress(-1,self,TargetCount) +end +return self +end +function PLAYERTASK:onafterPlanned(From,Event,To) +self:T({From,Event,To}) +self.timestamp=timer.getAbsTime() +return self +end +function PLAYERTASK:onafterRequested(From,Event,To) +self:T({From,Event,To}) +self.timestamp=timer.getAbsTime() +return self +end +function PLAYERTASK:onafterExecuting(From,Event,To) +self:T({From,Event,To}) +self.timestamp=timer.getAbsTime() +return self +end +function PLAYERTASK:onafterStop(From,Event,To) +self:T({From,Event,To}) +self.timestamp=timer.getAbsTime() +return self +end +function PLAYERTASK:onafterClientAdded(From,Event,To,Client) +self:T({From,Event,To}) +if Client and self.verbose then +local text=string.format("Player %s joined task %03d!",Client:GetPlayerName()or"Generic",self.PlayerTaskNr) +self:T(self.lid..text) +end +self.timestamp=timer.getAbsTime() +return self +end +function PLAYERTASK:onafterDone(From,Event,To) +self:T({From,Event,To}) +if self.TaskController then +self.TaskController:__TaskDone(-1,self) +end +self.timestamp=timer.getAbsTime() +self:__Stop(-1) +return self +end +function PLAYERTASK:onafterCancel(From,Event,To) +self:T({From,Event,To}) +if self.TaskController then +self.TaskController:__TaskCancelled(-1,self) +end +self.timestamp=timer.getAbsTime() +self.FinalState="Cancelled" +self:__Done(-1) +return self +end +function PLAYERTASK:onafterSuccess(From,Event,To) +self:T({From,Event,To}) +if self.TaskController then +self.TaskController:__TaskSuccess(-1,self) +end +if self.TargetMarker then +self.TargetMarker:Remove() +end +if self.TaskController and self.TaskController.Scoring then +local clients,count=self:GetClientObjects() +if count>0 then +for _,_client in pairs(clients)do +local auftrag=self:GetSubType() +self.TaskController.Scoring:AddGoalScore(_client,self.Type,nil,self.TaskController.Scores[self.Type]) +end +end +end +self.timestamp=timer.getAbsTime() +self.FinalState="Success" +self:__Done(-1) +return self +end +function PLAYERTASK:onafterFailed(From,Event,To) +self:T({From,Event,To}) +self.repeats=self.repeats+1 +if self.Repeat and(self.repeats<=self.RepeatNo)then +if self.TaskController then +self.TaskController:__TaskRepeatOnFailed(-1,self) +end +self:__Planned(-1) +return self +else +if self.TargetMarker then +self.TargetMarker:Remove() +end +self.FinalState="Failed" +if self.TaskController then +self.TaskController:__TaskFailed(-1,self) +end +self:__Done(-1.5) +end +if self.TaskController.Scoring then +local clients,count=self:GetClientObjects() +if count>0 then +for _,_client in pairs(clients)do +local auftrag=self:GetSubType() +self.TaskController.Scoring:AddGoalScore(_client,self.Type,nil,-self.TaskController.Scores[self.Type]) +end +end +end +self.timestamp=timer.getAbsTime() +return self +end +end +do +PLAYERTASKCONTROLLER={ +ClassName="PLAYERTASKCONTROLLER", +verbose=false, +lid=nil, +TargetQueue=nil, +ClientSet=nil, +UseGroupNames=true, +PlayerMenu={}, +usecluster=false, +MenuName=nil, +ClusterRadius=0.5, +NoScreenOutput=false, +TargetRadius=500, +UseWhiteList=false, +WhiteList={}, +gettext=nil, +locale="en", +precisionbombing=false, +taskinfomenu=false, +activehasinfomenu=false, +MarkerReadOnly=false, +customcallsigns={}, +ShortCallsign=true, +Keepnumber=false, +CallsignTranslations=nil, +PlayerFlashMenu={}, +PlayerJoinMenu={}, +PlayerInfoMenu={}, +PlayerMenuTag={}, +noflaresmokemenu=false, +illumenu=false, +TransmitOnlyWithPlayers=true, +buddylasing=false, +PlayerRecce=nil, +Coalition=nil, +MenuParent=nil, +ShowMagnetic=true, +InfoHasLLDDM=false, +InfoHasCoordinate=false, +UseTypeNames=false, +Scoring=nil, +MenuNoTask=nil, +InformationMenu=false, +TaskInfoDuration=30, +} +PLAYERTASKCONTROLLER.Type={ +A2A="Air-To-Air", +A2G="Air-To-Ground", +A2S="Air-To-Sea", +A2GS="Air-To-Ground-Sea", +} +AUFTRAG.Type.PRECISIONBOMBING="Precision Bombing" +AUFTRAG.Type.CTLD="Combat Transport" +AUFTRAG.Type.CSAR="Combat Rescue" +AUFTRAG.Type.CONQUER="Conquer" +PLAYERTASKCONTROLLER.Scores={ +[AUFTRAG.Type.PRECISIONBOMBING]=100, +[AUFTRAG.Type.CTLD]=100, +[AUFTRAG.Type.CSAR]=100, +[AUFTRAG.Type.INTERCEPT]=100, +[AUFTRAG.Type.ANTISHIP]=100, +[AUFTRAG.Type.CAS]=100, +[AUFTRAG.Type.BAI]=100, +[AUFTRAG.Type.SEAD]=100, +[AUFTRAG.Type.BOMBING]=100, +[AUFTRAG.Type.BOMBRUNWAY]=100, +[AUFTRAG.Type.CONQUER]=100, +[AUFTRAG.Type.RECON]=100, +[AUFTRAG.Type.ESCORT]=100, +[AUFTRAG.Type.CAP]=100, +[AUFTRAG.Type.CAPTUREZONE]=100, +} +PLAYERTASKCONTROLLER.SeadAttributes={ +SAM=GROUP.Attribute.GROUND_SAM, +AAA=GROUP.Attribute.GROUND_AAA, +EWR=GROUP.Attribute.GROUND_EWR, +} +PLAYERTASKCONTROLLER.Messages={ +EN={ +TASKABORT="Task aborted!", +NOACTIVETASK="No active task!", +FREQUENCIES="frequencies ", +FREQUENCY="frequency %.3f", +BROADCAST="%s, %s, switch to %s for task assignment!", +CASTTS="close air support", +SEADTTS="suppress air defense", +BOMBTTS="bombing", +PRECBOMBTTS="precision bombing", +BAITTS="battle field air interdiction", +ANTISHIPTTS="anti-ship", +INTERCEPTTS="intercept", +BOMBRUNWAYTTS="bomb runway", +HAVEACTIVETASK="You already have one active task! Complete it first!", +PILOTJOINEDTASK="%s, %s. You have been assigned %s task %03d", +TASKNAME="%s Task ID %03d", +TASKNAMETTS="%s Task ID %03d", +THREATHIGH="high", +THREATMEDIUM="medium", +THREATLOW="low", +THREATTEXT="%s\nThreat: %s\nTargets left: %d\nCoord: %s", +ELEVATION="\nTarget Elevation: %s %s", +METER="meter", +FEET="feet", +THREATTEXTTTS="%s, %s. Target information for %s. Threat level %s. Targets left %d. Target location %s.", +MARKTASK="%s, %s, copy, task %03d location marked on map!", +SMOKETASK="%s, %s, copy, task %03d location smoked!", +FLARETASK="%s, %s, copy, task %03d location illuminated!", +ABORTTASK="All stations, %s, %s has aborted %s task %03d!", +UNKNOWN="Unknown", +MENUTASKING=" Tasking ", +MENUACTIVE="Active Task", +MENUINFO="Info", +MENUMARK="Mark on map", +MENUSMOKE="Smoke", +MENUFLARE="Flare", +MENUILLU="Illuminate", +MENUABORT="Abort", +MENUJOIN="Join Task", +MENUTASKINFO="Task Info", +MENUTASKNO="TaskNo", +MENUNOTASKS="Currently no tasks available.", +TASKCANCELLED="Task #%03d %s is cancelled!", +TASKCANCELLEDTTS="%s, task %03d %s is cancelled!", +TASKSUCCESS="Task #%03d %s completed successfully!", +TASKSUCCESSTTS="%s, task %03d %s completed successfully!", +TASKFAILED="Task #%03d %s was a failure!", +TASKFAILEDTTS="%s, task %03d %s was a failure!", +TASKFAILEDREPLAN="Task #%03d %s available for reassignment!", +TASKFAILEDREPLANTTS="%s, task %03d %s vailable for reassignment!", +TASKADDED="%s has a new %s task available!", +PILOTS="\nPilot(s): ", +PILOTSTTS=". Pilot(s): ", +YES="Yes", +NO="No", +NONE="None", +POINTEROVERTARGET="%s, %s, pointer in reach for task %03d, lasing!", +POINTERTARGETREPORT="\nPointer in reach: %s\nLasing: %s", +RECCETARGETREPORT="\nRecce %s in reach: %s\nLasing: %s", +POINTERTARGETLASINGTTS=". Pointer in reach and lasing.", +TARGET="Target", +FLASHON="%s - Flashing directions is now ON!", +FLASHOFF="%s - Flashing directions is now OFF!", +FLASHMENU="Flash Directions Switch", +BRIEFING="Briefing", +TARGETLOCATION="Target location", +COORDINATE="Coordinate", +INFANTRY="Infantry", +TECHNICAL="Technical", +ARTILLERY="Artillery", +TANKS="Tanks", +AIRDEFENSE="Airdefense", +SAM="SAM", +GROUP="Group", +UNARMEDSHIP="Merchant", +LIGHTARMEDSHIP="Light Boat", +CORVETTE="Corvette", +FRIGATE="Frigate", +CRUISER="Cruiser", +DESTROYER="Destroyer", +CARRIER="Aircraft Carrier", +RADIOS="Radios", +}, +DE={ +TASKABORT="Auftrag abgebrochen!", +NOACTIVETASK="Kein aktiver Auftrag!", +FREQUENCIES="Frequenzen ", +FREQUENCY="Frequenz %.3f", +BROADCAST="%s, %s, Radio %s für Aufgabenzuteilung!", +CASTTS="Nahbereichsunterstützung", +SEADTTS="Luftabwehr ausschalten", +BOMBTTS="Bombardieren", +PRECBOMBTTS="Präzisionsbombardieren", +BAITTS="Luftunterstützung", +ANTISHIPTTS="Anti-Schiff", +INTERCEPTTS="Abfangen", +BOMBRUNWAYTTS="Startbahn Bombardieren", +HAVEACTIVETASK="Du hast einen aktiven Auftrag! Beende ihn zuerst!", +PILOTJOINEDTASK="%s, %s hat Auftrag %s %03d angenommen", +TASKNAME="%s Auftrag ID %03d", +TASKNAMETTS="%s Auftrag ID %03d", +THREATHIGH="hoch", +THREATMEDIUM="mittel", +THREATLOW="niedrig", +THREATTEXT="%s\nGefahrstufe: %s\nZiele: %d\nKoord: %s", +ELEVATION="\nZiel Höhe: %s %s", +METER="Meter", +FEET="Fuss", +THREATTEXTTTS="%s, %s. Zielinformation zu %s. Gefahrstufe %s. Ziele %d. Zielposition %s.", +MARKTASK="%s, %s, verstanden, Zielposition %03d auf der Karte markiert!", +SMOKETASK="%s, %s, verstanden, Zielposition %03d mit Rauch markiert!", +FLARETASK="%s, %s, verstanden, Zielposition %03d beleuchtet!", +ABORTTASK="%s, an alle, %s hat Auftrag %s %03d abgebrochen!", +UNKNOWN="Unbekannt", +MENUTASKING=" Aufträge ", +MENUACTIVE="Aktiver Auftrag", +MENUINFO="Information", +MENUMARK="Kartenmarkierung", +MENUSMOKE="Rauchgranate", +MENUFLARE="Leuchtgranate", +MENUILLU="Feldbeleuchtung", +MENUABORT="Abbrechen", +MENUJOIN="Auftrag annehmen", +MENUTASKINFO="Auftrag Briefing", +MENUTASKNO="AuftragsNr", +MENUNOTASKS="Momentan keine Aufträge verfügbar.", +TASKCANCELLED="Auftrag #%03d %s wurde beendet!", +TASKCANCELLEDTTS="%s, Auftrag %03d %s wurde beendet!", +TASKSUCCESS="Auftrag #%03d %s erfolgreich!", +TASKSUCCESSTTS="%s, Auftrag %03d %s erfolgreich!", +TASKFAILED="Auftrag #%03d %s gescheitert!", +TASKFAILEDTTS="%s, Auftrag %03d %s gescheitert!", +TASKFAILEDREPLAN="Auftrag #%03d %s gescheitert! Neuplanung!", +TASKFAILEDREPLANTTS="%s, Auftrag %03d %s gescheitert! Neuplanung!", +TASKADDED="%s hat einen neuen Auftrag %s erstellt!", +PILOTS="\nPilot(en): ", +PILOTSTTS=". Pilot(en): ", +YES="Ja", +NO="Nein", +NONE="Keine", +POINTEROVERTARGET="%s, %s, Marker im Zielbereich für %03d, Laser an!", +POINTERTARGETREPORT="\nMarker im Zielbereich: %s\nLaser an: %s", +RECCETARGETREPORT="\nSpäher % im Zielbereich: %s\nLasing: %s", +POINTERTARGETLASINGTTS=". Marker im Zielbereich, Laser is an.", +TARGET="Ziel", +FLASHON="%s - Richtungsangaben einblenden ist EIN!", +FLASHOFF="%s - Richtungsangaben einblenden ist AUS!", +FLASHMENU="Richtungsangaben Schalter", +BRIEFING="Briefing", +TARGETLOCATION="Zielposition", +COORDINATE="Koordinate", +INFANTRY="Infantrie", +TECHNICAL="Technische", +ARTILLERY="Artillerie", +TANKS="Panzer", +AIRDEFENSE="Flak", +SAM="Luftabwehr", +GROUP="Einheit", +UNARMEDSHIP="Handelsschiff", +LIGHTARMEDSHIP="Tender", +CORVETTE="Korvette", +FRIGATE="Fregatte", +CRUISER="Kreuzer", +DESTROYER="Zerstörer", +CARRIER="Flugzeugträger", +RADIOS="Frequenzen", +}, +} +PLAYERTASKCONTROLLER.version="0.1.70" +function PLAYERTASKCONTROLLER:New(Name,Coalition,Type,ClientFilter) +local self=BASE:Inherit(self,FSM:New()) +self.Name=Name or"CentCom" +self.Coalition=Coalition or coalition.side.BLUE +self.CoalitionName=UTILS.GetCoalitionName(Coalition) +self.Type=Type or PLAYERTASKCONTROLLER.Type.A2G +self.usecluster=false +if self.Type==PLAYERTASKCONTROLLER.Type.A2A then +self.usecluster=true +end +self.ClusterRadius=0.5 +self.TargetRadius=500 +self.ClientFilter=ClientFilter +self.TargetQueue=FIFO:New() +self.TaskQueue=FIFO:New() +self.TasksPerPlayer=FIFO:New() +self.PrecisionTasks=FIFO:New() +self.LasingDroneSet=SET_OPSGROUP:New() +self.FlashPlayer={} +self.AllowFlash=false +self.lasttaskcount=0 +self.taskinfomenu=false +self.activehasinfomenu=false +self.MenuName=nil +self.menuitemlimit=6 +self.holdmenutime=30 +self.MarkerReadOnly=false +self.repeatonfailed=true +self.repeattimes=5 +self.UseGroupNames=true +self.customcallsigns={} +self.ShortCallsign=true +self.Keepnumber=false +self.CallsignTranslations=nil +self.noflaresmokemenu=false +self.illumenu=false +self.ShowMagnetic=true +self.UseTypeNames=false +self.InformationMenu=false +self.TaskInfoDuration=30 +self.IsClientSet=false +if ClientFilter and type(ClientFilter)=="table"and ClientFilter.ClassName and ClientFilter.ClassName=="SET_CLIENT"then +self.ClientSet=ClientFilter +self.IsClientSet=true +end +if ClientFilter and not self.IsClientSet then +self.ClientSet=SET_CLIENT:New():FilterCoalitions(string.lower(self.CoalitionName)):FilterActive(true):FilterPrefixes(ClientFilter):FilterStart() +elseif not self.IsClientSet then +self.ClientSet=SET_CLIENT:New():FilterCoalitions(string.lower(self.CoalitionName)):FilterActive(true):FilterStart() +end +self.ActiveClientSet=SET_CLIENT:New() +self.lid=string.format("PlayerTaskController %s %s | ",self.Name,tostring(self.Type)) +self:_InitLocalization() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","TaskAdded","*") +self:AddTransition("*","TaskDone","*") +self:AddTransition("*","TaskCancelled","*") +self:AddTransition("*","TaskSuccess","*") +self:AddTransition("*","TaskFailed","*") +self:AddTransition("*","TaskProgress","*") +self:AddTransition("*","TaskTargetSmoked","*") +self:AddTransition("*","TaskTargetFlared","*") +self:AddTransition("*","TaskTargetIlluminated","*") +self:AddTransition("*","TaskRepeatOnFailed","*") +self:AddTransition("*","PlayerJoinedTask","*") +self:AddTransition("*","PlayerAbortedTask","*") +self:AddTransition("*","Stop","Stopped") +self:__Start(2) +local starttime=math.random(5,10) +self:__Status(starttime) +self:I(self.lid..self.version.." Started.") +return self +end +function PLAYERTASKCONTROLLER:EnableScoring(Scoring) +self.Scoring=Scoring or SCORING:New(self.Name) +return self +end +function PLAYERTASKCONTROLLER:DisableScoring() +self.Scoring=nil +return self +end +function PLAYERTASKCONTROLLER:_InitLocalization() +self:T(self.lid.."_InitLocalization") +self.gettext=TEXTANDSOUND:New("PLAYERTASKCONTROLLER","en") +self.locale="en" +for locale,table in pairs(self.Messages)do +local Locale=string.lower(tostring(locale)) +self:T("**** Adding locale: "..Locale) +for ID,Text in pairs(table)do +self:T(string.format('Adding ID %s',tostring(ID))) +self.gettext:AddEntry(Locale,tostring(ID),Text) +end +end +return self +end +function PLAYERTASKCONTROLLER:SetEnableUseTypeNames() +self:T(self.lid.."SetEnableUseTypeNames") +self.UseTypeNames=true +return self +end +function PLAYERTASKCONTROLLER:SetDisableUseTypeNames() +self:T(self.lid.."SetDisableUseTypeNames") +self.UseTypeNames=false +return self +end +function PLAYERTASKCONTROLLER:SetAllowFlashDirection(OnOff) +self:T(self.lid.."SetAllowFlashDirection") +self.AllowFlash=OnOff +return self +end +function PLAYERTASKCONTROLLER:SetShowRadioInfoMenu(OnOff) +self:T(self.lid.."SetAllowRadioInfoMenu") +self.InformationMenu=OnOff +return self +end +function PLAYERTASKCONTROLLER:SetDisableSmokeFlareTask() +self:T(self.lid.."SetDisableSmokeFlareTask") +self.noflaresmokemenu=true +return self +end +function PLAYERTASKCONTROLLER:SetTransmitOnlyWithPlayers(Switch) +self.TransmitOnlyWithPlayers=Switch +if self.SRSQueue then +self.SRSQueue:SetTransmitOnlyWithPlayers(Switch) +end +return self +end +function PLAYERTASKCONTROLLER:SetEnableSmokeFlareTask() +self:T(self.lid.."SetEnableSmokeFlareTask") +self.noflaresmokemenu=false +return self +end +function PLAYERTASKCONTROLLER:SetEnableIlluminateTask() +self:T(self.lid.."SetEnableSmokeFlareTask") +self.illumenu=true +return self +end +function PLAYERTASKCONTROLLER:SetDisableIlluminateTask() +self:T(self.lid.."SetDisableIlluminateTask") +self.illumenu=false +return self +end +function PLAYERTASKCONTROLLER:SetInfoShowsCoordinate(OnOff,LLDDM) +self:T(self.lid.."SetInfoShowsCoordinate") +self.InfoHasCoordinate=OnOff +self.InfoHasLLDDM=LLDDM +return self +end +function PLAYERTASKCONTROLLER:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations,CallsignCustomFunc,...) +if not ShortCallsign or ShortCallsign==false then +self.ShortCallsign=false +else +self.ShortCallsign=true +end +self.Keepnumber=Keepnumber or false +self.CallsignTranslations=CallsignTranslations +self.CallsignCustomFunc=CallsignCustomFunc +self.CallsignCustomArgs=arg or{} +return self +end +function PLAYERTASKCONTROLLER:_GetTextForSpeech(text) +self:T(self.lid.."_GetTextForSpeech") +text=string.gsub(text,"%d","%1 ") +text=string.gsub(text,"^%s*","") +text=string.gsub(text,"%s*$","") +text=string.gsub(text," "," ") +return text +end +function PLAYERTASKCONTROLLER:SetTaskRepetition(OnOff,Repeats) +self:T(self.lid.."SetTaskRepetition") +if OnOff then +self.repeatonfailed=true +self.repeattimes=Repeats or 5 +else +self.repeatonfailed=false +self.repeattimes=Repeats or 5 +end +return self +end +function PLAYERTASKCONTROLLER:SetBriefingDuration(Seconds) +self:T(self.lid.."SetBriefingDuration") +self.TaskInfoDuration=Seconds or 30 +return self +end +function PLAYERTASKCONTROLLER:_SendMessageToClients(Text,Seconds) +self:T(self.lid.."_SendMessageToClients") +local seconds=Seconds or 10 +self.ClientSet:ForEachClient( +function(Client) +if Client~=nil and Client:IsActive()then +local m=MESSAGE:New(Text,seconds,"Tasking"):ToClient(Client) +end +end +) +return self +end +function PLAYERTASKCONTROLLER:EnablePrecisionBombing(FlightGroup,LaserCode,HoldingPoint,Alt,Speed,MaxTravelDist) +self:T(self.lid.."EnablePrecisionBombing") +if not self.LasingDroneSet then +self.LasingDroneSet=SET_OPSGROUP:New() +end +local LasingDrone +if FlightGroup then +if FlightGroup.ClassName and(FlightGroup.ClassName=="FLIGHTGROUP"or FlightGroup.ClassName=="ARMYGROUP")then +LasingDrone=FlightGroup +self.precisionbombing=true +LasingDrone.playertask={} +LasingDrone.playertask.id=0 +LasingDrone.playertask.busy=false +LasingDrone.playertask.lasercode=LaserCode or 1688 +LasingDrone:SetLaser(LasingDrone.playertask.lasercode) +LasingDrone.playertask.template=LasingDrone:_GetTemplate(true) +LasingDrone.playertask.alt=Alt or 10000 +LasingDrone.playertask.speed=Speed or 120 +LasingDrone.playertask.maxtravel=UTILS.NMToMeters(MaxTravelDist or 50) +if LasingDrone:IsFlightgroup()then +local BullsCoordinate=COORDINATE:NewFromVec3(coalition.getMainRefPoint(self.Coalition)) +if HoldingPoint then BullsCoordinate=HoldingPoint end +local Orbit=AUFTRAG:NewORBIT_CIRCLE(BullsCoordinate,Alt,Speed) +Orbit:SetMissionAltitude(Alt) +LasingDrone:AddMission(Orbit) +elseif LasingDrone:IsArmygroup()then +local BullsCoordinate=COORDINATE:NewFromVec3(coalition.getMainRefPoint(self.Coalition)) +if HoldingPoint then BullsCoordinate=HoldingPoint end +local Orbit=AUFTRAG:NewONGUARD(BullsCoordinate) +LasingDrone:AddMission(Orbit) +end +self.LasingDroneSet:AddObject(FlightGroup) +elseif FlightGroup.ClassName and(FlightGroup.ClassName=="SET_OPSGROUP")then +FlightGroup:ForEachGroup( +function(group) +self:EnablePrecisionBombing(group,LaserCode,HoldingPoint,Alt,Speed,MaxTravelDist) +end +) +else +self:E(self.lid.."No OPSGROUP/SET_OPSGROUP object passed or object is not alive!") +end +else +self.autolase=nil +self.precisionbombing=false +end +return self +end +function PLAYERTASKCONTROLLER:AddPrecisionBombingOpsGroup(FlightGroup,LaserCode,HoldingPoint,Alt,Speed) +self:EnablePrecisionBombing(FlightGroup,LaserCode,HoldingPoint,Alt,Speed) +return self +end +function PLAYERTASKCONTROLLER:EnableBuddyLasing(Recce) +self:T(self.lid.."EnableBuddyLasing") +self.buddylasing=true +self.PlayerRecce=Recce +return self +end +function PLAYERTASKCONTROLLER:DisableBuddyLasing() +self:T(self.lid.."DisableBuddyLasing") +self.buddylasing=false +return self +end +function PLAYERTASKCONTROLLER:EnableMarkerOps(Tag) +self:T(self.lid.."EnableMarkerOps") +local tag=Tag or"TASK" +local MarkerOps=MARKEROPS_BASE:New(tag,{"Name","Text"},true) +local function Handler(Keywords,Coord,Text) +if self.verbose then +local m=MESSAGE:New(string.format("Target added from marker at: %s",Coord:ToStringA2G(nil,nil,self.ShowMagnetic)),15,"INFO"):ToAll() +local m=MESSAGE:New(string.format("Text: %s",Text),15,"INFO"):ToAll() +end +local menuname=string.match(Text,"Name=(.+),") +local freetext=string.match(Text,"Text=(.+)") +if menuname then +Coord.menuname=menuname +if freetext then +Coord.freetext=freetext +end +end +self:AddTarget(Coord) +end +function MarkerOps:OnAfterMarkAdded(From,Event,To,Text,Keywords,Coord) +Handler(Keywords,Coord,Text) +end +function MarkerOps:OnAfterMarkChanged(From,Event,To,Text,Keywords,Coord) +Handler(Keywords,Coord,Text) +end +self.MarkerOps=MarkerOps +return self +end +function PLAYERTASKCONTROLLER:_GetPlayerName(Client) +self:T(self.lid.."_GetPlayerName") +local playername=Client:GetPlayerName() +local ttsplayername=nil +if not self.customcallsigns[playername]then +local playergroup=Client:GetGroup() +if playergroup~=nil then +ttsplayername=playergroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local newplayername=self:_GetTextForSpeech(ttsplayername) +self.customcallsigns[playername]=newplayername +ttsplayername=newplayername +end +else +ttsplayername=self.customcallsigns[playername] +end +return playername,ttsplayername +end +function PLAYERTASKCONTROLLER:DisablePrecisionBombing(FlightGroup,LaserCode) +self:T(self.lid.."DisablePrecisionBombing") +self.autolase=nil +self.precisionbombing=false +return self +end +function PLAYERTASKCONTROLLER:EnableTaskInfoMenu() +self:T(self.lid.."EnableTaskInfoMenu") +self.taskinfomenu=true +return self +end +function PLAYERTASKCONTROLLER:DisableTaskInfoMenu() +self:T(self.lid.."DisableTaskInfoMenu") +self.taskinfomenu=false +return self +end +function PLAYERTASKCONTROLLER:SetMenuOptions(InfoMenu,ItemLimit,HoldTime) +self:T(self.lid.."SetMenuOptions") +self.activehasinfomenu=InfoMenu or false +if self.activehasinfomenu then +self:EnableTaskInfoMenu() +end +self.menuitemlimit=ItemLimit+1 or 6 +self.holdmenutime=HoldTime or 30 +return self +end +function PLAYERTASKCONTROLLER:SetMarkerReadOnly() +self:T(self.lid.."SetMarkerReadOnly") +self.MarkerReadOnly=true +return self +end +function PLAYERTASKCONTROLLER:SetMarkerDeleteable() +self:T(self.lid.."SetMarkerDeleteable") +self.MarkerReadOnly=false +return self +end +function PLAYERTASKCONTROLLER:_EventHandler(EventData) +self:T(self.lid.."_EventHandler: "..EventData.id) +if EventData.id==EVENTS.UnitLost or EventData.id==EVENTS.PlayerLeaveUnit or EventData.id==EVENTS.Ejection or EventData.id==EVENTS.Crash or EventData.id==EVENTS.PilotDead then +if EventData.IniPlayerName then +self:T(self.lid.."Event for player: "..EventData.IniPlayerName) +local text="" +if self.TasksPerPlayer:HasUniqueID(EventData.IniPlayerName)then +local task=self.TasksPerPlayer:PullByID(EventData.IniPlayerName) +local Client=_DATABASE:FindClient(EventData.IniPlayerName) +if Client then +task:RemoveClient(Client) +text=self.gettext:GetEntry("TASKABORT",self.locale) +self.ActiveTaskMenuTemplate:ResetMenu(Client) +self.JoinTaskMenuTemplate:ResetMenu(Client) +else +task:RemoveClient(nil,EventData.IniPlayerName) +text=self.gettext:GetEntry("TASKABORT",self.locale) +end +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +self:T(self.lid..text) +end +elseif EventData.id==EVENTS.PlayerEnterAircraft and EventData.IniCoalition==self.Coalition then +if EventData.IniPlayerName and EventData.IniGroup then +if self.IsClientSet and(not self.ClientSet:IsIncludeObject(CLIENT:FindByName(EventData.IniUnitName)))then +self:T(self.lid.."Client not in SET: "..EventData.IniPlayerName) +return self +end +self:T(self.lid.."Event for player: "..EventData.IniPlayerName) +if self.UseSRS then +local frequency=self.Frequency +local freqtext="" +if type(frequency)=="table"then +freqtext=self.gettext:GetEntry("FREQUENCIES",self.locale) +freqtext=freqtext..table.concat(frequency,", ") +else +local freqt=self.gettext:GetEntry("FREQUENCY",self.locale) +freqtext=string.format(freqt,frequency) +end +local modulation=self.Modulation +if type(modulation)=="table"then modulation=modulation[1]end +modulation=UTILS.GetModulationName(modulation) +local switchtext=self.gettext:GetEntry("BROADCAST",self.locale) +local playername=EventData.IniPlayerName +if EventData.IniGroup then +if self.customcallsigns[playername]then +self.customcallsigns[playername]=nil +end +playername=EventData.IniGroup:GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +end +playername=self:_GetTextForSpeech(playername) +local text=string.format(switchtext,playername,self.MenuName or self.Name,freqtext) +self.SRSQueue:NewTransmission(text,nil,self.SRS,timer.getAbsTime()+60,2,{EventData.IniGroup},text,30,self.BCFrequency,self.BCModulation) +end +if EventData.IniPlayerName then +local player=_DATABASE:FindClient(EventData.IniUnitName) +self:_SwitchMenuForClient(player,"Info") +end +end +end +return self +end +function PLAYERTASKCONTROLLER:SetLocale(Locale) +self:T(self.lid.."SetLocale") +self.locale=Locale or"en" +return self +end +function PLAYERTASKCONTROLLER:SuppressScreenOutput(OnOff) +self:T(self.lid.."SuppressScreenOutput") +self.NoScreenOutput=OnOff or false +return self +end +function PLAYERTASKCONTROLLER:SetTargetRadius(Radius) +self:T(self.lid.."SetTargetRadius") +self.TargetRadius=Radius or 500 +return self +end +function PLAYERTASKCONTROLLER:SetClusterRadius(Radius) +self:T(self.lid.."SetClusterRadius") +self.ClusterRadius=Radius or 0.5 +self.usecluster=true +return self +end +function PLAYERTASKCONTROLLER:CancelTask(Task) +self:T(self.lid.."CancelTask") +Task:__Cancel(-1) +return self +end +function PLAYERTASKCONTROLLER:SwitchUseGroupNames(OnOff) +self:T(self.lid.."SwitchUseGroupNames") +if OnOff then +self.UseGroupNames=true +else +self.UseGroupNames=false +end +return self +end +function PLAYERTASKCONTROLLER:SwitchMagenticAngles(OnOff) +self:T(self.lid.."SwitchMagenticAngles") +if OnOff then +self.ShowMagnetic=true +else +self.ShowMagnetic=false +end +return self +end +function PLAYERTASKCONTROLLER:_GetAvailableTaskTypes() +self:T(self.lid.."_GetAvailableTaskTypes") +local tasktypes={} +self.TaskQueue:ForEach( +function(Task) +local task=Task +local type=Task.Type +tasktypes[type]={} +end +) +return tasktypes +end +function PLAYERTASKCONTROLLER:_GetTasksPerType() +self:T(self.lid.."_GetTasksPerType") +local tasktypes=self:_GetAvailableTaskTypes() +local datatable=self.TaskQueue:GetDataTable() +local threattable={} +for _,_task in pairs(datatable)do +local task=_task +local threat=task.Target:GetThreatLevelMax() +if not task:IsDone()then +threattable[#threattable+1]={task=task,threat=threat} +end +end +table.sort(threattable,function(k1,k2)return k1.threat>k2.threat end) +for _id,_data in pairs(threattable)do +local threat=_data.threat +local task=_data.task +local type=task.Type +local name=task.Target:GetName() +if not task:IsDone()then +table.insert(tasktypes[type],task) +end +end +return tasktypes +end +function PLAYERTASKCONTROLLER:_CheckTargetQueue() +self:T(self.lid.."_CheckTargetQueue") +if self.TargetQueue:Count()>0 then +local object=self.TargetQueue:Pull() +local target=TARGET:New(object) +if object.menuname then +target.menuname=object.menuname +if object.freetext then +target.freetext=object.freetext +end +end +if object:IsInstanceOf("UNIT")or object:IsInstanceOf("GROUP")then +if self.UseTypeNames and object:IsGround()then +local threat=object:GetThreatLevel() +local typekey="INFANTRY" +if threat==0 or threat==2 then +typekey="TECHNICAL" +elseif threat==3 then +typekey="ARTILLERY" +elseif threat==4 or threat==5 then +typekey="TANKS" +elseif threat==6 or threat==7 then +typekey="AIRDEFENSE" +elseif threat>=8 then +typekey="SAM" +end +local typename=self.gettext:GetEntry(typekey,self.locale) +local gname=self.gettext:GetEntry("GROUP",self.locale) +target.TypeName=string.format("%s %s",typename,gname) +end +if self.UseTypeNames and object:IsShip()then +local threat=object:GetThreatLevel() +local typekey="UNARMEDSHIP" +if threat==1 then +typekey="LIGHTARMEDSHIP" +elseif threat==2 then +typekey="CORVETTE" +elseif threat==3 or threat==4 then +typekey="FRIGATE" +elseif threat==5 or threat==6 then +typekey="CRUISER" +elseif threat==7 or threat==8 then +typekey="DESTROYER" +elseif threat>=9 then +typekey="CARRIER" +end +local typename=self.gettext:GetEntry(typekey,self.locale) +target.TypeName=typename +end +end +self:_AddTask(target) +end +return self +end +function PLAYERTASKCONTROLLER:_CheckTaskQueue() +self:T(self.lid.."_CheckTaskQueue") +if self.TaskQueue:Count()>0 then +local tasks=self.TaskQueue:GetIDStack() +for _id,_entry in pairs(tasks)do +local data=_entry.data +self:T("Looking at Task: "..data.PlayerTaskNr.." Type: "..data.Type.." State: "..data:GetState()) +if data:GetState()=="Done"or data:GetState()=="Stopped"then +local task=self.TaskQueue:ReadByID(_id) +local clientsattask=task.Clients:GetIDStackSorted() +for _,_id in pairs(clientsattask)do +self:T("*****Removing player ".._id) +self.TasksPerPlayer:PullByID(_id) +end +local clients=task:GetClientObjects() +for _,client in pairs(clients)do +self:_RemoveMenuEntriesForTask(task,client) +end +for _,client in pairs(clients)do +self:_SwitchMenuForClient(client,"Info",5) +end +local nexttasks={} +if task.FinalState=="Success"then +nexttasks=task.NextTaskSuccess +elseif task.FinalState=="Failed"then +nexttasks=task.NextTaskFailure +end +local clientlist,count=task:GetClientObjects() +if count>0 then +for _,_client in pairs(clientlist)do +local client=_client +local group=client:GetGroup() +for _,task in pairs(nexttasks)do +self:_JoinTask(task,true,group,client) +end +end +end +local TNow=timer.getAbsTime() +if TNow-task.timestamp>5 then +self:_RemoveMenuEntriesForTask(task) +local task=self.TaskQueue:PullByID(_id) +task=nil +end +end +end +end +return self +end +function PLAYERTASKCONTROLLER:_CheckPrecisionTasks() +self:T(self.lid.."_CheckPrecisionTasks") +self:T({count=self.PrecisionTasks:Count(),enabled=self.precisionbombing}) +if self.PrecisionTasks:Count()>0 and self.precisionbombing then +self.LasingDroneSet:ForEachGroup( +function(LasingDrone) +if not LasingDrone or LasingDrone:IsDead()then +self:E(self.lid.."Lasing drone is dead ... creating a new one!") +if LasingDrone then +LasingDrone:_Respawn(1,nil,true) +else +end +end +end +) +local function SelectDrone(coord) +local selected=nil +local mindist=math.huge +local dist=math.huge +self.LasingDroneSet:ForEachGroup( +function(grp) +if grp.playertask and(not grp.playertask.busy)then +local gc=grp:GetCoordinate() +if coord and gc then +dist=coord:Get2DDistance(gc) +end +if dist<mindist then +selected=grp +mindist=dist +end +end +end +) +return selected +end +local task=self.PrecisionTasks:Pull() +local taskpt=task.Target:GetCoordinate() +local SelectedDrone=SelectDrone(taskpt) +if SelectedDrone and SelectedDrone:IsAlive()then +if SelectedDrone.playertask and(not SelectedDrone.playertask.busy)then +self:T(self.lid.."Sending lasing unit to target") +local isassigned=self:_FindLasingDroneForTaskID(task.PlayerTaskNr) +local startpoint=SelectedDrone:GetCoordinate() +local endpoint=task.Target:GetCoordinate() +local dist=math.huge +if startpoint and endpoint then +dist=startpoint:Get2DDistance(endpoint) +end +if dist<=SelectedDrone.playertask.maxtravel and(not isassigned)then +SelectedDrone.playertask.id=task.PlayerTaskNr +SelectedDrone.playertask.busy=true +SelectedDrone.playertask.inreach=false +SelectedDrone.playertask.reachmessage=false +if SelectedDrone:IsFlightgroup()then +SelectedDrone:CancelAllMissions() +local auftrag=AUFTRAG:NewORBIT_CIRCLE(task.Target:GetCoordinate(),SelectedDrone.playertask.alt,SelectedDrone.playertask.speed) +SelectedDrone:AddMission(auftrag) +elseif SelectedDrone:IsArmygroup()then +local tgtcoord=task.Target:GetCoordinate() +local tgtzone=ZONE_RADIUS:New("ArmyGroup-"..math.random(1,10000),tgtcoord:GetVec2(),3000) +local finalpos=nil +for i=1,50 do +finalpos=tgtzone:GetRandomCoordinate(2500,0,{land.SurfaceType.LAND,land.SurfaceType.ROAD,land.SurfaceType.SHALLOW_WATER}) +if finalpos then +if finalpos:IsLOS(tgtcoord,0)then +break +end +end +end +if finalpos then +SelectedDrone:CancelAllMissions() +local auftrag=AUFTRAG:NewARMOREDGUARD(finalpos,"Off road") +SelectedDrone:AddMission(auftrag) +else +self:E("***Could not find LOS position to post ArmyGroup for lasing!") +SelectedDrone.playertask.id=0 +SelectedDrone.playertask.busy=false +SelectedDrone.playertask.inreach=false +SelectedDrone.playertask.reachmessage=false +end +end +else +self:T(self.lid.."Lasing unit too far from target") +end +end +end +self.PrecisionTasks:Push(task,task.PlayerTaskNr) +local function DronesWithTask(SelectedDrone) +if SelectedDrone.playertask and SelectedDrone.playertask.busy then +local task=self.PrecisionTasks:ReadByID(SelectedDrone.playertask.id) +self:T("Looking at Task: "..task.PlayerTaskNr.." Type: "..task.Type.." State: "..task:GetState()) +if(not task)or task:GetState()=="Done"or task:GetState()=="Stopped"then +local task=self.PrecisionTasks:PullByID(SelectedDrone.playertask.id) +self:_CheckTaskQueue() +task=nil +if SelectedDrone:IsLasing()then +SelectedDrone:__LaserOff(-1) +end +SelectedDrone.playertask.busy=false +SelectedDrone.playertask.inreach=false +SelectedDrone.playertask.id=0 +SelectedDrone.playertask.reachmessage=false +self:T(self.lid.."Laser Off") +else +self:T(self.lid.."Not done yet") +local dcoord=SelectedDrone:GetCoordinate() +local tcoord=task.Target:GetCoordinate() +tcoord.y=tcoord.y+2 +local dist=dcoord:Get2DDistance(tcoord) +self:T(self.lid.."Dist "..dist) +if dist<3000 and not SelectedDrone:IsLasing()then +self:T(self.lid.."Laser On") +SelectedDrone:__LaserOn(-1,tcoord) +SelectedDrone.playertask.inreach=true +if not SelectedDrone.playertask.reachmessage then +SelectedDrone.playertask.reachmessage=true +local clients=task:GetClients() +local text="" +for _,playername in pairs(clients)do +local pointertext=self.gettext:GetEntry("POINTEROVERTARGET",self.locale) +local ttsplayername=playername +if self.customcallsigns[playername]then +ttsplayername=self.customcallsigns[playername] +end +text=string.format(pointertext,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +if not self.NoScreenOutput then +local client=nil +self.ClientSet:ForEachClient( +function(Client) +if Client:GetPlayerName()==playername then client=Client end +end +) +if client then +local m=MESSAGE:New(text,15,"Tasking"):ToClient(client) +end +end +end +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +end +end +end +end +end +self.LasingDroneSet:ForEachGroup(DronesWithTask) +end +return self +end +function PLAYERTASKCONTROLLER:_CheckPlayerHasTask(PlayerName) +self:T(self.lid.."_CheckPlayerHasTask") +return self.TasksPerPlayer:HasUniqueID(PlayerName) +end +function PLAYERTASKCONTROLLER:AddTarget(Target) +self:T(self.lid.."AddTarget") +self.TargetQueue:Push(Target) +return self +end +function PLAYERTASKCONTROLLER:_CheckTaskTypeAllowed(Type) +self:T(self.lid.."_CheckTaskTypeAllowed") +local Outcome=false +if self.UseWhiteList then +for _,_type in pairs(self.WhiteList)do +if Type==_type then +Outcome=true +break +end +end +else +return true +end +return Outcome +end +function PLAYERTASKCONTROLLER:_CheckTaskTypeDisallowed(Type) +self:T(self.lid.."_CheckTaskTypeDisallowed") +local Outcome=false +if self.UseBlackList then +for _,_type in pairs(self.BlackList)do +if Type==_type then +Outcome=true +break +end +end +else +return true +end +return Outcome +end +function PLAYERTASKCONTROLLER:SetTaskWhiteList(WhiteList) +self:T(self.lid.."SetTaskWhiteList") +self.WhiteList=WhiteList +self.UseWhiteList=true +return self +end +function PLAYERTASKCONTROLLER:SetTaskBlackList(BlackList) +self:T(self.lid.."SetTaskBlackList") +self.BlackList=BlackList +self.UseBlackList=true +return self +end +function PLAYERTASKCONTROLLER:SetSEADAttributes(Attributes) +self:T(self.lid.."SetSEADAttributes") +if type(Attributes)~="table"then +Attributes={Attributes} +end +self.SeadAttributes=Attributes +return self +end +function PLAYERTASKCONTROLLER:_IsAttributeSead(Attribute) +self:T(self.lid.."_IsAttributeSead?") +local IsSead=false +for _,_attribute in pairs(self.SeadAttributes)do +if Attribute==_attribute then +IsSead=true +break +end +end +return IsSead +end +function PLAYERTASKCONTROLLER:_AddTask(Target) +self:T(self.lid.."_AddTask") +local cat=Target:GetCategory() +local threat=Target:GetThreatLevelMax() +local type=AUFTRAG.Type.CAS +local ttstype=self.gettext:GetEntry("CASTTS",self.locale) +if cat==TARGET.Category.GROUND then +type=AUFTRAG.Type.CAS +local targetobject=Target:GetObject() +if targetobject:IsInstanceOf("UNIT")then +self:T("SEAD Check UNIT") +if targetobject:HasSEAD()then +type=AUFTRAG.Type.SEAD +ttstype=self.gettext:GetEntry("SEADTTS",self.locale) +end +elseif targetobject:IsInstanceOf("GROUP")then +self:T("SEAD Check GROUP") +local attribute=targetobject:GetAttribute() +if self:_IsAttributeSead(attribute)then +type=AUFTRAG.Type.SEAD +ttstype=self.gettext:GetEntry("SEADTTS",self.locale) +end +elseif targetobject:IsInstanceOf("SET_GROUP")then +self:T("SEAD Check SET_GROUP") +targetobject:ForEachGroup( +function(group) +local attribute=group:GetAttribute() +if self:_IsAttributeSead(attribute)then +type=AUFTRAG.Type.SEAD +ttstype=self.gettext:GetEntry("SEADTTS",self.locale) +end +end +) +elseif targetobject:IsInstanceOf("SET_UNIT")then +self:T("SEAD Check SET_UNIT") +targetobject:ForEachUnit( +function(unit) +if unit:HasSEAD()then +type=AUFTRAG.Type.SEAD +ttstype=self.gettext:GetEntry("SEADTTS",self.locale) +end +end +) +elseif targetobject:IsInstanceOf("SET_STATIC")or targetobject:IsInstanceOf("STATIC")then +self:T("(PRECISION-)BOMBING SET_STATIC or STATIC") +if self.precisionbombing then +type=AUFTRAG.Type.PRECISIONBOMBING +ttstype=self.gettext:GetEntry("PRECBOMBTTS",self.locale) +else +type=AUFTRAG.Type.BOMBING +ttstype=self.gettext:GetEntry("BOMBTTS",self.locale) +end +end +local targetcoord=Target:GetCoordinate() +local targetvec2=targetcoord:GetVec2() +local targetzone=ZONE_RADIUS:New(self.Name,targetvec2,self.TargetRadius) +local coalition=targetobject:GetCoalitionName()or"Blue" +coalition=string.lower(coalition) +self:T("Target coalition is "..tostring(coalition)) +local filtercoalition="blue" +if coalition=="blue"then filtercoalition="red"end +local friendlyset=SET_GROUP:New():FilterCategoryGround():FilterCoalitions(filtercoalition):FilterZones({targetzone}):FilterOnce() +if friendlyset:Count()==0 and type==AUFTRAG.Type.CAS then +type=AUFTRAG.Type.BAI +ttstype=self.gettext:GetEntry("BAITTS",self.locale) +end +if(type==AUFTRAG.Type.BAI or type==AUFTRAG.Type.CAS)and(self.precisionbombing or self.buddylasing)then +if threat>2 and threat<7 then +type=AUFTRAG.Type.PRECISIONBOMBING +ttstype=self.gettext:GetEntry("PRECBOMBTTS",self.locale) +end +end +elseif cat==TARGET.Category.NAVAL then +type=AUFTRAG.Type.ANTISHIP +ttstype=self.gettext:GetEntry("ANTISHIPTTS",self.locale) +elseif cat==TARGET.Category.AIRCRAFT then +type=AUFTRAG.Type.INTERCEPT +ttstype=self.gettext:GetEntry("INTERCEPTTS",self.locale) +elseif cat==TARGET.Category.AIRBASE then +type=AUFTRAG.Type.BOMBRUNWAY +ttstype=self.gettext:GetEntry("BOMBRUNWAYTTS",self.locale) +elseif cat==TARGET.Category.COORDINATE or cat==TARGET.Category.ZONE then +local zone=Target:GetObject() +if cat==TARGET.Category.COORDINATE then +zone=ZONE_RADIUS:New("TargetZone-"..math.random(1,10000),Target:GetVec2(),self.TargetRadius) +end +local enemies=self.CoalitionName=="Blue"and"red"or"blue" +local enemysetg=SET_GROUP:New():FilterCoalitions(enemies):FilterCategoryGround():FilterActive(true):FilterZones({zone}):FilterOnce() +local enemysets=SET_STATIC:New():FilterCoalitions(enemies):FilterZones({zone}):FilterOnce() +local countg=enemysetg:Count() +local counts=enemysets:Count() +if countg>0 then +if Target.menuname then +enemysetg.menuname=Target.menuname +if Target.freetext then +enemysetg.freetext=Target.freetext +end +end +self:AddTarget(enemysetg) +end +if counts>0 then +if Target.menuname then +enemysets.menuname=Target.menuname +if Target.freetext then +enemysets.freetext=Target.freetext +end +end +self:AddTarget(enemysets) +end +return self +end +if self.UseWhiteList then +if not self:_CheckTaskTypeAllowed(type)then +return self +end +end +if self.UseBlackList then +if self:_CheckTaskTypeDisallowed(type)then +return self +end +end +local task=PLAYERTASK:New(type,Target,self.repeatonfailed,self.repeattimes,ttstype) +if Target.menuname then +task:SetMenuName(Target.menuname) +if Target.freetext then +task:AddFreetext(Target.freetext) +end +end +task.coalition=self.Coalition +task.TypeName=Target.TypeName +if type==AUFTRAG.Type.BOMBRUNWAY then +task:HandleEvent(EVENTS.Shot) +function task:OnEventShot(EventData) +local data=EventData +local wcat=Object.getCategory(data.Weapon) +local coord=data.IniUnit:GetCoordinate()or data.IniGroup:GetCoordinate() +local vec2=coord:GetVec2()or{x=0,y=0} +local coal=data.IniCoalition +local afbzone=AIRBASE:FindByName(Target:GetName()):GetZone() +local runways=AIRBASE:FindByName(Target:GetName()):GetRunways()or{} +local inrunwayzone=false +for _,_runway in pairs(runways)do +local runway=_runway +if runway.zone:IsVec2InZone(vec2)then +inrunwayzone=true +end +end +local inzone=afbzone:IsVec2InZone(vec2) +if coal==task.coalition and(wcat==2 or wcat==3)and(inrunwayzone or inzone)then +task:__Success(-20) +end +end +end +task:_SetController(self) +self.TaskQueue:Push(task) +self:__TaskAdded(10,task) +return self +end +function PLAYERTASKCONTROLLER:AddPlayerTaskToQueue(PlayerTask,Silent,TaskFilter) +self:T(self.lid.."AddPlayerTaskToQueue") +if PlayerTask and PlayerTask.ClassName and PlayerTask.ClassName=="PLAYERTASK"then +if TaskFilter then +if self.UseWhiteList and(not self:_CheckTaskTypeAllowed(PlayerTask.Type))then +return self +end +if self.UseBlackList and self:_CheckTaskTypeDisallowed(PlayerTask.Type)then +return self +end +end +PlayerTask:_SetController(self) +PlayerTask:SetCoalition(self.Coalition) +self.TaskQueue:Push(PlayerTask) +if not Silent then +self:__TaskAdded(10,PlayerTask) +end +else +self:E(self.lid.."***** NO valid PAYERTASK object sent!") +end +return self +end +function PLAYERTASKCONTROLLER:CanJoinTask(Task,Group,Client) +return true +end +function PLAYERTASKCONTROLLER:_JoinTask(Task,Force,Group,Client) +self:T({Force,Group,Client}) +self:T(self.lid.."_JoinTask") +if not self:CanJoinTask(Task,Group,Client)then +return self +end +if not Task:CanJoinTask(Group,Client)then +return self +end +local force=false +if type(Force)=="boolean"then +force=Force +end +local playername,ttsplayername=self:_GetPlayerName(Client) +if self.TasksPerPlayer:HasUniqueID(playername)and not force then +if not self.NoScreenOutput then +local text=self.gettext:GetEntry("HAVEACTIVETASK",self.locale) +local m=MESSAGE:New(text,"10","Tasking"):ToClient(Client) +end +return self +end +local taskstate=Task:GetState() +if not Task:IsDone()then +if taskstate~="Executing"then +Task:__Requested(-1) +Task:__Executing(-2) +end +Task:AddClient(Client) +local joined=self.gettext:GetEntry("PILOTJOINEDTASK",self.locale) +local text=string.format(joined,ttsplayername,self.MenuName or self.Name,Task.TTSType,Task.PlayerTaskNr) +self:T(self.lid..text) +if not self.NoScreenOutput then +self:_SendMessageToClients(text) +end +if self.UseSRS then +self:T(self.lid..text) +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +self.TasksPerPlayer:Push(Task,playername) +self:__PlayerJoinedTask(1,Group,Client,Task) +self:_SwitchMenuForClient(Client,"Active",1) +end +if Task.Type==AUFTRAG.Type.PRECISIONBOMBING then +if not self.PrecisionTasks:HasUniqueID(Task.PlayerTaskNr)then +self.PrecisionTasks:Push(Task,Task.PlayerTaskNr) +end +end +return self +end +function PLAYERTASKCONTROLLER:_SwitchFlashing(Group,Client) +self:T(self.lid.."_SwitchFlashing") +local playername,ttsplayername=self:_GetPlayerName(Client) +if(not self.FlashPlayer[playername])or(self.FlashPlayer[playername]==false)then +self.FlashPlayer[playername]=Client +local flashtext=self.gettext:GetEntry("FLASHON",self.locale) +local text=string.format(flashtext,ttsplayername) +local m=MESSAGE:New(text,10,"Tasking"):ToClient(Client) +else +self.FlashPlayer[playername]=false +local flashtext=self.gettext:GetEntry("FLASHOFF",self.locale) +local text=string.format(flashtext,ttsplayername) +local m=MESSAGE:New(text,10,"Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_ShowRadioInfo(Group,Client) +self:T(self.lid.."_ShowRadioInfo") +local playername,ttsplayername=self:_GetPlayerName(Client) +if self.UseSRS then +local frequency=self.Frequency +local freqtext="" +if type(frequency)=="table"then +freqtext=self.gettext:GetEntry("FREQUENCIES",self.locale) +freqtext=freqtext..table.concat(frequency,", ") +else +local freqt=self.gettext:GetEntry("FREQUENCY",self.locale) +freqtext=string.format(freqt,frequency) +end +local switchtext=self.gettext:GetEntry("BROADCAST",self.locale) +playername=ttsplayername or self:_GetTextForSpeech(playername) +local text=string.format(switchtext,playername,self.MenuName or self.Name,freqtext) +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2,{Group},text,30,self.BCFrequency,self.BCModulation) +end +return self +end +function PLAYERTASKCONTROLLER:_FlashInfo() +self:T(self.lid.."_FlashInfo") +for _playername,_client in pairs(self.FlashPlayer)do +if _client and _client:IsAlive()then +if self.TasksPerPlayer:HasUniqueID(_playername)then +local task=self.TasksPerPlayer:ReadByID(_playername) +local Coordinate=task.Target:GetCoordinate() +local CoordText="" +if self.Type~=PLAYERTASKCONTROLLER.Type.A2A then +CoordText=Coordinate:ToStringA2G(_client,nil,self.ShowMagnetic) +else +CoordText=Coordinate:ToStringA2A(_client,nil,self.ShowMagnetic) +end +local targettxt=self.gettext:GetEntry("TARGET",self.locale) +local text="Target: "..CoordText +local m=MESSAGE:New(text,10,"Tasking"):ToClient(_client) +end +end +end +return self +end +function PLAYERTASKCONTROLLER:_FindLasingDroneForTaskID(ID) +local drone=nil +self.LasingDroneSet:ForEachGroup( +function(grp) +if grp and grp:IsAlive()and grp.playertask and grp.playertask.id and grp.playertask.id==ID then +drone=grp +end +end +) +return drone +end +function PLAYERTASKCONTROLLER:_ActiveTaskInfo(Task,Group,Client) +self:T(self.lid.."_ActiveTaskInfo") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +local textTTS="" +local task=nil +if type(Task)~="string"then +task=Task +end +if self.TasksPerPlayer:HasUniqueID(playername)or task then +local task=task or self.TasksPerPlayer:ReadByID(playername) +local tname=self.gettext:GetEntry("TASKNAME",self.locale) +local ttsname=self.gettext:GetEntry("TASKNAMETTS",self.locale) +local taskname=string.format(tname,task.Type,task.PlayerTaskNr) +local ttstaskname=string.format(ttsname,task.TTSType,task.PlayerTaskNr) +local Coordinate=task.Target:GetCoordinate()or COORDINATE:New(0,0,0) +local Elevation=Coordinate:GetLandHeight()or 0 +local CoordText="" +local CoordTextLLDM=nil +local LasingDrone=self:_FindLasingDroneForTaskID(task.PlayerTaskNr) +if self.Type~=PLAYERTASKCONTROLLER.Type.A2A then +CoordText=Coordinate:ToStringA2G(Client,nil,self.ShowMagnetic) +else +CoordText=Coordinate:ToStringA2A(Client,nil,self.ShowMagnetic) +end +local ThreatLevel=task.Target:GetThreatLevelMax() +local ThreatLevelText=self.gettext:GetEntry("THREATHIGH",self.locale) +if ThreatLevel>3 and ThreatLevel<8 then +ThreatLevelText=self.gettext:GetEntry("THREATMEDIUM",self.locale) +elseif ThreatLevel<=3 then +ThreatLevelText=self.gettext:GetEntry("THREATLOW",self.locale) +end +local targets=task.Target:CountTargets()or 0 +local clientlist,clientcount=task:GetClients() +local ThreatGraph="["..string.rep("■",ThreatLevel)..string.rep("□",10-ThreatLevel).."]: "..ThreatLevel +local ThreatLocaleText=self.gettext:GetEntry("THREATTEXT",self.locale) +text=string.format(ThreatLocaleText,taskname,ThreatGraph,targets,CoordText) +local settings=_DATABASE:GetPlayerSettings(playername)or _SETTINGS +local elevationmeasure=self.gettext:GetEntry("FEET",self.locale) +if settings:IsMetric()then +elevationmeasure=self.gettext:GetEntry("METER",self.locale) +else +Elevation=math.floor(UTILS.MetersToFeet(Elevation)) +end +local elev=self.gettext:GetEntry("ELEVATION",self.locale) +text=text..string.format(elev,tostring(math.floor(Elevation)),elevationmeasure) +if task.Type==AUFTRAG.Type.PRECISIONBOMBING and self.precisionbombing then +if LasingDrone and LasingDrone.playertask then +local yes=self.gettext:GetEntry("YES",self.locale) +local no=self.gettext:GetEntry("NO",self.locale) +local inreach=LasingDrone.playertask.inreach==true and yes or no +local islasing=LasingDrone:IsLasing()==true and yes or no +local prectext=self.gettext:GetEntry("POINTERTARGETREPORT",self.locale) +prectext=string.format(prectext,inreach,islasing) +text=text..prectext.." ("..LasingDrone.playertask.lasercode..")" +end +end +if task.Type==AUFTRAG.Type.PRECISIONBOMBING and self.buddylasing then +if self.PlayerRecce then +local yes=self.gettext:GetEntry("YES",self.locale) +local no=self.gettext:GetEntry("NO",self.locale) +local reachdist=8000 +local inreach=false +local pset=self.PlayerRecce.PlayerSet:GetAliveSet() +for _,_player in pairs(pset)do +local player=_player +local pcoord=player:GetCoordinate() +if pcoord:Get2DDistance(Coordinate)<=reachdist then +inreach=true +local callsign=player:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local playername=player:GetPlayerName() +local islasing=no +if self.PlayerRecce.CanLase[player:GetTypeName()]and self.PlayerRecce.AutoLase[playername]then +islasing=yes +end +local inrtext=inreach==true and yes or no +local prectext=self.gettext:GetEntry("RECCETARGETREPORT",self.locale) +prectext=string.format(prectext,callsign,inrtext,islasing) +text=text..prectext +end +end +end +elseif task.Type==AUFTRAG.Type.CTLD or task.Type==AUFTRAG.Type.CSAR then +text=taskname +textTTS=taskname +local detail=task:GetFreetext() +local detailTTS=task:GetFreetextTTS() +local brieftxt=self.gettext:GetEntry("BRIEFING",self.locale) +local locatxt=self.gettext:GetEntry("TARGETLOCATION",self.locale) +text=text..string.format("\n%s: %s\n%s %s",brieftxt,detail,locatxt,CoordText) +textTTS=textTTS..string.format("; %s: %s; %s %s",brieftxt,detailTTS,locatxt,CoordText) +end +local clienttxt=self.gettext:GetEntry("PILOTS",self.locale) +if clientcount>0 then +for _,_name in pairs(clientlist)do +if self.customcallsigns[_name]then +_name=self.customcallsigns[_name] +_name=string.gsub(_name,"(%d) ","%1") +end +clienttxt=clienttxt.._name..", " +end +clienttxt=string.gsub(clienttxt,", $",".") +else +local keine=self.gettext:GetEntry("NONE",self.locale) +clienttxt=clienttxt..keine +end +text=text..clienttxt +textTTS=textTTS..clienttxt +if self.InfoHasCoordinate then +if self.InfoHasLLDDM then +CoordTextLLDM=Coordinate:ToStringLLDDM() +else +CoordTextLLDM=Coordinate:ToStringLLDMS() +end +local locatxt=self.gettext:GetEntry("COORDINATE",self.locale) +text=string.format("%s\n%s: %s",text,locatxt,CoordTextLLDM) +end +if task:HasFreetext()and not(task.Type==AUFTRAG.Type.CTLD or task.Type==AUFTRAG.Type.CSAR)then +local brieftxt=self.gettext:GetEntry("BRIEFING",self.locale) +text=text..string.format("\n%s: ",brieftxt)..task:GetFreetext() +end +if self.UseSRS then +if string.find(CoordText," BR, ")then +CoordText=string.gsub(CoordText," BR, "," Bee, Arr; ") +end +if self.ShowMagnetic then +text=string.gsub(text,"°M|","° magnetic; ") +end +if string.find(CoordText,"MGRS")then +local Text=string.gsub(CoordText,"MGRS ","") +Text=string.gsub(Text,"%s+","") +Text=string.gsub(Text,"([%a%d])","%1;") +Text=string.gsub(Text,"0","zero") +Text=string.gsub(Text,"9","niner") +CoordText="MGRS;"..Text +if self.PathToGoogleKey then +end +end +local ThreatLocaleTextTTS=self.gettext:GetEntry("THREATTEXTTTS",self.locale) +local ttstext=string.format(ThreatLocaleTextTTS,ttsplayername,self.MenuName or self.Name,ttstaskname,ThreatLevelText,targets,CoordText) +if task.Type==AUFTRAG.Type.PRECISIONBOMBING and self.precisionbombing then +if LasingDrone and LasingDrone.playertask.inreach and LasingDrone:IsLasing()then +local lasingtext=self.gettext:GetEntry("POINTERTARGETLASINGTTS",self.locale) +ttstext=ttstext..lasingtext +end +elseif task.Type==AUFTRAG.Type.CTLD or task.Type==AUFTRAG.Type.CSAR then +ttstext=textTTS +if string.find(ttstext," BR, ")then +CoordText=string.gsub(ttstext," BR, "," Bee, Arr, ") +end +elseif task:HasFreetext()then +local brieftxt=self.gettext:GetEntry("BRIEFING",self.locale) +ttstext=ttstext..string.format("; %s: ",brieftxt)..task:GetFreetextTTS() +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,2) +end +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,self.TaskInfoDuration or 30,"Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_MarkTask(Group,Client) +self:T(self.lid.."_MarkTask") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +if self.TasksPerPlayer:HasUniqueID(playername)then +local task=self.TasksPerPlayer:ReadByID(playername) +text=string.format("Task ID #%03d | Type: %s | Threat: %d",task.PlayerTaskNr,task.Type,task.Target:GetThreatLevelMax()) +task:MarkTargetOnF10Map(text,self.Coalition,self.MarkerReadOnly) +local textmark=self.gettext:GetEntry("MARKTASK",self.locale) +text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,"10","Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_SmokeTask(Group,Client) +self:T(self.lid.."_SmokeTask") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +if self.TasksPerPlayer:HasUniqueID(playername)then +local task=self.TasksPerPlayer:ReadByID(playername) +task:SmokeTarget() +local textmark=self.gettext:GetEntry("SMOKETASK",self.locale) +text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +self:__TaskTargetSmoked(5,task) +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_FlareTask(Group,Client) +self:T(self.lid.."_FlareTask") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +if self.TasksPerPlayer:HasUniqueID(playername)then +local task=self.TasksPerPlayer:ReadByID(playername) +task:FlareTarget() +local textmark=self.gettext:GetEntry("FLARETASK",self.locale) +text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +self:__TaskTargetFlared(5,task) +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_IlluminateTask(Group,Client) +self:T(self.lid.."_IlluminateTask") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +if self.TasksPerPlayer:HasUniqueID(playername)then +local task=self.TasksPerPlayer:ReadByID(playername) +task:FlareTarget() +local textmark=self.gettext:GetEntry("FLARETASK",self.locale) +text=string.format(textmark,ttsplayername,self.MenuName or self.Name,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +self:__TaskTargetIlluminated(5,task) +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client) +end +return self +end +function PLAYERTASKCONTROLLER:_AbortTask(Group,Client) +self:T(self.lid.."_AbortTask") +local playername,ttsplayername=self:_GetPlayerName(Client) +local text="" +if self.TasksPerPlayer:HasUniqueID(playername)then +local task=self.TasksPerPlayer:PullByID(playername) +task:ClientAbort(Client) +local textmark=self.gettext:GetEntry("ABORTTASK",self.locale) +text=string.format(textmark,self.MenuName or self.Name,ttsplayername,task.TTSType,task.PlayerTaskNr) +self:T(self.lid..text) +if self.UseSRS then +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,2) +end +self:__PlayerAbortedTask(1,Group,Client,task) +else +text=self.gettext:GetEntry("NOACTIVETASK",self.locale) +end +if not self.NoScreenOutput then +local m=MESSAGE:New(text,15,"Tasking"):ToClient(Client) +end +self:_SwitchMenuForClient(Client,"Info",1) +return self +end +function PLAYERTASKCONTROLLER:_UpdateJoinMenuTemplate() +self:T("_UpdateJoinMenuTemplate") +if self.TaskQueue:Count()>0 then +local taskpertype=self:_GetTasksPerType() +local JoinMenu=self.JoinMenu +local controller=self.JoinTaskMenuTemplate +local actcontroller=self.ActiveTaskMenuTemplate +local actinfomenu=self.ActiveInfoMenu +if self.TaskQueue:Count()==0 and self.MenuNoTask==nil then +local menunotasks=self.gettext:GetEntry("MENUNOTASKS",self.locale) +self.MenuNoTask=controller:NewEntry(menunotasks,self.JoinMenu) +controller:AddEntry(self.MenuNoTask) +end +if self.TaskQueue:Count()>0 and self.MenuNoTask~=nil then +controller:DeleteGenericEntry(self.MenuNoTask) +controller:DeleteF10Entry(self.MenuNoTask) +self.MenuNoTask=nil +end +local maxn=self.menuitemlimit +for _type,_ in pairs(taskpertype)do +local found=controller:FindEntriesByText(_type) +if#found==0 then +local newentry=controller:NewEntry(_type,JoinMenu) +controller:AddEntry(newentry) +if self.JoinInfoMenu then +local newentry=controller:NewEntry(_type,self.JoinInfoMenu) +controller:AddEntry(newentry) +end +if actinfomenu then +local newentry=actcontroller:NewEntry(_type,self.ActiveInfoMenu) +actcontroller:AddEntry(newentry) +end +end +end +local typelist=self:_GetAvailableTaskTypes() +for _tasktype,_data in pairs(typelist)do +self:T("**** Building for TaskType: ".._tasktype) +for _,_task in pairs(taskpertype[_tasktype])do +_task=_task +self:T("**** Building for Task: ".._task.Target:GetName()) +if _task.InMenu then +self:T("**** Task already in Menu ".._task.Target:GetName()) +else +local menutaskno=self.gettext:GetEntry("MENUTASKNO",self.locale) +local text=string.format("%s %03d",menutaskno,_task.PlayerTaskNr) +if self.UseGroupNames then +local name=_task.Target:GetName() +if name~="Unknown"then +text=string.format("%s (%03d)",name,_task.PlayerTaskNr) +end +end +local parenttable,number=controller:FindEntriesByText(_tasktype,JoinMenu) +if number>0 then +local Parent=parenttable[1] +local matches,count=controller:FindEntriesByParent(Parent) +self:T("***** Join Menu ".._tasktype.." # of entries: "..count) +if count<self.menuitemlimit then +local taskentry=controller:NewEntry(text,Parent,self._JoinTask,self,_task,"false") +controller:AddEntry(taskentry) +_task.InMenu=true +if not _task.UUIDS then _task.UUIDS={}end +table.insert(_task.UUIDS,taskentry.UUID) +end +end +if self.JoinInfoMenu then +local parenttable,number=controller:FindEntriesByText(_tasktype,self.JoinInfoMenu) +if number>0 then +local Parent=parenttable[1] +local matches,count=controller:FindEntriesByParent(Parent) +self:T("***** Join Info Menu ".._tasktype.." # of entries: "..count) +if count<self.menuitemlimit then +local taskentry=controller:NewEntry(text,Parent,self._ActiveTaskInfo,self,_task) +controller:AddEntry(taskentry) +_task.InMenu=true +if not _task.UUIDS then _task.UUIDS={}end +table.insert(_task.UUIDS,taskentry.UUID) +end +end +end +if actinfomenu then +local parenttable,number=actcontroller:FindEntriesByText(_tasktype,self.ActiveInfoMenu) +if number>0 then +local Parent=parenttable[1] +local matches,count=actcontroller:FindEntriesByParent(Parent) +self:T("***** Active Info Menu ".._tasktype.." # of entries: "..count) +if count<self.menuitemlimit then +local taskentry=actcontroller:NewEntry(text,Parent,self._ActiveTaskInfo,self,_task) +actcontroller:AddEntry(taskentry) +_task.InMenu=true +if not _task.AUUIDS then _task.AUUIDS={}end +table.insert(_task.AUUIDS,taskentry.UUID) +end +end +end +end +end +end +end +return self +end +function PLAYERTASKCONTROLLER:_RemoveMenuEntriesForTask(Task,Client) +self:T("_RemoveMenuEntriesForTask") +if Task then +if Task.UUIDS and self.JoinTaskMenuTemplate then +local controller=self.JoinTaskMenuTemplate +for _,_uuid in pairs(Task.UUIDS)do +local Entry=controller:FindEntryByUUID(_uuid) +if Entry then +controller:DeleteF10Entry(Entry,Client) +controller:DeleteGenericEntry(Entry) +end +end +end +if Task.AUUIDS and self.ActiveTaskMenuTemplate then +for _,_uuid in pairs(Task.AUUIDS)do +local controller=self.ActiveTaskMenuTemplate +local Entry=controller:FindEntryByUUID(_uuid) +if Entry then +controller:DeleteF10Entry(Entry,Client) +controller:DeleteGenericEntry(Entry) +end +end +end +Task.UUIDS=nil +Task.AUUIDS=nil +end +return self +end +function PLAYERTASKCONTROLLER:_CreateJoinMenuTemplate() +self:T("_CreateActiveTaskMenuTemplate") +local menujoin=self.gettext:GetEntry("MENUJOIN",self.locale) +local menunotasks=self.gettext:GetEntry("MENUNOTASKS",self.locale) +local flashtext=self.gettext:GetEntry("FLASHMENU",self.locale) +local JoinTaskMenuTemplate=CLIENTMENUMANAGER:New(self.ClientSet,"JoinTask") +if not self.JoinTopMenu then +local taskings=self.gettext:GetEntry("MENUTASKING",self.locale) +local longname=self.Name..taskings..self.Type +local menuname=self.MenuName or longname +self.JoinTopMenu=JoinTaskMenuTemplate:NewEntry(menuname,self.MenuParent) +end +if self.AllowFlash then +JoinTaskMenuTemplate:NewEntry(flashtext,self.JoinTopMenu,self._SwitchFlashing,self) +end +self.JoinMenu=JoinTaskMenuTemplate:NewEntry(menujoin,self.JoinTopMenu) +if self.taskinfomenu then +local menutaskinfo=self.gettext:GetEntry("MENUTASKINFO",self.locale) +self.JoinInfoMenu=JoinTaskMenuTemplate:NewEntry(menutaskinfo,self.JoinTopMenu) +end +if self.TaskQueue:Count()==0 and self.MenuNoTask==nil then +self.MenuNoTask=JoinTaskMenuTemplate:NewEntry(menunotasks,self.JoinMenu) +end +if self.TaskQueue:Count()>0 and self.MenuNoTask~=nil then +JoinTaskMenuTemplate:DeleteGenericEntry(self.MenuNoTask) +self.MenuNoTask=nil +end +if self.InformationMenu then +local radioinfo=self.gettext:GetEntry("RADIOS",self.locale) +JoinTaskMenuTemplate:NewEntry(radioinfo,self.JoinTopMenu,self._ShowRadioInfo,self) +end +self.JoinTaskMenuTemplate=JoinTaskMenuTemplate +return self +end +function PLAYERTASKCONTROLLER:_CreateActiveTaskMenuTemplate() +self:T("_CreateActiveTaskMenuTemplate") +local menuactive=self.gettext:GetEntry("MENUACTIVE",self.locale) +local menuinfo=self.gettext:GetEntry("MENUINFO",self.locale) +local menumark=self.gettext:GetEntry("MENUMARK",self.locale) +local menusmoke=self.gettext:GetEntry("MENUSMOKE",self.locale) +local menuflare=self.gettext:GetEntry("MENUFLARE",self.locale) +local menuillu=self.gettext:GetEntry("MENUILLU",self.locale) +local menuabort=self.gettext:GetEntry("MENUABORT",self.locale) +local ActiveTaskMenuTemplate=CLIENTMENUMANAGER:New(self.ActiveClientSet,"ActiveTask") +if not self.ActiveTopMenu then +local taskings=self.gettext:GetEntry("MENUTASKING",self.locale) +local longname=self.Name..taskings..self.Type +local menuname=self.MenuName or longname +self.ActiveTopMenu=ActiveTaskMenuTemplate:NewEntry(menuname,self.MenuParent) +end +if self.AllowFlash then +local flashtext=self.gettext:GetEntry("FLASHMENU",self.locale) +ActiveTaskMenuTemplate:NewEntry(flashtext,self.ActiveTopMenu,self._SwitchFlashing,self) +end +local active=ActiveTaskMenuTemplate:NewEntry(menuactive,self.ActiveTopMenu) +ActiveTaskMenuTemplate:NewEntry(menuinfo,active,self._ActiveTaskInfo,self,"NONE") +ActiveTaskMenuTemplate:NewEntry(menumark,active,self._MarkTask,self) +if self.Type~=PLAYERTASKCONTROLLER.Type.A2A and self.noflaresmokemenu~=true then +ActiveTaskMenuTemplate:NewEntry(menusmoke,active,self._SmokeTask,self) +ActiveTaskMenuTemplate:NewEntry(menuflare,active,self._FlareTask,self) +if self.illumenu then +ActiveTaskMenuTemplate:NewEntry(menuillu,active,self._IlluminateTask,self) +end +end +ActiveTaskMenuTemplate:NewEntry(menuabort,active,self._AbortTask,self) +self.ActiveTaskMenuTemplate=ActiveTaskMenuTemplate +if self.taskinfomenu and self.activehasinfomenu then +local menutaskinfo=self.gettext:GetEntry("MENUTASKINFO",self.locale) +self.ActiveInfoMenu=ActiveTaskMenuTemplate:NewEntry(menutaskinfo,self.ActiveTopMenu) +end +return self +end +function PLAYERTASKCONTROLLER:_SwitchMenuForClient(Client,MenuType,Delay) +self:T(self.lid.."_SwitchMenuForClient") +if Delay then +self:ScheduleOnce(Delay,self._SwitchMenuForClient,self,Client,MenuType) +return self +end +if MenuType=="Info"then +self.ClientSet:AddClientsByName(Client:GetName()) +self.ActiveClientSet:Remove(Client:GetName(),true) +self.ActiveTaskMenuTemplate:ResetMenu(Client) +self.JoinTaskMenuTemplate:ResetMenu(Client) +self.JoinTaskMenuTemplate:Propagate(Client) +elseif MenuType=="Active"then +self.ActiveClientSet:AddClientsByName(Client:GetName()) +self.ClientSet:Remove(Client:GetName(),true) +self.ActiveTaskMenuTemplate:ResetMenu(Client) +self.JoinTaskMenuTemplate:ResetMenu(Client) +self.ActiveTaskMenuTemplate:Propagate(Client) +else +self:E(self.lid.."Unknown menu type in _SwitchMenuForClient:"..tostring(MenuType)) +end +return self +end +function PLAYERTASKCONTROLLER:AddAgent(Recce) +self:T(self.lid.."AddAgent") +if self.Intel then +self.Intel:AddAgent(Recce) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddAgentSet(RecceSet) +self:T(self.lid.."AddAgentSet") +if self.Intel then +local Set=RecceSet:GetAliveSet() +for _,_Recce in pairs(Set)do +self.Intel:AddAgent(_Recce) +end +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:SwitchDetectStatics(OnOff) +self:T(self.lid.."SwitchDetectStatics") +if self.Intel then +self.Intel:SetDetectStatics(OnOff) +else +self:E(self.lid.."***** NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddAcceptZone(AcceptZone) +self:T(self.lid.."AddAcceptZone") +if self.Intel then +self.Intel:AddAcceptZone(AcceptZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddAcceptZoneSet(AcceptZoneSet) +self:T(self.lid.."AddAcceptZoneSet") +if self.Intel then +self.Intel.acceptzoneset:AddSet(AcceptZoneSet) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddRejectZone(RejectZone) +self:T(self.lid.."AddRejectZone") +if self.Intel then +self.Intel:AddRejectZone(RejectZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddRejectZoneSet(RejectZoneSet) +self:T(self.lid.."AddRejectZoneSet") +if self.Intel then +self.Intel.rejectzoneset:AddSet(RejectZoneSet) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddConflictZone(ConflictZone) +self:T(self.lid.."AddConflictZone") +if self.Intel then +self.Intel:AddConflictZone(ConflictZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:AddConflictZoneSet(ConflictZoneSet) +self:T(self.lid.."AddConflictZoneSet") +if self.Intel then +self.Intel.conflictzoneset:AddSet(ConflictZoneSet) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:RemoveAcceptZone(AcceptZone) +self:T(self.lid.."RemoveAcceptZone") +if self.Intel then +self.Intel:RemoveAcceptZone(AcceptZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:RemoveRejectZone(RejectZone) +self:T(self.lid.."RemoveRejectZone") +if self.Intel then +self.Intel:RemoveRejectZone(RejectZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:RemoveConflictZone(ConflictZone) +self:T(self.lid.."RemoveConflictZone") +if self.Intel then +self.Intel:RemoveConflictZone(ConflictZone) +else +self:E(self.lid.."*****NO detection has been set up (yet)!") +end +return self +end +function PLAYERTASKCONTROLLER:SetMenuName(Name) +self:T(self.lid.."SetMenuName: "..Name) +self.MenuName=Name +return self +end +function PLAYERTASKCONTROLLER:SetParentMenu(Menu) +self:T(self.lid.."SetParentMenu") +return self +end +function PLAYERTASKCONTROLLER:SetupIntel(RecceName) +self:T(self.lid.."SetupIntel") +self.RecceSet=SET_GROUP:New():FilterCoalitions(self.CoalitionName):FilterPrefixes(RecceName):FilterStart() +self.Intel=INTEL:New(self.RecceSet,self.Coalition,self.Name.."-Intel") +self.Intel:SetClusterAnalysis(true,false,false) +self.Intel:SetClusterRadius(self.ClusterRadius or 0.5) +self.Intel.statusupdate=25 +self.Intel:SetAcceptZones() +self.Intel:SetRejectZones() +if self.Type==PLAYERTASKCONTROLLER.Type.A2G or self.Type==PLAYERTASKCONTROLLER.Type.A2GS then +self.Intel:SetDetectStatics(true) +end +self.Intel:__Start(2) +local function NewCluster(Cluster) +if not self.usecluster then return self end +local cluster=Cluster +local type=cluster.ctype +self:T({type,self.Type}) +if(type==INTEL.Ctype.AIRCRAFT and self.Type==PLAYERTASKCONTROLLER.Type.A2A)or(type==INTEL.Ctype.NAVAL and(self.Type==PLAYERTASKCONTROLLER.Type.A2S or self.Type==PLAYERTASKCONTROLLER.Type.A2GS))then +self:T("A2A or A2S") +local contacts=cluster.Contacts +local targetset=SET_GROUP:New() +for _,_object in pairs(contacts)do +local contact=_object +self:T("Adding group: "..contact.groupname) +targetset:AddGroup(contact.group,true) +end +self:AddTarget(targetset) +elseif(type==INTEL.Ctype.GROUND or type==INTEL.Ctype.STRUCTURE)and(self.Type==PLAYERTASKCONTROLLER.Type.A2G or self.Type==PLAYERTASKCONTROLLER.Type.A2GS)then +self:T("A2G") +local contacts=cluster.Contacts +local targetset=nil +if type==INTEL.Ctype.GROUND then +targetset=SET_GROUP:New() +for _,_object in pairs(contacts)do +local contact=_object +self:T("Adding group: "..contact.groupname) +targetset:AddGroup(contact.group,true) +end +elseif type==INTEL.Ctype.STRUCTURE then +targetset=SET_STATIC:New() +for _,_object in pairs(contacts)do +local contact=_object +self:T("Adding static: "..contact.groupname) +targetset:AddStatic(contact.group) +end +end +if targetset then +self:AddTarget(targetset) +end +end +end +local function NewContact(Contact) +if self.usecluster then return self end +local contact=Contact +local type=contact.ctype +self:T({type,self.Type}) +if(type==INTEL.Ctype.AIRCRAFT and self.Type==PLAYERTASKCONTROLLER.Type.A2A)or(type==INTEL.Ctype.NAVAL and(self.Type==PLAYERTASKCONTROLLER.Type.A2S or self.Type==PLAYERTASKCONTROLLER.Type.A2GS))then +self:T("A2A or A2S") +self:T("Adding group: "..contact.groupname) +self:AddTarget(contact.group) +elseif(type==INTEL.Ctype.GROUND or type==INTEL.Ctype.STRUCTURE)and(self.Type==PLAYERTASKCONTROLLER.Type.A2G or self.Type==PLAYERTASKCONTROLLER.Type.A2GS)then +self:T("A2G") +self:T("Adding group: "..contact.groupname) +self:AddTarget(contact.group) +end +end +function self.Intel:OnAfterNewCluster(From,Event,To,Cluster) +NewCluster(Cluster) +end +function self.Intel:OnAfterNewContact(From,Event,To,Contact) +NewContact(Contact) +end +return self +end +function PLAYERTASKCONTROLLER:SetSRS(Frequency,Modulation,PathToSRS,Gender,Culture,Port,Voice,Volume,PathToGoogleKey,AccessKey,Coordinate,Backend) +self:T(self.lid.."SetSRS") +self.PathToSRS=PathToSRS or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.Gender=Gender or MSRS.gender or"male" +self.Culture=Culture or MSRS.culture or"en-US" +self.Port=Port or MSRS.port or 5002 +self.Voice=Voice or MSRS.voice +self.PathToGoogleKey=PathToGoogleKey +self.AccessKey=AccessKey +self.Volume=Volume or 1.0 +self.UseSRS=true +self.Frequency=Frequency or{127,251} +self.BCFrequency=self.Frequency +self.Modulation=Modulation or{radio.modulation.FM,radio.modulation.AM} +self.BCModulation=self.Modulation +self.SRS=MSRS:New(self.PathToSRS,self.Frequency,self.Modulation,Backend) +self.SRS:SetCoalition(self.Coalition) +self.SRS:SetLabel(self.MenuName or self.Name) +self.SRS:SetGender(self.Gender) +self.SRS:SetCulture(self.Culture) +self.SRS:SetPort(self.Port) +self.SRS:SetVolume(self.Volume) +if self.PathToGoogleKey then +self.SRS:SetProviderOptionsGoogle(self.PathToGoogleKey,self.AccessKey) +self.SRS:SetProvider(MSRS.Provider.GOOGLE) +end +if(not PathToGoogleKey)and self.SRS:GetProvider()==MSRS.Provider.GOOGLE then +self.PathToGoogleKey=MSRS.poptions.gcloud.credentials +self.Voice=Voice or MSRS.poptions.gcloud.voice +self.AccessKey=AccessKey or MSRS.poptions.gcloud.key +end +if Coordinate then +self.SRS:SetCoordinate(Coordinate) +end +self.SRS:SetVoice(self.Voice) +self.SRSQueue=MSRSQUEUE:New(self.MenuName or self.Name) +self.SRSQueue:SetTransmitOnlyWithPlayers(self.TransmitOnlyWithPlayers) +return self +end +function PLAYERTASKCONTROLLER:SetSRSBroadcast(Frequency,Modulation) +self:T(self.lid.."SetSRSBroadcast") +if self.SRS then +self.BCFrequency=Frequency +self.BCModulation=Modulation +end +return self +end +function PLAYERTASKCONTROLLER:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid.."onafterStart") +self:_CreateJoinMenuTemplate() +self:_CreateActiveTaskMenuTemplate() +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.Crash,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:HandleEvent(EVENTS.UnitLost,self._EventHandler) +self:SetEventPriority(5) +return self +end +function PLAYERTASKCONTROLLER:onafterStatus(From,Event,To) +self:T({From,Event,To}) +self:_CheckTargetQueue() +self:_CheckTaskQueue() +self:_CheckPrecisionTasks() +if self.AllowFlash then +self:_FlashInfo() +end +local targetcount=self.TargetQueue:Count() +local taskcount=self.TaskQueue:Count() +local playercount=self.ClientSet:CountAlive() +local assignedtasks=self.TasksPerPlayer:Count() +local enforcedmenu=false +if taskcount~=self.lasttaskcount then +self.lasttaskcount=taskcount +if taskcount<self.menuitemlimit then +enforcedmenu=true +end +end +self:_UpdateJoinMenuTemplate() +if self.verbose then +local text=string.format("%s | New Targets: %02d | Active Tasks: %02d | Active Players: %02d | Assigned Tasks: %02d",self.MenuName,targetcount,taskcount,playercount,assignedtasks) +self:I(text) +end +if self:GetState()~="Stopped"then +self:__Status(-30) +end +return self +end +function PLAYERTASKCONTROLLER:onafterTaskDone(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."TaskDone") +return self +end +function PLAYERTASKCONTROLLER:onafterTaskCancelled(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."TaskCancelled") +local canceltxt=self.gettext:GetEntry("TASKCANCELLED",self.locale) +local canceltxttts=self.gettext:GetEntry("TASKCANCELLEDTTS",self.locale) +local taskname=string.format(canceltxt,Task.PlayerTaskNr,tostring(Task.Type)) +if not self.NoScreenOutput then +self:_SendMessageToClients(taskname,15) +end +if self.UseSRS then +taskname=string.format(canceltxttts,self.MenuName or self.Name,Task.PlayerTaskNr,tostring(Task.TTSType)) +self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) +end +local clients=Task:GetClientObjects() +for _,client in pairs(clients)do +self:_RemoveMenuEntriesForTask(Task,client) +end +for _,client in pairs(clients)do +self:_SwitchMenuForClient(client,"Info",5) +end +return self +end +function PLAYERTASKCONTROLLER:onafterTaskSuccess(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."TaskSuccess") +local succtxt=self.gettext:GetEntry("TASKSUCCESS",self.locale) +local succtxttts=self.gettext:GetEntry("TASKSUCCESSTTS",self.locale) +local taskname=string.format(succtxt,Task.PlayerTaskNr,tostring(Task.Type)) +if not self.NoScreenOutput then +self:_SendMessageToClients(taskname,15) +end +if self.UseSRS then +taskname=string.format(succtxttts,self.MenuName or self.Name,Task.PlayerTaskNr,tostring(Task.TTSType)) +self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) +end +local clients=Task:GetClientObjects() +for _,client in pairs(clients)do +self:_RemoveMenuEntriesForTask(Task,client) +end +for _,client in pairs(clients)do +self:_SwitchMenuForClient(client,"Info",5) +end +return self +end +function PLAYERTASKCONTROLLER:onafterTaskFailed(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."TaskFailed") +local failtxt=self.gettext:GetEntry("TASKFAILED",self.locale) +local failtxttts=self.gettext:GetEntry("TASKFAILEDTTS",self.locale) +local taskname=string.format(failtxt,Task.PlayerTaskNr,tostring(Task.Type)) +if not self.NoScreenOutput then +self:_SendMessageToClients(taskname,15) +end +if self.UseSRS then +taskname=string.format(failtxttts,self.MenuName or self.Name,Task.PlayerTaskNr,tostring(Task.TTSType)) +self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) +end +local clients=Task:GetClientObjects() +for _,client in pairs(clients)do +self:_RemoveMenuEntriesForTask(Task,client) +end +for _,client in pairs(clients)do +self:_SwitchMenuForClient(client,"Info",5) +end +return self +end +function PLAYERTASKCONTROLLER:onafterTaskRepeatOnFailed(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."RepeatOnFailed") +local repfailtxt=self.gettext:GetEntry("TASKFAILEDREPLAN",self.locale) +local repfailtxttts=self.gettext:GetEntry("TASKFAILEDREPLANTTS",self.locale) +local taskname=string.format(repfailtxt,Task.PlayerTaskNr,tostring(Task.Type)) +if not self.NoScreenOutput then +self:_SendMessageToClients(taskname,15) +end +if self.UseSRS then +taskname=string.format(repfailtxttts,self.MenuName or self.Name,Task.PlayerTaskNr,tostring(Task.TTSType)) +self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) +end +return self +end +function PLAYERTASKCONTROLLER:onafterTaskAdded(From,Event,To,Task) +self:T({From,Event,To}) +self:T(self.lid.."TaskAdded") +local addtxt=self.gettext:GetEntry("TASKADDED",self.locale) +local taskname=string.format(addtxt,self.MenuName or self.Name,tostring(Task.Type)) +if not self.NoScreenOutput then +self:_SendMessageToClients(taskname,15) +end +if self.UseSRS then +taskname=string.format(addtxt,self.MenuName or self.Name,tostring(Task.TTSType)) +self.SRSQueue:NewTransmission(taskname,nil,self.SRS,nil,2) +end +return self +end +function PLAYERTASKCONTROLLER:onafterStop(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid.."Stopped.") +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +return self +end +end +PLAYERRECCE={ +ClassName="PLAYERRECCE", +verbose=true, +lid=nil, +version="0.1.26", +ViewZone={}, +ViewZoneVisual={}, +ViewZoneLaser={}, +LaserFOV={}, +LaserTarget={}, +PlayerSet=nil, +debug=false, +LaserSpots={}, +UnitLaserCodes={}, +LaserCodes={}, +ClientMenus={}, +OnStation={}, +minthreatlevel=0, +lasingtime=60, +AutoLase={}, +AttackSet=nil, +TransmitOnlyWithPlayers=true, +UseController=false, +Controller=nil, +ShortCallsign=true, +Keepnumber=true, +CallsignTranslations=nil, +ReferencePoint=nil, +TForget=600, +TargetCache=nil, +smokeownposition=false, +SmokeOwn={}, +smokeaveragetargetpos=true, +reporttostringbullsonly=true, +} +PLAYERRECCE.LaserRelativePos={ +["SA342M"]={x=1.7,y=1.2,z=0}, +["SA342Mistral"]={x=1.7,y=1.2,z=0}, +["SA342Minigun"]={x=1.7,y=1.2,z=0}, +["SA342L"]={x=1.7,y=1.2,z=0}, +["Ka-50"]={x=6.1,y=-0.85,z=0}, +["Ka-50_3"]={x=6.1,y=-0.85,z=0}, +["OH58D"]={x=0,y=2.8,z=0}, +} +PLAYERRECCE.MaxViewDistance={ +["SA342M"]=8000, +["SA342Mistral"]=8000, +["SA342Minigun"]=8000, +["SA342L"]=8000, +["Ka-50"]=8000, +["Ka-50_3"]=8000, +["OH58D"]=8000, +} +PLAYERRECCE.Cameraheight={ +["SA342M"]=2.85, +["SA342Mistral"]=2.85, +["SA342Minigun"]=2.85, +["SA342L"]=2.85, +["Ka-50"]=0.5, +["Ka-50_3"]=0.5, +["OH58D"]=4.25, +} +PLAYERRECCE.CanLase={ +["SA342M"]=true, +["SA342Mistral"]=true, +["SA342Minigun"]=false, +["SA342L"]=true, +["Ka-50"]=true, +["Ka-50_3"]=true, +["OH58D"]=false, +} +PLAYERRECCE.SmokeColor={ +["highsmoke"]=SMOKECOLOR.Orange, +["medsmoke"]=SMOKECOLOR.White, +["lowsmoke"]=SMOKECOLOR.Green, +["lasersmoke"]=SMOKECOLOR.Red, +["ownsmoke"]=SMOKECOLOR.Blue, +} +PLAYERRECCE.FlareColor={ +["highflare"]=FLARECOLOR.Yellow, +["medflare"]=FLARECOLOR.White, +["lowflare"]=FLARECOLOR.Green, +["laserflare"]=FLARECOLOR.Red, +["ownflare"]=FLARECOLOR.Green, +} +function PLAYERRECCE:New(Name,Coalition,PlayerSet) +local self=BASE:Inherit(self,FSM:New()) +self.Name=Name or"Blue FACA" +self.Coalition=Coalition or coalition.side.BLUE +self.CoalitionName=UTILS.GetCoalitionName(Coalition) +self.PlayerSet=PlayerSet +self.lid=string.format("PlayerForwardController %s %s | ",self.Name,self.version) +self:SetLaserCodes({1688,1130,4785,6547,1465,4578}) +self.lasingtime=60 +self.minthreatlevel=0 +self.reporttostringbullsonly=true +self.TForget=600 +self.TargetCache=FIFO:New() +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("*","Status","*") +self:AddTransition("*","RecceOnStation","*") +self:AddTransition("*","RecceOffStation","*") +self:AddTransition("*","TargetDetected","*") +self:AddTransition("*","TargetsSmoked","*") +self:AddTransition("*","TargetsFlared","*") +self:AddTransition("*","Illumination","*") +self:AddTransition("*","TargetLasing","*") +self:AddTransition("*","TargetLOSLost","*") +self:AddTransition("*","TargetReport","*") +self:AddTransition("*","TargetReportSent","*") +self:AddTransition("*","Shack","*") +self:AddTransition("Running","Stop","Stopped") +self:HandleEvent(EVENTS.PlayerLeaveUnit,self._EventHandler) +self:HandleEvent(EVENTS.Ejection,self._EventHandler) +self:HandleEvent(EVENTS.Crash,self._EventHandler) +self:HandleEvent(EVENTS.PilotDead,self._EventHandler) +self:HandleEvent(EVENTS.PlayerEnterAircraft,self._EventHandler) +self:__Start(-1) +local starttime=math.random(5,10) +self:__Status(-starttime) +self:I(self.lid.." Started.") +return self +end +function PLAYERRECCE:_EventHandler(EventData) +self:T(self.lid.."_EventHandler: "..EventData.id) +if EventData.id==EVENTS.PlayerLeaveUnit or EventData.id==EVENTS.Ejection or EventData.id==EVENTS.Crash or EventData.id==EVENTS.PilotDead then +if EventData.IniPlayerName then +self:T(self.lid.."Event for player: "..EventData.IniPlayerName) +if self.ClientMenus[EventData.IniPlayerName]then +self.ClientMenus[EventData.IniPlayerName]:Remove() +end +self.ClientMenus[EventData.IniPlayerName]=nil +self.LaserSpots[EventData.IniPlayerName]=nil +self.OnStation[EventData.IniPlayerName]=false +self.LaserFOV[EventData.IniPlayerName]=nil +self.UnitLaserCodes[EventData.IniPlayerName]=nil +self.LaserTarget[EventData.IniPlayerName]=nil +self.AutoLase[EventData.IniPlayerName]=false +if self.ViewZone[EventData.IniPlayerName]then self.ViewZone[EventData.IniPlayerName]:UndrawZone()end +if self.ViewZoneLaser[EventData.IniPlayerName]then self.ViewZoneLaser[EventData.IniPlayerName]:UndrawZone()end +if self.ViewZoneVisual[EventData.IniPlayerName]then self.ViewZoneVisual[EventData.IniPlayerName]:UndrawZone()end +end +elseif EventData.id==EVENTS.PlayerEnterAircraft and EventData.IniCoalition==self.Coalition then +if EventData.IniPlayerName then +self:T(self.lid.."Event for player: "..EventData.IniPlayerName) +self.UnitLaserCodes[EventData.IniPlayerName]=1688 +self.ClientMenus[EventData.IniPlayerName]=nil +self.LaserSpots[EventData.IniPlayerName]=nil +self.OnStation[EventData.IniPlayerName]=false +self.LaserFOV[EventData.IniPlayerName]=nil +self.UnitLaserCodes[EventData.IniPlayerName]=nil +self.LaserTarget[EventData.IniPlayerName]=nil +self.AutoLase[EventData.IniPlayerName]=false +if self.ViewZone[EventData.IniPlayerName]then self.ViewZone[EventData.IniPlayerName]:UndrawZone()end +if self.ViewZoneLaser[EventData.IniPlayerName]then self.ViewZoneLaser[EventData.IniPlayerName]:UndrawZone()end +if self.ViewZoneVisual[EventData.IniPlayerName]then self.ViewZoneVisual[EventData.IniPlayerName]:UndrawZone()end +self:_BuildMenus() +end +end +return self +end +function PLAYERRECCE:_GetClockDirection(unit,target) +self:T(self.lid.." _GetClockDirection") +local _playerPosition=unit:GetCoordinate() +local _targetpostions=target:GetCoordinate() +local _heading=unit:GetHeading() +local DirectionVec3=_playerPosition:GetDirectionVec3(_targetpostions) +local Angle=_playerPosition:GetAngleDegrees(DirectionVec3) +local clock=12 +local hours=0 +if _heading and Angle then +clock=12 +clock=_heading-Angle +hours=(clock/30)*-1 +clock=12+hours +clock=UTILS.Round(clock,0) +if clock>12 then clock=clock-12 end +if clock==0 then clock=12 end +end +return clock +end +function PLAYERRECCE:SetLaserCodes(LaserCodes) +self.LaserCodes=(type(LaserCodes)=="table")and LaserCodes or{LaserCodes} +return self +end +function PLAYERRECCE:SetReferencePoint(Coordinate,Name) +self.ReferencePoint=Coordinate +self.RPName=Name +if self.RPMarker then +self.RPMarker:Remove() +end +local llddm=Coordinate:ToStringLLDDM() +local lldms=Coordinate:ToStringLLDMS() +local mgrs=Coordinate:ToStringMGRS() +local text=string.format("%s RP %s\n%s\n%s\n%s",self.Name,Name,llddm,lldms,mgrs) +self.RPMarker=MARKER:New(Coordinate,text) +self.RPMarker:ReadOnly() +self.RPMarker:ToCoalition(self.Coalition) +return self +end +function PLAYERRECCE:SetPlayerTaskController(Controller) +self.UseController=true +self.Controller=Controller +return self +end +function PLAYERRECCE:SetAttackSet(AttackSet) +self.AttackSet=AttackSet +return self +end +function PLAYERRECCE:_CameraOn(client,playername) +local camera=true +local unit=client +if unit and unit:IsAlive()then +local typename=unit:GetTypeName() +if string.find(typename,"SA342")then +local dcsunit=Unit.getByName(client:GetName()) +local vivihorizontal=dcsunit:getDrawArgumentValue(215)or 0 +if vivihorizontal<-0.7 or vivihorizontal>0.7 then +camera=false +end +elseif string.find(typename,"OH58")then +local dcsunit=Unit.getByName(client:GetName()) +local vivihorizontal=dcsunit:getDrawArgumentValue(528)or 0 +if vivihorizontal<-0.527 or vivihorizontal>0.527 then +camera=false +end +elseif string.find(typename,"Ka-50")then +camera=true +end +end +return camera +end +function PLAYERRECCE:_GetKiowaMMSSight(Kiowa) +self:T(self.lid.."_GetKiowaMMSSight") +local unit=Kiowa +if unit and unit:IsAlive()then +local dcsunit=Unit.getByName(Kiowa:GetName()) +local mmshorizontal=dcsunit:getDrawArgumentValue(528)or 0 +local mmsvertical=dcsunit:getDrawArgumentValue(527)or 0 +self:T(string.format("Kiowa MMS Arguments Read: H %.3f V %.3f",mmshorizontal,mmsvertical)) +local mmson=true +if mmshorizontal<-0.527 or mmshorizontal>0.527 then mmson=false end +local horizontalview=mmshorizontal/0.527*190 +local heading=unit:GetHeading() +local mmsheading=(heading+horizontalview)%360 +local mmsyaw=math.atan(mmsvertical)*40 +local maxview=self:_GetActualMaxLOSight(unit,mmsheading,mmsyaw,not mmson) +if maxview>8000 then maxview=8000 end +self:T(string.format("Kiowa MMS Heading %d, Yaw %d, MaxView %dm MMS On %s",mmsheading,mmsyaw,maxview,tostring(mmson))) +return mmsheading,mmsyaw,maxview,mmson +end +return 0,0,0,false +end +function PLAYERRECCE:_GetGazelleVivianneSight(Gazelle) +self:T(self.lid.."GetGazelleVivianneSight") +local unit=Gazelle +if unit and unit:IsAlive()then +local dcsunit=Unit.getByName(Gazelle:GetName()) +local vivihorizontal=dcsunit:getDrawArgumentValue(215)or 0 +local vivivertical=dcsunit:getDrawArgumentValue(216)or 0 +local vivioff=false +if vivihorizontal<-0.67 then +vivihorizontal=-0.67 +vivioff=false +elseif vivihorizontal>0.67 then +vivihorizontal=0.67 +vivioff=true +return 0,0,0,false +end +local horizontalview=vivihorizontal*-180 +local verticalview=math.atan(vivivertical) +local heading=unit:GetHeading() +local viviheading=(heading+horizontalview)%360 +local maxview=self:_GetActualMaxLOSight(unit,viviheading,verticalview,vivioff) +if maxview>8000 then maxview=8000 end +return viviheading,verticalview,maxview,not vivioff +end +return 0,0,0,false +end +function PLAYERRECCE:_GetActualMaxLOSight(unit,vheading,vnod,vivoff) +self:T(self.lid.."_GetActualMaxLOSight") +if vivoff then return 0 end +local maxview=0 +if unit and unit:IsAlive()then +local typename=unit:GetTypeName() +maxview=self.MaxViewDistance[typename]or 8000 +local CamHeight=self.Cameraheight[typename]or 1 +if vnod<-2 then +local beta=90 +local gamma=90-math.abs(vnod) +local alpha=90-gamma +local a=unit:GetHeight()-unit:GetCoordinate():GetLandHeight()+CamHeight +local b=a/math.sin(math.rad(alpha)) +local c=b*math.sin(math.rad(gamma)) +maxview=c*1.2 +end +end +return math.ceil(math.abs(maxview)) +end +function PLAYERRECCE:SetCallSignOptions(ShortCallsign,Keepnumber,CallsignTranslations,CallsignCustomFunc,...) +if not ShortCallsign or ShortCallsign==false then +self.ShortCallsign=false +else +self.ShortCallsign=true +end +self.Keepnumber=Keepnumber or false +self.CallsignTranslations=CallsignTranslations +self.CallsignCustomFunc=CallsignCustomFunc +self.CallsignCustomArgs=arg or{} +return self +end +function PLAYERRECCE:_GetViewZone(unit,vheading,minview,maxview,angle,camon,laser) +self:T(self.lid.."_GetViewZone") +local viewzone=nil +if not camon then return nil end +if unit and unit:IsAlive()then +local unitname=unit:GetName() +if not laser then +local startpos=unit:GetCoordinate() +local heading1=(vheading+angle)%360 +local heading2=(vheading-angle)%360 +local pos1=startpos:Translate(maxview,heading1) +local pos2=startpos:Translate(maxview,heading2) +local array={} +table.insert(array,startpos:GetVec2()) +table.insert(array,pos1:GetVec2()) +table.insert(array,pos2:GetVec2()) +viewzone=ZONE_POLYGON:NewFromPointsArray(unitname,array) +else +local startp=unit:GetCoordinate() +local heading1=(vheading+90)%360 +local heading2=(vheading-90)%360 +self:T({heading1,heading2}) +local startpos=startp:Translate(minview,vheading) +local pos1=startpos:Translate(12.5,heading1) +local pos2=startpos:Translate(12.5,heading2) +local pos3=pos1:Translate(maxview,vheading) +local pos4=pos2:Translate(maxview,vheading) +local array={} +table.insert(array,pos1:GetVec2()) +table.insert(array,pos2:GetVec2()) +table.insert(array,pos4:GetVec2()) +table.insert(array,pos3:GetVec2()) +viewzone=ZONE_POLYGON:NewFromPointsArray(unitname,array) +end +end +return viewzone +end +function PLAYERRECCE:_GetKnownTargets(client) +self:T(self.lid.."_GetKnownTargets") +local finaltargets=SET_UNIT:New() +local targets=self.TargetCache:GetDataTable() +local playername=client:GetPlayerName() +for _,_target in pairs(targets)do +local targetdata=_target.PlayerRecceDetected +if targetdata.playername==playername then +finaltargets:Add(_target:GetName(),_target) +end +end +return finaltargets,finaltargets:CountAlive() +end +function PLAYERRECCE:_CleanupTargetCache() +self:T(self.lid.."_CleanupTargetCache") +local cleancache=FIFO:New() +self.TargetCache:ForEach( +function(unit) +local pull=false +if unit and unit:IsAlive()and unit:GetLife()>1 then +if unit.PlayerRecceDetected and unit.PlayerRecceDetected.timestamp then +local TNow=timer.getTime() +if TNow-unit.PlayerRecceDetected.timestamp>self.TForget then +pull=true +unit.PlayerRecceDetected=nil +end +else +pull=true +end +else +pull=true +end +if not pull then +cleancache:Push(unit,unit:GetName()) +end +end +) +self.TargetCache=nil +self.TargetCache=cleancache +return self +end +function PLAYERRECCE:_GetTargetSet(unit,camera,laser) +self:T(self.lid.."_GetTargetSet") +local finaltargets=SET_UNIT:New() +local finalcount=0 +local minview=0 +local typename=unit:GetTypeName() +local playername=unit:GetPlayerName() +local maxview=self.MaxViewDistance[typename]or 8000 +local heading,nod,maxview,angle=0,30,8000,10 +local camon=false +local name=unit:GetName() +if string.find(typename,"SA342")and camera then +heading,nod,maxview,camon=self:_GetGazelleVivianneSight(unit) +angle=10 +maxview=self.MaxViewDistance[typename]or 8000 +elseif string.find(typename,"Ka-50")and camera then +heading=unit:GetHeading() +nod,maxview,camon=10,1000,true +angle=10 +maxview=self.MaxViewDistance[typename]or 8000 +elseif string.find(typename,"OH58")and camera then +nod,maxview,camon=0,8000,true +heading,nod,maxview,camon=self:_GetKiowaMMSSight(unit) +angle=8 +if maxview==0 then +maxview=self.MaxViewDistance[typename]or 8000 +end +else +heading=unit:GetHeading() +nod,maxview,camon=10,3000,true +maxview=self.MaxViewDistance[typename]or 3000 +angle=45 +end +if laser then +if not self.LaserFOV[playername]then +minview=100 +maxview=2000 +self.LaserFOV[playername]={ +min=100, +max=2000, +} +else +minview=self.LaserFOV[playername].min +maxview=self.LaserFOV[playername].max +end +end +local zone=self:_GetViewZone(unit,heading,minview,maxview,angle,camon,laser) +if zone then +local redcoalition="red" +if self.Coalition==coalition.side.RED then +redcoalition="blue" +end +local startpos=unit:GetCoordinate() +local targetset=SET_UNIT:New():FilterCategories("ground"):FilterActive(true):FilterZones({zone}):FilterCoalitions(redcoalition):FilterOnce() +self:T("Prefilter Target Count = "..targetset:CountAlive()) +targetset:ForEach( +function(_unit) +local _unit=_unit +local _unitpos=_unit:GetCoordinate() +if startpos:IsLOS(_unitpos)and _unit:IsAlive()and _unit:GetLife()>1 then +self:T("Adding to final targets: ".._unit:GetName()) +finaltargets:Add(_unit:GetName(),_unit) +end +end +) +finalcount=finaltargets:CountAlive() +self:T(string.format("%s Unit: %s | Targets in view %s",self.lid,name,finalcount)) +end +return finaltargets,finalcount,zone +end +function PLAYERRECCE:_GetHVTTarget(targetset) +self:T(self.lid.."_GetHVTTarget") +local unitsbythreat={} +local minthreat=self.minthreatlevel or 0 +for _,_unit in pairs(targetset.Set)do +local unit=_unit +if unit and unit:IsAlive()and unit:GetLife()>1 then +local threat=unit:GetThreatLevel() +if threat>=minthreat then +if unit:HasAttribute("RADAR_BAND1_FOR_ARM")or unit:HasAttribute("RADAR_BAND2_FOR_ARM")or unit:HasAttribute("Optical Tracker")then +threat=11 +end +table.insert(unitsbythreat,{unit,threat}) +end +end +end +table.sort(unitsbythreat,function(a,b) +local aNum=a[2] +local bNum=b[2] +return aNum>bNum +end) +if unitsbythreat[1]and unitsbythreat[1][1]then +return unitsbythreat[1][1] +else +return nil +end +end +function PLAYERRECCE:_LaseTarget(client,targetset) +self:T(self.lid.."_LaseTarget") +local target=self:_GetHVTTarget(targetset) +local playername=client:GetPlayerName() +local laser=nil +if not self.LaserSpots[playername]then +laser=SPOT:New(client) +if not self.UnitLaserCodes[playername]then +self.UnitLaserCodes[playername]=1688 +end +laser.LaserCode=self.UnitLaserCodes[playername]or 1688 +self.LaserSpots[playername]=laser +else +laser=self.LaserSpots[playername] +end +if self.LaserTarget[playername]then +local target=self.LaserTarget[playername] +local oldtarget=target:GetObject() +self:T("Targetstate: "..target:GetState()) +self:T("Laser State: "..tostring(laser:IsLasing())) +if(not oldtarget)or targetset:IsNotInSet(oldtarget)or target:IsDead()or target:IsDestroyed()then +laser:LaseOff() +self:T(self.lid.."Target Life Points: "..target:GetLife()or"none") +if target:IsDead()or target:IsDestroyed()or target:GetDamage()>79 or target:GetLife()<=1 then +self:__Shack(-1,client,oldtarget) +else +self:__TargetLOSLost(-1,client,oldtarget) +end +self.LaserTarget[playername]=nil +oldtarget=nil +self.LaserSpots[playername]=nil +elseif oldtarget and laser and(not laser:IsLasing())then +self:T("Switching laser back on ..") +local lasercode=self.UnitLaserCodes[playername]or laser.LaserCode or 1688 +local lasingtime=self.lasingtime or 60 +laser:LaseOn(oldtarget,lasercode,lasingtime) +else +self:T("Target alive and laser is on!") +end +elseif(not laser:IsLasing())and target then +local relativecam=self.LaserRelativePos[client:GetTypeName()] +laser:SetRelativeStartPosition(relativecam) +local lasercode=self.UnitLaserCodes[playername]or laser.LaserCode or 1688 +local lasingtime=self.lasingtime or 60 +laser:LaseOn(target,lasercode,lasingtime) +self.LaserTarget[playername]=TARGET:New(target) +self:__TargetLasing(-1,client,target,lasercode,lasingtime) +end +return self +end +function PLAYERRECCE:_SetClientLaserCode(client,group,playername,code) +self:T(self.lid.."_SetClientLaserCode") +self.UnitLaserCodes[playername]=code or 1688 +if self.ClientMenus[playername]then +self.ClientMenus[playername]:Remove() +self.ClientMenus[playername]=nil +end +self:_BuildMenus() +return self +end +function PLAYERRECCE:_SwitchOnStation(client,group,playername) +self:T(self.lid.."_SwitchOnStation") +if not self.OnStation[playername]then +self.OnStation[playername]=true +self:__RecceOnStation(-1,client,playername) +else +self.OnStation[playername]=false +self:__RecceOffStation(-1,client,playername) +end +if self.ClientMenus[playername]then +self.ClientMenus[playername]:Remove() +self.ClientMenus[playername]=nil +end +self:_BuildMenus(client) +return self +end +function PLAYERRECCE:_SwitchSmoke(client,group,playername) +self:T(self.lid.."_SwitchLasing") +if not self.SmokeOwn[playername]then +self.SmokeOwn[playername]=true +MESSAGE:New("Smoke self is now ON",10,self.Name or"FACA"):ToClient(client) +else +self.SmokeOwn[playername]=false +MESSAGE:New("Smoke self is now OFF",10,self.Name or"FACA"):ToClient(client) +end +if self.ClientMenus[playername]then +self.ClientMenus[playername]:Remove() +self.ClientMenus[playername]=nil +end +self:_BuildMenus(client) +return self +end +function PLAYERRECCE:_SwitchLasing(client,group,playername) +self:T(self.lid.."_SwitchLasing") +if not self.AutoLase[playername]then +self.AutoLase[playername]=true +MESSAGE:New("Lasing is now ON",10,self.Name or"FACA"):ToClient(client) +else +self.AutoLase[playername]=false +if self.LaserSpots[playername]then +local laser=self.LaserSpots[playername] +if laser:IsLasing()then +laser:LaseOff() +end +self.LaserSpots[playername]=nil +end +MESSAGE:New("Lasing is now OFF",10,self.Name or"FACA"):ToClient(client) +end +if self.ClientMenus[playername]then +self.ClientMenus[playername]:Remove() +self.ClientMenus[playername]=nil +end +self:_BuildMenus(client) +return self +end +function PLAYERRECCE:_SwitchLasingDist(client,group,playername,mindist,maxdist) +self:T(self.lid.."_SwitchLasingDist") +local mind=mindist or 100 +local maxd=maxdist or 2000 +if not self.LaserFOV[playername]then +self.LaserFOV[playername]={ +min=mind, +max=maxd, +} +else +self.LaserFOV[playername].min=mind +self.LaserFOV[playername].max=maxd +end +MESSAGE:New(string.format("Laser distance set to %d-%dm!",mindist,maxdist),10,"FACA"):ToClient(client) +if self.ClientMenus[playername]then +self.ClientMenus[playername]:Remove() +self.ClientMenus[playername]=nil +end +self:_BuildMenus(client) +return self +end +function PLAYERRECCE:_WIP(client,group,playername) +self:T(self.lid.."_WIP") +return self +end +function PLAYERRECCE:_SmokeTargets(client,group,playername) +self:T(self.lid.."_SmokeTargets") +local cameraset=self:_GetTargetSet(client,true) +local visualset=self:_GetTargetSet(client,false) +if cameraset:CountAlive()>0 or visualset:CountAlive()>0 then +self:__TargetsSmoked(-1,client,playername,cameraset) +else +return self +end +local highsmoke=self.SmokeColor.highsmoke +local medsmoke=self.SmokeColor.medsmoke +local lowsmoke=self.SmokeColor.lowsmoke +local lasersmoke=self.SmokeColor.lasersmoke +local laser=self.LaserSpots[playername] +if laser and laser.Target and laser.Target:IsAlive()then +laser.Target:GetCoordinate():Smoke(lasersmoke) +end +local coord=visualset:GetCoordinate() +if coord and self.smokeaveragetargetpos then +coord:SetAtLandheight() +coord:Smoke(medsmoke) +else +for _,_unit in pairs(visualset.Set)do +local unit=_unit +if unit and unit:IsAlive()then +local coord=unit:GetCoordinate() +local threat=unit:GetThreatLevel() +if coord then +local color=lowsmoke +if threat>7 then +color=highsmoke +elseif threat>2 then +color=medsmoke +end +coord:Smoke(color) +end +end +end +end +if self.SmokeOwn[playername]then +local cc=client:GetVec2() +local lc=COORDINATE:NewFromVec2(cc,1) +local color=self.SmokeColor.ownsmoke +lc:Smoke(color) +end +return self +end +function PLAYERRECCE:_FlareTargets(client,group,playername) +self:T(self.lid.."_FlareTargets") +local cameraset=self:_GetTargetSet(client,true) +local visualset=self:_GetTargetSet(client,false) +cameraset:AddSet(visualset) +if cameraset:CountAlive()>0 then +self:__TargetsFlared(-1,client,playername,cameraset) +end +local highsmoke=self.FlareColor.highflare +local medsmoke=self.FlareColor.medflare +local lowsmoke=self.FlareColor.lowflare +local lasersmoke=self.FlareColor.laserflare +local laser=self.LaserSpots[playername] +if laser and laser.Target and laser.Target:IsAlive()then +laser.Target:GetCoordinate():Flare(lasersmoke) +if cameraset:IsInSet(laser.Target)then +cameraset:Remove(laser.Target:GetName(),true) +end +end +for _,_unit in pairs(cameraset.Set)do +local unit=_unit +if unit and unit:IsAlive()then +local coord=unit:GetCoordinate() +local threat=unit:GetThreatLevel() +if coord then +local color=lowsmoke +if threat>7 then +color=highsmoke +elseif threat>2 then +color=medsmoke +end +coord:Flare(color) +end +end +end +return self +end +function PLAYERRECCE:_IlluTargets(client,group,playername) +self:T(self.lid.."_IlluTargets") +local totalset,count=self:_GetKnownTargets(client) +if count>0 then +local coord=totalset:GetCoordinate() +coord.y=coord.y+200 +coord:IlluminationBomb(nil,1) +self:__Illumination(1,client,playername,totalset) +end +return self +end +function PLAYERRECCE:_UploadTargets(client,group,playername) +self:T(self.lid.."_UploadTargets") +local totalset,count=self:_GetKnownTargets(client) +if count>0 then +self.Controller:AddTarget(totalset) +self:__TargetReportSent(1,client,playername,totalset) +end +return self +end +function PLAYERRECCE:_ReportLaserTargets(client,group,playername) +self:T(self.lid.."_ReportLaserTargets") +local targetset,number=self:_GetTargetSet(client,true,true) +if number>0 and self.AutoLase[playername]then +local Settings=(client and _DATABASE:GetPlayerSettings(playername))or _SETTINGS +local target=self:_GetHVTTarget(targetset) +local ThreatLevel=target:GetThreatLevel()or 1 +local ThreatLevelText="high" +if ThreatLevel>3 and ThreatLevel<8 then +ThreatLevelText="medium" +elseif ThreatLevel<=3 then +ThreatLevelText="low" +end +local ThreatGraph="["..string.rep("■",ThreatLevel)..string.rep("□",10-ThreatLevel).."]: "..ThreatLevel +local report=REPORT:New("Lasing Report") +report:Add(string.rep("-",15)) +report:Add("Target type: "..target:GetTypeName()or"unknown") +report:Add("Threat Level: "..ThreatGraph.." ("..ThreatLevelText..")") +if not self.ReferencePoint then +report:Add("Location: "..client:GetCoordinate():ToStringBULLS(self.Coalition,Settings)) +if self.reporttostringbullsonly~=true then +report:Add("Location: "..client:GetCoordinate():ToStringA2G(nil,Settings)) +end +else +report:Add("Location: "..client:GetCoordinate():ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings)) +end +report:Add("Laser Code: "..self.UnitLaserCodes[playername]or 1688) +report:Add(string.rep("-",15)) +local text=report:Text() +self:__TargetReport(1,client,targetset,target,text) +else +local report=REPORT:New("Lasing Report") +report:Add(string.rep("-",15)) +report:Add("N O T A R G E T S") +report:Add(string.rep("-",15)) +local text=report:Text() +self:__TargetReport(1,client,nil,nil,text) +end +return self +end +function PLAYERRECCE:_ReportVisualTargets(client,group,playername) +self:T(self.lid.."_ReportVisualTargets") +local targetset,number=self:_GetKnownTargets(client) +if number>0 then +local Settings=(client and _DATABASE:GetPlayerSettings(playername))or _SETTINGS +local ThreatLevel=targetset:CalculateThreatLevelA2G() +local ThreatLevelText="high" +if ThreatLevel>3 and ThreatLevel<8 then +ThreatLevelText="medium" +elseif ThreatLevel<=3 then +ThreatLevelText="low" +end +local ThreatGraph="["..string.rep("■",ThreatLevel)..string.rep("□",10-ThreatLevel).."]: "..ThreatLevel +local report=REPORT:New("Target Report") +report:Add(string.rep("-",15)) +report:Add("Target count: "..number) +report:Add("Threat Level: "..ThreatGraph.." ("..ThreatLevelText..")") +if not self.ReferencePoint then +report:Add("Location: "..client:GetCoordinate():ToStringBULLS(self.Coalition,Settings)) +if self.reporttostringbullsonly~=true then +report:Add("Location: "..client:GetCoordinate():ToStringA2G(nil,Settings)) +end +else +report:Add("Location: "..client:GetCoordinate():ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings)) +if self.reporttostringbullsonly~=true then +report:Add("Location: "..client:GetCoordinate():ToStringA2G(nil,Settings)) +end +end +report:Add(string.rep("-",15)) +local text=report:Text() +self:__TargetReport(1,client,targetset,nil,text) +else +local report=REPORT:New("Target Report") +report:Add(string.rep("-",15)) +report:Add("N O T A R G E T S") +report:Add(string.rep("-",15)) +local text=report:Text() +self:__TargetReport(1,client,nil,nil,text) +end +return self +end +function PLAYERRECCE:_BuildMenus(Client) +self:T(self.lid.."_BuildMenus") +local clients=self.PlayerSet +local clientset=clients:GetSetObjects() +if Client then clientset={Client}end +for _,_client in pairs(clientset)do +local client=_client +if client and client:IsAlive()then +local playername=client:GetPlayerName() +self:T("Menu for "..playername) +if not self.UnitLaserCodes[playername]then +self:_SetClientLaserCode(nil,nil,playername,1688) +end +if self.SmokeOwn[playername]==nil then +self.SmokeOwn[playername]=self.smokeownposition +end +local group=client:GetGroup() +if not self.ClientMenus[playername]then +self:T("Start Menubuild for "..playername) +local canlase=self.CanLase[client:GetTypeName()] +self.ClientMenus[playername]=MENU_GROUP:New(group,self.MenuName or self.Name or"RECCE") +local txtonstation=self.OnStation[playername]and"ON"or"OFF" +local text=string.format("Switch On-Station (%s)",txtonstation) +local onstationmenu=MENU_GROUP_COMMAND:New(group,text,self.ClientMenus[playername],self._SwitchOnStation,self,client,group,playername) +if self.OnStation[playername]then +local smoketopmenu=MENU_GROUP:New(group,"Visual Markers",self.ClientMenus[playername]) +local smokemenu=MENU_GROUP_COMMAND:New(group,"Smoke Targets",smoketopmenu,self._SmokeTargets,self,client,group,playername) +local flaremenu=MENU_GROUP_COMMAND:New(group,"Flare Targets",smoketopmenu,self._FlareTargets,self,client,group,playername) +local illumenu=MENU_GROUP_COMMAND:New(group,"Illuminate Area",smoketopmenu,self._IlluTargets,self,client,group,playername) +local ownsm=self.SmokeOwn[playername]and"ON"or"OFF" +local owntxt=string.format("Switch smoke self (%s)",ownsm) +local ownsmoke=MENU_GROUP_COMMAND:New(group,owntxt,smoketopmenu,self._SwitchSmoke,self,client,group,playername) +if canlase then +local txtonstation=self.AutoLase[playername]and"ON"or"OFF" +local text=string.format("Switch Lasing (%s)",txtonstation) +local lasemenu=MENU_GROUP_COMMAND:New(group,text,self.ClientMenus[playername],self._SwitchLasing,self,client,group,playername) +local lasedist=MENU_GROUP:New(group,"Set Laser Distance",self.ClientMenus[playername]) +local mindist=100 +local maxdist=2000 +if self.LaserFOV[playername]and self.LaserFOV[playername].max then +maxdist=self.LaserFOV[playername].max +end +local laselist={} +for i=2,8 do +local dist1=(i*1000)-1000 +local dist2=i*1000 +dist1=dist1==1000 and 100 or dist1 +local text=string.format("%d-%dm",dist1,dist2) +if dist2==maxdist then +text=text.." (*)" +end +laselist[i]=MENU_GROUP_COMMAND:New(group,text,lasedist,self._SwitchLasingDist,self,client,group,playername,dist1,dist2) +end +end +local targetmenu=MENU_GROUP:New(group,"Target Report",self.ClientMenus[playername]) +if canlase then +local reportL=MENU_GROUP_COMMAND:New(group,"Laser Target",targetmenu,self._ReportLaserTargets,self,client,group,playername) +end +local reportV=MENU_GROUP_COMMAND:New(group,"Visual Targets",targetmenu,self._ReportVisualTargets,self,client,group,playername) +if self.UseController then +local text=string.format("Target Upload to %s",self.Controller.MenuName or self.Controller.Name) +local upload=MENU_GROUP_COMMAND:New(group,text,targetmenu,self._UploadTargets,self,client,group,playername) +end +if canlase then +local lasecodemenu=MENU_GROUP:New(group,"Set Laser Code",self.ClientMenus[playername]) +local codemenu={} +for _,_code in pairs(self.LaserCodes)do +if _code==self.UnitLaserCodes[playername]then +_code=tostring(_code).."(*)" +end +codemenu[playername.._code]=MENU_GROUP_COMMAND:New(group,tostring(_code),lasecodemenu,self._SetClientLaserCode,self,client,group,playername,_code) +end +end +end +end +end +end +return self +end +function PLAYERRECCE:_CheckNewTargets(targetset,client,playername) +self:T(self.lid.."_CheckNewTargets") +local tempset=SET_UNIT:New() +targetset:ForEach( +function(unit) +if unit and unit:IsAlive()then +self:T("Report unit: "..unit:GetName()) +if not unit.PlayerRecceDetected then +self:T("New unit: "..unit:GetName()) +unit.PlayerRecceDetected={ +detected=true, +recce=client, +playername=playername, +timestamp=timer.getTime() +} +tempset:Add(unit:GetName(),unit) +if not self.TargetCache:HasUniqueID(unit:GetName())then +self.TargetCache:Push(unit,unit:GetName()) +end +end +if unit.PlayerRecceDetected and unit.PlayerRecceDetected.timestamp then +local TNow=timer.getTime() +if TNow-unit.PlayerRecceDetected.timestamp>self.TForget then +unit.PlayerRecceDetected={ +detected=true, +recce=client, +playername=playername, +timestamp=timer.getTime() +} +if not self.TargetCache:HasUniqueID(unit:GetName())then +self.TargetCache:Push(unit,unit:GetName()) +end +tempset:Add(unit:GetName(),unit) +end +end +end +end +) +local targetsbyclock={} +for i=1,12 do +targetsbyclock[i]={} +end +tempset:ForEach( +function(object) +local obj=object +local clock=self:_GetClockDirection(client,obj) +table.insert(targetsbyclock[clock],obj) +end +) +self:T("Known target Count: "..self.TargetCache:Count()) +if tempset:CountAlive()>0 then +self:TargetDetected(targetsbyclock,client,playername) +end +return self +end +function PLAYERRECCE:SetSRS(Frequency,Modulation,PathToSRS,Gender,Culture,Port,Voice,Volume,PathToGoogleKey,Backend) +self:T(self.lid.."SetSRS") +self.PathToSRS=PathToSRS or MSRS.path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +self.Gender=Gender or MSRS.gender or"male" +self.Culture=Culture or MSRS.culture or"en-US" +self.Port=Port or MSRS.port or 5002 +self.Voice=Voice or MSRS.voice +self.PathToGoogleKey=PathToGoogleKey +self.Volume=Volume or 1.0 +self.UseSRS=true +self.Frequency=Frequency or{127,251} +self.BCFrequency=self.Frequency +self.Modulation=Modulation or{radio.modulation.FM,radio.modulation.AM} +self.BCModulation=self.Modulation +self.SRS=MSRS:New(self.PathToSRS,self.Frequency,self.Modulation) +self.SRS:SetCoalition(self.Coalition) +self.SRS:SetLabel(self.MenuName or self.Name) +self.SRS:SetGender(self.Gender) +self.SRS:SetCulture(self.Culture) +self.SRS:SetPort(self.Port) +self.SRS:SetVolume(self.Volume) +if Backend then +self.SRS:SetBackend(Backend) +end +if self.PathToGoogleKey then +self.SRS:SetProviderOptionsGoogle(self.PathToGoogleKey,self.PathToGoogleKey) +self.SRS:SetProvider(MSRS.Provider.GOOGLE) +end +if(not PathToGoogleKey)and self.SRS:GetProvider()==MSRS.Provider.GOOGLE then +self.PathToGoogleKey=MSRS.poptions.gcloud.credentials +self.Voice=Voice or MSRS.poptions.gcloud.voice +end +self.SRS:SetVoice(self.Voice) +self.SRSQueue=MSRSQUEUE:New(self.MenuName or self.Name) +self.SRSQueue:SetTransmitOnlyWithPlayers(self.TransmitOnlyWithPlayers) +return self +end +function PLAYERRECCE:SetTransmitOnlyWithPlayers(Switch) +self.TransmitOnlyWithPlayers=Switch +if self.SRSQueue then +self.SRSQueue:SetTransmitOnlyWithPlayers(Switch) +end +return self +end +function PLAYERRECCE:SetMenuName(Name) +self:T(self.lid.."SetMenuName: "..Name) +self.MenuName=Name +return self +end +function PLAYERRECCE:SetReportBullsOnly(OnOff) +self:T(self.lid.."SetReportBullsOnly: "..tostring(OnOff)) +self.reporttostringbullsonly=OnOff +return self +end +function PLAYERRECCE:EnableSmokeOwnPosition() +self:T(self.lid.."EnableSmokeOwnPosition") +self.smokeownposition=true +return self +end +function PLAYERRECCE:EnableKiowaAutolase() +self:T(self.lid.."EnableKiowaAutolase") +self.CanLase.OH58D=true +return self +end +function PLAYERRECCE:DisableSmokeOwnPosition() +self:T(self.lid.."DisableSmokeOwnPosition") +self.smokeownposition=false +return self +end +function PLAYERRECCE:EnableSmokeAverageTargetPosition() +self:T(self.lid.."ENableSmokeOwnPosition") +self.smokeaveragetargetpos=true +return self +end +function PLAYERRECCE:DisableSmokeAverageTargetPosition() +self:T(self.lid.."DisableSmokeAverageTargetPosition") +self.smokeaveragetargetpos=false +return self +end +function PLAYERRECCE:_GetTextForSpeech(text) +text=string.gsub(text,"%d","%1 ") +text=string.gsub(text,"^%s*","") +text=string.gsub(text,"%s*$","") +text=string.gsub(text,"0","zero") +text=string.gsub(text,"9","niner") +text=string.gsub(text," "," ") +return text +end +function PLAYERRECCE:onafterStatus(From,Event,To) +self:T({From,Event,To}) +if not self.timestamp then +self.timestamp=timer.getTime() +else +local tNow=timer.getTime() +if tNow-self.timestamp>=60 then +self:_CleanupTargetCache() +self.timestamp=timer.getTime() +end +end +self:_BuildMenus() +self.PlayerSet:ForEachClient( +function(Client) +local client=Client +local playername=client:GetPlayerName() +local cameraison=self:_CameraOn(client,playername) +if client and client:IsAlive()and self.OnStation[playername]then +local targetset,targetcount,tzone=nil,0,nil +local laserset,lzone=nil,nil +local vistargetset,vistargetcount,viszone=nil,0,nil +if cameraison then +targetset,targetcount,tzone=self:_GetTargetSet(client,true) +if targetset then +if self.ViewZone[playername]then +self.ViewZone[playername]:UndrawZone() +end +if self.debug and tzone then +self.ViewZone[playername]=tzone:DrawZone(self.Coalition,{0,0,1},nil,nil,nil,1) +end +end +self:T({targetcount=targetcount}) +end +if self.AutoLase[playername]and cameraison then +laserset,targetcount,lzone=self:_GetTargetSet(client,true,true) +if targetcount>0 or self.LaserTarget[playername]then +if self.CanLase[client:GetTypeName()]then +self:_LaseTarget(client,laserset) +end +end +if lzone then +if self.ViewZoneLaser[playername]then +self.ViewZoneLaser[playername]:UndrawZone() +end +if self.debug and tzone then +self.ViewZoneLaser[playername]=lzone:DrawZone(self.Coalition,{0,1,0},nil,nil,nil,1) +end +end +self:T({lasercount=targetcount}) +end +vistargetset,vistargetcount,viszone=self:_GetTargetSet(client,false) +if vistargetset then +if self.ViewZoneVisual[playername]then +self.ViewZoneVisual[playername]:UndrawZone() +end +if self.debug and viszone then +self.ViewZoneVisual[playername]=viszone:DrawZone(self.Coalition,{1,0,0},nil,nil,nil,3) +end +end +self:T({visualtargetcount=vistargetcount}) +if targetset then +vistargetset:AddSet(targetset) +end +if laserset then +vistargetset:AddSet(laserset) +end +if not cameraison and self.debug then +if self.ViewZoneLaser[playername]then +self.ViewZoneLaser[playername]:UndrawZone() +end +if self.ViewZone[playername]then +self.ViewZone[playername]:UndrawZone() +end +end +self:_CheckNewTargets(vistargetset,client,playername) +end +end +) +self:__Status(-10) +return self +end +function PLAYERRECCE:onafterRecceOnStation(From,Event,To,Client,Playername) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition) +if self.ReferencePoint then +local Settings=Client and _DATABASE:GetPlayerSettings(Playername)or _SETTINGS +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,Client,Settings) +end +local text1="Party time!" +local text2=string.format("All stations, FACA %s on station\nat %s!",callsign,coordtext) +local text2tts=string.format(" All stations, FACA %s on station at %s!",callsign,coordtext) +text2tts=self:_GetTextForSpeech(text2tts) +if self.debug then +self:T(text2.."\n"..text2tts) +end +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(text1,nil,self.SRS,nil,2) +self.SRSQueue:NewTransmission(text2tts,nil,self.SRS,nil,3) +MESSAGE:New(text2,10,self.Name or"FACA"):ToCoalition(self.Coalition) +else +MESSAGE:New(text1,10,self.Name or"FACA"):ToClient(Client) +MESSAGE:New(text2,10,self.Name or"FACA"):ToCoalition(self.Coalition) +end +return self +end +function PLAYERRECCE:onafterRecceOffStation(From,Event,To,Client,Playername) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition) +if self.ReferencePoint then +local Settings=Client and _DATABASE:GetPlayerSettings(Playername)or _SETTINGS +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,Client,Settings) +end +local text=string.format("All stations, FACA %s leaving station\nat %s, good bye!",callsign,coordtext) +local texttts=string.format("All stations, FACA %s leaving station at %s, good bye!",callsign,coordtext) +texttts=self:_GetTextForSpeech(texttts) +if self.debug then +self:T(text.."\n"..texttts) +end +local text1="Going home!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(text1,nil,self.SRS,nil,2) +self.SRSQueue:NewTransmission(texttts,nil,self.SRS,nil,3) +MESSAGE:New(text,10,self.Name or"FACA"):ToCoalition(self.Coalition) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToCoalition(self.Coalition) +end +return self +end +function PLAYERRECCE:onafterTargetDetected(From,Event,To,Targetsbyclock,Client,Playername) +self:T({From,Event,To}) +local dunits="meters" +local Settings=Client and _DATABASE:GetPlayerSettings(Playername)or _SETTINGS +local clientcoord=Client:GetCoordinate() +for i=1,12 do +local targets=Targetsbyclock[i] +local targetno=#targets +if targetno==1 then +local targetdistance=clientcoord:Get2DDistance(targets[1]:GetCoordinate())or 100 +local Threatlvl=targets[1]:GetThreatLevel() +local ThreatTxt="Low" +if Threatlvl>=7 then +ThreatTxt="Medium" +elseif Threatlvl>=3 then +ThreatTxt="High" +end +if Settings:IsMetric()then +targetdistance=UTILS.Round(targetdistance,-2) +if targetdistance>=1000 then +targetdistance=UTILS.Round(targetdistance/1000,0) +dunits="kilometer" +end +else +if UTILS.MetersToNM(targetdistance)>=1 then +targetdistance=UTILS.Round(UTILS.MetersToNM(targetdistance),0) +dunits="miles" +else +targetdistance=UTILS.Round(UTILS.MetersToFeet(targetdistance),-2) +dunits="feet" +end +end +local text=string.format("Target! %s! %s o\'clock, %d %s!",ThreatTxt,i,targetdistance,dunits) +local ttstext=string.format("Target! %s! %s oh clock, %d %s!",ThreatTxt,i,targetdistance,dunits) +if self.UseSRS then +local grp=Client:GetGroup() +if clientcoord then +self.SRS:SetCoordinate(clientcoord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +elseif targetno>1 then +local function GetNearest(TTable) +local distance=10000000 +for _,_unit in pairs(TTable)do +local dist=clientcoord:Get2DDistance(_unit:GetCoordinate())or 100 +if dist<distance then +distance=dist +end +end +return distance +end +local targetdistance=GetNearest(targets) +if Settings:IsMetric()then +targetdistance=UTILS.Round(targetdistance,-2) +if targetdistance>=1000 then +targetdistance=UTILS.Round(targetdistance/1000,0) +dunits="kilometer" +end +else +if UTILS.MetersToNM(targetdistance)>=1 then +targetdistance=UTILS.Round(UTILS.MetersToNM(targetdistance),0) +dunits="miles" +else +targetdistance=UTILS.Round(UTILS.MetersToFeet(targetdistance),-2) +dunits="feet" +end +end +local text=string.format(" %d targets! %s o\'clock, %d %s!",targetno,i,targetdistance,dunits) +local ttstext=string.format("%d targets! %s oh clock, %d %s!",targetno,i,targetdistance,dunits) +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +end +end +return self +end +function PLAYERRECCE:onafterIllumination(From,Event,To,Client,Playername,TargetSet) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition) +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +local coordtext=coord:ToStringA2G(client,Settings) +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local text=string.format("All stations, %s fired illumination\nat %s!",callsign,coordtext) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Sunshine!" +local ttstext="Sunshine!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterTargetsSmoked(From,Event,To,Client,Playername,TargetSet) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition) +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +local coordtext=coord:ToStringA2G(client,Settings) +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local text=string.format("All stations, %s smoked targets\nat %s!",callsign,coordtext) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Smoke on!" +local ttstext="Smoke and Mirrors!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterTargetsFlared(From,Event,To,Client,Playername,TargetSet) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition) +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local coordtext=coord:ToStringA2G(client,Settings) +local text=string.format("All stations, %s flared targets\nat %s!",callsign,coordtext) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Fireworks!" +local ttstext="Fire works!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterTargetLasing(From,Event,To,Client,Target,Lasercode,Lasingtime) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local Settings=(Client and _DATABASE:GetPlayerSettings(Client:GetPlayerName()))or _SETTINGS +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition,Settings) +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,Client,Settings) +end +local targettype=Target:GetTypeName() +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local coordtext=coord:ToStringA2G(client,Settings) +local text=string.format("All stations, %s lasing %s\nat %s!\nCode %d, Duration %d plus seconds!",callsign,targettype,coordtext,Lasercode,Lasingtime) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Lasing!" +local ttstext="Laser on!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterShack(From,Event,To,Client,Target) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local Settings=(Client and _DATABASE:GetPlayerSettings(Client:GetPlayerName()))or _SETTINGS +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition,Settings) +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,Client,Settings) +end +local targettype="target" +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local coordtext=coord:ToStringA2G(client,Settings) +local text=string.format("All stations, %s good hit on %s\nat %s!",callsign,targettype,coordtext) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Shack!" +local ttstext="Shack!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterTargetLOSLost(From,Event,To,Client,Target) +self:T({From,Event,To}) +local callsign=Client:GetGroup():GetCustomCallSign(self.ShortCallsign,self.Keepnumber,self.CallsignTranslations,self.CallsignCustomFunc,self.CallsignCustomArgs) +local Settings=(Client and _DATABASE:GetPlayerSettings(Client:GetPlayerName()))or _SETTINGS +local coord=Client:GetCoordinate() +local coordtext=coord:ToStringBULLS(self.Coalition,Settings) +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,Client,Settings) +end +local targettype="target" +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()then +local Settings=client and _DATABASE:GetPlayerSettings(client:GetPlayerName())or _SETTINGS +if self.ReferencePoint then +coordtext=coord:ToStringFromRPShort(self.ReferencePoint,self.RPName,client,Settings) +end +local coordtext=coord:ToStringA2G(client,Settings) +local text=string.format("All stations, %s lost sight of %s\nat %s!",callsign,targettype,coordtext) +MESSAGE:New(text,15,self.Name or"FACA"):ToClient(client) +end +end +end +local text="Lost LOS!" +local ttstext="Lost L O S!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(ttstext,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterTargetReport(From,Event,To,Client,TargetSet,Target,Text) +self:T({From,Event,To}) +MESSAGE:New(Text,45,self.Name or"FACA"):ToClient(Client) +if self.AttackSet then +for _,_client in pairs(self.AttackSet.Set)do +local client=_client +if client and client:IsAlive()and client~=Client then +MESSAGE:New(Text,45,self.Name or"FACA"):ToClient(client) +end +end +end +return self +end +function PLAYERRECCE:onafterTargetReportSent(From,Event,To,Client,Playername,TargetSet) +self:T({From,Event,To}) +local text="Upload completed!" +if self.UseSRS then +local grp=Client:GetGroup() +local coord=grp:GetCoordinate() +if coord then +self.SRS:SetCoordinate(coord) +end +self.SRSQueue:NewTransmission(text,nil,self.SRS,nil,1,{grp},text,10) +else +MESSAGE:New(text,10,self.Name or"FACA"):ToClient(Client) +end +return self +end +function PLAYERRECCE:onafterStop(From,Event,To) +self:I({From,Event,To}) +self:UnHandleEvent(EVENTS.PlayerLeaveUnit) +self:UnHandleEvent(EVENTS.Ejection) +self:UnHandleEvent(EVENTS.Crash) +self:UnHandleEvent(EVENTS.PilotDead) +self:UnHandleEvent(EVENTS.PlayerEnterAircraft) +return self +end +SQUADRON={ +ClassName="SQUADRON", +verbose=0, +modex=nil, +modexcounter=0, +callsignName=nil, +callsigncounter=11, +tankerSystem=nil, +refuelSystem=nil, +} +SQUADRON.version="0.8.1" +function SQUADRON:New(TemplateGroupName,Ngroups,SquadronName) +local self=BASE:Inherit(self,COHORT:New(TemplateGroupName,Ngroups,SquadronName)) +self:AddMissionCapability(AUFTRAG.Type.ORBIT) +self.isAir=true +self.refuelSystem=select(2,self.templategroup:GetUnit(1):IsRefuelable()) +self.tankerSystem=select(2,self.templategroup:GetUnit(1):IsTanker()) +return self +end +function SQUADRON:SetGrouping(nunits) +self.ngrouping=nunits or 2 +if self.ngrouping<1 then self.ngrouping=1 end +if self.ngrouping>4 then self.ngrouping=4 end +return self +end +function SQUADRON:SetParkingIDs(ParkingIDs) +if type(ParkingIDs)~="table"then +ParkingIDs={ParkingIDs} +end +self.parkingIDs=ParkingIDs +return self +end +function SQUADRON:SetTakeoffType(TakeoffType) +TakeoffType=TakeoffType or"Cold" +if TakeoffType:lower()=="hot"then +self.takeoffType=COORDINATE.WaypointType.TakeOffParkingHot +elseif TakeoffType:lower()=="cold"then +self.takeoffType=COORDINATE.WaypointType.TakeOffParking +elseif TakeoffType:lower()=="air"then +self.takeoffType=COORDINATE.WaypointType.TurningPoint +else +self.takeoffType=COORDINATE.WaypointType.TakeOffParking +end +return self +end +function SQUADRON:SetTakeoffCold() +self:SetTakeoffType("Cold") +return self +end +function SQUADRON:SetTakeoffHot() +self:SetTakeoffType("Hot") +return self +end +function SQUADRON:SetTakeoffAir() +self:SetTakeoffType("Air") +return self +end +function SQUADRON:SetDespawnAfterLanding(Switch) +if Switch then +self.despawnAfterLanding=Switch +else +self.despawnAfterLanding=true +end +return self +end +function SQUADRON:SetDespawnAfterHolding(Switch) +if Switch then +self.despawnAfterHolding=Switch +else +self.despawnAfterHolding=true +end +return self +end +function SQUADRON:SetFuelLowThreshold(LowFuel) +self.fuellow=LowFuel or 25 +return self +end +function SQUADRON:SetFuelLowRefuel(switch) +if switch==false then +self.fuellowRefuel=false +else +self.fuellowRefuel=true +end +return self +end +function SQUADRON:SetAirwing(Airwing) +self.legion=Airwing +return self +end +function SQUADRON:GetAirwing(Airwing) +return self.legion +end +function SQUADRON:onafterStart(From,Event,To) +local text=string.format("Starting SQUADRON",self.name) +self:T(self.lid..text) +self:__Status(-1) +end +function SQUADRON:onafterStatus(From,Event,To) +if self.verbose>=1 then +local fsmstate=self:GetState() +local callsign=self.callsignName and UTILS.GetCallsignName(self.callsignName)or"N/A" +local modex=self.modex and self.modex or-1 +local skill=self.skill and tostring(self.skill)or"N/A" +local NassetsTot=#self.assets +local NassetsInS=self:CountAssets(true) +local NassetsQP=0;local NassetsP=0;local NassetsQ=0 +if self.legion then +NassetsQP,NassetsP,NassetsQ=self.legion:CountAssetsOnMission(nil,self) +end +local text=string.format("%s [Type=%s, Call=%s, Modex=%d, Skill=%s]: Assets Total=%d, Stock=%d, Mission=%d [Active=%d, Queue=%d]", +fsmstate,self.aircrafttype,callsign,modex,skill,NassetsTot,NassetsInS,NassetsQP,NassetsP,NassetsQ) +self:I(self.lid..text) +self:_CheckAssetStatus() +end +if not self:IsStopped()then +self:__Status(-60) +end +end +TARGET={ +ClassName="TARGET", +verbose=0, +lid=nil, +targets={}, +targetcounter=0, +life=0, +life0=0, +N0=0, +Ntargets0=0, +Ndestroyed=0, +Ndead=0, +elements={}, +casualties={}, +threatlevel0=0, +conditionStart={}, +TStatus=30, +} +TARGET.ObjectType={ +GROUP="Group", +UNIT="Unit", +STATIC="Static", +SCENERY="Scenery", +COORDINATE="Coordinate", +AIRBASE="Airbase", +ZONE="Zone", +OPSZONE="OpsZone" +} +TARGET.Category={ +AIRCRAFT="Aircraft", +GROUND="Ground", +NAVAL="Naval", +AIRBASE="Airbase", +COORDINATE="Coordinate", +ZONE="Zone", +} +TARGET.ObjectStatus={ +ALIVE="Alive", +DEAD="Dead", +DAMAGED="Damaged", +} +_TARGETID=0 +TARGET.version="0.7.1" +function TARGET:New(TargetObject) +local self=BASE:Inherit(self,FSM:New()) +_TARGETID=_TARGETID+1 +self.uid=_TARGETID +if TargetObject then +self:AddObject(TargetObject) +end +self:SetPriority() +self:SetImportance() +self.TStatus=30 +self.lid=string.format("TARGET #%03d | ",_TARGETID) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Alive") +self:AddTransition("*","Status","*") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","ObjectDamaged","*") +self:AddTransition("*","ObjectDestroyed","*") +self:AddTransition("*","ObjectDead","*") +self:AddTransition("*","Damaged","Damaged") +self:AddTransition("*","Destroyed","Dead") +self:AddTransition("*","Dead","Dead") +self:__Start(-0.1) +return self +end +function TARGET:AddObject(Object) +if Object:IsInstanceOf("SET_GROUP")or +Object:IsInstanceOf("SET_UNIT")or +Object:IsInstanceOf("SET_STATIC")or +Object:IsInstanceOf("SET_SCENERY")or +Object:IsInstanceOf("SET_OPSGROUP")or +Object:IsInstanceOf("SET_OPSZONE")then +local set=Object +for _,object in pairs(set.Set)do +self:AddObject(object) +end +elseif Object:IsInstanceOf("SET_ZONE")then +local set=Object +set:SortByName() +for index,ZoneName in pairs(set.Index)do +local zone=set.Set[ZoneName] +self:_AddObject(zone) +end +else +if Object:IsInstanceOf("OPSGROUP")then +self:_AddObject(Object:GetGroup()) +else +self:_AddObject(Object) +end +end +return self +end +function TARGET:SetPriority(Priority) +self.prio=Priority or 50 +return self +end +function TARGET:SetImportance(Importance) +self.importance=Importance +return self +end +function TARGET:AddConditionStart(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionStart,condition) +return self +end +function TARGET:AddConditionStop(ConditionFunction,...) +local condition={} +condition.func=ConditionFunction +condition.arg={} +if arg then +condition.arg=arg +end +table.insert(self.conditionStop,condition) +return self +end +function TARGET:EvalConditionsAll(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if not istrue then +return false +end +end +return true +end +function TARGET:EvalConditionsAny(Conditions) +for _,_condition in pairs(Conditions or{})do +local condition=_condition +local istrue=condition.func(unpack(condition.arg)) +if istrue then +return true +end +end +return false +end +function TARGET:AddResource(MissionType,Nmin,Nmax,Attributes,Properties) +if Attributes and type(Attributes)~="table"then +Attributes={Attributes} +end +if Properties and type(Properties)~="table"then +Properties={Properties} +end +local resource={} +resource.MissionType=MissionType +resource.Nmin=Nmin or 1 +resource.Nmax=Nmax or 1 +resource.Attributes=Attributes or{} +resource.Properties=Properties or{} +self.resources=self.resources or{} +table.insert(self.resources,resource) +if self.verbose>10 then +local text="Resource:" +for _,_r in pairs(self.resources)do +local r=_r +text=text..string.format("\nmission=%s, Nmin=%d, Nmax=%d, attribute=%s, properties=%s",r.MissionType,r.Nmin,r.Nmax,tostring(r.Attributes[1]),tostring(r.Properties[1])) +end +self:I(self.lid..text) +end +return resource +end +function TARGET:IsAlive() +for _,_target in pairs(self.targets)do +local target=_target +if target.Status~=TARGET.ObjectStatus.DEAD then +if self.isDestroyed then +self:E(self.lid..string.format("ERROR: target is DESTROYED but target object status is not DEAD but %s for object %s",target.Status,target.Name)) +elseif self:IsDead()then +self:E(self.lid..string.format("ERROR: target is DEAD but target object status is not DEAD but %s for object %s",target.Status,target.Name)) +end +return true +end +end +return false +end +function TARGET:IsDestroyed() +return self.isDestroyed +end +function TARGET:IsDead() +local is=self:Is("Dead") +return is +end +function TARGET:IsTargetDead(TargetObject) +local isDead=TargetObject.Status==TARGET.ObjectStatus.DEAD +return isDead +end +function TARGET:IsTargetAlive(TargetObject) +local isAlive=TargetObject.Status==TARGET.ObjectStatus.ALIVE +return isAlive +end +function TARGET:onafterStart(From,Event,To) +self:T({From,Event,To}) +local text=string.format("Starting Target") +self:T(self.lid..text) +self:HandleEvent(EVENTS.Dead,self.OnEventUnitDeadOrLost) +self:HandleEvent(EVENTS.UnitLost,self.OnEventUnitDeadOrLost) +self:HandleEvent(EVENTS.RemoveUnit,self.OnEventUnitDeadOrLost) +self:__Status(-1) +return self +end +function TARGET:onafterStatus(From,Event,To) +local fsmstate=self:GetState() +local damaged=false +for i,_target in pairs(self.targets)do +local target=_target +local life=target.Life +target.Life=self:GetTargetLife(target) +if target.Life>target.Life0 then +local delta=2*(target.Life-target.Life0) +target.Life0=target.Life0+delta +life=target.Life0 +self.life0=self.life0+delta +end +if target.Life<life then +self:ObjectDamaged(target) +damaged=true +end +if target.Life<1 and target.Status~=TARGET.ObjectStatus.DEAD then +self:E(self.lid..string.format("FF life is zero but no object dead event fired ==> object dead now for target object %s!",tostring(target.Name))) +self:ObjectDead(target) +damaged=true +end +end +if damaged then +self:Damaged() +end +if self.verbose>=1 then +local text=string.format("%s: Targets=%d/%d [%d, %d], Life=%.1f/%.1f, Damage=%.1f", +fsmstate,self:CountTargets(),self.N0,self.Ndestroyed,self.Ndead,self:GetLife(),self:GetLife0(),self:GetDamage()) +if self:CountTargets()==0 or self:GetDamage()>=100 then +text=text.." - Dead!" +elseif damaged then +text=text.." - Damaged!" +end +self:I(self.lid..text) +end +if self.verbose>=2 then +local text="Target:" +for i,_target in pairs(self.targets)do +local target=_target +local damage=(1-target.Life/target.Life0)*100 +text=text..string.format("\n[%d] %s %s %s: Life=%.1f/%.1f, Damage=%.1f, N0=%d, Ndestroyed=%d, Ndead=%d", +i,target.Type,target.Name,target.Status,target.Life,target.Life0,damage,target.N0,target.Ndestroyed,target.Ndead) +end +self:I(self.lid..text) +end +if self:IsAlive()and(self:CountTargets()==0 or self:GetDamage()>=100)then +self:Dead() +end +for i,_target in pairs(self.targets)do +local target=_target +if target.Ndestroyed>target.N0 then +self:E(self.lid..string.format("ERROR: Number of destroyed target objects greater than number of initial target objects: %d>%d!",target.Ndestroyed,target.N0)) +end +if target.Ndestroyed>target.N0 then +self:E(self.lid..string.format("ERROR: Number of dead target objects greater than number of initial target objects: %d>%d!",target.Ndead,target.N0)) +end +end +if self:IsAlive()then +self:__Status(-self.TStatus) +else +self:I(self.lid..string.format("Target is not alive any more ==> no further status updates are carried out")) +end +return self +end +function TARGET:onafterObjectDamaged(From,Event,To,Target) +self:T({From,Event,To}) +self:T(self.lid..string.format("Object %s damaged",Target.Name)) +return self +end +function TARGET:onafterObjectDestroyed(From,Event,To,Target) +self:T({From,Event,To}) +self:T(self.lid..string.format("Object %s destroyed",Target.Name)) +self.Ndestroyed=self.Ndestroyed+1 +Target.Ndestroyed=Target.Ndestroyed+1 +Target.Life=0 +self:ObjectDead(Target) +return self +end +function TARGET:onafterObjectDead(From,Event,To,Target) +self:T({From,Event,To}) +self:T(self.lid..string.format("Object %s dead",Target.Name)) +Target.Status=TARGET.ObjectStatus.DEAD +Target.Ndead=Target.Ndead+1 +Target.Life=0 +self.Ndead=self.Ndead+1 +local dead=true +for _,_target in pairs(self.targets)do +local target=_target +if target.Status==TARGET.ObjectStatus.ALIVE then +dead=false +break +end +end +if dead then +if self.Ndestroyed==self.Ntargets0 then +self.isDestroyed=true +self:Destroyed() +else +self:Dead() +end +else +self:Damaged() +end +return self +end +function TARGET:onafterDamaged(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid..string.format("TARGET damaged")) +return self +end +function TARGET:onafterDestroyed(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid..string.format("TARGET destroyed")) +self:Dead() +return self +end +function TARGET:onafterDead(From,Event,To) +self:T({From,Event,To}) +self:T(self.lid..string.format("TARGET dead")) +return self +end +function TARGET:OnEventUnitDeadOrLost(EventData) +local Name=EventData and EventData.IniUnitName or nil +if self:IsElement(Name)and not self:IsCasualty(Name)then +self:T(self.lid..string.format("EVENT ID=%d: Unit %s dead or lost!",EventData.id,tostring(Name))) +table.insert(self.casualties,Name) +local target=self:GetTargetByName(EventData.IniGroupName) +if not target then +target=self:GetTargetByName(EventData.IniUnitName) +end +if target then +local Ndead=target.Ndead +local Ndestroyed=target.Ndestroyed +if EventData.id==EVENTS.RemoveUnit then +Ndead=Ndead+1 +else +Ndestroyed=Ndestroyed+1 +Ndead=Ndead+1 +end +if Ndead==target.N0 then +if Ndestroyed>=target.N0 then +self:T2(self.lid..string.format("EVENT ID=%d: target %s dead/lost ==> destroyed",EventData.id,tostring(target.Name))) +target.Life=0 +self:ObjectDestroyed(target) +else +self:T2(self.lid..string.format("EVENT ID=%d: target %s removed ==> dead",EventData.id,tostring(target.Name))) +target.Life=0 +self:ObjectDead(target) +end +end +end +end +return self +end +function TARGET:_AddObject(Object) +local target={} +target.N0=0 +target.Ndead=0 +target.Ndestroyed=0 +if Object:IsInstanceOf("GROUP")then +local group=Object +target.Type=TARGET.ObjectType.GROUP +target.Name=group:GetName() +target.Coordinate=group:GetCoordinate() +local units=group:GetUnits() +target.Life=0;target.Life0=0 +for _,_unit in pairs(units or{})do +local unit=_unit +local life=unit:GetLife() +target.Life=target.Life+life +target.Life0=target.Life0+math.max(unit:GetLife0(),life) +self.threatlevel0=self.threatlevel0+unit:GetThreatLevel() +table.insert(self.elements,unit:GetName()) +target.N0=target.N0+1 +end +elseif Object:IsInstanceOf("UNIT")then +local unit=Object +target.Type=TARGET.ObjectType.UNIT +target.Name=unit:GetName() +target.Coordinate=unit:GetCoordinate() +if unit then +target.Life=unit:GetLife() +target.Life0=math.max(unit:GetLife0(),target.Life) +self.threatlevel0=self.threatlevel0+unit:GetThreatLevel() +table.insert(self.elements,unit:GetName()) +target.N0=target.N0+1 +end +elseif Object:IsInstanceOf("STATIC")then +local static=Object +target.Type=TARGET.ObjectType.STATIC +target.Name=static:GetName() +target.Coordinate=static:GetCoordinate() +if static and static:IsAlive()then +target.Life0=static:GetLife0() +target.Life=static:GetLife() +target.N0=target.N0+1 +table.insert(self.elements,target.Name) +end +elseif Object:IsInstanceOf("SCENERY")then +local scenery=Object +target.Type=TARGET.ObjectType.SCENERY +target.Name=scenery:GetName() +target.Coordinate=scenery:GetCoordinate() +target.Life0=scenery:GetLife0() +if target.Life0==0 then target.Life0=1 end +target.Life=scenery:GetLife() +target.N0=target.N0+1 +table.insert(self.elements,target.Name) +elseif Object:IsInstanceOf("AIRBASE")then +local airbase=Object +target.Type=TARGET.ObjectType.AIRBASE +target.Name=airbase:GetName() +target.Coordinate=airbase:GetCoordinate() +target.Life0=1 +target.Life=1 +target.N0=target.N0+1 +table.insert(self.elements,target.Name) +elseif Object:IsInstanceOf("COORDINATE")then +local coord=UTILS.DeepCopy(Object) +target.Type=TARGET.ObjectType.COORDINATE +target.Name=coord:ToStringMGRS() +target.Coordinate=coord +target.Life0=1 +target.Life=1 +target.N0=target.N0+1 +elseif Object:IsInstanceOf("ZONE_BASE")then +local zone=Object +Object=zone +target.Type=TARGET.ObjectType.ZONE +target.Name=zone:GetName() +target.Coordinate=zone:GetCoordinate() +target.Life0=1 +target.Life=1 +target.N0=target.N0+1 +elseif Object:IsInstanceOf("OPSZONE")then +local zone=Object +Object=zone +target.Type=TARGET.ObjectType.OPSZONE +target.Name=zone:GetName() +target.Coordinate=zone:GetCoordinate() +target.N0=target.N0+1 +target.Life0=1 +target.Life=1 +else +self:E(self.lid.."ERROR: Unknown object type!") +return nil +end +self.life=self.life+target.Life +self.life0=self.life0+target.Life0 +self.N0=self.N0+target.N0 +self.Ntargets0=self.Ntargets0+1 +self.targetcounter=self.targetcounter+1 +target.ID=self.targetcounter +target.Status=TARGET.ObjectStatus.ALIVE +target.Object=Object +table.insert(self.targets,target) +if self.name==nil then +self.name=self:GetTargetName(target) +end +if self.category==nil then +self.category=self:GetTargetCategory(target) +end +return self +end +function TARGET:GetLife0() +return self.life0 +end +function TARGET:GetDamage() +local life=self:GetLife()/self:GetLife0() +local damage=1-life +return damage*100 +end +function TARGET:GetTargetLife(Target) +if Target.Type==TARGET.ObjectType.GROUP then +if Target.Object and Target.Object:IsAlive()then +local units=Target.Object:GetUnits() +local life=0 +for _,_unit in pairs(units or{})do +local unit=_unit +life=life+unit:GetLife() +end +return life +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.UNIT then +local unit=Target.Object +if unit and unit:IsAlive()then +local life=unit:GetLife() +return life +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.STATIC then +if Target.Object and Target.Object:IsAlive()then +local life=Target.Object:GetLife() +return life +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.SCENERY then +if Target.Object and Target.Object:IsAlive(25)then +local life=Target.Object:GetLife() +return life +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.AIRBASE then +if Target.Status==TARGET.ObjectStatus.ALIVE then +return 1 +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.COORDINATE then +return 1 +elseif Target.Type==TARGET.ObjectType.ZONE or Target.Type==TARGET.ObjectType.OPSZONE then +return 1 +else +self:E("ERROR: unknown target object type in GetTargetLife!") +end +return self +end +function TARGET:GetLife() +local N=0 +for _,_target in pairs(self.targets)do +local Target=_target +N=N+self:GetTargetLife(Target) +end +return N +end +function TARGET:GetTargetThreatLevelMax(Target) +if Target.Type==TARGET.ObjectType.GROUP then +local group=Target.Object +if group and group:IsAlive()then +local tl=group:GetThreatLevel() +return tl +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.UNIT then +local unit=Target.Object +if unit and unit:IsAlive()then +local life=unit:GetThreatLevel() +return life +else +return 0 +end +elseif Target.Type==TARGET.ObjectType.STATIC then +return 0 +elseif Target.Type==TARGET.ObjectType.SCENERY then +return 0 +elseif Target.Type==TARGET.ObjectType.AIRBASE then +return 0 +elseif Target.Type==TARGET.ObjectType.COORDINATE then +return 0 +elseif Target.Type==TARGET.ObjectType.ZONE then +local zone=Target.Object +local foundunits={} +if zone:IsInstanceOf("ZONE_RADIUS")or zone:IsInstanceOf("ZONE_POLYGON")then +zone:Scan({Object.Category.UNIT},{Unit.Category.GROUND_UNIT,Unit.Category.SHIP}) +foundunits=zone:GetScannedSetUnit() +else +foundunits=SET_UNIT:New():FilterZones({zone}):FilterOnce() +end +local ThreatMax=foundunits:GetThreatLevelMax()or 0 +return ThreatMax +elseif Target.Type==TARGET.ObjectType.OPSZONE then +local unitset=Target.Object:GetScannedUnitSet() +local ThreatMax=unitset:GetThreatLevelMax() +return ThreatMax +else +self:E("ERROR: unknown target object type in GetTargetThreatLevel!") +return 0 +end +return self +end +function TARGET:GetThreatLevelMax() +local N=0 +for _,_target in pairs(self.targets)do +local Target=_target +local n=self:GetTargetThreatLevelMax(Target) +if n>N then +N=n +end +end +return N +end +function TARGET:GetTargetVec2(Target) +local vec3=self:GetTargetVec3(Target) +if vec3 then +return{x=vec3.x,y=vec3.z} +end +return nil +end +function TARGET:GetTargetVec3(Target,Average) +if Target.Type==TARGET.ObjectType.GROUP then +local object=Target.Object +if object and object:IsAlive()then +local vec3=object:GetVec3() +if Average then +vec3=object:GetAverageVec3() +end +if vec3 then +return vec3 +else +return nil +end +else +return nil +end +elseif Target.Type==TARGET.ObjectType.UNIT then +local object=Target.Object +if object and object:IsAlive()then +local vec3=object:GetVec3() +return vec3 +else +return nil +end +elseif Target.Type==TARGET.ObjectType.STATIC then +local object=Target.Object +if object and object:IsAlive()then +local vec3=object:GetVec3() +return vec3 +else +return nil +end +elseif Target.Type==TARGET.ObjectType.SCENERY then +local object=Target.Object +if object then +local vec3=object:GetVec3() +return vec3 +else +return nil +end +elseif Target.Type==TARGET.ObjectType.AIRBASE then +local object=Target.Object +local vec3=object:GetVec3() +return vec3 +elseif Target.Type==TARGET.ObjectType.COORDINATE then +local object=Target.Object +local vec3={x=object.x,y=object.y,z=object.z} +return vec3 +elseif Target.Type==TARGET.ObjectType.ZONE then +local object=Target.Object +local vec3=object:GetVec3() +return vec3 +elseif Target.Type==TARGET.ObjectType.OPSZONE then +local object=Target.Object +local vec3=object:GetZone():GetVec3() +return vec3 +end +self:E(self.lid.."ERROR: Unknown TARGET type! Cannot get Vec3") +end +function TARGET:GetTargetHeading(Target) +if Target.Type==TARGET.ObjectType.GROUP then +local object=Target.Object +if object and object:IsAlive()then +local heading=object:GetHeading() +if heading then +return heading +else +return nil +end +else +return nil +end +elseif Target.Type==TARGET.ObjectType.UNIT then +local object=Target.Object +if object and object:IsAlive()then +local heading=object:GetHeading() +return heading +else +return nil +end +elseif Target.Type==TARGET.ObjectType.STATIC then +local object=Target.Object +if object and object:IsAlive()then +local heading=object:GetHeading() +return heading +else +return nil +end +elseif Target.Type==TARGET.ObjectType.SCENERY then +local object=Target.Object +if object then +local heading=object:GetHeading() +return heading +else +return nil +end +elseif Target.Type==TARGET.ObjectType.AIRBASE then +local object=Target.Object +return 0 +elseif Target.Type==TARGET.ObjectType.COORDINATE then +local object=Target.Object +return 0 +elseif Target.Type==TARGET.ObjectType.ZONE or Target.Type==TARGET.ObjectType.OPSZONE then +local object=Target.Object +return 0 +end +self:E(self.lid.."ERROR: Unknown TARGET type! Cannot get heading") +end +function TARGET:GetTargetCoordinate(Target,Average) +if Target.Type==TARGET.ObjectType.COORDINATE then +return Target.Object +else +local vec3=self:GetTargetVec3(Target,Average) +if vec3 then +Target.Coordinate.x=vec3.x +Target.Coordinate.y=vec3.y +Target.Coordinate.z=vec3.z +end +return Target.Coordinate +end +return nil +end +function TARGET:GetTargetName(Target) +if Target.Type==TARGET.ObjectType.GROUP then +if Target.Object and Target.Object:IsAlive()then +return Target.Object:GetName() +end +elseif Target.Type==TARGET.ObjectType.UNIT then +if Target.Object and Target.Object:IsAlive()then +return Target.Object:GetName() +end +elseif Target.Type==TARGET.ObjectType.STATIC then +if Target.Object and Target.Object:IsAlive()then +return Target.Object:GetName() +end +elseif Target.Type==TARGET.ObjectType.AIRBASE then +if Target.Status==TARGET.ObjectStatus.ALIVE then +return Target.Object:GetName() +end +elseif Target.Type==TARGET.ObjectType.COORDINATE then +local coord=Target.Object +return coord:ToStringMGRS() +elseif Target.Type==TARGET.ObjectType.ZONE then +local Zone=Target.Object +return Zone:GetName() +elseif Target.Type==TARGET.ObjectType.SCENERY then +local Zone=Target.Object +return Zone:GetName() +end +return"Unknown" +end +function TARGET:GetName() +local name=self.name or"Unknown" +return name +end +function TARGET:GetVec2() +for _,_target in pairs(self.targets)do +local Target=_target +local coordinate=self:GetTargetVec2(Target) +if coordinate then +return coordinate +end +end +self:E(self.lid..string.format("ERROR: Cannot get Vec2 of target %s",self.name)) +return nil +end +function TARGET:GetVec3() +for _,_target in pairs(self.targets)do +local Target=_target +local coordinate=self:GetTargetVec3(Target) +if coordinate then +return coordinate +end +end +self:E(self.lid..string.format("ERROR: Cannot get Vec3 of target %s",self.name)) +return nil +end +function TARGET:GetCoordinate() +for _,_target in pairs(self.targets)do +local Target=_target +local coordinate=self:GetTargetCoordinate(Target) +if coordinate then +return coordinate +end +end +self:E(self.lid..string.format("ERROR: Cannot get coordinate of target %s",tostring(self.name))) +return nil +end +function TARGET:GetAverageCoordinate() +for _,_target in pairs(self.targets)do +local Target=_target +local coordinate=self:GetTargetCoordinate(Target,true) +if coordinate then +return coordinate +end +end +self:E(self.lid..string.format("ERROR: Cannot get average coordinate of target %s",tostring(self.name))) +return nil +end +function TARGET:GetCoordinates() +local coordinates={} +for _,_target in pairs(self.targets)do +local target=_target +local coordinate=self:GetTargetCoordinate(target) +if coordinate then +table.insert(coordinates,coordinate) +end +end +return coordinates +end +function TARGET:GetHeading() +for _,_target in pairs(self.targets)do +local Target=_target +local heading=self:GetTargetHeading(Target) +if heading then +return heading +end +end +self:E(self.lid..string.format("ERROR: Cannot get heading of target %s",tostring(self.name))) +return nil +end +function TARGET:GetCategory() +return self.category +end +function TARGET:GetTargetCategory(Target) +local category=nil +if Target.Type==TARGET.ObjectType.GROUP then +if Target.Object and Target.Object:IsAlive()~=nil then +local group=Target.Object +local cat=group:GetCategory() +if cat==Group.Category.AIRPLANE or cat==Group.Category.HELICOPTER then +category=TARGET.Category.AIRCRAFT +elseif cat==Group.Category.GROUND or cat==Group.Category.TRAIN then +category=TARGET.Category.GROUND +elseif cat==Group.Category.SHIP then +category=TARGET.Category.NAVAL +end +end +elseif Target.Type==TARGET.ObjectType.UNIT then +if Target.Object and Target.Object:IsAlive()~=nil then +local unit=Target.Object +local group=unit:GetGroup() +local cat=group:GetCategory() +if cat==Group.Category.AIRPLANE or cat==Group.Category.HELICOPTER then +category=TARGET.Category.AIRCRAFT +elseif cat==Group.Category.GROUND or cat==Group.Category.TRAIN then +category=TARGET.Category.GROUND +elseif cat==Group.Category.SHIP then +category=TARGET.Category.NAVAL +end +end +elseif Target.Type==TARGET.ObjectType.STATIC then +return TARGET.Category.GROUND +elseif Target.Type==TARGET.ObjectType.SCENERY then +return TARGET.Category.GROUND +elseif Target.Type==TARGET.ObjectType.AIRBASE then +return TARGET.Category.AIRBASE +elseif Target.Type==TARGET.ObjectType.COORDINATE then +return TARGET.Category.COORDINATE +elseif Target.Type==TARGET.ObjectType.ZONE then +return TARGET.Category.ZONE +elseif Target.Type==TARGET.ObjectType.OPSZONE then +return TARGET.Category.OPSZONE +else +self:E("ERROR: unknown target category!") +end +return category +end +function TARGET:GetTargetCoalition(Target) +local coal=coalition.side.NEUTRAL +if Target.Type==TARGET.ObjectType.GROUP then +if Target.Object and Target.Object:IsAlive()~=nil then +local object=Target.Object +coal=object:GetCoalition() +end +elseif Target.Type==TARGET.ObjectType.UNIT then +if Target.Object and Target.Object:IsAlive()~=nil then +local object=Target.Object +coal=object:GetCoalition() +end +elseif Target.Type==TARGET.ObjectType.STATIC then +local object=Target.Object +coal=object:GetCoalition() +elseif Target.Type==TARGET.ObjectType.SCENERY then +elseif Target.Type==TARGET.ObjectType.AIRBASE then +local object=Target.Object +coal=object:GetCoalition() +elseif Target.Type==TARGET.ObjectType.COORDINATE then +elseif Target.Type==TARGET.ObjectType.ZONE then +elseif Target.Type==TARGET.ObjectType.OPSZONE then +local object=Target.Object +coal=object:GetOwner() +else +self:E("ERROR: unknown target category!") +end +return coal +end +function TARGET:GetTargetByName(ObjectName) +for _,_target in pairs(self.targets)do +local target=_target +if ObjectName==target.Name then +return target +end +end +return nil +end +function TARGET:GetObjective(RefCoordinate,Coalitions) +if RefCoordinate then +local dmin=math.huge +local tmin=nil +for _,_target in pairs(self.targets)do +local target=_target +if target.Status~=TARGET.ObjectStatus.DEAD and(Coalitions==nil or UTILS.IsInTable(UTILS.EnsureTable(Coalitions),self:GetTargetCoalition(target)))then +local vec3=self:GetTargetVec3(target) +local d=UTILS.VecDist3D(vec3,RefCoordinate) +if d<dmin then +dmin=d +tmin=target +end +end +end +return tmin +else +for _,_target in pairs(self.targets)do +local target=_target +if target.Status~=TARGET.ObjectStatus.DEAD and(Coalitions==nil or UTILS.IsInTable(UTILS.EnsureTable(Coalitions),self:GetTargetCoalition(target)))then +return target +end +end +end +return nil +end +function TARGET:GetObject(RefCoordinate,Coalitions) +local target=self:GetObjective(RefCoordinate,Coalitions) +if target then +return target.Object +end +return nil +end +function TARGET:GetObjects() +local objects={} +for _,_target in pairs(self.targets)do +local target=_target +table.insert(objects,target.Object) +end +return objects +end +function TARGET:CountObjectives(Target,Coalitions) +local N=0 +if Target.Type==TARGET.ObjectType.GROUP then +local target=Target.Object +local units=target:GetUnits() +for _,_unit in pairs(units or{})do +local unit=_unit +if unit and unit:IsAlive()~=nil and unit:GetLife()>1 then +if Coalitions==nil or UTILS.IsInTable(UTILS.EnsureTable(Coalitions),unit:GetCoalition())then +N=N+1 +end +end +end +elseif Target.Type==TARGET.ObjectType.UNIT then +local target=Target.Object +if target and target:IsAlive()~=nil and target:GetLife()>1 then +if Coalitions==nil or UTILS.IsInTable(Coalitions,target:GetCoalition())then +N=N+1 +end +end +elseif Target.Type==TARGET.ObjectType.STATIC then +local target=Target.Object +if target and target:IsAlive()then +if Coalitions==nil or UTILS.IsInTable(Coalitions,target:GetCoalition())then +N=N+1 +end +end +elseif Target.Type==TARGET.ObjectType.SCENERY then +if Target.Status~=TARGET.ObjectStatus.DEAD then +N=N+1 +end +elseif Target.Type==TARGET.ObjectType.AIRBASE then +local target=Target.Object +if Target.Status==TARGET.ObjectStatus.ALIVE then +if Coalitions==nil or UTILS.IsInTable(Coalitions,target:GetCoalition())then +N=N+1 +end +end +elseif Target.Type==TARGET.ObjectType.COORDINATE then +N=N+1 +elseif Target.Type==TARGET.ObjectType.ZONE then +N=N+1 +elseif Target.Type==TARGET.ObjectType.OPSZONE then +local target=Target.Object +if Coalitions==nil or UTILS.IsInTable(Coalitions,target:GetOwner())then +N=N+1 +end +else +self:E(self.lid.."ERROR: Unknown target type! Cannot count targets") +end +return N +end +function TARGET:CountTargets(Coalitions) +local N=0 +for _,_target in pairs(self.targets)do +local Target=_target +N=N+self:CountObjectives(Target,Coalitions) +end +return N +end +function TARGET:IsElement(Name) +if Name==nil then +return false +end +for _,name in pairs(self.elements)do +if name==Name then +return true +end +end +return false +end +function TARGET:IsCasualty(Name) +if Name==nil then +return false +end +for _,name in pairs(self.casualties)do +if tostring(name)==tostring(Name)then +return true +end +end +return false +end +EASYGCICAP={ +ClassName="EASYGCICAP", +overhead=0.75, +capgrouping=2, +airbasename=nil, +airbase=nil, +coalition="blue", +alias=nil, +wings={}, +Intel=nil, +resurrection=900, +capspeed=300, +capalt=25000, +capdir=45, +capleg=15, +maxinterceptsize=2, +missionrange=100, +noalert5=4, +ManagedAW={}, +ManagedSQ={}, +ManagedCP={}, +ManagedTK={}, +ManagedEWR={}, +ManagedREC={}, +MaxAliveMissions=8, +debug=false, +engagerange=50, +repeatsonfailure=3, +GoZoneSet=nil, +NoGoZoneSet=nil, +ConflictZoneSet=nil, +Monitor=false, +TankerInvisible=true, +CapFormation=nil, +ReadyFlightGroups={}, +DespawnAfterLanding=false, +DespawnAfterHolding=true, +ListOfAuftrag={}, +defaulttakeofftype="hot", +FuelLowThreshold=25, +FuelCriticalThreshold=10, +showpatrolpointmarks=false, +EngageTargetTypes={"Air"}, +} +EASYGCICAP.version="0.1.30" +function EASYGCICAP:New(Alias,AirbaseName,Coalition,EWRName) +local self=BASE:Inherit(self,FSM:New()) +self.alias=Alias or AirbaseName.." CAP Wing" +self.coalitionname=string.lower(Coalition)or"blue" +self.coalition=self.coalitionname=="blue"and coalition.side.BLUE or coalition.side.RED +self.wings={} +if type(EWRName)=="string"then EWRName={EWRName}end +self.EWRName=EWRName +self.airbasename=AirbaseName +self.airbase=AIRBASE:FindByName(self.airbasename) +self.GoZoneSet=SET_ZONE:New() +self.NoGoZoneSet=SET_ZONE:New() +self.ConflictZoneSet=SET_ZONE:New() +self.resurrection=900 +self.capspeed=300 +self.capalt=25000 +self.capdir=90 +self.capleg=15 +self.capgrouping=2 +self.missionrange=100 +self.noalert5=2 +self.MaxAliveMissions=8 +self.engagerange=50 +self.repeatsonfailure=3 +self.Monitor=false +self.TankerInvisible=true +self.CapFormation=ENUMS.Formation.FixedWing.FingerFour.Group +self.DespawnAfterLanding=false +self.DespawnAfterHolding=true +self.ListOfAuftrag={} +self.defaulttakeofftype="hot" +self.FuelLowThreshold=25 +self.FuelCriticalThreshold=10 +self.showpatrolpointmarks=false +self.EngageTargetTypes={"Air"} +self.lid=string.format("EASYGCICAP %s | ",self.alias) +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Running") +self:AddTransition("Running","Stop","Stopped") +self:AddTransition("*","Status","*") +self:AddAirwing(self.airbasename,self.alias,self.CapZoneName) +self:I(self.lid.."Created new instance (v"..self.version..")") +self:__Start(math.random(6,12)) +return self +end +function EASYGCICAP:GetAirwing(AirbaseName) +self:T(self.lid.."GetAirwing") +if self.wings[AirbaseName]then +return self.wings[AirbaseName][1] +end +return nil +end +function EASYGCICAP:GetAirwingTable() +self:T(self.lid.."GetAirwingTable") +local Wingtable={} +for _,_object in pairs(self.wings or{})do +table.insert(Wingtable,_object[1]) +end +return Wingtable +end +function EASYGCICAP:SetFuelLow(Percent) +self:T(self.lid.."SetFuelLow") +self.FuelLowThreshold=Percent or 25 +return self +end +function EASYGCICAP:ShowPatrolPointMarkers(onoff) +if onoff then +self.showpatrolpointmarks=true +else +self.showpatrolpointmarks=false +end +return self +end +function EASYGCICAP:SetFuelCritical(Percent) +self:T(self.lid.."SetFuelCritical") +self.FuelCriticalThreshold=Percent or 10 +return self +end +function EASYGCICAP:SetCAPFormation(Formation) +self:T(self.lid.."SetCAPFormation") +self.CapFormation=Formation +return self +end +function EASYGCICAP:SetTankerAndAWACSInvisible(Switch) +self:T(self.lid.."SetTankerAndAWACSInvisible") +self.TankerInvisible=Switch +return self +end +function EASYGCICAP:_CountAliveAuftrags() +local alive=0 +for _,_auftrag in pairs(self.ListOfAuftrag)do +local auftrag=_auftrag +if auftrag and(not(auftrag:IsCancelled()or auftrag:IsDone()or auftrag:IsOver()))then +alive=alive+1 +end +end +return alive +end +function EASYGCICAP:SetMaxAliveMissions(Maxiumum) +self:T(self.lid.."SetMaxAliveMissions") +self.MaxAliveMissions=Maxiumum or 8 +return self +end +function EASYGCICAP:SetDefaultResurrection(Seconds) +self:T(self.lid.."SetDefaultResurrection") +self.resurrection=Seconds or 900 +return self +end +function EASYGCICAP:SetDefaultRepeatOnFailure(Retries) +self:T(self.lid.."SetDefaultRepeatOnFailure") +self.repeatsonfailure=Retries or 3 +return self +end +function EASYGCICAP:SetDefaultTakeOffType(Takeoff) +self:T(self.lid.."SetDefaultTakeOffType") +self.defaulttakeofftype=Takeoff or"hot" +return self +end +function EASYGCICAP:SetDefaultCAPSpeed(Speed) +self:T(self.lid.."SetDefaultSpeed") +self.capspeed=Speed or 300 +return self +end +function EASYGCICAP:SetDefaultCAPAlt(Altitude) +self:T(self.lid.."SetDefaultAltitude") +self.capalt=Altitude or 25000 +return self +end +function EASYGCICAP:SetDefaultCAPDirection(Direction) +self:T(self.lid.."SetDefaultDirection") +self.capdir=Direction or 90 +return self +end +function EASYGCICAP:SetDefaultCAPLeg(Leg) +self:T(self.lid.."SetDefaultLeg") +self.capleg=Leg or 15 +return self +end +function EASYGCICAP:SetDefaultCAPGrouping(Grouping) +self:T(self.lid.."SetDefaultCAPGrouping") +self.capgrouping=Grouping or 2 +return self +end +function EASYGCICAP:SetDefaultMissionRange(Range) +self:T(self.lid.."SetDefaultMissionRange") +self.missionrange=Range or 100 +return self +end +function EASYGCICAP:SetDefaultNumberAlert5Standby(Airframes) +self:T(self.lid.."SetDefaultNumberAlert5Standby") +self.noalert5=math.abs(Airframes)or 2 +return self +end +function EASYGCICAP:SetDefaultEngageRange(Range) +self:T(self.lid.."SetDefaultEngageRange") +self.engagerange=Range or 50 +return self +end +function EASYGCICAP:SetDefaultOverhead(Overhead) +self:T(self.lid.."SetDefaultOverhead") +self.overhead=Overhead or 0.75 +return self +end +function EASYGCICAP:SetDefaultDespawnAfterLanding() +self:T(self.lid.."SetDefaultDespawnAfterLanding") +self.DespawnAfterLanding=true +self.DespawnAfterHolding=false +return self +end +function EASYGCICAP:SetDefaultDespawnAfterHolding() +self:T(self.lid.."SetDefaultDespawnAfterLanding") +self.DespawnAfterLanding=false +self.DespawnAfterHolding=true +return self +end +function EASYGCICAP:SetCapStartTimeVariation(Start,End) +self.capOptionVaryStartTime=Start or 5 +self.capOptionVaryEndTime=End or 60 +return self +end +function EASYGCICAP:SetCAPEngageTargetTypes(types) +self.EngageTargetTypes=types or{"Air"} +return self +end +function EASYGCICAP:AddAirwing(Airbasename,Alias) +self:T(self.lid.."AddAirwing "..Airbasename) +local AWEntry={} +AWEntry.AirbaseName=Airbasename +AWEntry.Alias=Alias +self.ManagedAW[Airbasename]=AWEntry +return self +end +function EASYGCICAP:_CreateAirwings() +self:T(self.lid.."_CreateAirwings") +for airbase,data in pairs(self.ManagedAW)do +local wing=data +local afb=wing.AirbaseName +local alias=wing.Alias +self:_AddAirwing(airbase,alias) +end +return self +end +function EASYGCICAP:_AddAirwing(Airbasename,Alias) +self:T(self.lid.."_AddAirwing "..Airbasename) +local CapFormation=self.CapFormation +local DespawnAfterLanding=self.DespawnAfterLanding +local DespawnAfterHolding=self.DespawnAfterHolding +local check=STATIC:FindByName(Airbasename,false)or UNIT:FindByName(Airbasename) +if check==nil then +MESSAGE:New(self.lid.."There's no warehouse static on the map (wrong naming?) for airbase "..tostring(Airbasename).."!",30,"CHECK"):ToAllIf(self.debug):ToLog() +return +end +local CAP_Wing=AIRWING:New(Airbasename,Alias) +CAP_Wing:SetVerbosityLevel(0) +CAP_Wing:SetReportOff() +CAP_Wing:SetMarker(false) +CAP_Wing:SetAirbase(AIRBASE:FindByName(Airbasename)) +CAP_Wing:SetRespawnAfterDestroyed() +CAP_Wing:SetNumberCAP(self.capgrouping) +CAP_Wing:SetCapCloseRaceTrack(true) +if self.showpatrolpointmarks then +CAP_Wing:ShowPatrolPointMarkers(true) +end +if self.capOptionVaryStartTime then +CAP_Wing:SetCapStartTimeVariation(self.capOptionVaryStartTime,self.capOptionVaryEndTime) +end +if CapFormation then +CAP_Wing:SetCAPFormation(CapFormation) +end +if#self.ManagedTK>0 then +CAP_Wing:SetNumberTankerBoom(1) +CAP_Wing:SetNumberTankerProbe(1) +end +if#self.ManagedEWR>0 then +CAP_Wing:SetNumberAWACS(1) +end +if#self.ManagedREC>0 then +CAP_Wing:SetNumberRecon(1) +end +CAP_Wing:SetTakeoffType(self.defaulttakeofftype) +CAP_Wing:SetLowFuelThreshold(0.3) +CAP_Wing.RandomAssetScore=math.random(50,100) +CAP_Wing:Start() +local Intel=self.Intel +local TankerInvisible=self.TankerInvisible +local engagerange=self.engagerange +local GoZoneSet=self.GoZoneSet +local NoGoZoneSet=self.NoGoZoneSet +local FuelLow=self.FuelLowThreshold or 25 +local FuelCritical=self.FuelCriticalThreshold or 10 +local EngageTypes=self.EngageTargetTypes or{"Air"} +function CAP_Wing:onbeforeFlightOnMission(From,Event,To,Flightgroup,Mission) +local flightgroup=Flightgroup +if DespawnAfterLanding then +flightgroup:SetDespawnAfterLanding() +elseif DespawnAfterHolding then +flightgroup:SetDespawnAfterHolding() +end +flightgroup:SetDestinationbase(AIRBASE:FindByName(Airbasename)) +flightgroup:GetGroup():CommandEPLRS(true,5) +flightgroup:GetGroup():SetOptionRadarUsingForContinousSearch() +flightgroup:GetGroup():SetOptionLandingOverheadBreak() +if Mission.type~=AUFTRAG.Type.TANKER and Mission.type~=AUFTRAG.Type.AWACS and Mission.type~=AUFTRAG.Type.RECON then +flightgroup:SetDetection(true) +flightgroup:SetEngageDetectedOn(engagerange,EngageTypes,GoZoneSet,NoGoZoneSet) +flightgroup:SetOutOfAAMRTB() +flightgroup:SetFuelLowRTB(true) +flightgroup:SetFuelLowThreshold(FuelLow) +flightgroup:SetFuelCriticalRTB(true) +flightgroup:SetFuelCriticalThreshold(FuelCritical) +if CapFormation then +flightgroup:GetGroup():SetOption(AI.Option.Air.id.FORMATION,CapFormation) +end +end +if Mission.type==AUFTRAG.Type.TANKER or Mission.type==AUFTRAG.Type.AWACS or Mission.type==AUFTRAG.Type.RECON then +if TankerInvisible then +flightgroup:GetGroup():SetCommandInvisible(true) +end +if Mission.type==AUFTRAG.Type.RECON then +flightgroup:SetDetection(true) +end +end +flightgroup:GetGroup():OptionROTEvadeFire() +flightgroup:SetFuelLowRTB(true) +Intel:AddAgent(flightgroup) +if DespawnAfterHolding then +function flightgroup:onbeforeHolding(From,Event,To) +self:Despawn(1,true) +end +end +end +if self.noalert5>0 then +local alert=AUFTRAG:NewALERT5(AUFTRAG.Type.INTERCEPT) +alert:SetRequiredAssets(self.noalert5) +alert:SetRepeat(99) +CAP_Wing:AddMission(alert) +table.insert(self.ListOfAuftrag,alert) +end +self.wings[Airbasename]={CAP_Wing,AIRBASE:FindByName(Airbasename):GetZone(),Airbasename} +return self +end +function EASYGCICAP:AddPatrolPointCAP(AirbaseName,Coordinate,Altitude,Speed,Heading,LegLength) +self:T(self.lid.."AddPatrolPointCAP") +local coordinate=Coordinate +local EntryCAP={} +if Coordinate:IsInstanceOf("ZONE_BASE")then +coordinate=Coordinate:GetCoordinate() +EntryCAP.Zone=Coordinate +end +EntryCAP.AirbaseName=AirbaseName +EntryCAP.Coordinate=coordinate +EntryCAP.Altitude=Altitude or 25000 +EntryCAP.Speed=Speed or 300 +EntryCAP.Heading=Heading or 90 +EntryCAP.LegLength=LegLength or 15 +self.ManagedCP[#self.ManagedCP+1]=EntryCAP +if self.debug then +local mark=MARKER:New(coordinate,self.lid.."Patrol Point"):ToAll() +end +return self +end +function EASYGCICAP:AddPatrolPointRecon(AirbaseName,Coordinate,Altitude,Speed,Heading,LegLength) +self:T(self.lid.."AddPatrolPointRecon "..Coordinate:ToStringLLDDM()) +local EntryCAP={} +EntryCAP.AirbaseName=AirbaseName +EntryCAP.Coordinate=Coordinate +EntryCAP.Altitude=Altitude or 25000 +EntryCAP.Speed=Speed or 300 +EntryCAP.Heading=Heading or 90 +EntryCAP.LegLength=LegLength or 15 +self.ManagedREC[#self.ManagedREC+1]=EntryCAP +if self.debug then +local mark=MARKER:New(Coordinate,self.lid.."Patrol Point Recon"):ToAll() +end +return self +end +function EASYGCICAP:AddPatrolPointTanker(AirbaseName,Coordinate,Altitude,Speed,Heading,LegLength) +self:T(self.lid.."AddPatrolPointTanker "..Coordinate:ToStringLLDDM()) +local EntryCAP={} +EntryCAP.AirbaseName=AirbaseName +EntryCAP.Coordinate=Coordinate +EntryCAP.Altitude=Altitude or 25000 +EntryCAP.Speed=Speed or 300 +EntryCAP.Heading=Heading or 90 +EntryCAP.LegLength=LegLength or 15 +self.ManagedTK[#self.ManagedTK+1]=EntryCAP +if self.debug then +local mark=MARKER:New(Coordinate,self.lid.."Patrol Point Tanker"):ToAll() +end +return self +end +function EASYGCICAP:AddPatrolPointAwacs(AirbaseName,Coordinate,Altitude,Speed,Heading,LegLength) +self:T(self.lid.."AddPatrolPointAwacs "..Coordinate:ToStringLLDDM()) +local EntryCAP={} +EntryCAP.AirbaseName=AirbaseName +EntryCAP.Coordinate=Coordinate +EntryCAP.Altitude=Altitude or 25000 +EntryCAP.Speed=Speed or 300 +EntryCAP.Heading=Heading or 90 +EntryCAP.LegLength=LegLength or 15 +self.ManagedEWR[#self.ManagedEWR+1]=EntryCAP +if self.debug then +local mark=MARKER:New(Coordinate,self.lid.."Patrol Point AWACS"):ToAll() +end +return self +end +function EASYGCICAP:_SetTankerPatrolPoints() +self:T(self.lid.."_SetTankerPatrolPoints") +for _,_data in pairs(self.ManagedTK)do +local data=_data +self:T("Airbasename = "..data.AirbaseName) +if not self.wings[data.AirbaseName]then +MESSAGE:New(self.lid.."You are trying to create a TANKER point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog() +return +end +local Wing=self.wings[data.AirbaseName][1] +local Coordinate=data.Coordinate +local Altitude=data.Altitude +local Speed=data.Speed +local Heading=data.Heading +local LegLength=data.LegLength +Wing:AddPatrolPointTANKER(Coordinate,Altitude,Speed,Heading,LegLength) +end +return self +end +function EASYGCICAP:_SetAwacsPatrolPoints() +self:T(self.lid.."_SetAwacsPatrolPoints") +for _,_data in pairs(self.ManagedEWR)do +local data=_data +self:T("Airbasename = "..data.AirbaseName) +if not self.wings[data.AirbaseName]then +MESSAGE:New(self.lid.."You are trying to create an AWACS point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog() +return +end +local Wing=self.wings[data.AirbaseName][1] +local Coordinate=data.Coordinate +local Altitude=data.Altitude +local Speed=data.Speed +local Heading=data.Heading +local LegLength=data.LegLength +Wing:AddPatrolPointAWACS(Coordinate,Altitude,Speed,Heading,LegLength) +end +return self +end +function EASYGCICAP:_SetCAPPatrolPoints() +self:T(self.lid.."_SetCAPPatrolPoints") +for _,_data in pairs(self.ManagedCP)do +local data=_data +self:T("Airbasename = "..data.AirbaseName) +if not self.wings[data.AirbaseName]then +MESSAGE:New(self.lid.."You are trying to create a CAP point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog() +return +end +local Wing=self.wings[data.AirbaseName][1] +local Coordinate=data.Coordinate +local Altitude=data.Altitude +local Speed=data.Speed +local Heading=data.Heading +local LegLength=data.LegLength +local Zone=_data.Zone +if Zone then +Wing:AddPatrolPointCAP(Zone,Altitude,Speed,Heading,LegLength) +else +Wing:AddPatrolPointCAP(Coordinate,Altitude,Speed,Heading,LegLength) +end +end +return self +end +function EASYGCICAP:_SetReconPatrolPoints() +self:T(self.lid.."_SetReconPatrolPoints") +for _,_data in pairs(self.ManagedREC)do +local data=_data +self:T("Airbasename = "..data.AirbaseName) +if not self.wings[data.AirbaseName]then +MESSAGE:New(self.lid.."You are trying to create a RECON point for which there is no wing! "..tostring(data.AirbaseName),30,"CHECK"):ToAllIf(self.debug):ToLog() +return +end +local Wing=self.wings[data.AirbaseName][1] +local Coordinate=data.Coordinate +local Altitude=data.Altitude +local Speed=data.Speed +local Heading=data.Heading +local LegLength=data.LegLength +Wing:AddPatrolPointRecon(Coordinate,Altitude,Speed,Heading,LegLength) +end +return self +end +function EASYGCICAP:_CreateSquads() +self:T(self.lid.."_CreateSquads") +for name,data in pairs(self.ManagedSQ)do +local squad=data +local SquadName=name +local TemplateName=squad.TemplateName +local AirbaseName=squad.AirbaseName +local AirFrames=squad.AirFrames +local Skill=squad.Skill +local Modex=squad.Modex +local Livery=squad.Livery +local Frequeny=squad.Frequency +local Modulation=squad.Modulation +local TACAN=squad.TACAN +if squad.Tanker then +self:_AddTankerSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequeny,Modulation,TACAN) +elseif squad.AWACS then +self:_AddAWACSSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequeny,Modulation) +elseif squad.RECON then +self:_AddReconSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery) +else +self:_AddSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery) +end +end +return self +end +function EASYGCICAP:AddSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery) +self:T(self.lid.."AddSquadron "..SquadName) +local EntrySQ={} +EntrySQ.TemplateName=TemplateName +EntrySQ.SquadName=SquadName +EntrySQ.AirbaseName=AirbaseName +EntrySQ.AirFrames=AirFrames or 20 +EntrySQ.Skill=Skill or AI.Skill.AVERAGE +EntrySQ.Modex=Modex or 402 +EntrySQ.Livery=Livery +self.ManagedSQ[SquadName]=EntrySQ +return self +end +function EASYGCICAP:AddReconSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery) +self:T(self.lid.."AddReconSquadron "..SquadName) +local EntrySQ={} +EntrySQ.TemplateName=TemplateName +EntrySQ.SquadName=SquadName +EntrySQ.AirbaseName=AirbaseName +EntrySQ.AirFrames=AirFrames or 20 +EntrySQ.Skill=Skill or AI.Skill.AVERAGE +EntrySQ.Modex=Modex or 402 +EntrySQ.Livery=Livery +EntrySQ.RECON=true +self.ManagedSQ[SquadName]=EntrySQ +return self +end +function EASYGCICAP:AddTankerSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequency,Modulation,TACAN) +self:T(self.lid.."AddTankerSquadron "..SquadName) +local EntrySQ={} +EntrySQ.TemplateName=TemplateName +EntrySQ.SquadName=SquadName +EntrySQ.AirbaseName=AirbaseName +EntrySQ.AirFrames=AirFrames or 20 +EntrySQ.Skill=Skill or AI.Skill.AVERAGE +EntrySQ.Modex=Modex or 602 +EntrySQ.Livery=Livery +EntrySQ.Frequency=Frequency +EntrySQ.Modulation=Livery +EntrySQ.TACAN=TACAN +EntrySQ.Tanker=true +self.ManagedSQ[SquadName]=EntrySQ +return self +end +function EASYGCICAP:AddAWACSSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequency,Modulation) +self:T(self.lid.."AddAWACSSquadron "..SquadName) +local EntrySQ={} +EntrySQ.TemplateName=TemplateName +EntrySQ.SquadName=SquadName +EntrySQ.AirbaseName=AirbaseName +EntrySQ.AirFrames=AirFrames or 20 +EntrySQ.Skill=Skill or AI.Skill.AVERAGE +EntrySQ.Modex=Modex or 702 +EntrySQ.Livery=Livery +EntrySQ.Frequency=Frequency +EntrySQ.Modulation=Livery +EntrySQ.AWACS=true +self.ManagedSQ[SquadName]=EntrySQ +return self +end +function EASYGCICAP:_AddSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequency,Modulation) +self:T(self.lid.."_AddSquadron "..SquadName) +local Squadron_One=SQUADRON:New(TemplateName,AirFrames,SquadName) +Squadron_One:AddMissionCapability({AUFTRAG.Type.CAP,AUFTRAG.Type.GCICAP,AUFTRAG.Type.INTERCEPT,AUFTRAG.Type.PATROLRACETRACK,AUFTRAG.Type.ALERT5}) +Squadron_One:SetFuelLowThreshold(0.3) +Squadron_One:SetTurnoverTime(10,20) +Squadron_One:SetModex(Modex) +Squadron_One:SetLivery(Livery) +Squadron_One:SetSkill(Skill or AI.Skill.AVERAGE) +Squadron_One:SetMissionRange(self.missionrange) +local wing=self.wings[AirbaseName][1] +wing:AddSquadron(Squadron_One) +wing:NewPayload(TemplateName,-1,{AUFTRAG.Type.CAP,AUFTRAG.Type.GCICAP,AUFTRAG.Type.INTERCEPT,AUFTRAG.Type.PATROLRACETRACK,AUFTRAG.Type.ALERT5},75) +return self +end +function EASYGCICAP:_AddReconSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery) +self:T(self.lid.."_AddReconSquadron "..SquadName) +local Squadron_One=SQUADRON:New(TemplateName,AirFrames,SquadName) +Squadron_One:AddMissionCapability({AUFTRAG.Type.RECON}) +Squadron_One:SetFuelLowThreshold(0.3) +Squadron_One:SetTurnoverTime(10,20) +Squadron_One:SetModex(Modex) +Squadron_One:SetLivery(Livery) +Squadron_One:SetSkill(Skill or AI.Skill.AVERAGE) +Squadron_One:SetMissionRange(self.missionrange) +local wing=self.wings[AirbaseName][1] +wing:AddSquadron(Squadron_One) +wing:NewPayload(TemplateName,-1,{AUFTRAG.Type.RECON},75) +return self +end +function EASYGCICAP:_AddTankerSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequency,Modulation,TACAN) +self:T(self.lid.."_AddTankerSquadron "..SquadName) +local Squadron_One=SQUADRON:New(TemplateName,AirFrames,SquadName) +Squadron_One:AddMissionCapability({AUFTRAG.Type.TANKER}) +Squadron_One:SetFuelLowThreshold(0.3) +Squadron_One:SetTurnoverTime(10,20) +Squadron_One:SetModex(Modex) +Squadron_One:SetLivery(Livery) +Squadron_One:SetSkill(Skill or AI.Skill.AVERAGE) +Squadron_One:SetMissionRange(self.missionrange) +Squadron_One:SetRadio(Frequency,Modulation) +if TACAN then +Squadron_One:AddTacanChannel(TACAN,TACAN) +end +local wing=self.wings[AirbaseName][1] +wing:AddSquadron(Squadron_One) +wing:NewPayload(TemplateName,-1,{AUFTRAG.Type.TANKER},75) +return self +end +function EASYGCICAP:_AddAWACSSquadron(TemplateName,SquadName,AirbaseName,AirFrames,Skill,Modex,Livery,Frequency,Modulation) +self:T(self.lid.."_AddAWACSSquadron "..SquadName) +local Squadron_One=SQUADRON:New(TemplateName,AirFrames,SquadName) +Squadron_One:AddMissionCapability({AUFTRAG.Type.AWACS}) +Squadron_One:SetFuelLowThreshold(0.3) +Squadron_One:SetTurnoverTime(10,20) +Squadron_One:SetModex(Modex) +Squadron_One:SetLivery(Livery) +Squadron_One:SetSkill(Skill or AI.Skill.AVERAGE) +Squadron_One:SetMissionRange(self.missionrange) +Squadron_One:SetRadio(Frequency,Modulation) +local wing=self.wings[AirbaseName][1] +wing:AddSquadron(Squadron_One) +wing:NewPayload(TemplateName,-1,{AUFTRAG.Type.AWACS},75) +return self +end +function EASYGCICAP:AddAcceptZone(Zone) +self:T(self.lid.."AddAcceptZone") +self.GoZoneSet:AddZone(Zone) +return self +end +function EASYGCICAP:AddRejectZone(Zone) +self:T(self.lid.."AddRejectZone") +self.NoGoZoneSet:AddZone(Zone) +return self +end +function EASYGCICAP:AddConflictZone(Zone) +self:T(self.lid.."AddConflictZone") +self.ConflictZoneSet:AddZone(Zone) +self.GoZoneSet:AddZone(Zone) +return self +end +function EASYGCICAP:_TryAssignIntercept(ReadyFlightGroups,InterceptAuftrag,Group,WingSize) +self:T("_TryAssignIntercept for size "..WingSize or 1) +local assigned=false +local wingsize=WingSize or 1 +local mindist=0 +local disttable={} +if Group and Group:IsAlive()then +local gcoord=Group:GetCoordinate()or COORDINATE:New(0,0,0) +self:T(self.lid..string.format("Assignment for %s",Group:GetName())) +for _name,_FG in pairs(ReadyFlightGroups or{})do +local FG=_FG +local fcoord=FG:GetCoordinate() +local dist=math.floor(UTILS.Round(fcoord:Get2DDistance(gcoord)/1000,1)) +self:T(self.lid..string.format("FG %s Distance %dkm",_name,dist)) +disttable[#disttable+1]={FG=FG,dist=dist} +if dist>mindist then mindist=dist end +end +local function sortDistance(a,b) +return a.dist<b.dist +end +table.sort(disttable,sortDistance) +for _,_entry in ipairs(disttable)do +local FG=_entry.FG +FG:AddMission(InterceptAuftrag) +local cm=FG:GetMissionCurrent() +if cm then cm:Cancel()end +wingsize=wingsize-1 +self:T(self.lid..string.format("Assigned to FG %s Distance %dkm",FG:GetName(),_entry.dist)) +if wingsize==0 then +assigned=true +break +end +end +end +return assigned,wingsize +end +function EASYGCICAP:_AssignIntercept(Cluster) +local overhead=self.overhead +local capspeed=self.capspeed+100 +local capalt=self.capalt +local maxsize=self.maxinterceptsize +local repeatsonfailure=self.repeatsonfailure +local wings=self.wings +local ctlpts=self.ManagedCP +local MaxAliveMissions=self.MaxAliveMissions +local nogozoneset=self.NoGoZoneSet +local conflictzoneset=self.ConflictZoneSet +local ReadyFlightGroups=self.ReadyFlightGroups +if Cluster.ctype~=INTEL.Ctype.AIRCRAFT then return end +local contact=self.Intel:GetHighestThreatContact(Cluster) +local name=contact.groupname +local threat=contact.threatlevel +local position=self.Intel:CalcClusterFuturePosition(Cluster,300) +local bestdistance=2000*1000 +local targetairwing=nil +local targetawname="" +local clustersize=self.Intel:ClusterCountUnits(Cluster)or 1 +local wingsize=math.abs(overhead*(clustersize+1)) +if wingsize>maxsize then wingsize=maxsize end +local retrymission=true +if Cluster.mission and(not Cluster.mission:IsOver())then +retrymission=false +end +if(retrymission)and(wingsize>=1)then +MESSAGE:New(string.format("**** %s Interceptors need wingsize %d",UTILS.GetCoalitionName(self.coalition),wingsize),15,"CAPGCI"):ToAllIf(self.debug):ToLog() +for _,_data in pairs(wings)do +local airwing=_data[1] +local zone=_data[2] +local zonecoord=zone:GetCoordinate() +local name=_data[3] +local coa=AIRBASE:FindByName(name):GetCoalition() +local distance=position:DistanceFromPointVec2(zonecoord) +local airframes=airwing:CountAssets(true) +local samecoalitionab=coa==self.coalition and true or false +if distance<bestdistance and airframes>=wingsize and samecoalitionab==true then +bestdistance=distance +targetairwing=airwing +targetawname=name +end +end +for _,_data in pairs(ctlpts)do +local data=_data +local name=data.AirbaseName +local zonecoord=data.Coordinate +if data.Zone then +zonecoord=data.Zone:GetCoordinate() +end +local airwing=wings[name][1] +local coa=AIRBASE:FindByName(name):GetCoalition() +local samecoalitionab=coa==self.coalition and true or false +local distance=position:DistanceFromPointVec2(zonecoord) +local airframes=airwing:CountAssets(true) +if distance<bestdistance and airframes>=wingsize and samecoalitionab==true then +bestdistance=distance +targetairwing=airwing +targetawname=name +end +end +local text=string.format("Closest Airwing is %s",targetawname) +local m=MESSAGE:New(text,10,"CAPGCI"):ToAllIf(self.debug):ToLog() +if targetairwing then +local AssetCount=targetairwing:CountAssetsOnMission(MissionTypes,Cohort) +local missioncount=self:_CountAliveAuftrags() +self:T(self.lid.." Assets on Mission "..AssetCount) +if missioncount<MaxAliveMissions then +local repeats=repeatsonfailure +local InterceptAuftrag=AUFTRAG:NewINTERCEPT(contact.group) +:SetMissionRange(150) +:SetPriority(1,true,1) +:SetRepeatOnFailure(repeats) +:SetMissionSpeed(UTILS.KnotsToAltKIAS(capspeed,capalt)) +:SetMissionAltitude(capalt) +if nogozoneset:Count()>0 then +InterceptAuftrag:AddConditionSuccess( +function(group,zoneset,conflictset) +local success=false +if group and group:IsAlive()then +local coord=group:GetCoordinate() +if coord and zoneset:Count()>0 and zoneset:IsCoordinateInZone(coord)then +success=true +end +if coord and conflictset:Count()>0 and conflictset:IsCoordinateInZone(coord)then +success=false +end +end +return success +end, +contact.group, +nogozoneset, +conflictzoneset +) +end +table.insert(self.ListOfAuftrag,InterceptAuftrag) +local assigned,rest=self:_TryAssignIntercept(ReadyFlightGroups,InterceptAuftrag,contact.group,wingsize) +if not assigned then +InterceptAuftrag:SetRequiredAssets(rest) +targetairwing:AddMission(InterceptAuftrag) +end +Cluster.mission=InterceptAuftrag +end +else +MESSAGE:New("**** Not enough airframes available or max mission limit reached!",15,"CAPGCI"):ToAllIf(self.debug):ToLog() +end +end +end +function EASYGCICAP:_StartIntel() +self:T(self.lid.."_StartIntel") +local BlueAir_DetectionSetGroup=SET_GROUP:New() +BlueAir_DetectionSetGroup:FilterPrefixes(self.EWRName) +BlueAir_DetectionSetGroup:FilterStart() +local BlueIntel=INTEL:New(BlueAir_DetectionSetGroup,self.coalitionname,self.alias) +BlueIntel:SetClusterAnalysis(true,false,false) +BlueIntel:SetForgetTime(300) +BlueIntel:SetAcceptZones(self.GoZoneSet) +BlueIntel:SetRejectZones(self.NoGoZoneSet) +BlueIntel:SetConflictZones(self.ConflictZoneSet) +BlueIntel:SetVerbosity(0) +BlueIntel:Start() +if self.debug then +BlueIntel.debug=true +end +local function AssignCluster(Cluster) +self:_AssignIntercept(Cluster) +end +function BlueIntel:onbeforeNewCluster(From,Event,To,Cluster) +AssignCluster(Cluster) +end +self.Intel=BlueIntel +return self +end +function EASYGCICAP:onafterStart(From,Event,To) +self:T({From,Event,To}) +self:_StartIntel() +self:_CreateAirwings() +self:_CreateSquads() +self:_SetCAPPatrolPoints() +self:_SetTankerPatrolPoints() +self:_SetAwacsPatrolPoints() +self:_SetReconPatrolPoints() +self:__Status(-10) +return self +end +function EASYGCICAP:onbeforeStatus(From,Event,To) +self:T({From,Event,To}) +if self:GetState()=="Stopped"then return false end +return self +end +function EASYGCICAP:onafterStatus(From,Event,To) +self:T({From,Event,To}) +local cleaned=false +local cleanlist={} +for _,_auftrag in pairs(self.ListOfAuftrag)do +local auftrag=_auftrag +if auftrag and(not(auftrag:IsCancelled()or auftrag:IsDone()or auftrag:IsOver()))then +table.insert(cleanlist,auftrag) +cleaned=true +end +end +if cleaned==true then +self.ListOfAuftrag=nil +self.ListOfAuftrag=cleanlist +end +local function counttable(tbl) +local count=0 +for _,_data in pairs(tbl)do +count=count+1 +end +return count +end +local wings=counttable(self.ManagedAW) +local squads=counttable(self.ManagedSQ) +local caps=counttable(self.ManagedCP) +local assets=0 +local instock=0 +local capmission=0 +local interceptmission=0 +local reconmission=0 +local awacsmission=0 +local tankermission=0 +for _,_wing in pairs(self.wings)do +local count=_wing[1]:CountAssetsOnMission(MissionTypes,Cohort) +local count2=_wing[1]:CountAssets(true,MissionTypes,Attributes) +capmission=capmission+_wing[1]:CountMissionsInQueue({AUFTRAG.Type.GCICAP,AUFTRAG.Type.PATROLRACETRACK}) +interceptmission=interceptmission+_wing[1]:CountMissionsInQueue({AUFTRAG.Type.INTERCEPT}) +reconmission=reconmission+_wing[1]:CountMissionsInQueue({AUFTRAG.Type.RECON}) +awacsmission=awacsmission+_wing[1]:CountMissionsInQueue({AUFTRAG.Type.AWACS}) +tankermission=tankermission+_wing[1]:CountMissionsInQueue({AUFTRAG.Type.TANKER}) +assets=assets+count +instock=instock+count2 +local assetsonmission=_wing[1]:GetAssetsOnMission({AUFTRAG.Type.GCICAP,AUFTRAG.Type.PATROLRACETRACK}) +self.ReadyFlightGroups=nil +self.ReadyFlightGroups={} +for _,_asset in pairs(assetsonmission or{})do +local asset=_asset +local FG=asset.flightgroup +if FG then +local name=FG:GetName() +local engage=FG:IsEngaging() +local hasmissiles=FG:IsOutOfMissiles()==nil and true or false +local ready=hasmissiles and FG:IsFuelGood()and FG:IsAirborne() +if ready then +self.ReadyFlightGroups[name]=FG +end +end +end +end +if self.Monitor then +local threatcount=#self.Intel.Clusters or 0 +local text="GCICAP "..self.alias +text=text.."\nWings: "..wings.."\nSquads: "..squads.."\nCapPoints: "..caps.."\nAssets on Mission: "..assets.."\nAssets in Stock: "..instock +text=text.."\nThreats: "..threatcount +text=text.."\nAirWing managed Missions: "..capmission+awacsmission+tankermission+reconmission +text=text.."\n - CAP: "..capmission +text=text.."\n - AWACS: "..awacsmission +text=text.."\n - TANKER: "..tankermission +text=text.."\n - Recon: "..reconmission +text=text.."\nSelf managed Missions:" +text=text.."\n - Mission Limit: "..self.MaxAliveMissions +text=text.."\n - Alert5+Intercept "..self:_CountAliveAuftrags() +MESSAGE:New(text,15,"GCICAP"):ToAll():ToLogIf(self.debug) +end +self:__Status(30) +return self +end +function EASYGCICAP:onafterStop(From,Event,To) +self:T({From,Event,To}) +self.Intel:Stop() +for _,_wing in pairs(self.wings or{})do +_wing:Stop() +end +return self +end +AI_BALANCER={ +ClassName="AI_BALANCER", +PatrolZones={}, +AIGroups={}, +Earliest=5, +Latest=60, +} +function AI_BALANCER:New(SetClient,SpawnAI) +local self=BASE:Inherit(self,FSM_SET:New(SET_GROUP:New())) +self:SetStartState("None") +self:AddTransition("*","Monitor","Monitoring") +self:AddTransition("*","Spawn","Spawning") +self:AddTransition("Spawning","Spawned","Spawned") +self:AddTransition("*","Destroy","Destroying") +self:AddTransition("*","Return","Returning") +self.SetClient=SetClient +self.SetClient:FilterOnce() +self.SpawnAI=SpawnAI +self.SpawnQueue={} +self.ToNearestAirbase=false +self.ToHomeAirbase=false +self:__Monitor(1) +return self +end +function AI_BALANCER:InitSpawnInterval(Earliest,Latest) +self.Earliest=Earliest +self.Latest=Latest +return self +end +function AI_BALANCER:ReturnToNearestAirbases(ReturnThresholdRange,ReturnAirbaseSet) +self.ToNearestAirbase=true +self.ReturnThresholdRange=ReturnThresholdRange +self.ReturnAirbaseSet=ReturnAirbaseSet +end +function AI_BALANCER:ReturnToHomeAirbase(ReturnThresholdRange) +self.ToHomeAirbase=true +self.ReturnThresholdRange=ReturnThresholdRange +end +function AI_BALANCER:onenterSpawning(SetGroup,From,Event,To,ClientName) +local AIGroup=self.SpawnAI:Spawn() +if AIGroup then +AIGroup:T({"Spawning new AIGroup",ClientName=ClientName}) +SetGroup:Remove(ClientName) +SetGroup:Add(ClientName,AIGroup) +self.SpawnQueue[ClientName]=nil +self:Spawned(AIGroup) +end +end +function AI_BALANCER:onenterDestroying(SetGroup,From,Event,To,ClientName,AIGroup) +AIGroup:Destroy() +SetGroup:Flush(self) +SetGroup:Remove(ClientName) +SetGroup:Flush(self) +end +function AI_BALANCER:onenterReturning(SetGroup,From,Event,To,AIGroup) +local AIGroupTemplate=AIGroup:GetTemplate() +if self.ToHomeAirbase==true then +local WayPointCount=#AIGroupTemplate.route.points +local SwitchWayPointCommand=AIGroup:CommandSwitchWayPoint(1,WayPointCount,1) +AIGroup:SetCommand(SwitchWayPointCommand) +AIGroup:MessageToRed("Returning to home base ...",30) +else +local PointVec2=COORDINATE:New(AIGroup:GetVec2().x,0,AIGroup:GetVec2().y) +local ClosestAirbase=self.ReturnAirbaseSet:FindNearestAirbaseFromPointVec2(PointVec2) +self:T(ClosestAirbase.AirbaseName) +AIGroup:RouteRTB(ClosestAirbase) +end +end +function AI_BALANCER:onenterMonitoring(SetGroup) +self:T2({self.SetClient:Count()}) +self.SetClient:ForEachClient( +function(Client) +self:T3(Client.ClientName) +local AIGroup=self.Set:Get(Client.UnitName) +if AIGroup then self:T({AIGroup=AIGroup:GetName(),IsAlive=AIGroup:IsAlive()})end +if Client:IsAlive()==true then +if AIGroup and AIGroup:IsAlive()==true then +if self.ToNearestAirbase==false and self.ToHomeAirbase==false then +self:Destroy(Client.UnitName,AIGroup) +else +local PlayerInRange={Value=false} +local RangeZone=ZONE_RADIUS:New('RangeZone',AIGroup:GetVec2(),self.ReturnThresholdRange) +self:T2(RangeZone) +_DATABASE:ForEachPlayerUnit( +function(RangeTestUnit,RangeZone,AIGroup,PlayerInRange) +self:T2({PlayerInRange,RangeTestUnit.UnitName,RangeZone.ZoneName}) +if RangeTestUnit:IsInZone(RangeZone)==true then +self:T2("in zone") +if RangeTestUnit:GetCoalition()~=AIGroup:GetCoalition()then +self:T2("in range") +PlayerInRange.Value=true +end +end +end, +function(RangeZone,AIGroup,PlayerInRange) +if PlayerInRange.Value==false then +self:Return(AIGroup) +end +end +,RangeZone,AIGroup,PlayerInRange +) +end +self.Set:Remove(Client.UnitName) +end +else +if not AIGroup or not AIGroup:IsAlive()==true then +self:T("Client "..Client.UnitName.." not alive.") +self:T({Queue=self.SpawnQueue[Client.UnitName]}) +if not self.SpawnQueue[Client.UnitName]then +self:__Spawn(math.random(self.Earliest,self.Latest),Client.UnitName) +self.SpawnQueue[Client.UnitName]=true +self:T("New AI Spawned for Client "..Client.UnitName) +end +end +end +return true +end +) +self:__Monitor(10) +end +AI_AIR={ +ClassName="AI_AIR", +} +AI_AIR.TaskDelay=0.5 +function AI_AIR:New(AIGroup) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +self:SetControllable(AIGroup) +self:SetStartState("Stopped") +self:AddTransition("*","Queue","Queued") +self:AddTransition("*","Start","Started") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("*","Status","*") +self:AddTransition("*","RTB","*") +self:AddTransition("Patrolling","Refuel","Refuelling") +self:AddTransition("*","Takeoff","Airborne") +self:AddTransition("*","Return","Returning") +self:AddTransition("*","Hold","Holding") +self:AddTransition("*","Home","Home") +self:AddTransition("*","LostControl","LostControl") +self:AddTransition("*","Fuel","Fuel") +self:AddTransition("*","Damaged","Damaged") +self:AddTransition("*","Eject","*") +self:AddTransition("*","Crash","Crashed") +self:AddTransition("*","PilotDead","*") +self.IdleCount=0 +self.RTBSpeedMaxFactor=0.6 +self.RTBSpeedMinFactor=0.5 +return self +end +function GROUP:OnEventTakeoff(EventData,Fsm) +Fsm:Takeoff() +self:UnHandleEvent(EVENTS.Takeoff) +end +function AI_AIR:SetDispatcher(Dispatcher) +self.Dispatcher=Dispatcher +end +function AI_AIR:GetDispatcher() +return self.Dispatcher +end +function AI_AIR:SetTargetDistance(Coordinate) +local CurrentCoord=self.Controllable:GetCoordinate() +self.TargetDistance=CurrentCoord:Get2DDistance(Coordinate) +self.ClosestTargetDistance=(not self.ClosestTargetDistance or self.ClosestTargetDistance>self.TargetDistance)and self.TargetDistance or self.ClosestTargetDistance +end +function AI_AIR:ClearTargetDistance() +self.TargetDistance=nil +self.ClosestTargetDistance=nil +end +function AI_AIR:SetSpeed(PatrolMinSpeed,PatrolMaxSpeed) +self:F2({PatrolMinSpeed,PatrolMaxSpeed}) +self.PatrolMinSpeed=PatrolMinSpeed +self.PatrolMaxSpeed=PatrolMaxSpeed +end +function AI_AIR:SetRTBSpeed(RTBMinSpeed,RTBMaxSpeed) +self:F({RTBMinSpeed,RTBMaxSpeed}) +self.RTBMinSpeed=RTBMinSpeed +self.RTBMaxSpeed=RTBMaxSpeed +end +function AI_AIR:SetAltitude(PatrolFloorAltitude,PatrolCeilingAltitude) +self:F2({PatrolFloorAltitude,PatrolCeilingAltitude}) +self.PatrolFloorAltitude=PatrolFloorAltitude +self.PatrolCeilingAltitude=PatrolCeilingAltitude +end +function AI_AIR:SetHomeAirbase(HomeAirbase) +self:F2({HomeAirbase}) +self.HomeAirbase=HomeAirbase +end +function AI_AIR:SetTanker(TankerName) +self:F2({TankerName}) +self.TankerName=TankerName +end +function AI_AIR:SetDisengageRadius(DisengageRadius) +self:F2({DisengageRadius}) +self.DisengageRadius=DisengageRadius +end +function AI_AIR:SetStatusOff() +self:F2() +self.CheckStatus=false +end +function AI_AIR:SetFuelThreshold(FuelThresholdPercentage,OutOfFuelOrbitTime) +self.FuelThresholdPercentage=FuelThresholdPercentage +self.OutOfFuelOrbitTime=OutOfFuelOrbitTime +self.Controllable:OptionRTBBingoFuel(false) +return self +end +function AI_AIR:SetDamageThreshold(PatrolDamageThreshold) +self.PatrolManageDamage=true +self.PatrolDamageThreshold=PatrolDamageThreshold +return self +end +function AI_AIR:onafterStart(Controllable,From,Event,To) +self:__Status(10) +self:HandleEvent(EVENTS.PilotDead,self.OnPilotDead) +self:HandleEvent(EVENTS.Crash,self.OnCrash) +self:HandleEvent(EVENTS.Ejection,self.OnEjection) +Controllable:OptionROEHoldFire() +Controllable:OptionROTVertical() +end +function AI_AIR:onafterReturn(Controllable,From,Event,To) +self:__RTB(self.TaskDelay) +end +function AI_AIR:onbeforeStatus() +return self.CheckStatus +end +function AI_AIR:onafterStatus() +if self.Controllable and self.Controllable:IsAlive()then +local RTB=false +local DistanceFromHomeBase=self.HomeAirbase:GetCoordinate():Get2DDistance(self.Controllable:GetCoordinate()) +if not self:Is("Holding")and not self:Is("Returning")then +local DistanceFromHomeBase=self.HomeAirbase:GetCoordinate():Get2DDistance(self.Controllable:GetCoordinate()) +if DistanceFromHomeBase>self.DisengageRadius then +self:T(self.Controllable:GetName().." is too far from home base, RTB!") +self:Hold(300) +RTB=false +end +end +if not self:Is("Fuel")and not self:Is("Home")and not self:is("Refuelling")then +local Fuel=self.Controllable:GetFuelMin() +if Fuel<self.FuelThresholdPercentage then +if self.TankerName then +self:T(self.Controllable:GetName().." is out of fuel: "..Fuel.." ... Refuelling at Tanker!") +self:Refuel() +else +self:T(self.Controllable:GetName().." is out of fuel: "..Fuel.." ... RTB!") +local OldAIControllable=self.Controllable +local OrbitTask=OldAIControllable:TaskOrbitCircle(math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude),self.PatrolMinSpeed) +local TimedOrbitTask=OldAIControllable:TaskControlled(OrbitTask,OldAIControllable:TaskCondition(nil,nil,nil,nil,self.OutOfFuelOrbitTime,nil)) +OldAIControllable:SetTask(TimedOrbitTask,10) +self:Fuel() +RTB=true +end +else +end +end +if self:Is("Fuel")and not self:Is("Home")and not self:is("Refuelling")then +RTB=true +end +local Damage=self.Controllable:GetLife() +local InitialLife=self.Controllable:GetLife0() +if(Damage/InitialLife)<self.PatrolDamageThreshold then +self:T(self.Controllable:GetName().." is damaged: "..Damage.." ... RTB!") +self:Damaged() +RTB=true +self:SetStatusOff() +end +if self.Controllable:HasTask()==false then +if not self:Is("Started")and +not self:Is("Stopped")and +not self:Is("Fuel")and +not self:Is("Damaged")and +not self:Is("Home")then +if self.IdleCount>=10 then +if Damage~=InitialLife then +self:Damaged() +else +self:T(self.Controllable:GetName().." control lost! ") +self:LostControl() +end +else +self.IdleCount=self.IdleCount+1 +end +end +else +self.IdleCount=0 +end +if RTB==true then +self:__RTB(self.TaskDelay) +end +if not self:Is("Home")then +self:__Status(10) +end +end +end +function AI_AIR.RTBRoute(AIGroup,Fsm) +AIGroup:F({"AI_AIR.RTBRoute:",AIGroup:GetName()}) +if AIGroup:IsAlive()then +Fsm:RTB() +end +end +function AI_AIR.RTBHold(AIGroup,Fsm) +AIGroup:F({"AI_AIR.RTBHold:",AIGroup:GetName()}) +if AIGroup:IsAlive()then +Fsm:__RTB(Fsm.TaskDelay) +Fsm:Return() +local Task=AIGroup:TaskOrbitCircle(4000,400) +AIGroup:SetTask(Task) +end +end +function AI_AIR:SetRTBSpeedFactors(MinFactor,MaxFactor) +self.RTBSpeedMaxFactor=MaxFactor or 0.6 +self.RTBSpeedMinFactor=MinFactor or 0.5 +return self +end +function AI_AIR:onafterRTB(AIGroup,From,Event,To) +self:F({AIGroup,From,Event,To}) +if AIGroup and AIGroup:IsAlive()then +self:T("Group "..AIGroup:GetName().." ... RTB! ( "..self:GetState().." )") +self:ClearTargetDistance() +AIGroup:OptionProhibitAfterburner(true) +local EngageRoute={} +local FromCoord=AIGroup:GetCoordinate() +if not FromCoord then return end +local ToTargetCoord=self.HomeAirbase:GetCoordinate() +local ToTargetVec3=ToTargetCoord:GetVec3() +ToTargetVec3.y=ToTargetCoord:GetLandHeight()+3000 +local ToTargetCoord2=COORDINATE:NewFromVec3(ToTargetVec3) +if not self.RTBMinSpeed or not self.RTBMaxSpeed then +local RTBSpeedMax=AIGroup:GetSpeedMax() +local RTBSpeedMaxFactor=self.RTBSpeedMaxFactor or 0.6 +local RTBSpeedMinFactor=self.RTBSpeedMinFactor or 0.5 +self:SetRTBSpeed(RTBSpeedMax*RTBSpeedMinFactor,RTBSpeedMax*RTBSpeedMaxFactor) +end +local RTBSpeed=math.random(self.RTBMinSpeed,self.RTBMaxSpeed) +local Distance=FromCoord:Get2DDistance(ToTargetCoord2) +local ToAirbaseCoord=ToTargetCoord2 +if Distance<5000 then +self:T("RTB and near the airbase!") +self:Home() +return +end +if not AIGroup:InAir()==true then +self:T("Not anymore in the air, considered Home.") +self:Home() +return +end +local FromRTBRoutePoint=FromCoord:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +RTBSpeed, +true +) +local ToRTBRoutePoint=ToAirbaseCoord:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +RTBSpeed, +true +) +EngageRoute[#EngageRoute+1]=FromRTBRoutePoint +EngageRoute[#EngageRoute+1]=ToRTBRoutePoint +local Tasks={} +Tasks[#Tasks+1]=AIGroup:TaskFunction("AI_AIR.RTBRoute",self) +EngageRoute[#EngageRoute].task=AIGroup:TaskCombo(Tasks) +AIGroup:OptionROEHoldFire() +AIGroup:OptionROTEvadeFire() +AIGroup:Route(EngageRoute,self.TaskDelay) +end +end +function AI_AIR:onafterHome(AIGroup,From,Event,To) +self:F({AIGroup,From,Event,To}) +self:T("Group "..self.Controllable:GetName().." ... Home! ( "..self:GetState().." )") +if AIGroup and AIGroup:IsAlive()then +end +end +function AI_AIR:onafterHold(AIGroup,From,Event,To,HoldTime) +self:F({AIGroup,From,Event,To}) +self:T("Group "..self.Controllable:GetName().." ... Holding! ( "..self:GetState().." )") +if AIGroup and AIGroup:IsAlive()then +local Coordinate=AIGroup:GetCoordinate() +if Coordinate==nil then return end +local OrbitTask=AIGroup:TaskOrbitCircle(math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude),self.PatrolMinSpeed,Coordinate) +local TimedOrbitTask=AIGroup:TaskControlled(OrbitTask,AIGroup:TaskCondition(nil,nil,nil,nil,HoldTime,nil)) +local RTBTask=AIGroup:TaskFunction("AI_AIR.RTBHold",self) +local OrbitHoldTask=AIGroup:TaskOrbitCircle(4000,self.PatrolMinSpeed) +AIGroup:SetTask(AIGroup:TaskCombo({TimedOrbitTask,RTBTask,OrbitHoldTask}),1) +end +end +function AI_AIR.Resume(AIGroup,Fsm) +AIGroup:T({"AI_AIR.Resume:",AIGroup:GetName()}) +if AIGroup:IsAlive()then +Fsm:__RTB(Fsm.TaskDelay) +end +end +function AI_AIR:onafterRefuel(AIGroup,From,Event,To) +self:F({AIGroup,From,Event,To}) +if AIGroup and AIGroup:IsAlive()then +local Tanker=GROUP:FindByName(self.TankerName) +if Tanker and Tanker:IsAlive()and Tanker:IsAirPlane()then +self:T("Group "..self.Controllable:GetName().." ... Refuelling! State="..self:GetState()..", Refuelling tanker "..self.TankerName) +local RefuelRoute={} +local FromRefuelCoord=AIGroup:GetCoordinate() +local ToRefuelCoord=Tanker:GetCoordinate() +local ToRefuelSpeed=math.random(self.PatrolMinSpeed,self.PatrolMaxSpeed) +local FromRefuelRoutePoint=FromRefuelCoord:WaypointAir(self.PatrolAltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,ToRefuelSpeed,true) +local ToRefuelRoutePoint=Tanker:GetCoordinate():WaypointAir(self.PatrolAltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,ToRefuelSpeed,true) +self:F({ToRefuelSpeed=ToRefuelSpeed}) +RefuelRoute[#RefuelRoute+1]=FromRefuelRoutePoint +RefuelRoute[#RefuelRoute+1]=ToRefuelRoutePoint +AIGroup:OptionROEHoldFire() +AIGroup:OptionROTEvadeFire() +local classname=self:GetClassName() +if classname=="AI_A2A_CAP"then +classname="AI_AIR_PATROL" +end +env.info("FF refueling classname="..classname) +local Tasks={} +Tasks[#Tasks+1]=AIGroup:TaskRefueling() +Tasks[#Tasks+1]=AIGroup:TaskFunction(classname..".Resume",self) +RefuelRoute[#RefuelRoute].task=AIGroup:TaskCombo(Tasks) +AIGroup:Route(RefuelRoute,self.TaskDelay) +else +self:RTB() +end +end +end +function AI_AIR:onafterDead() +self:SetStatusOff() +end +function AI_AIR:OnCrash(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +if#self.Controllable:GetUnits()==1 then +self:__Crash(self.TaskDelay,EventData) +end +end +end +function AI_AIR:OnEjection(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +self:__Eject(self.TaskDelay,EventData) +end +end +function AI_AIR:OnPilotDead(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +self:__PilotDead(self.TaskDelay,EventData) +end +end +AI_AIR_PATROL={ +ClassName="AI_AIR_PATROL", +} +function AI_AIR_PATROL:New(AI_Air,AIGroup,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local self=BASE:Inherit(self,AI_Air) +local SpeedMax=AIGroup:GetSpeedMax() +self.PatrolZone=PatrolZone +self.PatrolFloorAltitude=PatrolFloorAltitude or 1000 +self.PatrolCeilingAltitude=PatrolCeilingAltitude or 1500 +self.PatrolMinSpeed=PatrolMinSpeed or SpeedMax*0.5 +self.PatrolMaxSpeed=PatrolMaxSpeed or SpeedMax*0.75 +self.PatrolAltType=PatrolAltType or"RADIO" +self:AddTransition({"Started","Airborne","Refuelling"},"Patrol","Patrolling") +self:AddTransition("Patrolling","PatrolRoute","Patrolling") +self:AddTransition("*","Reset","Patrolling") +return self +end +function AI_AIR_PATROL:SetEngageRange(EngageRange) +self:F2() +if EngageRange then +self.EngageRange=EngageRange +else +self.EngageRange=nil +end +end +function AI_AIR_PATROL:SetRaceTrackPattern(LegMin,LegMax,HeadingMin,HeadingMax,DurationMin,DurationMax,CapCoordinates) +self.racetrack=true +self.racetracklegmin=LegMin or 10000 +self.racetracklegmax=LegMax or 15000 +self.racetrackheadingmin=HeadingMin or 0 +self.racetrackheadingmax=HeadingMax or 180 +self.racetrackdurationmin=DurationMin +self.racetrackdurationmax=DurationMax +if self.racetrackdurationmax and not self.racetrackdurationmin then +self.racetrackdurationmin=self.racetrackdurationmax +end +self.racetrackcapcoordinates=CapCoordinates +end +function AI_AIR_PATROL:onafterPatrol(AIPatrol,From,Event,To) +self:F2() +self:ClearTargetDistance() +self:__PatrolRoute(self.TaskDelay) +AIPatrol:OnReSpawn( +function(PatrolGroup) +self:__Reset(self.TaskDelay) +self:__PatrolRoute(self.TaskDelay) +end +) +end +function AI_AIR_PATROL.___PatrolRoute(AIPatrol,Fsm) +AIPatrol:F({"AI_AIR_PATROL.___PatrolRoute:",AIPatrol:GetName()}) +if AIPatrol and AIPatrol:IsAlive()then +Fsm:PatrolRoute() +end +end +function AI_AIR_PATROL:onafterPatrolRoute(AIPatrol,From,Event,To) +self:F2() +if From=="RTB"then +return +end +if AIPatrol and AIPatrol:IsAlive()then +local PatrolRoute={} +local CurrentCoord=AIPatrol:GetCoordinate() +local altitude=math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude) +local ToTargetCoord=self.PatrolZone:GetRandomPointVec2() +ToTargetCoord:SetAlt(altitude) +self:SetTargetDistance(ToTargetCoord) +local ToTargetSpeed=math.random(self.PatrolMinSpeed,self.PatrolMaxSpeed) +local speedkmh=ToTargetSpeed +local FromWP=CurrentCoord:WaypointAir(self.PatrolAltType or"RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,ToTargetSpeed,true) +PatrolRoute[#PatrolRoute+1]=FromWP +if self.racetrack then +local heading=math.random(self.racetrackheadingmin,self.racetrackheadingmax) +local leg=math.random(self.racetracklegmin,self.racetracklegmax) +local duration=self.racetrackdurationmin +if self.racetrackdurationmax then +duration=math.random(self.racetrackdurationmin,self.racetrackdurationmax) +end +local c0=self.PatrolZone:GetRandomCoordinate() +if self.racetrackcapcoordinates and#self.racetrackcapcoordinates>0 then +c0=self.racetrackcapcoordinates[math.random(#self.racetrackcapcoordinates)] +end +local c1=c0:SetAltitude(altitude) +local c2=c1:Translate(leg,heading):SetAltitude(altitude) +self:SetTargetDistance(c0) +self:T(string.format("Patrol zone race track: v=%.1f knots, h=%.1f ft, heading=%03d, leg=%d m, t=%s sec",UTILS.KmphToKnots(speedkmh),UTILS.MetersToFeet(altitude),heading,leg,tostring(duration))) +local taskOrbit=AIPatrol:TaskOrbit(c1,altitude,UTILS.KmphToMps(speedkmh),c2) +local taskPatrol=AIPatrol:TaskFunction("AI_AIR_PATROL.___PatrolRoute",self) +local taskCond=AIPatrol:TaskCondition(nil,nil,nil,nil,duration,nil) +local taskCont=AIPatrol:TaskControlled(taskOrbit,taskCond) +PatrolRoute[2]=c1:WaypointAirTurningPoint(self.PatrolAltType,speedkmh,{taskCont,taskPatrol},"CAP Orbit") +else +local ToWP=ToTargetCoord:WaypointAir(self.PatrolAltType,COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,ToTargetSpeed,true) +PatrolRoute[#PatrolRoute+1]=ToWP +local Tasks={} +Tasks[#Tasks+1]=AIPatrol:TaskFunction("AI_AIR_PATROL.___PatrolRoute",self) +PatrolRoute[#PatrolRoute].task=AIPatrol:TaskCombo(Tasks) +end +AIPatrol:OptionROEReturnFire() +AIPatrol:OptionROTEvadeFire() +AIPatrol:Route(PatrolRoute,self.TaskDelay) +end +end +function AI_AIR_PATROL.Resume(AIPatrol,Fsm) +AIPatrol:F({"AI_AIR_PATROL.Resume:",AIPatrol:GetName()}) +if AIPatrol and AIPatrol:IsAlive()then +Fsm:__Reset(Fsm.TaskDelay) +Fsm:__PatrolRoute(Fsm.TaskDelay) +end +end +AI_AIR_ENGAGE={ +ClassName="AI_AIR_ENGAGE", +} +function AI_AIR_ENGAGE:New(AI_Air,AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air) +self.Accomplished=false +self.Engaging=false +local SpeedMax=AIGroup:GetSpeedMax() +self.EngageMinSpeed=EngageMinSpeed or SpeedMax*0.5 +self.EngageMaxSpeed=EngageMaxSpeed or SpeedMax*0.75 +self.EngageFloorAltitude=EngageFloorAltitude or 1000 +self.EngageCeilingAltitude=EngageCeilingAltitude or 1500 +self.EngageAltType=EngageAltType or"RADIO" +self:AddTransition({"Started","Engaging","Returning","Airborne","Patrolling"},"EngageRoute","Engaging") +self:AddTransition({"Started","Engaging","Returning","Airborne","Patrolling"},"Engage","Engaging") +self:AddTransition("Engaging","Fired","Engaging") +self:AddTransition("*","Destroy","*") +self:AddTransition("Engaging","Abort","Patrolling") +self:AddTransition("Engaging","Accomplish","Patrolling") +self:AddTransition({"Patrolling","Engaging"},"Refuel","Refuelling") +return self +end +function AI_AIR_ENGAGE:onafterStart(AIGroup,From,Event,To) +self:GetParent(self,AI_AIR_ENGAGE).onafterStart(self,AIGroup,From,Event,To) +AIGroup:HandleEvent(EVENTS.Takeoff,nil,self) +end +function AI_AIR_ENGAGE:onafterEngage(AIGroup,From,Event,To) +self:HandleEvent(EVENTS.Dead) +end +function AI_AIR_ENGAGE:onbeforeEngage(AIGroup,From,Event,To) +if self.Accomplished==true then +return false +end +return true +end +function AI_AIR_ENGAGE:onafterAbort(AIGroup,From,Event,To) +AIGroup:ClearTasks() +self:Return() +end +function AI_AIR_ENGAGE:onafterAccomplish(AIGroup,From,Event,To) +self.Accomplished=true +end +function AI_AIR_ENGAGE:onafterDestroy(AIGroup,From,Event,To,EventData) +if EventData.IniUnit then +self.AttackUnits[EventData.IniUnit]=nil +end +end +function AI_AIR_ENGAGE:OnEventDead(EventData) +self:F({"EventDead",EventData}) +if EventData.IniDCSUnit then +if self.AttackUnits and self.AttackUnits[EventData.IniUnit]then +self:__Destroy(self.TaskDelay,EventData) +end +end +end +function AI_AIR_ENGAGE.___EngageRoute(AIGroup,Fsm,AttackSetUnit) +Fsm:T(string.format("AI_AIR_ENGAGE.___EngageRoute: %s",tostring(AIGroup:GetName()))) +if AIGroup and AIGroup:IsAlive()then +Fsm:__EngageRoute(Fsm.TaskDelay or 0.1,AttackSetUnit) +end +end +function AI_AIR_ENGAGE:onafterEngageRoute(DefenderGroup,From,Event,To,AttackSetUnit) +self:T({DefenderGroup,From,Event,To,AttackSetUnit}) +local DefenderGroupName=DefenderGroup:GetName() +self.AttackSetUnit=AttackSetUnit +local AttackCount=AttackSetUnit:CountAlive() +if AttackCount>0 then +if DefenderGroup:IsAlive()then +local EngageAltitude=math.random(self.EngageFloorAltitude,self.EngageCeilingAltitude) +local EngageSpeed=math.random(self.EngageMinSpeed,self.EngageMaxSpeed) +local DefenderCoord=DefenderGroup:GetPointVec3() +DefenderCoord:SetY(EngageAltitude) +local TargetCoord=AttackSetUnit:GetRandomSurely():GetPointVec3() +if TargetCoord==nil then +self:Return() +return +end +TargetCoord:SetY(EngageAltitude) +local TargetDistance=DefenderCoord:Get2DDistance(TargetCoord) +local EngageDistance=(DefenderGroup:IsHelicopter()and 5000)or(DefenderGroup:IsAirPlane()and 10000) +if TargetDistance<=EngageDistance*9 then +self:__Engage(0.1,AttackSetUnit) +else +local EngageRoute={} +local AttackTasks={} +local FromWP=DefenderCoord:WaypointAir(self.PatrolAltType or"RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,EngageSpeed,true) +EngageRoute[#EngageRoute+1]=FromWP +self:SetTargetDistance(TargetCoord) +local FromEngageAngle=DefenderCoord:GetAngleDegrees(DefenderCoord:GetDirectionVec3(TargetCoord)) +local ToCoord=DefenderCoord:Translate(EngageDistance,FromEngageAngle,true) +local ToWP=ToCoord:WaypointAir(self.PatrolAltType or"RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,EngageSpeed,true) +EngageRoute[#EngageRoute+1]=ToWP +AttackTasks[#AttackTasks+1]=DefenderGroup:TaskFunction("AI_AIR_ENGAGE.___EngageRoute",self,AttackSetUnit) +EngageRoute[#EngageRoute].task=DefenderGroup:TaskCombo(AttackTasks) +DefenderGroup:OptionROEReturnFire() +DefenderGroup:OptionROTEvadeFire() +DefenderGroup:Route(EngageRoute,self.TaskDelay or 0.1) +end +end +else +self:T(DefenderGroupName..": No targets found -> Going RTB") +self:Return() +end +end +function AI_AIR_ENGAGE.___Engage(AIGroup,Fsm,AttackSetUnit) +Fsm:T(string.format("AI_AIR_ENGAGE.___Engage: %s",tostring(AIGroup:GetName()))) +if AIGroup and AIGroup:IsAlive()then +local delay=Fsm.TaskDelay or 0.1 +Fsm:__Engage(delay,AttackSetUnit) +end +end +function AI_AIR_ENGAGE:onafterEngage(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({DefenderGroup,From,Event,To,AttackSetUnit}) +local DefenderGroupName=DefenderGroup:GetName() +self.AttackSetUnit=AttackSetUnit +local AttackCount=AttackSetUnit:CountAlive() +self:T({AttackCount=AttackCount}) +if AttackCount>0 then +if DefenderGroup and DefenderGroup:IsAlive()then +local EngageAltitude=math.random(self.EngageFloorAltitude or 500,self.EngageCeilingAltitude or 1000) +local EngageSpeed=math.random(self.EngageMinSpeed,self.EngageMaxSpeed) +local DefenderCoord=DefenderGroup:GetPointVec3() +DefenderCoord:SetY(EngageAltitude) +local TargetCoord=AttackSetUnit:GetRandomSurely():GetPointVec3() +if not TargetCoord then +self:Return() +return +end +TargetCoord:SetY(EngageAltitude) +local TargetDistance=DefenderCoord:Get2DDistance(TargetCoord) +local EngageDistance=(DefenderGroup:IsHelicopter()and 5000)or(DefenderGroup:IsAirPlane()and 10000) +local EngageRoute={} +local AttackTasks={} +local FromWP=DefenderCoord:WaypointAir(self.EngageAltType or"RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,EngageSpeed,true) +EngageRoute[#EngageRoute+1]=FromWP +self:SetTargetDistance(TargetCoord) +local FromEngageAngle=DefenderCoord:GetAngleDegrees(DefenderCoord:GetDirectionVec3(TargetCoord)) +local ToCoord=DefenderCoord:Translate(EngageDistance,FromEngageAngle,true) +local ToWP=ToCoord:WaypointAir(self.EngageAltType or"RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,EngageSpeed,true) +EngageRoute[#EngageRoute+1]=ToWP +if TargetDistance<=EngageDistance*9 then +local AttackUnitTasks=self:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +if#AttackUnitTasks==0 then +self:T(DefenderGroupName..": No valid targets found -> Going RTB") +self:Return() +return +else +local text=string.format("%s: Engaging targets at distance %.2f NM",DefenderGroupName,UTILS.MetersToNM(TargetDistance)) +self:T(text) +DefenderGroup:OptionROEOpenFire() +DefenderGroup:OptionROTEvadeFire() +DefenderGroup:OptionKeepWeaponsOnThreat() +AttackTasks[#AttackTasks+1]=DefenderGroup:TaskCombo(AttackUnitTasks) +end +end +AttackTasks[#AttackTasks+1]=DefenderGroup:TaskFunction("AI_AIR_ENGAGE.___Engage",self,AttackSetUnit) +EngageRoute[#EngageRoute].task=DefenderGroup:TaskCombo(AttackTasks) +DefenderGroup:Route(EngageRoute,self.TaskDelay or 0.1) +end +else +self:T(DefenderGroupName..": No targets found -> returning.") +self:Return() +return +end +end +function AI_AIR_ENGAGE.Resume(AIEngage,Fsm) +AIEngage:F({"Resume:",AIEngage:GetName()}) +if AIEngage and AIEngage:IsAlive()then +Fsm:__Reset(Fsm.TaskDelay or 0.1) +Fsm:__EngageRoute(Fsm.TaskDelay or 0.2,Fsm.AttackSetUnit) +end +end +AI_A2A_PATROL={ +ClassName="AI_A2A_PATROL", +} +function AI_A2A_PATROL:New(AIPatrol,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air=AI_AIR:New(AIPatrol) +local AI_Air_Patrol=AI_AIR_PATROL:New(AI_Air,AIPatrol,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local self=BASE:Inherit(self,AI_Air_Patrol) +self:SetFuelThreshold(.2,60) +self:SetDamageThreshold(0.4) +self:SetDisengageRadius(70000) +self.PatrolZone=PatrolZone +self.PatrolFloorAltitude=PatrolFloorAltitude +self.PatrolCeilingAltitude=PatrolCeilingAltitude +self.PatrolMinSpeed=PatrolMinSpeed +self.PatrolMaxSpeed=PatrolMaxSpeed +self.PatrolAltType=PatrolAltType or"BARO" +self:AddTransition({"Started","Airborne","Refuelling"},"Patrol","Patrolling") +self:AddTransition("Patrolling","Route","Patrolling") +self:AddTransition("*","Reset","Patrolling") +return self +end +function AI_A2A_PATROL:SetSpeed(PatrolMinSpeed,PatrolMaxSpeed) +self:F2({PatrolMinSpeed,PatrolMaxSpeed}) +self.PatrolMinSpeed=PatrolMinSpeed +self.PatrolMaxSpeed=PatrolMaxSpeed +end +function AI_A2A_PATROL:SetAltitude(PatrolFloorAltitude,PatrolCeilingAltitude) +self:F2({PatrolFloorAltitude,PatrolCeilingAltitude}) +self.PatrolFloorAltitude=PatrolFloorAltitude +self.PatrolCeilingAltitude=PatrolCeilingAltitude +end +function AI_A2A_PATROL:onafterPatrol(AIPatrol,From,Event,To) +self:F2() +self:ClearTargetDistance() +self:__Route(1) +AIPatrol:OnReSpawn( +function(PatrolGroup) +self:__Reset(1) +self:__Route(5) +end +) +end +function AI_A2A_PATROL.PatrolRoute(AIPatrol,Fsm) +AIPatrol:F({"AI_A2A_PATROL.PatrolRoute:",AIPatrol:GetName()}) +if AIPatrol and AIPatrol:IsAlive()then +Fsm:Route() +end +end +function AI_A2A_PATROL:onafterRoute(AIPatrol,From,Event,To) +self:F2() +if From=="RTB"then +return +end +if AIPatrol and AIPatrol:IsAlive()then +local PatrolRoute={} +local CurrentCoord=AIPatrol:GetCoordinate() +local altitude=math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude) +local speedkmh=math.random(self.PatrolMinSpeed,self.PatrolMaxSpeed) +PatrolRoute[1]=CurrentCoord:WaypointAirTurningPoint(nil,speedkmh,{},"Current") +if self.racetrack then +local heading=math.random(self.racetrackheadingmin,self.racetrackheadingmax) +local leg=math.random(self.racetracklegmin,self.racetracklegmax) +local duration=self.racetrackdurationmin +if self.racetrackdurationmax then +duration=math.random(self.racetrackdurationmin,self.racetrackdurationmax) +end +local c0=self.PatrolZone:GetRandomCoordinate() +if self.racetrackcapcoordinates and#self.racetrackcapcoordinates>0 then +c0=self.racetrackcapcoordinates[math.random(#self.racetrackcapcoordinates)] +end +local c1=c0:SetAltitude(altitude) +local c2=c1:Translate(leg,heading):SetAltitude(altitude) +self:SetTargetDistance(c0) +self:T(string.format("Patrol zone race track: v=%.1f knots, h=%.1f ft, heading=%03d, leg=%d m, t=%s sec",UTILS.KmphToKnots(speedkmh),UTILS.MetersToFeet(altitude),heading,leg,tostring(duration))) +local taskOrbit=AIPatrol:TaskOrbit(c1,altitude,UTILS.KmphToMps(speedkmh),c2) +local taskPatrol=AIPatrol:TaskFunction("AI_A2A_PATROL.PatrolRoute",self) +local taskCond=AIPatrol:TaskCondition(nil,nil,nil,nil,duration,nil) +local taskCont=AIPatrol:TaskControlled(taskOrbit,taskCond) +PatrolRoute[2]=c1:WaypointAirTurningPoint(self.PatrolAltType,speedkmh,{taskCont,taskPatrol},"CAP Orbit") +else +local ToTargetCoord=self.PatrolZone:GetRandomCoordinate() +ToTargetCoord:SetAltitude(altitude) +self:SetTargetDistance(ToTargetCoord) +local taskReRoute=AIPatrol:TaskFunction("AI_A2A_PATROL.PatrolRoute",self) +PatrolRoute[2]=ToTargetCoord:WaypointAirTurningPoint(self.PatrolAltType,speedkmh,{taskReRoute},"Patrol Point") +end +AIPatrol:OptionROEReturnFire() +AIPatrol:OptionROTEvadeFire() +AIPatrol:Route(PatrolRoute,0.5) +end +end +AI_A2A_CAP={ +ClassName="AI_A2A_CAP", +} +function AI_A2A_CAP:New2(AICap,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType,PatrolZone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType) +local AI_Air=AI_AIR:New(AICap) +local AI_Air_Patrol=AI_AIR_PATROL:New(AI_Air,AICap,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air_Engage=AI_AIR_ENGAGE:New(AI_Air_Patrol,AICap,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air_Engage) +self:SetFuelThreshold(.2,60) +self:SetDamageThreshold(0.4) +self:SetDisengageRadius(70000) +return self +end +function AI_A2A_CAP:New(AICap,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageMinSpeed,EngageMaxSpeed,PatrolAltType) +return self:New2(AICap,EngageMinSpeed,EngageMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,PatrolZone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType) +end +function AI_A2A_CAP:onafterStart(AICap,From,Event,To) +self:GetParent(self,AI_A2A_CAP).onafterStart(self,AICap,From,Event,To) +AICap:HandleEvent(EVENTS.Takeoff,nil,self) +end +function AI_A2A_CAP:SetEngageZone(EngageZone) +self:F2() +if EngageZone then +self.EngageZone=EngageZone +else +self.EngageZone=nil +end +end +function AI_A2A_CAP:SetEngageRange(EngageRange) +self:F2() +if EngageRange then +self.EngageRange=EngageRange +else +self.EngageRange=nil +end +end +function AI_A2A_CAP:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +local AttackUnitTasks={} +for AttackUnitID,AttackUnit in pairs(self.AttackSetUnit:GetSet())do +local AttackUnit=AttackUnit +if AttackUnit and AttackUnit:IsAlive()and AttackUnit:IsAir()then +self:T({"Attacking Task:",AttackUnit:GetName(),AttackUnit:IsAlive(),AttackUnit:IsAir()}) +AttackUnitTasks[#AttackUnitTasks+1]=DefenderGroup:TaskAttackUnit(AttackUnit) +end +end +return AttackUnitTasks +end +AI_A2A_GCI={ +ClassName="AI_A2A_GCI", +} +function AI_A2A_GCI:New2(AIIntercept,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local AI_Air=AI_AIR:New(AIIntercept) +local AI_Air_Engage=AI_AIR_ENGAGE:New(AI_Air,AIIntercept,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air_Engage) +self:SetFuelThreshold(.2,60) +self:SetDamageThreshold(0.4) +self:SetDisengageRadius(70000) +return self +end +function AI_A2A_GCI:New(AIIntercept,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +return self:New2(AIIntercept,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +end +function AI_A2A_GCI:onafterStart(AIIntercept,From,Event,To) +self:GetParent(self,AI_A2A_GCI).onafterStart(self,AIIntercept,From,Event,To) +end +function AI_A2A_GCI:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +local AttackUnitTasks={} +for AttackUnitID,AttackUnit in pairs(self.AttackSetUnit:GetSet())do +local AttackUnit=AttackUnit +self:T({"Attacking Unit:",AttackUnit:GetName(),AttackUnit:IsAlive(),AttackUnit:IsAir()}) +if AttackUnit:IsAlive()and AttackUnit:IsAir()then +AttackUnitTasks[#AttackUnitTasks+1]=DefenderGroup:TaskAttackUnit(AttackUnit) +end +end +return AttackUnitTasks +end +do +AI_A2A_DISPATCHER={ +ClassName="AI_A2A_DISPATCHER", +Detection=nil, +} +AI_A2A_DISPATCHER.Takeoff=GROUP.Takeoff +AI_A2A_DISPATCHER.Landing={ +NearAirbase=1, +AtRunway=2, +AtEngineShutdown=3, +} +function AI_A2A_DISPATCHER:New(Detection) +local self=BASE:Inherit(self,DETECTION_MANAGER:New(nil,Detection)) +self.Detection=Detection +self.DefenderSquadrons={} +self.DefenderSpawns={} +self.DefenderTasks={} +self.DefenderDefault={} +self.SetSendPlayerMessages=false +self.Detection:FilterCategories({Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +self.Detection:SetRefreshTimeInterval(30) +self:SetEngageRadius() +self:SetGciRadius() +self:SetIntercept(300) +self:SetDisengageRadius(300000) +self:SetDefaultTakeoff(AI_A2A_DISPATCHER.Takeoff.Air) +self:SetDefaultTakeoffInAirAltitude(500) +self:SetDefaultLanding(AI_A2A_DISPATCHER.Landing.NearAirbase) +self:SetDefaultOverhead(1) +self:SetDefaultGrouping(1) +self:SetDefaultFuelThreshold(0.15,0) +self:SetDefaultDamageThreshold(0.4) +self:SetDefaultCapTimeInterval(180,600) +self:SetDefaultCapLimit(1) +self:AddTransition("Started","Assign","Started") +self:AddTransition("*","CAP","*") +self:AddTransition("*","GCI","*") +self:AddTransition("*","ENGAGE","*") +self:HandleEvent(EVENTS.Crash,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.BaseCaptured) +self:SetTacticalDisplay(false) +self.DefenderCAPIndex=0 +self:__Start(5) +return self +end +function AI_A2A_DISPATCHER:onafterStart(From,Event,To) +self:GetParent(self,AI_A2A_DISPATCHER).onafterStart(self,From,Event,To) +for SquadronName,_DefenderSquadron in pairs(self.DefenderSquadrons)do +local DefenderSquadron=_DefenderSquadron +DefenderSquadron.Resources={} +if DefenderSquadron.ResourceCount then +for Resource=1,DefenderSquadron.ResourceCount do +self:ParkDefender(DefenderSquadron) +end +end +end +end +function AI_A2A_DISPATCHER:ParkDefender(DefenderSquadron) +local TemplateID=math.random(1,#DefenderSquadron.Spawn) +local Spawn=DefenderSquadron.Spawn[TemplateID] +Spawn:InitGrouping(1) +local SpawnGroup +if self:IsSquadronVisible(DefenderSquadron.Name)then +local Grouping=DefenderSquadron.Grouping or self.DefenderDefault.Grouping +Grouping=1 +Spawn:InitGrouping(Grouping) +SpawnGroup=Spawn:SpawnAtAirbase(DefenderSquadron.Airbase,SPAWN.Takeoff.Cold) +local GroupName=SpawnGroup:GetName() +DefenderSquadron.Resources=DefenderSquadron.Resources or{} +DefenderSquadron.Resources[TemplateID]=DefenderSquadron.Resources[TemplateID]or{} +DefenderSquadron.Resources[TemplateID][GroupName]={} +DefenderSquadron.Resources[TemplateID][GroupName]=SpawnGroup +self.uncontrolled=self.uncontrolled or{} +self.uncontrolled[DefenderSquadron.Name]=self.uncontrolled[DefenderSquadron.Name]or{} +table.insert(self.uncontrolled[DefenderSquadron.Name],{group=SpawnGroup,name=GroupName,grouping=Grouping}) +end +end +function AI_A2A_DISPATCHER:OnEventBaseCaptured(EventData) +local AirbaseName=EventData.PlaceName +self:T("Captured "..AirbaseName) +for SquadronName,Squadron in pairs(self.DefenderSquadrons)do +if Squadron.AirbaseName==AirbaseName then +Squadron.ResourceCount=-999 +Squadron.Captured=true +self:T("Squadron "..SquadronName.." captured.") +end +end +end +function AI_A2A_DISPATCHER:OnEventCrashOrDead(EventData) +self.Detection:ForgetDetectedUnit(EventData.IniUnitName) +end +function AI_A2A_DISPATCHER:OnEventLand(EventData) +self:F("Landed") +local DefenderUnit=EventData.IniUnit +local Defender=EventData.IniGroup +local Squadron=self:GetSquadronFromDefender(Defender) +if Squadron then +self:F({SquadronName=Squadron.Name}) +local LandingMethod=self:GetSquadronLanding(Squadron.Name) +if LandingMethod==AI_A2A_DISPATCHER.Landing.AtRunway then +local DefenderSize=Defender:GetSize() +if DefenderSize==1 then +self:RemoveDefenderFromSquadron(Squadron,Defender) +end +DefenderUnit:Destroy() +self:ParkDefender(Squadron) +return +end +if DefenderUnit:GetLife()~=DefenderUnit:GetLife0()then +DefenderUnit:Destroy() +return +end +end +end +function AI_A2A_DISPATCHER:OnEventEngineShutdown(EventData) +local DefenderUnit=EventData.IniUnit +local Defender=EventData.IniGroup +local Squadron=self:GetSquadronFromDefender(Defender) +if Squadron then +self:F({SquadronName=Squadron.Name}) +local LandingMethod=self:GetSquadronLanding(Squadron.Name) +if LandingMethod==AI_A2A_DISPATCHER.Landing.AtEngineShutdown and not DefenderUnit:InAir()then +local DefenderSize=Defender:GetSize() +if DefenderSize==1 then +self:RemoveDefenderFromSquadron(Squadron,Defender) +end +DefenderUnit:Destroy() +self:ParkDefender(Squadron) +end +end +end +function AI_A2A_DISPATCHER:SetEngageRadius(EngageRadius) +self.Detection:SetFriendliesRange(EngageRadius or 100000) +return self +end +function AI_A2A_DISPATCHER:SetDisengageRadius(DisengageRadius) +self.DisengageRadius=DisengageRadius or 300000 +return self +end +function AI_A2A_DISPATCHER:SetGciRadius(GciRadius) +self.GciRadius=GciRadius or 200000 +return self +end +function AI_A2A_DISPATCHER:SetBorderZone(BorderZone) +self.Detection:SetAcceptZones(BorderZone) +return self +end +function AI_A2A_DISPATCHER:SetTacticalDisplay(TacticalDisplay) +self.TacticalDisplay=TacticalDisplay +return self +end +function AI_A2A_DISPATCHER:SetDefaultDamageThreshold(DamageThreshold) +self.DefenderDefault.DamageThreshold=DamageThreshold +return self +end +function AI_A2A_DISPATCHER:SetDefaultCapTimeInterval(CapMinSeconds,CapMaxSeconds) +self.DefenderDefault.CapMinSeconds=CapMinSeconds +self.DefenderDefault.CapMaxSeconds=CapMaxSeconds +return self +end +function AI_A2A_DISPATCHER:SetDefaultCapLimit(CapLimit) +self.DefenderDefault.CapLimit=CapLimit +return self +end +function AI_A2A_DISPATCHER:SetIntercept(InterceptDelay) +self.DefenderDefault.InterceptDelay=InterceptDelay +local Detection=self.Detection +Detection:SetIntercept(true,InterceptDelay) +return self +end +function AI_A2A_DISPATCHER:GetAIFriendliesNearBy(DetectedItem) +local FriendliesNearBy=self.Detection:GetFriendliesDistance(DetectedItem) +return FriendliesNearBy +end +function AI_A2A_DISPATCHER:GetDefenderTasks() +return self.DefenderTasks or{} +end +function AI_A2A_DISPATCHER:GetDefenderTask(Defender) +return self.DefenderTasks[Defender] +end +function AI_A2A_DISPATCHER:GetDefenderTaskFsm(Defender) +return self:GetDefenderTask(Defender).Fsm +end +function AI_A2A_DISPATCHER:GetDefenderTaskTarget(Defender) +return self:GetDefenderTask(Defender).Target +end +function AI_A2A_DISPATCHER:GetDefenderTaskSquadronName(Defender) +return self:GetDefenderTask(Defender).SquadronName +end +function AI_A2A_DISPATCHER:ClearDefenderTask(Defender) +if Defender and Defender:IsAlive()and self.DefenderTasks[Defender]then +local Target=self.DefenderTasks[Defender].Target +local Message="Clearing ("..self.DefenderTasks[Defender].Type..") " +Message=Message..Defender:GetName() +if Target then +Message=Message..(Target and(" from "..Target.Index.." ["..Target.Set:Count().."]"))or"" +end +self:F({Target=Message}) +end +self.DefenderTasks[Defender]=nil +return self +end +function AI_A2A_DISPATCHER:ClearDefenderTaskTarget(Defender) +local DefenderTask=self:GetDefenderTask(Defender) +if Defender and Defender:IsAlive()and DefenderTask then +local Target=DefenderTask.Target +local Message="Clearing ("..DefenderTask.Type..") " +Message=Message..Defender:GetName() +if Target then +Message=Message..((Target and(" from "..Target.Index.." ["..Target.Set:Count().."]"))or"") +end +self:F({Target=Message}) +end +if Defender and DefenderTask and DefenderTask.Target then +DefenderTask.Target=nil +end +return self +end +function AI_A2A_DISPATCHER:SetDefenderTask(SquadronName,Defender,Type,Fsm,Target) +self:F({SquadronName=SquadronName,Defender=Defender:GetName(),Type=Type,Target=Target}) +self.DefenderTasks[Defender]=self.DefenderTasks[Defender]or{} +self.DefenderTasks[Defender].Type=Type +self.DefenderTasks[Defender].Fsm=Fsm +self.DefenderTasks[Defender].SquadronName=SquadronName +if Target then +self:SetDefenderTaskTarget(Defender,Target) +end +return self +end +function AI_A2A_DISPATCHER:SetDefenderTaskTarget(Defender,AttackerDetection) +local Message="("..self.DefenderTasks[Defender].Type..") " +Message=Message..Defender:GetName() +Message=Message..((AttackerDetection and(" target "..AttackerDetection.Index.." ["..AttackerDetection.Set:Count().."]"))or"") +self:F({AttackerDetection=Message}) +if AttackerDetection then +self.DefenderTasks[Defender].Target=AttackerDetection +end +return self +end +function AI_A2A_DISPATCHER:SetSquadron(SquadronName,AirbaseName,TemplatePrefixes,ResourceCount) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +DefenderSquadron.Name=SquadronName +DefenderSquadron.Airbase=AIRBASE:FindByName(AirbaseName) +DefenderSquadron.AirbaseName=DefenderSquadron.Airbase:GetName() +if not DefenderSquadron.Airbase then +error("Cannot find airbase with name:"..AirbaseName) +end +DefenderSquadron.Spawn={} +if type(TemplatePrefixes)=="string"then +local SpawnTemplate=TemplatePrefixes +self.DefenderSpawns[SpawnTemplate]=self.DefenderSpawns[SpawnTemplate]or SPAWN:New(SpawnTemplate) +DefenderSquadron.Spawn[1]=self.DefenderSpawns[SpawnTemplate] +else +for TemplateID,SpawnTemplate in pairs(TemplatePrefixes)do +self.DefenderSpawns[SpawnTemplate]=self.DefenderSpawns[SpawnTemplate]or SPAWN:New(SpawnTemplate) +DefenderSquadron.Spawn[#DefenderSquadron.Spawn+1]=self.DefenderSpawns[SpawnTemplate] +end +end +DefenderSquadron.ResourceCount=ResourceCount +DefenderSquadron.TemplatePrefixes=TemplatePrefixes +DefenderSquadron.Captured=false +self:SetSquadronLanguage(SquadronName,"EN") +self:F({Squadron={SquadronName,AirbaseName,TemplatePrefixes,ResourceCount}}) +return self +end +function AI_A2A_DISPATCHER:GetSquadron(SquadronName) +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +if not DefenderSquadron then +error("Unknown Squadron:"..SquadronName) +end +return DefenderSquadron +end +function AI_A2A_DISPATCHER:QuerySquadron(Squadron) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +self:T2(string.format("%s = %s",Squadron.Name,Squadron.ResourceCount)) +return Squadron.ResourceCount +end +self:F({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +return nil +end +function AI_A2A_DISPATCHER:SetSquadronVisible(SquadronName) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Uncontrolled=true +DefenderSquadron.Grouping=1 +local nfreeparking=DefenderSquadron.Airbase:GetFreeParkingSpotsNumber(AIRBASE.TerminalType.FighterAircraft,true) +DefenderSquadron.ResourceCount=DefenderSquadron.ResourceCount or nfreeparking +DefenderSquadron.ResourceCount=math.min(DefenderSquadron.ResourceCount,nfreeparking) +for SpawnTemplate,_DefenderSpawn in pairs(self.DefenderSpawns)do +local DefenderSpawn=_DefenderSpawn +DefenderSpawn:InitUnControlled(true) +end +end +function AI_A2A_DISPATCHER:IsSquadronVisible(SquadronName) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron then +return DefenderSquadron.Uncontrolled==true +end +return nil +end +function AI_A2A_DISPATCHER:SetSquadronCap2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Cap=self.DefenderSquadrons[SquadronName].Cap or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +local Cap=self.DefenderSquadrons[SquadronName].Cap +Cap.Name=SquadronName +Cap.EngageMinSpeed=EngageMinSpeed +Cap.EngageMaxSpeed=EngageMaxSpeed +Cap.EngageFloorAltitude=EngageFloorAltitude +Cap.EngageCeilingAltitude=EngageCeilingAltitude +Cap.Zone=Zone +Cap.PatrolMinSpeed=PatrolMinSpeed +Cap.PatrolMaxSpeed=PatrolMaxSpeed +Cap.PatrolFloorAltitude=PatrolFloorAltitude +Cap.PatrolCeilingAltitude=PatrolCeilingAltitude +Cap.PatrolAltType=PatrolAltType +Cap.EngageAltType=EngageAltType +self:SetSquadronCapInterval(SquadronName,self.DefenderDefault.CapLimit,self.DefenderDefault.CapMinSeconds,self.DefenderDefault.CapMaxSeconds,1) +self:T({CAP={SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageAltType}}) +local RecceSet=self.Detection:GetDetectionSet() +RecceSet:FilterPrefixes(DefenderSquadron.TemplatePrefixes) +RecceSet:FilterStart() +self.Detection:SetFriendlyPrefixes(DefenderSquadron.TemplatePrefixes) +return self +end +function AI_A2A_DISPATCHER:SetSquadronCap(SquadronName,Zone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageMinSpeed,EngageMaxSpeed,AltType) +return self:SetSquadronCap2(SquadronName,EngageMinSpeed,EngageMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,AltType,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,AltType) +end +function AI_A2A_DISPATCHER:SetSquadronCapInterval(SquadronName,CapLimit,LowInterval,HighInterval,Probability) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Cap=self.DefenderSquadrons[SquadronName].Cap or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +local Cap=self.DefenderSquadrons[SquadronName].Cap +if Cap then +Cap.LowInterval=LowInterval or 180 +Cap.HighInterval=HighInterval or 600 +Cap.Probability=Probability or 1 +Cap.CapLimit=CapLimit or 1 +Cap.Scheduler=Cap.Scheduler or SCHEDULER:New(self) +local Scheduler=Cap.Scheduler +local ScheduleID=Cap.ScheduleID +local Variance=(Cap.HighInterval-Cap.LowInterval)/2 +local Repeat=Cap.LowInterval+Variance +local Randomization=Variance/Repeat +local Start=math.random(1,Cap.HighInterval) +if ScheduleID then +Scheduler:Stop(ScheduleID) +end +Cap.ScheduleID=Scheduler:Schedule(self,self.SchedulerCAP,{SquadronName},Start,Repeat,Randomization) +else +error("This squadron does not exist:"..SquadronName) +end +end +function AI_A2A_DISPATCHER:GetCAPDelay(SquadronName) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Cap=self.DefenderSquadrons[SquadronName].Cap or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +local Cap=self.DefenderSquadrons[SquadronName].Cap +if Cap then +return math.random(Cap.LowInterval,Cap.HighInterval) +else +error("This squadron does not exist:"..SquadronName) +end +end +function AI_A2A_DISPATCHER:CanCAP(SquadronName) +self:F({SquadronName=SquadronName}) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Cap=self.DefenderSquadrons[SquadronName].Cap or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron.Captured==false then +if(not DefenderSquadron.ResourceCount)or(DefenderSquadron.ResourceCount and DefenderSquadron.ResourceCount>0)then +local Cap=DefenderSquadron.Cap +if Cap then +local CapCount=self:CountCapAirborne(SquadronName) +self:F({CapCount=CapCount}) +if CapCount<Cap.CapLimit then +local Probability=math.random() +if Probability<=Cap.Probability then +return DefenderSquadron +end +end +end +end +end +return nil +end +function AI_A2A_DISPATCHER:SetDefaultCapRacetrack(LeglengthMin,LeglengthMax,HeadingMin,HeadingMax,DurationMin,DurationMax,CapCoordinates) +self.DefenderDefault.Racetrack=true +self.DefenderDefault.RacetrackLengthMin=LeglengthMin +self.DefenderDefault.RacetrackLengthMax=LeglengthMax +self.DefenderDefault.RacetrackHeadingMin=HeadingMin +self.DefenderDefault.RacetrackHeadingMax=HeadingMax +self.DefenderDefault.RacetrackDurationMin=DurationMin +self.DefenderDefault.RacetrackDurationMax=DurationMax +self.DefenderDefault.RacetrackCoordinates=CapCoordinates +return self +end +function AI_A2A_DISPATCHER:SetSquadronCapRacetrack(SquadronName,LeglengthMin,LeglengthMax,HeadingMin,HeadingMax,DurationMin,DurationMax,CapCoordinates) +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron then +DefenderSquadron.Racetrack=true +DefenderSquadron.RacetrackLengthMin=LeglengthMin +DefenderSquadron.RacetrackLengthMax=LeglengthMax +DefenderSquadron.RacetrackHeadingMin=HeadingMin +DefenderSquadron.RacetrackHeadingMax=HeadingMax +DefenderSquadron.RacetrackDurationMin=DurationMin +DefenderSquadron.RacetrackDurationMax=DurationMax +DefenderSquadron.RacetrackCoordinates=CapCoordinates +end +return self +end +function AI_A2A_DISPATCHER:CanGCI(SquadronName) +self:F({SquadronName=SquadronName}) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Gci=self.DefenderSquadrons[SquadronName].Gci or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron.Captured==false then +if(not DefenderSquadron.ResourceCount)or(DefenderSquadron.ResourceCount and DefenderSquadron.ResourceCount>0)then +local Gci=DefenderSquadron.Gci +if Gci then +return DefenderSquadron +end +end +end +return nil +end +function AI_A2A_DISPATCHER:SetSquadronGci2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Gci=self.DefenderSquadrons[SquadronName].Gci or{} +local Intercept=self.DefenderSquadrons[SquadronName].Gci +Intercept.Name=SquadronName +Intercept.EngageMinSpeed=EngageMinSpeed +Intercept.EngageMaxSpeed=EngageMaxSpeed +Intercept.EngageFloorAltitude=EngageFloorAltitude +Intercept.EngageCeilingAltitude=EngageCeilingAltitude +Intercept.EngageAltType=EngageAltType +self:T({GCI={SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +end +function AI_A2A_DISPATCHER:SetSquadronGci(SquadronName,EngageMinSpeed,EngageMaxSpeed) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Gci=self.DefenderSquadrons[SquadronName].Gci or{} +local Intercept=self.DefenderSquadrons[SquadronName].Gci +Intercept.Name=SquadronName +Intercept.EngageMinSpeed=EngageMinSpeed +Intercept.EngageMaxSpeed=EngageMaxSpeed +self:F({GCI={SquadronName,EngageMinSpeed,EngageMaxSpeed}}) +end +function AI_A2A_DISPATCHER:SetDefaultOverhead(Overhead) +self.DefenderDefault.Overhead=Overhead +return self +end +function AI_A2A_DISPATCHER:SetSquadronOverhead(SquadronName,Overhead) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Overhead=Overhead +return self +end +function AI_A2A_DISPATCHER:SetDefaultGrouping(Grouping) +self.DefenderDefault.Grouping=Grouping +return self +end +function AI_A2A_DISPATCHER:SetSquadronGrouping(SquadronName,Grouping) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Grouping=Grouping +return self +end +function AI_A2A_DISPATCHER:SetDefaultTakeoff(Takeoff) +self.DefenderDefault.Takeoff=Takeoff +return self +end +function AI_A2A_DISPATCHER:SetSquadronTakeoff(SquadronName,Takeoff) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Takeoff=Takeoff +return self +end +function AI_A2A_DISPATCHER:GetDefaultTakeoff() +return self.DefenderDefault.Takeoff +end +function AI_A2A_DISPATCHER:GetSquadronTakeoff(SquadronName) +local DefenderSquadron=self:GetSquadron(SquadronName) +return DefenderSquadron.Takeoff or self.DefenderDefault.Takeoff +end +function AI_A2A_DISPATCHER:SetDefaultTakeoffInAir() +self:SetDefaultTakeoff(AI_A2A_DISPATCHER.Takeoff.Air) +return self +end +function AI_A2A_DISPATCHER:SetSendMessages(onoff) +self.SetSendPlayerMessages=onoff +end +function AI_A2A_DISPATCHER:SetSquadronTakeoffInAir(SquadronName,TakeoffAltitude) +self:SetSquadronTakeoff(SquadronName,AI_A2A_DISPATCHER.Takeoff.Air) +if TakeoffAltitude then +self:SetSquadronTakeoffInAirAltitude(SquadronName,TakeoffAltitude) +end +return self +end +function AI_A2A_DISPATCHER:SetDefaultTakeoffFromRunway() +self:SetDefaultTakeoff(AI_A2A_DISPATCHER.Takeoff.Runway) +return self +end +function AI_A2A_DISPATCHER:SetSquadronTakeoffFromRunway(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2A_DISPATCHER.Takeoff.Runway) +return self +end +function AI_A2A_DISPATCHER:SetDefaultTakeoffFromParkingHot() +self:SetDefaultTakeoff(AI_A2A_DISPATCHER.Takeoff.Hot) +return self +end +function AI_A2A_DISPATCHER:SetSquadronTakeoffFromParkingHot(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2A_DISPATCHER.Takeoff.Hot) +return self +end +function AI_A2A_DISPATCHER:SetDefaultTakeoffFromParkingCold() +self:SetDefaultTakeoff(AI_A2A_DISPATCHER.Takeoff.Cold) +return self +end +function AI_A2A_DISPATCHER:SetSquadronTakeoffFromParkingCold(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2A_DISPATCHER.Takeoff.Cold) +return self +end +function AI_A2A_DISPATCHER:SetDefaultTakeoffInAirAltitude(TakeoffAltitude) +self.DefenderDefault.TakeoffAltitude=TakeoffAltitude +return self +end +function AI_A2A_DISPATCHER:SetSquadronTakeoffInAirAltitude(SquadronName,TakeoffAltitude) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.TakeoffAltitude=TakeoffAltitude +return self +end +function AI_A2A_DISPATCHER:SetDefaultLanding(Landing) +self.DefenderDefault.Landing=Landing +return self +end +function AI_A2A_DISPATCHER:SetSquadronLanding(SquadronName,Landing) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Landing=Landing +return self +end +function AI_A2A_DISPATCHER:GetDefaultLanding() +return self.DefenderDefault.Landing +end +function AI_A2A_DISPATCHER:GetSquadronLanding(SquadronName) +local DefenderSquadron=self:GetSquadron(SquadronName) +return DefenderSquadron.Landing or self.DefenderDefault.Landing +end +function AI_A2A_DISPATCHER:SetDefaultLandingNearAirbase() +self:SetDefaultLanding(AI_A2A_DISPATCHER.Landing.NearAirbase) +return self +end +function AI_A2A_DISPATCHER:SetSquadronLandingNearAirbase(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2A_DISPATCHER.Landing.NearAirbase) +return self +end +function AI_A2A_DISPATCHER:SetDefaultLandingAtRunway() +self:SetDefaultLanding(AI_A2A_DISPATCHER.Landing.AtRunway) +return self +end +function AI_A2A_DISPATCHER:SetSquadronLandingAtRunway(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2A_DISPATCHER.Landing.AtRunway) +return self +end +function AI_A2A_DISPATCHER:SetDefaultLandingAtEngineShutdown() +self:SetDefaultLanding(AI_A2A_DISPATCHER.Landing.AtEngineShutdown) +return self +end +function AI_A2A_DISPATCHER:SetSquadronLandingAtEngineShutdown(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2A_DISPATCHER.Landing.AtEngineShutdown) +return self +end +function AI_A2A_DISPATCHER:SetDefaultFuelThreshold(FuelThreshold) +self.DefenderDefault.FuelThreshold=FuelThreshold +return self +end +function AI_A2A_DISPATCHER:SetSquadronFuelThreshold(SquadronName,FuelThreshold) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.FuelThreshold=FuelThreshold +return self +end +function AI_A2A_DISPATCHER:SetDefaultTanker(TankerName) +self.DefenderDefault.TankerName=TankerName +return self +end +function AI_A2A_DISPATCHER:SetSquadronTanker(SquadronName,TankerName) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.TankerName=TankerName +return self +end +function AI_A2A_DISPATCHER:SetSquadronLanguage(SquadronName,Language) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Language=Language +if DefenderSquadron.RadioQueue then +DefenderSquadron.RadioQueue:SetLanguage(Language) +end +return self +end +function AI_A2A_DISPATCHER:SetSquadronRadioFrequency(SquadronName,RadioFrequency,RadioModulation,RadioPower) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.RadioFrequency=RadioFrequency +DefenderSquadron.RadioModulation=RadioModulation or radio.modulation.AM +DefenderSquadron.RadioPower=RadioPower or 100 +if DefenderSquadron.RadioQueue then +DefenderSquadron.RadioQueue:Stop() +end +DefenderSquadron.RadioQueue=nil +DefenderSquadron.RadioQueue=RADIOSPEECH:New(DefenderSquadron.RadioFrequency,DefenderSquadron.RadioModulation) +DefenderSquadron.RadioQueue.power=DefenderSquadron.RadioPower +DefenderSquadron.RadioQueue:Start(0.5) +DefenderSquadron.RadioQueue:SetLanguage(DefenderSquadron.Language) +end +function AI_A2A_DISPATCHER:AddDefenderToSquadron(Squadron,Defender,Size) +self.Defenders=self.Defenders or{} +local DefenderName=Defender:GetName() +self.Defenders[DefenderName]=Squadron +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount-Size +end +self:F({DefenderName=DefenderName,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2A_DISPATCHER:RemoveDefenderFromSquadron(Squadron,Defender) +self.Defenders=self.Defenders or{} +local DefenderName=Defender:GetName() +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount+Defender:GetSize() +end +self.Defenders[DefenderName]=nil +self:F({DefenderName=DefenderName,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2A_DISPATCHER:GetSquadronFromDefender(Defender) +self.Defenders=self.Defenders or{} +if Defender~=nil then +local DefenderName=Defender:GetName() +self:F({DefenderName=DefenderName}) +return self.Defenders[DefenderName] +else +return nil +end +end +function AI_A2A_DISPATCHER:EvaluateSWEEP(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +if DetectedItem.IsDetected==false then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function AI_A2A_DISPATCHER:CountCapAirborne(SquadronName) +local CapCount=0 +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +if DefenderSquadron then +for AIGroup,DefenderTask in pairs(self:GetDefenderTasks())do +if DefenderTask.SquadronName==SquadronName then +if DefenderTask.Type=="CAP"then +if AIGroup and AIGroup:IsAlive()then +if DefenderTask.Fsm:Is("Patrolling")or DefenderTask.Fsm:Is("Engaging")or DefenderTask.Fsm:Is("Refuelling")or DefenderTask.Fsm:Is("Started")then +CapCount=CapCount+1 +end +end +end +end +end +end +return CapCount +end +function AI_A2A_DISPATCHER:CountDefendersEngaged(AttackerDetection) +local DefenderCount=0 +local DetectedSet=AttackerDetection.Set +local DefenderTasks=self:GetDefenderTasks() +for DefenderGroup,DefenderTask in pairs(DefenderTasks)do +local Defender=DefenderGroup +local DefenderTaskTarget=DefenderTask.Target +local DefenderSquadronName=DefenderTask.SquadronName +if DefenderTaskTarget and DefenderTaskTarget.Index==AttackerDetection.Index then +local Squadron=self:GetSquadron(DefenderSquadronName) +local SquadronOverhead=Squadron.Overhead or self.DefenderDefault.Overhead +local DefenderSize=Defender:GetInitialSize() +if DefenderSize then +DefenderCount=DefenderCount+DefenderSize/SquadronOverhead +self:F("Defender Group Name: "..Defender:GetName()..", Size: "..DefenderSize) +else +DefenderCount=0 +end +end +end +self:F({DefenderCount=DefenderCount}) +return DefenderCount +end +function AI_A2A_DISPATCHER:CountDefendersToBeEngaged(AttackerDetection,DefenderCount) +local Friendlies=nil +local AttackerSet=AttackerDetection.Set +local AttackerCount=AttackerSet:Count() +local DefenderFriendlies=self:GetAIFriendliesNearBy(AttackerDetection) +for FriendlyDistance,AIFriendly in UTILS.spairs(DefenderFriendlies or{})do +if AttackerCount>DefenderCount then +if AIFriendly then +local classname=AIFriendly.ClassName or"No Class Name" +local unitname=AIFriendly.IdentifiableName or"No Unit Name" +end +local Friendly=nil +if AIFriendly and AIFriendly:IsAlive()then +Friendly=AIFriendly:GetGroup() +end +if Friendly and Friendly:IsAlive()then +local DefenderTask=self:GetDefenderTask(Friendly) +if DefenderTask then +if DefenderTask.Type=="CAP"or DefenderTask.Type=="GCI"then +if DefenderTask.Target==nil then +if DefenderTask.Fsm:Is("Returning")or DefenderTask.Fsm:Is("Patrolling")then +Friendlies=Friendlies or{} +Friendlies[Friendly]=Friendly +DefenderCount=DefenderCount+Friendly:GetSize() +self:F({Friendly=Friendly:GetName(),FriendlyDistance=FriendlyDistance}) +end +end +end +end +end +else +break +end +end +return Friendlies +end +function AI_A2A_DISPATCHER:ResourceActivate(DefenderSquadron,DefendersNeeded) +local SquadronName=DefenderSquadron.Name +DefendersNeeded=DefendersNeeded or 4 +local DefenderGrouping=DefenderSquadron.Grouping or self.DefenderDefault.Grouping +DefenderGrouping=(DefenderGrouping<DefendersNeeded)and DefenderGrouping or DefendersNeeded +if self:IsSquadronVisible(SquadronName)then +local n=#self.uncontrolled[SquadronName] +if n>0 then +local id=math.random(n) +local Defender=self.uncontrolled[SquadronName][id].group +Defender:StartUncontrolled() +DefenderGrouping=self.uncontrolled[SquadronName][id].grouping +self:AddDefenderToSquadron(DefenderSquadron,Defender,DefenderGrouping) +table.remove(self.uncontrolled[SquadronName],id) +return Defender,DefenderGrouping +else +return nil,0 +end +local TemplateID=math.random(1,#DefenderSquadron.Spawn) +else +local Spawn=DefenderSquadron.Spawn[math.random(1,#DefenderSquadron.Spawn)] +if DefenderGrouping then +Spawn:InitGrouping(DefenderGrouping) +else +Spawn:InitGrouping() +end +local TakeoffMethod=self:GetSquadronTakeoff(SquadronName) +local Defender=Spawn:SpawnAtAirbase(DefenderSquadron.Airbase,TakeoffMethod,DefenderSquadron.TakeoffAltitude or self.DefenderDefault.TakeoffAltitude) +self:AddDefenderToSquadron(DefenderSquadron,Defender,DefenderGrouping) +return Defender,DefenderGrouping +end +return nil,nil +end +function AI_A2A_DISPATCHER:onafterCAP(From,Event,To,SquadronName) +self:F({SquadronName=SquadronName}) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Cap=self.DefenderSquadrons[SquadronName].Cap or{} +local DefenderSquadron=self:CanCAP(SquadronName) +if DefenderSquadron then +local Cap=DefenderSquadron.Cap +if Cap then +local DefenderCAP,DefenderGrouping=self:ResourceActivate(DefenderSquadron) +if DefenderCAP then +local AI_A2A_Fsm=AI_A2A_CAP:New2(DefenderCAP,Cap.EngageMinSpeed,Cap.EngageMaxSpeed,Cap.EngageFloorAltitude,Cap.EngageCeilingAltitude,Cap.EngageAltType,Cap.Zone,Cap.PatrolMinSpeed,Cap.PatrolMaxSpeed,Cap.PatrolFloorAltitude,Cap.PatrolCeilingAltitude,Cap.PatrolAltType) +AI_A2A_Fsm:SetDispatcher(self) +AI_A2A_Fsm:SetHomeAirbase(DefenderSquadron.Airbase) +AI_A2A_Fsm:SetFuelThreshold(DefenderSquadron.FuelThreshold or self.DefenderDefault.FuelThreshold,60) +AI_A2A_Fsm:SetDamageThreshold(self.DefenderDefault.DamageThreshold) +AI_A2A_Fsm:SetDisengageRadius(self.DisengageRadius) +AI_A2A_Fsm:SetTanker(DefenderSquadron.TankerName or self.DefenderDefault.TankerName) +if DefenderSquadron.Racetrack or self.DefenderDefault.Racetrack then +AI_A2A_Fsm:SetRaceTrackPattern(DefenderSquadron.RacetrackLengthMin or self.DefenderDefault.RacetrackLengthMin, +DefenderSquadron.RacetrackLengthMax or self.DefenderDefault.RacetrackLengthMax, +DefenderSquadron.RacetrackHeadingMin or self.DefenderDefault.RacetrackHeadingMin, +DefenderSquadron.RacetrackHeadingMax or self.DefenderDefault.RacetrackHeadingMax, +DefenderSquadron.RacetrackDurationMin or self.DefenderDefault.RacetrackDurationMin, +DefenderSquadron.RacetrackDurationMax or self.DefenderDefault.RacetrackDurationMax, +DefenderSquadron.RacetrackCoordinates or self.DefenderDefault.RacetrackCoordinates) +end +AI_A2A_Fsm:Start() +self:SetDefenderTask(SquadronName,DefenderCAP,"CAP",AI_A2A_Fsm) +function AI_A2A_Fsm:onafterTakeoff(DefenderGroup,From,Event,To) +if DefenderGroup and DefenderGroup:IsAlive()then +self:F({"CAP Takeoff",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2A_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron then +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." Wheels up.",DefenderGroup) +end +AI_A2A_Fsm:__Patrol(2) +end +end +end +function AI_A2A_Fsm:onafterPatrolRoute(DefenderGroup,From,Event,To) +if DefenderGroup and DefenderGroup:IsAlive()then +self:F({"CAP PatrolRoute",DefenderGroup:GetName()}) +self:GetParent(self).onafterPatrolRoute(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", patrolling.",DefenderGroup) +end +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +end +function AI_A2A_Fsm:onafterRTB(DefenderGroup,From,Event,To) +if DefenderGroup and DefenderGroup:IsAlive()then +self:F({"CAP RTB",DefenderGroup:GetName()}) +self:GetParent(self).onafterRTB(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." returning to base.",DefenderGroup) +end +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +end +function AI_A2A_Fsm:onafterHome(Defender,From,Event,To,Action) +if Defender and Defender:IsAlive()then +self:F({"CAP Home",Defender:GetName()}) +self:GetParent(self).onafterHome(self,Defender,From,Event,To) +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(Defender) +if Action and Action=="Destroy"then +Dispatcher:RemoveDefenderFromSquadron(Squadron,Defender) +Defender:Destroy() +end +if Dispatcher:GetSquadronLanding(Squadron.Name)==AI_A2A_DISPATCHER.Landing.NearAirbase then +Dispatcher:RemoveDefenderFromSquadron(Squadron,Defender) +Defender:Destroy() +Dispatcher:ParkDefender(Squadron) +end +end +end +end +end +end +end +function AI_A2A_DISPATCHER:onafterENGAGE(From,Event,To,AttackerDetection,Defenders) +self:F("ENGAGING Detection ID="..tostring(AttackerDetection.ID)) +if Defenders then +for DefenderID,Defender in pairs(Defenders)do +local Fsm=self:GetDefenderTaskFsm(Defender) +Fsm:EngageRoute(AttackerDetection.Set) +self:SetDefenderTaskTarget(Defender,AttackerDetection) +end +end +end +function AI_A2A_DISPATCHER:onafterGCI(From,Event,To,AttackerDetection,DefendersMissing,DefenderFriendlies) +self:F("GCI Detection ID="..tostring(AttackerDetection.ID)) +self:F({From,Event,To,AttackerDetection.Index,DefendersMissing,DefenderFriendlies}) +local AttackerSet=AttackerDetection.Set +local AttackerUnit=AttackerSet:GetFirst() +if AttackerUnit and AttackerUnit:IsAlive()then +local AttackerCount=AttackerSet:Count() +local DefenderCount=0 +for DefenderID,DefenderGroup in pairs(DefenderFriendlies or{})do +local Fsm=self:GetDefenderTaskFsm(DefenderGroup) +Fsm:__EngageRoute(0.1,AttackerSet) +self:SetDefenderTaskTarget(DefenderGroup,AttackerDetection) +DefenderCount=DefenderCount+DefenderGroup:GetSize() +end +self:F({DefenderCount=DefenderCount,DefendersMissing=DefendersMissing}) +DefenderCount=DefendersMissing +local ClosestDistance=0 +local ClosestDefenderSquadronName=nil +local BreakLoop=false +while(DefenderCount>0 and not BreakLoop)do +self:F({DefenderSquadrons=self.DefenderSquadrons}) +for SquadronName,DefenderSquadron in pairs(self.DefenderSquadrons or{})do +self:F({GCI=DefenderSquadron.Gci}) +for InterceptID,Intercept in pairs(DefenderSquadron.Gci or{})do +self:F({DefenderSquadron}) +local SpawnCoord=DefenderSquadron.Airbase:GetCoordinate() +local AttackerCoord=AttackerUnit:GetCoordinate() +local InterceptCoord=AttackerDetection.InterceptCoord +self:F({InterceptCoord=InterceptCoord}) +if InterceptCoord then +local InterceptDistance=SpawnCoord:Get2DDistance(InterceptCoord) +local AirbaseDistance=SpawnCoord:Get2DDistance(AttackerCoord) +self:F({InterceptDistance=InterceptDistance,AirbaseDistance=AirbaseDistance,InterceptCoord=InterceptCoord}) +if ClosestDistance==0 or InterceptDistance<ClosestDistance then +if AirbaseDistance<=self.GciRadius then +ClosestDistance=InterceptDistance +ClosestDefenderSquadronName=SquadronName +end +end +end +end +end +if ClosestDefenderSquadronName then +local DefenderSquadron=self:CanGCI(ClosestDefenderSquadronName) +if DefenderSquadron then +local Gci=self.DefenderSquadrons[ClosestDefenderSquadronName].Gci +if Gci then +local DefenderOverhead=DefenderSquadron.Overhead or self.DefenderDefault.Overhead +local DefenderGrouping=DefenderSquadron.Grouping or self.DefenderDefault.Grouping +local DefendersNeeded=math.ceil(DefenderCount*DefenderOverhead) +self:F({Overhead=DefenderOverhead,SquadronOverhead=DefenderSquadron.Overhead,DefaultOverhead=self.DefenderDefault.Overhead}) +self:F({Grouping=DefenderGrouping,SquadronGrouping=DefenderSquadron.Grouping,DefaultGrouping=self.DefenderDefault.Grouping}) +self:F({DefendersCount=DefenderCount,DefendersNeeded=DefendersNeeded}) +if DefenderSquadron.ResourceCount and DefendersNeeded>DefenderSquadron.ResourceCount then +DefendersNeeded=DefenderSquadron.ResourceCount +BreakLoop=true +end +while(DefendersNeeded>0)do +local DefenderGCI,DefenderGrouping=self:ResourceActivate(DefenderSquadron,DefendersNeeded) +DefendersNeeded=DefendersNeeded-DefenderGrouping +if DefenderGCI then +DefenderCount=DefenderCount-DefenderGrouping/DefenderOverhead +local Fsm=AI_A2A_GCI:New2(DefenderGCI,Gci.EngageMinSpeed,Gci.EngageMaxSpeed,Gci.EngageFloorAltitude,Gci.EngageCeilingAltitude,Gci.EngageAltType) +Fsm:SetDispatcher(self) +Fsm:SetHomeAirbase(DefenderSquadron.Airbase) +Fsm:SetFuelThreshold(DefenderSquadron.FuelThreshold or self.DefenderDefault.FuelThreshold,60) +Fsm:SetDamageThreshold(self.DefenderDefault.DamageThreshold) +Fsm:SetDisengageRadius(self.DisengageRadius) +Fsm:Start() +self:SetDefenderTask(ClosestDefenderSquadronName,DefenderGCI,"GCI",Fsm,AttackerDetection) +function Fsm:onafterTakeoff(DefenderGroup,From,Event,To) +self:F({"GCI Birth",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +local DefenderTarget=Dispatcher:GetDefenderTaskTarget(DefenderGroup) +if DefenderTarget then +if Squadron.Language=="EN"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." wheels up.",DefenderGroup) +elseif Squadron.Language=="RU"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." колёса вверх.",DefenderGroup) +end +Fsm:EngageRoute(DefenderTarget.Set) +end +end +function Fsm:onafterEngageRoute(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"GCI Route",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and AttackSetUnit:Count()>0 then +local FirstUnit=AttackSetUnit:GetFirst() +local Coordinate=FirstUnit:GetCoordinate() +if Squadron.Language=="EN"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", intercepting bogeys at "..Coordinate:ToStringA2A(DefenderGroup,nil,Squadron.Language),DefenderGroup) +elseif Squadron.Language=="RU"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", перехватывая боги в "..Coordinate:ToStringA2A(DefenderGroup,nil,Squadron.Language),DefenderGroup) +elseif Squadron.Language=="DE"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", Eindringlinge abfangen bei"..Coordinate:ToStringA2A(DefenderGroup,nil,Squadron.Language),DefenderGroup) +end +end +self:GetParent(Fsm).onafterEngageRoute(self,DefenderGroup,From,Event,To,AttackSetUnit) +end +function Fsm:onafterEngage(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"GCI Engage",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and AttackSetUnit:Count()>0 then +local FirstUnit=AttackSetUnit:GetFirst() +local Coordinate=FirstUnit:GetCoordinate() +if Squadron.Language=="EN"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", engaging bogeys at "..Coordinate:ToStringA2A(DefenderGroup,nil,Squadron.Language),DefenderGroup) +elseif Squadron.Language=="RU"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", задействуя боги в "..Coordinate:ToStringA2A(DefenderGroup,nil,Squadron.Language),DefenderGroup) +end +end +self:GetParent(Fsm).onafterEngage(self,DefenderGroup,From,Event,To,AttackSetUnit) +end +function Fsm:onafterRTB(DefenderGroup,From,Event,To) +self:F({"GCI RTB",DefenderGroup:GetName()}) +self:GetParent(self).onafterRTB(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron then +if Squadron.Language=="EN"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." returning to base.",DefenderGroup) +elseif Squadron.Language=="RU"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", возвращение на базу.",DefenderGroup) +end +end +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +function Fsm:onafterLostControl(Defender,From,Event,To) +self:F({"GCI LostControl",Defender:GetName()}) +self:GetParent(self).onafterHome(self,Defender,From,Event,To) +local Dispatcher=Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(Defender) +if Defender:IsAboveRunway()then +Dispatcher:RemoveDefenderFromSquadron(Squadron,Defender) +Defender:Destroy() +end +end +function Fsm:onafterHome(DefenderGroup,From,Event,To,Action) +self:F({"GCI Home",DefenderGroup:GetName()}) +self:GetParent(self).onafterHome(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron.Language=="EN"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName.." landing at base.",DefenderGroup) +elseif Squadron.Language=="RU"and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", посадка на базу.",DefenderGroup) +end +if Action and Action=="Destroy"then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +end +if Dispatcher:GetSquadronLanding(Squadron.Name)==AI_A2A_DISPATCHER.Landing.NearAirbase then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +Dispatcher:ParkDefender(Squadron) +end +end +end +end +end +else +BreakLoop=true +break +end +else +break +end +end +end +end +function AI_A2A_DISPATCHER:EvaluateENGAGE(DetectedItem) +self:F({DetectedItem.ItemID}) +local DefenderCount=self:CountDefendersEngaged(DetectedItem) +local DefenderGroups=self:CountDefendersToBeEngaged(DetectedItem,DefenderCount) +self:F({DefenderCount=DefenderCount}) +if DefenderGroups and DetectedItem.IsDetected==true then +return DefenderGroups +end +return nil +end +function AI_A2A_DISPATCHER:EvaluateGCI(DetectedItem) +self:F({DetectedItem.ItemID}) +local AttackerSet=DetectedItem.Set +local AttackerCount=AttackerSet:Count() +local DefenderCount=self:CountDefendersEngaged(DetectedItem) +local DefendersMissing=AttackerCount-DefenderCount +self:F({AttackerCount=AttackerCount,DefenderCount=DefenderCount,DefendersMissing=DefendersMissing}) +local Friendlies=self:CountDefendersToBeEngaged(DetectedItem,DefenderCount) +if DetectedItem.IsDetected==true then +return DefendersMissing,Friendlies +end +return nil,nil +end +function AI_A2A_DISPATCHER:Order(DetectedItem) +local detection=self.Detection +local ShortestDistance=999999999 +local AttackCoordinate=detection:GetDetectedItemCoordinate(DetectedItem) +if AttackCoordinate then +for DefenderSquadronName,DefenderSquadron in pairs(self.DefenderSquadrons)do +self:T({DefenderSquadron=DefenderSquadron.Name}) +local Airbase=DefenderSquadron.Airbase +local AirbaseCoordinate=Airbase:GetCoordinate() +local EvaluateDistance=AttackCoordinate:Get2DDistance(AirbaseCoordinate) +if EvaluateDistance<=ShortestDistance then +ShortestDistance=EvaluateDistance +end +end +end +return ShortestDistance +end +function AI_A2A_DISPATCHER:ShowTacticalDisplay(Detection) +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local TaskReport=REPORT:New() +local Report=REPORT:New("Tactical Overview:") +local DefenderGroupCount=0 +for DetectedItemID,DetectedItem in UTILS.spairs(Detection:GetDetectedItems(),function(t,a,b) +return self:Order(t[a])<self:Order(t[b]) +end)do +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedCount=DetectedSet:Count() +local DetectedZone=DetectedItem.Zone +self:F({"Target ID",DetectedItem.ItemID}) +DetectedSet:Flush(self) +local DetectedID=DetectedItem.ID +local DetectionIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +Report:Add(string.format("\n- Target %s (%s): (#%d) %s",DetectedItem.ItemID,DetectedItem.Index,DetectedItem.Set:Count(),DetectedItem.Set:GetObjectNames())) +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +local Defender=Defender +if DefenderTask.Target and DefenderTask.Target.Index==DetectedItem.Index then +if Defender and Defender:IsAlive()then +DefenderGroupCount=DefenderGroupCount+1 +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +Report:Add(string.format(" - %s*%d/%d (%s - %s): (#%d) F: %3d, D:%3d - %s", +Defender:GetName(), +Defender:GetSize(), +Defender:GetInitialSize(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +end +Report:Add("\n- No Targets:") +local TaskCount=0 +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +TaskCount=TaskCount+1 +local Defender=Defender +if not DefenderTask.Target then +if Defender:IsAlive()then +local DefenderHasTask=Defender:HasTask() +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +DefenderGroupCount=DefenderGroupCount+1 +Report:Add(string.format(" - %s*%d/%d (%s - %s): (#%d) F: %3d, D:%3d - %s", +Defender:GetName(), +Defender:GetSize(), +Defender:GetInitialSize(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +Report:Add(string.format("\n- %d Tasks - %d Defender Groups",TaskCount,DefenderGroupCount)) +self:F(Report:Text("\n")) +trigger.action.outText(Report:Text("\n"),25) +return true +end +function AI_A2A_DISPATCHER:ProcessDetected(Detection) +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local TaskReport=REPORT:New() +for AIGroup,DefenderTask in pairs(self:GetDefenderTasks())do +local AIGroup=AIGroup +if not AIGroup:IsAlive()then +local DefenderTaskFsm=self:GetDefenderTaskFsm(AIGroup) +self:F({Defender=AIGroup:GetName(),DefenderState=DefenderTaskFsm:GetState()}) +if not DefenderTaskFsm:Is("Started")then +self:ClearDefenderTask(AIGroup) +end +else +if DefenderTask.Target then +local AttackerItem=Detection:GetDetectedItemByIndex(DefenderTask.Target.Index) +if not AttackerItem then +self:F({"Removing obsolete Target:",DefenderTask.Target.Index}) +self:ClearDefenderTaskTarget(AIGroup) +else +if DefenderTask.Target.Set then +local AttackerCount=DefenderTask.Target.Set:Count() +if AttackerCount==0 then +self:F({"All Targets destroyed in Target, removing:",DefenderTask.Target.Index}) +self:ClearDefenderTaskTarget(AIGroup) +end +end +end +end +end +end +local Report=REPORT:New("Tactical Overviews") +local DefenderGroupCount=0 +for DetectedItemID,DetectedItem in UTILS.spairs(Detection:GetDetectedItems(),function(t,a,b) +return self:Order(t[a])<self:Order(t[b]) +end)do +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedCount=DetectedSet:Count() +local DetectedZone=DetectedItem.Zone +self:F({"Target ID",DetectedItem.ItemID}) +DetectedSet:Flush(self) +local DetectedID=DetectedItem.ID +local DetectionIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +do +local Friendlies=self:EvaluateENGAGE(DetectedItem) +if Friendlies then +self:F({AIGroups=Friendlies}) +self:ENGAGE(DetectedItem,Friendlies) +end +end +do +local DefendersMissing,Friendlies=self:EvaluateGCI(DetectedItem) +if DefendersMissing and DefendersMissing>0 then +self:F({DefendersMissing=DefendersMissing}) +self:GCI(DetectedItem,DefendersMissing,Friendlies) +end +end +end +if self.TacticalDisplay then +self:ShowTacticalDisplay(Detection) +end +return true +end +end +do +function AI_A2A_DISPATCHER:GetPlayerFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local PlayersNearBy=self.Detection:GetPlayersNearBy(DetectedItem) +local PlayerTypes={} +local PlayersCount=0 +if PlayersNearBy then +local DetectedTreatLevel=DetectedSet:CalculateThreatLevelA2G() +for PlayerUnitName,PlayerUnitData in pairs(PlayersNearBy)do +local PlayerUnit=PlayerUnitData +local PlayerName=PlayerUnit:GetPlayerName() +if PlayerUnit:IsAirPlane()and PlayerName~=nil then +local FriendlyUnitThreatLevel=PlayerUnit:GetThreatLevel() +PlayersCount=PlayersCount+1 +local PlayerType=PlayerUnit:GetTypeName() +PlayerTypes[PlayerName]=PlayerType +if DetectedTreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local PlayerTypesReport=REPORT:New() +if PlayersCount>0 then +for PlayerName,PlayerType in pairs(PlayerTypes)do +PlayerTypesReport:Add(string.format('"%s" in %s',PlayerName,PlayerType)) +end +else +PlayerTypesReport:Add("-") +end +return PlayersCount,PlayerTypesReport +end +function AI_A2A_DISPATCHER:GetFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local FriendlyUnitsNearBy=self.Detection:GetFriendliesNearBy(DetectedItem) +local FriendlyTypes={} +local FriendliesCount=0 +if FriendlyUnitsNearBy then +local DetectedTreatLevel=DetectedSet:CalculateThreatLevelA2G() +for FriendlyUnitName,FriendlyUnitData in pairs(FriendlyUnitsNearBy)do +local FriendlyUnit=FriendlyUnitData +if FriendlyUnit:IsAirPlane()then +local FriendlyUnitThreatLevel=FriendlyUnit:GetThreatLevel() +FriendliesCount=FriendliesCount+1 +local FriendlyType=FriendlyUnit:GetTypeName() +FriendlyTypes[FriendlyType]=FriendlyTypes[FriendlyType]and(FriendlyTypes[FriendlyType]+1)or 1 +if DetectedTreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local FriendlyTypesReport=REPORT:New() +if FriendliesCount>0 then +for FriendlyType,FriendlyTypeCount in pairs(FriendlyTypes)do +FriendlyTypesReport:Add(string.format("%d of %s",FriendlyTypeCount,FriendlyType)) +end +else +FriendlyTypesReport:Add("-") +end +return FriendliesCount,FriendlyTypesReport +end +function AI_A2A_DISPATCHER:SchedulerCAP(SquadronName) +self:CAP(SquadronName) +end +function AI_A2A_DISPATCHER:AddToSquadron(Squadron,Amount) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount+Amount +end +self:T({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2A_DISPATCHER:RemoveFromSquadron(Squadron,Amount) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount-Amount +end +self:T({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +end +end +do +AI_A2A_GCICAP={ +ClassName="AI_A2A_GCICAP", +Detection=nil, +} +function AI_A2A_GCICAP:New(EWRPrefixes,TemplatePrefixes,CapPrefixes,CapLimit,GroupingRadius,EngageRadius,GciRadius,ResourceCount) +local EWRSetGroup=SET_GROUP:New() +EWRSetGroup:FilterPrefixes(EWRPrefixes) +EWRSetGroup:FilterStart() +local Detection=DETECTION_AREAS:New(EWRSetGroup,GroupingRadius or 30000) +local self=BASE:Inherit(self,AI_A2A_DISPATCHER:New(Detection)) +self:SetEngageRadius(EngageRadius) +self:SetGciRadius(GciRadius) +local EWRFirst=EWRSetGroup:GetFirst() +local EWRCoalition=EWRFirst:GetCoalition() +local AirbaseNames={} +for AirbaseID,AirbaseData in pairs(_DATABASE.AIRBASES)do +local Airbase=AirbaseData +local AirbaseName=Airbase:GetName() +if Airbase:GetCoalition()==EWRCoalition then +table.insert(AirbaseNames,AirbaseName) +end +end +self.Templates=SET_GROUP:New():FilterPrefixes(TemplatePrefixes):FilterOnce() +self:T({Airbases=AirbaseNames}) +self:T("Defining Templates for Airbases ...") +for AirbaseID,AirbaseName in pairs(AirbaseNames)do +local Airbase=_DATABASE:FindAirbase(AirbaseName) +local AirbaseName=Airbase:GetName() +local AirbaseCoord=Airbase:GetCoordinate() +local AirbaseZone=ZONE_RADIUS:New("Airbase",AirbaseCoord:GetVec2(),3000) +local Templates=nil +self:T({Airbase=AirbaseName}) +for TemplateID,Template in pairs(self.Templates:GetSet())do +local Template=Template +local TemplateCoord=Template:GetCoordinate() +if AirbaseZone:IsVec2InZone(TemplateCoord:GetVec2())then +Templates=Templates or{} +table.insert(Templates,Template:GetName()) +self:T({Template=Template:GetName()}) +end +end +if Templates then +self:SetSquadron(AirbaseName,AirbaseName,Templates,ResourceCount) +end +end +self.CAPTemplates=SET_GROUP:New() +self.CAPTemplates:FilterPrefixes(CapPrefixes) +self.CAPTemplates:FilterOnce() +self:T("Setting up CAP ...") +for CAPID,CAPTemplate in pairs(self.CAPTemplates:GetSet())do +local CAPZone=ZONE_POLYGON:New(CAPTemplate:GetName(),CAPTemplate) +local AirbaseDistance=99999999 +local AirbaseClosest=nil +self:T({CAPZoneGroup=CAPID}) +for AirbaseID,AirbaseName in pairs(AirbaseNames)do +local Airbase=_DATABASE:FindAirbase(AirbaseName) +local AirbaseName=Airbase:GetName() +local AirbaseCoord=Airbase:GetCoordinate() +local Squadron=self.DefenderSquadrons[AirbaseName] +if Squadron then +local Distance=AirbaseCoord:Get2DDistance(CAPZone:GetCoordinate()) +self:T({AirbaseDistance=Distance}) +if Distance<AirbaseDistance then +AirbaseDistance=Distance +AirbaseClosest=Airbase +end +end +end +if AirbaseClosest then +self:T({CAPAirbase=AirbaseClosest:GetName()}) +self:SetSquadronCap(AirbaseClosest:GetName(),CAPZone,6000,10000,500,800,800,1200,"RADIO") +self:SetSquadronCapInterval(AirbaseClosest:GetName(),CapLimit,300,600,1) +end +end +self:T("Setting up GCI ...") +for AirbaseID,AirbaseName in pairs(AirbaseNames)do +local Airbase=_DATABASE:FindAirbase(AirbaseName) +local AirbaseName=Airbase:GetName() +local Squadron=self.DefenderSquadrons[AirbaseName] +self:F({Airbase=AirbaseName}) +if Squadron then +self:T({GCIAirbase=AirbaseName}) +self:SetSquadronGci(AirbaseName,800,1200) +end +end +self:__Start(5) +self:HandleEvent(EVENTS.Crash,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.EngineShutdown) +return self +end +function AI_A2A_GCICAP:NewWithBorder(EWRPrefixes,TemplatePrefixes,BorderPrefix,CapPrefixes,CapLimit,GroupingRadius,EngageRadius,GciRadius,ResourceCount) +local self=AI_A2A_GCICAP:New(EWRPrefixes,TemplatePrefixes,CapPrefixes,CapLimit,GroupingRadius,EngageRadius,GciRadius,ResourceCount) +if BorderPrefix then +self:SetBorderZone(ZONE_POLYGON:New(BorderPrefix,GROUP:FindByName(BorderPrefix))) +end +return self +end +end +AI_A2G_BAI={ +ClassName="AI_A2G_BAI", +} +function AI_A2G_BAI:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air=AI_AIR:New(AIGroup) +local AI_Air_Patrol=AI_AIR_PATROL:New(AI_Air,AIGroup,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air_Engage=AI_AIR_ENGAGE:New(AI_Air_Patrol,AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air_Engage) +return self +end +function AI_A2G_BAI:New(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +return self:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +end +function AI_A2G_BAI:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +local AttackUnitTasks={} +local AttackSetUnitPerThreatLevel=AttackSetUnit:GetSetPerThreatLevel(10,0) +for AttackUnitIndex,AttackUnit in ipairs(AttackSetUnitPerThreatLevel or{})do +if AttackUnit then +if AttackUnit:IsAlive()and AttackUnit:IsGround()then +self:T({"BAI Unit:",AttackUnit:GetName()}) +AttackUnitTasks[#AttackUnitTasks+1]=DefenderGroup:TaskAttackUnit(AttackUnit,true,false,nil,nil,EngageAltitude) +end +end +end +return AttackUnitTasks +end +AI_A2G_CAS={ +ClassName="AI_A2G_CAS", +} +function AI_A2G_CAS:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air=AI_AIR:New(AIGroup) +local AI_Air_Patrol=AI_AIR_PATROL:New(AI_Air,AIGroup,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air_Engage=AI_AIR_ENGAGE:New(AI_Air_Patrol,AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air_Engage) +return self +end +function AI_A2G_CAS:New(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +return self:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +end +function AI_A2G_CAS:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +local AttackUnitTasks={} +local AttackSetUnitPerThreatLevel=AttackSetUnit:GetSetPerThreatLevel(10,0) +for AttackUnitIndex,AttackUnit in ipairs(AttackSetUnitPerThreatLevel or{})do +if AttackUnit then +if AttackUnit:IsAlive()and AttackUnit:IsGround()then +self:T({"CAS Unit:",AttackUnit:GetName()}) +AttackUnitTasks[#AttackUnitTasks+1]=DefenderGroup:TaskAttackUnit(AttackUnit,true,false,nil,nil,EngageAltitude) +end +end +end +return AttackUnitTasks +end +AI_A2G_SEAD={ +ClassName="AI_A2G_SEAD", +} +function AI_A2G_SEAD:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air=AI_AIR:New(AIGroup) +local AI_Air_Patrol=AI_AIR_PATROL:New(AI_Air,AIGroup,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local AI_Air_Engage=AI_AIR_ENGAGE:New(AI_Air_Patrol,AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local self=BASE:Inherit(self,AI_Air_Engage) +return self +end +function AI_A2G_SEAD:New(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +return self:New2(AIGroup,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,PatrolAltType,PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +end +function AI_A2G_SEAD:CreateAttackUnitTasks(AttackSetUnit,DefenderGroup,EngageAltitude) +local AttackUnitTasks={} +local AttackSetUnitPerThreatLevel=AttackSetUnit:GetSetPerThreatLevel(10,0) +for AttackUnitID,AttackUnit in ipairs(AttackSetUnitPerThreatLevel)do +if AttackUnit then +if AttackUnit:IsAlive()and AttackUnit:IsGround()then +local HasRadar=AttackUnit:HasSEAD() +if HasRadar then +self:F({"SEAD Unit:",AttackUnit:GetName()}) +AttackUnitTasks[#AttackUnitTasks+1]=DefenderGroup:TaskAttackUnit(AttackUnit,true,false,nil,nil,EngageAltitude) +end +end +end +end +return AttackUnitTasks +end +do +AI_A2G_DISPATCHER={ +ClassName="AI_A2G_DISPATCHER", +Detection=nil, +} +AI_A2G_DISPATCHER.DefenseCoordinates={} +AI_A2G_DISPATCHER.Takeoff=GROUP.Takeoff +AI_A2G_DISPATCHER.Landing={ +NearAirbase=1, +AtRunway=2, +AtEngineShutdown=3, +} +AI_A2G_DISPATCHER.DefenseQueue={} +AI_A2G_DISPATCHER.DefenseApproach={ +Random=1, +Distance=2, +} +function AI_A2G_DISPATCHER:New(Detection) +local self=BASE:Inherit(self,DETECTION_MANAGER:New(nil,Detection)) +self.Detection=Detection +self.Detection:FilterCategories(Unit.Category.GROUND_UNIT) +self.DefenderSquadrons={} +self.DefenderSpawns={} +self.DefenderTasks={} +self.DefenderDefault={} +self.SetSendPlayerMessages=false +self:SetDefenseRadius() +self:SetDefenseLimit(nil) +self:SetDefenseApproach(AI_A2G_DISPATCHER.DefenseApproach.Random) +self:SetIntercept(300) +self:SetDisengageRadius(300000) +self:SetDefaultTakeoff(AI_A2G_DISPATCHER.Takeoff.Air) +self:SetDefaultTakeoffInAirAltitude(500) +self:SetDefaultLanding(AI_A2G_DISPATCHER.Landing.NearAirbase) +self:SetDefaultOverhead(1) +self:SetDefaultGrouping(1) +self:SetDefaultFuelThreshold(0.15,0) +self:SetDefaultDamageThreshold(0.4) +self:SetDefaultPatrolTimeInterval(180,600) +self:SetDefaultPatrolLimit(1) +self:AddTransition("Started","Assign","Started") +self:AddTransition("*","Patrol","*") +self:AddTransition("*","Defend","*") +self:AddTransition("*","Engage","*") +self:HandleEvent(EVENTS.Crash,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Dead,self.OnEventCrashOrDead) +self:HandleEvent(EVENTS.Land) +self:HandleEvent(EVENTS.EngineShutdown) +self:HandleEvent(EVENTS.BaseCaptured) +self:SetTacticalDisplay(false) +self.DefenderPatrolIndex=0 +self:SetDefenseReactivityMedium() +self.TakeoffScheduleID=self:ScheduleRepeat(10,10,0,nil,self.ResourceTakeoff,self) +self:__Start(1) +return self +end +function AI_A2G_DISPATCHER:onafterStart(From,Event,To) +self:GetParent(self).onafterStart(self,From,Event,To) +for SquadronName,DefenderSquadron in pairs(self.DefenderSquadrons)do +DefenderSquadron.Resource={} +for Resource=1,DefenderSquadron.ResourceCount or 0 do +self:ResourcePark(DefenderSquadron) +end +self:T("Parked resources for squadron "..DefenderSquadron.Name) +end +end +function AI_A2G_DISPATCHER:Lock(DetectedItemIndex) +self:F({DetectedItemIndex=DetectedItemIndex}) +local DetectedItem=self.Detection:GetDetectedItemByIndex(DetectedItemIndex) +if DetectedItem then +self:F({Locked=DetectedItem}) +self.Detection:LockDetectedItem(DetectedItem) +end +end +function AI_A2G_DISPATCHER:Unlock(DetectedItemIndex) +self:F({DetectedItemIndex=DetectedItemIndex}) +self:F({Index=self.Detection.DetectedItemsByIndex}) +local DetectedItem=self.Detection:GetDetectedItemByIndex(DetectedItemIndex) +if DetectedItem then +self:F({Unlocked=DetectedItem}) +self.Detection:UnlockDetectedItem(DetectedItem) +end +end +function AI_A2G_DISPATCHER:SetDefenseLimit(DefenseLimit) +self:F({DefenseLimit=DefenseLimit}) +self.DefenseLimit=DefenseLimit +end +function AI_A2G_DISPATCHER:SetDefenseApproach(DefenseApproach) +self:F({DefenseApproach=DefenseApproach}) +self._DefenseApproach=DefenseApproach +end +function AI_A2G_DISPATCHER:ResourcePark(DefenderSquadron) +local TemplateID=math.random(1,#DefenderSquadron.Spawn) +local Spawn=DefenderSquadron.Spawn[TemplateID] +Spawn:InitGrouping(1) +local SpawnGroup +if self:IsSquadronVisible(DefenderSquadron.Name)then +SpawnGroup=Spawn:SpawnAtAirbase(DefenderSquadron.Airbase,SPAWN.Takeoff.Cold) +local GroupName=SpawnGroup:GetName() +DefenderSquadron.Resources=DefenderSquadron.Resources or{} +DefenderSquadron.Resources[TemplateID]=DefenderSquadron.Resources[TemplateID]or{} +DefenderSquadron.Resources[TemplateID][GroupName]={} +DefenderSquadron.Resources[TemplateID][GroupName]=SpawnGroup +end +end +function AI_A2G_DISPATCHER:OnEventBaseCaptured(EventData) +local AirbaseName=EventData.PlaceName +self:T("Captured "..AirbaseName) +for SquadronName,Squadron in pairs(self.DefenderSquadrons)do +if Squadron.AirbaseName==AirbaseName then +Squadron.ResourceCount=-999 +Squadron.Captured=true +self:T("Squadron "..SquadronName.." captured.") +end +end +end +function AI_A2G_DISPATCHER:OnEventCrashOrDead(EventData) +self.Detection:ForgetDetectedUnit(EventData.IniUnitName) +end +function AI_A2G_DISPATCHER:OnEventLand(EventData) +self:F("Landed") +local DefenderUnit=EventData.IniUnit +local Defender=EventData.IniGroup +local Squadron=self:GetSquadronFromDefender(Defender) +if Squadron then +self:F({SquadronName=Squadron.Name}) +local LandingMethod=self:GetSquadronLanding(Squadron.Name) +if LandingMethod==AI_A2G_DISPATCHER.Landing.AtRunway then +local DefenderSize=Defender:GetSize() +if DefenderSize==1 then +self:RemoveDefenderFromSquadron(Squadron,Defender) +end +DefenderUnit:Destroy() +self:ResourcePark(Squadron) +return +end +if DefenderUnit:GetLife()~=DefenderUnit:GetLife0()then +DefenderUnit:Destroy() +return +end +end +end +function AI_A2G_DISPATCHER:OnEventEngineShutdown(EventData) +local DefenderUnit=EventData.IniUnit +local Defender=EventData.IniGroup +local Squadron=self:GetSquadronFromDefender(Defender) +if Squadron then +self:F({SquadronName=Squadron.Name}) +local LandingMethod=self:GetSquadronLanding(Squadron.Name) +if LandingMethod==AI_A2G_DISPATCHER.Landing.AtEngineShutdown and +not DefenderUnit:InAir()then +local DefenderSize=Defender:GetSize() +if DefenderSize==1 then +self:RemoveDefenderFromSquadron(Squadron,Defender) +end +DefenderUnit:Destroy() +self:ResourcePark(Squadron) +end +end +end +do +function AI_A2G_DISPATCHER:AddDefenseCoordinate(DefenseCoordinateName,DefenseCoordinate) +self.DefenseCoordinates[DefenseCoordinateName]=DefenseCoordinate +end +function AI_A2G_DISPATCHER:SetDefenseReactivityLow() +self.DefenseReactivity=0.05 +end +function AI_A2G_DISPATCHER:SetDefenseReactivityMedium() +self.DefenseReactivity=0.15 +end +function AI_A2G_DISPATCHER:SetDefenseReactivityHigh() +self.DefenseReactivity=0.5 +end +end +function AI_A2G_DISPATCHER:SetDisengageRadius(DisengageRadius) +self.DisengageRadius=DisengageRadius or 300000 +return self +end +function AI_A2G_DISPATCHER:SetDefenseRadius(DefenseRadius) +self.DefenseRadius=DefenseRadius or 40000 +self.Detection:SetAcceptRange(self.DefenseRadius) +return self +end +function AI_A2G_DISPATCHER:SetBorderZone(BorderZone) +self.Detection:SetAcceptZones(BorderZone) +return self +end +function AI_A2G_DISPATCHER:SetTacticalDisplay(TacticalDisplay) +self.TacticalDisplay=TacticalDisplay +return self +end +function AI_A2G_DISPATCHER:SetDefaultDamageThreshold(DamageThreshold) +self.DefenderDefault.DamageThreshold=DamageThreshold +return self +end +function AI_A2G_DISPATCHER:SetDefaultPatrolTimeInterval(PatrolMinSeconds,PatrolMaxSeconds) +self.DefenderDefault.PatrolMinSeconds=PatrolMinSeconds +self.DefenderDefault.PatrolMaxSeconds=PatrolMaxSeconds +return self +end +function AI_A2G_DISPATCHER:SetDefaultPatrolLimit(PatrolLimit) +self.DefenderDefault.PatrolLimit=PatrolLimit +return self +end +function AI_A2G_DISPATCHER:SetDefaultEngageLimit(EngageLimit) +self.DefenderDefault.EngageLimit=EngageLimit +return self +end +function AI_A2G_DISPATCHER:SetIntercept(InterceptDelay) +self.DefenderDefault.InterceptDelay=InterceptDelay +local Detection=self.Detection +Detection:SetIntercept(true,InterceptDelay) +return self +end +function AI_A2G_DISPATCHER:GetDefenderFriendliesNearBy(DetectedItem) +local DefenderFriendliesNearBy={} +local DetectionCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local ScanZone=ZONE_RADIUS:New("ScanZone",DetectionCoordinate:GetVec2(),self.DefenseRadius) +ScanZone:Scan(Object.Category.UNIT,{Unit.Category.AIRPLANE,Unit.Category.HELICOPTER}) +local DefenderUnits=ScanZone:GetScannedUnits() +for DefenderUnitID,DefenderUnit in pairs(DefenderUnits)do +local DefenderUnit=UNIT:FindByName(DefenderUnit:getName()) +DefenderFriendliesNearBy[#DefenderFriendliesNearBy+1]=DefenderUnit +end +return DefenderFriendliesNearBy +end +function AI_A2G_DISPATCHER:GetDefenderTasks() +return self.DefenderTasks or{} +end +function AI_A2G_DISPATCHER:GetDefenderTask(Defender) +return self.DefenderTasks[Defender] +end +function AI_A2G_DISPATCHER:GetDefenderTaskFsm(Defender) +return self:GetDefenderTask(Defender).Fsm +end +function AI_A2G_DISPATCHER:GetDefenderTaskTarget(Defender) +return self:GetDefenderTask(Defender).Target +end +function AI_A2G_DISPATCHER:GetDefenderTaskSquadronName(Defender) +return self:GetDefenderTask(Defender).SquadronName +end +function AI_A2G_DISPATCHER:ClearDefenderTask(Defender) +if Defender:IsAlive()and self.DefenderTasks[Defender]then +local Target=self.DefenderTasks[Defender].Target +local Message="Clearing ("..self.DefenderTasks[Defender].Type..") " +Message=Message..Defender:GetName() +if Target then +Message=Message..(Target and(" from "..Target.Index.." ["..Target.Set:Count().."]"))or"" +end +self:F({Target=Message}) +end +self.DefenderTasks[Defender]=nil +return self +end +function AI_A2G_DISPATCHER:ClearDefenderTaskTarget(Defender) +local DefenderTask=self:GetDefenderTask(Defender) +if Defender:IsAlive()and DefenderTask then +local Target=DefenderTask.Target +local Message="Clearing ("..DefenderTask.Type..") " +Message=Message..Defender:GetName() +if Target then +Message=Message..(Target and(" from "..Target.Index.." ["..Target.Set:Count().."]"))or"" +end +self:F({Target=Message}) +end +if Defender and DefenderTask and DefenderTask.Target then +DefenderTask.Target=nil +end +return self +end +function AI_A2G_DISPATCHER:SetDefenderTask(SquadronName,Defender,Type,Fsm,Target,Size) +self:F({SquadronName=SquadronName,Defender=Defender:GetName()}) +self.DefenderTasks[Defender]=self.DefenderTasks[Defender]or{} +self.DefenderTasks[Defender].Type=Type +self.DefenderTasks[Defender].Fsm=Fsm +self.DefenderTasks[Defender].SquadronName=SquadronName +self.DefenderTasks[Defender].Size=Size +if Target then +self:SetDefenderTaskTarget(Defender,Target) +end +return self +end +function AI_A2G_DISPATCHER:SetDefenderTaskTarget(Defender,AttackerDetection) +local Message="("..self.DefenderTasks[Defender].Type..") " +Message=Message..Defender:GetName() +Message=Message..(AttackerDetection and(" target "..AttackerDetection.Index.." ["..AttackerDetection.Set:Count().."]"))or"" +self:F({AttackerDetection=Message}) +if AttackerDetection then +self.DefenderTasks[Defender].Target=AttackerDetection +end +return self +end +function AI_A2G_DISPATCHER:SetSquadron(SquadronName,AirbaseName,TemplatePrefixes,ResourceCount) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +DefenderSquadron.Name=SquadronName +DefenderSquadron.Airbase=AIRBASE:FindByName(AirbaseName) +DefenderSquadron.AirbaseName=DefenderSquadron.Airbase:GetName() +if not DefenderSquadron.Airbase then +error("Cannot find airbase with name:"..AirbaseName) +end +DefenderSquadron.Spawn={} +if type(TemplatePrefixes)=="string"then +local SpawnTemplate=TemplatePrefixes +self.DefenderSpawns[SpawnTemplate]=self.DefenderSpawns[SpawnTemplate]or SPAWN:New(SpawnTemplate) +DefenderSquadron.Spawn[1]=self.DefenderSpawns[SpawnTemplate] +else +for TemplateID,SpawnTemplate in pairs(TemplatePrefixes)do +self.DefenderSpawns[SpawnTemplate]=self.DefenderSpawns[SpawnTemplate]or SPAWN:New(SpawnTemplate) +DefenderSquadron.Spawn[#DefenderSquadron.Spawn+1]=self.DefenderSpawns[SpawnTemplate] +end +end +DefenderSquadron.ResourceCount=ResourceCount +DefenderSquadron.TemplatePrefixes=TemplatePrefixes +DefenderSquadron.Captured=false +self:SetSquadronTakeoffInterval(SquadronName,0) +self:F({Squadron={SquadronName,AirbaseName,TemplatePrefixes,ResourceCount}}) +return self +end +function AI_A2G_DISPATCHER:GetSquadron(SquadronName) +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +if not DefenderSquadron then +error("Unknown Squadron:"..SquadronName) +end +return DefenderSquadron +end +function AI_A2G_DISPATCHER:QuerySquadron(Squadron) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +self:T2(string.format("%s = %s",Squadron.Name,Squadron.ResourceCount)) +return Squadron.ResourceCount +end +self:F({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +return nil +end +function AI_A2G_DISPATCHER:IsSquadronVisible(SquadronName) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron then +return DefenderSquadron.Uncontrolled==true +end +return nil +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffInterval(SquadronName,TakeoffInterval) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron then +DefenderSquadron.TakeoffInterval=TakeoffInterval or 0 +DefenderSquadron.TakeoffTime=0 +end +end +function AI_A2G_DISPATCHER:SetSquadronPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability,DefenseTaskType) +local DefenderSquadron=self:GetSquadron(SquadronName) +local Patrol=DefenderSquadron[DefenseTaskType] +if Patrol then +Patrol.LowInterval=LowInterval or 180 +Patrol.HighInterval=HighInterval or 600 +Patrol.Probability=Probability or 1 +Patrol.PatrolLimit=PatrolLimit or 1 +Patrol.Scheduler=Patrol.Scheduler or SCHEDULER:New(self) +local Scheduler=Patrol.Scheduler +local ScheduleID=Patrol.ScheduleID +local Variance=(Patrol.HighInterval-Patrol.LowInterval)/2 +local Repeat=Patrol.LowInterval+Variance +local Randomization=Variance/Repeat +local Start=math.random(1,Patrol.HighInterval) +if ScheduleID then +Scheduler:Stop(ScheduleID) +end +Patrol.ScheduleID=Scheduler:Schedule(self,self.SchedulerPatrol,{SquadronName},Start,Repeat,Randomization) +else +error("This squadron does not exist:"..SquadronName) +end +end +function AI_A2G_DISPATCHER:SetSquadronSeadPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability) +self:SetSquadronPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability,"SEAD") +end +function AI_A2G_DISPATCHER:SetSquadronCasPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability) +self:SetSquadronPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability,"CAS") +end +function AI_A2G_DISPATCHER:SetSquadronBaiPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability) +self:SetSquadronPatrolInterval(SquadronName,PatrolLimit,LowInterval,HighInterval,Probability,"BAI") +end +function AI_A2G_DISPATCHER:GetPatrolDelay(SquadronName) +self.DefenderSquadrons[SquadronName]=self.DefenderSquadrons[SquadronName]or{} +self.DefenderSquadrons[SquadronName].Patrol=self.DefenderSquadrons[SquadronName].Patrol or{} +local DefenderSquadron=self:GetSquadron(SquadronName) +local Patrol=self.DefenderSquadrons[SquadronName].Patrol +if Patrol then +return math.random(Patrol.LowInterval,Patrol.HighInterval) +else +error("This squadron does not exist:"..SquadronName) +end +end +function AI_A2G_DISPATCHER:CanPatrol(SquadronName,DefenseTaskType) +self:F({SquadronName=SquadronName}) +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron.Captured==false then +if(not DefenderSquadron.ResourceCount)or(DefenderSquadron.ResourceCount and DefenderSquadron.ResourceCount>0)then +local Patrol=DefenderSquadron[DefenseTaskType] +if Patrol and Patrol.Patrol==true then +local PatrolCount=self:CountPatrolAirborne(SquadronName,DefenseTaskType) +self:F({PatrolCount=PatrolCount,PatrolLimit=Patrol.PatrolLimit,PatrolProbability=Patrol.Probability}) +if PatrolCount<Patrol.PatrolLimit then +local Probability=math.random() +if Probability<=Patrol.Probability then +return DefenderSquadron,Patrol +end +end +else +self:F("No patrol for "..SquadronName) +end +end +end +return nil +end +function AI_A2G_DISPATCHER:CanDefend(SquadronName,DefenseTaskType) +self:F({SquadronName=SquadronName,DefenseTaskType}) +local DefenderSquadron=self:GetSquadron(SquadronName) +if DefenderSquadron.Captured==false then +if(not DefenderSquadron.ResourceCount)or(DefenderSquadron.ResourceCount and DefenderSquadron.ResourceCount>0)then +if DefenderSquadron[DefenseTaskType]and(DefenderSquadron[DefenseTaskType].Defend==true)then +return DefenderSquadron,DefenderSquadron[DefenseTaskType] +end +end +end +return nil +end +function AI_A2G_DISPATCHER:SetSquadronEngageLimit(SquadronName,EngageLimit,DefenseTaskType) +local DefenderSquadron=self:GetSquadron(SquadronName) +local Defense=DefenderSquadron[DefenseTaskType] +if Defense then +Defense.EngageLimit=EngageLimit or 1 +else +error("This squadron does not exist:"..SquadronName) +end +end +function AI_A2G_DISPATCHER:SetSquadronSead2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.SEAD=DefenderSquadron.SEAD or{} +local Sead=DefenderSquadron.SEAD +Sead.Name=SquadronName +Sead.EngageMinSpeed=EngageMinSpeed +Sead.EngageMaxSpeed=EngageMaxSpeed +Sead.EngageFloorAltitude=EngageFloorAltitude or 500 +Sead.EngageCeilingAltitude=EngageCeilingAltitude or 1000 +Sead.EngageAltType=EngageAltType +Sead.Defend=true +self:T({SEAD={SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +return self +end +function AI_A2G_DISPATCHER:SetSquadronSead(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude) +return self:SetSquadronSead2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,"RADIO") +end +function AI_A2G_DISPATCHER:SetSquadronSeadEngageLimit(SquadronName,EngageLimit) +self:SetSquadronEngageLimit(SquadronName,EngageLimit,"SEAD") +end +function AI_A2G_DISPATCHER:SetSquadronSeadPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.SEAD=DefenderSquadron.SEAD or{} +local SeadPatrol=DefenderSquadron.SEAD +SeadPatrol.Name=SquadronName +SeadPatrol.Zone=Zone +SeadPatrol.PatrolFloorAltitude=PatrolFloorAltitude +SeadPatrol.PatrolCeilingAltitude=PatrolCeilingAltitude +SeadPatrol.EngageFloorAltitude=EngageFloorAltitude +SeadPatrol.EngageCeilingAltitude=EngageCeilingAltitude +SeadPatrol.PatrolMinSpeed=PatrolMinSpeed +SeadPatrol.PatrolMaxSpeed=PatrolMaxSpeed +SeadPatrol.EngageMinSpeed=EngageMinSpeed +SeadPatrol.EngageMaxSpeed=EngageMaxSpeed +SeadPatrol.PatrolAltType=PatrolAltType +SeadPatrol.EngageAltType=EngageAltType +SeadPatrol.Patrol=true +self:SetSquadronPatrolInterval(SquadronName,self.DefenderDefault.PatrolLimit,self.DefenderDefault.PatrolMinSeconds,self.DefenderDefault.PatrolMaxSeconds,1,"SEAD") +self:T({SEAD={Zone:GetName(),PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +end +function AI_A2G_DISPATCHER:SetSquadronSeadPatrol(SquadronName,Zone,FloorAltitude,CeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageMinSpeed,EngageMaxSpeed,AltType) +self:SetSquadronSeadPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,FloorAltitude,CeilingAltitude,AltType,EngageMinSpeed,EngageMaxSpeed,FloorAltitude,CeilingAltitude,AltType) +end +function AI_A2G_DISPATCHER:SetSquadronCas2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.CAS=DefenderSquadron.CAS or{} +local Cas=DefenderSquadron.CAS +Cas.Name=SquadronName +Cas.EngageMinSpeed=EngageMinSpeed +Cas.EngageMaxSpeed=EngageMaxSpeed +Cas.EngageFloorAltitude=EngageFloorAltitude or 500 +Cas.EngageCeilingAltitude=EngageCeilingAltitude or 1000 +Cas.EngageAltType=EngageAltType +Cas.Defend=true +self:T({CAS={SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +return self +end +function AI_A2G_DISPATCHER:SetSquadronCas(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude) +return self:SetSquadronCas2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,"RADIO") +end +function AI_A2G_DISPATCHER:SetSquadronCasEngageLimit(SquadronName,EngageLimit) +self:SetSquadronEngageLimit(SquadronName,EngageLimit,"CAS") +end +function AI_A2G_DISPATCHER:SetSquadronCasPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.CAS=DefenderSquadron.CAS or{} +local CasPatrol=DefenderSquadron.CAS +CasPatrol.Name=SquadronName +CasPatrol.Zone=Zone +CasPatrol.PatrolFloorAltitude=PatrolFloorAltitude +CasPatrol.PatrolCeilingAltitude=PatrolCeilingAltitude +CasPatrol.EngageFloorAltitude=EngageFloorAltitude +CasPatrol.EngageCeilingAltitude=EngageCeilingAltitude +CasPatrol.PatrolMinSpeed=PatrolMinSpeed +CasPatrol.PatrolMaxSpeed=PatrolMaxSpeed +CasPatrol.EngageMinSpeed=EngageMinSpeed +CasPatrol.EngageMaxSpeed=EngageMaxSpeed +CasPatrol.PatrolAltType=PatrolAltType +CasPatrol.EngageAltType=EngageAltType +CasPatrol.Patrol=true +self:SetSquadronPatrolInterval(SquadronName,self.DefenderDefault.PatrolLimit,self.DefenderDefault.PatrolMinSeconds,self.DefenderDefault.PatrolMaxSeconds,1,"CAS") +self:T({CAS={Zone:GetName(),PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +end +function AI_A2G_DISPATCHER:SetSquadronCasPatrol(SquadronName,Zone,FloorAltitude,CeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageMinSpeed,EngageMaxSpeed,AltType) +self:SetSquadronCasPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,FloorAltitude,CeilingAltitude,AltType,EngageMinSpeed,EngageMaxSpeed,FloorAltitude,CeilingAltitude,AltType) +end +function AI_A2G_DISPATCHER:SetSquadronBai2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.BAI=DefenderSquadron.BAI or{} +local Bai=DefenderSquadron.BAI +Bai.Name=SquadronName +Bai.EngageMinSpeed=EngageMinSpeed +Bai.EngageMaxSpeed=EngageMaxSpeed +Bai.EngageFloorAltitude=EngageFloorAltitude or 500 +Bai.EngageCeilingAltitude=EngageCeilingAltitude or 1000 +Bai.EngageAltType=EngageAltType +Bai.Defend=true +self:T({BAI={SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +return self +end +function AI_A2G_DISPATCHER:SetSquadronBai(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude) +return self:SetSquadronBai2(SquadronName,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,"RADIO") +end +function AI_A2G_DISPATCHER:SetSquadronBaiEngageLimit(SquadronName,EngageLimit) +self:SetSquadronEngageLimit(SquadronName,EngageLimit,"BAI") +end +function AI_A2G_DISPATCHER:SetSquadronBaiPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.BAI=DefenderSquadron.BAI or{} +local BaiPatrol=DefenderSquadron.BAI +BaiPatrol.Name=SquadronName +BaiPatrol.Zone=Zone +BaiPatrol.PatrolFloorAltitude=PatrolFloorAltitude +BaiPatrol.PatrolCeilingAltitude=PatrolCeilingAltitude +BaiPatrol.EngageFloorAltitude=EngageFloorAltitude +BaiPatrol.EngageCeilingAltitude=EngageCeilingAltitude +BaiPatrol.PatrolMinSpeed=PatrolMinSpeed +BaiPatrol.PatrolMaxSpeed=PatrolMaxSpeed +BaiPatrol.EngageMinSpeed=EngageMinSpeed +BaiPatrol.EngageMaxSpeed=EngageMaxSpeed +BaiPatrol.PatrolAltType=PatrolAltType +BaiPatrol.EngageAltType=EngageAltType +BaiPatrol.Patrol=true +self:SetSquadronPatrolInterval(SquadronName,self.DefenderDefault.PatrolLimit,self.DefenderDefault.PatrolMinSeconds,self.DefenderDefault.PatrolMaxSeconds,1,"BAI") +self:T({BAI={Zone:GetName(),PatrolMinSpeed,PatrolMaxSpeed,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolAltType,EngageMinSpeed,EngageMaxSpeed,EngageFloorAltitude,EngageCeilingAltitude,EngageAltType}}) +end +function AI_A2G_DISPATCHER:SetSquadronBaiPatrol(SquadronName,Zone,FloorAltitude,CeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageMinSpeed,EngageMaxSpeed,AltType) +self:SetSquadronBaiPatrol2(SquadronName,Zone,PatrolMinSpeed,PatrolMaxSpeed,FloorAltitude,CeilingAltitude,AltType,EngageMinSpeed,EngageMaxSpeed,FloorAltitude,CeilingAltitude,AltType) +end +function AI_A2G_DISPATCHER:SetDefaultOverhead(Overhead) +self.DefenderDefault.Overhead=Overhead +return self +end +function AI_A2G_DISPATCHER:SetSquadronOverhead(SquadronName,Overhead) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Overhead=Overhead +return self +end +function AI_A2G_DISPATCHER:GetSquadronOverhead(SquadronName) +local DefenderSquadron=self:GetSquadron(SquadronName) +return DefenderSquadron.Overhead or self.DefenderDefault.Overhead +end +function AI_A2G_DISPATCHER:SetDefaultGrouping(Grouping) +self.DefenderDefault.Grouping=Grouping +return self +end +function AI_A2G_DISPATCHER:SetSquadronGrouping(SquadronName,Grouping) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Grouping=Grouping +return self +end +function AI_A2G_DISPATCHER:SetSquadronEngageProbability(SquadronName,EngageProbability) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.EngageProbability=EngageProbability +return self +end +function AI_A2G_DISPATCHER:SetDefaultTakeoff(Takeoff) +self.DefenderDefault.Takeoff=Takeoff +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoff(SquadronName,Takeoff) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Takeoff=Takeoff +return self +end +function AI_A2G_DISPATCHER:GetDefaultTakeoff() +return self.DefenderDefault.Takeoff +end +function AI_A2G_DISPATCHER:GetSquadronTakeoff(SquadronName) +local DefenderSquadron=self:GetSquadron(SquadronName) +return DefenderSquadron.Takeoff or self.DefenderDefault.Takeoff +end +function AI_A2G_DISPATCHER:SetDefaultTakeoffInAir() +self:SetDefaultTakeoff(AI_A2G_DISPATCHER.Takeoff.Air) +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffInAir(SquadronName,TakeoffAltitude) +self:SetSquadronTakeoff(SquadronName,AI_A2G_DISPATCHER.Takeoff.Air) +if TakeoffAltitude then +self:SetSquadronTakeoffInAirAltitude(SquadronName,TakeoffAltitude) +end +return self +end +function AI_A2G_DISPATCHER:SetDefaultTakeoffFromRunway() +self:SetDefaultTakeoff(AI_A2G_DISPATCHER.Takeoff.Runway) +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffFromRunway(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2G_DISPATCHER.Takeoff.Runway) +return self +end +function AI_A2G_DISPATCHER:SetDefaultTakeoffFromParkingHot() +self:SetDefaultTakeoff(AI_A2G_DISPATCHER.Takeoff.Hot) +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffFromParkingHot(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2G_DISPATCHER.Takeoff.Hot) +return self +end +function AI_A2G_DISPATCHER:SetDefaultTakeoffFromParkingCold() +self:SetDefaultTakeoff(AI_A2G_DISPATCHER.Takeoff.Cold) +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffFromParkingCold(SquadronName) +self:SetSquadronTakeoff(SquadronName,AI_A2G_DISPATCHER.Takeoff.Cold) +return self +end +function AI_A2G_DISPATCHER:SetDefaultTakeoffInAirAltitude(TakeoffAltitude) +self.DefenderDefault.TakeoffAltitude=TakeoffAltitude +return self +end +function AI_A2G_DISPATCHER:SetSquadronTakeoffInAirAltitude(SquadronName,TakeoffAltitude) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.TakeoffAltitude=TakeoffAltitude +return self +end +function AI_A2G_DISPATCHER:SetDefaultLanding(Landing) +self.DefenderDefault.Landing=Landing +return self +end +function AI_A2G_DISPATCHER:SetSquadronLanding(SquadronName,Landing) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.Landing=Landing +return self +end +function AI_A2G_DISPATCHER:GetDefaultLanding() +return self.DefenderDefault.Landing +end +function AI_A2G_DISPATCHER:GetSquadronLanding(SquadronName) +local DefenderSquadron=self:GetSquadron(SquadronName) +return DefenderSquadron.Landing or self.DefenderDefault.Landing +end +function AI_A2G_DISPATCHER:SetDefaultLandingNearAirbase() +self:SetDefaultLanding(AI_A2G_DISPATCHER.Landing.NearAirbase) +return self +end +function AI_A2G_DISPATCHER:SetSquadronLandingNearAirbase(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2G_DISPATCHER.Landing.NearAirbase) +return self +end +function AI_A2G_DISPATCHER:SetDefaultLandingAtRunway() +self:SetDefaultLanding(AI_A2G_DISPATCHER.Landing.AtRunway) +return self +end +function AI_A2G_DISPATCHER:SetSquadronLandingAtRunway(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2G_DISPATCHER.Landing.AtRunway) +return self +end +function AI_A2G_DISPATCHER:SetDefaultLandingAtEngineShutdown() +self:SetDefaultLanding(AI_A2G_DISPATCHER.Landing.AtEngineShutdown) +return self +end +function AI_A2G_DISPATCHER:SetSquadronLandingAtEngineShutdown(SquadronName) +self:SetSquadronLanding(SquadronName,AI_A2G_DISPATCHER.Landing.AtEngineShutdown) +return self +end +function AI_A2G_DISPATCHER:SetDefaultFuelThreshold(FuelThreshold) +self.DefenderDefault.FuelThreshold=FuelThreshold +return self +end +function AI_A2G_DISPATCHER:SetSquadronFuelThreshold(SquadronName,FuelThreshold) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.FuelThreshold=FuelThreshold +return self +end +function AI_A2G_DISPATCHER:SetDefaultTanker(TankerName) +self.DefenderDefault.TankerName=TankerName +return self +end +function AI_A2G_DISPATCHER:SetSquadronTanker(SquadronName,TankerName) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.TankerName=TankerName +return self +end +function AI_A2G_DISPATCHER:SetSquadronRadioFrequency(SquadronName,RadioFrequency,RadioModulation,RadioPower) +local DefenderSquadron=self:GetSquadron(SquadronName) +DefenderSquadron.RadioFrequency=RadioFrequency +DefenderSquadron.RadioModulation=RadioModulation or radio.modulation.AM +DefenderSquadron.RadioPower=RadioPower or 100 +if DefenderSquadron.RadioQueue then +DefenderSquadron.RadioQueue:Stop() +end +DefenderSquadron.RadioQueue=nil +DefenderSquadron.RadioQueue=RADIOSPEECH:New(DefenderSquadron.RadioFrequency,DefenderSquadron.RadioModulation) +DefenderSquadron.RadioQueue.power=DefenderSquadron.RadioPower +DefenderSquadron.RadioQueue:Start(0.5) +DefenderSquadron.RadioQueue:SetLanguage(DefenderSquadron.Language) +end +function AI_A2G_DISPATCHER:AddDefenderToSquadron(Squadron,Defender,Size) +self.Defenders=self.Defenders or{} +local DefenderName=Defender:GetName() +self.Defenders[DefenderName]=Squadron +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount-Size +end +self:F({DefenderName=DefenderName,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2G_DISPATCHER:RemoveDefenderFromSquadron(Squadron,Defender) +self.Defenders=self.Defenders or{} +local DefenderName=Defender:GetName() +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount+Defender:GetSize() +end +self.Defenders[DefenderName]=nil +self:F({DefenderName=DefenderName,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2G_DISPATCHER:GetSquadronFromDefender(Defender) +self.Defenders=self.Defenders or{} +local DefenderName=Defender:GetName() +self:F({DefenderName=DefenderName}) +return self.Defenders[DefenderName] +end +function AI_A2G_DISPATCHER:CountPatrolAirborne(SquadronName,DefenseTaskType) +local PatrolCount=0 +local DefenderSquadron=self.DefenderSquadrons[SquadronName] +if DefenderSquadron then +for AIGroup,DefenderTask in pairs(self:GetDefenderTasks())do +if DefenderTask.SquadronName==SquadronName then +if DefenderTask.Type==DefenseTaskType then +if AIGroup:IsAlive()then +if DefenderTask.Fsm:Is("Patrolling")or DefenderTask.Fsm:Is("Engaging")or DefenderTask.Fsm:Is("Refuelling") +or DefenderTask.Fsm:Is("Started")then +PatrolCount=PatrolCount+1 +end +end +end +end +end +end +return PatrolCount +end +function AI_A2G_DISPATCHER:CountDefendersEngaged(AttackerDetection,AttackerCount) +local DefendersEngaged=0 +local DefendersTotal=0 +local AttackerSet=AttackerDetection.Set +local DefendersMissing=AttackerCount +local DefenderTasks=self:GetDefenderTasks() +for DefenderGroup,DefenderTask in pairs(DefenderTasks)do +local Defender=DefenderGroup +local DefenderTaskTarget=DefenderTask.Target +local DefenderSquadronName=DefenderTask.SquadronName +local DefenderSize=DefenderTask.Size +if DefenderTask.Target then +self:F("Defender Group Name: "..Defender:GetName()..", Size: "..DefenderSize) +DefendersTotal=DefendersTotal+DefenderSize +if DefenderTaskTarget and DefenderTaskTarget.Index==AttackerDetection.Index then +local SquadronOverhead=self:GetSquadronOverhead(DefenderSquadronName) +self:F({SquadronOverhead=SquadronOverhead}) +if DefenderSize then +DefendersEngaged=DefendersEngaged+DefenderSize +DefendersMissing=DefendersMissing-DefenderSize/SquadronOverhead +self:F("Defender Group Name: "..Defender:GetName()..", Size: "..DefenderSize) +else +DefendersEngaged=0 +end +end +end +end +for QueueID,QueueItem in pairs(self.DefenseQueue)do +local QueueItem=QueueItem +if QueueItem.AttackerDetection and QueueItem.AttackerDetection.ItemID==AttackerDetection.ItemID then +DefendersMissing=DefendersMissing-QueueItem.DefendersNeeded/QueueItem.DefenderSquadron.Overhead +self:F({QueueItemName=QueueItem.Defense,QueueItem_ItemID=QueueItem.AttackerDetection.ItemID,DetectedItem=AttackerDetection.ItemID,DefendersMissing=DefendersMissing}) +end +end +self:F({DefenderCount=DefendersEngaged}) +return DefendersTotal,DefendersEngaged,DefendersMissing +end +function AI_A2G_DISPATCHER:CountDefenders(AttackerDetection,DefenderCount,DefenderTaskType) +local Friendlies=nil +local AttackerSet=AttackerDetection.Set +local AttackerCount=AttackerSet:Count() +local DefenderFriendlies=self:GetDefenderFriendliesNearBy(AttackerDetection) +for FriendlyDistance,DefenderFriendlyUnit in UTILS.spairs(DefenderFriendlies or{})do +if AttackerCount>DefenderCount then +local FriendlyGroup=DefenderFriendlyUnit:GetGroup() +if FriendlyGroup and FriendlyGroup:IsAlive()then +local DefenderTask=self:GetDefenderTask(FriendlyGroup) +if DefenderTask then +if DefenderTaskType==DefenderTask.Type then +if DefenderTask.Target==nil then +if DefenderTask.Fsm:Is("Returning") +or DefenderTask.Fsm:Is("Patrolling")then +Friendlies=Friendlies or{} +Friendlies[FriendlyGroup]=FriendlyGroup +DefenderCount=DefenderCount+FriendlyGroup:GetSize() +self:F({Friendly=FriendlyGroup:GetName(),FriendlyDistance=FriendlyDistance}) +end +end +end +end +end +else +break +end +end +return Friendlies +end +function AI_A2G_DISPATCHER:ResourceActivate(DefenderSquadron,DefendersNeeded) +local SquadronName=DefenderSquadron.Name +DefendersNeeded=DefendersNeeded or 4 +local DefenderGrouping=DefenderSquadron.Grouping or self.DefenderDefault.Grouping +DefenderGrouping=(DefenderGrouping<DefendersNeeded)and DefenderGrouping or DefendersNeeded +if self:IsSquadronVisible(SquadronName)then +local TemplateID=math.random(1,#DefenderSquadron.Spawn) +self:F({DefenderGrouping=DefenderGrouping}) +local DefenderUnitIndex=1 +local DefenderPatrolTemplate=nil +local DefenderName=nil +for GroupName,DefenderGroup in pairs(DefenderSquadron.Resources[TemplateID]or{})do +self:F({GroupName=GroupName}) +local DefenderTemplate=_DATABASE:GetGroupTemplate(GroupName) +if DefenderUnitIndex==1 then +DefenderPatrolTemplate=UTILS.DeepCopy(DefenderTemplate) +self.DefenderPatrolIndex=self.DefenderPatrolIndex+1 +DefenderPatrolTemplate.name=GroupName +DefenderName=DefenderPatrolTemplate.name +else +local DefenderUnitTemplate=DefenderTemplate.units[1] +DefenderPatrolTemplate.units[DefenderUnitIndex]=DefenderUnitTemplate +end +DefenderPatrolTemplate.units[DefenderUnitIndex].name=string.format(DefenderPatrolTemplate.name..'-%02d',DefenderUnitIndex) +DefenderPatrolTemplate.units[DefenderUnitIndex].unitId=nil +DefenderUnitIndex=DefenderUnitIndex+1 +DefenderSquadron.Resources[TemplateID][GroupName]=nil +if DefenderUnitIndex>DefenderGrouping then +break +end +end +if DefenderPatrolTemplate then +local TakeoffMethod=self:GetSquadronTakeoff(SquadronName) +local SpawnGroup=GROUP:Register(DefenderName) +DefenderPatrolTemplate.lateActivation=nil +DefenderPatrolTemplate.uncontrolled=nil +local Takeoff=self:GetSquadronTakeoff(SquadronName) +DefenderPatrolTemplate.route.points[1].type=GROUPTEMPLATE.Takeoff[Takeoff][1] +DefenderPatrolTemplate.route.points[1].action=GROUPTEMPLATE.Takeoff[Takeoff][2] +local Defender=_DATABASE:Spawn(DefenderPatrolTemplate) +self:AddDefenderToSquadron(DefenderSquadron,Defender,DefenderGrouping) +Defender:Activate() +return Defender,DefenderGrouping +end +else +local Spawn=DefenderSquadron.Spawn[math.random(1,#DefenderSquadron.Spawn)] +if DefenderGrouping then +Spawn:InitGrouping(DefenderGrouping) +else +Spawn:InitGrouping() +end +local TakeoffMethod=self:GetSquadronTakeoff(SquadronName) +local Defender=Spawn:SpawnAtAirbase(DefenderSquadron.Airbase,TakeoffMethod,DefenderSquadron.TakeoffAltitude or self.DefenderDefault.TakeoffAltitude) +self:AddDefenderToSquadron(DefenderSquadron,Defender,DefenderGrouping) +return Defender,DefenderGrouping +end +return nil,nil +end +function AI_A2G_DISPATCHER:onafterPatrol(From,Event,To,SquadronName,DefenseTaskType) +local DefenderSquadron,Patrol=self:CanPatrol(SquadronName,DefenseTaskType) +if DefenderSquadron then +local DefendersNeeded +local DefendersGrouping=(DefenderSquadron.Grouping or self.DefenderDefault.Grouping) +if DefenderSquadron.ResourceCount==nil then +DefendersNeeded=DefendersGrouping +else +if DefenderSquadron.ResourceCount>=DefendersGrouping then +DefendersNeeded=DefendersGrouping +else +DefendersNeeded=DefenderSquadron.ResourceCount +end +end +if Patrol then +self:ResourceQueue(true,DefenderSquadron,DefendersNeeded,Patrol,DefenseTaskType,nil,SquadronName) +end +end +end +function AI_A2G_DISPATCHER:ResourceQueue(Patrol,DefenderSquadron,DefendersNeeded,Defense,DefenseTaskType,AttackerDetection,SquadronName) +self:F({DefenderSquadron,DefendersNeeded,Defense,DefenseTaskType,AttackerDetection,SquadronName}) +local DefenseQueueItem={} +DefenseQueueItem.Patrol=Patrol +DefenseQueueItem.DefenderSquadron=DefenderSquadron +DefenseQueueItem.DefendersNeeded=DefendersNeeded +DefenseQueueItem.Defense=Defense +DefenseQueueItem.DefenseTaskType=DefenseTaskType +DefenseQueueItem.AttackerDetection=AttackerDetection +DefenseQueueItem.SquadronName=SquadronName +table.insert(self.DefenseQueue,DefenseQueueItem) +self:F({QueueItems=#self.DefenseQueue}) +end +function AI_A2G_DISPATCHER:ResourceTakeoff() +for DefenseQueueID,DefenseQueueItem in pairs(self.DefenseQueue)do +self:F({DefenseQueueID}) +end +for SquadronName,Squadron in pairs(self.DefenderSquadrons)do +if#self.DefenseQueue>0 then +self:F({SquadronName,Squadron.Name,Squadron.TakeoffTime,Squadron.TakeoffInterval,timer.getTime()}) +local DefenseQueueItem=self.DefenseQueue[1] +self:F({DefenderSquadron=DefenseQueueItem.DefenderSquadron}) +if DefenseQueueItem.SquadronName==SquadronName then +if Squadron.TakeoffTime+Squadron.TakeoffInterval<timer.getTime()then +Squadron.TakeoffTime=timer.getTime() +if DefenseQueueItem.Patrol==true then +self:ResourcePatrol(DefenseQueueItem.DefenderSquadron,DefenseQueueItem.DefendersNeeded,DefenseQueueItem.Defense,DefenseQueueItem.DefenseTaskType,DefenseQueueItem.AttackerDetection,DefenseQueueItem.SquadronName) +else +self:ResourceEngage(DefenseQueueItem.DefenderSquadron,DefenseQueueItem.DefendersNeeded,DefenseQueueItem.Defense,DefenseQueueItem.DefenseTaskType,DefenseQueueItem.AttackerDetection,DefenseQueueItem.SquadronName) +end +table.remove(self.DefenseQueue,1) +end +end +end +end +end +function AI_A2G_DISPATCHER:ResourcePatrol(DefenderSquadron,DefendersNeeded,Patrol,DefenseTaskType,AttackerDetection,SquadronName) +self:F({DefenderSquadron=DefenderSquadron}) +self:F({DefendersNeeded=DefendersNeeded}) +self:F({Patrol=Patrol}) +self:F({DefenseTaskType=DefenseTaskType}) +self:F({AttackerDetection=AttackerDetection}) +self:F({SquadronName=SquadronName}) +local DefenderGroup,DefenderGrouping=self:ResourceActivate(DefenderSquadron,DefendersNeeded) +if DefenderGroup then +local AI_A2G_PATROL={SEAD=AI_A2G_SEAD,BAI=AI_A2G_BAI,CAS=AI_A2G_CAS} +local AI_A2G_Fsm=AI_A2G_PATROL[DefenseTaskType]:New2(DefenderGroup,Patrol.EngageMinSpeed,Patrol.EngageMaxSpeed,Patrol.EngageFloorAltitude,Patrol.EngageCeilingAltitude,Patrol.EngageAltType,Patrol.Zone,Patrol.PatrolFloorAltitude,Patrol.PatrolCeilingAltitude,Patrol.PatrolMinSpeed,Patrol.PatrolMaxSpeed,Patrol.PatrolAltType) +AI_A2G_Fsm:SetDispatcher(self) +AI_A2G_Fsm:SetHomeAirbase(DefenderSquadron.Airbase) +AI_A2G_Fsm:SetFuelThreshold(DefenderSquadron.FuelThreshold or self.DefenderDefault.FuelThreshold,60) +AI_A2G_Fsm:SetDamageThreshold(self.DefenderDefault.DamageThreshold) +AI_A2G_Fsm:SetDisengageRadius(self.DisengageRadius) +AI_A2G_Fsm:SetTanker(DefenderSquadron.TankerName or self.DefenderDefault.TankerName) +AI_A2G_Fsm:Start() +self:SetDefenderTask(SquadronName,DefenderGroup,DefenseTaskType,AI_A2G_Fsm,nil,DefenderGrouping) +function AI_A2G_Fsm:onafterTakeoff(DefenderGroup,From,Event,To) +self:F({"Takeoff",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron then +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", wheels up.",DefenderGroup) +end +AI_A2G_Fsm:Patrol() +end +end +function AI_A2G_Fsm:onafterPatrolRoute(DefenderGroup,From,Event,To) +self:F({"PatrolRoute",DefenderGroup:GetName()}) +self:GetParent(self).onafterPatrolRoute(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", patrolling.",DefenderGroup) +end +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +function AI_A2G_Fsm:onafterEngageRoute(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"Engage Route",DefenderGroup:GetName()}) +self:GetParent(self).onafterEngageRoute(self,DefenderGroup,From,Event,To,AttackSetUnit) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron and AttackSetUnit:Count()>0 then +local FirstUnit=AttackSetUnit:GetFirst() +local Coordinate=FirstUnit:GetCoordinate() +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", moving on to ground target at "..Coordinate:ToStringA2G(DefenderGroup),DefenderGroup) +end +end +end +function AI_A2G_Fsm:OnAfterEngage(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"Engage Route",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +local FirstUnit=AttackSetUnit:GetFirst() +if FirstUnit then +local Coordinate=FirstUnit:GetCoordinate() +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", engaging ground target at "..Coordinate:ToStringA2G(DefenderGroup),DefenderGroup) +end +end +end +function AI_A2G_Fsm:onafterRTB(DefenderGroup,From,Event,To) +self:F({"RTB",DefenderGroup:GetName()}) +self:GetParent(self).onafterRTB(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", returning to base.",DefenderGroup) +end +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +function AI_A2G_Fsm:onafterLostControl(DefenderGroup,From,Event,To) +self:F({"LostControl",DefenderGroup:GetName()}) +self:GetParent(self).onafterHome(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", lost control.") +end +if DefenderGroup:IsAboveRunway()then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +end +end +function AI_A2G_Fsm:onafterHome(DefenderGroup,From,Event,To,Action) +self:F({"Home",DefenderGroup:GetName()}) +self:GetParent(self).onafterHome(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", landing at base.",DefenderGroup) +end +if Action and Action=="Destroy"then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +end +if Dispatcher:GetSquadronLanding(Squadron.Name)==AI_A2G_DISPATCHER.Landing.NearAirbase then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +Dispatcher:ResourcePark(Squadron,DefenderGroup) +end +end +end +end +function AI_A2G_DISPATCHER:ResourceEngage(DefenderSquadron,DefendersNeeded,Defense,DefenseTaskType,AttackerDetection,SquadronName) +self:F({DefenderSquadron=DefenderSquadron}) +self:F({DefendersNeeded=DefendersNeeded}) +self:F({Defense=Defense}) +self:F({DefenseTaskType=DefenseTaskType}) +self:F({AttackerDetection=AttackerDetection}) +self:F({SquadronName=SquadronName}) +local DefenderGroup,DefenderGrouping=self:ResourceActivate(DefenderSquadron,DefendersNeeded) +if DefenderGroup then +local AI_A2G_ENGAGE={SEAD=AI_A2G_SEAD,BAI=AI_A2G_BAI,CAS=AI_A2G_CAS} +local AI_A2G_Fsm=AI_A2G_ENGAGE[DefenseTaskType]:New(DefenderGroup,Defense.EngageMinSpeed,Defense.EngageMaxSpeed,Defense.EngageFloorAltitude,Defense.EngageCeilingAltitude,Defense.EngageAltType) +AI_A2G_Fsm:SetDispatcher(self) +AI_A2G_Fsm:SetHomeAirbase(DefenderSquadron.Airbase) +AI_A2G_Fsm:SetFuelThreshold(DefenderSquadron.FuelThreshold or self.DefenderDefault.FuelThreshold,60) +AI_A2G_Fsm:SetDamageThreshold(self.DefenderDefault.DamageThreshold) +AI_A2G_Fsm:SetDisengageRadius(self.DisengageRadius) +AI_A2G_Fsm:Start() +self:SetDefenderTask(SquadronName,DefenderGroup,DefenseTaskType,AI_A2G_Fsm,AttackerDetection,DefenderGrouping) +function AI_A2G_Fsm:onafterTakeoff(DefenderGroup,From,Event,To) +self:F({"Defender Birth",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +local DefenderTarget=Dispatcher:GetDefenderTaskTarget(DefenderGroup) +self:F({DefenderTarget=DefenderTarget}) +if DefenderTarget then +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", wheels up.",DefenderGroup) +end +AI_A2G_Fsm:EngageRoute(DefenderTarget.Set) +end +end +function AI_A2G_Fsm:onafterEngageRoute(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"Engage Route",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if Squadron then +local FirstUnit=AttackSetUnit:GetRandomSurely() +if FirstUnit then +local Coordinate=FirstUnit:GetCoordinate() +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", on route to ground target at "..Coordinate:ToStringA2G(DefenderGroup),DefenderGroup) +end +else +return +end +end +self:GetParent(self).onafterEngageRoute(self,DefenderGroup,From,Event,To,AttackSetUnit) +end +function AI_A2G_Fsm:OnAfterEngage(DefenderGroup,From,Event,To,AttackSetUnit) +self:F({"Engage Route",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +local FirstUnit=AttackSetUnit:GetFirst() +if FirstUnit then +local Coordinate=FirstUnit:GetCoordinate() +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", engaging ground target at "..Coordinate:ToStringA2G(DefenderGroup),DefenderGroup) +end +end +end +function AI_A2G_Fsm:onafterRTB(DefenderGroup,From,Event,To) +self:F({"Defender RTB",DefenderGroup:GetName()}) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", returning to base.",DefenderGroup) +end +self:GetParent(self).onafterRTB(self,DefenderGroup,From,Event,To) +Dispatcher:ClearDefenderTaskTarget(DefenderGroup) +end +function AI_A2G_Fsm:onafterLostControl(DefenderGroup,From,Event,To) +self:F({"Defender LostControl",DefenderGroup:GetName()}) +self:GetParent(self).onafterHome(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=AI_A2G_Fsm:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,"Squadron "..Squadron.Name..", "..DefenderName.." lost control.") +end +if DefenderGroup:IsAboveRunway()then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +end +end +function AI_A2G_Fsm:onafterHome(DefenderGroup,From,Event,To,Action) +self:F({"Defender Home",DefenderGroup:GetName()}) +self:GetParent(self).onafterHome(self,DefenderGroup,From,Event,To) +local DefenderName=DefenderGroup:GetCallsign() +local Dispatcher=self:GetDispatcher() +local Squadron=Dispatcher:GetSquadronFromDefender(DefenderGroup) +if self.SetSendPlayerMessages then +Dispatcher:MessageToPlayers(Squadron,DefenderName..", landing at base.",DefenderGroup) +end +if Action and Action=="Destroy"then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +end +if Dispatcher:GetSquadronLanding(Squadron.Name)==AI_A2G_DISPATCHER.Landing.NearAirbase then +Dispatcher:RemoveDefenderFromSquadron(Squadron,DefenderGroup) +DefenderGroup:Destroy() +Dispatcher:ResourcePark(Squadron,DefenderGroup) +end +end +end +end +function AI_A2G_DISPATCHER:onafterEngage(From,Event,To,AttackerDetection,Defenders) +if Defenders then +for DefenderID,Defender in pairs(Defenders or{})do +local Fsm=self:GetDefenderTaskFsm(Defender) +Fsm:Engage(AttackerDetection.Set) +self:SetDefenderTaskTarget(Defender,AttackerDetection) +end +end +end +function AI_A2G_DISPATCHER:HasDefenseLine(DefenseCoordinate,DetectedItem) +local AttackCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local EvaluateDistance=AttackCoordinate:Get2DDistance(DefenseCoordinate) +local c1=DefenseCoordinate +local c2=AttackCoordinate +local a=c1.z-c2.z +local b=c2.x-c1.x +local c=c1.x*c2.z-c2.x*c1.z +local ok=true +for AttackItemID,CheckAttackItem in pairs(self.Detection:GetDetectedItems())do +if AttackItemID~=DetectedItem.ID then +local CheckAttackCoordinate=self.Detection:GetDetectedItemCoordinate(CheckAttackItem) +local x=CheckAttackCoordinate.x +local y=CheckAttackCoordinate.z +local r=5000 +local IntersectDistance=(math.abs(a*x+b*y+c))/math.sqrt(a*a+b*b) +self:F({IntersectDistance=IntersectDistance,x=x,y=y}) +local IntersectAttackDistance=CheckAttackCoordinate:Get2DDistance(DefenseCoordinate) +self:F({IntersectAttackDistance=IntersectAttackDistance,EvaluateDistance=EvaluateDistance}) +if IntersectDistance<r and IntersectAttackDistance<EvaluateDistance then +ok=false +break +end +end +end +return ok +end +function AI_A2G_DISPATCHER:onafterDefend(From,Event,To,DetectedItem,DefendersTotal,DefendersEngaged,DefendersMissing,DefenderFriendlies,DefenseTaskType) +self:F({From,Event,To,DetectedItem.Index,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing,DefenderFriendlies=DefenderFriendlies}) +DetectedItem.Type=DefenseTaskType +local AttackerSet=DetectedItem.Set +local AttackerUnit=AttackerSet:GetFirst() +if AttackerUnit and AttackerUnit:IsAlive()then +local AttackerCount=AttackerSet:Count() +local DefenderCount=0 +for DefenderID,DefenderGroup in pairs(DefenderFriendlies or{})do +local DefenseCoordinate=DefenderGroup:GetCoordinate() +local HasDefenseLine=self:HasDefenseLine(DefenseCoordinate,DetectedItem) +if HasDefenseLine==true then +local SquadronName=self:GetDefenderTask(DefenderGroup).SquadronName +local SquadronOverhead=self:GetSquadronOverhead(SquadronName) +local Fsm=self:GetDefenderTaskFsm(DefenderGroup) +Fsm:EngageRoute(AttackerSet) +self:SetDefenderTaskTarget(DefenderGroup,DetectedItem) +local DefenderGroupSize=DefenderGroup:GetSize() +DefendersMissing=DefendersMissing-DefenderGroupSize/SquadronOverhead +DefendersTotal=DefendersTotal+DefenderGroupSize/SquadronOverhead +end +if DefendersMissing<=0 then +break +end +end +self:F({DefenderCount=DefenderCount,DefendersMissing=DefendersMissing}) +DefenderCount=DefendersMissing +local ClosestDistance=0 +local EngageSquadronName=nil +local BreakLoop=false +while(DefenderCount>0 and not BreakLoop)do +self:F({DefenderSquadrons=self.DefenderSquadrons}) +for SquadronName,DefenderSquadron in UTILS.rpairs(self.DefenderSquadrons or{})do +if DefenderSquadron[DefenseTaskType]then +local AirbaseCoordinate=DefenderSquadron.Airbase:GetCoordinate() +local AttackerCoord=AttackerUnit:GetCoordinate() +local InterceptCoord=DetectedItem.InterceptCoord +self:F({InterceptCoord=InterceptCoord}) +if InterceptCoord then +local InterceptDistance=AirbaseCoordinate:Get2DDistance(InterceptCoord) +local AirbaseDistance=AirbaseCoordinate:Get2DDistance(AttackerCoord) +self:F({InterceptDistance=InterceptDistance,AirbaseDistance=AirbaseDistance,InterceptCoord=InterceptCoord}) +if AirbaseDistance<=self.DefenseRadius then +local HasDefenseLine=self:HasDefenseLine(AirbaseCoordinate,DetectedItem) +if HasDefenseLine==true then +local EngageProbability=(DefenderSquadron.EngageProbability or 1) +local Probability=math.random() +if Probability<EngageProbability then +EngageSquadronName=SquadronName +break +end +end +end +end +end +end +if EngageSquadronName then +local DefenderSquadron,Defense=self:CanDefend(EngageSquadronName,DefenseTaskType) +if Defense then +local DefenderOverhead=DefenderSquadron.Overhead or self.DefenderDefault.Overhead +local DefenderGrouping=DefenderSquadron.Grouping or self.DefenderDefault.Grouping +local DefendersNeeded=math.ceil(DefenderCount*DefenderOverhead) +self:F({Overhead=DefenderOverhead,SquadronOverhead=DefenderSquadron.Overhead,DefaultOverhead=self.DefenderDefault.Overhead}) +self:F({Grouping=DefenderGrouping,SquadronGrouping=DefenderSquadron.Grouping,DefaultGrouping=self.DefenderDefault.Grouping}) +self:F({DefendersCount=DefenderCount,DefendersNeeded=DefendersNeeded}) +local DefendersLimit=DefenderSquadron.EngageLimit or self.DefenderDefault.EngageLimit +if DefendersLimit then +if DefendersTotal>=DefendersLimit then +DefendersNeeded=0 +BreakLoop=true +else +if DefendersTotal+DefendersNeeded>DefendersLimit then +DefendersNeeded=DefendersLimit-DefendersTotal +end +end +end +if DefenderSquadron.ResourceCount and DefendersNeeded>DefenderSquadron.ResourceCount then +DefendersNeeded=DefenderSquadron.ResourceCount +BreakLoop=true +end +while(DefendersNeeded>0)do +self:ResourceQueue(false,DefenderSquadron,DefendersNeeded,Defense,DefenseTaskType,DetectedItem,EngageSquadronName) +DefendersNeeded=DefendersNeeded-DefenderGrouping +DefenderCount=DefenderCount-DefenderGrouping/DefenderOverhead +end +else +BreakLoop=true +break +end +else +break +end +end +end +end +function AI_A2G_DISPATCHER:Evaluate_SEAD(DetectedItem) +self:F({DetectedItem.ItemID}) +local AttackerSet=DetectedItem.Set +local AttackerCount=AttackerSet:HasSEAD() +if(AttackerCount>0)then +local DefendersTotal,DefendersEngaged,DefendersMissing=self:CountDefendersEngaged(DetectedItem,AttackerCount) +self:F({AttackerCount=AttackerCount,DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +local DefenderGroups=self:CountDefenders(DetectedItem,DefendersEngaged,"SEAD") +if DetectedItem.IsDetected==true then +return DefendersTotal,DefendersEngaged,DefendersMissing,DefenderGroups +end +end +return 0,0,0 +end +function AI_A2G_DISPATCHER:Evaluate_CAS(DetectedItem) +self:F({DetectedItem.ItemID}) +local AttackerSet=DetectedItem.Set +local AttackerCount=AttackerSet:Count() +local AttackerRadarCount=AttackerSet:HasSEAD() +local IsFriendliesNearBy=self.Detection:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +local IsCas=(AttackerRadarCount==0)and(IsFriendliesNearBy==true) +if IsCas==true then +local DefendersTotal,DefendersEngaged,DefendersMissing=self:CountDefendersEngaged(DetectedItem,AttackerCount) +self:F({AttackerCount=AttackerCount,DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +local DefenderGroups=self:CountDefenders(DetectedItem,DefendersEngaged,"CAS") +if DetectedItem.IsDetected==true then +return DefendersTotal,DefendersEngaged,DefendersMissing,DefenderGroups +end +end +return 0,0,0 +end +function AI_A2G_DISPATCHER:Evaluate_BAI(DetectedItem) +self:F({DetectedItem.ItemID}) +local AttackerSet=DetectedItem.Set +local AttackerCount=AttackerSet:Count() +local AttackerRadarCount=AttackerSet:HasSEAD() +local IsFriendliesNearBy=self.Detection:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +local IsBai=(AttackerRadarCount==0)and(IsFriendliesNearBy==false) +if IsBai==true then +local DefendersTotal,DefendersEngaged,DefendersMissing=self:CountDefendersEngaged(DetectedItem,AttackerCount) +self:F({AttackerCount=AttackerCount,DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +local DefenderGroups=self:CountDefenders(DetectedItem,DefendersEngaged,"BAI") +if DetectedItem.IsDetected==true then +return DefendersTotal,DefendersEngaged,DefendersMissing,DefenderGroups +end +end +return 0,0,0 +end +function AI_A2G_DISPATCHER:Keys(DetectedItem) +self:F({DetectedItem=DetectedItem}) +local AttackCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local ShortestDistance=999999999 +for DefenseCoordinateName,DefenseCoordinate in pairs(self.DefenseCoordinates)do +local DefenseCoordinate=DefenseCoordinate +local EvaluateDistance=AttackCoordinate:Get2DDistance(DefenseCoordinate) +if EvaluateDistance<=ShortestDistance then +ShortestDistance=EvaluateDistance +end +end +return ShortestDistance +end +function AI_A2G_DISPATCHER:Order(DetectedItem) +local AttackCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local ShortestDistance=999999999 +for DefenseCoordinateName,DefenseCoordinate in pairs(self.DefenseCoordinates)do +local DefenseCoordinate=DefenseCoordinate +local EvaluateDistance=AttackCoordinate:Get2DDistance(DefenseCoordinate) +if EvaluateDistance<=ShortestDistance then +ShortestDistance=EvaluateDistance +end +end +return ShortestDistance +end +function AI_A2G_DISPATCHER:ShowTacticalDisplay(Detection) +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local TaskReport=REPORT:New() +local DefenseTotal=0 +local Report=REPORT:New("\nTactical Overview") +local DefenderGroupCount=0 +local DefendersTotal=0 +for DetectedItemID,DetectedItem in UTILS.spairs(Detection:GetDetectedItems(),function(t,a,b)return self:Order(t[a])<self:Order(t[b])end)do +if not self.Detection:IsDetectedItemLocked(DetectedItem)==true then +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedCount=DetectedSet:Count() +local DetectedZone=DetectedItem.Zone +self:F({"Target ID",DetectedItem.ItemID}) +self:F({DefenseLimit=self.DefenseLimit,DefenseTotal=DefenseTotal}) +DetectedSet:Flush(self) +local DetectedID=DetectedItem.ID +local DetectionIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +local ThreatLevel=DetectedItem.Set:CalculateThreatLevelA2G() +Report:Add(string.format(" - %1s%s ( %04s ): ( #%02d - %-4s ) %s",(DetectedItem.IsDetected==true)and"!"or" ",DetectedItem.ItemID,DetectedItem.Index,DetectedItem.Set:Count(),DetectedItem.Type or" --- ",string.rep("■",ThreatLevel))) +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +local Defender=Defender +if DefenderTask.Target and DefenderTask.Target.Index==DetectedItem.Index then +if Defender:IsAlive()then +DefenderGroupCount=DefenderGroupCount+1 +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +Report:Add(string.format(" - %s ( %s - %s ): ( #%d ) F: %3d, D:%3d - %s", +Defender:GetName(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +end +end +Report:Add("\n - No Targets:") +local TaskCount=0 +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +TaskCount=TaskCount+1 +local Defender=Defender +if not DefenderTask.Target then +if Defender:IsAlive()then +local DefenderHasTask=Defender:HasTask() +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +DefenderGroupCount=DefenderGroupCount+1 +Report:Add(string.format(" - %s ( %s - %s ): ( #%d ) F: %3d, D:%3d - %s", +Defender:GetName(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +Report:Add(string.format("\n - %d Tasks - %d Defender Groups",TaskCount,DefenderGroupCount)) +Report:Add(string.format("\n - %d Queued Aircraft Launches",#self.DefenseQueue)) +for DefenseQueueID,DefenseQueueItem in pairs(self.DefenseQueue)do +local DefenseQueueItem=DefenseQueueItem +Report:Add(string.format(" - %s - %s",DefenseQueueItem.SquadronName,DefenseQueueItem.DefenderSquadron.TakeoffTime,DefenseQueueItem.DefenderSquadron.TakeoffInterval)) +end +Report:Add(string.format("\n - Squadron Resources: ",#self.DefenseQueue)) +for DefenderSquadronName,DefenderSquadron in pairs(self.DefenderSquadrons)do +Report:Add(string.format(" - %s - %s",DefenderSquadronName,DefenderSquadron.ResourceCount and tostring(DefenderSquadron.ResourceCount)or"n/a")) +end +self:F(Report:Text("\n")) +trigger.action.outText(Report:Text("\n"),25) +end +function AI_A2G_DISPATCHER:ProcessDetected(Detection) +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local TaskReport=REPORT:New() +local DefenseTotal=0 +for DefenderGroup,DefenderTask in pairs(self:GetDefenderTasks())do +local DefenderGroup=DefenderGroup +local DefenderTaskFsm=self:GetDefenderTaskFsm(DefenderGroup) +if not DefenderGroup:IsAlive()then +self:F({Defender=DefenderGroup:GetName(),DefenderState=DefenderTaskFsm:GetState()}) +if not DefenderTaskFsm:Is("Started")then +self:ClearDefenderTask(DefenderGroup) +end +else +if DefenderTask.Target then +self:F({TargetIndex=DefenderTask.Target.Index}) +local AttackerItem=Detection:GetDetectedItemByIndex(DefenderTask.Target.Index) +if not AttackerItem then +self:F({"Removing obsolete Target:",DefenderTask.Target.Index}) +self:ClearDefenderTaskTarget(DefenderGroup) +else +if DefenderTask.Target.Set then +local TargetCount=DefenderTask.Target.Set:Count() +if TargetCount==0 then +self:F({"All Targets destroyed in Target, removing:",DefenderTask.Target.Index}) +self:ClearDefenderTask(DefenderGroup) +end +end +end +end +end +end +local Report=REPORT:New("\nTactical Overview") +local DefenderGroupCount=0 +local DefendersTotal=0 +for DetectedDistance,DetectedItem in UTILS.kpairs(Detection:GetDetectedItems(),function(t)return self:Keys(t)end,function(t,a,b)return self:Order(t[a])<self:Order(t[b])end)do +if not self.Detection:IsDetectedItemLocked(DetectedItem)==true then +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedCount=DetectedSet:Count() +local DetectedZone=DetectedItem.Zone +self:F({"Target ID",DetectedItem.ItemID}) +self:F({DefenseLimit=self.DefenseLimit,DefenseTotal=DefenseTotal}) +DetectedSet:Flush(self) +local DetectedID=DetectedItem.ID +local DetectionIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +local AttackCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local EngageDefenses=nil +self:F({DetectedDistance=DetectedDistance,DefenseRadius=self.DefenseRadius}) +if DetectedDistance<=self.DefenseRadius then +self:F({DetectedApproach=self._DefenseApproach}) +if self._DefenseApproach==AI_A2G_DISPATCHER.DefenseApproach.Distance then +EngageDefenses=true +self:F({EngageDefenses=EngageDefenses}) +end +if self._DefenseApproach==AI_A2G_DISPATCHER.DefenseApproach.Random then +local DistanceProbability=(self.DefenseRadius/DetectedDistance*self.DefenseReactivity) +local DefenseProbability=math.random() +self:F({DistanceProbability=DistanceProbability,DefenseProbability=DefenseProbability}) +if DefenseProbability<=DistanceProbability/(300/30)then +EngageDefenses=true +end +end +end +self:F({EngageDefenses=EngageDefenses,DefenseLimit=self.DefenseLimit,DefenseTotal=DefenseTotal}) +if(EngageDefenses and(self.DefenseLimit and DefenseTotal<self.DefenseLimit)or not self.DefenseLimit)then +do +local DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies=self:Evaluate_SEAD(DetectedItem) +if DefendersMissing>0 then +self:F({DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +self:Defend(DetectedItem,DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies,"SEAD") +end +end +do +local DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies=self:Evaluate_CAS(DetectedItem) +if DefendersMissing>0 then +self:F({DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +self:Defend(DetectedItem,DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies,"CAS") +end +end +do +local DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies=self:Evaluate_BAI(DetectedItem) +if DefendersMissing>0 then +self:F({DefendersTotal=DefendersTotal,DefendersEngaged=DefendersEngaged,DefendersMissing=DefendersMissing}) +self:Defend(DetectedItem,DefendersTotal,DefendersEngaged,DefendersMissing,Friendlies,"BAI") +end +end +end +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +local Defender=Defender +if DefenderTask.Target and DefenderTask.Target.Index==DetectedItem.Index then +DefenseTotal=DefenseTotal+1 +end +end +for DefenseQueueID,DefenseQueueItem in pairs(self.DefenseQueue)do +local DefenseQueueItem=DefenseQueueItem +if DefenseQueueItem.AttackerDetection and DefenseQueueItem.AttackerDetection.Index and DefenseQueueItem.AttackerDetection.Index==DetectedItem.Index then +DefenseTotal=DefenseTotal+1 +end +end +if self.TacticalDisplay then +local ThreatLevel=DetectedItem.Set:CalculateThreatLevelA2G() +Report:Add(string.format(" - %1s%s ( %4s ): ( #%d - %4s ) %s",(DetectedItem.IsDetected==true)and"!"or" ",DetectedItem.ItemID,DetectedItem.Index,DetectedItem.Set:Count(),DetectedItem.Type or" --- ",string.rep("■",ThreatLevel))) +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +local Defender=Defender +if DefenderTask.Target and DefenderTask.Target.Index==DetectedItem.Index then +if Defender:IsAlive()then +DefenderGroupCount=DefenderGroupCount+1 +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +Report:Add(string.format(" - %s ( %s - %s ): ( #%d ) F: %3d, D:%3d - %s", +Defender:GetName(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +end +end +end +if self.TacticalDisplay then +Report:Add("\n - No Targets:") +local TaskCount=0 +for Defender,DefenderTask in pairs(self:GetDefenderTasks())do +TaskCount=TaskCount+1 +local Defender=Defender +if not DefenderTask.Target then +if Defender:IsAlive()then +local DefenderHasTask=Defender:HasTask() +local Fuel=Defender:GetFuelMin()*100 +local Damage=Defender:GetLife()/Defender:GetLife0()*100 +DefenderGroupCount=DefenderGroupCount+1 +Report:Add(string.format(" - %s ( %s - %s ): ( #%d ) F: %3d, D:%3d - %s", +Defender:GetName(), +DefenderTask.Type, +DefenderTask.Fsm:GetState(), +Defender:GetSize(), +Fuel, +Damage, +Defender:HasTask()==true and"Executing"or"Idle")) +end +end +end +Report:Add(string.format("\n - %d Tasks - %d Defender Groups",TaskCount,DefenderGroupCount)) +Report:Add(string.format("\n - %d Queued Aircraft Launches",#self.DefenseQueue)) +for DefenseQueueID,DefenseQueueItem in pairs(self.DefenseQueue)do +local DefenseQueueItem=DefenseQueueItem +Report:Add(string.format(" - %s - %s",DefenseQueueItem.SquadronName,DefenseQueueItem.DefenderSquadron.TakeoffTime,DefenseQueueItem.DefenderSquadron.TakeoffInterval)) +end +Report:Add(string.format("\n - Squadron Resources: ",#self.DefenseQueue)) +for DefenderSquadronName,DefenderSquadron in pairs(self.DefenderSquadrons)do +Report:Add(string.format(" - %s - %s",DefenderSquadronName,DefenderSquadron.ResourceCount and tostring(DefenderSquadron.ResourceCount)or"n/a")) +end +self:F(Report:Text("\n")) +trigger.action.outText(Report:Text("\n"),25) +end +return true +end +end +do +function AI_A2G_DISPATCHER:GetPlayerFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local PlayersNearBy=self.Detection:GetPlayersNearBy(DetectedItem) +local PlayerTypes={} +local PlayersCount=0 +if PlayersNearBy then +local DetectedThreatLevel=DetectedSet:CalculateThreatLevelA2G() +for PlayerUnitName,PlayerUnitData in pairs(PlayersNearBy)do +local PlayerUnit=PlayerUnitData +local PlayerName=PlayerUnit:GetPlayerName() +if PlayerUnit:IsAirPlane()and PlayerName~=nil then +local FriendlyUnitThreatLevel=PlayerUnit:GetThreatLevel() +PlayersCount=PlayersCount+1 +local PlayerType=PlayerUnit:GetTypeName() +PlayerTypes[PlayerName]=PlayerType +if DetectedThreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local PlayerTypesReport=REPORT:New() +if PlayersCount>0 then +for PlayerName,PlayerType in pairs(PlayerTypes)do +PlayerTypesReport:Add(string.format('"%s" in %s',PlayerName,PlayerType)) +end +else +PlayerTypesReport:Add("-") +end +return PlayersCount,PlayerTypesReport +end +function AI_A2G_DISPATCHER:GetFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local FriendlyUnitsNearBy=self.Detection:GetFriendliesNearBy(DetectedItem) +local FriendlyTypes={} +local FriendliesCount=0 +if FriendlyUnitsNearBy then +local DetectedThreatLevel=DetectedSet:CalculateThreatLevelA2G() +for FriendlyUnitName,FriendlyUnitData in pairs(FriendlyUnitsNearBy)do +local FriendlyUnit=FriendlyUnitData +if FriendlyUnit:IsAirPlane()then +local FriendlyUnitThreatLevel=FriendlyUnit:GetThreatLevel() +FriendliesCount=FriendliesCount+1 +local FriendlyType=FriendlyUnit:GetTypeName() +FriendlyTypes[FriendlyType]=FriendlyTypes[FriendlyType]and(FriendlyTypes[FriendlyType]+1)or 1 +if DetectedThreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local FriendlyTypesReport=REPORT:New() +if FriendliesCount>0 then +for FriendlyType,FriendlyTypeCount in pairs(FriendlyTypes)do +FriendlyTypesReport:Add(string.format("%d of %s",FriendlyTypeCount,FriendlyType)) +end +else +FriendlyTypesReport:Add("-") +end +return FriendliesCount,FriendlyTypesReport +end +function AI_A2G_DISPATCHER:SchedulerPatrol(SquadronName) +local PatrolTaskTypes={"SEAD","CAS","BAI"} +local PatrolTaskType=PatrolTaskTypes[math.random(1,3)] +self:Patrol(SquadronName,PatrolTaskType) +end +function AI_A2G_DISPATCHER:SetSendMessages(onoff) +self.SetSendPlayerMessages=onoff +end +end +function AI_A2G_DISPATCHER:AddToSquadron(Squadron,Amount) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount+Amount +end +self:T({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +end +function AI_A2G_DISPATCHER:RemoveFromSquadron(Squadron,Amount) +local Squadron=self:GetSquadron(Squadron) +if Squadron.ResourceCount then +Squadron.ResourceCount=Squadron.ResourceCount-Amount +end +self:T({Squadron=Squadron.Name,SquadronResourceCount=Squadron.ResourceCount}) +end +AI_PATROL_ZONE={ +ClassName="AI_PATROL_ZONE", +} +function AI_PATROL_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New()) +self.PatrolZone=PatrolZone +self.PatrolFloorAltitude=PatrolFloorAltitude +self.PatrolCeilingAltitude=PatrolCeilingAltitude +self.PatrolMinSpeed=PatrolMinSpeed +self.PatrolMaxSpeed=PatrolMaxSpeed +self.PatrolAltType=PatrolAltType or"BARO" +self:SetRefreshTimeInterval(30) +self.CheckStatus=true +self:ManageFuel(.2,60) +self:ManageDamage(1) +self.DetectedUnits={} +self:SetStartState("None") +self:AddTransition("*","Stop","Stopped") +self:AddTransition("None","Start","Patrolling") +self:AddTransition("Patrolling","Route","Patrolling") +self:AddTransition("*","Status","*") +self:AddTransition("*","Detect","*") +self:AddTransition("*","Detected","*") +self:AddTransition("*","RTB","Returning") +self:AddTransition("*","Reset","Patrolling") +self:AddTransition("*","Eject","*") +self:AddTransition("*","Crash","Crashed") +self:AddTransition("*","PilotDead","*") +return self +end +function AI_PATROL_ZONE:SetSpeed(PatrolMinSpeed,PatrolMaxSpeed) +self:F2({PatrolMinSpeed,PatrolMaxSpeed}) +self.PatrolMinSpeed=PatrolMinSpeed +self.PatrolMaxSpeed=PatrolMaxSpeed +end +function AI_PATROL_ZONE:SetAltitude(PatrolFloorAltitude,PatrolCeilingAltitude) +self:F2({PatrolFloorAltitude,PatrolCeilingAltitude}) +self.PatrolFloorAltitude=PatrolFloorAltitude +self.PatrolCeilingAltitude=PatrolCeilingAltitude +end +function AI_PATROL_ZONE:SetDetectionOn() +self:F2() +self.DetectOn=true +end +function AI_PATROL_ZONE:SetDetectionOff() +self:F2() +self.DetectOn=false +end +function AI_PATROL_ZONE:SetStatusOff() +self:F2() +self.CheckStatus=false +end +function AI_PATROL_ZONE:SetDetectionActivated() +self:F2() +self:ClearDetectedUnits() +self.DetectActivated=true +self:__Detect(-self.DetectInterval) +end +function AI_PATROL_ZONE:SetDetectionDeactivated() +self:F2() +self:ClearDetectedUnits() +self.DetectActivated=false +end +function AI_PATROL_ZONE:SetRefreshTimeInterval(Seconds) +self:F2() +if Seconds then +self.DetectInterval=Seconds +else +self.DetectInterval=30 +end +end +function AI_PATROL_ZONE:SetDetectionZone(DetectionZone) +self:F2() +if DetectionZone then +self.DetectZone=DetectionZone +else +self.DetectZone=nil +end +end +function AI_PATROL_ZONE:GetDetectedUnits() +self:F2() +return self.DetectedUnits +end +function AI_PATROL_ZONE:ClearDetectedUnits() +self:F2() +self.DetectedUnits={} +end +function AI_PATROL_ZONE:ManageFuel(PatrolFuelThresholdPercentage,PatrolOutOfFuelOrbitTime) +self.PatrolFuelThresholdPercentage=PatrolFuelThresholdPercentage +self.PatrolOutOfFuelOrbitTime=PatrolOutOfFuelOrbitTime +return self +end +function AI_PATROL_ZONE:ManageDamage(PatrolDamageThreshold) +self.PatrolManageDamage=true +self.PatrolDamageThreshold=PatrolDamageThreshold +return self +end +function AI_PATROL_ZONE:onafterStart(Controllable,From,Event,To) +self:F2() +self:__Route(1) +self:__Status(60) +self:SetDetectionActivated() +self:HandleEvent(EVENTS.PilotDead,self.OnPilotDead) +self:HandleEvent(EVENTS.Crash,self.OnCrash) +self:HandleEvent(EVENTS.Ejection,self.OnEjection) +Controllable:OptionROEHoldFire() +Controllable:OptionROTVertical() +self.Controllable:OnReSpawn( +function(PatrolGroup) +self:T("ReSpawn") +self:__Reset(1) +self:__Route(5) +end +) +self:SetDetectionOn() +end +function AI_PATROL_ZONE:onbeforeDetect(Controllable,From,Event,To) +return self.DetectOn and self.DetectActivated +end +function AI_PATROL_ZONE:onafterDetect(Controllable,From,Event,To) +local Detected=false +local DetectedTargets=Controllable:GetDetectedTargets() +for TargetID,Target in pairs(DetectedTargets or{})do +local TargetObject=Target.object +if TargetObject and TargetObject:isExist()and TargetObject.id_<50000000 then +local TargetUnit=UNIT:Find(TargetObject) +if TargetUnit and TargetUnit:IsAlive()then +local TargetUnitName=TargetUnit:GetName() +if self.DetectionZone then +if TargetUnit:IsInZone(self.DetectionZone)then +self:T({"Detected ",TargetUnit}) +if self.DetectedUnits[TargetUnit]==nil then +self.DetectedUnits[TargetUnit]=true +end +Detected=true +end +else +if self.DetectedUnits[TargetUnit]==nil then +self.DetectedUnits[TargetUnit]=true +end +Detected=true +end +end +end +end +self:__Detect(-self.DetectInterval) +if Detected==true then +self:__Detected(1.5) +end +end +function AI_PATROL_ZONE:_NewPatrolRoute(AIControllable) +local PatrolZone=AIControllable:GetState(AIControllable,"PatrolZone") +PatrolZone:__Route(1) +end +function AI_PATROL_ZONE:onafterRoute(Controllable,From,Event,To) +self:F2() +if From=="RTB"then +return +end +local life=self.Controllable:GetLife()or 0 +if self.Controllable:IsAlive()and life>1 then +local PatrolRoute={} +if self.Controllable:InAir()==false then +self:T("Not in the air, finding route path within PatrolZone") +local CurrentVec2=self.Controllable:GetVec2() +if not CurrentVec2 then return end +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToPatrolZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TakeOffParking, +COORDINATE.WaypointAction.FromParkingArea, +ToPatrolZoneSpeed, +true +) +PatrolRoute[#PatrolRoute+1]=CurrentRoutePoint +else +self:T("In the air, finding route path within PatrolZone") +local CurrentVec2=self.Controllable:GetVec2() +if not CurrentVec2 then return end +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToPatrolZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +ToPatrolZoneSpeed, +true +) +PatrolRoute[#PatrolRoute+1]=CurrentRoutePoint +end +local ToTargetVec2=self.PatrolZone:GetRandomVec2() +self:T2(ToTargetVec2) +local ToTargetAltitude=math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude) +local ToTargetSpeed=math.random(self.PatrolMinSpeed,self.PatrolMaxSpeed) +self:T2({self.PatrolMinSpeed,self.PatrolMaxSpeed,ToTargetSpeed}) +local ToTargetPointVec3=COORDINATE:New(ToTargetVec2.x,ToTargetAltitude,ToTargetVec2.y) +local ToTargetRoutePoint=ToTargetPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +ToTargetSpeed, +true +) +PatrolRoute[#PatrolRoute+1]=ToTargetRoutePoint +self.Controllable:WayPointInitialize(PatrolRoute) +self.Controllable:SetState(self.Controllable,"PatrolZone",self) +self.Controllable:WayPointFunction(#PatrolRoute,1,"AI_PATROL_ZONE:_NewPatrolRoute") +self.Controllable:WayPointExecute(1,2) +end +end +function AI_PATROL_ZONE:onbeforeStatus() +return self.CheckStatus +end +function AI_PATROL_ZONE:onafterStatus() +self:F2() +if self.Controllable and self.Controllable:IsAlive()then +local RTB=false +local Fuel=self.Controllable:GetFuelMin() +if Fuel<self.PatrolFuelThresholdPercentage then +self:T(self.Controllable:GetName().." is out of fuel:"..Fuel..", RTB!") +local OldAIControllable=self.Controllable +local OrbitTask=OldAIControllable:TaskOrbitCircle(math.random(self.PatrolFloorAltitude,self.PatrolCeilingAltitude),self.PatrolMinSpeed) +local TimedOrbitTask=OldAIControllable:TaskControlled(OrbitTask,OldAIControllable:TaskCondition(nil,nil,nil,nil,self.PatrolOutOfFuelOrbitTime,nil)) +OldAIControllable:SetTask(TimedOrbitTask,10) +RTB=true +end +local Damage=self.Controllable:GetLife() +if Damage<=self.PatrolDamageThreshold then +self:T(self.Controllable:GetName().." is damaged:"..Damage..", RTB!") +RTB=true +end +if self:IsInstanceOf("AI_CAS")or self:IsInstanceOf("AI_BAI")then +local atotal,shells,rockets,bombs,missiles=self.Controllable:GetAmmunition() +local arelevant=rockets+bombs +if arelevant==0 or missiles==0 then +RTB=true +self:T({total=atotal,shells=shells,rockets=rockets,bombs=bombs,missiles=missiles}) +self:T(self.Controllable:GetName().." is out of ammo, RTB!") +end +end +if RTB==true then +self:RTB() +else +self:__Status(60) +end +end +end +function AI_PATROL_ZONE:onafterRTB() +self:F2() +if self.Controllable and self.Controllable:IsAlive()then +self:SetDetectionOff() +self.CheckStatus=false +local PatrolRoute={} +local CurrentVec2=self.Controllable:GetVec2() +if not CurrentVec2 then return end +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToPatrolZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +ToPatrolZoneSpeed, +true +) +PatrolRoute[#PatrolRoute+1]=CurrentRoutePoint +self.Controllable:WayPointInitialize(PatrolRoute) +self.Controllable:WayPointExecute(1,1) +end +end +function AI_PATROL_ZONE:onafterDead() +self:SetDetectionOff() +self:SetStatusOff() +end +function AI_PATROL_ZONE:OnCrash(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +if#self.Controllable:GetUnits()==1 then +self:__Crash(1,EventData) +end +end +end +function AI_PATROL_ZONE:OnEjection(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +self:__Eject(1,EventData) +end +end +function AI_PATROL_ZONE:OnPilotDead(EventData) +if self.Controllable:IsAlive()and EventData.IniDCSGroupName==self.Controllable:GetName()then +self:__PilotDead(1,EventData) +end +end +AI_CAP_ZONE={ +ClassName="AI_CAP_ZONE", +} +function AI_CAP_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType) +local self=BASE:Inherit(self,AI_PATROL_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType)) +self.Accomplished=false +self.Engaging=false +self:AddTransition({"Patrolling","Engaging"},"Engage","Engaging") +self:AddTransition("Engaging","Fired","Engaging") +self:AddTransition("*","Destroy","*") +self:AddTransition("Engaging","Abort","Patrolling") +self:AddTransition("Engaging","Accomplish","Patrolling") +return self +end +function AI_CAP_ZONE:SetEngageZone(EngageZone) +self:F2() +if EngageZone then +self.EngageZone=EngageZone +else +self.EngageZone=nil +end +end +function AI_CAP_ZONE:SetEngageRange(EngageRange) +self:F2() +if EngageRange then +self.EngageRange=EngageRange +else +self.EngageRange=nil +end +end +function AI_CAP_ZONE:onafterStart(Controllable,From,Event,To) +self:GetParent(self).onafterStart(self,Controllable,From,Event,To) +self:HandleEvent(EVENTS.Dead) +end +function AI_CAP_ZONE.EngageRoute(EngageGroup,Fsm) +EngageGroup:F({"AI_CAP_ZONE.EngageRoute:",EngageGroup:GetName()}) +if EngageGroup:IsAlive()then +Fsm:__Engage(1) +end +end +function AI_CAP_ZONE:onbeforeEngage(Controllable,From,Event,To) +if self.Accomplished==true then +return false +end +end +function AI_CAP_ZONE:onafterDetected(Controllable,From,Event,To) +if From~="Engaging"then +local Engage=false +for DetectedUnit,Detected in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnit +self:T(DetectedUnit) +if DetectedUnit:IsAlive()and DetectedUnit:IsAir()then +Engage=true +break +end +end +if Engage==true then +self:F('Detected -> Engaging') +self:__Engage(1) +end +end +end +function AI_CAP_ZONE:onafterAbort(Controllable,From,Event,To) +Controllable:ClearTasks() +self:__Route(1) +end +function AI_CAP_ZONE:onafterEngage(Controllable,From,Event,To) +if Controllable and Controllable:IsAlive()then +local EngageRoute={} +local CurrentVec2=self.Controllable:GetVec2() +if not CurrentVec2 then return self end +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToEngageZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +ToEngageZoneSpeed, +true +) +EngageRoute[#EngageRoute+1]=CurrentRoutePoint +local ToTargetVec2=self.PatrolZone:GetRandomVec2() +self:T2(ToTargetVec2) +local ToTargetAltitude=math.random(self.EngageFloorAltitude,self.EngageCeilingAltitude) +local ToTargetSpeed=math.random(self.PatrolMinSpeed,self.PatrolMaxSpeed) +self:T2({self.PatrolMinSpeed,self.PatrolMaxSpeed,ToTargetSpeed}) +local ToTargetPointVec3=COORDINATE:New(ToTargetVec2.x,ToTargetAltitude,ToTargetVec2.y) +local ToPatrolRoutePoint=ToTargetPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +ToTargetSpeed, +true +) +EngageRoute[#EngageRoute+1]=ToPatrolRoutePoint +Controllable:OptionROEOpenFire() +Controllable:OptionROTEvadeFire() +local AttackTasks={} +for DetectedUnit,Detected in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnit +self:T({DetectedUnit,DetectedUnit:IsAlive(),DetectedUnit:IsAir()}) +if DetectedUnit:IsAlive()and DetectedUnit:IsAir()then +if self.EngageZone then +if DetectedUnit:IsInZone(self.EngageZone)then +self:F({"Within Zone and Engaging ",DetectedUnit}) +AttackTasks[#AttackTasks+1]=Controllable:TaskAttackUnit(DetectedUnit) +end +else +if self.EngageRange then +if DetectedUnit:GetPointVec3():Get2DDistance(Controllable:GetPointVec3())<=self.EngageRange then +self:F({"Within Range and Engaging",DetectedUnit}) +AttackTasks[#AttackTasks+1]=Controllable:TaskAttackUnit(DetectedUnit) +end +else +AttackTasks[#AttackTasks+1]=Controllable:TaskAttackUnit(DetectedUnit) +end +end +else +self.DetectedUnits[DetectedUnit]=nil +end +end +if#AttackTasks==0 then +self:F("No targets found -> Going back to Patrolling") +self:__Abort(1) +self:__Route(1) +self:SetDetectionActivated() +else +AttackTasks[#AttackTasks+1]=Controllable:TaskFunction("AI_CAP_ZONE.EngageRoute",self) +EngageRoute[1].task=Controllable:TaskCombo(AttackTasks) +self:SetDetectionDeactivated() +end +Controllable:Route(EngageRoute,0.5) +end +end +function AI_CAP_ZONE:onafterAccomplish(Controllable,From,Event,To) +self.Accomplished=true +self:SetDetectionOff() +end +function AI_CAP_ZONE:onafterDestroy(Controllable,From,Event,To,EventData) +if EventData.IniUnit then +self.DetectedUnits[EventData.IniUnit]=nil +end +end +function AI_CAP_ZONE:OnEventDead(EventData) +self:F({"EventDead",EventData}) +if EventData.IniDCSUnit then +if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit]then +self:__Destroy(1,EventData) +end +end +end +AI_CAS_ZONE={ +ClassName="AI_CAS_ZONE", +} +function AI_CAS_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageZone,PatrolAltType) +local self=BASE:Inherit(self,AI_PATROL_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType)) +self.EngageZone=EngageZone +self.Accomplished=false +self:SetDetectionZone(self.EngageZone) +self:AddTransition({"Patrolling","Engaging"},"Engage","Engaging") +self:AddTransition("Engaging","Target","Engaging") +self:AddTransition("Engaging","Fired","Engaging") +self:AddTransition("*","Destroy","*") +self:AddTransition("Engaging","Abort","Patrolling") +self:AddTransition("Engaging","Accomplish","Patrolling") +return self +end +function AI_CAS_ZONE:SetEngageZone(EngageZone) +self:F2() +if EngageZone then +self.EngageZone=EngageZone +else +self.EngageZone=nil +end +end +function AI_CAS_ZONE:onafterStart(Controllable,From,Event,To) +self:GetParent(self).onafterStart(self,Controllable,From,Event,To) +self:HandleEvent(EVENTS.Dead) +self:SetDetectionDeactivated() +end +function AI_CAS_ZONE.EngageRoute(EngageGroup,Fsm) +EngageGroup:F({"AI_CAS_ZONE.EngageRoute:",EngageGroup:GetName()}) +if EngageGroup:IsAlive()then +Fsm:__Engage(1,Fsm.EngageSpeed,Fsm.EngageAltitude,Fsm.EngageWeaponExpend,Fsm.EngageAttackQty,Fsm.EngageDirection) +end +end +function AI_CAS_ZONE:onbeforeEngage(Controllable,From,Event,To) +if self.Accomplished==true then +return false +end +end +function AI_CAS_ZONE:onafterTarget(Controllable,From,Event,To) +if Controllable:IsAlive()then +local AttackTasks={} +for DetectedUnit,Detected in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnit +if DetectedUnit:IsAlive()then +if DetectedUnit:IsInZone(self.EngageZone)then +if Detected==true then +self:F({"Target: ",DetectedUnit}) +self.DetectedUnits[DetectedUnit]=false +local AttackTask=Controllable:TaskAttackUnit(DetectedUnit,false,self.EngageWeaponExpend,self.EngageAttackQty,self.EngageDirection,self.EngageAltitude,nil) +self.Controllable:PushTask(AttackTask,1) +end +end +else +self.DetectedUnits[DetectedUnit]=nil +end +end +self:__Target(-10) +end +end +function AI_CAS_ZONE:onafterAbort(Controllable,From,Event,To) +Controllable:ClearTasks() +self:__Route(1) +end +function AI_CAS_ZONE:onafterEngage(Controllable,From,Event,To, +EngageSpeed, +EngageAltitude, +EngageWeaponExpend, +EngageAttackQty, +EngageDirection) +self:F("onafterEngage") +self.EngageSpeed=EngageSpeed or 400 +self.EngageAltitude=EngageAltitude or 2000 +self.EngageWeaponExpend=EngageWeaponExpend +self.EngageAttackQty=EngageAttackQty +self.EngageDirection=EngageDirection +if Controllable:IsAlive()then +Controllable:OptionROEOpenFire() +Controllable:OptionROTVertical() +local EngageRoute={} +local CurrentVec2=self.Controllable:GetVec2() +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToEngageZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +self.EngageSpeed, +true +) +EngageRoute[#EngageRoute+1]=CurrentRoutePoint +local AttackTasks={} +for DetectedUnit,Detected in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnit +self:T(DetectedUnit) +if DetectedUnit:IsAlive()then +if DetectedUnit:IsInZone(self.EngageZone)then +self:F({"Engaging ",DetectedUnit}) +AttackTasks[#AttackTasks+1]=Controllable:TaskAttackUnit(DetectedUnit, +true, +EngageWeaponExpend, +EngageAttackQty, +EngageDirection +) +end +else +self.DetectedUnits[DetectedUnit]=nil +end +end +AttackTasks[#AttackTasks+1]=Controllable:TaskFunction("AI_CAS_ZONE.EngageRoute",self) +EngageRoute[#EngageRoute].task=Controllable:TaskCombo(AttackTasks) +local ToTargetVec2=self.EngageZone:GetRandomVec2() +self:T2(ToTargetVec2) +local ToTargetPointVec3=COORDINATE:New(ToTargetVec2.x,self.EngageAltitude,ToTargetVec2.y) +local ToTargetRoutePoint=ToTargetPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +self.EngageSpeed, +true +) +EngageRoute[#EngageRoute+1]=ToTargetRoutePoint +Controllable:Route(EngageRoute,0.5) +self:SetRefreshTimeInterval(2) +self:SetDetectionActivated() +self:__Target(-2) +end +end +function AI_CAS_ZONE:onafterAccomplish(Controllable,From,Event,To) +self.Accomplished=true +self:SetDetectionDeactivated() +end +function AI_CAS_ZONE:onafterDestroy(Controllable,From,Event,To,EventData) +if EventData.IniUnit then +self.DetectedUnits[EventData.IniUnit]=nil +end +end +function AI_CAS_ZONE:OnEventDead(EventData) +self:F({"EventDead",EventData}) +if EventData.IniDCSUnit then +if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit]then +self:__Destroy(1,EventData) +end +end +end +AI_BAI_ZONE={ +ClassName="AI_BAI_ZONE", +} +function AI_BAI_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,EngageZone,PatrolAltType) +local self=BASE:Inherit(self,AI_PATROL_ZONE:New(PatrolZone,PatrolFloorAltitude,PatrolCeilingAltitude,PatrolMinSpeed,PatrolMaxSpeed,PatrolAltType)) +self.EngageZone=EngageZone +self.Accomplished=false +self:SetDetectionZone(self.EngageZone) +self:SearchOn() +self:AddTransition({"Patrolling","Engaging"},"Engage","Engaging") +self:AddTransition("Engaging","Target","Engaging") +self:AddTransition("Engaging","Fired","Engaging") +self:AddTransition("*","Destroy","*") +self:AddTransition("Engaging","Abort","Patrolling") +self:AddTransition("Engaging","Accomplish","Patrolling") +return self +end +function AI_BAI_ZONE:SetEngageZone(EngageZone) +self:F2() +if EngageZone then +self.EngageZone=EngageZone +else +self.EngageZone=nil +end +end +function AI_BAI_ZONE:SearchOnOff(Search) +self.Search=Search +return self +end +function AI_BAI_ZONE:SearchOff() +self:SearchOnOff(false) +return self +end +function AI_BAI_ZONE:SearchOn() +self:SearchOnOff(true) +return self +end +function AI_BAI_ZONE:onafterStart(Controllable,From,Event,To) +self:GetParent(self).onafterStart(self,Controllable,From,Event,To) +self:HandleEvent(EVENTS.Dead) +self:SetDetectionDeactivated() +end +function _NewEngageRoute(AIControllable) +AIControllable:T("NewEngageRoute") +local EngageZone=AIControllable:GetState(AIControllable,"EngageZone") +EngageZone:__Engage(1,EngageZone.EngageSpeed,EngageZone.EngageAltitude,EngageZone.EngageWeaponExpend,EngageZone.EngageAttackQty,EngageZone.EngageDirection) +end +function AI_BAI_ZONE:onbeforeEngage(Controllable,From,Event,To) +if self.Accomplished==true then +return false +end +end +function AI_BAI_ZONE:onafterTarget(Controllable,From,Event,To) +self:F({"onafterTarget",self.Search,Controllable:IsAlive()}) +if Controllable:IsAlive()then +local AttackTasks={} +if self.Search==true then +for DetectedUnit,Detected in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnit +if DetectedUnit:IsAlive()then +if DetectedUnit:IsInZone(self.EngageZone)then +if Detected==true then +self:F({"Target: ",DetectedUnit}) +self.DetectedUnits[DetectedUnit]=false +local AttackTask=Controllable:TaskAttackUnit(DetectedUnit,false,self.EngageWeaponExpend,self.EngageAttackQty,self.EngageDirection,self.EngageAltitude,nil) +self.Controllable:PushTask(AttackTask,1) +end +end +else +self.DetectedUnits[DetectedUnit]=nil +end +end +else +self:F("Attack zone") +local AttackTask=Controllable:TaskAttackMapObject( +self.EngageZone:GetPointVec2():GetVec2(), +true, +self.EngageWeaponExpend, +self.EngageAttackQty, +self.EngageDirection, +self.EngageAltitude +) +self.Controllable:PushTask(AttackTask,1) +end +self:__Target(-10) +end +end +function AI_BAI_ZONE:onafterAbort(Controllable,From,Event,To) +Controllable:ClearTasks() +self:__Route(1) +end +function AI_BAI_ZONE:onafterEngage(Controllable,From,Event,To, +EngageSpeed, +EngageAltitude, +EngageWeaponExpend, +EngageAttackQty, +EngageDirection) +self:F("onafterEngage") +self.EngageSpeed=EngageSpeed or 400 +self.EngageAltitude=EngageAltitude or 2000 +self.EngageWeaponExpend=EngageWeaponExpend +self.EngageAttackQty=EngageAttackQty +self.EngageDirection=EngageDirection +if Controllable:IsAlive()then +local EngageRoute={} +local CurrentVec2=self.Controllable:GetVec2() +local CurrentAltitude=self.Controllable:GetAltitude() +local CurrentPointVec3=COORDINATE:New(CurrentVec2.x,CurrentAltitude,CurrentVec2.y) +local ToEngageZoneSpeed=self.PatrolMaxSpeed +local CurrentRoutePoint=CurrentPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +self.EngageSpeed, +true +) +EngageRoute[#EngageRoute+1]=CurrentRoutePoint +local AttackTasks={} +if self.Search==true then +for DetectedUnitID,DetectedUnitData in pairs(self.DetectedUnits)do +local DetectedUnit=DetectedUnitData +self:T(DetectedUnit) +if DetectedUnit:IsAlive()then +if DetectedUnit:IsInZone(self.EngageZone)then +self:F({"Engaging ",DetectedUnit}) +AttackTasks[#AttackTasks+1]=Controllable:TaskBombing( +DetectedUnit:GetPointVec2():GetVec2(), +true, +EngageWeaponExpend, +EngageAttackQty, +EngageDirection, +EngageAltitude +) +end +else +self.DetectedUnits[DetectedUnit]=nil +end +end +else +self:F("Attack zone") +AttackTasks[#AttackTasks+1]=Controllable:TaskAttackMapObject( +self.EngageZone:GetPointVec2():GetVec2(), +true, +EngageWeaponExpend, +EngageAttackQty, +EngageDirection, +EngageAltitude +) +end +EngageRoute[#EngageRoute].task=Controllable:TaskCombo(AttackTasks) +local ToTargetVec2=self.EngageZone:GetRandomVec2() +self:T2(ToTargetVec2) +local ToTargetPointVec3=COORDINATE:New(ToTargetVec2.x,self.EngageAltitude,ToTargetVec2.y) +local ToTargetRoutePoint=ToTargetPointVec3:WaypointAir( +self.PatrolAltType, +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +self.EngageSpeed, +true +) +EngageRoute[#EngageRoute+1]=ToTargetRoutePoint +Controllable:OptionROEOpenFire() +Controllable:OptionROTVertical() +Controllable:WayPointInitialize(EngageRoute) +Controllable:SetState(Controllable,"EngageZone",self) +Controllable:WayPointFunction(#EngageRoute,1,"_NewEngageRoute") +Controllable:WayPointExecute(1) +self:SetRefreshTimeInterval(2) +self:SetDetectionActivated() +self:__Target(-2) +end +end +function AI_BAI_ZONE:onafterAccomplish(Controllable,From,Event,To) +self.Accomplished=true +self:SetDetectionDeactivated() +end +function AI_BAI_ZONE:onafterDestroy(Controllable,From,Event,To,EventData) +if EventData.IniUnit then +self.DetectedUnits[EventData.IniUnit]=nil +end +end +function AI_BAI_ZONE:OnEventDead(EventData) +self:F({"EventDead",EventData}) +if EventData.IniDCSUnit then +if self.DetectedUnits and self.DetectedUnits[EventData.IniUnit]then +self:__Destroy(1,EventData) +end +end +end +AI_FORMATION={ +ClassName="AI_FORMATION", +FollowName=nil, +FollowUnit=nil, +FollowGroupSet=nil, +FollowMode=1, +MODE={ +FOLLOW=1, +MISSION=2, +}, +FollowScheduler=nil, +OptionROE=AI.Option.Air.val.ROE.OPEN_FIRE, +OptionReactionOnThreat=AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, +dtFollow=0.5, +} +AI_FORMATION.__Enum={} +AI_FORMATION.__Enum.Formation={ +None=0, +Mission=1, +Line=2, +Trail=3, +Stack=4, +LeftLine=5, +RightLine=6, +LeftWing=7, +RightWing=8, +Vic=9, +Box=10, +} +AI_FORMATION.__Enum.Mode={ +Mission="M", +Formation="F", +Attack="A", +Reconnaissance="R", +} +AI_FORMATION.__Enum.ReportType={ +All="*", +Airborne="A", +GroundRadar="R", +Ground="G", +} +function AI_FORMATION:New(FollowUnit,FollowGroupSet,FollowName,FollowBriefing) +local self=BASE:Inherit(self,FSM_SET:New(FollowGroupSet)) +self:F({FollowUnit,FollowGroupSet,FollowName}) +self.FollowUnit=FollowUnit +self.FollowGroupSet=FollowGroupSet +self.FollowGroupSet:ForEachGroup( +function(FollowGroup) +FollowGroup:SetState(self,"Mode",self.__Enum.Mode.Formation) +end +) +self:SetFlightModeFormation() +self:SetFlightRandomization(2) +self:SetStartState("None") +self:AddTransition("*","Stop","Stopped") +self:AddTransition({"None","Stopped"},"Start","Following") +self:AddTransition("*","FormationLine","*") +self:AddTransition("*","FormationTrail","*") +self:AddTransition("*","FormationStack","*") +self:AddTransition("*","FormationLeftLine","*") +self:AddTransition("*","FormationRightLine","*") +self:AddTransition("*","FormationLeftWing","*") +self:AddTransition("*","FormationRightWing","*") +self:AddTransition("*","FormationCenterWing","*") +self:AddTransition("*","FormationVic","*") +self:AddTransition("*","FormationBox","*") +self:AddTransition("*","Follow","Following") +self:FormationLeftLine(500,0,250,250) +self.FollowName=FollowName +self.FollowBriefing=FollowBriefing +self.CT1=0 +self.GT1=0 +self.FollowMode=AI_FORMATION.MODE.MISSION +return self +end +function AI_FORMATION:SetFollowTimeInterval(dt) +self.dtFollow=dt or 0.5 +return self +end +function AI_FORMATION:TestSmokeDirectionVector(SmokeDirection) +self.SmokeDirectionVector=(SmokeDirection==true)and true or false +return self +end +function AI_FORMATION:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace,Formation) +self:F({FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace,Formation}) +XStart=XStart or self.XStart +XSpace=XSpace or self.XSpace +YStart=YStart or self.YStart +YSpace=YSpace or self.YSpace +ZStart=ZStart or self.ZStart +ZSpace=ZSpace or self.ZSpace +FollowGroupSet:Flush(self) +local FollowSet=FollowGroupSet:GetSet() +local i=1 +for FollowID,FollowGroup in pairs(FollowSet)do +local PointVec3=COORDINATE:New() +PointVec3:SetX(XStart+i*XSpace) +PointVec3:SetY(YStart+i*YSpace) +PointVec3:SetZ(ZStart+i*ZSpace) +local Vec3=PointVec3:GetVec3() +FollowGroup:SetState(self,"FormationVec3",Vec3) +i=i+1 +FollowGroup:SetState(FollowGroup,"Formation",Formation) +end +return self +end +function AI_FORMATION:onafterFormationTrail(FollowGroupSet,From,Event,To,XStart,XSpace,YStart) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,0,0,0,self.__Enum.Formation.Trail) +return self +end +function AI_FORMATION:onafterFormationStack(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,0,0,self.__Enum.Formation.Stack) +return self +end +function AI_FORMATION:onafterFormationLeftLine(FollowGroupSet,From,Event,To,XStart,YStart,ZStart,ZSpace) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,0,YStart,0,-ZStart,-ZSpace,self.__Enum.Formation.LeftLine) +return self +end +function AI_FORMATION:onafterFormationRightLine(FollowGroupSet,From,Event,To,XStart,YStart,ZStart,ZSpace) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,0,YStart,0,ZStart,ZSpace,self.__Enum.Formation.RightLine) +return self +end +function AI_FORMATION:onafterFormationLeftWing(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,ZStart,ZSpace) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,0,-ZStart,-ZSpace,self.__Enum.Formation.LeftWing) +return self +end +function AI_FORMATION:onafterFormationRightWing(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,ZStart,ZSpace) +self:onafterFormationLine(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,0,ZStart,ZSpace,self.__Enum.Formation.RightWing) +return self +end +function AI_FORMATION:onafterFormationCenterWing(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +local FollowSet=FollowGroupSet:GetSet() +local i=0 +for FollowID,FollowGroup in pairs(FollowSet)do +local PointVec3=COORDINATE:New() +local Side=(i%2==0)and 1 or-1 +local Row=i/2+1 +PointVec3:SetX(XStart+Row*XSpace) +PointVec3:SetY(YStart) +PointVec3:SetZ(Side*(ZStart+i*ZSpace)) +local Vec3=PointVec3:GetVec3() +FollowGroup:SetState(self,"FormationVec3",Vec3) +i=i+1 +FollowGroup:SetState(FollowGroup,"Formation",self.__Enum.Formation.Vic) +end +return self +end +function AI_FORMATION:onafterFormationVic(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +self:onafterFormationCenterWing(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +return self +end +function AI_FORMATION:onafterFormationBox(FollowGroupSet,From,Event,To,XStart,XSpace,YStart,YSpace,ZStart,ZSpace,ZLevels) +local FollowSet=FollowGroupSet:GetSet() +local i=0 +for FollowID,FollowGroup in pairs(FollowSet)do +local PointVec3=COORDINATE:New() +local ZIndex=i%ZLevels +local XIndex=math.floor(i/ZLevels) +local YIndex=math.floor(i/ZLevels) +PointVec3:SetX(XStart+XIndex*XSpace) +PointVec3:SetY(YStart+YIndex*YSpace) +PointVec3:SetZ(-ZStart-(ZSpace*ZLevels/2)+ZSpace*ZIndex) +local Vec3=PointVec3:GetVec3() +FollowGroup:SetState(self,"FormationVec3",Vec3) +i=i+1 +FollowGroup:SetState(FollowGroup,"Formation",self.__Enum.Formation.Box) +end +return self +end +function AI_FORMATION:SetFlightRandomization(FlightRandomization) +self.FlightRandomization=FlightRandomization +return self +end +function AI_FORMATION:GetFlightMode(FollowGroup) +if FollowGroup then +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Mission) +end +return FollowGroup:GetState(FollowGroup,"Mode") +end +function AI_FORMATION:SetFlightModeMission(FollowGroup) +if FollowGroup then +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Mission) +else +self.FollowGroupSet:ForSomeGroupAlive( +function(FollowGroup) +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Mission) +end +) +end +return self +end +function AI_FORMATION:SetFlightModeAttack(FollowGroup) +if FollowGroup then +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Attack) +else +self.FollowGroupSet:ForSomeGroupAlive( +function(FollowGroup) +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Attack) +end +) +end +return self +end +function AI_FORMATION:SetFlightModeFormation(FollowGroup) +if FollowGroup then +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Formation) +else +self.FollowGroupSet:ForSomeGroupAlive( +function(FollowGroup) +FollowGroup:SetState(FollowGroup,"PreviousMode",FollowGroup:GetState(FollowGroup,"Mode")) +FollowGroup:SetState(FollowGroup,"Mode",self.__Enum.Mode.Formation) +end +) +end +return self +end +function AI_FORMATION:onafterStop(FollowGroupSet,From,Event,To) +self:E("Stopping formation.") +end +function AI_FORMATION:onbeforeFollow(FollowGroupSet,From,Event,To) +if From=="Stopped"then +return false +end +return true +end +function AI_FORMATION:onenterFollowing(FollowGroupSet) +if self.FollowUnit:IsAlive()then +local ClientUnit=self.FollowUnit +local CT1,CT2,CV1,CV2 +CT1=ClientUnit:GetState(self,"CT1") +local CuVec3=ClientUnit:GetVec3() +if CT1==nil or CT1==0 then +ClientUnit:SetState(self,"CV1",CuVec3) +ClientUnit:SetState(self,"CT1",timer.getTime()) +else +CT1=ClientUnit:GetState(self,"CT1") +CT2=timer.getTime() +CV1=ClientUnit:GetState(self,"CV1") +CV2=CuVec3 +ClientUnit:SetState(self,"CT1",CT2) +ClientUnit:SetState(self,"CV1",CV2) +end +for _,_group in pairs(FollowGroupSet:GetSet())do +local group=_group +if group and group:IsAlive()then +self:FollowMe(group,ClientUnit,CT1,CV1,CT2,CV2) +end +end +self:__Follow(-self.dtFollow) +end +end +function AI_FORMATION:FollowMe(FollowGroup,ClientUnit,CT1,CV1,CT2,CV2) +if FollowGroup:GetState(FollowGroup,"Mode")==self.__Enum.Mode.Formation and not self:Is("Stopped")then +self:T({Mode=FollowGroup:GetState(FollowGroup,"Mode")}) +FollowGroup:OptionROTEvadeFire() +FollowGroup:OptionROEReturnFire() +local GroupUnit=FollowGroup:GetUnit(1) +local GuVec3=GroupUnit:GetVec3() +local FollowFormation=FollowGroup:GetState(self,"FormationVec3") +if FollowFormation then +local FollowDistance=FollowFormation.x +local GT1=GroupUnit:GetState(self,"GT1") +if CT1==nil or CT1==0 or GT1==nil or GT1==0 then +GroupUnit:SetState(self,"GV1",GuVec3) +GroupUnit:SetState(self,"GT1",timer.getTime()) +else +local CD=((CV2.x-CV1.x)^2+(CV2.y-CV1.y)^2+(CV2.z-CV1.z)^2)^0.5 +local CT=CT2-CT1 +local CS=(3600/CT)*(CD/1000)/3.6 +local CDv={x=CV2.x-CV1.x,y=CV2.y-CV1.y,z=CV2.z-CV1.z} +local Ca=math.atan2(CDv.x,CDv.z) +local GT1=GroupUnit:GetState(self,"GT1") +local GT2=timer.getTime() +local GV1=GroupUnit:GetState(self,"GV1") +local GV2=GuVec3 +GV2.x=GV2.x+math.random(-self.FlightRandomization/2,self.FlightRandomization/2) +GV2.y=GV2.y+math.random(-self.FlightRandomization/2,self.FlightRandomization/2) +GV2.z=GV2.z+math.random(-self.FlightRandomization/2,self.FlightRandomization/2) +GroupUnit:SetState(self,"GT1",GT2) +GroupUnit:SetState(self,"GV1",GV2) +local GD=((GV2.x-GV1.x)^2+(GV2.y-GV1.y)^2+(GV2.z-GV1.z)^2)^0.5 +local GT=GT2-GT1 +local GDv={x=GV2.x-CV1.x,y=GV2.y-CV1.y,z=GV2.z-CV1.z} +local Alpha_T=math.atan2(GDv.x,GDv.z)-math.atan2(CDv.x,CDv.z) +local Alpha_R=(Alpha_T<0)and Alpha_T+2*math.pi or Alpha_T +local Position=math.cos(Alpha_R) +local GD=((GDv.x)^2+(GDv.z)^2)^0.5 +local Distance=GD*Position+-CS*0.5 +local GV={x=GV2.x-CV2.x,y=GV2.y-CV2.y,z=GV2.z-CV2.z} +local GH2={x=GV2.x,y=CV2.y+FollowFormation.y,z=GV2.z} +local alpha=math.atan2(GV.x,GV.z) +local GVx=FollowFormation.z*math.cos(Ca)+FollowFormation.x*math.sin(Ca) +local GVz=FollowFormation.x*math.cos(Ca)-FollowFormation.z*math.sin(Ca) +local Inclination=(Distance+FollowFormation.x)/10 +if Inclination<-30 then +Inclination=-30 +end +local CVI={ +x=CV2.x+CS*10*math.sin(Ca), +y=GH2.y+Inclination, +z=CV2.z+CS*10*math.cos(Ca), +} +local DV={x=CV2.x-CVI.x,y=CV2.y-CVI.y,z=CV2.z-CVI.z} +local DVu={x=DV.x/FollowDistance,y=DV.y,z=DV.z/FollowDistance} +local GDV={x=CVI.x,y=CVI.y,z=CVI.z} +local ADDx=FollowFormation.x*math.cos(alpha)-FollowFormation.z*math.sin(alpha) +local ADDz=FollowFormation.z*math.cos(alpha)+FollowFormation.x*math.sin(alpha) +local GDV_Formation={ +x=GDV.x-GVx, +y=GDV.y, +z=GDV.z-GVz +} +if self.SmokeDirectionVector==true then +trigger.action.smoke(GDV,trigger.smokeColor.Green) +trigger.action.smoke(GDV_Formation,trigger.smokeColor.White) +end +local Time=120 +local Speed=-(Distance+FollowFormation.x)/Time +if Distance>-10000 then +Speed=-(Distance+FollowFormation.x)/60 +end +if Distance>-2500 then +Speed=-(Distance+FollowFormation.x)/20 +end +local GS=Speed+CS +FollowGroup:RouteToVec3(GDV_Formation,GS) +end +end +end +end +AI_ESCORT={ +ClassName="AI_ESCORT", +EscortName=nil, +EscortUnit=nil, +EscortGroup=nil, +EscortMode=1, +Targets={}, +FollowScheduler=nil, +ReportTargets=true, +OptionROE=AI.Option.Air.val.ROE.OPEN_FIRE, +OptionReactionOnThreat=AI.Option.Air.val.REACTION_ON_THREAT.ALLOW_ABORT_MISSION, +SmokeDirectionVector=false, +TaskPoints={} +} +AI_ESCORT.Detection=nil +function AI_ESCORT:New(EscortUnit,EscortGroupSet,EscortName,EscortBriefing) +local self=BASE:Inherit(self,AI_FORMATION:New(EscortUnit,EscortGroupSet,EscortName,EscortBriefing)) +self:F({EscortUnit,EscortGroupSet}) +self.PlayerUnit=self.FollowUnit +self.PlayerGroup=self.FollowUnit:GetGroup() +self.EscortName=EscortName +self.EscortGroupSet=EscortGroupSet +self.EscortGroupSet:SetSomeIteratorLimit(8) +self.EscortBriefing=EscortBriefing +self.Menu={} +self.Menu.HoldAtEscortPosition=self.Menu.HoldAtEscortPosition or{} +self.Menu.HoldAtLeaderPosition=self.Menu.HoldAtLeaderPosition or{} +self.Menu.Flare=self.Menu.Flare or{} +self.Menu.Smoke=self.Menu.Smoke or{} +self.Menu.Targets=self.Menu.Targets or{} +self.Menu.ROE=self.Menu.ROE or{} +self.Menu.ROT=self.Menu.ROT or{} +self.FollowDistance=100 +self.CT1=0 +self.GT1=0 +EscortGroupSet:ForEachGroup( +function(EscortGroup) +if not self.PlayerUnit._EscortGroups then +self.PlayerUnit._EscortGroups={} +end +if not self.PlayerUnit._EscortGroups[EscortGroup:GetName()]then +self.PlayerUnit._EscortGroups[EscortGroup:GetName()]={} +self.PlayerUnit._EscortGroups[EscortGroup:GetName()].EscortGroup=EscortGroup +self.PlayerUnit._EscortGroups[EscortGroup:GetName()].EscortName=self.EscortName +self.PlayerUnit._EscortGroups[EscortGroup:GetName()].Detection=self.Detection +end +end +) +self:SetFlightReportType(self.__Enum.ReportType.All) +return self +end +function AI_ESCORT:_InitFlightMenus() +self:SetFlightMenuJoinUp() +self:SetFlightMenuFormation("Trail") +self:SetFlightMenuFormation("Stack") +self:SetFlightMenuFormation("LeftLine") +self:SetFlightMenuFormation("RightLine") +self:SetFlightMenuFormation("LeftWing") +self:SetFlightMenuFormation("RightWing") +self:SetFlightMenuFormation("Vic") +self:SetFlightMenuFormation("Box") +self:SetFlightMenuHoldAtEscortPosition() +self:SetFlightMenuHoldAtLeaderPosition() +self:SetFlightMenuFlare() +self:SetFlightMenuSmoke() +self:SetFlightMenuROE() +self:SetFlightMenuROT() +self:SetFlightMenuTargets() +self:SetFlightMenuReportType() +end +function AI_ESCORT:_InitEscortMenus(EscortGroup) +EscortGroup.EscortMenu=MENU_GROUP:New(self.PlayerGroup,EscortGroup:GetCallsign(),self.MainMenu) +self:SetEscortMenuJoinUp(EscortGroup) +self:SetEscortMenuResumeMission(EscortGroup) +self:SetEscortMenuHoldAtEscortPosition(EscortGroup) +self:SetEscortMenuHoldAtLeaderPosition(EscortGroup) +self:SetEscortMenuFlare(EscortGroup) +self:SetEscortMenuSmoke(EscortGroup) +self:SetEscortMenuROE(EscortGroup) +self:SetEscortMenuROT(EscortGroup) +self:SetEscortMenuTargets(EscortGroup) +end +function AI_ESCORT:_InitEscortRoute(EscortGroup) +EscortGroup.MissionRoute=EscortGroup:GetTaskRoute() +end +function AI_ESCORT:onafterStart(EscortGroupSet) +self:F() +EscortGroupSet:ForEachGroup( +function(EscortGroup) +EscortGroup:WayPointInitialize() +EscortGroup:OptionROTVertical() +EscortGroup:OptionROEOpenFire() +end +) +local LeaderEscort=EscortGroupSet:GetFirst() +if LeaderEscort then +local Report=REPORT:New("Escort reporting:") +Report:Add("Joining Up "..EscortGroupSet:GetUnitTypeNames():Text(", ").." from "..LeaderEscort:GetCoordinate():ToString(self.PlayerUnit)) +LeaderEscort:MessageTypeToGroup(Report:Text(),MESSAGE.Type.Information,self.PlayerUnit) +end +self.Detection=DETECTION_AREAS:New(EscortGroupSet,5000) +self.Detection:InitDetectVisual(true) +self.Detection:InitDetectIRST(true) +self.Detection:InitDetectOptical(true) +self.Detection:InitDetectRadar(true) +self.Detection:InitDetectRWR(true) +self.Detection:SetAcceptRange(100000) +self.Detection:__Start(30) +self.MainMenu=MENU_GROUP:New(self.PlayerGroup,self.EscortName) +self.FlightMenu=MENU_GROUP:New(self.PlayerGroup,"Flight",self.MainMenu) +self:_InitFlightMenus() +self.EscortGroupSet:ForSomeGroupAlive( +function(EscortGroup) +self:_InitEscortMenus(EscortGroup) +self:_InitEscortRoute(EscortGroup) +self:SetFlightModeFormation(EscortGroup) +function EscortGroup:OnEventDeadOrCrash(EventData) +self:F({"EventDead",EventData}) +self.EscortMenu:Remove() +end +EscortGroup:HandleEvent(EVENTS.Dead,EscortGroup.OnEventDeadOrCrash) +EscortGroup:HandleEvent(EVENTS.Crash,EscortGroup.OnEventDeadOrCrash) +end +) +end +function AI_ESCORT:onafterStop(EscortGroupSet) +self:F() +EscortGroupSet:ForEachGroup( +function(EscortGroup) +EscortGroup:WayPointInitialize() +EscortGroup:OptionROTVertical() +EscortGroup:OptionROEOpenFire() +end +) +self.Detection:Stop() +self.MainMenu:Remove() +end +function AI_ESCORT:SetDetection(Detection) +self.Detection=Detection +self.EscortGroup.Detection=self.Detection +self.PlayerUnit._EscortGroups[self.EscortGroup:GetName()].Detection=self.EscortGroup.Detection +Detection:__Start(1) +end +function AI_ESCORT:TestSmokeDirectionVector(SmokeDirection) +self.SmokeDirectionVector=(SmokeDirection==true)and true or false +end +function AI_ESCORT:MenusHelicopters(XStart,XSpace,YStart,YSpace,ZStart,ZSpace,ZLevels) +self:F() +self.XStart=XStart or 50 +self.XSpace=XSpace or 50 +self.YStart=YStart or 50 +self.YSpace=YSpace or 50 +self.ZStart=ZStart or 50 +self.ZSpace=ZSpace or 50 +self.ZLevels=ZLevels or 10 +self:MenuJoinUp() +self:MenuFormationTrail(self.XStart,self.XSpace,self.YStart) +self:MenuFormationStack(self.XStart,self.XSpace,self.YStart,self.YSpace) +self:MenuFormationLeftLine(self.XStart,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationRightLine(self.XStart,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationLeftWing(self.XStart,self.XSpace,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationRightWing(self.XStart,self.XSpace,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationVic(self.XStart,self.XSpace,self.YStart,self.YSpace,self.ZStart,self.ZSpace) +self:MenuFormationBox(self.XStart,self.XSpace,self.YStart,self.YSpace,self.ZStart,self.ZSpace,self.ZLevels) +self:MenuHoldAtEscortPosition(30) +self:MenuHoldAtEscortPosition(100) +self:MenuHoldAtEscortPosition(500) +self:MenuHoldAtLeaderPosition(30,500) +self:MenuFlare() +self:MenuSmoke() +self:MenuTargets(60) +self:MenuAssistedAttack() +self:MenuROE() +self:MenuROT() +return self +end +function AI_ESCORT:MenusAirplanes(XStart,XSpace,YStart,YSpace,ZStart,ZSpace,ZLevels) +self:F() +self.XStart=XStart or 50 +self.XSpace=XSpace or 50 +self.YStart=YStart or 50 +self.YSpace=YSpace or 50 +self.ZStart=ZStart or 50 +self.ZSpace=ZSpace or 50 +self.ZLevels=ZLevels or 10 +self:MenuJoinUp() +self:MenuFormationTrail(self.XStart,self.XSpace,self.YStart) +self:MenuFormationStack(self.XStart,self.XSpace,self.YStart,self.YSpace) +self:MenuFormationLeftLine(self.XStart,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationRightLine(self.XStart,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationLeftWing(self.XStart,self.XSpace,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationRightWing(self.XStart,self.XSpace,self.YStart,self.ZStart,self.ZSpace) +self:MenuFormationVic(self.XStart,self.XSpace,self.YStart,self.YSpace,self.ZStart,self.ZSpace) +self:MenuFormationBox(self.XStart,self.XSpace,self.YStart,self.YSpace,self.ZStart,self.ZSpace,self.ZLevels) +self:MenuHoldAtEscortPosition(1000,500) +self:MenuHoldAtLeaderPosition(1000,500) +self:MenuFlare() +self:MenuSmoke() +self:MenuTargets(60) +self:MenuAssistedAttack() +self:MenuROE() +self:MenuROT() +return self +end +function AI_ESCORT:SetFlightMenuFormation(Formation) +local FormationID="Formation"..Formation +local MenuFormation=self.Menu[FormationID] +if MenuFormation then +local Arguments=MenuFormation.Arguments +local FlightMenuFormation=MENU_GROUP:New(self.PlayerGroup,"Formation",self.MainMenu) +local MenuFlightFormationID=MENU_GROUP_COMMAND:New(self.PlayerGroup,Formation,FlightMenuFormation, +function(self,Formation,...) +self.EscortGroupSet:ForSomeGroupAlive( +function(EscortGroup,self,Formation,Arguments) +if EscortGroup:IsAir()then +self:E({FormationID=FormationID}) +self[FormationID](self,unpack(Arguments)) +end +end,self,Formation,Arguments +) +end,self,Formation,Arguments +) +end +return self +end +function AI_ESCORT:MenuFormation(Formation,...) +local FormationID="Formation"..Formation +self.Menu[FormationID]=self.Menu[FormationID]or{} +self.Menu[FormationID].Arguments=arg +end +function AI_ESCORT:MenuFormationTrail(XStart,XSpace,YStart) +self:MenuFormation("Trail",XStart,XSpace,YStart) +return self +end +function AI_ESCORT:MenuFormationStack(XStart,XSpace,YStart,YSpace) +self:MenuFormation("Stack",XStart,XSpace,YStart,YSpace) +return self +end +function AI_ESCORT:MenuFormationLeftLine(XStart,YStart,ZStart,ZSpace) +self:MenuFormation("LeftLine",XStart,YStart,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationRightLine(XStart,YStart,ZStart,ZSpace) +self:MenuFormation("RightLine",XStart,YStart,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationLeftWing(XStart,XSpace,YStart,ZStart,ZSpace) +self:MenuFormation("LeftWing",XStart,XSpace,YStart,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationRightWing(XStart,XSpace,YStart,ZStart,ZSpace) +self:MenuFormation("RightWing",XStart,XSpace,YStart,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationCenterWing(XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +self:MenuFormation("CenterWing",XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationVic(XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +self:MenuFormation("Vic",XStart,XSpace,YStart,YSpace,ZStart,ZSpace) +return self +end +function AI_ESCORT:MenuFormationBox(XStart,XSpace,YStart,YSpace,ZStart,ZSpace,ZLevels) +self:MenuFormation("Box",XStart,XSpace,YStart,YSpace,ZStart,ZSpace,ZLevels) +return self +end +function AI_ESCORT:SetFlightMenuJoinUp() +if self.Menu.JoinUp==true then +local FlightMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",self.FlightMenu) +local FlightMenuJoinUp=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Join Up",FlightMenuReportNavigation,AI_ESCORT._FlightJoinUp,self) +end +end +function AI_ESCORT:SetEscortMenuJoinUp(EscortGroup) +if self.Menu.JoinUp==true then +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",EscortGroup.EscortMenu) +local EscortMenuJoinUp=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Join Up",EscortMenuReportNavigation,AI_ESCORT._JoinUp,self,EscortGroup) +end +end +end +function AI_ESCORT:MenuJoinUp() +self.Menu.JoinUp=true +return self +end +function AI_ESCORT:SetFlightMenuHoldAtEscortPosition() +for _,MenuHoldAtEscortPosition in pairs(self.Menu.HoldAtEscortPosition or{})do +local FlightMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",self.FlightMenu) +local FlightMenuHoldPosition=MENU_GROUP_COMMAND +:New( +self.PlayerGroup, +MenuHoldAtEscortPosition.MenuText, +FlightMenuReportNavigation, +AI_ESCORT._FlightHoldPosition, +self, +nil, +MenuHoldAtEscortPosition.Height, +MenuHoldAtEscortPosition.Speed +) +end +return self +end +function AI_ESCORT:SetEscortMenuHoldAtEscortPosition(EscortGroup) +for _,HoldAtEscortPosition in pairs(self.Menu.HoldAtEscortPosition or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",EscortGroup.EscortMenu) +local EscortMenuHoldPosition=MENU_GROUP_COMMAND +:New( +self.PlayerGroup, +HoldAtEscortPosition.MenuText, +EscortMenuReportNavigation, +AI_ESCORT._HoldPosition, +self, +EscortGroup, +EscortGroup, +HoldAtEscortPosition.Height, +HoldAtEscortPosition.Speed +) +end +end +return self +end +function AI_ESCORT:MenuHoldAtEscortPosition(Height,Speed,MenuTextFormat) +self:F({Height,Speed,MenuTextFormat}) +if not Height then +Height=30 +end +if not Speed then +Speed=0 +end +local MenuText="" +if not MenuTextFormat then +if Speed==0 then +MenuText=string.format("Hold at %d meter",Height) +else +MenuText=string.format("Hold at %d meter at %d",Height,Speed) +end +else +if Speed==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Speed) +end +end +self.Menu.HoldAtEscortPosition=self.Menu.HoldAtEscortPosition or{} +self.Menu.HoldAtEscortPosition[#self.Menu.HoldAtEscortPosition+1]={} +self.Menu.HoldAtEscortPosition[#self.Menu.HoldAtEscortPosition].Height=Height +self.Menu.HoldAtEscortPosition[#self.Menu.HoldAtEscortPosition].Speed=Speed +self.Menu.HoldAtEscortPosition[#self.Menu.HoldAtEscortPosition].MenuText=MenuText +return self +end +function AI_ESCORT:SetFlightMenuHoldAtLeaderPosition() +for _,MenuHoldAtLeaderPosition in pairs(self.Menu.HoldAtLeaderPosition or{})do +local FlightMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",self.FlightMenu) +local FlightMenuHoldAtLeaderPosition=MENU_GROUP_COMMAND +:New( +self.PlayerGroup, +MenuHoldAtLeaderPosition.MenuText, +FlightMenuReportNavigation, +AI_ESCORT._FlightHoldPosition, +self, +self.PlayerGroup, +MenuHoldAtLeaderPosition.Height, +MenuHoldAtLeaderPosition.Speed +) +end +return self +end +function AI_ESCORT:SetEscortMenuHoldAtLeaderPosition(EscortGroup) +for _,HoldAtLeaderPosition in pairs(self.Menu.HoldAtLeaderPosition or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",EscortGroup.EscortMenu) +local EscortMenuHoldAtLeaderPosition=MENU_GROUP_COMMAND +:New( +self.PlayerGroup, +HoldAtLeaderPosition.MenuText, +EscortMenuReportNavigation, +AI_ESCORT._HoldPosition, +self, +self.PlayerGroup, +EscortGroup, +HoldAtLeaderPosition.Height, +HoldAtLeaderPosition.Speed +) +end +end +return self +end +function AI_ESCORT:MenuHoldAtLeaderPosition(Height,Speed,MenuTextFormat) +self:F({Height,Speed,MenuTextFormat}) +if not Height then +Height=30 +end +if not Speed then +Speed=0 +end +local MenuText="" +if not MenuTextFormat then +if Speed==0 then +MenuText=string.format("Rejoin and hold at %d meter",Height) +else +MenuText=string.format("Rejoin and hold at %d meter at %d",Height,Speed) +end +else +if Speed==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Speed) +end +end +self.Menu.HoldAtLeaderPosition=self.Menu.HoldAtLeaderPosition or{} +self.Menu.HoldAtLeaderPosition[#self.Menu.HoldAtLeaderPosition+1]={} +self.Menu.HoldAtLeaderPosition[#self.Menu.HoldAtLeaderPosition].Height=Height +self.Menu.HoldAtLeaderPosition[#self.Menu.HoldAtLeaderPosition].Speed=Speed +self.Menu.HoldAtLeaderPosition[#self.Menu.HoldAtLeaderPosition].MenuText=MenuText +return self +end +function AI_ESCORT:MenuScanForTargets(Height,Seconds,MenuTextFormat) +self:F({Height,Seconds,MenuTextFormat}) +if self.EscortGroup:IsAir()then +if not self.EscortMenuScan then +self.EscortMenuScan=MENU_GROUP:New(self.PlayerGroup,"Scan for targets",self.EscortMenu) +end +if not Height then +Height=100 +end +if not Seconds then +Seconds=30 +end +local MenuText="" +if not MenuTextFormat then +if Seconds==0 then +MenuText=string.format("At %d meter",Height) +else +MenuText=string.format("At %d meter for %d seconds",Height,Seconds) +end +else +if Seconds==0 then +MenuText=string.format(MenuTextFormat,Height) +else +MenuText=string.format(MenuTextFormat,Height,Seconds) +end +end +if not self.EscortMenuScanForTargets then +self.EscortMenuScanForTargets={} +end +self.EscortMenuScanForTargets[#self.EscortMenuScanForTargets+1]=MENU_GROUP_COMMAND +:New( +self.PlayerGroup, +MenuText, +self.EscortMenuScan, +AI_ESCORT._ScanTargets, +self, +30 +) +end +return self +end +function AI_ESCORT:SetFlightMenuFlare() +for _,MenuFlare in pairs(self.Menu.Flare or{})do +local FlightMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",self.FlightMenu) +local FlightMenuFlare=MENU_GROUP:New(self.PlayerGroup,MenuFlare.MenuText,FlightMenuReportNavigation) +local FlightMenuFlareGreenFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release green flare",FlightMenuFlare,AI_ESCORT._FlightFlare,self,FLARECOLOR.Green,"Released a green flare!") +local FlightMenuFlareRedFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release red flare",FlightMenuFlare,AI_ESCORT._FlightFlare,self,FLARECOLOR.Red,"Released a red flare!") +local FlightMenuFlareWhiteFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release white flare",FlightMenuFlare,AI_ESCORT._FlightFlare,self,FLARECOLOR.White,"Released a white flare!") +local FlightMenuFlareYellowFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release yellow flare",FlightMenuFlare,AI_ESCORT._FlightFlare,self,FLARECOLOR.Yellow,"Released a yellow flare!") +end +return self +end +function AI_ESCORT:SetEscortMenuFlare(EscortGroup) +for _,MenuFlare in pairs(self.Menu.Flare or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",EscortGroup.EscortMenu) +local EscortMenuFlare=MENU_GROUP:New(self.PlayerGroup,MenuFlare.MenuText,EscortMenuReportNavigation) +local EscortMenuFlareGreen=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release green flare",EscortMenuFlare,AI_ESCORT._Flare,self,EscortGroup,FLARECOLOR.Green,"Released a green flare!") +local EscortMenuFlareRed=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release red flare",EscortMenuFlare,AI_ESCORT._Flare,self,EscortGroup,FLARECOLOR.Red,"Released a red flare!") +local EscortMenuFlareWhite=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release white flare",EscortMenuFlare,AI_ESCORT._Flare,self,EscortGroup,FLARECOLOR.White,"Released a white flare!") +local EscortMenuFlareYellow=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release yellow flare",EscortMenuFlare,AI_ESCORT._Flare,self,EscortGroup,FLARECOLOR.Yellow,"Released a yellow flare!") +end +end +return self +end +function AI_ESCORT:MenuFlare(MenuTextFormat) +self:F() +local MenuText="" +if not MenuTextFormat then +MenuText="Flare" +else +MenuText=MenuTextFormat +end +self.Menu.Flare=self.Menu.Flare or{} +self.Menu.Flare[#self.Menu.Flare+1]={} +self.Menu.Flare[#self.Menu.Flare].MenuText=MenuText +return self +end +function AI_ESCORT:SetFlightMenuSmoke() +for _,MenuSmoke in pairs(self.Menu.Smoke or{})do +local FlightMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",self.FlightMenu) +local FlightMenuSmoke=MENU_GROUP:New(self.PlayerGroup,MenuSmoke.MenuText,FlightMenuReportNavigation) +local FlightMenuSmokeGreenFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release green smoke",FlightMenuSmoke,AI_ESCORT._FlightSmoke,self,SMOKECOLOR.Green,"Releasing green smoke!") +local FlightMenuSmokeRedFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release red smoke",FlightMenuSmoke,AI_ESCORT._FlightSmoke,self,SMOKECOLOR.Red,"Releasing red smoke!") +local FlightMenuSmokeWhiteFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release white smoke",FlightMenuSmoke,AI_ESCORT._FlightSmoke,self,SMOKECOLOR.White,"Releasing white smoke!") +local FlightMenuSmokeOrangeFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release orange smoke",FlightMenuSmoke,AI_ESCORT._FlightSmoke,self,SMOKECOLOR.Orange,"Releasing orange smoke!") +local FlightMenuSmokeBlueFlight=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release blue smoke",FlightMenuSmoke,AI_ESCORT._FlightSmoke,self,SMOKECOLOR.Blue,"Releasing blue smoke!") +end +return self +end +function AI_ESCORT:SetEscortMenuSmoke(EscortGroup) +for _,MenuSmoke in pairs(self.Menu.Smoke or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuReportNavigation=MENU_GROUP:New(self.PlayerGroup,"Navigation",EscortGroup.EscortMenu) +local EscortMenuSmoke=MENU_GROUP:New(self.PlayerGroup,MenuSmoke.MenuText,EscortMenuReportNavigation) +local EscortMenuSmokeGreen=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release green smoke",EscortMenuSmoke,AI_ESCORT._Smoke,self,EscortGroup,SMOKECOLOR.Green,"Releasing green smoke!") +local EscortMenuSmokeRed=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release red smoke",EscortMenuSmoke,AI_ESCORT._Smoke,self,EscortGroup,SMOKECOLOR.Red,"Releasing red smoke!") +local EscortMenuSmokeWhite=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release white smoke",EscortMenuSmoke,AI_ESCORT._Smoke,self,EscortGroup,SMOKECOLOR.White,"Releasing white smoke!") +local EscortMenuSmokeOrange=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release orange smoke",EscortMenuSmoke,AI_ESCORT._Smoke,self,EscortGroup,SMOKECOLOR.Orange,"Releasing orange smoke!") +local EscortMenuSmokeBlue=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Release blue smoke",EscortMenuSmoke,AI_ESCORT._Smoke,self,EscortGroup,SMOKECOLOR.Blue,"Releasing blue smoke!") +end +end +return self +end +function AI_ESCORT:MenuSmoke(MenuTextFormat) +self:F() +local MenuText="" +if not MenuTextFormat then +MenuText="Smoke" +else +MenuText=MenuTextFormat +end +self.Menu.Smoke=self.Menu.Smoke or{} +self.Menu.Smoke[#self.Menu.Smoke+1]={} +self.Menu.Smoke[#self.Menu.Smoke].MenuText=MenuText +return self +end +function AI_ESCORT:SetFlightMenuReportType() +local FlightMenuReportTargets=MENU_GROUP:New(self.PlayerGroup,"Report targets",self.FlightMenu) +local MenuStamp=FlightMenuReportTargets:GetStamp() +local FlightReportType=self:GetFlightReportType() +if FlightReportType~=self.__Enum.ReportType.All then +local FlightMenuReportTargetsAll=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report all targets",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportTypeAll,self) +:SetTag("ReportType") +:SetStamp(MenuStamp) +end +if FlightReportType==self.__Enum.ReportType.All or FlightReportType~=self.__Enum.ReportType.Airborne then +local FlightMenuReportTargetsAirborne=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report airborne targets",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportTypeAirborne,self) +:SetTag("ReportType") +:SetStamp(MenuStamp) +end +if FlightReportType==self.__Enum.ReportType.All or FlightReportType~=self.__Enum.ReportType.GroundRadar then +local FlightMenuReportTargetsGroundRadar=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report gound radar targets",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportTypeGroundRadar,self) +:SetTag("ReportType") +:SetStamp(MenuStamp) +end +if FlightReportType==self.__Enum.ReportType.All or FlightReportType~=self.__Enum.ReportType.Ground then +local FlightMenuReportTargetsGround=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report ground targets",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportTypeGround,self) +:SetTag("ReportType") +:SetStamp(MenuStamp) +end +FlightMenuReportTargets:RemoveSubMenus(MenuStamp,"ReportType") +end +function AI_ESCORT:SetFlightMenuTargets() +local FlightMenuReportTargets=MENU_GROUP:New(self.PlayerGroup,"Report targets",self.FlightMenu) +local FlightMenuReportTargetsNow=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report targets now!",FlightMenuReportTargets,AI_ESCORT._FlightReportNearbyTargetsNow,self) +local FlightMenuReportTargetsOn=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report targets on",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportNearbyTargets,self,true) +local FlightMenuReportTargetsOff=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report targets off",FlightMenuReportTargets,AI_ESCORT._FlightSwitchReportNearbyTargets,self,false) +self.FlightMenuAttack=MENU_GROUP:New(self.PlayerGroup,"Attack targets",self.FlightMenu) +local FlightMenuAttackNearby=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Attack nearest targets",self.FlightMenuAttack,AI_ESCORT._FlightAttackNearestTarget,self):SetTag("Attack") +local FlightMenuAttackNearbyAir=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Attack nearest airborne targets",self.FlightMenuAttack,AI_ESCORT._FlightAttackNearestTarget,self,self.__Enum.ReportType.Air):SetTag("Attack") +local FlightMenuAttackNearbyGround=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Attack nearest ground targets",self.FlightMenuAttack,AI_ESCORT._FlightAttackNearestTarget,self,self.__Enum.ReportType.Ground):SetTag("Attack") +for _,MenuTargets in pairs(self.Menu.Targets or{})do +MenuTargets.FlightReportTargetsScheduler=SCHEDULER:New(self,self._FlightReportTargetsScheduler,{},MenuTargets.Interval,MenuTargets.Interval) +end +return self +end +function AI_ESCORT:SetEscortMenuTargets(EscortGroup) +for _,MenuTargets in pairs(self.Menu.Targets or{}or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +EscortGroup.EscortMenuReportNearbyTargetsNow=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Report targets",EscortGroup.EscortMenu,AI_ESCORT._ReportNearbyTargetsNow,self,EscortGroup,true) +EscortGroup.ReportTargetsScheduler=SCHEDULER:New(self,self._ReportTargetsScheduler,{EscortGroup},1,MenuTargets.Interval) +EscortGroup.ResumeScheduler=SCHEDULER:New(self,self._ResumeScheduler,{EscortGroup},1,60) +end +end +return self +end +function AI_ESCORT:MenuTargets(Seconds) +self:F({Seconds}) +if not Seconds then +Seconds=30 +end +self.Menu.Targets=self.Menu.Targets or{} +self.Menu.Targets[#self.Menu.Targets+1]={} +self.Menu.Targets[#self.Menu.Targets].Interval=Seconds +return self +end +function AI_ESCORT:MenuAssistedAttack() +self:F() +self.EscortGroupSet:ForSomeGroupAlive( +function(EscortGroup) +if not EscortGroup:IsAir()then +self.EscortMenuTargetAssistance=MENU_GROUP:New(self.PlayerGroup,"Request assistance from",EscortGroup.EscortMenu) +end +end +) +return self +end +function AI_ESCORT:SetFlightMenuROE() +for _,MenuROE in pairs(self.Menu.ROE or{})do +local FlightMenuROE=MENU_GROUP:New(self.PlayerGroup,"Rule Of Engagement",self.FlightMenu) +local FlightMenuROEHoldFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Hold fire",FlightMenuROE,AI_ESCORT._FlightROEHoldFire,self,"Holding weapons!") +local FlightMenuROEReturnFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Return fire",FlightMenuROE,AI_ESCORT._FlightROEReturnFire,self,"Returning fire!") +local FlightMenuROEOpenFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Open Fire",FlightMenuROE,AI_ESCORT._FlightROEOpenFire,self,"Open fire at designated targets!") +local FlightMenuROEWeaponFree=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Engage all targets",FlightMenuROE,AI_ESCORT._FlightROEWeaponFree,self,"Engaging all targets!") +end +return self +end +function AI_ESCORT:SetEscortMenuROE(EscortGroup) +for _,MenuROE in pairs(self.Menu.ROE or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuROE=MENU_GROUP:New(self.PlayerGroup,"Rule Of Engagement",EscortGroup.EscortMenu) +if EscortGroup:OptionROEHoldFirePossible()then +local EscortMenuROEHoldFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Hold fire",EscortMenuROE,AI_ESCORT._ROE,self,EscortGroup,EscortGroup.OptionROEHoldFire,"Holding weapons!") +end +if EscortGroup:OptionROEReturnFirePossible()then +local EscortMenuROEReturnFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Return fire",EscortMenuROE,AI_ESCORT._ROE,self,EscortGroup,EscortGroup.OptionROEReturnFire,"Returning fire!") +end +if EscortGroup:OptionROEOpenFirePossible()then +EscortGroup.EscortMenuROEOpenFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Open Fire",EscortMenuROE,AI_ESCORT._ROE,self,EscortGroup,EscortGroup.OptionROEOpenFire,"Opening fire on designated targets!!") +end +if EscortGroup:OptionROEWeaponFreePossible()then +EscortGroup.EscortMenuROEWeaponFree=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Engage all targets",EscortMenuROE,AI_ESCORT._ROE,self,EscortGroup,EscortGroup.OptionROEWeaponFree,"Opening fire on targets of opportunity!") +end +end +end +return self +end +function AI_ESCORT:MenuROE() +self:F() +self.Menu.ROE=self.Menu.ROE or{} +self.Menu.ROE[#self.Menu.ROE+1]={} +return self +end +function AI_ESCORT:SetFlightMenuROT() +for _,MenuROT in pairs(self.Menu.ROT or{})do +local FlightMenuROT=MENU_GROUP:New(self.PlayerGroup,"Reaction On Threat",self.FlightMenu) +local FlightMenuROTNoReaction=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Fight until death",FlightMenuROT,AI_ESCORT._FlightROTNoReaction,self,"Fighting until death!") +local FlightMenuROTPassiveDefense=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Use flares, chaff and jammers",FlightMenuROT,AI_ESCORT._FlightROTPassiveDefense,self,"Defending using jammers, chaff and flares!") +local FlightMenuROTEvadeFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Open fire",FlightMenuROT,AI_ESCORT._FlightROTEvadeFire,self,"Evading on enemy fire!") +local FlightMenuROTVertical=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Avoid radar and evade fire",FlightMenuROT,AI_ESCORT._FlightROTVertical,self,"Evading on enemy fire with vertical manoeuvres!") +end +return self +end +function AI_ESCORT:SetEscortMenuROT(EscortGroup) +for _,MenuROT in pairs(self.Menu.ROT or{})do +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +local EscortMenuROT=MENU_GROUP:New(self.PlayerGroup,"Reaction On Threat",EscortGroup.EscortMenu) +if not EscortGroup.EscortMenuEvasion then +if EscortGroup:OptionROTNoReactionPossible()then +local EscortMenuEvasionNoReaction=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Fight until death",EscortMenuROT,AI_ESCORT._ROT,self,EscortGroup,EscortGroup.OptionROTNoReaction,"Fighting until death!") +end +if EscortGroup:OptionROTPassiveDefensePossible()then +local EscortMenuEvasionPassiveDefense=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Use flares, chaff and jammers",EscortMenuROT,AI_ESCORT._ROT,self,EscortGroup,EscortGroup.OptionROTPassiveDefense,"Defending using jammers, chaff and flares!") +end +if EscortGroup:OptionROTEvadeFirePossible()then +local EscortMenuEvasionEvadeFire=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Open fire",EscortMenuROT,AI_ESCORT._ROT,self,EscortGroup,EscortGroup.OptionROTEvadeFire,"Evading on enemy fire!") +end +if EscortGroup:OptionROTVerticalPossible()then +local EscortMenuOptionEvasionVertical=MENU_GROUP_COMMAND:New(self.PlayerGroup,"Avoid radar and evade fire",EscortMenuROT,AI_ESCORT._ROT,self,EscortGroup,EscortGroup.OptionROTVertical,"Evading on enemy fire with vertical manoeuvres!") +end +end +end +end +return self +end +function AI_ESCORT:MenuROT(MenuTextFormat) +self:F(MenuTextFormat) +self.Menu.ROT=self.Menu.ROT or{} +self.Menu.ROT[#self.Menu.ROT+1]={} +return self +end +function AI_ESCORT:SetEscortMenuResumeMission(EscortGroup) +self:F() +if EscortGroup:IsAir()then +local EscortGroupName=EscortGroup:GetName() +EscortGroup.EscortMenuResumeMission=MENU_GROUP:New(self.PlayerGroup,"Resume from",EscortGroup.EscortMenu) +end +return self +end +function AI_ESCORT:_HoldPosition(OrbitGroup,EscortGroup,OrbitHeight,OrbitSeconds) +local EscortUnit=self.PlayerUnit +local OrbitUnit=OrbitGroup:GetUnit(1) +self:SetFlightModeMission(EscortGroup) +local PointFrom={} +local GroupVec3=EscortGroup:GetUnit(1):GetVec3() +PointFrom={} +PointFrom.x=GroupVec3.x +PointFrom.y=GroupVec3.z +PointFrom.speed=250 +PointFrom.type=AI.Task.WaypointType.TURNING_POINT +PointFrom.alt=GroupVec3.y +PointFrom.alt_type=AI.Task.AltitudeType.BARO +local OrbitPoint=OrbitUnit:GetVec2() +local PointTo={} +PointTo.x=OrbitPoint.x +PointTo.y=OrbitPoint.y +PointTo.speed=250 +PointTo.type=AI.Task.WaypointType.TURNING_POINT +PointTo.alt=OrbitHeight +PointTo.alt_type=AI.Task.AltitudeType.BARO +PointTo.task=EscortGroup:TaskOrbitCircleAtVec2(OrbitPoint,OrbitHeight,0) +local Points={PointFrom,PointTo} +EscortGroup:OptionROEHoldFire() +EscortGroup:OptionROTPassiveDefense() +EscortGroup:SetTask(EscortGroup:TaskRoute(Points),1) +EscortGroup:MessageTypeToGroup("Orbiting at current location.",MESSAGE.Type.Information,EscortUnit:GetGroup()) +end +function AI_ESCORT:_FlightHoldPosition(OrbitGroup,OrbitHeight,OrbitSeconds) +local EscortUnit=self.PlayerUnit +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup,OrbitGroup) +if EscortGroup:IsAir()then +if OrbitGroup==nil then +OrbitGroup=EscortGroup +end +self:_HoldPosition(OrbitGroup,EscortGroup,OrbitHeight,OrbitSeconds) +end +end,OrbitGroup +) +end +function AI_ESCORT:_JoinUp(EscortGroup) +local EscortUnit=self.PlayerUnit +self:SetFlightModeFormation(EscortGroup) +EscortGroup:MessageTypeToGroup("Joining up!",MESSAGE.Type.Information,EscortUnit:GetGroup()) +end +function AI_ESCORT:_FlightJoinUp() +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_JoinUp(EscortGroup) +end +end +) +end +function AI_ESCORT:_EscortFormationTrail(EscortGroup,XStart,XSpace,YStart) +self:FormationTrail(XStart,XSpace,YStart) +end +function AI_ESCORT:_FlightFormationTrail(XStart,XSpace,YStart) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_EscortFormationTrail(EscortGroup,XStart,XSpace,YStart) +end +end +) +end +function AI_ESCORT:_EscortFormationStack(EscortGroup,XStart,XSpace,YStart,YSpace) +self:FormationStack(XStart,XSpace,YStart,YSpace) +end +function AI_ESCORT:_FlightFormationStack(XStart,XSpace,YStart,YSpace) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_EscortFormationStack(EscortGroup,XStart,XSpace,YStart,YSpace) +end +end +) +end +function AI_ESCORT:_Flare(EscortGroup,Color,Message) +local EscortUnit=self.PlayerUnit +EscortGroup:GetUnit(1):Flare(Color) +EscortGroup:MessageTypeToGroup(Message,MESSAGE.Type.Information,EscortUnit:GetGroup()) +end +function AI_ESCORT:_FlightFlare(Color,Message) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_Flare(EscortGroup,Color,Message) +end +end +) +end +function AI_ESCORT:_Smoke(EscortGroup,Color,Message) +local EscortUnit=self.PlayerUnit +EscortGroup:GetUnit(1):Smoke(Color) +EscortGroup:MessageTypeToGroup(Message,MESSAGE.Type.Information,EscortUnit:GetGroup()) +end +function AI_ESCORT:_FlightSmoke(Color,Message) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_Smoke(EscortGroup,Color,Message) +end +end +) +end +function AI_ESCORT:_ReportNearbyTargetsNow(EscortGroup) +local EscortUnit=self.PlayerUnit +self:_ReportTargetsScheduler(EscortGroup) +end +function AI_ESCORT:_FlightReportNearbyTargetsNow() +self:_FlightReportTargetsScheduler() +end +function AI_ESCORT:_FlightSwitchReportNearbyTargets(ReportTargets) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +if EscortGroup:IsAir()then +self:_EscortSwitchReportNearbyTargets(EscortGroup,ReportTargets) +end +end +) +end +function AI_ESCORT:SetFlightReportType(ReportType) +self.FlightReportType=ReportType +end +function AI_ESCORT:GetFlightReportType() +return self.FlightReportType +end +function AI_ESCORT:_FlightSwitchReportTypeAll() +self:SetFlightReportType(self.__Enum.ReportType.All) +self:SetFlightMenuReportType() +local EscortGroup=self.EscortGroupSet:GetFirst() +EscortGroup:MessageTypeToGroup("Reporting all targets.",MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightSwitchReportTypeAirborne() +self:SetFlightReportType(self.__Enum.ReportType.Airborne) +self:SetFlightMenuReportType() +local EscortGroup=self.EscortGroupSet:GetFirst() +EscortGroup:MessageTypeToGroup("Reporting airborne targets.",MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightSwitchReportTypeGroundRadar() +self:SetFlightReportType(self.__Enum.ReportType.Ground) +self:SetFlightMenuReportType() +local EscortGroup=self.EscortGroupSet:GetFirst() +EscortGroup:MessageTypeToGroup("Reporting ground radar targets.",MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightSwitchReportTypeGround() +self:SetFlightReportType(self.__Enum.ReportType.Ground) +self:SetFlightMenuReportType() +local EscortGroup=self.EscortGroupSet:GetFirst() +EscortGroup:MessageTypeToGroup("Reporting ground targets.",MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_ScanTargets(ScanDuration) +local EscortGroup=self.EscortGroup +local EscortUnit=self.PlayerUnit +self.FollowScheduler:Stop(self.FollowSchedule) +if EscortGroup:IsHelicopter()then +EscortGroup:PushTask( +EscortGroup:TaskControlled( +EscortGroup:TaskOrbitCircle(200,20), +EscortGroup:TaskCondition(nil,nil,nil,nil,ScanDuration,nil) +),1) +elseif EscortGroup:IsAirPlane()then +EscortGroup:PushTask( +EscortGroup:TaskControlled( +EscortGroup:TaskOrbitCircle(1000,500), +EscortGroup:TaskCondition(nil,nil,nil,nil,ScanDuration,nil) +),1) +end +EscortGroup:MessageToClient("Scanning targets for "..ScanDuration.." seconds.",ScanDuration,EscortUnit) +if self.EscortMode==AI_ESCORT.MODE.FOLLOW then +self.FollowScheduler:Start(self.FollowSchedule) +end +end +function AI_ESCORT.___Resume(EscortGroup,self) +self:F({self=self}) +local PlayerGroup=self.PlayerGroup +EscortGroup:OptionROEHoldFire() +EscortGroup:OptionROTVertical() +EscortGroup:SetState(EscortGroup,"Mode",EscortGroup:GetState(EscortGroup,"PreviousMode")) +if EscortGroup:GetState(EscortGroup,"Mode")==self.__Enum.Mode.Mission then +EscortGroup:MessageTypeToGroup("Resuming route.",MESSAGE.Type.Information,PlayerGroup) +else +EscortGroup:MessageTypeToGroup("Rejoining formation.",MESSAGE.Type.Information,PlayerGroup) +end +end +function AI_ESCORT:_ResumeMission(EscortGroup,WayPoint) +self:SetFlightModeMission(EscortGroup) +local WayPoints=EscortGroup.MissionRoute +self:T(WayPoint,WayPoints) +for WayPointIgnore=1,WayPoint do +table.remove(WayPoints,1) +end +EscortGroup:SetTask(EscortGroup:TaskRoute(WayPoints),1) +EscortGroup:MessageTypeToGroup("Resuming mission from waypoint ",MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_AttackTarget(EscortGroup,DetectedItem) +self:F(EscortGroup) +self:SetFlightModeAttack(EscortGroup) +if EscortGroup:IsAir()then +EscortGroup:OptionROEOpenFire() +EscortGroup:OptionROTVertical() +EscortGroup:SetState(EscortGroup,"Escort",self) +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +local AttackUnitTasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +AttackUnitTasks[#AttackUnitTasks+1]=EscortGroup:TaskAttackUnit(DetectedUnit) +end +end,Tasks +) +Tasks[#Tasks+1]=EscortGroup:TaskCombo(AttackUnitTasks) +Tasks[#Tasks+1]=EscortGroup:TaskFunction("AI_ESCORT.___Resume",self) +EscortGroup:PushTask( +EscortGroup:TaskCombo( +Tasks +),1 +) +else +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroup:TaskFireAtPoint(DetectedUnit:GetVec2(),50) +end +end,Tasks +) +EscortGroup:PushTask( +EscortGroup:TaskCombo( +Tasks +),1 +) +end +local DetectedTargetsReport=REPORT:New("Engaging target:\n") +local DetectedItemReportSummary=self.Detection:DetectedItemReportSummary(DetectedItem,self.PlayerGroup,_DATABASE:GetPlayerSettings(self.PlayerUnit:GetPlayerName())) +local ReportSummary=DetectedItemReportSummary:Text(", ") +DetectedTargetsReport:AddIndent(ReportSummary,"-") +EscortGroup:MessageTypeToGroup(DetectedTargetsReport:Text(),MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightAttackTarget(DetectedItem) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup,DetectedItem) +if EscortGroup:IsAir()then +self:_AttackTarget(EscortGroup,DetectedItem) +end +end,DetectedItem +) +end +function AI_ESCORT:_FlightAttackNearestTarget(TargetType) +self.Detection:Detect() +self:_FlightReportTargetsScheduler() +local EscortGroup=self.EscortGroupSet:GetFirst() +local AttackDetectedItem=nil +local DetectedItems=self.Detection:GetDetectedItems() +for DetectedItemIndex,DetectedItem in UTILS.spairs(DetectedItems,function(t,a,b)return self:Distance(self.PlayerUnit,t[a])<self:Distance(self.PlayerUnit,t[b])end)do +local DetectedItemSet=self.Detection:GetDetectedItemSet(DetectedItem) +local HasGround=DetectedItemSet:HasGroundUnits()>0 +local HasAir=DetectedItemSet:HasAirUnits()>0 +local FlightReportType=self:GetFlightReportType() +if(TargetType and TargetType==self.__Enum.ReportType.Ground and HasGround)or +(TargetType and TargetType==self.__Enum.ReportType.Air and HasAir)or +(TargetType==nil)then +AttackDetectedItem=DetectedItem +break +end +end +if AttackDetectedItem then +self:_FlightAttackTarget(AttackDetectedItem) +else +EscortGroup:MessageTypeToGroup("Nothing to attack!",MESSAGE.Type.Information,self.PlayerGroup) +end +end +function AI_ESCORT:_AssistTarget(EscortGroup,DetectedItem) +local EscortUnit=self.PlayerUnit +local DetectedSet=self.Detection:GetDetectedItemSet(DetectedItem) +local Tasks={} +DetectedSet:ForEachUnit( +function(DetectedUnit,Tasks) +if DetectedUnit:IsAlive()then +Tasks[#Tasks+1]=EscortGroup:TaskFireAtPoint(DetectedUnit:GetVec2(),50) +end +end,Tasks +) +EscortGroup:SetTask( +EscortGroup:TaskCombo( +Tasks +),1 +) +EscortGroup:MessageTypeToGroup("Assisting attack!",MESSAGE.Type.Information,EscortUnit:GetGroup()) +end +function AI_ESCORT:_ROE(EscortGroup,EscortROEFunction,EscortROEMessage) +pcall(function()EscortROEFunction(EscortGroup)end) +EscortGroup:MessageTypeToGroup(EscortROEMessage,MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightROEHoldFire(EscortROEMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROE(EscortGroup,EscortGroup.OptionROEHoldFire,EscortROEMessage) +end +) +end +function AI_ESCORT:_FlightROEOpenFire(EscortROEMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROE(EscortGroup,EscortGroup.OptionROEOpenFire,EscortROEMessage) +end +) +end +function AI_ESCORT:_FlightROEReturnFire(EscortROEMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROE(EscortGroup,EscortGroup.OptionROEReturnFire,EscortROEMessage) +end +) +end +function AI_ESCORT:_FlightROEWeaponFree(EscortROEMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROE(EscortGroup,EscortGroup.OptionROEWeaponFree,EscortROEMessage) +end +) +end +function AI_ESCORT:_ROT(EscortGroup,EscortROTFunction,EscortROTMessage) +pcall(function()EscortROTFunction(EscortGroup)end) +EscortGroup:MessageTypeToGroup(EscortROTMessage,MESSAGE.Type.Information,self.PlayerGroup) +end +function AI_ESCORT:_FlightROTNoReaction(EscortROTMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROT(EscortGroup,EscortGroup.OptionROTNoReaction,EscortROTMessage) +end +) +end +function AI_ESCORT:_FlightROTPassiveDefense(EscortROTMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROT(EscortGroup,EscortGroup.OptionROTPassiveDefense,EscortROTMessage) +end +) +end +function AI_ESCORT:_FlightROTEvadeFire(EscortROTMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROT(EscortGroup,EscortGroup.OptionROTEvadeFire,EscortROTMessage) +end +) +end +function AI_ESCORT:_FlightROTVertical(EscortROTMessage) +self.EscortGroupSet:ForEachGroupAlive( +function(EscortGroup) +self:_ROT(EscortGroup,EscortGroup.OptionROTVertical,EscortROTMessage) +end +) +end +function AI_ESCORT:RegisterRoute() +self:F() +local EscortGroup=self.EscortGroup +local TaskPoints=EscortGroup:GetTaskRoute() +self:T(TaskPoints) +return TaskPoints +end +function AI_ESCORT:_ResumeScheduler(EscortGroup) +self:F(EscortGroup:GetName()) +if EscortGroup:IsAlive()and self.PlayerUnit:IsAlive()then +local EscortGroupName=EscortGroup:GetCallsign() +if EscortGroup.EscortMenuResumeMission then +EscortGroup.EscortMenuResumeMission:RemoveSubMenus() +local TaskPoints=EscortGroup.MissionRoute +for WayPointID,WayPoint in pairs(TaskPoints)do +local EscortVec3=EscortGroup:GetVec3() +local Distance=((WayPoint.x-EscortVec3.x)^2+ +(WayPoint.y-EscortVec3.z)^2 +)^0.5/1000 +MENU_GROUP_COMMAND:New(self.PlayerGroup,"Waypoint "..WayPointID.." at "..string.format("%.2f",Distance).."km",EscortGroup.EscortMenuResumeMission,AI_ESCORT._ResumeMission,self,EscortGroup,WayPointID) +end +end +end +end +function AI_ESCORT:Distance(PlayerUnit,DetectedItem) +local DetectedCoordinate=self.Detection:GetDetectedItemCoordinate(DetectedItem) +local PlayerCoordinate=PlayerUnit:GetCoordinate() +return DetectedCoordinate:Get3DDistance(PlayerCoordinate) +end +function AI_ESCORT:_ReportTargetsScheduler(EscortGroup,Report) +self:F(EscortGroup:GetName()) +if EscortGroup:IsAlive()and self.PlayerUnit:IsAlive()then +local EscortGroupName=EscortGroup:GetCallsign() +local DetectedTargetsReport=REPORT:New("Reporting targets:\n") +if EscortGroup.EscortMenuTargetAssistance then +EscortGroup.EscortMenuTargetAssistance:RemoveSubMenus() +end +local DetectedItems=self.Detection:GetDetectedItems() +local ClientEscortTargets=self.Detection +local TimeUpdate=timer.getTime() +local EscortMenuAttackTargets=MENU_GROUP:New(self.PlayerGroup,"Attack targets",EscortGroup.EscortMenu) +local DetectedTargets=false +for DetectedItemIndex,DetectedItem in UTILS.spairs(DetectedItems,function(t,a,b)return self:Distance(self.PlayerUnit,t[a])<self:Distance(self.PlayerUnit,t[b])end)do +local DetectedItemSet=self.Detection:GetDetectedItemSet(DetectedItem) +local HasGround=DetectedItemSet:HasGroundUnits()>0 +local HasGroundRadar=HasGround and DetectedItemSet:HasRadar()>0 +local HasAir=DetectedItemSet:HasAirUnits()>0 +local FlightReportType=self:GetFlightReportType() +if(FlightReportType==self.__Enum.ReportType.All)or +(FlightReportType==self.__Enum.ReportType.Airborne and HasAir)or +(FlightReportType==self.__Enum.ReportType.Ground and HasGround)or +(FlightReportType==self.__Enum.ReportType.GroundRadar and HasGroundRadar)then +DetectedTargets=true +local DetectedMenu=self.Detection:DetectedItemReportMenu(DetectedItem,EscortGroup,_DATABASE:GetPlayerSettings(self.PlayerUnit:GetPlayerName())):Text("\n") +local DetectedItemReportSummary=self.Detection:DetectedItemReportSummary(DetectedItem,EscortGroup,_DATABASE:GetPlayerSettings(self.PlayerUnit:GetPlayerName())) +local ReportSummary=DetectedItemReportSummary:Text(", ") +DetectedTargetsReport:AddIndent(ReportSummary,"-") +if EscortGroup:IsAir()then +MENU_GROUP_COMMAND:New(self.PlayerGroup, +DetectedMenu, +EscortMenuAttackTargets, +AI_ESCORT._AttackTarget, +self, +EscortGroup, +DetectedItem +):SetTag("Escort"):SetTime(TimeUpdate) +else +if self.EscortMenuTargetAssistance then +local MenuTargetAssistance=MENU_GROUP:New(self.PlayerGroup,EscortGroupName,EscortGroup.EscortMenuTargetAssistance) +MENU_GROUP_COMMAND:New(self.PlayerGroup, +DetectedMenu, +MenuTargetAssistance, +AI_ESCORT._AssistTarget, +self, +EscortGroup, +DetectedItem +) +end +end +end +end +EscortMenuAttackTargets:RemoveSubMenus(TimeUpdate,"Escort") +if Report then +if DetectedTargets then +EscortGroup:MessageTypeToGroup(DetectedTargetsReport:Text("\n"),MESSAGE.Type.Information,self.PlayerGroup) +else +EscortGroup:MessageTypeToGroup("No targets detected.",MESSAGE.Type.Information,self.PlayerGroup) +end +end +return true +end +return false +end +function AI_ESCORT:_FlightReportTargetsScheduler() +self:F("FlightReportTargetScheduler") +local EscortGroup=self.EscortGroupSet:GetFirst() +local DetectedTargetsReport=REPORT:New("Reporting your targets:\n") +if EscortGroup and(self.PlayerUnit:IsAlive()and EscortGroup:IsAlive())then +local TimeUpdate=timer.getTime() +local DetectedItems=self.Detection:GetDetectedItems() +local DetectedTargets=false +local ClientEscortTargets=self.Detection +for DetectedItemIndex,DetectedItem in UTILS.spairs(DetectedItems,function(t,a,b)return self:Distance(self.PlayerUnit,t[a])<self:Distance(self.PlayerUnit,t[b])end)do +self:F("FlightReportTargetScheduler Targets") +local DetectedItemSet=self.Detection:GetDetectedItemSet(DetectedItem) +local HasGround=DetectedItemSet:HasGroundUnits()>0 +local HasGroundRadar=HasGround and DetectedItemSet:HasRadar()>0 +local HasAir=DetectedItemSet:HasAirUnits()>0 +local FlightReportType=self:GetFlightReportType() +if(FlightReportType==self.__Enum.ReportType.All)or +(FlightReportType==self.__Enum.ReportType.Airborne and HasAir)or +(FlightReportType==self.__Enum.ReportType.Ground and HasGround)or +(FlightReportType==self.__Enum.ReportType.GroundRadar and HasGroundRadar)then +DetectedTargets=true +local DetectedItemReportMenu=self.Detection:DetectedItemReportMenu(DetectedItem,self.PlayerGroup,_DATABASE:GetPlayerSettings(self.PlayerUnit:GetPlayerName())) +local ReportMenuText=DetectedItemReportMenu:Text(", ") +MENU_GROUP_COMMAND:New(self.PlayerGroup, +ReportMenuText, +self.FlightMenuAttack, +AI_ESCORT._FlightAttackTarget, +self, +DetectedItem +):SetTag("Flight"):SetTime(TimeUpdate) +local DetectedItemReportSummary=self.Detection:DetectedItemReportSummary(DetectedItem,self.PlayerGroup,_DATABASE:GetPlayerSettings(self.PlayerUnit:GetPlayerName())) +local ReportSummary=DetectedItemReportSummary:Text(", ") +DetectedTargetsReport:AddIndent(ReportSummary,"-") +end +end +self.FlightMenuAttack:RemoveSubMenus(TimeUpdate,"Flight") +if DetectedTargets then +EscortGroup:MessageTypeToGroup(DetectedTargetsReport:Text("\n"),MESSAGE.Type.Information,self.PlayerGroup) +end +return true +end +return false +end +AI_ESCORT_REQUEST={ +ClassName="AI_ESCORT_REQUEST", +} +function AI_ESCORT_REQUEST:New(EscortUnit,EscortSpawn,EscortAirbase,EscortName,EscortBriefing) +local EscortGroupSet=SET_GROUP:New():FilterDeads():FilterCrashes() +local self=BASE:Inherit(self,AI_ESCORT:New(EscortUnit,EscortGroupSet,EscortName,EscortBriefing)) +self.EscortGroupSet=EscortGroupSet +self.EscortSpawn=EscortSpawn +self.EscortAirbase=EscortAirbase +self.LeaderGroup=self.PlayerUnit:GetGroup() +self.Detection=DETECTION_AREAS:New(self.EscortGroupSet,5000) +self.Detection:__Start(30) +self.SpawnMode=self.__Enum.Mode.Mission +return self +end +function AI_ESCORT_REQUEST:SpawnEscort() +local EscortGroup=self.EscortSpawn:SpawnAtAirbase(self.EscortAirbase,SPAWN.Takeoff.Hot) +self:ScheduleOnce(0.1, +function(EscortGroup) +EscortGroup:OptionROTVertical() +EscortGroup:OptionROEHoldFire() +self.EscortGroupSet:AddGroup(EscortGroup) +local LeaderEscort=self.EscortGroupSet:GetFirst() +local Report=REPORT:New() +Report:Add("Joining Up "..self.EscortGroupSet:GetUnitTypeNames():Text(", ").." from "..LeaderEscort:GetCoordinate():ToString(self.EscortUnit)) +LeaderEscort:MessageTypeToGroup(Report:Text(),MESSAGE.Type.Information,self.PlayerUnit) +self:SetFlightModeFormation(EscortGroup) +self:FormationTrail() +self:_InitFlightMenus() +self:_InitEscortMenus(EscortGroup) +self:_InitEscortRoute(EscortGroup) +function EscortGroup:OnEventDeadOrCrash(EventData) +self:F({"EventDead",EventData}) +self.EscortMenu:Remove() +end +EscortGroup:HandleEvent(EVENTS.Dead,EscortGroup.OnEventDeadOrCrash) +EscortGroup:HandleEvent(EVENTS.Crash,EscortGroup.OnEventDeadOrCrash) +end,EscortGroup +) +end +function AI_ESCORT_REQUEST:onafterStart(EscortGroupSet) +self:F() +if not self.MenuRequestEscort then +self.MainMenu=MENU_GROUP:New(self.PlayerGroup,self.EscortName) +self.MenuRequestEscort=MENU_GROUP_COMMAND:New(self.LeaderGroup,"Request new escort ",self.MainMenu, +function() +self:SpawnEscort() +end +) +end +self:GetParent(self).onafterStart(self,EscortGroupSet) +self:HandleEvent(EVENTS.Dead,self.OnEventDeadOrCrash) +self:HandleEvent(EVENTS.Crash,self.OnEventDeadOrCrash) +end +function AI_ESCORT_REQUEST:onafterStop(EscortGroupSet) +self:F() +EscortGroupSet:ForEachGroup( +function(EscortGroup) +EscortGroup:WayPointInitialize() +EscortGroup:OptionROTVertical() +EscortGroup:OptionROEOpenFire() +end +) +self.Detection:Stop() +self.MainMenu:Remove() +end +function AI_ESCORT_REQUEST:SetEscortSpawnMission() +self.SpawnMode=self.__Enum.Mode.Mission +end +AI_ESCORT_DISPATCHER={ +ClassName="AI_ESCORT_DISPATCHER", +} +AI_ESCORT_DISPATCHER.AI_Escorts={} +function AI_ESCORT_DISPATCHER:New(CarrierSet,EscortSpawn,EscortAirbase,EscortName,EscortBriefing) +local self=BASE:Inherit(self,FSM:New()) +self.CarrierSet=CarrierSet +self.EscortSpawn=EscortSpawn +self.EscortAirbase=EscortAirbase +self.EscortName=EscortName +self.EscortBriefing=EscortBriefing +self:SetStartState("Idle") +self:AddTransition("Monitoring","Monitor","Monitoring") +self:AddTransition("Idle","Start","Monitoring") +self:AddTransition("Monitoring","Stop","Idle") +function self.CarrierSet.OnAfterRemoved(CarrierSet,From,Event,To,CarrierName,Carrier) +self:F({Carrier=Carrier:GetName()}) +end +return self +end +function AI_ESCORT_DISPATCHER:onafterStart(From,Event,To) +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventExit) +self:HandleEvent(EVENTS.Crash,self.OnEventExit) +self:HandleEvent(EVENTS.Dead,self.OnEventExit) +end +function AI_ESCORT_DISPATCHER:OnEventExit(EventData) +local PlayerGroupName=EventData.IniGroupName +local PlayerGroup=EventData.IniGroup +local PlayerUnit=EventData.IniUnit +self:T({EscortAirbase=self.EscortAirbase}) +self:T({PlayerGroupName=PlayerGroupName}) +self:T({PlayerGroup=PlayerGroup}) +self:T({FirstGroup=self.CarrierSet:GetFirst()}) +self:T({FindGroup=self.CarrierSet:FindGroup(PlayerGroupName)}) +if self.CarrierSet:FindGroup(PlayerGroupName)then +if self.AI_Escorts[PlayerGroupName]then +self.AI_Escorts[PlayerGroupName]:Stop() +self.AI_Escorts[PlayerGroupName]=nil +end +end +end +function AI_ESCORT_DISPATCHER:OnEventBirth(EventData) +local PlayerGroupName=EventData.IniGroupName +local PlayerGroup=EventData.IniGroup +local PlayerUnit=EventData.IniUnit +self:T({EscortAirbase=self.EscortAirbase}) +self:T({PlayerGroupName=PlayerGroupName}) +self:T({PlayerGroup=PlayerGroup}) +self:T({FirstGroup=self.CarrierSet:GetFirst()}) +self:T({FindGroup=self.CarrierSet:FindGroup(PlayerGroupName)}) +if self.CarrierSet:FindGroup(PlayerGroupName)then +if not self.AI_Escorts[PlayerGroupName]then +local LeaderUnit=PlayerUnit +local EscortGroup=self.EscortSpawn:SpawnAtAirbase(self.EscortAirbase,SPAWN.Takeoff.Hot) +self:T({EscortGroup=EscortGroup}) +self:ScheduleOnce(1, +function(EscortGroup) +local EscortSet=SET_GROUP:New() +EscortSet:AddGroup(EscortGroup) +self.AI_Escorts[PlayerGroupName]=AI_ESCORT:New(LeaderUnit,EscortSet,self.EscortName,self.EscortBriefing) +self.AI_Escorts[PlayerGroupName]:FormationTrail(0,100,0) +if EscortGroup:IsHelicopter()then +self.AI_Escorts[PlayerGroupName]:MenusHelicopters() +else +self.AI_Escorts[PlayerGroupName]:MenusAirplanes() +end +self.AI_Escorts[PlayerGroupName]:__Start(0.1) +end,EscortGroup +) +end +end +end +AI_ESCORT_DISPATCHER_REQUEST={ +ClassName="AI_ESCORT_DISPATCHER_REQUEST", +} +AI_ESCORT_DISPATCHER_REQUEST.AI_Escorts={} +function AI_ESCORT_DISPATCHER_REQUEST:New(CarrierSet,EscortSpawn,EscortAirbase,EscortName,EscortBriefing) +local self=BASE:Inherit(self,FSM:New()) +self.CarrierSet=CarrierSet +self.EscortSpawn=EscortSpawn +self.EscortAirbase=EscortAirbase +self.EscortName=EscortName +self.EscortBriefing=EscortBriefing +self:SetStartState("Idle") +self:AddTransition("Monitoring","Monitor","Monitoring") +self:AddTransition("Idle","Start","Monitoring") +self:AddTransition("Monitoring","Stop","Idle") +function self.CarrierSet.OnAfterRemoved(CarrierSet,From,Event,To,CarrierName,Carrier) +self:F({Carrier=Carrier:GetName()}) +end +return self +end +function AI_ESCORT_DISPATCHER_REQUEST:onafterStart(From,Event,To) +self:HandleEvent(EVENTS.Birth) +self:HandleEvent(EVENTS.PlayerLeaveUnit,self.OnEventExit) +self:HandleEvent(EVENTS.Crash,self.OnEventExit) +self:HandleEvent(EVENTS.Dead,self.OnEventExit) +end +function AI_ESCORT_DISPATCHER_REQUEST:OnEventExit(EventData) +local PlayerGroupName=EventData.IniGroupName +local PlayerGroup=EventData.IniGroup +local PlayerUnit=EventData.IniUnit +if self.CarrierSet:FindGroup(PlayerGroupName)then +if self.AI_Escorts[PlayerGroupName]then +self.AI_Escorts[PlayerGroupName]:Stop() +self.AI_Escorts[PlayerGroupName]=nil +end +end +end +function AI_ESCORT_DISPATCHER_REQUEST:OnEventBirth(EventData) +local PlayerGroupName=EventData.IniGroupName +local PlayerGroup=EventData.IniGroup +local PlayerUnit=EventData.IniUnit +if self.CarrierSet:FindGroup(PlayerGroupName)then +if not self.AI_Escorts[PlayerGroupName]then +local LeaderUnit=PlayerUnit +self:ScheduleOnce(0.1, +function() +self.AI_Escorts[PlayerGroupName]=AI_ESCORT_REQUEST:New(LeaderUnit,self.EscortSpawn,self.EscortAirbase,self.EscortName,self.EscortBriefing) +self.AI_Escorts[PlayerGroupName]:FormationTrail(0,100,0) +if PlayerGroup:IsHelicopter()then +self.AI_Escorts[PlayerGroupName]:MenusHelicopters() +else +self.AI_Escorts[PlayerGroupName]:MenusAirplanes() +end +self.AI_Escorts[PlayerGroupName]:__Start(0.1) +end +) +end +end +end +AI_CARGO={ +ClassName="AI_CARGO", +Coordinate=nil, +Carrier_Cargo={}, +} +function AI_CARGO:New(Carrier,CargoSet) +local self=BASE:Inherit(self,FSM_CONTROLLABLE:New(Carrier)) +self.CargoSet=CargoSet +self.CargoCarrier=Carrier +self:SetStartState("Unloaded") +self:AddTransition("Unloaded","Pickup","Unloaded") +self:AddTransition("*","Load","*") +self:AddTransition("*","Reload","*") +self:AddTransition("*","Board","*") +self:AddTransition("*","Loaded","Loaded") +self:AddTransition("Loaded","PickedUp","Loaded") +self:AddTransition("Loaded","Deploy","*") +self:AddTransition("*","Unload","*") +self:AddTransition("*","Unboard","*") +self:AddTransition("*","Unloaded","Unloaded") +self:AddTransition("Unloaded","Deployed","Unloaded") +for _,CarrierUnit in pairs(Carrier:GetUnits())do +local CarrierUnit=CarrierUnit +CarrierUnit:SetCargoBayWeightLimit() +end +self.Transporting=false +self.Relocating=false +return self +end +function AI_CARGO:IsTransporting() +return self.Transporting==true +end +function AI_CARGO:IsRelocating() +return self.Relocating==true +end +function AI_CARGO:onafterPickup(APC,From,Event,To,Coordinate,Speed,Height,PickupZone) +self.Transporting=false +self.Relocating=true +end +function AI_CARGO:onafterDeploy(APC,From,Event,To,Coordinate,Speed,Height,DeployZone) +self.Relocating=false +self.Transporting=true +end +function AI_CARGO:onbeforeLoad(Carrier,From,Event,To,PickupZone) +self:F({Carrier,From,Event,To}) +local Boarding=false +local LoadInterval=2 +local LoadDelay=1 +local Carrier_List={} +local Carrier_Weight={} +if Carrier and Carrier:IsAlive()then +self.Carrier_Cargo={} +for _,CarrierUnit in pairs(Carrier:GetUnits())do +local CarrierUnit=CarrierUnit +local CargoBayFreeWeight=CarrierUnit:GetCargoBayFreeWeight() +self:F({CargoBayFreeWeight=CargoBayFreeWeight}) +Carrier_List[#Carrier_List+1]=CarrierUnit +Carrier_Weight[CarrierUnit]=CargoBayFreeWeight +end +local Carrier_Count=#Carrier_List +local Carrier_Index=1 +local Loaded=false +for _,Cargo in UTILS.spairs(self.CargoSet:GetSet(),function(t,a,b)return t[a]:GetWeight()>t[b]:GetWeight()end)do +local Cargo=Cargo +self:F({IsUnLoaded=Cargo:IsUnLoaded(),IsDeployed=Cargo:IsDeployed(),Cargo:GetName(),Carrier:GetName()}) +for Carrier_Loop=1,#Carrier_List do +local CarrierUnit=Carrier_List[Carrier_Index] +Carrier_Index=Carrier_Index+1 +if Carrier_Index>Carrier_Count then +Carrier_Index=1 +end +if Cargo:IsUnLoaded()and not Cargo:IsDeployed()then +if Cargo:IsInLoadRadius(CarrierUnit:GetCoordinate())then +self:F({"In radius",CarrierUnit:GetName()}) +local CargoWeight=Cargo:GetWeight() +local CarrierSpace=Carrier_Weight[CarrierUnit] +if CarrierSpace>CargoWeight then +Carrier:RouteStop() +Cargo:__Board(-LoadDelay,CarrierUnit) +self:__Board(LoadDelay,Cargo,CarrierUnit,PickupZone) +LoadDelay=LoadDelay+Cargo:GetCount()*LoadInterval +self.Carrier_Cargo[Cargo]=CarrierUnit +Boarding=true +Carrier_Weight[CarrierUnit]=Carrier_Weight[CarrierUnit]-CargoWeight +Loaded=true +break +else +self:T(string.format("WARNING: Cargo too heavy for carrier %s. Cargo=%.1f > %.1f free space",tostring(CarrierUnit:GetName()),CargoWeight,CarrierSpace)) +end +end +end +end +end +if not Loaded==true then +self.Relocating=false +end +end +return Boarding +end +function AI_CARGO:onbeforeReload(Carrier,From,Event,To) +self:F({Carrier,From,Event,To}) +local Boarding=false +local LoadInterval=2 +local LoadDelay=1 +local Carrier_List={} +local Carrier_Weight={} +if Carrier and Carrier:IsAlive()then +for _,CarrierUnit in pairs(Carrier:GetUnits())do +local CarrierUnit=CarrierUnit +Carrier_List[#Carrier_List+1]=CarrierUnit +end +local Carrier_Count=#Carrier_List +local Carrier_Index=1 +local Loaded=false +for Cargo,CarrierUnit in pairs(self.Carrier_Cargo)do +local Cargo=Cargo +self:F({IsUnLoaded=Cargo:IsUnLoaded(),IsDeployed=Cargo:IsDeployed(),Cargo:GetName(),Carrier:GetName()}) +for Carrier_Loop=1,#Carrier_List do +local CarrierUnit=Carrier_List[Carrier_Index] +Carrier_Index=Carrier_Index+1 +if Carrier_Index>Carrier_Count then +Carrier_Index=1 +end +if Cargo:IsUnLoaded()and not Cargo:IsDeployed()then +Carrier:RouteStop() +Cargo:__Board(-LoadDelay,CarrierUnit) +self:__Board(LoadDelay,Cargo,CarrierUnit) +LoadDelay=LoadDelay+Cargo:GetCount()*LoadInterval +self.Carrier_Cargo[Cargo]=CarrierUnit +Boarding=true +Loaded=true +end +end +end +if not Loaded==true then +self.Relocating=false +end +end +return Boarding +end +function AI_CARGO:onafterBoard(Carrier,From,Event,To,Cargo,CarrierUnit,PickupZone) +self:F({Carrier,From,Event,To,Cargo,CarrierUnit:GetName()}) +if Carrier and Carrier:IsAlive()then +self:F({IsLoaded=Cargo:IsLoaded(),Cargo:GetName(),Carrier:GetName()}) +if not Cargo:IsLoaded()and not Cargo:IsDestroyed()then +self:__Board(-10,Cargo,CarrierUnit,PickupZone) +return +end +end +self:__Loaded(0.1,Cargo,CarrierUnit,PickupZone) +end +function AI_CARGO:onafterLoaded(Carrier,From,Event,To,Cargo,PickupZone) +self:F({Carrier,From,Event,To}) +local Loaded=true +if Carrier and Carrier:IsAlive()then +for Cargo,CarrierUnit in pairs(self.Carrier_Cargo)do +local Cargo=Cargo +self:F({IsLoaded=Cargo:IsLoaded(),IsDestroyed=Cargo:IsDestroyed(),Cargo:GetName(),Carrier:GetName()}) +if not Cargo:IsLoaded()and not Cargo:IsDestroyed()then +Loaded=false +end +end +end +if Loaded then +self:__PickedUp(0.1,PickupZone) +end +end +function AI_CARGO:onafterPickedUp(Carrier,From,Event,To,PickupZone) +self:F({Carrier,From,Event,To}) +Carrier:RouteResume() +local HasCargo=false +if Carrier and Carrier:IsAlive()then +for Cargo,CarrierUnit in pairs(self.Carrier_Cargo)do +HasCargo=true +break +end +end +self.Relocating=false +if HasCargo then +self:F("Transporting") +self.Transporting=true +end +end +function AI_CARGO:onafterUnload(Carrier,From,Event,To,DeployZone,Defend) +self:F({Carrier,From,Event,To,DeployZone,Defend=Defend}) +local UnboardInterval=5 +local UnboardDelay=5 +if Carrier and Carrier:IsAlive()then +for _,CarrierUnit in pairs(Carrier:GetUnits())do +local CarrierUnit=CarrierUnit +Carrier:RouteStop() +for _,Cargo in pairs(CarrierUnit:GetCargo())do +self:F({Cargo=Cargo:GetName(),Isloaded=Cargo:IsLoaded()}) +if Cargo:IsLoaded()then +Cargo:__UnBoard(UnboardDelay) +UnboardDelay=UnboardDelay+Cargo:GetCount()*UnboardInterval +self:__Unboard(UnboardDelay,Cargo,CarrierUnit,DeployZone,Defend) +if not Defend==true then +Cargo:SetDeployed(true) +end +end +end +end +end +end +function AI_CARGO:onafterUnboard(Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone,Defend) +self:F({Carrier,From,Event,To,Cargo:GetName(),DeployZone=DeployZone,Defend=Defend}) +if Carrier and Carrier:IsAlive()then +if not Cargo:IsUnLoaded()then +self:__Unboard(10,Cargo,CarrierUnit,DeployZone,Defend) +return +end +end +self:Unloaded(Cargo,CarrierUnit,DeployZone,Defend) +end +function AI_CARGO:onafterUnloaded(Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone,Defend) +self:F({Carrier,From,Event,To,Cargo:GetName(),DeployZone=DeployZone,Defend=Defend}) +local AllUnloaded=true +if Carrier and Carrier:IsAlive()then +for _,CarrierUnit in pairs(Carrier:GetUnits())do +local CarrierUnit=CarrierUnit +local IsEmpty=CarrierUnit:IsCargoEmpty() +self:T({IsEmpty=IsEmpty}) +if not IsEmpty then +AllUnloaded=false +break +end +end +if AllUnloaded==true then +if DeployZone==true then +self.Carrier_Cargo={} +end +self.CargoCarrier=Carrier +end +end +if AllUnloaded==true then +self:__Deployed(5,DeployZone,Defend) +end +end +function AI_CARGO:onafterDeployed(Carrier,From,Event,To,DeployZone,Defend) +self:F({Carrier,From,Event,To,DeployZone=DeployZone,Defend=Defend}) +if not Defend==true then +self.Transporting=false +else +self:F("Defending") +end +end +AI_CARGO_APC={ +ClassName="AI_CARGO_APC", +Coordinate=nil, +} +function AI_CARGO_APC:New(APC,CargoSet,CombatRadius) +local self=BASE:Inherit(self,AI_CARGO:New(APC,CargoSet)) +self:AddTransition("*","Monitor","*") +self:AddTransition("*","Follow","Following") +self:AddTransition("*","Guard","Unloaded") +self:AddTransition("*","Home","*") +self:AddTransition("*","Reload","Boarding") +self:AddTransition("*","Deployed","*") +self:AddTransition("*","PickedUp","*") +self:AddTransition("*","Destroyed","Destroyed") +self:SetCombatRadius(CombatRadius) +self:SetCarrier(APC) +return self +end +function AI_CARGO_APC:SetCarrier(CargoCarrier) +self.CargoCarrier=CargoCarrier +self.CargoCarrier:SetState(self.CargoCarrier,"AI_CARGO_APC",self) +CargoCarrier:HandleEvent(EVENTS.Dead) +function CargoCarrier:OnEventDead(EventData) +self:F({"dead"}) +local AICargoTroops=self:GetState(self,"AI_CARGO_APC") +self:F({AICargoTroops=AICargoTroops}) +if AICargoTroops then +self:F({}) +if not AICargoTroops:Is("Loaded")then +AICargoTroops:Destroyed() +end +end +end +self.Zone=ZONE_UNIT:New(self.CargoCarrier:GetName().."-Zone",self.CargoCarrier,self.CombatRadius) +self.Coalition=self.CargoCarrier:GetCoalition() +self:SetControllable(CargoCarrier) +self:Guard() +return self +end +function AI_CARGO_APC:SetOffRoad(Offroad,Formation) +self:SetPickupOffRoad(Offroad,Formation) +self:SetDeployOffRoad(Offroad,Formation) +return self +end +function AI_CARGO_APC:SetPickupOffRoad(Offroad,Formation) +self.pickupOffroad=Offroad +self.pickupFormation=Formation or ENUMS.Formation.Vehicle.OffRoad +return self +end +function AI_CARGO_APC:SetDeployOffRoad(Offroad,Formation) +self.deployOffroad=Offroad +self.deployFormation=Formation or ENUMS.Formation.Vehicle.OffRoad +return self +end +function AI_CARGO_APC:FindCarrier(Coordinate,Radius) +local CoordinateZone=ZONE_RADIUS:New("Zone",Coordinate:GetVec2(),Radius) +CoordinateZone:Scan({Object.Category.UNIT}) +for _,DCSUnit in pairs(CoordinateZone:GetScannedUnits())do +local NearUnit=UNIT:Find(DCSUnit) +self:F({NearUnit=NearUnit}) +if not NearUnit:GetState(NearUnit,"AI_CARGO_APC")then +local Attributes=NearUnit:GetDesc() +self:F({Desc=Attributes}) +if NearUnit:HasAttribute("Trucks")then +return NearUnit:GetGroup() +end +end +end +return nil +end +function AI_CARGO_APC:SetCombatRadius(CombatRadius) +self.CombatRadius=CombatRadius or 0 +if self.CombatRadius>0 then +self:__Monitor(-5) +end +return self +end +function AI_CARGO_APC:FollowToCarrier(Me,APCUnit,CargoGroup) +local InfantryGroup=CargoGroup:GetGroup() +self:F({self=self:GetClassNameAndID(),InfantryGroup=InfantryGroup:GetName()}) +if APCUnit:IsAlive()then +if InfantryGroup:IsPartlyInZone(ZONE_UNIT:New("Radius",APCUnit,25))then +Me:Guard() +else +self:F({InfantryGroup=InfantryGroup:GetName()}) +if InfantryGroup:IsAlive()then +self:F({InfantryGroup=InfantryGroup:GetName()}) +local Waypoints={} +local FromCoord=InfantryGroup:GetCoordinate() +local FromGround=FromCoord:WaypointGround(10,"Diamond") +self:F({FromGround=FromGround}) +table.insert(Waypoints,FromGround) +local ToCoord=APCUnit:GetCoordinate():GetRandomCoordinateInRadius(10,5) +local ToGround=ToCoord:WaypointGround(10,"Diamond") +self:F({ToGround=ToGround}) +table.insert(Waypoints,ToGround) +local TaskRoute=InfantryGroup:TaskFunction("AI_CARGO_APC.FollowToCarrier",Me,APCUnit,CargoGroup) +self:F({Waypoints=Waypoints}) +local Waypoint=Waypoints[#Waypoints] +InfantryGroup:SetTaskWaypoint(Waypoint,TaskRoute) +InfantryGroup:Route(Waypoints,1) +end +end +end +end +function AI_CARGO_APC:onafterMonitor(APC,From,Event,To) +self:F({APC,From,Event,To,IsTransporting=self:IsTransporting()}) +if self.CombatRadius>0 then +if APC and APC:IsAlive()then +if self.CarrierCoordinate then +if self:IsTransporting()==true then +local Coordinate=APC:GetCoordinate() +if self:Is("Unloaded")or self:Is("Loaded")then +self.Zone:Scan({Object.Category.UNIT}) +if self.Zone:IsAllInZoneOfCoalition(self.Coalition)then +if self:Is("Unloaded")then +self:Reload() +end +else +if self:Is("Loaded")then +self:__Unload(1,nil,true) +else +if self:Is("Unloaded")then +end +self:F("I am here"..self:GetCurrentState()) +if self:Is("Following")then +for Cargo,APCUnit in pairs(self.Carrier_Cargo)do +local Cargo=Cargo +local APCUnit=APCUnit +if Cargo:IsAlive()then +if not Cargo:IsNear(APCUnit,40)then +APCUnit:RouteStop() +self.CarrierStopped=true +else +if self.CarrierStopped then +if Cargo:IsNear(APCUnit,25)then +APCUnit:RouteResume() +self.CarrierStopped=nil +end +end +end +end +end +end +end +end +end +end +end +self.CarrierCoordinate=APC:GetCoordinate() +end +self:__Monitor(-5) +end +end +function AI_CARGO_APC:onafterFollow(APC,From,Event,To) +self:F({APC,From,Event,To}) +self:F("Follow") +if APC and APC:IsAlive()then +for Cargo,APCUnit in pairs(self.Carrier_Cargo)do +local Cargo=Cargo +if Cargo:IsUnLoaded()then +self:FollowToCarrier(self,APCUnit,Cargo) +APCUnit:RouteResume() +end +end +end +end +function AI_CARGO_APC._Pickup(APC,self,Coordinate,Speed,PickupZone) +APC:F({"AI_CARGO_APC._Pickup:",APC:GetName()}) +if APC:IsAlive()then +self:Load(PickupZone) +end +end +function AI_CARGO_APC._Deploy(APC,self,Coordinate,DeployZone) +APC:F({"AI_CARGO_APC._Deploy:",APC}) +if APC:IsAlive()then +self:Unload(DeployZone) +end +end +function AI_CARGO_APC:onafterPickup(APC,From,Event,To,Coordinate,Speed,Height,PickupZone) +if APC and APC:IsAlive()then +if Coordinate then +self.RoutePickup=true +local _speed=Speed or APC:GetSpeedMax()*0.5 +local Waypoints={} +if self.pickupOffroad then +Waypoints[1]=APC:GetCoordinate():WaypointGround(Speed,self.pickupFormation) +Waypoints[2]=Coordinate:WaypointGround(_speed,self.pickupFormation,DCSTasks) +else +Waypoints=APC:TaskGroundOnRoad(Coordinate,_speed,ENUMS.Formation.Vehicle.OffRoad,true) +end +local TaskFunction=APC:TaskFunction("AI_CARGO_APC._Pickup",self,Coordinate,Speed,PickupZone) +local Waypoint=Waypoints[#Waypoints] +APC:SetTaskWaypoint(Waypoint,TaskFunction) +APC:Route(Waypoints,1) +else +AI_CARGO_APC._Pickup(APC,self,Coordinate,Speed,PickupZone) +end +self:GetParent(self,AI_CARGO_APC).onafterPickup(self,APC,From,Event,To,Coordinate,Speed,Height,PickupZone) +end +end +function AI_CARGO_APC:onafterDeploy(APC,From,Event,To,Coordinate,Speed,Height,DeployZone) +if APC and APC:IsAlive()then +self.RouteDeploy=true +local speedmax=APC:GetSpeedMax() +local _speed=Speed or speedmax*0.5 +_speed=math.min(_speed,speedmax) +local Waypoints={} +if self.deployOffroad then +Waypoints[1]=APC:GetCoordinate():WaypointGround(Speed,self.deployFormation) +Waypoints[2]=Coordinate:WaypointGround(_speed,self.deployFormation,DCSTasks) +else +Waypoints=APC:TaskGroundOnRoad(Coordinate,_speed,ENUMS.Formation.Vehicle.OffRoad,true) +end +local TaskFunction=APC:TaskFunction("AI_CARGO_APC._Deploy",self,Coordinate,DeployZone) +local Waypoint=Waypoints[#Waypoints] +APC:SetTaskWaypoint(Waypoint,TaskFunction) +APC:Route(Waypoints,1) +self:GetParent(self,AI_CARGO_APC).onafterDeploy(self,APC,From,Event,To,Coordinate,Speed,Height,DeployZone) +end +end +function AI_CARGO_APC:onafterUnloaded(Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone,Defend) +self:F({Carrier,From,Event,To,DeployZone=DeployZone,Defend=Defend}) +self:GetParent(self,AI_CARGO_APC).onafterUnloaded(self,Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone,Defend) +if Defend==true then +self.Zone:Scan({Object.Category.UNIT}) +if not self.Zone:IsAllInZoneOfCoalition(self.Coalition)then +local AttackUnits=self.Zone:GetScannedUnits() +local Move={} +local CargoGroup=Cargo.CargoObject +Move[#Move+1]=CargoGroup:GetCoordinate():WaypointGround(70,"Custom") +for UnitId,AttackUnit in pairs(AttackUnits)do +local MooseUnit=UNIT:Find(AttackUnit) +if MooseUnit:GetCoalition()~=CargoGroup:GetCoalition()then +Move[#Move+1]=MooseUnit:GetCoordinate():WaypointGround(70,"Line abreast") +self:F({MooseUnit=MooseUnit:GetName(),CargoGroup=CargoGroup:GetName()}) +end +end +CargoGroup:RoutePush(Move,0.1) +end +end +end +function AI_CARGO_APC:onafterDeployed(APC,From,Event,To,DeployZone,Defend) +self:F({APC,From,Event,To,DeployZone=DeployZone,Defend=Defend}) +self:__Guard(0.1) +self:GetParent(self,AI_CARGO_APC).onafterDeployed(self,APC,From,Event,To,DeployZone,Defend) +end +function AI_CARGO_APC:onafterHome(APC,From,Event,To,Coordinate,Speed,Height,HomeZone) +if APC and APC:IsAlive()~=nil then +self.RouteHome=true +Speed=Speed or APC:GetSpeedMax()*0.5 +local Waypoints=APC:TaskGroundOnRoad(Coordinate,Speed,"Line abreast",true) +self:F({Waypoints=Waypoints}) +local Waypoint=Waypoints[#Waypoints] +APC:Route(Waypoints,1) +end +end +AI_CARGO_HELICOPTER={ +ClassName="AI_CARGO_HELICOPTER", +Coordinate=nil, +} +AI_CARGO_QUEUE={} +function AI_CARGO_HELICOPTER:New(Helicopter,CargoSet) +local self=BASE:Inherit(self,AI_CARGO:New(Helicopter,CargoSet)) +self.Zone=ZONE_GROUP:New(Helicopter:GetName(),Helicopter,300) +self:SetStartState("Unloaded") +self:AddTransition("Unloaded","Pickup","Unloaded") +self:AddTransition("*","Landed","*") +self:AddTransition("*","Load","*") +self:AddTransition("*","Loaded","Loaded") +self:AddTransition("Loaded","PickedUp","Loaded") +self:AddTransition("Loaded","Deploy","*") +self:AddTransition("*","Queue","*") +self:AddTransition("*","Orbit","*") +self:AddTransition("*","Destroyed","*") +self:AddTransition("*","Unload","*") +self:AddTransition("*","Unloaded","Unloaded") +self:AddTransition("Unloaded","Deployed","Unloaded") +self:AddTransition("*","Home","*") +Helicopter:HandleEvent(EVENTS.Crash, +function(Helicopter,EventData) +AI_CARGO_QUEUE[Helicopter]=nil +end +) +Helicopter:HandleEvent(EVENTS.Land, +function(Helicopter,EventData) +self:ScheduleOnce(60, +function(Helicopter) +AI_CARGO_QUEUE[Helicopter]=nil +end,Helicopter +) +end +) +self:SetCarrier(Helicopter) +self.landingspeed=15 +self.landingheight=5.5 +return self +end +function AI_CARGO_HELICOPTER:SetCarrier(Helicopter) +local AICargo=self +self.Helicopter=Helicopter +self.Helicopter:SetState(self.Helicopter,"AI_CARGO_HELICOPTER",self) +self.RoutePickup=false +self.RouteDeploy=false +Helicopter:HandleEvent(EVENTS.Dead) +Helicopter:HandleEvent(EVENTS.Hit) +Helicopter:HandleEvent(EVENTS.Land) +function Helicopter:OnEventDead(EventData) +local AICargoTroops=self:GetState(self,"AI_CARGO_HELICOPTER") +self:F({AICargoTroops=AICargoTroops}) +if AICargoTroops then +self:F({}) +if not AICargoTroops:Is("Loaded")then +AICargoTroops:Destroyed() +end +end +end +function Helicopter:OnEventLand(EventData) +AICargo:Landed() +end +self.Coalition=self.Helicopter:GetCoalition() +self:SetControllable(Helicopter) +return self +end +function AI_CARGO_HELICOPTER:SetLandingSpeedAndHeight(speed,height) +local _speed=speed or 15 +local _height=height or 5.5 +self.landingheight=_height +self.landingspeed=_speed +return self +end +function AI_CARGO_HELICOPTER:onafterLanded(Helicopter,From,Event,To) +self:F({From,Event,To}) +Helicopter:F({Name=Helicopter:GetName()}) +if Helicopter and Helicopter:IsAlive()then +self:T({Helicopter:GetName(),Height=Helicopter:GetHeight(true),Velocity=Helicopter:GetVelocityKMH()}) +if self.RoutePickup==true then +if Helicopter:GetHeight(true)<=self.landingheight then +self:Load(self.PickupZone) +self.RoutePickup=false +end +end +if self.RouteDeploy==true then +if Helicopter:GetHeight(true)<=self.landingheight then +self:Unload(self.DeployZone) +self.RouteDeploy=false +end +end +end +end +function AI_CARGO_HELICOPTER:onafterQueue(Helicopter,From,Event,To,Coordinate,Speed,DeployZone) +self:F({From,Event,To,Coordinate,Speed,DeployZone}) +local HelicopterInZone=false +if Helicopter and Helicopter:IsAlive()==true then +local Distance=Coordinate:DistanceFromPointVec2(Helicopter:GetCoordinate()) +if Distance>2000 then +self:__Queue(-10,Coordinate,Speed,DeployZone) +else +local ZoneFree=true +for Helicopter,ZoneQueue in pairs(AI_CARGO_QUEUE)do +local ZoneQueue=ZoneQueue +if ZoneQueue:IsCoordinateInZone(Coordinate)then +ZoneFree=false +end +end +self:F({ZoneFree=ZoneFree}) +if ZoneFree==true then +local ZoneQueue=ZONE_RADIUS:New(Helicopter:GetName(),Coordinate:GetVec2(),100) +AI_CARGO_QUEUE[Helicopter]=ZoneQueue +local Route={} +local CoordinateTo=Coordinate +local landheight=CoordinateTo:GetLandHeight() +CoordinateTo.y=landheight+50 +local WaypointTo=CoordinateTo:WaypointAir( +"RADIO", +COORDINATE.WaypointType.TurningPoint, +COORDINATE.WaypointAction.TurningPoint, +50, +true +) +Route[#Route+1]=WaypointTo +local Tasks={} +Tasks[#Tasks+1]=Helicopter:TaskLandAtVec2(CoordinateTo:GetVec2()) +Route[#Route].task=Helicopter:TaskCombo(Tasks) +Route[#Route+1]=WaypointTo +Helicopter:Route(Route,0) +self.DeployZone=DeployZone +else +self:__Queue(-10,Coordinate,Speed,DeployZone) +end +end +else +AI_CARGO_QUEUE[Helicopter]=nil +end +end +function AI_CARGO_HELICOPTER:onafterOrbit(Helicopter,From,Event,To,Coordinate) +self:F({From,Event,To,Coordinate}) +if Helicopter and Helicopter:IsAlive()then +local Route={} +local CoordinateTo=Coordinate +local landheight=CoordinateTo:GetLandHeight() +CoordinateTo.y=landheight+50 +local WaypointTo=CoordinateTo:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,50,true) +Route[#Route+1]=WaypointTo +local Tasks={} +Tasks[#Tasks+1]=Helicopter:TaskOrbitCircle(math.random(30,80),150,CoordinateTo:GetRandomCoordinateInRadius(800,500)) +Route[#Route].task=Helicopter:TaskCombo(Tasks) +Route[#Route+1]=WaypointTo +Helicopter:Route(Route,0) +end +end +function AI_CARGO_HELICOPTER:onafterDeployed(Helicopter,From,Event,To,DeployZone) +self:F({From,Event,To,DeployZone=DeployZone}) +self:Orbit(Helicopter:GetCoordinate(),50) +self:ScheduleOnce(30, +function(Helicopter) +AI_CARGO_QUEUE[Helicopter]=nil +end,Helicopter +) +self:GetParent(self,AI_CARGO_HELICOPTER).onafterDeployed(self,Helicopter,From,Event,To,DeployZone) +end +function AI_CARGO_HELICOPTER:onafterPickup(Helicopter,From,Event,To,Coordinate,Speed,Height,PickupZone) +self:F({Coordinate,Speed,Height,PickupZone}) +if Helicopter and Helicopter:IsAlive()~=nil then +Helicopter:Activate() +self.RoutePickup=true +Coordinate.y=Height +local _speed=Speed or Helicopter:GetSpeedMax()*0.5 +local Route={} +local CoordinateFrom=Helicopter:GetCoordinate() +local WaypointFrom=CoordinateFrom:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,_speed,true) +local CoordinateTo=Coordinate +local landheight=CoordinateTo:GetLandHeight() +CoordinateTo.y=landheight+50 +local WaypointTo=CoordinateTo:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,_speed,true) +Route[#Route+1]=WaypointFrom +Route[#Route+1]=WaypointTo +Helicopter:WayPointInitialize(Route) +local Tasks={} +Tasks[#Tasks+1]=Helicopter:TaskLandAtVec2(CoordinateTo:GetVec2()) +Route[#Route].task=Helicopter:TaskCombo(Tasks) +Route[#Route+1]=WaypointTo +Helicopter:Route(Route,1) +self.PickupZone=PickupZone +self:GetParent(self,AI_CARGO_HELICOPTER).onafterPickup(self,Helicopter,From,Event,To,Coordinate,Speed,Height,PickupZone) +end +end +function AI_CARGO_HELICOPTER:_Deploy(AICargoHelicopter,Coordinate,DeployZone) +AICargoHelicopter:__Queue(-10,Coordinate,100,DeployZone) +end +function AI_CARGO_HELICOPTER:onafterDeploy(Helicopter,From,Event,To,Coordinate,Speed,Height,DeployZone) +self:F({From,Event,To,Coordinate,Speed,Height,DeployZone}) +if Helicopter and Helicopter:IsAlive()~=nil then +self.RouteDeploy=true +local Route={} +Coordinate.y=Height +local _speed=Speed or Helicopter:GetSpeedMax()*0.5 +local CoordinateFrom=Helicopter:GetCoordinate() +local WaypointFrom=CoordinateFrom:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,_speed,true) +Route[#Route+1]=WaypointFrom +Route[#Route+1]=WaypointFrom +local CoordinateTo=Coordinate +local landheight=CoordinateTo:GetLandHeight() +CoordinateTo.y=landheight+50 +local WaypointTo=CoordinateTo:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,_speed,true) +Route[#Route+1]=WaypointTo +Route[#Route+1]=WaypointTo +Helicopter:WayPointInitialize(Route) +local Tasks={} +Tasks[#Tasks+1]=Helicopter:TaskFunction("AI_CARGO_HELICOPTER._Deploy",self,Coordinate,DeployZone) +Tasks[#Tasks+1]=Helicopter:TaskOrbitCircle(math.random(30,100),_speed,CoordinateTo:GetRandomCoordinateInRadius(800,500)) +Route[#Route].task=Helicopter:TaskCombo(Tasks) +Route[#Route+1]=WaypointTo +Helicopter:Route(Route,0) +self:GetParent(self,AI_CARGO_HELICOPTER).onafterDeploy(self,Helicopter,From,Event,To,Coordinate,Speed,Height,DeployZone) +end +end +function AI_CARGO_HELICOPTER:onafterHome(Helicopter,From,Event,To,Coordinate,Speed,Height,HomeZone) +self:F({From,Event,To,Coordinate,Speed,Height}) +if Helicopter and Helicopter:IsAlive()~=nil then +self.RouteHome=true +local Route={} +Height=Height or 50 +Speed=Speed or Helicopter:GetSpeedMax()*0.5 +local CoordinateFrom=Helicopter:GetCoordinate() +local WaypointFrom=CoordinateFrom:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true) +Route[#Route+1]=WaypointFrom +local CoordinateTo=Coordinate +local landheight=CoordinateTo:GetLandHeight() +CoordinateTo.y=landheight+Height +local WaypointTo=CoordinateTo:WaypointAir("RADIO",COORDINATE.WaypointType.TurningPoint,COORDINATE.WaypointAction.TurningPoint,Speed,true) +Route[#Route+1]=WaypointTo +Helicopter:WayPointInitialize(Route) +local Tasks={} +Tasks[#Tasks+1]=Helicopter:TaskLandAtVec2(CoordinateTo:GetVec2()) +Route[#Route].task=Helicopter:TaskCombo(Tasks) +Route[#Route+1]=WaypointTo +Helicopter:Route(Route,0) +end +end +AI_CARGO_AIRPLANE={ +ClassName="AI_CARGO_AIRPLANE", +Coordinate=nil, +} +function AI_CARGO_AIRPLANE:New(Airplane,CargoSet) +local self=BASE:Inherit(self,AI_CARGO:New(Airplane,CargoSet)) +self:AddTransition("*","Landed","*") +self:AddTransition("*","Home","*") +self:AddTransition("*","Destroyed","Destroyed") +self:SetCarrier(Airplane) +return self +end +function AI_CARGO_AIRPLANE:SetCarrier(Airplane) +local AICargo=self +self.Airplane=Airplane +self.Airplane:SetState(self.Airplane,"AI_CARGO_AIRPLANE",self) +self.RoutePickup=false +self.RouteDeploy=false +Airplane:HandleEvent(EVENTS.Dead) +Airplane:HandleEvent(EVENTS.Hit) +Airplane:HandleEvent(EVENTS.EngineShutdown) +function Airplane:OnEventDead(EventData) +local AICargoTroops=self:GetState(self,"AI_CARGO_AIRPLANE") +self:F({AICargoTroops=AICargoTroops}) +if AICargoTroops then +self:F({}) +if not AICargoTroops:Is("Loaded")then +AICargoTroops:Destroyed() +end +end +end +function Airplane:OnEventHit(EventData) +local AICargoTroops=self:GetState(self,"AI_CARGO_AIRPLANE") +if AICargoTroops then +self:F({OnHitLoaded=AICargoTroops:Is("Loaded")}) +if AICargoTroops:Is("Loaded")or AICargoTroops:Is("Boarding")then +AICargoTroops:Unload() +end +end +end +function Airplane:OnEventEngineShutdown(EventData) +AICargo.Relocating=false +AICargo:Landed(self.Airplane) +end +self.Coalition=self.Airplane:GetCoalition() +self:SetControllable(Airplane) +return self +end +function AI_CARGO_AIRPLANE:FindCarrier(Coordinate,Radius) +local CoordinateZone=ZONE_RADIUS:New("Zone",Coordinate:GetVec2(),Radius) +CoordinateZone:Scan({Object.Category.UNIT}) +for _,DCSUnit in pairs(CoordinateZone:GetScannedUnits())do +local NearUnit=UNIT:Find(DCSUnit) +self:F({NearUnit=NearUnit}) +if not NearUnit:GetState(NearUnit,"AI_CARGO_AIRPLANE")then +local Attributes=NearUnit:GetDesc() +self:F({Desc=Attributes}) +if NearUnit:HasAttribute("Trucks")then +self:SetCarrier(NearUnit) +break +end +end +end +end +function AI_CARGO_AIRPLANE:onafterLanded(Airplane,From,Event,To) +self:F({Airplane,From,Event,To}) +if Airplane and Airplane:IsAlive()~=nil then +if self.RoutePickup==true then +self:Load(self.PickupZone) +end +if self.RouteDeploy==true then +self:Unload() +self.RouteDeploy=false +end +end +end +function AI_CARGO_AIRPLANE:onafterPickup(Airplane,From,Event,To,Coordinate,Speed,Height,PickupZone) +if Airplane and Airplane:IsAlive()then +local airbasepickup=Coordinate:GetClosestAirbase() +self.PickupZone=PickupZone or ZONE_AIRBASE:New(airbasepickup:GetName()) +local ClosestAirbase,DistToAirbase=Airplane:GetCoordinate():GetClosestAirbase() +if Airplane:InAir()then +self.Airbase=nil +else +self.Airbase=ClosestAirbase +end +local Airbase=self.PickupZone:GetAirbase() +local Dist=Airbase:GetCoordinate():Get2DDistance(ClosestAirbase:GetCoordinate()) +if Airplane:InAir()or Dist>500 then +self:Route(Airplane,Airbase,Speed,Height) +self.Airbase=Airbase +self.RoutePickup=true +else +self.RoutePickup=true +self:Landed() +end +self:GetParent(self,AI_CARGO_AIRPLANE).onafterPickup(self,Airplane,From,Event,To,Coordinate,Speed,Height,self.PickupZone) +end +end +function AI_CARGO_AIRPLANE:onafterDeploy(Airplane,From,Event,To,Coordinate,Speed,Height,DeployZone) +if Airplane and Airplane:IsAlive()~=nil then +local Airbase=Coordinate:GetClosestAirbase() +if DeployZone then +Airbase=DeployZone:GetAirbase() +end +if Airplane:IsAlive()==false then +Airplane:SetCommand({id='Start',params={}}) +end +self:Route(Airplane,Airbase,Speed,Height) +self.RouteDeploy=true +self.Airbase=Airbase +self:GetParent(self,AI_CARGO_AIRPLANE).onafterDeploy(self,Airplane,From,Event,To,Coordinate,Speed,Height,DeployZone) +end +end +function AI_CARGO_AIRPLANE:onafterUnload(Airplane,From,Event,To,DeployZone) +local UnboardInterval=10 +local UnboardDelay=10 +if Airplane and Airplane:IsAlive()then +for _,AirplaneUnit in pairs(Airplane:GetUnits())do +local Cargos=AirplaneUnit:GetCargo() +for CargoID,Cargo in pairs(Cargos)do +local Angle=180 +local CargoCarrierHeading=Airplane:GetHeading() +local CargoDeployHeading=((CargoCarrierHeading+Angle)>=360)and(CargoCarrierHeading+Angle-360)or(CargoCarrierHeading+Angle) +self:T({CargoCarrierHeading,CargoDeployHeading}) +local CargoDeployCoordinate=Airplane:GetPointVec2():Translate(150,CargoDeployHeading) +Cargo:__UnBoard(UnboardDelay,CargoDeployCoordinate) +UnboardDelay=UnboardDelay+UnboardInterval +Cargo:SetDeployed(true) +self:__Unboard(UnboardDelay,Cargo,AirplaneUnit,DeployZone) +end +end +end +end +function AI_CARGO_AIRPLANE:Route(Airplane,Airbase,Speed,Height,Uncontrolled) +if Airplane and Airplane:IsAlive()then +local Takeoff=SPAWN.Takeoff.Cold +local Template=Airplane:GetTemplate() +if Template==nil then +return +end +local Points={} +local AirbasePointVec2=Airbase:GetPointVec2() +local ToWaypoint=AirbasePointVec2:WaypointAir(COORDINATE.WaypointAltType.BARO,"Land","Landing",Speed or Airplane:GetSpeedMax()*0.8,true,Airbase) +if self.Airbase then +Template.route.points[2]=ToWaypoint +Airplane:RespawnAtCurrentAirbase(Template,Takeoff,Uncontrolled) +else +local GroupPoint=Airplane:GetVec2() +local FromWaypoint={} +FromWaypoint.x=GroupPoint.x +FromWaypoint.y=GroupPoint.y +FromWaypoint.type="Turning Point" +FromWaypoint.action="Turning Point" +FromWaypoint.speed=Airplane:GetSpeedMax()*0.8 +Points[1]=FromWaypoint +Points[2]=ToWaypoint +local PointVec3=Airplane:GetPointVec3() +Template.x=PointVec3.x +Template.y=PointVec3.z +Template.route.points=Points +local GroupSpawned=Airplane:Respawn(Template) +end +end +end +function AI_CARGO_AIRPLANE:onafterHome(Airplane,From,Event,To,Coordinate,Speed,Height,HomeZone) +if Airplane and Airplane:IsAlive()then +self.RouteHome=true +local HomeBase=HomeZone:GetAirbase() +self.Airbase=HomeBase +self:Route(Airplane,HomeBase,Speed,Height) +end +end +AI_CARGO_SHIP={ +ClassName="AI_CARGO_SHIP", +Coordinate=nil +} +function AI_CARGO_SHIP:New(Ship,CargoSet,CombatRadius,ShippingLane) +local self=BASE:Inherit(self,AI_CARGO:New(Ship,CargoSet)) +self:AddTransition("*","Monitor","*") +self:AddTransition("*","Destroyed","Destroyed") +self:AddTransition("*","Home","*") +self:SetCombatRadius(0) +self:SetShippingLane(ShippingLane) +self:SetCarrier(Ship) +return self +end +function AI_CARGO_SHIP:SetCarrier(CargoCarrier) +self.CargoCarrier=CargoCarrier +self.CargoCarrier:SetState(self.CargoCarrier,"AI_CARGO_SHIP",self) +CargoCarrier:HandleEvent(EVENTS.Dead) +function CargoCarrier:OnEventDead(EventData) +self:F({"dead"}) +local AICargoTroops=self:GetState(self,"AI_CARGO_SHIP") +self:F({AICargoTroops=AICargoTroops}) +if AICargoTroops then +self:F({}) +if not AICargoTroops:Is("Loaded")then +AICargoTroops:Destroyed() +end +end +end +self.Zone=ZONE_UNIT:New(self.CargoCarrier:GetName().."-Zone",self.CargoCarrier,self.CombatRadius) +self.Coalition=self.CargoCarrier:GetCoalition() +self:SetControllable(CargoCarrier) +return self +end +function AI_CARGO_SHIP:FindCarrier(Coordinate,Radius) +local CoordinateZone=ZONE_RADIUS:New("Zone",Coordinate:GetVec2(),Radius) +CoordinateZone:Scan({Object.Category.UNIT}) +for _,DCSUnit in pairs(CoordinateZone:GetScannedUnits())do +local NearUnit=UNIT:Find(DCSUnit) +self:F({NearUnit=NearUnit}) +if not NearUnit:GetState(NearUnit,"AI_CARGO_SHIP")then +local Attributes=NearUnit:GetDesc() +self:F({Desc=Attributes}) +if NearUnit:HasAttributes("Trucks")then +return NearUnit:GetGroup() +end +end +end +return nil +end +function AI_CARGO_SHIP:SetShippingLane(ShippingLane) +self.ShippingLane=ShippingLane +return self +end +function AI_CARGO_SHIP:SetCombatRadius(CombatRadius) +self.CombatRadius=CombatRadius or 0 +return self +end +function AI_CARGO_SHIP:FollowToCarrier(Me,ShipUnit,CargoGroup) +local InfantryGroup=CargoGroup:GetGroup() +self:F({self=self:GetClassNameAndID(),InfantryGroup=InfantryGroup:GetName()}) +if ShipUnit:IsAlive()then +if InfantryGroup:IsPartlyInZone(ZONE_UNIT:New("Radius",ShipUnit,1000))then +Me:Guard() +else +self:F({InfantryGroup=InfantryGroup:GetName()}) +if InfantryGroup:IsAlive()then +self:F({InfantryGroup=InfantryGroup:GetName()}) +local Waypoints={} +local FromCoord=InfantryGroup:GetCoordinate() +local FromGround=FromCoord:WaypointGround(10,"Diamond") +self:F({FromGround=FromGround}) +table.insert(Waypoints,FromGround) +local ToCoord=ShipUnit:GetCoordinate():GetRandomCoordinateInRadius(10,5) +local ToGround=ToCoord:WaypointGround(10,"Diamond") +self:F({ToGround=ToGround}) +table.insert(Waypoints,ToGround) +local TaskRoute=InfantryGroup:TaskFunction("AI_CARGO_SHIP.FollowToCarrier",Me,ShipUnit,CargoGroup) +self:F({Waypoints=Waypoints}) +local Waypoint=Waypoints[#Waypoints] +InfantryGroup:SetTaskWaypoint(Waypoint,TaskRoute) +InfantryGroup:Route(Waypoints,1) +end +end +end +end +function AI_CARGO_SHIP:onafterMonitor(Ship,From,Event,To) +self:F({Ship,From,Event,To,IsTransporting=self:IsTransporting()}) +if self.CombatRadius>0 then +if Ship and Ship:IsAlive()then +if self.CarrierCoordinate then +if self:IsTransporting()==true then +local Coordinate=Ship:GetCoordinate() +if self:Is("Unloaded")or self:Is("Loaded")then +self.Zone:Scan({Object.Category.UNIT}) +if self.Zone:IsAllInZoneOfCoalition(self.Coalition)then +if self:Is("Unloaded")then +self:Reload() +end +else +if self:Is("Loaded")then +self:__Unload(1,nil,true) +else +if self:Is("Unloaded")then +end +self:F("I am here"..self:GetCurrentState()) +if self:Is("Following")then +for Cargo,ShipUnit in pairs(self.Carrier_Cargo)do +local Cargo=Cargo +local ShipUnit=ShipUnit +if Cargo:IsAlive()then +if not Cargo:IsNear(ShipUnit,40)then +ShipUnit:RouteStop() +self.CarrierStopped=true +else +if self.CarrierStopped then +if Cargo:IsNear(ShipUnit,25)then +ShipUnit:RouteResume() +self.CarrierStopped=nil +end +end +end +end +end +end +end +end +end +end +end +self.CarrierCoordinate=Ship:GetCoordinate() +end +self:__Monitor(-5) +end +end +function AI_CARGO_SHIP._Pickup(Ship,self,Coordinate,Speed,PickupZone) +Ship:F({"AI_CARGO_Ship._Pickup:",Ship:GetName()}) +if Ship:IsAlive()then +self:Load(PickupZone) +end +end +function AI_CARGO_SHIP._Deploy(Ship,self,Coordinate,DeployZone) +Ship:F({"AI_CARGO_Ship._Deploy:",Ship}) +if Ship:IsAlive()then +self:Unload(DeployZone) +end +end +function AI_CARGO_SHIP:onafterPickup(Ship,From,Event,To,Coordinate,Speed,Height,PickupZone) +if Ship and Ship:IsAlive()then +AI_CARGO_SHIP._Pickup(Ship,self,Coordinate,Speed,PickupZone) +self:GetParent(self,AI_CARGO_SHIP).onafterPickup(self,Ship,From,Event,To,Coordinate,Speed,Height,PickupZone) +end +end +function AI_CARGO_SHIP:onafterDeploy(Ship,From,Event,To,Coordinate,Speed,Height,DeployZone) +if Ship and Ship:IsAlive()then +Speed=Speed or Ship:GetSpeedMax()*0.8 +local lane=self.ShippingLane +if lane then +local Waypoints={} +for i=1,#lane do +local coord=lane[i] +local Waypoint=coord:WaypointGround(_speed) +table.insert(Waypoints,Waypoint) +end +local TaskFunction=Ship:TaskFunction("AI_CARGO_SHIP._Deploy",self,Coordinate,DeployZone) +local Waypoint=Waypoints[#Waypoints] +Ship:SetTaskWaypoint(Waypoint,TaskFunction) +Ship:Route(Waypoints,1) +self:GetParent(self,AI_CARGO_SHIP).onafterDeploy(self,Ship,From,Event,To,Coordinate,Speed,Height,DeployZone) +else +self:E(self.lid.."ERROR: No shipping lane defined for Naval Transport!") +end +end +end +function AI_CARGO_SHIP:onafterUnload(Ship,From,Event,To,DeployZone,Defend) +self:F({Ship,From,Event,To,DeployZone,Defend=Defend}) +local UnboardInterval=5 +local UnboardDelay=5 +if Ship and Ship:IsAlive()then +for _,ShipUnit in pairs(Ship:GetUnits())do +local ShipUnit=ShipUnit +Ship:RouteStop() +for _,Cargo in pairs(ShipUnit:GetCargo())do +self:F({Cargo=Cargo:GetName(),Isloaded=Cargo:IsLoaded()}) +if Cargo:IsLoaded()then +local unboardCoord=DeployZone:GetRandomPointVec2() +Cargo:__UnBoard(UnboardDelay,unboardCoord,1000) +UnboardDelay=UnboardDelay+Cargo:GetCount()*UnboardInterval +self:__Unboard(UnboardDelay,Cargo,ShipUnit,DeployZone,Defend) +if not Defend==true then +Cargo:SetDeployed(true) +end +end +end +end +end +end +function AI_CARGO_SHIP:onafterHome(Ship,From,Event,To,Coordinate,Speed,Height,HomeZone) +if Ship and Ship:IsAlive()then +self.RouteHome=true +Speed=Speed or Ship:GetSpeedMax()*0.8 +local lane=self.ShippingLane +if lane then +local Waypoints={} +for i=#lane,1,-1 do +local coord=lane[i] +local Waypoint=coord:WaypointGround(_speed) +table.insert(Waypoints,Waypoint) +end +local Waypoint=Waypoints[#Waypoints] +Ship:Route(Waypoints,1) +else +self:E(self.lid.."ERROR: No shipping lane defined for Naval Transport!") +end +end +end +AI_CARGO_DISPATCHER={ +ClassName="AI_CARGO_DISPATCHER", +AI_Cargo={}, +PickupCargo={} +} +AI_CARGO_DISPATCHER.AI_Cargo={} +AI_CARGO_DISPATCHER.PickupCargo={} +function AI_CARGO_DISPATCHER:New(CarrierSet,CargoSet,PickupZoneSet,DeployZoneSet) +local self=BASE:Inherit(self,FSM:New()) +self.SetCarrier=CarrierSet +self.SetCargo=CargoSet +self.PickupZoneSet=PickupZoneSet +self.DeployZoneSet=DeployZoneSet +self:SetStartState("Idle") +self:AddTransition("Monitoring","Monitor","Monitoring") +self:AddTransition("Idle","Start","Monitoring") +self:AddTransition("Monitoring","Stop","Idle") +self:AddTransition("Monitoring","Pickup","Monitoring") +self:AddTransition("Monitoring","Load","Monitoring") +self:AddTransition("Monitoring","Loading","Monitoring") +self:AddTransition("Monitoring","Loaded","Monitoring") +self:AddTransition("Monitoring","PickedUp","Monitoring") +self:AddTransition("Monitoring","Transport","Monitoring") +self:AddTransition("Monitoring","Deploy","Monitoring") +self:AddTransition("Monitoring","Unload","Monitoring") +self:AddTransition("Monitoring","Unloading","Monitoring") +self:AddTransition("Monitoring","Unloaded","Monitoring") +self:AddTransition("Monitoring","Deployed","Monitoring") +self:AddTransition("Monitoring","Home","Monitoring") +self:SetMonitorTimeInterval(30) +self:SetDeployRadius(500,200) +self.PickupCargo={} +self.CarrierHome={} +function self.SetCarrier.OnAfterRemoved(SetCarrier,From,Event,To,CarrierName,Carrier) +self:F({Carrier=Carrier:GetName()}) +self.PickupCargo[Carrier]=nil +self.CarrierHome[Carrier]=nil +end +return self +end +function AI_CARGO_DISPATCHER:SetMonitorTimeInterval(MonitorTimeInterval) +self.MonitorTimeInterval=MonitorTimeInterval +return self +end +function AI_CARGO_DISPATCHER:SetHomeZone(HomeZone) +self.HomeZone=HomeZone +return self +end +function AI_CARGO_DISPATCHER:SetPickupRadius(OuterRadius,InnerRadius) +OuterRadius=OuterRadius or 0 +InnerRadius=InnerRadius or OuterRadius +self.PickupOuterRadius=OuterRadius +self.PickupInnerRadius=InnerRadius +return self +end +function AI_CARGO_DISPATCHER:SetPickupSpeed(MaxSpeed,MinSpeed) +MaxSpeed=MaxSpeed or 999 +MinSpeed=MinSpeed or MaxSpeed +self.PickupMinSpeed=MinSpeed +self.PickupMaxSpeed=MaxSpeed +return self +end +function AI_CARGO_DISPATCHER:SetDeployRadius(OuterRadius,InnerRadius) +OuterRadius=OuterRadius or 0 +InnerRadius=InnerRadius or OuterRadius +self.DeployOuterRadius=OuterRadius +self.DeployInnerRadius=InnerRadius +return self +end +function AI_CARGO_DISPATCHER:SetDeploySpeed(MaxSpeed,MinSpeed) +MaxSpeed=MaxSpeed or 999 +MinSpeed=MinSpeed or MaxSpeed +self.DeployMinSpeed=MinSpeed +self.DeployMaxSpeed=MaxSpeed +return self +end +function AI_CARGO_DISPATCHER:SetPickupHeight(MaxHeight,MinHeight) +MaxHeight=MaxHeight or 200 +MinHeight=MinHeight or MaxHeight +self.PickupMinHeight=MinHeight +self.PickupMaxHeight=MaxHeight +return self +end +function AI_CARGO_DISPATCHER:SetDeployHeight(MaxHeight,MinHeight) +MaxHeight=MaxHeight or 200 +MinHeight=MinHeight or MaxHeight +self.DeployMinHeight=MinHeight +self.DeployMaxHeight=MaxHeight +return self +end +function AI_CARGO_DISPATCHER:onafterMonitor() +self:F("Carriers") +self.SetCarrier:Flush() +for CarrierGroupName,Carrier in pairs(self.SetCarrier:GetSet())do +local Carrier=Carrier +if Carrier:IsAlive()~=nil then +local AI_Cargo=self.AI_Cargo[Carrier] +if not AI_Cargo then +self.AI_Cargo[Carrier]=self:AICargo(Carrier,self.SetCargo,self.CombatRadius) +AI_Cargo=self.AI_Cargo[Carrier] +function AI_Cargo.OnAfterPickup(AI_Cargo,CarrierGroup,From,Event,To,Coordinate,Speed,Height,PickupZone) +self:Pickup(CarrierGroup,Coordinate,Speed,Height,PickupZone) +end +function AI_Cargo.OnAfterLoad(AI_Cargo,CarrierGroup,From,Event,To,PickupZone) +self:Load(CarrierGroup,PickupZone) +end +function AI_Cargo.OnAfterBoard(AI_Cargo,CarrierGroup,From,Event,To,Cargo,CarrierUnit,PickupZone) +self:Loading(CarrierGroup,Cargo,CarrierUnit,PickupZone) +end +function AI_Cargo.OnAfterLoaded(AI_Cargo,CarrierGroup,From,Event,To,Cargo,CarrierUnit,PickupZone) +self:Loaded(CarrierGroup,Cargo,CarrierUnit,PickupZone) +end +function AI_Cargo.OnAfterPickedUp(AI_Cargo,CarrierGroup,From,Event,To,PickupZone) +self:PickedUp(CarrierGroup,PickupZone) +self:Transport(CarrierGroup) +end +function AI_Cargo.OnAfterDeploy(AI_Cargo,CarrierGroup,From,Event,To,Coordinate,Speed,Height,DeployZone) +self:Deploy(CarrierGroup,Coordinate,Speed,Height,DeployZone) +end +function AI_Cargo.OnAfterUnload(AI_Cargo,Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone) +self:Unloading(Carrier,Cargo,CarrierUnit,DeployZone) +end +function AI_Cargo.OnAfterUnboard(AI_Cargo,CarrierGroup,From,Event,To,Cargo,CarrierUnit,DeployZone) +self:Unloading(CarrierGroup,Cargo,CarrierUnit,DeployZone) +end +function AI_Cargo.OnAfterUnloaded(AI_Cargo,Carrier,From,Event,To,Cargo,CarrierUnit,DeployZone) +self:Unloaded(Carrier,Cargo,CarrierUnit,DeployZone) +end +function AI_Cargo.OnAfterDeployed(AI_Cargo,Carrier,From,Event,To,DeployZone) +self:Deployed(Carrier,DeployZone) +end +function AI_Cargo.OnAfterHome(AI_Cargo,Carrier,From,Event,To,Coordinate,Speed,Height,HomeZone) +self:Home(Carrier,Coordinate,Speed,Height,HomeZone) +end +end +self:T({Carrier=CarrierGroupName,IsRelocating=AI_Cargo:IsRelocating(),IsTransporting=AI_Cargo:IsTransporting()}) +if AI_Cargo:IsRelocating()==false and AI_Cargo:IsTransporting()==false then +local PickupCargo=nil +local PickupZone=nil +self.SetCargo:Flush() +for CargoName,Cargo in UTILS.spairs(self.SetCargo:GetSet(),function(t,a,b)return t[a]:GetWeight()<t[b]:GetWeight()end)do +local Cargo=Cargo +self:F({Cargo=Cargo:GetName(),UnLoaded=Cargo:IsUnLoaded(),Deployed=Cargo:IsDeployed(),PickupCargo=self.PickupCargo[Carrier]~=nil}) +if Cargo:IsUnLoaded()==true and Cargo:IsDeployed()==false then +local CargoCoordinate=Cargo:GetCoordinate() +local CoordinateFree=true +PickupZone=self.PickupZoneSet and self.PickupZoneSet:IsCoordinateInZone(CargoCoordinate) +if not self.PickupZoneSet or PickupZone then +for CarrierPickup,Coordinate in pairs(self.PickupCargo)do +if CarrierPickup:IsAlive()==true then +if CargoCoordinate:Get2DDistance(Coordinate)<=25 then +self:F({"Coordinate not free for ",Cargo=Cargo:GetName(),Carrier:GetName(),PickupCargo=self.PickupCargo[Carrier]~=nil}) +CoordinateFree=false +break +end +else +self.PickupCargo[CarrierPickup]=nil +end +end +if CoordinateFree==true then +local LargestLoadCapacity=0 +for _,Carrier in pairs(Carrier:GetUnits())do +local LoadCapacity=Carrier:GetCargoBayFreeWeight() +if LargestLoadCapacity<LoadCapacity then +LargestLoadCapacity=LoadCapacity +end +end +if LargestLoadCapacity>=Cargo:GetWeight()then +self.PickupCargo[Carrier]=CargoCoordinate +PickupCargo=Cargo +break +else +local text=string.format("WARNING: Cargo %s is too heavy to be loaded into transport. Cargo weight %.1f > %.1f load capacity of carrier %s.", +tostring(Cargo:GetName()),Cargo:GetWeight(),LargestLoadCapacity,tostring(Carrier:GetName())) +self:T(text) +end +end +end +end +end +if PickupCargo then +self.CarrierHome[Carrier]=nil +local PickupCoordinate=PickupCargo:GetCoordinate():GetRandomCoordinateInRadius(self.PickupOuterRadius,self.PickupInnerRadius) +AI_Cargo:Pickup(PickupCoordinate,math.random(self.PickupMinSpeed,self.PickupMaxSpeed),math.random(self.PickupMinHeight,self.PickupMaxHeight),PickupZone) +break +else +if self.HomeZone then +if not self.CarrierHome[Carrier]then +self.CarrierHome[Carrier]=true +AI_Cargo:Home(self.HomeZone:GetRandomPointVec2(),math.random(self.PickupMinSpeed,self.PickupMaxSpeed),math.random(self.PickupMinHeight,self.PickupMaxHeight),self.HomeZone) +end +end +end +end +end +end +self:__Monitor(self.MonitorTimeInterval) +end +function AI_CARGO_DISPATCHER:onafterStart(From,Event,To) +self:__Monitor(-1) +end +function AI_CARGO_DISPATCHER:onafterTransport(From,Event,To,Carrier,Cargo) +if self.DeployZoneSet then +if self.AI_Cargo[Carrier]:IsTransporting()==true then +local DeployZone=self.DeployZoneSet:GetRandomZone() +local DeployCoordinate=DeployZone:GetCoordinate():GetRandomCoordinateInRadius(self.DeployOuterRadius,self.DeployInnerRadius) +self.AI_Cargo[Carrier]:__Deploy(0.1,DeployCoordinate,math.random(self.DeployMinSpeed,self.DeployMaxSpeed),math.random(self.DeployMinHeight,self.DeployMaxHeight),DeployZone) +end +end +self:F({Carrier=Carrier:GetName(),PickupCargo=self.PickupCargo}) +self.PickupCargo[Carrier]=nil +end +AI_CARGO_DISPATCHER_APC={ +ClassName="AI_CARGO_DISPATCHER_APC", +} +function AI_CARGO_DISPATCHER_APC:New(APCSet,CargoSet,PickupZoneSet,DeployZoneSet,CombatRadius) +local self=BASE:Inherit(self,AI_CARGO_DISPATCHER:New(APCSet,CargoSet,PickupZoneSet,DeployZoneSet)) +self:SetDeploySpeed(120,70) +self:SetPickupSpeed(120,70) +self:SetPickupRadius(0,0) +self:SetDeployRadius(0,0) +self:SetPickupHeight() +self:SetDeployHeight() +self:SetCombatRadius(CombatRadius) +return self +end +function AI_CARGO_DISPATCHER_APC:AICargo(APC,CargoSet) +local aicargoapc=AI_CARGO_APC:New(APC,CargoSet,self.CombatRadius) +aicargoapc:SetDeployOffRoad(self.deployOffroad,self.deployFormation) +aicargoapc:SetPickupOffRoad(self.pickupOffroad,self.pickupFormation) +return aicargoapc +end +function AI_CARGO_DISPATCHER_APC:SetCombatRadius(CombatRadius) +self.CombatRadius=CombatRadius or 0 +return self +end +function AI_CARGO_DISPATCHER_APC:SetOffRoad(Offroad,Formation) +self:SetPickupOffRoad(Offroad,Formation) +self:SetDeployOffRoad(Offroad,Formation) +return self +end +function AI_CARGO_DISPATCHER_APC:SetPickupOffRoad(Offroad,Formation) +self.pickupOffroad=Offroad +self.pickupFormation=Formation or ENUMS.Formation.Vehicle.OffRoad +return self +end +function AI_CARGO_DISPATCHER_APC:SetDeployOffRoad(Offroad,Formation) +self.deployOffroad=Offroad +self.deployFormation=Formation or ENUMS.Formation.Vehicle.OffRoad +return self +end +AI_CARGO_DISPATCHER_HELICOPTER={ +ClassName="AI_CARGO_DISPATCHER_HELICOPTER", +} +function AI_CARGO_DISPATCHER_HELICOPTER:New(HelicopterSet,CargoSet,PickupZoneSet,DeployZoneSet) +local self=BASE:Inherit(self,AI_CARGO_DISPATCHER:New(HelicopterSet,CargoSet,PickupZoneSet,DeployZoneSet)) +self:SetPickupSpeed(350,150) +self:SetDeploySpeed(350,150) +self:SetPickupRadius(40,12) +self:SetDeployRadius(40,12) +self:SetPickupHeight(500,200) +self:SetDeployHeight(500,200) +return self +end +function AI_CARGO_DISPATCHER_HELICOPTER:AICargo(Helicopter,CargoSet) +local dispatcher=AI_CARGO_HELICOPTER:New(Helicopter,CargoSet) +dispatcher:SetLandingSpeedAndHeight(27,6) +return dispatcher +end +AI_CARGO_DISPATCHER_AIRPLANE={ +ClassName="AI_CARGO_DISPATCHER_AIRPLANE", +} +function AI_CARGO_DISPATCHER_AIRPLANE:New(AirplaneSet,CargoSet,PickupZoneSet,DeployZoneSet) +local self=BASE:Inherit(self,AI_CARGO_DISPATCHER:New(AirplaneSet,CargoSet,PickupZoneSet,DeployZoneSet)) +self:SetPickupSpeed(1200,600) +self:SetDeploySpeed(1200,600) +self:SetPickupRadius(0,0) +self:SetDeployRadius(0,0) +self:SetPickupHeight(8000,6000) +self:SetDeployHeight(8000,6000) +self:SetMonitorTimeInterval(600) +return self +end +function AI_CARGO_DISPATCHER_AIRPLANE:AICargo(Airplane,CargoSet) +return AI_CARGO_AIRPLANE:New(Airplane,CargoSet) +end +AI_CARGO_DISPATCHER_SHIP={ +ClassName="AI_CARGO_DISPATCHER_SHIP" +} +function AI_CARGO_DISPATCHER_SHIP:New(ShipSet,CargoSet,PickupZoneSet,DeployZoneSet,ShippingLane) +local self=BASE:Inherit(self,AI_CARGO_DISPATCHER:New(ShipSet,CargoSet,PickupZoneSet,DeployZoneSet)) +self:SetPickupSpeed(60,10) +self:SetDeploySpeed(60,10) +self:SetPickupRadius(500,6000) +self:SetDeployRadius(500,6000) +self:SetPickupHeight(0,0) +self:SetDeployHeight(0,0) +self:SetShippingLane(ShippingLane) +self:SetMonitorTimeInterval(600) +return self +end +function AI_CARGO_DISPATCHER_SHIP:SetShippingLane(ShippingLane) +self.ShippingLane=ShippingLane +return self +end +function AI_CARGO_DISPATCHER_SHIP:AICargo(Ship,CargoSet) +return AI_CARGO_SHIP:New(Ship,CargoSet,0,self.ShippingLane) +end +do +ACT_ASSIGN={ +ClassName="ACT_ASSIGN", +} +function ACT_ASSIGN:New() +local self=BASE:Inherit(self,FSM_PROCESS:New("ACT_ASSIGN")) +self:AddTransition("UnAssigned","Start","Waiting") +self:AddTransition("Waiting","Assign","Assigned") +self:AddTransition("Waiting","Reject","Rejected") +self:AddTransition("*","Fail","Failed") +self:AddEndState("Assigned") +self:AddEndState("Rejected") +self:AddEndState("Failed") +self:SetStartState("UnAssigned") +return self +end +end +do +ACT_ASSIGN_ACCEPT={ +ClassName="ACT_ASSIGN_ACCEPT", +} +function ACT_ASSIGN_ACCEPT:New(TaskBriefing) +local self=BASE:Inherit(self,ACT_ASSIGN:New()) +self.TaskBriefing=TaskBriefing +return self +end +function ACT_ASSIGN_ACCEPT:Init(FsmAssign) +self.TaskBriefing=FsmAssign.TaskBriefing +end +function ACT_ASSIGN_ACCEPT:onafterStart(ProcessUnit,Task,From,Event,To) +self:__Assign(1) +end +function ACT_ASSIGN_ACCEPT:onenterAssigned(ProcessUnit,Task,From,Event,To,TaskGroup) +self.Task:Assign(ProcessUnit,ProcessUnit:GetPlayerName()) +end +end +do +ACT_ASSIGN_MENU_ACCEPT={ +ClassName="ACT_ASSIGN_MENU_ACCEPT", +} +function ACT_ASSIGN_MENU_ACCEPT:New(TaskBriefing) +local self=BASE:Inherit(self,ACT_ASSIGN:New()) +self.TaskBriefing=TaskBriefing +return self +end +function ACT_ASSIGN_MENU_ACCEPT:Init(TaskBriefing) +self.TaskBriefing=TaskBriefing +return self +end +function ACT_ASSIGN_MENU_ACCEPT:onafterStart(ProcessUnit,Task,From,Event,To) +self:GetCommandCenter():MessageToGroup("Task "..self.Task:GetName().." has been assigned to you and your group!\nRead the briefing and use the Radio Menu (F10) / Task ... CONFIRMATION menu to accept or reject the task.\nYou have 2 minutes to accept, or the task assignment will be cancelled!",ProcessUnit:GetGroup(),120) +local TaskGroup=ProcessUnit:GetGroup() +self.Menu=MENU_GROUP:New(TaskGroup,"Task "..self.Task:GetName().." CONFIRMATION") +self.MenuAcceptTask=MENU_GROUP_COMMAND:New(TaskGroup,"Accept task "..self.Task:GetName(),self.Menu,self.MenuAssign,self,TaskGroup) +self.MenuRejectTask=MENU_GROUP_COMMAND:New(TaskGroup,"Reject task "..self.Task:GetName(),self.Menu,self.MenuReject,self,TaskGroup) +self:__Reject(120,TaskGroup) +end +function ACT_ASSIGN_MENU_ACCEPT:MenuAssign(TaskGroup) +self:__Assign(-1,TaskGroup) +end +function ACT_ASSIGN_MENU_ACCEPT:MenuReject(TaskGroup) +self:__Reject(-1,TaskGroup) +end +function ACT_ASSIGN_MENU_ACCEPT:onafterAssign(ProcessUnit,Task,From,Event,To,TaskGroup) +self.Menu:Remove() +end +function ACT_ASSIGN_MENU_ACCEPT:onafterReject(ProcessUnit,Task,From,Event,To,TaskGroup) +self:F({TaskGroup=TaskGroup}) +self.Menu:Remove() +self.Task:RejectGroup(TaskGroup) +end +function ACT_ASSIGN_MENU_ACCEPT:onenterAssigned(ProcessUnit,Task,From,Event,To,TaskGroup) +self.Task:Assign(ProcessUnit,ProcessUnit:GetPlayerName()) +end +end +do +ACT_ROUTE={ +ClassName="ACT_ROUTE", +} +function ACT_ROUTE:New() +local self=BASE:Inherit(self,FSM_PROCESS:New("ACT_ROUTE")) +self:AddTransition("*","Reset","None") +self:AddTransition("None","Start","Routing") +self:AddTransition("*","Report","*") +self:AddTransition("Routing","Route","Routing") +self:AddTransition("Routing","Pause","Pausing") +self:AddTransition("Routing","Arrive","Arrived") +self:AddTransition("*","Cancel","Cancelled") +self:AddTransition("Arrived","Success","Success") +self:AddTransition("*","Fail","Failed") +self:AddTransition("","","") +self:AddTransition("","","") +self:AddEndState("Arrived") +self:AddEndState("Failed") +self:AddEndState("Cancelled") +self:SetStartState("None") +self:SetRouteMode("C") +return self +end +function ACT_ROUTE:SetMenuCancel(MenuGroup,MenuText,ParentMenu,MenuTime,MenuTag) +self.CancelMenuGroupCommand=MENU_GROUP_COMMAND:New( +MenuGroup, +MenuText, +ParentMenu, +self.MenuCancel, +self +):SetTime(MenuTime):SetTag(MenuTag) +ParentMenu:SetTime(MenuTime) +ParentMenu:Remove(MenuTime,MenuTag) +return self +end +function ACT_ROUTE:SetRouteMode(RouteMode) +self.RouteMode=RouteMode +return self +end +function ACT_ROUTE:GetRouteText(Controllable) +local RouteText="" +local Coordinate=nil +if self.Coordinate then +Coordinate=self.Coordinate +end +if self.Zone then +Coordinate=self.Zone:GetPointVec3(self.Altitude) +Coordinate:SetHeading(self.Heading) +end +local Task=self:GetTask() +local CC=self:GetTask():GetMission():GetCommandCenter() +if CC then +if CC:IsModeWWII()then +local ShortestDistance=0 +local ShortestReferencePoint=nil +local ShortestReferenceName="" +self:F({CC.ReferencePoints}) +for ZoneName,Zone in pairs(CC.ReferencePoints)do +self:F({ZoneName=ZoneName}) +local Zone=Zone +local ZoneCoord=Zone:GetCoordinate() +local ZoneDistance=ZoneCoord:Get2DDistance(Coordinate) +self:F({ShortestDistance,ShortestReferenceName}) +if ShortestDistance==0 or ZoneDistance<ShortestDistance then +ShortestDistance=ZoneDistance +ShortestReferencePoint=ZoneCoord +ShortestReferenceName=CC.ReferenceNames[ZoneName] +end +end +if ShortestReferencePoint then +RouteText=Coordinate:ToStringFromRP(ShortestReferencePoint,ShortestReferenceName,Controllable) +end +else +RouteText=Coordinate:ToString(Controllable,nil,Task) +end +end +return RouteText +end +function ACT_ROUTE:MenuCancel() +self:F("Cancelled") +self.CancelMenuGroupCommand:Remove() +self:__Cancel(1) +end +function ACT_ROUTE:onafterStart(ProcessUnit,From,Event,To) +self:__Route(1) +end +function ACT_ROUTE:onfuncHasArrived(ProcessUnit) +return false +end +function ACT_ROUTE:onbeforeRoute(ProcessUnit,From,Event,To) +if ProcessUnit:IsAlive()then +local HasArrived=self:onfuncHasArrived(ProcessUnit) +if self.DisplayCount>=self.DisplayInterval then +self:T({HasArrived=HasArrived}) +if not HasArrived then +self:Report() +end +self.DisplayCount=1 +else +self.DisplayCount=self.DisplayCount+1 +end +if HasArrived then +self:__Arrive(1) +else +self:__Route(1) +end +return HasArrived +end +return false +end +end +do +ACT_ROUTE_POINT={ +ClassName="ACT_ROUTE_POINT", +} +function ACT_ROUTE_POINT:New(Coordinate,Range) +local self=BASE:Inherit(self,ACT_ROUTE:New()) +self.Coordinate=Coordinate +self.Range=Range or 0 +self.DisplayInterval=30 +self.DisplayCount=30 +self.DisplayMessage=true +self.DisplayTime=10 +return self +end +function ACT_ROUTE_POINT:Init(FsmRoute) +self.Coordinate=FsmRoute.Coordinate +self.Range=FsmRoute.Range or 0 +self.DisplayInterval=30 +self.DisplayCount=30 +self.DisplayMessage=true +self.DisplayTime=10 +self:SetStartState("None") +end +function ACT_ROUTE_POINT:SetCoordinate(Coordinate) +self:F2({Coordinate}) +self.Coordinate=Coordinate +end +function ACT_ROUTE_POINT:GetCoordinate() +self:F2({self.Coordinate}) +return self.Coordinate +end +function ACT_ROUTE_POINT:SetRange(Range) +self:F2({Range}) +self.Range=Range or 10000 +end +function ACT_ROUTE_POINT:GetRange() +self:F2({self.Range}) +return self.Range +end +function ACT_ROUTE_POINT:onfuncHasArrived(ProcessUnit) +if ProcessUnit:IsAlive()then +local Distance=self.Coordinate:Get2DDistance(ProcessUnit:GetCoordinate()) +if Distance<=self.Range then +local RouteText="Task \""..self:GetTask():GetName().."\", you have arrived." +self:GetCommandCenter():MessageTypeToGroup(RouteText,ProcessUnit:GetGroup(),MESSAGE.Type.Information) +return true +end +end +return false +end +function ACT_ROUTE_POINT:onafterReport(ProcessUnit,From,Event,To) +local RouteText="Task \""..self:GetTask():GetName().."\", "..self:GetRouteText(ProcessUnit) +self:GetCommandCenter():MessageTypeToGroup(RouteText,ProcessUnit:GetGroup(),MESSAGE.Type.Update) +end +end +do +ACT_ROUTE_ZONE={ +ClassName="ACT_ROUTE_ZONE", +} +function ACT_ROUTE_ZONE:New(Zone) +local self=BASE:Inherit(self,ACT_ROUTE:New()) +self.Zone=Zone +self.DisplayInterval=30 +self.DisplayCount=30 +self.DisplayMessage=true +self.DisplayTime=10 +return self +end +function ACT_ROUTE_ZONE:Init(FsmRoute) +self.Zone=FsmRoute.Zone +self.DisplayInterval=30 +self.DisplayCount=30 +self.DisplayMessage=true +self.DisplayTime=10 +end +function ACT_ROUTE_ZONE:SetZone(Zone,Altitude,Heading) +self.Zone=Zone +self.Altitude=Altitude +self.Heading=Heading +end +function ACT_ROUTE_ZONE:GetZone() +return self.Zone +end +function ACT_ROUTE_ZONE:onfuncHasArrived(ProcessUnit) +if ProcessUnit:IsInZone(self.Zone)then +local RouteText="Task \""..self:GetTask():GetName().."\", you have arrived within the zone." +self:GetCommandCenter():MessageTypeToGroup(RouteText,ProcessUnit:GetGroup(),MESSAGE.Type.Information) +end +return ProcessUnit:IsInZone(self.Zone) +end +function ACT_ROUTE_ZONE:onafterReport(ProcessUnit,From,Event,To) +self:F({ProcessUnit=ProcessUnit}) +local RouteText="Task \""..self:GetTask():GetName().."\", "..self:GetRouteText(ProcessUnit) +self:GetCommandCenter():MessageTypeToGroup(RouteText,ProcessUnit:GetGroup(),MESSAGE.Type.Update) +end +end +do +ACT_ACCOUNT={ +ClassName="ACT_ACCOUNT", +TargetSetUnit=nil, +} +function ACT_ACCOUNT:New() +local self=BASE:Inherit(self,FSM_PROCESS:New()) +self:AddTransition("Assigned","Start","Waiting") +self:AddTransition("*","Wait","Waiting") +self:AddTransition("*","Report","Report") +self:AddTransition("*","Event","Account") +self:AddTransition("Account","Player","AccountForPlayer") +self:AddTransition("Account","Other","AccountForOther") +self:AddTransition({"Account","AccountForPlayer","AccountForOther"},"More","Wait") +self:AddTransition({"Account","AccountForPlayer","AccountForOther"},"NoMore","Accounted") +self:AddTransition("*","Fail","Failed") +self:AddEndState("Failed") +self:SetStartState("Assigned") +return self +end +function ACT_ACCOUNT:onafterStart(ProcessUnit,From,Event,To) +self:HandleEvent(EVENTS.Dead,self.onfuncEventDead) +self:HandleEvent(EVENTS.Crash,self.onfuncEventCrash) +self:HandleEvent(EVENTS.Hit) +self:__Wait(1) +end +function ACT_ACCOUNT:onenterWaiting(ProcessUnit,From,Event,To) +if self.DisplayCount>=self.DisplayInterval then +self:Report() +self.DisplayCount=1 +else +self.DisplayCount=self.DisplayCount+1 +end +return true +end +function ACT_ACCOUNT:onafterEvent(ProcessUnit,From,Event,To) +self:__NoMore(1) +end +end +do +ACT_ACCOUNT_DEADS={ +ClassName="ACT_ACCOUNT_DEADS", +} +function ACT_ACCOUNT_DEADS:New() +local self=BASE:Inherit(self,ACT_ACCOUNT:New()) +self.DisplayInterval=30 +self.DisplayCount=30 +self.DisplayMessage=true +self.DisplayTime=10 +self.DisplayCategory="HQ" +return self +end +function ACT_ACCOUNT_DEADS:Init(FsmAccount) +self.Task=self:GetTask() +self.TaskName=self.Task:GetName() +end +function ACT_ACCOUNT_DEADS:onenterReport(ProcessUnit,Task,From,Event,To) +local MessageText="Your group with assigned "..self.TaskName.." task has "..Task.TargetSetUnit:GetUnitTypesText().." targets left to be destroyed." +self:GetCommandCenter():MessageTypeToGroup(MessageText,ProcessUnit:GetGroup(),MESSAGE.Type.Information) +end +function ACT_ACCOUNT_DEADS:onafterEvent(ProcessUnit,Task,From,Event,To,EventData) +self:T({ProcessUnit:GetName(),Task:GetName(),From,Event,To,EventData}) +if Task.TargetSetUnit:FindUnit(EventData.IniUnitName)then +local PlayerName=ProcessUnit:GetPlayerName() +local PlayerHit=self.PlayerHits and self.PlayerHits[EventData.IniUnitName] +if PlayerHit==PlayerName then +self:Player(EventData) +else +self:Other(EventData) +end +end +end +function ACT_ACCOUNT_DEADS:onenterAccountForPlayer(ProcessUnit,Task,From,Event,To,EventData) +self:T({ProcessUnit:GetName(),Task:GetName(),From,Event,To,EventData}) +local TaskGroup=ProcessUnit:GetGroup() +Task.TargetSetUnit:Remove(EventData.IniUnitName) +local MessageText="You have destroyed a target.\nYour group assigned with task "..self.TaskName.." has\n"..Task.TargetSetUnit:Count().." targets ( "..Task.TargetSetUnit:GetUnitTypesText().." ) left to be destroyed." +self:GetCommandCenter():MessageTypeToGroup(MessageText,ProcessUnit:GetGroup(),MESSAGE.Type.Information) +local PlayerName=ProcessUnit:GetPlayerName() +Task:AddProgress(PlayerName,"Destroyed "..EventData.IniTypeName,timer.getTime(),1) +if Task.TargetSetUnit:Count()>0 then +self:__More(1) +else +self:__NoMore(1) +end +end +function ACT_ACCOUNT_DEADS:onenterAccountForOther(ProcessUnit,Task,From,Event,To,EventData) +self:T({ProcessUnit:GetName(),Task:GetName(),From,Event,To,EventData}) +local TaskGroup=ProcessUnit:GetGroup() +Task.TargetSetUnit:Remove(EventData.IniUnitName) +local MessageText="One of the task targets has been destroyed.\nYour group assigned with task "..self.TaskName.." has\n"..Task.TargetSetUnit:Count().." targets ( "..Task.TargetSetUnit:GetUnitTypesText().." ) left to be destroyed." +self:GetCommandCenter():MessageTypeToGroup(MessageText,ProcessUnit:GetGroup(),MESSAGE.Type.Information) +if Task.TargetSetUnit:Count()>0 then +self:__More(1) +else +self:__NoMore(1) +end +end +function ACT_ACCOUNT_DEADS:OnEventHit(EventData) +self:T({"EventDead",EventData}) +if EventData.IniPlayerName and EventData.TgtDCSUnitName then +self.PlayerHits=self.PlayerHits or{} +self.PlayerHits[EventData.TgtDCSUnitName]=EventData.IniPlayerName +end +end +function ACT_ACCOUNT_DEADS:onfuncEventDead(EventData) +self:T({"EventDead",EventData}) +if EventData.IniDCSUnit then +self:Event(EventData) +end +end +function ACT_ACCOUNT_DEADS:onfuncEventCrash(EventData) +self:T({"EventDead",EventData}) +if EventData.IniDCSUnit then +self:Event(EventData) +end +end +end +do +ACT_ASSIST={ +ClassName="ACT_ASSIST", +} +function ACT_ASSIST:New() +local self=BASE:Inherit(self,FSM_PROCESS:New("ACT_ASSIST")) +self:AddTransition("None","Start","AwaitSmoke") +self:AddTransition("AwaitSmoke","Next","Smoking") +self:AddTransition("Smoking","Next","AwaitSmoke") +self:AddTransition("*","Stop","Success") +self:AddTransition("*","Fail","Failed") +self:AddEndState("Failed") +self:AddEndState("Success") +self:SetStartState("None") +return self +end +function ACT_ASSIST:onafterStart(ProcessUnit,From,Event,To) +local ProcessGroup=ProcessUnit:GetGroup() +local MissionMenu=self:GetMission():GetMenu(ProcessGroup) +local function MenuSmoke(MenuParam) +local self=MenuParam.self +local SmokeColor=MenuParam.SmokeColor +self.SmokeColor=SmokeColor +self:__Next(1) +end +self.Menu=MENU_GROUP:New(ProcessGroup,"Target acquisition",MissionMenu) +self.MenuSmokeBlue=MENU_GROUP_COMMAND:New(ProcessGroup,"Drop blue smoke on targets",self.Menu,MenuSmoke,{self=self,SmokeColor=SMOKECOLOR.Blue}) +self.MenuSmokeGreen=MENU_GROUP_COMMAND:New(ProcessGroup,"Drop green smoke on targets",self.Menu,MenuSmoke,{self=self,SmokeColor=SMOKECOLOR.Green}) +self.MenuSmokeOrange=MENU_GROUP_COMMAND:New(ProcessGroup,"Drop Orange smoke on targets",self.Menu,MenuSmoke,{self=self,SmokeColor=SMOKECOLOR.Orange}) +self.MenuSmokeRed=MENU_GROUP_COMMAND:New(ProcessGroup,"Drop Red smoke on targets",self.Menu,MenuSmoke,{self=self,SmokeColor=SMOKECOLOR.Red}) +self.MenuSmokeWhite=MENU_GROUP_COMMAND:New(ProcessGroup,"Drop White smoke on targets",self.Menu,MenuSmoke,{self=self,SmokeColor=SMOKECOLOR.White}) +end +function ACT_ASSIST:onafterStop(ProcessUnit,From,Event,To) +self.Menu:Remove() +end +end +do +ACT_ASSIST_SMOKE_TARGETS_ZONE={ +ClassName="ACT_ASSIST_SMOKE_TARGETS_ZONE", +} +function ACT_ASSIST_SMOKE_TARGETS_ZONE:New(TargetSetUnit,TargetZone) +local self=BASE:Inherit(self,ACT_ASSIST:New()) +self.TargetSetUnit=TargetSetUnit +self.TargetZone=TargetZone +return self +end +function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init(FsmSmoke) +self.TargetSetUnit=FsmSmoke.TargetSetUnit +self.TargetZone=FsmSmoke.TargetZone +end +function ACT_ASSIST_SMOKE_TARGETS_ZONE:Init(TargetSetUnit,TargetZone) +self.TargetSetUnit=TargetSetUnit +self.TargetZone=TargetZone +return self +end +function ACT_ASSIST_SMOKE_TARGETS_ZONE:onenterSmoking(ProcessUnit,From,Event,To) +self.TargetSetUnit:ForEachUnit( +function(SmokeUnit) +if math.random(1,(100*self.TargetSetUnit:Count())/4)<=100 then +SCHEDULER:New(self, +function() +if SmokeUnit:IsAlive()then +SmokeUnit:Smoke(self.SmokeColor,150) +end +end,{},math.random(10,60) +) +end +end +) +end +end +SHAPE_BASE={ +ClassName="SHAPE_BASE", +Name="", +CenterVec2=nil, +Points={}, +Coords={}, +MarkIDs={}, +ColorString="", +ColorRGBA={} +} +function SHAPE_BASE:New() +local self=BASE:Inherit(self,BASE:New()) +return self +end +function SHAPE_BASE:FindOnMap(shape_name) +local self=BASE:Inherit(self,BASE:New()) +local found=false +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if object["name"]==shape_name then +self.Name=object["name"] +self.CenterVec2={x=object["mapX"],y=object["mapY"]} +self.ColorString=object["colorString"] +self.ColorRGBA=UTILS.HexToRGBA(self.ColorString) +found=true +end +end +end +if not found then +self:E("Can't find a shape with name "..shape_name) +end +return self +end +function SHAPE_BASE:GetAllShapes(filter) +filter=filter or"" +local return_shapes={} +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if string.contains(object["name"],filter)then +table.add(return_shapes,object) +end +end +end +return return_shapes +end +function SHAPE_BASE:Offset(new_vec2) +local offset_vec2=UTILS.Vec2Subtract(new_vec2,self.CenterVec2) +self.CenterVec2=new_vec2 +if self.ClassName=="POLYGON"then +for _,point in pairs(self.Points)do +point.x=point.x+offset_vec2.x +point.y=point.y+offset_vec2.y +end +end +end +function SHAPE_BASE:GetName() +return self.Name +end +function SHAPE_BASE:GetColorString() +return self.ColorString +end +function SHAPE_BASE:GetColorRGBA() +return self.ColorRGBA +end +function SHAPE_BASE:GetColorRed() +return self.ColorRGBA.R +end +function SHAPE_BASE:GetColorGreen() +return self.ColorRGBA.G +end +function SHAPE_BASE:GetColorBlue() +return self.ColorRGBA.B +end +function SHAPE_BASE:GetColorAlpha() +return self.ColorRGBA.A +end +function SHAPE_BASE:GetCenterVec2() +return self.CenterVec2 +end +function SHAPE_BASE:GetCenterCoordinate() +return COORDINATE:NewFromVec2(self.CenterVec2) +end +function SHAPE_BASE:GetCoordinate() +return self:GetCenterCoordinate() +end +function SHAPE_BASE:ContainsPoint(_) +self:E("This needs to be set in the derived class") +end +function SHAPE_BASE:ContainsUnit(unit_name) +local unit=UNIT:FindByName(unit_name) +if unit==nil or not unit:IsAlive()then +return false +end +if self:ContainsPoint(unit:GetVec2())then +return true +end +return false +end +function SHAPE_BASE:ContainsAnyOfGroup(group_name) +local group=GROUP:FindByName(group_name) +if group==nil or not group:IsAlive()then +return false +end +for _,unit in pairs(group:GetUnits())do +if self:ContainsPoint(unit:GetVec2())then +return true +end +end +return false +end +function SHAPE_BASE:ContainsAllOfGroup(group_name) +local group=GROUP:FindByName(group_name) +if group==nil or not group:IsAlive()then +return false +end +for _,unit in pairs(group:GetUnits())do +if not self:ContainsPoint(unit:GetVec2())then +return false +end +end +return true +end +CIRCLE={ +ClassName="CIRCLE", +Radius=nil, +} +function CIRCLE:FindOnMap(shape_name) +local self=BASE:Inherit(self,SHAPE_BASE:FindOnMap(shape_name)) +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if string.find(object["name"],shape_name,1,true)then +if object["polygonMode"]=="circle"then +self.Radius=object["radius"] +end +end +end +end +return self +end +function CIRCLE:Find(shape_name) +return _DATABASE:FindShape(shape_name) +end +function CIRCLE:New(vec2,radius) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.CenterVec2=vec2 +self.Radius=radius +return self +end +function CIRCLE:GetRadius() +return self.Radius +end +function CIRCLE:ContainsPoint(point) +if((point.x-self.CenterVec2.x)^2+(point.y-self.CenterVec2.y)^2)^0.5<=self.Radius then +return true +end +return false +end +function CIRCLE:PointInSector(point,sector_start,sector_end,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +local function are_clockwise(v1,v2) +return-v1.x*v2.y+v1.y*v2.x>0 +end +local function is_in_radius(rp) +return rp.x*rp.x+rp.y*rp.y<=radius^2 +end +local rel_pt={ +x=point.x-center.x, +y=point.y-center.y +} +local rel_sector_start={ +x=sector_start.x-center.x, +y=sector_start.y-center.y, +} +local rel_sector_end={ +x=sector_end.x-center.x, +y=sector_end.y-center.y, +} +return not are_clockwise(rel_sector_start,rel_pt)and +are_clockwise(rel_sector_end,rel_pt)and +is_in_radius(rel_pt,radius) +end +function CIRCLE:UnitInSector(unit_name,sector_start,sector_end,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +if self:PointInSector(UNIT:FindByName(unit_name):GetVec2(),sector_start,sector_end,center,radius)then +return true +end +return false +end +function CIRCLE:AnyOfGroupInSector(group_name,sector_start,sector_end,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +for _,unit in pairs(GROUP:FindByName(group_name):GetUnits())do +if self:PointInSector(unit:GetVec2(),sector_start,sector_end,center,radius)then +return true +end +end +return false +end +function CIRCLE:AllOfGroupInSector(group_name,sector_start,sector_end,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +for _,unit in pairs(GROUP:FindByName(group_name):GetUnits())do +if not self:PointInSector(unit:GetVec2(),sector_start,sector_end,center,radius)then +return false +end +end +return true +end +function CIRCLE:UnitInRadius(unit_name,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +if UTILS.IsInRadius(center,UNIT:FindByName(unit_name):GetVec2(),radius)then +return true +end +return false +end +function CIRCLE:AnyOfGroupInRadius(group_name,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +for _,unit in pairs(GROUP:FindByName(group_name):GetUnits())do +if UTILS.IsInRadius(center,unit:GetVec2(),radius)then +return true +end +end +return false +end +function CIRCLE:AllOfGroupInRadius(group_name,center,radius) +center=center or self.CenterVec2 +radius=radius or self.Radius +for _,unit in pairs(GROUP:FindByName(group_name):GetUnits())do +if not UTILS.IsInRadius(center,unit:GetVec2(),radius)then +return false +end +end +return true +end +function CIRCLE:GetRandomVec2() +math.random() +math.random() +math.random() +local angle=math.random()*2*math.pi +local rx=math.random(0,self.Radius)*math.cos(angle)+self.CenterVec2.x +local ry=math.random(0,self.Radius)*math.sin(angle)+self.CenterVec2.y +return{x=rx,y=ry} +end +function CIRCLE:GetRandomVec2OnBorder() +math.random() +math.random() +math.random() +local angle=math.random()*2*math.pi +local rx=self.Radius*math.cos(angle)+self.CenterVec2.x +local ry=self.Radius*math.sin(angle)+self.CenterVec2.y +return{x=rx,y=ry} +end +function CIRCLE:GetBoundingBox() +local min_x=self.CenterVec2.x-self.Radius +local min_y=self.CenterVec2.y-self.Radius +local max_x=self.CenterVec2.x+self.Radius +local max_y=self.CenterVec2.y+self.Radius +return{ +{x=min_x,y=min_x},{x=max_x,y=min_y},{x=max_x,y=max_y},{x=min_x,y=max_y} +} +end +CUBE={ +ClassName="CUBE", +Points={}, +Coords={} +} +function CUBE:New(p1,p2,p3,p4,p5,p6,p7,p8) +local self=BASE:Inherit(self,SHAPE_BASE) +self.Points={p1,p2,p3,p4,p5,p6,p7,p8} +for _,point in spairs(self.Points)do +table.insert(self.Coords,COORDINATE:NewFromVec3(point)) +end +return self +end +function CUBE:GetCenter() +local center={x=0,y=0,z=0} +for _,point in pairs(self.Points)do +center.x=center.x+point.x +center.y=center.y+point.y +center.z=center.z+point.z +end +center.x=center.x/8 +center.y=center.y/8 +center.z=center.z/8 +return center +end +function CUBE:ContainsPoint(point,cube_points) +cube_points=cube_points or self.Points +local min_x,min_y,min_z=math.huge,math.huge,math.huge +local max_x,max_y,max_z=-math.huge,-math.huge,-math.huge +for _,p in ipairs(cube_points)do +if p.x<min_x then min_x=p.x end +if p.y<min_y then min_y=p.y end +if p.z<min_z then min_z=p.z end +if p.x>max_x then max_x=p.x end +if p.y>max_y then max_y=p.y end +if p.z>max_z then max_z=p.z end +end +return point.x>=min_x and point.x<=max_x and point.y>=min_y and point.y<=max_y and point.z>=min_z and point.z<=max_z +end +LINE={ +ClassName="LINE", +Points={}, +Coords={}, +} +function LINE:FindOnMap(line_name) +local self=BASE:Inherit(self,SHAPE_BASE:FindOnMap(line_name)) +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if object["name"]==line_name then +if object["primitiveType"]=="Line"then +for _,point in UTILS.spairs(object["points"])do +local p={x=object["mapX"]+point["x"], +y=object["mapY"]+point["y"]} +local coord=COORDINATE:NewFromVec2(p) +table.insert(self.Points,p) +table.insert(self.Coords,coord) +end +end +end +end +end +self:I(#self.Points) +if#self.Points==0 then +return nil +end +self.MarkIDs={} +return self +end +function LINE:Find(shape_name) +return _DATABASE:FindShape(shape_name) +end +function LINE:New(...) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.Points={...} +self:I(self.Points) +for _,point in UTILS.spairs(self.Points)do +table.insert(self.Coords,COORDINATE:NewFromVec2(point)) +end +return self +end +function LINE:NewFromCircle(center_point,radius,angle_degrees) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.CenterVec2=center_point +local angleRadians=math.rad(angle_degrees) +local point1={ +x=center_point.x+radius*math.cos(angleRadians), +y=center_point.y+radius*math.sin(angleRadians) +} +local point2={ +x=center_point.x+radius*math.cos(angleRadians+math.pi), +y=center_point.y+radius*math.sin(angleRadians+math.pi) +} +for _,point in pairs{point1,point2}do +table.insert(self.Points,point) +table.insert(self.Coords,COORDINATE:NewFromVec2(point)) +end +return self +end +function LINE:Coordinates() +return self.Coords +end +function LINE:GetStartCoordinate() +return self.Coords[1] +end +function LINE:GetEndCoordinate() +return self.Coords[#self.Coords] +end +function LINE:GetStartPoint() +return self.Points[1] +end +function LINE:GetEndPoint() +return self.Points[#self.Points] +end +function LINE:GetLength() +local total_length=0 +for i=1,#self.Points-1 do +local x1,y1=self.Points[i]["x"],self.Points[i]["y"] +local x2,y2=self.Points[i+1]["x"],self.Points[i+1]["y"] +local segment_length=math.sqrt((x2-x1)^2+(y2-y1)^2) +total_length=total_length+segment_length +end +return total_length +end +function LINE:GetRandomPoint(points) +points=points or self.Points +local rand=math.random() +local random_x=points[1].x+rand*(points[2].x-points[1].x) +local random_y=points[1].y+rand*(points[2].y-points[1].y) +return{x=random_x,y=random_y} +end +function LINE:GetHeading(points) +points=points or self.Points +local angle=math.atan2(points[2].y-points[1].y,points[2].x-points[1].x) +angle=math.deg(angle) +if angle<0 then +angle=angle+360 +end +return angle +end +function LINE:GetIndividualParts() +local parts={} +if#self.Points==2 then +parts={self} +end +for i=1,#self.Points-1 do +local p1=self.Points[i] +local p2=self.Points[i%#self.Points+1] +table.add(parts,LINE:New(p1,p2)) +end +return parts +end +function LINE:GetPointsInbetween(amount,start_point,end_point) +start_point=start_point or self:GetStartPoint() +end_point=end_point or self:GetEndPoint() +if amount==0 then return{start_point,end_point}end +amount=amount+1 +local points={} +local difference={x=end_point.x-start_point.x,y=end_point.y-start_point.y} +local divided={x=difference.x/amount,y=difference.y/amount} +for j=0,amount do +local part_pos={x=divided.x*j,y=divided.y*j} +local point={x=start_point.x+part_pos.x,y=start_point.y+part_pos.y} +table.insert(points,point) +end +return points +end +function LINE:GetCoordinatesInBetween(amount,start_point,end_point) +local coords={} +for _,pt in pairs(self:GetPointsInbetween(amount,start_point,end_point))do +table.add(coords,COORDINATE:NewFromVec2(pt)) +end +return coords +end +function LINE:GetRandomPoint(start_point,end_point) +start_point=start_point or self:GetStartPoint() +end_point=end_point or self:GetEndPoint() +local fraction=math.random() +local difference={x=end_point.x-start_point.x,y=end_point.y-start_point.y} +local part_pos={x=difference.x*fraction,y=difference.y*fraction} +local random_point={x=start_point.x+part_pos.x,y=start_point.y+part_pos.y} +return random_point +end +function LINE:GetRandomCoordinate(start_point,end_point) +start_point=start_point or self:GetStartPoint() +end_point=end_point or self:GetEndPoint() +return COORDINATE:NewFromVec2(self:GetRandomPoint(start_point,end_point)) +end +function LINE:GetPointsBetweenAsSineWave(amount,start_point,end_point,frequency,phase,amplitude) +amount=amount or 20 +start_point=start_point or self:GetStartPoint() +end_point=end_point or self:GetEndPoint() +frequency=frequency or 1 +phase=phase or 0 +amplitude=amplitude or 100 +local points={} +local function sine_wave(x) +return amplitude*math.sin(2*math.pi*frequency*(x-start_point.x)+phase) +end +local x=start_point.x +local step=(end_point.x-start_point.x)/20 +for _=1,amount do +local y=sine_wave(x) +x=x+step +table.add(points,{x=x,y=y}) +end +return points +end +function LINE:GetBoundingBox() +local min_x,min_y,max_x,max_y=self.Points[1].x,self.Points[1].y,self.Points[2].x,self.Points[2].y +for i=2,#self.Points do +local x,y=self.Points[i].x,self.Points[i].y +if x<min_x then +min_x=x +end +if y<min_y then +min_y=y +end +if x>max_x then +max_x=x +end +if y>max_y then +max_y=y +end +end +return{ +{x=min_x,y=min_x},{x=max_x,y=min_y},{x=max_x,y=max_y},{x=min_x,y=max_y} +} +end +function LINE:Draw() +for i=1,#self.Coords-1 do +local c1=self.Coords[i] +local c2=self.Coords[i%#self.Coords+1] +table.add(self.MarkIDs,c1:LineToAll(c2)) +end +end +function LINE:RemoveDraw() +for _,mark_id in pairs(self.MarkIDs)do +UTILS.RemoveMark(mark_id) +end +end +OVAL={ +ClassName="OVAL", +MajorAxis=nil, +MinorAxis=nil, +Angle=0, +DrawPoly=nil +} +function OVAL:FindOnMap(shape_name) +local self=BASE:Inherit(self,SHAPE_BASE:FindOnMap(shape_name)) +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if string.find(object["name"],shape_name,1,true)then +if object["polygonMode"]=="oval"then +self.CenterVec2={x=object["mapX"],y=object["mapY"]} +self.MajorAxis=object["r1"] +self.MinorAxis=object["r2"] +self.Angle=object["angle"] +end +end +end +end +return self +end +function OVAL:Find(shape_name) +return _DATABASE:FindShape(shape_name) +end +function OVAL:New(vec2,major_axis,minor_axis,angle) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.CenterVec2=vec2 +self.MajorAxis=major_axis +self.MinorAxis=minor_axis +self.Angle=angle or 0 +return self +end +function OVAL:GetMajorAxis() +return self.MajorAxis +end +function OVAL:GetMinorAxis() +return self.MinorAxis +end +function OVAL:GetAngle() +return self.Angle +end +function OVAL:SetMajorAxis(value) +self.MajorAxis=value +end +function OVAL:SetMinorAxis(value) +self.MinorAxis=value +end +function OVAL:SetAngle(value) +self.Angle=value +end +function OVAL:ContainsPoint(point) +local cos,sin=math.cos,math.sin +local dx=point.x-self.CenterVec2.x +local dy=point.y-self.CenterVec2.y +local rx=dx*cos(self.Angle)+dy*sin(self.Angle) +local ry=-dx*sin(self.Angle)+dy*cos(self.Angle) +return rx*rx/(self.MajorAxis*self.MajorAxis)+ry*ry/(self.MinorAxis*self.MinorAxis)<=1 +end +function OVAL:GetRandomVec2() +local theta=math.rad(self.Angle) +local random_point=math.sqrt(math.random()) +local phi=math.random()*2*math.pi +local x_c=random_point*math.cos(phi) +local y_c=random_point*math.sin(phi) +local x_e=x_c*self.MajorAxis +local y_e=y_c*self.MinorAxis +local rx=(x_e*math.cos(theta)-y_e*math.sin(theta))+self.CenterVec2.x +local ry=(x_e*math.sin(theta)+y_e*math.cos(theta))+self.CenterVec2.y +return{x=rx,y=ry} +end +function OVAL:GetBoundingBox() +local min_x=self.CenterVec2.x-self.MajorAxis +local min_y=self.CenterVec2.y-self.MinorAxis +local max_x=self.CenterVec2.x+self.MajorAxis +local max_y=self.CenterVec2.y+self.MinorAxis +return{ +{x=min_x,y=min_x},{x=max_x,y=min_y},{x=max_x,y=max_y},{x=min_x,y=max_y} +} +end +function OVAL:Draw() +self.DrawPoly=POLYGON:NewFromPoints(self:PointsOnEdge(20)) +self.DrawPoly:Draw(true) +end +function OVAL:RemoveDraw() +self.DrawPoly:RemoveDraw() +end +function OVAL:PointsOnEdge(num_points) +num_points=num_points or 20 +local points={} +local dtheta=2*math.pi/num_points +for i=0,num_points-1 do +local theta=i*dtheta +local x=self.CenterVec2.x+self.MajorAxis*math.cos(theta)*math.cos(self.Angle)-self.MinorAxis*math.sin(theta)*math.sin(self.Angle) +local y=self.CenterVec2.y+self.MajorAxis*math.cos(theta)*math.sin(self.Angle)+self.MinorAxis*math.sin(theta)*math.cos(self.Angle) +table.insert(points,{x=x,y=y}) +end +return points +end +POLYGON={ +ClassName="POLYGON", +Points={}, +Coords={}, +Triangles={}, +SurfaceArea=0, +TriangleMarkIDs={}, +OutlineMarkIDs={}, +Angle=nil, +Heading=nil +} +function POLYGON:FindOnMap(shape_name) +local self=BASE:Inherit(self,SHAPE_BASE:FindOnMap(shape_name)) +for _,layer in pairs(env.mission.drawings.layers)do +for _,object in pairs(layer["objects"])do +if object["name"]==shape_name then +if(object["primitiveType"]=="Line"and object["closed"]==true)or(object["polygonMode"]=="free")then +for _,point in UTILS.spairs(object["points"])do +local p={x=object["mapX"]+point["x"], +y=object["mapY"]+point["y"]} +local coord=COORDINATE:NewFromVec2(p) +self.Points[#self.Points+1]=p +self.Coords[#self.Coords+1]=coord +end +elseif object["polygonMode"]=="rect"then +local angle=object["angle"] +local half_width=object["width"]/2 +local half_height=object["height"]/2 +local p1=UTILS.RotatePointAroundPivot({x=self.CenterVec2.x-half_height,y=self.CenterVec2.y+half_width},self.CenterVec2,angle) +local p2=UTILS.RotatePointAroundPivot({x=self.CenterVec2.x+half_height,y=self.CenterVec2.y+half_width},self.CenterVec2,angle) +local p3=UTILS.RotatePointAroundPivot({x=self.CenterVec2.x+half_height,y=self.CenterVec2.y-half_width},self.CenterVec2,angle) +local p4=UTILS.RotatePointAroundPivot({x=self.CenterVec2.x-half_height,y=self.CenterVec2.y-half_width},self.CenterVec2,angle) +self.Points={p1,p2,p3,p4} +for _,point in pairs(self.Points)do +self.Coords[#self.Coords+1]=COORDINATE:NewFromVec2(point) +end +elseif object["polygonMode"]=="arrow"then +for _,point in UTILS.spairs(object["points"])do +local p={x=object["mapX"]+point["x"], +y=object["mapY"]+point["y"]} +local coord=COORDINATE:NewFromVec2(p) +self.Points[#self.Points+1]=p +self.Coords[#self.Coords+1]=coord +end +self.Angle=object["angle"] +self.Heading=UTILS.ClampAngle(self.Angle+90) +end +end +end +end +if#self.Points==0 then +return nil +end +self.CenterVec2=self:GetCentroid() +self.Triangles=self:Triangulate() +self.SurfaceArea=self:__CalculateSurfaceArea() +self.TriangleMarkIDs={} +self.OutlineMarkIDs={} +return self +end +function POLYGON:FromZone(zone_name) +for _,zone in pairs(env.mission.triggers.zones)do +if zone["name"]==zone_name then +return POLYGON:New(unpack(zone["verticies"]or{})) +end +end +end +function POLYGON:Find(shape_name) +return _DATABASE:FindShape(shape_name) +end +function POLYGON:New(...) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.Points={...} +self.Coords={} +for _,point in UTILS.spairs(self.Points)do +table.insert(self.Coords,COORDINATE:NewFromVec2(point)) +end +self.Triangles=self:Triangulate() +self.SurfaceArea=self:__CalculateSurfaceArea() +return self +end +function POLYGON:GetCentroid() +local function sum(t) +local total=0 +for _,value in pairs(t)do +total=total+value +end +return total +end +local x_values={} +local y_values={} +local length=table.length(self.Points) +for _,point in pairs(self.Points)do +table.insert(x_values,point.x) +table.insert(y_values,point.y) +end +local x=sum(x_values)/length +local y=sum(y_values)/length +return{ +["x"]=x, +["y"]=y +} +end +function POLYGON:GetCoordinates() +return self.Coords +end +function POLYGON:GetStartCoordinate() +return self.Coords[1] +end +function POLYGON:GetEndCoordinate() +return self.Coords[#self.Coords] +end +function POLYGON:GetStartPoint() +return self.Points[1] +end +function POLYGON:GetEndPoint() +return self.Points[#self.Points] +end +function POLYGON:GetPoints() +return self.Points +end +function POLYGON:GetSurfaceArea() +return self.SurfaceArea +end +function POLYGON:GetBoundingBox() +local min_x,min_y,max_x,max_y=self.Points[1].x,self.Points[1].y,self.Points[1].x,self.Points[1].y +for i=2,#self.Points do +local x,y=self.Points[i].x,self.Points[i].y +if x<min_x then +min_x=x +end +if y<min_y then +min_y=y +end +if x>max_x then +max_x=x +end +if y>max_y then +max_y=y +end +end +return{ +{x=min_x,y=min_x},{x=max_x,y=min_y},{x=max_x,y=max_y},{x=min_x,y=max_y} +} +end +function POLYGON:Triangulate(points) +points=points or self.Points +local triangles={} +local function get_orientation(shape_points) +local sum=0 +for i=1,#shape_points do +local j=i%#shape_points+1 +sum=sum+(shape_points[j].x-shape_points[i].x)*(shape_points[j].y+shape_points[i].y) +end +return sum>=0 and"clockwise"or"counter-clockwise" +end +local function ensure_clockwise(shape_points) +local orientation=get_orientation(shape_points) +if orientation=="counter-clockwise"then +local reversed={} +for i=#shape_points,1,-1 do +table.insert(reversed,shape_points[i]) +end +return reversed +end +return shape_points +end +local function is_clockwise(p1,p2,p3) +local cross_product=(p2.x-p1.x)*(p3.y-p1.y)-(p2.y-p1.y)*(p3.x-p1.x) +return cross_product<0 +end +local function divide_recursively(shape_points) +if#shape_points==3 then +table.insert(triangles,TRIANGLE:New(shape_points[1],shape_points[2],shape_points[3])) +elseif#shape_points>3 then +for i,p1 in ipairs(shape_points)do +local p2=shape_points[(i%#shape_points)+1] +local p3=shape_points[(i+1)%#shape_points+1] +local triangle=TRIANGLE:New(p1,p2,p3) +local is_ear=true +if not is_clockwise(p1,p2,p3)then +is_ear=false +else +for _,point in ipairs(shape_points)do +if point~=p1 and point~=p2 and point~=p3 and triangle:ContainsPoint(point)then +is_ear=false +break +end +end +end +if is_ear then +local is_valid_triangle=true +for _,point in ipairs(points)do +if point~=p1 and point~=p2 and point~=p3 and triangle:ContainsPoint(point)then +is_valid_triangle=false +break +end +end +if is_valid_triangle then +table.insert(triangles,triangle) +local remaining_points={} +for j,point in ipairs(shape_points)do +if point~=p2 then +table.insert(remaining_points,point) +end +end +divide_recursively(remaining_points) +break +end +end +end +end +end +points=ensure_clockwise(points) +divide_recursively(points) +return triangles +end +function POLYGON:CovarianceMatrix() +local cx,cy=self:GetCentroid() +local covXX,covYY,covXY=0,0,0 +for _,p in ipairs(self.points)do +covXX=covXX+(p.x-cx)^2 +covYY=covYY+(p.y-cy)^2 +covXY=covXY+(p.x-cx)*(p.y-cy) +end +covXX=covXX/(#self.points-1) +covYY=covYY/(#self.points-1) +covXY=covXY/(#self.points-1) +return covXX,covYY,covXY +end +function POLYGON:Direction() +local covXX,covYY,covXY=self:CovarianceMatrix() +local theta=0.5*math.atan2(2*covXY,covXX-covYY) +return math.cos(theta),math.sin(theta) +end +function POLYGON:GetRandomVec2() +local weights={} +for _,triangle in pairs(self.Triangles)do +weights[triangle]=triangle.SurfaceArea/self.SurfaceArea +end +local random_weight=math.random() +local accumulated_weight=0 +for triangle,weight in pairs(weights)do +accumulated_weight=accumulated_weight+weight +if accumulated_weight>=random_weight then +return triangle:GetRandomVec2() +end +end +end +function POLYGON:GetRandomNonWeightedVec2() +return self.Triangles[math.random(1,#self.Triangles)]:GetRandomVec2() +end +function POLYGON:ContainsPoint(point,polygon_points) +local x=point.x +local y=point.y +polygon_points=polygon_points or self.Points +local counter=0 +local num_points=#polygon_points +for current_index=1,num_points do +local next_index=(current_index%num_points)+1 +local current_x,current_y=polygon_points[current_index].x,polygon_points[current_index].y +local next_x,next_y=polygon_points[next_index].x,polygon_points[next_index].y +if((current_y>y)~=(next_y>y))and(x<(next_x-current_x)*(y-current_y)/(next_y-current_y)+current_x)then +counter=counter+1 +end +end +return counter%2==1 +end +function POLYGON:Draw(include_inner_triangles) +include_inner_triangles=include_inner_triangles or false +for i=1,#self.Coords do +local c1=self.Coords[i] +local c2=self.Coords[i%#self.Coords+1] +table.add(self.OutlineMarkIDs,c1:LineToAll(c2)) +end +if include_inner_triangles then +for _,triangle in ipairs(self.Triangles)do +triangle:Draw() +end +end +end +function POLYGON:RemoveDraw() +for _,triangle in pairs(self.Triangles)do +triangle:RemoveDraw() +end +for _,mark_id in pairs(self.OutlineMarkIDs)do +UTILS.RemoveMark(mark_id) +end +end +function POLYGON:__CalculateSurfaceArea() +local area=0 +for _,triangle in pairs(self.Triangles)do +area=area+triangle.SurfaceArea +end +return area +end +TRIANGLE={ +ClassName="TRIANGLE", +Points={}, +Coords={}, +SurfaceArea=0 +} +function TRIANGLE:New(p1,p2,p3) +local self=BASE:Inherit(self,SHAPE_BASE:New()) +self.Points={p1,p2,p3} +local center_x=(p1.x+p2.x+p3.x)/3 +local center_y=(p1.y+p2.y+p3.y)/3 +self.CenterVec2={x=center_x,y=center_y} +for _,pt in pairs({p1,p2,p3})do +table.add(self.Coords,COORDINATE:NewFromVec2(pt)) +end +self.SurfaceArea=math.abs((p2.x-p1.x)*(p3.y-p1.y)-(p3.x-p1.x)*(p2.y-p1.y))*0.5 +self.MarkIDs={} +return self +end +function TRIANGLE:ContainsPoint(pt,points) +points=points or self.Points +local function sign(p1,p2,p3) +return(p1.x-p3.x)*(p2.y-p3.y)-(p2.x-p3.x)*(p1.y-p3.y) +end +local d1=sign(pt,self.Points[1],self.Points[2]) +local d2=sign(pt,self.Points[2],self.Points[3]) +local d3=sign(pt,self.Points[3],self.Points[1]) +local has_neg=(d1<0)or(d2<0)or(d3<0) +local has_pos=(d1>0)or(d2>0)or(d3>0) +return not(has_neg and has_pos) +end +function TRIANGLE:GetRandomVec2(points) +math.random() +math.random() +math.random() +points=points or self.Points +local pt={math.random(),math.random()} +table.sort(pt) +local s=pt[1] +local t=pt[2]-pt[1] +local u=1-pt[2] +return{x=s*points[1].x+t*points[2].x+u*points[3].x, +y=s*points[1].y+t*points[2].y+u*points[3].y} +end +function TRIANGLE:Draw() +for i=1,#self.Coords do +local c1=self.Coords[i] +local c2=self.Coords[i%#self.Coords+1] +table.add(self.MarkIDs,c1:LineToAll(c2)) +end +end +function TRIANGLE:RemoveDraw() +for _,mark_id in pairs(self.MarkIDs)do +UTILS.RemoveMark(mark_id) +end +end +do +USERSOUND={ +ClassName="USERSOUND", +} +function USERSOUND:New(UserSoundFileName) +local self=BASE:Inherit(self,BASE:New()) +self.UserSoundFileName=UserSoundFileName +return self +end +function USERSOUND:SetFileName(UserSoundFileName) +self.UserSoundFileName=UserSoundFileName +return self +end +function USERSOUND:ToAll() +trigger.action.outSound(self.UserSoundFileName) +return self +end +function USERSOUND:ToCoalition(Coalition) +trigger.action.outSoundForCoalition(Coalition,self.UserSoundFileName) +return self +end +function USERSOUND:ToCountry(Country) +trigger.action.outSoundForCountry(Country,self.UserSoundFileName) +return self +end +function USERSOUND:ToGroup(Group,Delay) +Delay=Delay or 0 +if Delay>0 then +SCHEDULER:New(nil,USERSOUND.ToGroup,{self,Group},Delay) +else +trigger.action.outSoundForGroup(Group:GetID(),self.UserSoundFileName) +end +return self +end +function USERSOUND:ToUnit(Unit,Delay) +Delay=Delay or 0 +if Delay>0 then +SCHEDULER:New(nil,USERSOUND.ToUnit,{self,Unit},Delay) +else +trigger.action.outSoundForUnit(Unit:GetID(),self.UserSoundFileName) +end +return self +end +function USERSOUND:ToClient(Client,Delay) +Delay=Delay or 0 +if Delay>0 then +SCHEDULER:New(nil,USERSOUND.ToClient,{self,Client},Delay) +else +trigger.action.outSoundForUnit(Client:GetID(),self.UserSoundFileName) +end +return self +end +end +do +SOUNDBASE={ +ClassName="SOUNDBASE", +} +function SOUNDBASE:New() +local self=BASE:Inherit(self,BASE:New()) +return self +end +function SOUNDBASE:GetSpeechTime(length,speed,isGoogle) +local maxRateRatio=3 +speed=speed or 1.0 +isGoogle=isGoogle or false +local speedFactor=1.0 +if isGoogle then +speedFactor=speed +else +if speed~=0 then +speedFactor=math.abs(speed)*(maxRateRatio-1)/10+1 +end +if speed<0 then +speedFactor=1/speedFactor +end +end +local wpm=math.ceil(100*speedFactor) +local cps=math.floor((wpm*5)/60) +if type(length)=="string"then +length=string.len(length) +end +return math.ceil(length/cps) +end +end +do +SOUNDFILE={ +ClassName="SOUNDFILE", +filename=nil, +path="l10n/DEFAULT/", +duration=3, +subtitle=nil, +subduration=0, +useSRS=false, +} +function SOUNDFILE:New(FileName,Path,Duration,UseSrs) +local self=BASE:Inherit(self,BASE:New()) +self:F({FileName,Path,Duration,UseSrs}) +self:SetFileName(FileName) +self:SetPlayWithSRS(UseSrs or false) +self:SetPath(Path) +self:SetDuration(Duration) +return self +end +function SOUNDFILE:SetPath(Path) +self:F({Path}) +if not Path then +if self.useSRS then +self.path=lfs.tempdir().."Mission\\l10n\\DEFAULT" +else +self.path="l10n/DEFAULT/" +end +else +self.path=Path +end +local nmax=1000;local n=1 +while(self.path:sub(-1)=="/"or self.path:sub(-1)==[[\]])and n<=nmax do +self.path=self.path:sub(1,#self.path-1) +n=n+1 +end +self.path=self.path.."/" +self:T("self.path="..self.path) +return self +end +function SOUNDFILE:GetPath() +local path=self.path or"l10n/DEFAULT/" +return path +end +function SOUNDFILE:SetFileName(FileName) +self.filename=FileName or"Hello World.mp3" +return self +end +function SOUNDFILE:GetFileName() +return self.filename +end +function SOUNDFILE:SetDuration(Duration) +if Duration and type(Duration)=="string"then +Duration=tonumber(Duration) +end +self.duration=Duration or 3 +return self +end +function SOUNDFILE:GetDuration() +return self.duration or 3 +end +function SOUNDFILE:GetName() +local path=self:GetPath() +local filename=self:GetFileName() +local name=string.format("%s%s",path,filename) +return name +end +function SOUNDFILE:SetPlayWithSRS(Switch) +self:F({Switch}) +if Switch==true or Switch==nil then +self.useSRS=true +else +self.useSRS=false +end +self:T("self.useSRS="..tostring(self.useSRS)) +return self +end +end +do +SOUNDTEXT={ +ClassName="SOUNDTEXT", +} +function SOUNDTEXT:New(Text,Duration) +local self=BASE:Inherit(self,BASE:New()) +self:SetText(Text) +self:SetDuration(Duration or MSRS.getSpeechTime(Text)) +self:T(string.format("New SOUNDTEXT: text=%s, duration=%.1f sec",self.text,self.duration)) +return self +end +function SOUNDTEXT:SetText(Text) +self.text=Text or"Hello World!" +return self +end +function SOUNDTEXT:SetDuration(Duration) +self.duration=Duration or 3 +return self +end +function SOUNDTEXT:SetGender(Gender) +self.gender=Gender or"female" +return self +end +function SOUNDTEXT:SetCulture(Culture) +self.culture=Culture or"en-GB" +return self +end +function SOUNDTEXT:SetVoice(VoiceName) +self.voice=VoiceName +return self +end +end +RADIO={ +ClassName="RADIO", +FileName="", +Frequency=0, +Modulation=radio.modulation.AM, +Subtitle="", +SubtitleDuration=0, +Power=100, +Loop=false, +alias=nil, +moduhasbeenset=false, +} +function RADIO:New(Positionable) +local self=BASE:Inherit(self,BASE:New()) +self:F(Positionable) +if Positionable:GetPointVec2()then +self.Positionable=Positionable +return self +end +self:E({error="The passed positionable is invalid, no RADIO created!",positionable=Positionable}) +return nil +end +function RADIO:SetAlias(alias) +self.alias=tostring(alias) +return self +end +function RADIO:GetAlias() +return tostring(self.alias) +end +function RADIO:SetFileName(FileName) +self:F2(FileName) +if type(FileName)=="string"then +if FileName:find(".ogg")or FileName:find(".wav")then +if not FileName:find("l10n/DEFAULT/")then +FileName="l10n/DEFAULT/"..FileName +end +self.FileName=FileName +return self +end +end +self:E({"File name invalid. Maybe something wrong with the extension?",FileName}) +return self +end +function RADIO:SetFrequency(Frequency) +self:F2(Frequency) +if type(Frequency)=="number"then +self.Frequency=Frequency +self.HertzFrequency=Frequency*1000000 +if self.Positionable.ClassName=="UNIT"or self.Positionable.ClassName=="GROUP"then +local commandSetFrequency={ +id="SetFrequency", +params={ +frequency=self.HertzFrequency, +modulation=self.Modulation, +} +} +self:T2(commandSetFrequency) +self.Positionable:SetCommand(commandSetFrequency) +end +return self +end +self:E({"Frequency is not a number. Frequency unchanged.",Frequency}) +return self +end +function RADIO:SetModulation(Modulation) +self:F2(Modulation) +if type(Modulation)=="number"then +if Modulation==radio.modulation.AM or Modulation==radio.modulation.FM then +self.Modulation=Modulation +if self.moduhasbeenset==false and Modulation==radio.modulation.FM then +self:SetFrequency(self.Frequency) +end +self.moduhasbeenset=true +return self +end +end +self:E({"Modulation is invalid. Use DCS's enum radio.modulation. Modulation unchanged.",self.Modulation}) +return self +end +function RADIO:SetPower(Power) +self:F2(Power) +if type(Power)=="number"then +self.Power=math.floor(math.abs(Power)) +else +self:E({"Power is invalid. Power unchanged.",self.Power}) +end +return self +end +function RADIO:SetLoop(Loop) +self:F2(Loop) +if type(Loop)=="boolean"then +self.Loop=Loop +return self +end +self:E({"Loop is invalid. Loop unchanged.",self.Loop}) +return self +end +function RADIO:SetSubtitle(Subtitle,SubtitleDuration) +self:F2({Subtitle,SubtitleDuration}) +if type(Subtitle)=="string"then +self.Subtitle=Subtitle +else +self.Subtitle="" +self:E({"Subtitle is invalid. Subtitle reset.",self.Subtitle}) +end +if type(SubtitleDuration)=="number"then +self.SubtitleDuration=SubtitleDuration +else +self.SubtitleDuration=0 +self:E({"SubtitleDuration is invalid. SubtitleDuration reset.",self.SubtitleDuration}) +end +return self +end +function RADIO:NewGenericTransmission(FileName,Frequency,Modulation,Power,Loop) +self:F({FileName,Frequency,Modulation,Power}) +self:SetFileName(FileName) +if Frequency then self:SetFrequency(Frequency)end +if Modulation then self:SetModulation(Modulation)end +if Power then self:SetPower(Power)end +if Loop then self:SetLoop(Loop)end +return self +end +function RADIO:NewUnitTransmission(FileName,Subtitle,SubtitleDuration,Frequency,Modulation,Loop) +self:F({FileName,Subtitle,SubtitleDuration,Frequency,Modulation,Loop}) +self:SetFileName(FileName) +if Modulation then +self:SetModulation(Modulation) +end +if Frequency then +self:SetFrequency(Frequency) +end +if Subtitle then +self:SetSubtitle(Subtitle,SubtitleDuration or 0) +end +if Loop then +self:SetLoop(Loop) +end +return self +end +function RADIO:Broadcast(viatrigger) +self:F({viatrigger=viatrigger}) +if(self.Positionable.ClassName=="UNIT"or self.Positionable.ClassName=="GROUP")and(not viatrigger)then +self:T("Broadcasting from a UNIT or a GROUP") +local commandTransmitMessage={ +id="TransmitMessage", +params={ +file=self.FileName, +duration=self.SubtitleDuration, +subtitle=self.Subtitle, +loop=self.Loop, +}} +self:T3(commandTransmitMessage) +self.Positionable:SetCommand(commandTransmitMessage) +else +self:T("Broadcasting from a POSITIONABLE") +trigger.action.radioTransmission(self.FileName,self.Positionable:GetPositionVec3(),self.Modulation,self.Loop,self.Frequency,self.Power,tostring(self.ID)) +end +return self +end +function RADIO:StopBroadcast() +self:F() +if self.Positionable.ClassName=="UNIT"or self.Positionable.ClassName=="GROUP"then +local commandStopTransmission={id="StopTransmission",params={}} +self.Positionable:SetCommand(commandStopTransmission) +else +trigger.action.stopRadioTransmission(tostring(self.ID)) +end +return self +end +RADIOQUEUE={ +ClassName="RADIOQUEUE", +Debugmode=nil, +lid=nil, +frequency=nil, +modulation=nil, +scheduler=nil, +RQid=nil, +queue={}, +alias=nil, +dt=nil, +delay=nil, +Tlast=nil, +sendercoord=nil, +sendername=nil, +senderinit=nil, +power=nil, +numbers={}, +checking=nil, +schedonce=false, +} +function RADIOQUEUE:New(frequency,modulation,alias) +local self=BASE:Inherit(self,BASE:New()) +self.alias=alias or"My Radio" +self.lid=string.format("RADIOQUEUE %s | ",self.alias) +if frequency==nil then +self:E(self.lid.."ERROR: No frequency specified as first parameter!") +return nil +end +self.frequency=frequency*1000000 +self.modulation=modulation or radio.modulation.AM +self:SetRadioPower() +self.scheduler=SCHEDULER:New() +self.scheduler:NoTrace() +return self +end +function RADIOQUEUE:Start(delay,dt) +self.delay=delay or 1 +self.dt=dt or 0.01 +self:I(self.lid..string.format("Starting RADIOQUEUE %s on Frequency %.2f MHz [modulation=%d] in %.1f seconds (dt=%.3f sec)",self.alias,self.frequency/1000000,self.modulation,self.delay,self.dt)) +if self.schedonce then +self:_CheckRadioQueueDelayed(self.delay) +else +self.RQid=self.scheduler:Schedule(nil,RADIOQUEUE._CheckRadioQueue,{self},self.delay,self.dt) +end +return self +end +function RADIOQUEUE:Stop() +self:I(self.lid.."Stopping RADIOQUEUE.") +self.scheduler:Stop(self.RQid) +self.queue={} +return self +end +function RADIOQUEUE:SetSenderCoordinate(coordinate) +self.sendercoord=coordinate +return self +end +function RADIOQUEUE:SetSenderUnitName(name) +self.sendername=name +return self +end +function RADIOQUEUE:SetRadioPower(power) +self.power=power or 100 +return self +end +function RADIOQUEUE:SetSRS(PathToSRS,Port) +local path=PathToSRS or MSRS.path +local port=Port or MSRS.port +self.msrs=MSRS:New(path,self.frequency/1000000,self.modulation) +self.msrs:SetPort(port) +return self +end +function RADIOQUEUE:SetDigit(digit,filename,duration,path,subtitle,subduration) +local transmission={} +transmission.filename=filename +transmission.duration=duration +transmission.path=path or"l10n/DEFAULT/" +transmission.subtitle=nil +transmission.subduration=nil +if type(digit)=="number"then +digit=tostring(digit) +end +self.numbers[digit]=transmission +return self +end +function RADIOQUEUE:AddTransmission(transmission) +self:F({transmission=transmission}) +transmission.isplaying=false +transmission.Tstarted=nil +table.insert(self.queue,transmission) +if self.schedonce and not self.checking then +self:_CheckRadioQueueDelayed() +end +return self +end +function RADIOQUEUE:NewTransmission(filename,duration,path,tstart,interval,subtitle,subduration) +if not filename then +self:E(self.lid.."ERROR: No filename specified.") +return nil +end +if type(filename)~="string"then +self:E(self.lid.."ERROR: Filename specified is NOT a string.") +return nil +end +if not duration then +self:E(self.lid.."ERROR: No duration of transmission specified.") +return nil +end +if type(duration)~="number"then +self:E(self.lid..string.format("ERROR: Duration specified is NOT a number but type=%s. Filename=%s, duration=%s",type(duration),tostring(filename),tostring(duration))) +return nil +end +local transmission={} +transmission.filename=filename +transmission.duration=duration +transmission.path=path or"l10n/DEFAULT/" +transmission.Tplay=tstart or timer.getAbsTime() +transmission.subtitle=subtitle +transmission.interval=interval or 0 +if transmission.subtitle then +transmission.subduration=subduration or 5 +else +transmission.subduration=nil +end +self:AddTransmission(transmission) +return transmission +end +function RADIOQUEUE:AddSoundFile(soundfile,tstart,interval) +local transmission=self:NewTransmission(soundfile:GetFileName(),soundfile.duration,soundfile:GetPath(),tstart,interval,soundfile.subtitle,soundfile.subduration) +transmission.soundfile=soundfile +return self +end +function RADIOQUEUE:AddSoundText(soundtext,tstart,interval) +local transmission=self:NewTransmission("SoundText.ogg",soundtext.duration,nil,tstart,interval,soundtext.subtitle,soundtext.subduration) +transmission.soundtext=soundtext +return self +end +function RADIOQUEUE:Number2Transmission(number,delay,interval) +local numbers=UTILS.GetCharacters(number) +local wait=0 +for i=1,#numbers do +local n=numbers[i] +local transmission=UTILS.DeepCopy(self.numbers[n]) +transmission.Tplay=timer.getAbsTime()+(delay or 0) +if interval and i==1 then +transmission.interval=interval +end +self:AddTransmission(transmission) +wait=wait+transmission.duration +end +return wait +end +function RADIOQUEUE:Broadcast(transmission) +self:T("Broadcast") +if((transmission.soundfile and transmission.soundfile.useSRS)or transmission.soundtext)and self.msrs then +self:_BroadcastSRS(transmission) +return +end +local sender=self:_GetRadioSender() +local filename=string.format("%s%s",transmission.path,transmission.filename) +if sender then +self:T(self.lid..string.format("Broadcasting from aircraft %s",sender:GetName())) +local commandFrequency={ +id="SetFrequency", +params={ +frequency=self.frequency, +modulation=self.modulation, +}} +sender:SetCommand(commandFrequency) +self.senderinit=true +local subtitle=nil +local duration=nil +if transmission.subtitle and transmission.subduration and transmission.subduration>0 then +subtitle=transmission.subtitle +duration=transmission.subduration +end +local commandTransmit={ +id="TransmitMessage", +params={ +file=filename, +duration=duration, +subtitle=subtitle, +loop=false, +}} +sender:SetCommand(commandTransmit) +if self.Debugmode then +local text=string.format("file=%s, freq=%.2f MHz, duration=%.2f sec, subtitle=%s",filename,self.frequency/1000000,transmission.duration,transmission.subtitle or"") +MESSAGE:New(text,2,"RADIOQUEUE "..self.alias):ToAll() +end +else +self:T(self.lid..string.format("Broadcasting via trigger.action.radioTransmission()")) +local vec3=nil +if self.sendername then +vec3=self:_GetRadioSenderCoord() +end +if self.sendercoord and not vec3 then +vec3=self.sendercoord:GetVec3() +end +if vec3 then +self:T("Sending") +self:T({filename=filename,vec3=vec3,modulation=self.modulation,frequency=self.frequency,power=self.power}) +trigger.action.radioTransmission(filename,vec3,self.modulation,false,self.frequency,self.power) +if self.Debugmode then +local text=string.format("file=%s, freq=%.2f MHz, duration=%.2f sec, subtitle=%s",filename,self.frequency/1000000,transmission.duration,transmission.subtitle or"") +MESSAGE:New(string.format(text,filename,transmission.duration,transmission.subtitle or""),5,"RADIOQUEUE "..self.alias):ToAll() +end +else +self:E("ERROR: Could not get vec3 to determine transmission origin! Did you specify a sender and is it still alive?") +end +end +end +function RADIOQUEUE:_BroadcastSRS(transmission) +if transmission.soundfile and transmission.soundfile.useSRS then +self.msrs:PlaySoundFile(transmission.soundfile) +elseif transmission.soundtext then +self.msrs:PlaySoundText(transmission.soundtext) +end +end +function RADIOQUEUE:_CheckRadioQueueDelayed(delay) +self.checking=true +self:ScheduleOnce(delay or self.dt,RADIOQUEUE._CheckRadioQueue,self) +end +function RADIOQUEUE:_CheckRadioQueue() +if#self.queue==0 then +self.checking=false +return +end +local time=timer.getAbsTime() +local playing=false +local next=nil +local remove=nil +for i,_transmission in ipairs(self.queue)do +local transmission=_transmission +if time>=transmission.Tplay then +if transmission.isplaying then +if time>=transmission.Tstarted+transmission.duration then +transmission.isplaying=false +remove=i +self.Tlast=time +else +playing=true +end +else +local Tlast=self.Tlast +if transmission.interval==nil then +if next==nil then +next=transmission +end +else +if Tlast==nil or time-Tlast>=transmission.interval then +next=transmission +else +end +end +if next or Tlast then +break +end +end +else +end +end +if next~=nil and not playing then +self:Broadcast(next) +next.isplaying=true +next.Tstarted=time +end +if remove then +table.remove(self.queue,remove) +end +if self.schedonce then +self:_CheckRadioQueueDelayed() +end +end +function RADIOQUEUE:_GetRadioSender() +local sender=nil +if self.sendername then +sender=UNIT:FindByName(self.sendername) +if sender and sender:IsAlive()and(sender:IsAir()or sender:IsGround())then +return sender +end +end +return nil +end +function RADIOQUEUE:_GetRadioSenderCoord() +local vec3=nil +if self.sendername then +local sender=UNIT:FindByName(self.sendername) +if sender and sender:IsAlive()then +return sender:GetVec3() +end +local sender=STATIC:FindByName(self.sendername,false) +if sender then +return sender:GetVec3() +end +end +return nil +end +RADIOSPEECH={ +ClassName="RADIOSPEECH", +Vocabulary={ +EN={}, +DE={}, +RU={}, +} +} +RADIOSPEECH.Vocabulary.EN={ +["1"]={"1",0.25}, +["2"]={"2",0.25}, +["3"]={"3",0.30}, +["4"]={"4",0.35}, +["5"]={"5",0.35}, +["6"]={"6",0.42}, +["7"]={"7",0.38}, +["8"]={"8",0.20}, +["9"]={"9",0.32}, +["10"]={"10",0.35}, +["11"]={"11",0.40}, +["12"]={"12",0.42}, +["13"]={"13",0.38}, +["14"]={"14",0.42}, +["15"]={"15",0.42}, +["16"]={"16",0.52}, +["17"]={"17",0.59}, +["18"]={"18",0.40}, +["19"]={"19",0.47}, +["20"]={"20",0.38}, +["30"]={"30",0.29}, +["40"]={"40",0.35}, +["50"]={"50",0.32}, +["60"]={"60",0.44}, +["70"]={"70",0.48}, +["80"]={"80",0.26}, +["90"]={"90",0.36}, +["100"]={"100",0.55}, +["200"]={"200",0.55}, +["300"]={"300",0.61}, +["400"]={"400",0.60}, +["500"]={"500",0.61}, +["600"]={"600",0.65}, +["700"]={"700",0.70}, +["800"]={"800",0.54}, +["900"]={"900",0.60}, +["1000"]={"1000",0.60}, +["2000"]={"2000",0.61}, +["3000"]={"3000",0.64}, +["4000"]={"4000",0.62}, +["5000"]={"5000",0.69}, +["6000"]={"6000",0.69}, +["7000"]={"7000",0.75}, +["8000"]={"8000",0.59}, +["9000"]={"9000",0.65}, +["chevy"]={"chevy",0.35}, +["colt"]={"colt",0.35}, +["springfield"]={"springfield",0.65}, +["dodge"]={"dodge",0.35}, +["enfield"]={"enfield",0.5}, +["ford"]={"ford",0.32}, +["pontiac"]={"pontiac",0.55}, +["uzi"]={"uzi",0.28}, +["degrees"]={"degrees",0.5}, +["kilometers"]={"kilometers",0.65}, +["km"]={"kilometers",0.65}, +["miles"]={"miles",0.45}, +["meters"]={"meters",0.41}, +["mi"]={"miles",0.45}, +["feet"]={"feet",0.29}, +["br"]={"br",1.1}, +["bra"]={"bra",0.3}, +["returning to base"]={"returning_to_base",0.85}, +["on route to ground target"]={"on_route_to_ground_target",1.05}, +["intercepting bogeys"]={"intercepting_bogeys",1.00}, +["engaging ground target"]={"engaging_ground_target",1.20}, +["engaging bogeys"]={"engaging_bogeys",0.81}, +["wheels up"]={"wheels_up",0.42}, +["landing at base"]={"landing at base",0.8}, +["patrolling"]={"patrolling",0.55}, +["for"]={"for",0.31}, +["and"]={"and",0.31}, +["at"]={"at",0.3}, +["dot"]={"dot",0.26}, +["defender"]={"defender",0.45}, +} +RADIOSPEECH.Vocabulary.RU={ +["1"]={"1",0.34}, +["2"]={"2",0.30}, +["3"]={"3",0.23}, +["4"]={"4",0.51}, +["5"]={"5",0.31}, +["6"]={"6",0.44}, +["7"]={"7",0.25}, +["8"]={"8",0.43}, +["9"]={"9",0.45}, +["10"]={"10",0.53}, +["11"]={"11",0.66}, +["12"]={"12",0.70}, +["13"]={"13",0.66}, +["14"]={"14",0.80}, +["15"]={"15",0.65}, +["16"]={"16",0.75}, +["17"]={"17",0.74}, +["18"]={"18",0.85}, +["19"]={"19",0.80}, +["20"]={"20",0.58}, +["30"]={"30",0.51}, +["40"]={"40",0.51}, +["50"]={"50",0.67}, +["60"]={"60",0.76}, +["70"]={"70",0.68}, +["80"]={"80",0.84}, +["90"]={"90",0.71}, +["100"]={"100",0.35}, +["200"]={"200",0.59}, +["300"]={"300",0.53}, +["400"]={"400",0.70}, +["500"]={"500",0.50}, +["600"]={"600",0.58}, +["700"]={"700",0.64}, +["800"]={"800",0.77}, +["900"]={"900",0.75}, +["1000"]={"1000",0.87}, +["2000"]={"2000",0.83}, +["3000"]={"3000",0.84}, +["4000"]={"4000",1.00}, +["5000"]={"5000",0.77}, +["6000"]={"6000",0.90}, +["7000"]={"7000",0.77}, +["8000"]={"8000",0.92}, +["9000"]={"9000",0.87}, +["градусы"]={"degrees",0.5}, +["километры"]={"kilometers",0.65}, +["km"]={"kilometers",0.65}, +["мили"]={"miles",0.45}, +["mi"]={"miles",0.45}, +["метров"]={"meters",0.41}, +["m"]={"meters",0.41}, +["ноги"]={"feet",0.37}, +["br"]={"br",1.1}, +["bra"]={"bra",0.3}, +["возвращение на базу"]={"returning_to_base",1.40}, +["на пути к наземной цели"]={"on_route_to_ground_target",1.45}, +["перехват боги"]={"intercepting_bogeys",1.22}, +["поражение наземной цели"]={"engaging_ground_target",1.53}, +["привлечение болотных птиц"]={"engaging_bogeys",1.68}, +["колёса вверх..."]={"wheels_up",0.92}, +["посадка на базу"]={"landing at base",1.04}, +["патрулирование"]={"patrolling",0.96}, +["для"]={"for",0.27}, +["и"]={"and",0.17}, +["на сайте"]={"at",0.19}, +["точка"]={"dot",0.51}, +["защитник"]={"defender",0.45}, +} +function RADIOSPEECH:New(frequency,modulation) +local self=BASE:Inherit(self,RADIOQUEUE:New(frequency,modulation)) +self.Language="EN" +self:BuildTree() +return self +end +function RADIOSPEECH:SetLanguage(Langauge) +self.Language=Langauge +end +function RADIOSPEECH:AddSentenceToSpeech(RemainingSentence,Speech,Sentence,Data) +self:I({RemainingSentence,Speech,Sentence,Data}) +local Token,RemainingSentence=RemainingSentence:match("^ *([^ ]+)(.*)") +self:I({Token=Token,RemainingSentence=RemainingSentence}) +if Token then +if not Speech[Token]then +Speech[Token]={} +if RemainingSentence and RemainingSentence~=""then +Speech[Token].Next={} +self:AddSentenceToSpeech(RemainingSentence,Speech[Token].Next,Sentence,Data) +else +Speech[Token].Sentence=Sentence +Speech[Token].Data=Data +end +end +end +end +function RADIOSPEECH:BuildTree() +self.Speech={} +for Language,Sentences in pairs(self.Vocabulary)do +self:I({Language=Language,Sentences=Sentences}) +self.Speech[Language]={} +for Sentence,Data in pairs(Sentences)do +self:I({Sentence=Sentence,Data=Data}) +self:AddSentenceToSpeech(Sentence,self.Speech[Language],Sentence,Data) +end +end +self:I({Speech=self.Speech}) +return self +end +function RADIOSPEECH:SpeakWords(Sentence,Speech,Language) +local OriginalSentence=Sentence +local Word,RemainderSentence=Sentence:match("^[., ]*([^ .,]+)(.*)") +self:I({Word=Word,Speech=Speech[Word],RemainderSentence=RemainderSentence}) +if Word then +if Word~=""and tonumber(Word)==nil then +Word=Word:lower() +if Speech[Word]then +if Speech[Word].Next==nil then +self:I({Sentence=Speech[Word].Sentence,Data=Speech[Word].Data}) +self:NewTransmission(Speech[Word].Data[1]..".wav",Speech[Word].Data[2],Language.."/") +else +if RemainderSentence and RemainderSentence~=""then +return self:SpeakWords(RemainderSentence,Speech[Word].Next,Language) +end +end +end +return RemainderSentence +end +return OriginalSentence +else +return"" +end +end +function RADIOSPEECH:SpeakDigits(Sentence,Speech,Langauge) +local OriginalSentence=Sentence +local Digits,RemainderSentence=Sentence:match("^[., ]*([^ .,]+)(.*)") +self:I({Digits=Digits,Speech=Speech[Digits],RemainderSentence=RemainderSentence}) +if Digits then +if Digits~=""and tonumber(Digits)~=nil then +local Number=tonumber(Digits) +local Multiple=nil +while Number>=0 do +if Number>1000 then +Multiple=math.floor(Number/1000)*1000 +elseif Number>100 then +Multiple=math.floor(Number/100)*100 +elseif Number>20 then +Multiple=math.floor(Number/10)*10 +elseif Number>=0 then +Multiple=Number +end +Sentence=tostring(Multiple) +if Speech[Sentence]then +self:I({Speech=Speech[Sentence].Sentence,Data=Speech[Sentence].Data}) +self:NewTransmission(Speech[Sentence].Data[1]..".wav",Speech[Sentence].Data[2],Langauge.."/") +end +Number=Number-Multiple +Number=(Number==0)and-1 or Number +end +return RemainderSentence +end +return OriginalSentence +else +return"" +end +end +function RADIOSPEECH:Speak(Sentence,Language) +self:I({Sentence,Language}) +local Language=Language or"EN" +self:I({Language=Language}) +local Speech=self.Speech[Language] +self:I({Speech=Speech,Language=Language}) +self:NewTransmission("_In.wav",0.52,Language.."/") +repeat +Sentence=self:SpeakWords(Sentence,Speech,Language) +self:I({Sentence=Sentence}) +Sentence=self:SpeakDigits(Sentence,Speech,Language) +self:I({Sentence=Sentence}) +until not Sentence or Sentence=="" +self:NewTransmission("_Out.wav",0.28,Language.."/") +end +MSRS={ +ClassName="MSRS", +lid=nil, +port=5002, +name="MSRS", +backend="srsexe", +frequencies={}, +modulations={}, +coalition=0, +gender="female", +culture=nil, +voice=nil, +volume=1, +speed=1, +coordinate=nil, +provider="win", +Label="ROBOT", +ConfigFileName="Moose_MSRS.lua", +ConfigFilePath="Config\\", +ConfigLoaded=false, +poptions={}, +UsePowerShell=false, +} +MSRS.version="0.3.3" +MSRS.Voices={ +Amazon={ +Generative={ +en_AU={ +Olivia="Olivia", +}, +en_GB={ +Amy="Amy", +}, +en_US={ +Danielle="Danielle", +Joanna="Joanna", +Ruth="Ruth", +Stephen="Stephen", +}, +fr_FR={ +["Léa"]="Léa", +["Rémi"]="Rémi", +}, +de_DE={ +Vicki="Vicki", +Daniel="Daniel", +}, +it_IT={ +Bianca="Bianca", +Adriano="Adriano", +}, +es_ES={ +Lucia="Lucia", +Sergio="Sergio", +}, +}, +LongForm={ +en_US={ +Danielle="Danielle", +Gregory="Gregory", +Ivy="Ivy", +Ruth="Ruth", +Patrick="Patrick", +}, +es_ES={ +Alba="Alba", +["Raúl"]="Raúl", +}, +}, +Neural={ +en_AU={ +Olivia="Olivia", +}, +en_GB={ +Amy="Amy", +Emma="Emma", +Brian="Brian", +Arthur="Arthur", +}, +en_US={ +Danielle="Danielle", +Gregory="Gregory", +Ivy="Ivy", +Joanna="Joanna", +Kendra="Kendra", +Kimberly="Kimberly", +Salli="Salli", +Joey="Joey", +Kevin="Kevin", +Ruth="Ruth", +Stephen="Stephen", +}, +fr_FR={ +["Léa"]="Léa", +["Rémi"]="Rémi", +}, +de_DE={ +Vicki="Vicki", +Daniel="Daniel", +}, +it_IT={ +Bianca="Bianca", +Adriano="Adriano", +}, +es_ES={ +Lucia="Lucia", +Sergio="Sergio", +}, +}, +Standard={ +en_AU={ +Nicole="Nicole", +Russel="Russel", +}, +en_GB={ +Amy="Amy", +Emma="Emma", +Brian="Brian", +}, +en_IN={ +Aditi="Aditi", +Raveena="Raveena", +}, +en_US={ +Ivy="Ivy", +Joanna="Joanna", +Kendra="Kendra", +Kimberly="Kimberly", +Salli="Salli", +Joey="Joey", +Kevin="Kevin", +}, +fr_FR={ +Celine="Celine", +["Léa"]="Léa", +Mathieu="Mathieu", +}, +de_DE={ +Marlene="Marlene", +Vicki="Vicki", +Hans="Hans", +}, +it_IT={ +Carla="Carla", +Bianca="Bianca", +Giorgio="Giorgio", +}, +es_ES={ +Conchita="Conchita", +Lucia="Lucia", +Enrique="Enrique", +}, +}, +}, +Microsoft={ +["Hedda"]="Microsoft Hedda Desktop", +["Hazel"]="Microsoft Hazel Desktop", +["David"]="Microsoft David Desktop", +["Zira"]="Microsoft Zira Desktop", +["Hortense"]="Microsoft Hortense Desktop", +["de_DE_Hedda"]="Microsoft Hedda Desktop", +["en_GB_Hazel"]="Microsoft Hazel Desktop", +["en_US_David"]="Microsoft David Desktop", +["en_US_Zira"]="Microsoft Zira Desktop", +["fr_FR_Hortense"]="Microsoft Hortense Desktop", +}, +MicrosoftGRPC={ +["Hazel"]="Hazel", +["George"]="George", +["Susan"]="Susan", +["David"]="David", +["Zira"]="Zira", +["Mark"]="Mark", +["James"]="James", +["Catherine"]="Catherine", +["Richard"]="Richard", +["Linda"]="Linda", +["Ravi"]="Ravi", +["Heera"]="Heera", +["Sean"]="Sean", +["en_GB_Hazel"]="Hazel", +["en_GB_George"]="George", +["en_GB_Susan"]="Susan", +["en_US_David"]="David", +["en_US_Zira"]="Zira", +["en_US_Mark"]="Mark", +["en_AU_James"]="James", +["en_AU_Catherine"]="Catherine", +["en_CA_Richard"]="Richard", +["en_CA_Linda"]="Linda", +["en_IN_Ravi"]="Ravi", +["en_IN_Heera"]="Heera", +["en_IR_Sean"]="Sean", +}, +Google={ +Standard={ +["en_AU_Standard_A"]='en-AU-Standard-A', +["en_AU_Standard_B"]='en-AU-Standard-B', +["en_AU_Standard_C"]='en-AU-Standard-C', +["en_AU_Standard_D"]='en-AU-Standard-D', +["en_IN_Standard_A"]='en-IN-Standard-A', +["en_IN_Standard_B"]='en-IN-Standard-B', +["en_IN_Standard_C"]='en-IN-Standard-C', +["en_IN_Standard_D"]='en-IN-Standard-D', +["en_IN_Standard_E"]='en-IN-Standard-E', +["en_IN_Standard_F"]='en-IN-Standard-F', +["en_GB_Standard_A"]='en-GB-Standard-A', +["en_GB_Standard_B"]='en-GB-Standard-B', +["en_GB_Standard_C"]='en-GB-Standard-C', +["en_GB_Standard_D"]='en-GB-Standard-D', +["en_GB_Standard_F"]='en-GB-Standard-F', +["en_GB_Standard_N"]='en-GB-Standard-N', +["en_GB_Standard_O"]='en-GB-Standard-O', +["en_US_Standard_A"]='en-US-Standard-A', +["en_US_Standard_B"]='en-US-Standard-B', +["en_US_Standard_C"]='en-US-Standard-C', +["en_US_Standard_D"]='en-US-Standard-D', +["en_US_Standard_E"]='en-US-Standard-E', +["en_US_Standard_F"]='en-US-Standard-F', +["en_US_Standard_G"]='en-US-Standard-G', +["en_US_Standard_H"]='en-US-Standard-H', +["en_US_Standard_I"]='en-US-Standard-I', +["en_US_Standard_J"]='en-US-Standard-J', +["fr_FR_Standard_A"]="fr-FR-Standard-F", +["fr_FR_Standard_B"]="fr-FR-Standard-G", +["fr_FR_Standard_C"]="fr-FR-Standard-F", +["fr_FR_Standard_D"]="fr-FR-Standard-G", +["fr_FR_Standard_E"]="fr-FR-Standard-F", +["fr_FR_Standard_G"]="fr-FR-Standard-G", +["fr_FR_Standard_F"]="fr-FR-Standard-F", +["de_DE_Standard_A"]='de-DE-Standard-A', +["de_DE_Standard_B"]='de-DE-Standard-B', +["de_DE_Standard_C"]='de-DE-Standard-C', +["de_DE_Standard_D"]='de-DE-Standard-D', +["de_DE_Standard_E"]='de-DE-Standard-E', +["de_DE_Standard_F"]='de-DE-Standard-F', +["de_DE_Standard_G"]='de-DE-Standard-G', +["de_DE_Standard_H"]='de-DE-Standard-H', +["es_ES_Standard_A"]="es-ES-Standard-E", +["es_ES_Standard_B"]="es-ES-Standard-F", +["es_ES_Standard_C"]="es-ES-Standard-E", +["es_ES_Standard_D"]="es-ES-Standard-F", +["es_ES_Standard_E"]="es-ES-Standard-E", +["es_ES_Standard_F"]="es-ES-Standard-F", +["it_IT_Standard_A"]="it-IT-Standard-E", +["it_IT_Standard_B"]="it-IT-Standard-E", +["it_IT_Standard_C"]="it-IT-Standard-F", +["it_IT_Standard_D"]="it-IT-Standard-F", +["it_IT_Standard_E"]="it-IT-Standard-E", +["it_IT_Standard_F"]="it-IT-Standard-F", +}, +Wavenet={ +["en_AU_Wavenet_A"]='en-AU-Wavenet-A', +["en_AU_Wavenet_B"]='en-AU-Wavenet-B', +["en_AU_Wavenet_C"]='en-AU-Wavenet-C', +["en_AU_Wavenet_D"]='en-AU-Wavenet-D', +["en_IN_Wavenet_A"]='en-IN-Wavenet-A', +["en_IN_Wavenet_B"]='en-IN-Wavenet-B', +["en_IN_Wavenet_C"]='en-IN-Wavenet-C', +["en_IN_Wavenet_D"]='en-IN-Wavenet-D', +["en_IN_Wavenet_E"]='en-IN-Wavenet-E', +["en_IN_Wavenet_F"]='en-IN-Wavenet-F', +["en_GB_Wavenet_A"]='en-GB-Wavenet-A', +["en_GB_Wavenet_B"]='en-GB-Wavenet-B', +["en_GB_Wavenet_C"]='en-GB-Wavenet-C', +["en_GB_Wavenet_D"]='en-GB-Wavenet-D', +["en_GB_Wavenet_F"]='en-GB-Wavenet-F', +["en_GB_Wavenet_O"]='en-GB-Wavenet-O', +["en_GB_Wavenet_N"]='en-GB-Wavenet-N', +["en_US_Wavenet_A"]='en-US-Wavenet-A', +["en_US_Wavenet_B"]='en-US-Wavenet-B', +["en_US_Wavenet_C"]='en-US-Wavenet-C', +["en_US_Wavenet_D"]='en-US-Wavenet-D', +["en_US_Wavenet_E"]='en-US-Wavenet-E', +["en_US_Wavenet_F"]='en-US-Wavenet-F', +["en_US_Wavenet_G"]='en-US-Wavenet-G', +["en_US_Wavenet_H"]='en-US-Wavenet-H', +["en_US_Wavenet_I"]='en-US-Wavenet-I', +["en_US_Wavenet_J"]='en-US-Wavenet-J', +["fr_FR_Wavenet_A"]="fr-FR-Wavenet-F", +["fr_FR_Wavenet_B"]="fr-FR-Wavenet-G", +["fr_FR_Wavenet_C"]="fr-FR-Wavenet-F", +["fr_FR_Wavenet_D"]="fr-FR-Wavenet-G", +["fr_FR_Wavenet_E"]="fr-FR-Wavenet-F", +["fr_FR_Wavenet_G"]="fr-FR-Wavenet-G", +["fr_FR_Wavenet_F"]="fr-FR-Wavenet-F", +["de_DE_Wavenet_A"]='de-DE-Wavenet-A', +["de_DE_Wavenet_B"]='de-DE-Wavenet-B', +["de_DE_Wavenet_C"]='de-DE-Wavenet-C', +["de_DE_Wavenet_D"]='de-DE-Wavenet-D', +["de_DE_Wavenet_E"]='de-DE-Wavenet-E', +["de_DE_Wavenet_F"]='de-DE-Wavenet-F', +["de_DE_Wavenet_G"]='de-DE-Wavenet-G', +["de_DE_Wavenet_H"]='de-DE-Wavenet-H', +["es_ES_Wavenet_B"]="es-ES-Wavenet-E", +["es_ES_Wavenet_C"]="es-ES-Wavenet-F", +["es_ES_Wavenet_D"]="es-ES-Wavenet-E", +["es_ES_Wavenet_E"]="es-ES-Wavenet-E", +["es_ES_Wavenet_F"]="es-ES-Wavenet-F", +["it_IT_Wavenet_A"]="it-IT-Wavenet-E", +["it_IT_Wavenet_B"]="it-IT-Wavenet-E", +["it_IT_Wavenet_C"]="it-IT-Wavenet-F", +["it_IT_Wavenet_D"]="it-IT-Wavenet-F", +["it_IT_Wavenet_E"]="it-IT-Wavenet-E", +["it_IT_Wavenet_F"]="it-IT-Wavenet-F", +}, +Chirp3HD={ +["en_GB_Chirp3_HD_Aoede"]='en-GB-Chirp3-HD-Aoede', +["en_GB_Chirp3_HD_Charon"]='en-GB-Chirp3-HD-Charon', +["en_GB_Chirp3_HD_Fenrir"]='en-GB-Chirp3-HD-Fenrir', +["en_GB_Chirp3_HD_Kore"]='en-GB-Chirp3-HD-Kore', +["en_GB_Chirp3_HD_Leda"]='en-GB-Chirp3-HD-Leda', +["en_GB_Chirp3_HD_Orus"]='en-GB-Chirp3-HD-Orus', +["en_GB_Chirp3_HD_Puck"]='en-GB-Chirp3-HD-Puck', +["en_GB_Chirp3_HD_Zephyr"]='en-GB-Chirp3-HD-Zephyr', +["en_US_Chirp3_HD_Charon"]='en-US-Chirp3-HD-Charon', +["en_US_Chirp3_HD_Fenrir"]='en-US-Chirp3-HD-Fenrir', +["en_US_Chirp3_HD_Kore"]='en-US-Chirp3-HD-Kore', +["en_US_Chirp3_HD_Leda"]='en-US-Chirp3-HD-Leda', +["en_US_Chirp3_HD_Orus"]='en-US-Chirp3-HD-Orus', +["en_US_Chirp3_HD_Puck"]='en-US-Chirp3-HD-Puck', +["de_DE_Chirp3_HD_Aoede"]='de-DE-Chirp3-HD-Aoede', +["de_DE_Chirp3_HD_Charon"]='de-DE-Chirp3-HD-Charon', +["de_DE_Chirp3_HD_Fenrir"]='de-DE-Chirp3-HD-Fenrir', +["de_DE_Chirp3_HD_Kore"]='de-DE-Chirp3-HD-Kore', +["de_DE_Chirp3_HD_Leda"]='de-DE-Chirp3-HD-Leda', +["de_DE_Chirp3_HD_Orus"]='de-DE-Chirp3-HD-Orus', +["de_DE_Chirp3_HD_Puck"]='de-DE-Chirp3-HD-Puck', +["de_DE_Chirp3_HD_Zephyr"]='de-DE-Chirp3-HD-Zephyr', +["en_AU_Chirp3_HD_Aoede"]='en-AU-Chirp3-HD-Aoede', +["en_AU_Chirp3_HD_Charon"]='en-AU-Chirp3-HD-Charon', +["en_AU_Chirp3_HD_Fenrir"]='en-AU-Chirp3-HD-Fenrir', +["en_AU_Chirp3_HD_Kore"]='en-AU-Chirp3-HD-Kore', +["en_AU_Chirp3_HD_Leda"]='en-AU-Chirp3-HD-Leda', +["en_AU_Chirp3_HD_Orus"]='en-AU-Chirp3-HD-Orus', +["en_AU_Chirp3_HD_Puck"]='en-AU-Chirp3-HD-Puck', +["en_AU_Chirp3_HD_Zephyr"]='en-AU-Chirp3-HD-Zephyr', +["en_IN_Chirp3_HD_Aoede"]='en-IN-Chirp3-HD-Aoede', +["en_IN_Chirp3_HD_Charon"]='en-IN-Chirp3-HD-Charon', +["en_IN_Chirp3_HD_Fenrir"]='en-IN-Chirp3-HD-Fenrir', +["en_IN_Chirp3_HD_Kore"]='en-IN-Chirp3-HD-Kore', +["en_IN_Chirp3_HD_Leda"]='en-IN-Chirp3-HD-Leda', +["en_IN_Chirp3_HD_Orus"]='en-IN-Chirp3-HD-Orus', +}, +ChirpHD={ +["en_US_Chirp_HD_D"]='en-US-Chirp-HD-D', +["en_US_Chirp_HD_F"]='en-US-Chirp-HD-F', +["en_US_Chirp_HD_O"]='en-US-Chirp-HD-O', +["de_DE_Chirp_HD_D"]='de-DE-Chirp-HD-D', +["de_DE_Chirp_HD_F"]='de-DE-Chirp-HD-F', +["de_DE_Chirp_HD_O"]='de-DE-Chirp-HD-O', +["en_AU_Chirp_HD_D"]='en-AU-Chirp-HD-D', +["en_AU_Chirp_HD_F"]='en-AU-Chirp-HD-F', +["en_AU_Chirp_HD_O"]='en-AU-Chirp-HD-O', +["en_IN_Chirp_HD_D"]='en-IN-Chirp-HD-D', +["en_IN_Chirp_HD_F"]='en-IN-Chirp-HD-F', +["en_IN_Chirp_HD_O"]='en-IN-Chirp-HD-O', +}, +}, +Neural2={ +["en_GB_Neural2_A"]='en-GB-Neural2-A', +["en_GB_Neural2_B"]='en-GB-Neural2-B', +["en_GB_Neural2_C"]='en-GB-Neural2-C', +["en_GB_Neural2_D"]='en-GB-Neural2-D', +["en_GB_Neural2_F"]='en-GB-Neural2-F', +["en_GB_Neural2_N"]='en-GB-Neural2-N', +["en_GB_Neural2_O"]='en-GB-Neural2-O', +["en_US_Neural2_A"]='en-US-Neural2-A', +["en_US_Neural2_C"]='en-US-Neural2-C', +["en_US_Neural2_D"]='en-US-Neural2-D', +["en_US_Neural2_E"]='en-US-Neural2-E', +["en_US_Neural2_F"]='en-US-Neural2-F', +["en_US_Neural2_G"]='en-US-Neural2-G', +["en_US_Neural2_H"]='en-US-Neural2-H', +["en_US_Neural2_I"]='en-US-Neural2-I', +["en_US_Neural2_J"]='en-US-Neural2-J', +["de_DE_Neural2_G"]='de-DE-Neural2-G', +["de_DE_Neural2_H"]='de-DE-Neural2-H', +["en_AU_Neural2_A"]='en-AU-Neural2-A', +["en_AU_Neural2_B"]='en-AU-Neural2-B', +["en_AU_Neural2_C"]='en-AU-Neural2-C', +["en_AU_Neural2_D"]='en-AU-Neural2-D', +["en_IN_Neural2_A"]='en-IN-Neural2-A', +["en_IN_Neural2_B"]='en-IN-Neural2-B', +["en_IN_Neural2_C"]='en-IN-Neural2-C', +["en_IN_Neural2_D"]='en-IN-Neural2-D', +}, +News={ +["en_GB_News_G"]='en-GB-News-G', +["en_GB_News_H"]='en-GB-News-H', +["en_GB_News_I"]='en-GB-News-I', +["en_GB_News_J"]='en-GB-News-J', +["en_GB_News_K"]='en-GB-News-K', +["en_GB_News_L"]='en-GB-News-L', +["en_GB_News_M"]='en-GB-News-M', +["en_US_News_K"]='en-US-News-K', +["en_US_News_L"]='en-US-News-L', +["en_US_News_N"]='en-US-News-N', +["en_AU_News_E"]='en-AU-News-E', +["en_AU_News_F"]='en-AU-News-F', +["en_AU_News_G"]='en-AU-News-G', +}, +Casual={ +["en_US_Casual_K"]='en-US-Casual-K', +}, +Polyglot={ +["en_US_Polyglot_1"]='en-US-Polyglot-1', +["de_DE_Polyglot_1"]='de-DE-Polyglot-1', +["en_AU_Polyglot_1"]='en-AU-Polyglot-1', +}, +Studio={ +["en_GB_Studio_B"]='en-GB-Studio-B', +["en_GB_Studio_C"]='en-GB-Studio-C', +["en_US_Studio_O"]='en-US-Studio-O', +["en_US_Studio_Q"]='en-US-Studio-Q', +["de_DE_Studio_B"]='de-DE-Studio-B', +["de_DE_Studio_C"]='de-DE-Studio-C', +}, +} +MSRS.Backend={ +SRSEXE="srsexe", +GRPC="grpc", +} +MSRS.Provider={ +WINDOWS="win", +GOOGLE="gcloud", +AZURE="azure", +AMAZON="aws", +} +function MSRS.uuid() +local random=math.random +local template='yxxx-xxxxxxxxxxxx' +return string.gsub(template,'[xy]',function(c) +local v=(c=='x')and random(0,0xf)or random(8,0xb) +return string.format('%x',v) +end) +end +function MSRS:New(Path,Frequency,Modulation,Backend) +local self=BASE:Inherit(self,BASE:New()) +self:F({Path,Frequency,Modulation,Backend}) +Frequency=Frequency or 143 +Modulation=Modulation or radio.modulation.AM +self.lid=string.format("%s-%s | ","unknown",self.version) +if not self.ConfigLoaded then +self:SetPath(Path) +self:SetPort() +self:SetFrequencies(Frequency) +self:SetModulations(Modulation) +self:SetGender() +self:SetCoalition() +self:SetLabel() +self:SetVolume() +self:SetBackend(Backend) +else +if Path then +self:SetPath(Path) +end +if Frequency then +self:SetFrequencies(Frequency) +end +if Modulation then +self:SetModulations(Modulation) +end +if Backend then +self:SetBackend(Backend) +end +end +self.lid=string.format("%s-%s | ",self.name,self.version) +if not io or not os then +self:E(self.lid.."***** ERROR - io or os NOT desanitized! MSRS will not work!") +end +return self +end +function MSRS:SetBackend(Backend) +self:F({Backend=Backend}) +Backend=Backend or MSRS.Backend.SRSEXE +local function Checker(back) +local ok=false +for _,_backend in pairs(MSRS.Backend)do +if tostring(back)==_backend then ok=true end +end +return ok +end +if Checker(Backend)then +self.backend=Backend +else +MESSAGE:New("ERROR: Backend "..tostring(Backend).." is not supported!",30,"MSRS",true):ToLog():ToAll() +end +return self +end +function MSRS:SetBackendGRPC() +self:F() +self:SetBackend(MSRS.Backend.GRPC) +return self +end +function MSRS:SetBackendSRSEXE() +self:F() +self:SetBackend(MSRS.Backend.SRSEXE) +return self +end +function MSRS.SetDefaultBackend(Backend) +MSRS.backend=Backend or MSRS.Backend.SRSEXE +end +function MSRS.SetDefaultBackendGRPC() +MSRS.backend=MSRS.Backend.GRPC +end +function MSRS:GetBackend() +return self.backend +end +function MSRS:SetPath(Path) +self:F({Path=Path}) +self.path=Path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +local n=1;local nmax=1000 +while(self.path:sub(-1)=="/"or self.path:sub(-1)==[[\]])and n<=nmax do +self.path=self.path:sub(1,#self.path-1) +n=n+1 +end +self:F(string.format("SRS path=%s",self:GetPath())) +return self +end +function MSRS:GetPath() +return self.path +end +function MSRS:SetVolume(Volume) +self:F({Volume=Volume}) +local volume=Volume or 1 +if volume>1 then volume=1 elseif volume<0 then volume=0 end +self.volume=volume +return self +end +function MSRS:GetVolume() +return self.volume +end +function MSRS:SetLabel(Label) +self:F({Label=Label}) +self.Label=Label or"ROBOT" +return self +end +function MSRS:GetLabel() +return self.Label +end +function MSRS:SetPort(Port) +self:F({Port=Port}) +self.port=Port or 5002 +self:T(string.format("SRS port=%s",self:GetPort())) +return self +end +function MSRS:GetPort() +return self.port +end +function MSRS:SetCoalition(Coalition) +self:F({Coalition=Coalition}) +self.coalition=Coalition or 0 +return self +end +function MSRS:GetCoalition() +return self.coalition +end +function MSRS:SetFrequencies(Frequencies) +self:F(Frequencies) +self.frequencies=UTILS.EnsureTable(Frequencies,false) +return self +end +function MSRS:AddFrequencies(Frequencies) +self:F(Frequencies) +for _,_freq in pairs(UTILS.EnsureTable(Frequencies,false))do +self:T(self.lid..string.format("Adding frequency %s",tostring(_freq))) +table.insert(self.frequencies,_freq) +end +return self +end +function MSRS:GetFrequencies() +return self.frequencies +end +function MSRS:SetModulations(Modulations) +self:F(Modulations) +self.modulations=UTILS.EnsureTable(Modulations,false) +self:T(self.lid.."Modulations:") +self:T(self.modulations) +return self +end +function MSRS:AddModulations(Modulations) +self:F(Modulations) +for _,_mod in pairs(UTILS.EnsureTable(Modulations,false))do +table.insert(self.modulations,_mod) +end +return self +end +function MSRS:GetModulations() +return self.modulations +end +function MSRS:SetGender(Gender) +self:F({Gender=Gender}) +Gender=Gender or"female" +self.gender=Gender:lower() +self:T("Setting gender to "..tostring(self.gender)) +return self +end +function MSRS:SetCulture(Culture) +self:F({Culture=Culture}) +self.culture=Culture +return self +end +function MSRS:SetVoice(Voice) +self:F({Voice=Voice}) +self.voice=Voice +return self +end +function MSRS:SetVoiceProvider(Voice,Provider) +self:F({Voice=Voice,Provider=Provider}) +self.poptions=self.poptions or{} +self.poptions[Provider or self:GetProvider()].voice=Voice +return self +end +function MSRS:SetVoiceWindows(Voice) +self:F({Voice=Voice}) +self:SetVoiceProvider(Voice or"Microsoft Hazel Desktop",MSRS.Provider.WINDOWS) +return self +end +function MSRS:SetVoiceGoogle(Voice) +self:F({Voice=Voice}) +self:SetVoiceProvider(Voice or MSRS.Voices.Google.Standard.en_GB_Standard_A,MSRS.Provider.GOOGLE) +return self +end +function MSRS:SetVoiceAzure(Voice) +self:F({Voice=Voice}) +self:SetVoiceProvider(Voice or"en-US-AriaNeural",MSRS.Provider.AZURE) +return self +end +function MSRS:SetVoiceAmazon(Voice) +self:F({Voice=Voice}) +self:SetVoiceProvider(Voice or"Brian",MSRS.Provider.AMAZON) +return self +end +function MSRS:GetVoice(Provider) +Provider=Provider or self.provider +if Provider and self.poptions[Provider]and self.poptions[Provider].voice then +return self.poptions[Provider].voice +else +return self.voice +end +end +function MSRS:SetCoordinate(Coordinate) +self:F(Coordinate) +self.coordinate=Coordinate +return self +end +function MSRS:SetGoogle(PathToCredentials) +self:F({PathToCredentials=PathToCredentials}) +if PathToCredentials then +self.provider=MSRS.Provider.GOOGLE +self:SetProviderOptionsGoogle(PathToCredentials,PathToCredentials) +end +return self +end +function MSRS:SetGoogleAPIKey(APIKey) +self:F({APIKey=APIKey}) +if APIKey then +self.provider=MSRS.Provider.GOOGLE +if self.poptions[MSRS.Provider.GOOGLE]then +self.poptions[MSRS.Provider.GOOGLE].key=APIKey +else +self:SetProviderOptionsGoogle(nil,APIKey) +end +end +return self +end +function MSRS:SetProvider(Provider) +BASE:F({Provider=Provider}) +if self then +self.provider=Provider or MSRS.Provider.WINDOWS +return self +else +MSRS.provider=Provider or MSRS.Provider.WINDOWS +end +return +end +function MSRS:GetProvider() +return self.provider or MSRS.Provider.WINDOWS +end +function MSRS:SetProviderOptions(Provider,CredentialsFile,AccessKey,SecretKey,Region) +BASE:F({Provider,CredentialsFile,AccessKey,SecretKey,Region}) +local option=MSRS._CreateProviderOptions(Provider,CredentialsFile,AccessKey,SecretKey,Region) +if self then +self.poptions=self.poptions or{} +self.poptions[Provider]=option +else +MSRS.poptions=MSRS.poptions or{} +MSRS.poptions[Provider]=option +end +return option +end +function MSRS._CreateProviderOptions(Provider,CredentialsFile,AccessKey,SecretKey,Region) +BASE:F({Provider,CredentialsFile,AccessKey,SecretKey,Region}) +local option={} +option.provider=Provider +option.credentials=CredentialsFile +option.key=AccessKey +option.secret=SecretKey +option.region=Region +return option +end +function MSRS:SetProviderOptionsGoogle(CredentialsFile,AccessKey) +self:F({CredentialsFile,AccessKey}) +self:SetProviderOptions(MSRS.Provider.GOOGLE,CredentialsFile,AccessKey) +return self +end +function MSRS:SetProviderOptionsAmazon(AccessKey,SecretKey,Region) +self:F({AccessKey,SecretKey,Region}) +self:SetProviderOptions(MSRS.Provider.AMAZON,nil,AccessKey,SecretKey,Region) +return self +end +function MSRS:SetProviderOptionsAzure(AccessKey,Region) +self:F({AccessKey,Region}) +self:SetProviderOptions(MSRS.Provider.AZURE,nil,AccessKey,nil,Region) +return self +end +function MSRS:GetProviderOptions(Provider) +return self.poptions[Provider or self.provider]or{} +end +function MSRS:SetTTSProviderGoogle() +self:F() +self:SetProvider(MSRS.Provider.GOOGLE) +return self +end +function MSRS:SetTTSProviderMicrosoft() +self:F() +self:SetProvider(MSRS.Provider.WINDOWS) +return self +end +function MSRS:SetTTSProviderAzure() +self:F() +self:SetProvider(MSRS.Provider.AZURE) +return self +end +function MSRS:SetTTSProviderAmazon() +self:F() +self:SetProvider(MSRS.Provider.AMAZON) +return self +end +function MSRS:Help() +self:F() +local path=self:GetPath() +local exe="DCS-SR-ExternalAudio.exe" +local filename=os.getenv('TMP').."\\MSRS-help-"..MSRS.uuid()..".txt" +local command=string.format("%s/%s --help > %s",path,exe,filename) +os.execute(command) +local f=assert(io.open(filename,"rb")) +local data=f:read("*all") +f:close() +env.info("SRS help output:") +env.info("======================================================================") +env.info(data) +env.info("======================================================================") +return self +end +function MSRS:PlaySoundFile(Soundfile,Delay) +self:F({Soundfile,Delay}) +local soundfile=Soundfile:GetName() +local exists=UTILS.FileExists(soundfile) +if not exists then +self:E("ERROR: MSRS sound file does not exist! File="..soundfile) +return self +end +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MSRS.PlaySoundFile,self,Soundfile,0) +else +local command=self:_GetCommand() +command=command..' --file="'..tostring(soundfile)..'"' +command=string.gsub(command,"--ssml","-h") +self:_ExecCommand(command) +end +return self +end +function MSRS:PlaySoundText(SoundText,Delay) +self:F({SoundText,Delay}) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MSRS.PlaySoundText,self,SoundText,0) +else +if self.backend==MSRS.Backend.GRPC then +self:_DCSgRPCtts(SoundText.text,nil,SoundText.gender,SoundText.culture,SoundText.voice,SoundText.volume,SoundText.label,SoundText.coordinate) +else +local command=self:_GetCommand(nil,nil,nil,SoundText.gender,SoundText.voice,SoundText.culture,SoundText.volume,SoundText.speed) +command=command..string.format(" --text=\"%s\"",tostring(SoundText.text)) +self:_ExecCommand(command) +end +end +return self +end +function MSRS:PlayText(Text,Delay,Coordinate) +self:F({Text,Delay,Coordinate}) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MSRS.PlayText,self,Text,nil,Coordinate) +else +if self.backend==MSRS.Backend.GRPC then +self:T(self.lid.."Transmitting") +self:_DCSgRPCtts(Text,nil,nil,nil,nil,nil,nil,Coordinate) +else +self:PlayTextExt(Text,Delay,nil,nil,nil,nil,nil,nil,nil,Coordinate) +end +end +return self +end +function MSRS:PlayTextExt(Text,Delay,Frequencies,Modulations,Gender,Culture,Voice,Volume,Label,Coordinate) +self:T({Text,Delay,Frequencies,Modulations,Gender,Culture,Voice,Volume,Label,Coordinate}) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,self.PlayTextExt,self,Text,0,Frequencies,Modulations,Gender,Culture,Voice,Volume,Label,Coordinate) +else +Frequencies=Frequencies or self:GetFrequencies() +Modulations=Modulations or self:GetModulations() +if self.backend==MSRS.Backend.SRSEXE then +local command=self:_GetCommand(UTILS.EnsureTable(Frequencies,false),UTILS.EnsureTable(Modulations,false),nil,Gender,Voice,Culture,Volume,nil,nil,Label,Coordinate) +command=command..string.format(" --text=\"%s\"",tostring(Text)) +self:_ExecCommand(command) +elseif self.backend==MSRS.Backend.GRPC then +self:_DCSgRPCtts(Text,Frequencies,Gender,Culture,Voice,Volume,Label,Coordinate) +end +end +return self +end +function MSRS:PlayTextFile(TextFile,Delay) +self:F({TextFile,Delay}) +if Delay and Delay>0 then +self:ScheduleOnce(Delay,MSRS.PlayTextFile,self,TextFile,0) +else +local exists=UTILS.FileExists(TextFile) +if not exists then +self:E("ERROR: MSRS Text file does not exist! File="..tostring(TextFile)) +return self +end +local command=self:_GetCommand() +command=command..string.format(" --textFile=\"%s\"",tostring(TextFile)) +self:T(string.format("MSRS TextFile command=%s",command)) +local l=string.len(command) +self:T(string.format("Command length=%d",l)) +self:_ExecCommand(command) +end +return self +end +function MSRS:_GetLatLongAlt(Coordinate) +self:F({Coordinate=Coordinate}) +local lat=0.0 +local lon=0.0 +local alt=0.0 +if Coordinate then +lat,lon,alt=coord.LOtoLL(Coordinate) +end +return lat,lon,math.floor(alt) +end +function MSRS:_GetCommand(freqs,modus,coal,gender,voice,culture,volume,speed,port,label,coordinate) +self:F({freqs,modus,coal,gender,voice,culture,volume,speed,port,label,coordinate}) +local path=self:GetPath() +local exe="DCS-SR-ExternalAudio.exe" +local fullPath=string.format("%s\\%s",path,exe) +freqs=table.concat(freqs or self.frequencies,",") +modus=table.concat(modus or self.modulations,",") +coal=coal or self.coalition +gender=gender or self.gender +voice=voice or self:GetVoice(self.provider)or self.voice +culture=culture or self.culture +volume=volume or self.volume +speed=speed or self.speed +port=port or self.port +label=label or self.Label +coordinate=coordinate or self.coordinate +modus=modus:gsub("0","AM") +modus=modus:gsub("1","FM") +local pwsh=string.format('Start-Process -WindowStyle Hidden -WorkingDirectory \"%s\" -FilePath \"%s\" -ArgumentList \'-f "%s" -m "%s" -c %s -p %s -n "%s" -v "%.1f"',path,exe,freqs,modus,coal,port,label,volume) +local command=string.format('"%s\\%s" -f "%s" -m "%s" -c %s -p %s -n "%s" -v "%.1f"',path,exe,freqs,modus,coal,port,label,volume) +if voice and self.UsePowerShell~=true then +command=command..string.format(" --voice=\"%s\"",tostring(voice)) +pwsh=pwsh..string.format(" --voice=\"%s\"",tostring(voice)) +else +if gender and gender~="female"then +command=command..string.format(" -g %s",tostring(gender)) +pwsh=pwsh..string.format(" -g %s",tostring(gender)) +end +if culture and culture~="en-GB"then +command=command..string.format(" -l %s",tostring(culture)) +pwsh=pwsh..string.format(" -l %s",tostring(culture)) +end +end +if coordinate then +local lat,lon,alt=self:_GetLatLongAlt(coordinate) +command=command..string.format(" -L %.4f -O %.4f -A %d",lat,lon,alt) +pwsh=pwsh..string.format(" -L %.4f -O %.4f -A %d",lat,lon,alt) +end +if self.provider==MSRS.Provider.GOOGLE then +local pops=self:GetProviderOptions() +command=command..string.format(' --ssml -G "%s"',pops.credentials) +pwsh=pwsh..string.format(' --ssml -G "%s"',pops.credentials) +elseif self.provider==MSRS.Provider.WINDOWS then +else +self:E("ERROR: SRS only supports WINDOWS and GOOGLE as TTS providers! Use DCS-gRPC backend for other providers such as AWS and Azure.") +end +if not UTILS.FileExists(fullPath)then +self:E("ERROR: MSRS SRS executable does not exist! FullPath="..fullPath) +command="CommandNotFound" +end +self:T("MSRS command from _GetCommand="..command) +if self.UsePowerShell==true then +return pwsh +else +return command +end +end +function MSRS:_ExecCommand(command) +self:T2({command=command}) +if string.find(command,"CommandNotFound")then return 0 end +local batContent=command.." && exit" +local filename=os.getenv('TMP').."\\MSRS-"..MSRS.uuid()..".bat" +if self.UsePowerShell==true then +filename=os.getenv('TMP').."\\MSRS-"..MSRS.uuid()..".ps1" +batContent=command.."\'" +self:T({batContent=batContent}) +end +local script=io.open(filename,"w+") +script:write(batContent) +script:close() +self:T("MSRS batch file created: "..filename) +self:T("MSRS batch content: "..batContent) +local res=nil +if self.UsePowerShell~=true then +local filenvbs=os.getenv('TMP').."\\MSRS-"..MSRS.uuid()..".vbs" +local script=io.open(filenvbs,"w+") +script:write(string.format('Dim WinScriptHost\n')) +script:write(string.format('Set WinScriptHost = CreateObject("WScript.Shell")\n')) +script:write(string.format('WinScriptHost.Run Chr(34) & "%s" & Chr(34), 0\n',filename)) +script:write(string.format('Set WinScriptHost = Nothing')) +script:close() +self:T("MSRS vbs file created to start batch="..filenvbs) +local runvbs=string.format('cscript.exe //Nologo //B "%s"',filenvbs) +self:T("MSRS execute VBS command="..runvbs) +res=os.execute(runvbs) +timer.scheduleFunction(os.remove,filename,timer.getTime()+1) +timer.scheduleFunction(os.remove,filenvbs,timer.getTime()+1) +self:T("MSRS vbs and batch file removed") +elseif self.UsePowerShell==true then +local pwsh=string.format('start /min "" powershell.exe -ExecutionPolicy Unrestricted -WindowStyle Hidden -Command "%s"',filename) +if string.len(pwsh)>255 then +self:E("[MSRS] - pwsh string too long") +end +res=os.execute(pwsh) +timer.scheduleFunction(os.remove,filename,timer.getTime()+1) +else +command=string.format('start /b "" "%s"',filename) +self:T("MSRS execute command="..command) +res=os.execute(command) +timer.scheduleFunction(os.remove,filename,timer.getTime()+1) +end +return res +end +function MSRS:_DCSgRPCtts(Text,Frequencies,Gender,Culture,Voice,Volume,Label,Coordinate) +self:T("MSRS_BACKEND_DCSGRPC:_DCSgRPCtts()") +self:T({Text,Frequencies,Gender,Culture,Voice,Volume,Label,Coordinate}) +local options={} +local ssml=Text or'' +Frequencies=UTILS.EnsureTable(Frequencies,true)or self:GetFrequencies() +options.plaintext=Text +options.srsClientName=Label or self.Label +if self.coordinate then +options.position={} +options.position.lat,options.position.lon,options.position.alt=self:_GetLatLongAlt(self.coordinate) +end +options.coalition=UTILS.GetCoalitionName(self.coalition):lower() +local provider=self.provider or MSRS.Provider.WINDOWS +options.provider={} +options.provider[provider]=self:GetProviderOptions(provider) +Voice=Voice or self:GetVoice(self.provider)or self.voice +if Voice then +options.provider[provider].voice=Voice +else +local preTag,genderProp,langProp,postTag='','','','' +local gender="" +if self.gender then +gender=string.format(' gender=\"%s\"',self.gender) +end +local language="" +if self.culture then +language=string.format(' language=\"%s\"',self.culture) +end +if self.gender or self.culture then +ssml=string.format("<voice%s%s>%s</voice>",gender,language,Text) +end +end +for _,freq in pairs(Frequencies)do +self:T("Calling GRPC.tts with the following parameter:") +self:T({ssml=ssml,freq=freq,options=options}) +self:T(options.provider[provider]) +GRPC.tts(ssml,freq*1e6,options) +end +end +function MSRS:LoadConfigFile(Path,Filename) +if lfs==nil then +env.info("*****Note - lfs and os need to be desanitized for MSRS to work!") +return false +end +local path=Path or lfs.writedir()..MSRS.ConfigFilePath +local file=Filename or MSRS.ConfigFileName or"Moose_MSRS.lua" +local pathandfile=path..file +local filexsists=UTILS.FileExists(pathandfile) +if filexsists and not MSRS.ConfigLoaded then +env.info("FF reading config file") +assert(loadfile(path..file))() +if MSRS_Config then +local Self=self or MSRS +Self.path=MSRS_Config.Path or"C:\\Program Files\\DCS-SimpleRadio-Standalone\\ExternalAudio" +Self.port=MSRS_Config.Port or 5002 +Self.backend=MSRS_Config.Backend or MSRS.Backend.SRSEXE +Self.frequencies=MSRS_Config.Frequency or{127,243} +Self.modulations=MSRS_Config.Modulation or{0,0} +Self.coalition=MSRS_Config.Coalition or 0 +if MSRS_Config.Coordinate then +Self.coordinate=COORDINATE:New(MSRS_Config.Coordinate[1],MSRS_Config.Coordinate[2],MSRS_Config.Coordinate[3]) +end +Self.culture=MSRS_Config.Culture or"en-GB" +Self.gender=MSRS_Config.Gender or"male" +Self.Label=MSRS_Config.Label or"MSRS" +Self.voice=MSRS_Config.Voice +Self.provider=MSRS_Config.Provider or MSRS.Provider.WINDOWS +for _,provider in pairs(MSRS.Provider)do +if MSRS_Config[provider]then +Self.poptions[provider]=MSRS_Config[provider] +end +end +Self.ConfigLoaded=true +end +env.info("MSRS - Successfully loaded default configuration from disk!",false) +end +if not filexsists then +env.info("MSRS - Cannot find default configuration file!",false) +return false +end +return true +end +function MSRS.getSpeechTime(length,speed,isGoogle) +local maxRateRatio=3 +speed=speed or 1.0 +isGoogle=isGoogle or false +local speedFactor=1.0 +if isGoogle then +speedFactor=speed +else +if speed~=0 then +speedFactor=math.abs(speed)*(maxRateRatio-1)/10+1 +end +if speed<0 then +speedFactor=1/speedFactor +end +end +local wpm=math.ceil(100*speedFactor) +local cps=math.floor((wpm*5)/60) +if type(length)=="string"then +length=string.len(length) +end +return length/cps +end +MSRSQUEUE={ +ClassName="MSRSQUEUE", +Debugmode=nil, +lid=nil, +queue={}, +alias=nil, +dt=nil, +Tlast=nil, +checking=nil, +} +function MSRSQUEUE:New(alias) +local self=BASE:Inherit(self,BASE:New()) +self.alias=alias or"My Radio" +self.dt=1.0 +self.lid=string.format("MSRSQUEUE %s | ",self.alias) +return self +end +function MSRSQUEUE:Clear() +self:T(self.lid.."Clearing MSRSQUEUE") +self.queue={} +return self +end +function MSRSQUEUE:AddTransmission(transmission) +transmission.isplaying=false +transmission.Tstarted=nil +table.insert(self.queue,transmission) +if not self.checking then +self:_CheckRadioQueue() +end +return self +end +function MSRSQUEUE:SetTransmitOnlyWithPlayers(Switch) +self.TransmitOnlyWithPlayers=Switch +if Switch==false or Switch==nil then +if self.PlayerSet then +self.PlayerSet:FilterStop() +end +self.PlayerSet=nil +else +self.PlayerSet=SET_CLIENT:New():FilterStart() +end +return self +end +function MSRSQUEUE:NewTransmission(text,duration,msrs,tstart,interval,subgroups,subtitle,subduration,frequency,modulation,gender,culture,voice,volume,label,coordinate) +self:T({Text=text,Dur=duration,start=tstart,int=interval,sub=subgroups,subt=subtitle,sudb=subduration,F=frequency,M=modulation,G=gender,C=culture,V=voice,Vol=volume,L=label}) +if self.TransmitOnlyWithPlayers then +if self.PlayerSet and self.PlayerSet:CountAlive()==0 then +return self +end +end +if not text then +self:E(self.lid.."ERROR: No text specified.") +return nil +end +if type(text)~="string"then +self:E(self.lid.."ERROR: Text specified is NOT a string.") +return nil +end +local transmission={} +transmission.text=text +transmission.duration=duration or MSRS.getSpeechTime(text) +transmission.msrs=msrs +transmission.Tplay=tstart or timer.getAbsTime() +transmission.subtitle=subtitle +transmission.interval=interval or 0 +transmission.frequency=frequency or msrs.frequencies +transmission.modulation=modulation or msrs.modulations +transmission.subgroups=subgroups +if transmission.subtitle then +transmission.subduration=subduration or transmission.duration +else +transmission.subduration=0 +end +transmission.gender=gender or msrs.gender +transmission.culture=culture or msrs.culture +transmission.voice=voice or msrs.voice +transmission.volume=volume or msrs.volume +transmission.label=label or msrs.Label +transmission.coordinate=coordinate or msrs.coordinate +self:AddTransmission(transmission) +return transmission +end +function MSRSQUEUE:Broadcast(transmission) +self:T(self.lid.."Broadcast") +if transmission.frequency then +transmission.msrs:PlayTextExt(transmission.text,nil,transmission.frequency,transmission.modulation,transmission.gender,transmission.culture,transmission.voice,transmission.volume,transmission.label,transmission.coordinate) +else +transmission.msrs:PlayText(transmission.text,nil,transmission.coordinate) +end +local function texttogroup(gid) +trigger.action.outTextForGroup(gid,transmission.subtitle,transmission.subduration,true) +end +if transmission.subgroups and#transmission.subgroups>0 then +for _,_group in pairs(transmission.subgroups)do +local group=_group +if group and group:IsAlive()then +local gid=group:GetID() +self:ScheduleOnce(4,texttogroup,gid) +end +end +end +end +function MSRSQUEUE:CalcTransmisstionDuration() +local Tnow=timer.getAbsTime() +local T=0 +for _,_transmission in pairs(self.queue)do +local transmission=_transmission +if transmission.isplaying then +local dt=Tnow-transmission.Tstarted +T=T+transmission.duration-dt +else +T=T+transmission.duration +end +end +return T +end +function MSRSQUEUE:_CheckRadioQueue(delay) +local N=#self.queue +self:T2(self.lid..string.format("Check radio queue %s: delay=%.3f sec, N=%d, checking=%s",self.alias,delay or 0,N,tostring(self.checking))) +if delay and delay>0 then +self:ScheduleOnce(delay,MSRSQUEUE._CheckRadioQueue,self) +self.checking=true +else +if N==0 then +self:T(self.lid..string.format("Check radio queue %s empty ==> disable checking",self.alias)) +self.checking=false +return +end +local time=timer.getAbsTime() +self.checking=true +local dt=self.dt +local playing=false +local next=nil +local remove=nil +for i,_transmission in ipairs(self.queue)do +local transmission=_transmission +if time>=transmission.Tplay then +if transmission.isplaying then +if time>=transmission.Tstarted+transmission.duration then +transmission.isplaying=false +remove=i +self.Tlast=time +else +playing=true +dt=transmission.duration-(time-transmission.Tstarted) +end +else +local Tlast=self.Tlast +if transmission.interval==nil then +if next==nil then +next=transmission +end +else +if Tlast==nil or time-Tlast>=transmission.interval then +next=transmission +else +end +end +if next or Tlast then +break +end +end +else +end +end +if next~=nil and not playing then +self:T(self.lid..string.format("Broadcasting text=\"%s\" at T=%.3f",next.text,time)) +self:Broadcast(next) +next.isplaying=true +next.Tstarted=time +dt=next.duration +end +if remove then +table.remove(self.queue,remove) +N=N-1 +if#self.queue==0 then +self:T(self.lid..string.format("Check radio queue %s empty ==> disable checking",self.alias)) +self.checking=false +return +end +end +self:_CheckRadioQueue(dt) +end +end +MSRS.LoadConfigFile() +COMMANDCENTER={ +ClassName="COMMANDCENTER", +CommandCenterName="", +CommandCenterCoalition=nil, +CommandCenterPositionable=nil, +Name="", +ReferencePoints={}, +ReferenceNames={}, +CommunicationMode="80", +} +COMMANDCENTER.AutoAssignMethods={ +["Random"]=1, +["Distance"]=2, +["Priority"]=3, +} +function COMMANDCENTER:New(CommandCenterPositionable,CommandCenterName) +local self=BASE:Inherit(self,BASE:New()) +self.CommandCenterPositionable=CommandCenterPositionable +self.CommandCenterName=CommandCenterName or CommandCenterPositionable:GetName() +self.CommandCenterCoalition=CommandCenterPositionable:GetCoalition() +self.Missions={} +self:SetAutoAssignTasks(false) +self:SetAutoAcceptTasks(true) +self:SetAutoAssignMethod(COMMANDCENTER.AutoAssignMethods.Distance) +self:SetFlashStatus(false) +self:SetMessageDuration(10) +self:HandleEvent(EVENTS.Birth, +function(self,EventData) +if EventData.IniObjectCategory==1 then +local EventGroup=GROUP:Find(EventData.IniDCSGroup) +if EventGroup and EventGroup:IsAlive()and self:HasGroup(EventGroup)then +local CommandCenterMenu=MENU_GROUP:New(EventGroup,self:GetText()) +local MenuReporting=MENU_GROUP:New(EventGroup,"Missions Reports",CommandCenterMenu) +local MenuMissionsSummary=MENU_GROUP_COMMAND:New(EventGroup,"Missions Status Report",MenuReporting,self.ReportSummary,self,EventGroup) +local MenuMissionsDetails=MENU_GROUP_COMMAND:New(EventGroup,"Missions Players Report",MenuReporting,self.ReportMissionsPlayers,self,EventGroup) +local PlayerUnit=EventData.IniUnit +for MissionID,Mission in pairs(self:GetMissions())do +local Mission=Mission +local PlayerGroup=EventData.IniGroup +Mission:JoinUnit(PlayerUnit,PlayerGroup) +end +self:SetMenu() +end +end +end +) +self:HandleEvent(EVENTS.MissionEnd, +function(self,EventData) +local PlayerUnit=EventData.IniUnit +for MissionID,Mission in pairs(self:GetMissions())do +local Mission=Mission +Mission:Stop() +end +end +) +self:HandleEvent(EVENTS.PlayerLeaveUnit, +function(self,EventData) +local PlayerUnit=EventData.IniUnit +for MissionID,Mission in pairs(self:GetMissions())do +local Mission=Mission +if Mission:IsENGAGED()then +Mission:AbortUnit(PlayerUnit) +end +end +end +) +self:HandleEvent(EVENTS.Crash, +function(self,EventData) +local PlayerUnit=EventData.IniUnit +for MissionID,Mission in pairs(self:GetMissions())do +local Mission=Mission +if Mission:IsENGAGED()then +Mission:CrashUnit(PlayerUnit) +end +end +end +) +self:SetMenu() +_SETTINGS:SetSystemMenu(CommandCenterPositionable) +self:SetCommandMenu() +return self +end +function COMMANDCENTER:GetName() +return self.CommandCenterName +end +function COMMANDCENTER:GetText() +return"Command Center ["..self.CommandCenterName.."]" +end +function COMMANDCENTER:GetShortText() +return"CC ["..self.CommandCenterName.."]" +end +function COMMANDCENTER:GetCoalition() +return self.CommandCenterCoalition +end +function COMMANDCENTER:GetPositionable() +return self.CommandCenterPositionable +end +function COMMANDCENTER:GetMissions() +return self.Missions or{} +end +function COMMANDCENTER:AddMission(Mission) +self.Missions[Mission]=Mission +return Mission +end +function COMMANDCENTER:RemoveMission(Mission) +self.Missions[Mission]=nil +return Mission +end +function COMMANDCENTER:SetReferenceZones(ReferenceZonePrefix) +local MatchPattern="(.*)#(.*)" +self:F({MatchPattern=MatchPattern}) +for ReferenceZoneName in pairs(_DATABASE.ZONENAMES)do +local ZoneName,ReferenceName=string.match(ReferenceZoneName,MatchPattern) +self:F({ZoneName=ZoneName,ReferenceName=ReferenceName}) +if ZoneName and ReferenceName and ZoneName==ReferenceZonePrefix then +self.ReferencePoints[ReferenceZoneName]=ZONE:New(ReferenceZoneName) +self.ReferenceNames[ReferenceZoneName]=ReferenceName +end +end +return self +end +function COMMANDCENTER:SetModeWWII() +self.CommunicationMode="WWII" +return self +end +function COMMANDCENTER:IsModeWWII() +return self.CommunicationMode=="WWII" +end +function COMMANDCENTER:SetMenu() +self:F2() +local MenuTime=timer.getTime() +for MissionID,Mission in pairs(self:GetMissions()or{})do +local Mission=Mission +Mission:SetMenu(MenuTime) +end +for MissionID,Mission in pairs(self:GetMissions()or{})do +Mission=Mission +Mission:RemoveMenu(MenuTime) +end +end +function COMMANDCENTER:GetMenu(TaskGroup) +local MenuTime=timer.getTime() +self.CommandCenterMenus=self.CommandCenterMenus or{} +local CommandCenterMenu +local CommandCenterText=self:GetText() +CommandCenterMenu=MENU_GROUP:New(TaskGroup,CommandCenterText):SetTime(MenuTime) +self.CommandCenterMenus[TaskGroup]=CommandCenterMenu +if self.AutoAssignTasks==false then +local AssignTaskMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Assign Task",CommandCenterMenu,self.AssignTask,self,TaskGroup):SetTime(MenuTime):SetTag("AutoTask") +end +CommandCenterMenu:Remove(MenuTime,"AutoTask") +return self.CommandCenterMenus[TaskGroup] +end +function COMMANDCENTER:AssignTask(TaskGroup) +local Tasks={} +local AssignPriority=99999999 +local AutoAssignMethod=self.AutoAssignMethod +for MissionID,Mission in pairs(self:GetMissions())do +local Mission=Mission +local MissionTasks=Mission:GetGroupTasks(TaskGroup) +for MissionTaskName,MissionTask in pairs(MissionTasks or{})do +local MissionTask=MissionTask +if MissionTask:IsStatePlanned()or MissionTask:IsStateReplanned()or MissionTask:IsStateAssigned()then +local TaskPriority=MissionTask:GetAutoAssignPriority(self.AutoAssignMethod,self,TaskGroup) +if TaskPriority<AssignPriority then +AssignPriority=TaskPriority +Tasks={} +end +if TaskPriority==AssignPriority then +Tasks[#Tasks+1]=MissionTask +end +end +end +end +local Task=Tasks[math.random(1,#Tasks)] +if Task then +self:T("Assigning task "..Task:GetName().." using auto assign method "..self.AutoAssignMethod.." to "..TaskGroup:GetName().." with task priority "..AssignPriority) +if not self.AutoAcceptTasks==true then +Task:SetAutoAssignMethod(ACT_ASSIGN_MENU_ACCEPT:New(Task.TaskBriefing)) +end +Task:AssignToGroup(TaskGroup) +end +end +function COMMANDCENTER:SetCommandMenu() +local MenuTime=timer.getTime() +if self.CommandCenterPositionable and self.CommandCenterPositionable:IsInstanceOf(GROUP)then +local CommandCenterText=self:GetText() +local CommandCenterMenu=MENU_GROUP:New(self.CommandCenterPositionable,CommandCenterText):SetTime(MenuTime) +if self.AutoAssignTasks==false then +local AutoAssignTaskMenu=MENU_GROUP_COMMAND:New(self.CommandCenterPositionable,"Assign Task On",CommandCenterMenu,self.SetAutoAssignTasks,self,true):SetTime(MenuTime):SetTag("AutoTask") +else +local AutoAssignTaskMenu=MENU_GROUP_COMMAND:New(self.CommandCenterPositionable,"Assign Task Off",CommandCenterMenu,self.SetAutoAssignTasks,self,false):SetTime(MenuTime):SetTag("AutoTask") +end +CommandCenterMenu:Remove(MenuTime,"AutoTask") +end +end +function COMMANDCENTER:SetAutoAssignTasks(AutoAssign) +self.AutoAssignTasks=AutoAssign or false +if self.AutoAssignTasks==true then +self.autoAssignTasksScheduleID=self:ScheduleRepeat(10,30,0,nil,self.AssignTasks,self) +else +self:ScheduleStop() +end +end +function COMMANDCENTER:SetAutoAcceptTasks(AutoAccept) +self.AutoAcceptTasks=AutoAccept or false +end +function COMMANDCENTER:SetAutoAssignMethod(AutoAssignMethod) +self.AutoAssignMethod=AutoAssignMethod or COMMANDCENTER.AutoAssignMethods.Random +end +function COMMANDCENTER:AssignTasks() +local GroupSet=self:AddGroups() +for GroupID,TaskGroup in pairs(GroupSet:GetSet())do +local TaskGroup=TaskGroup +if TaskGroup:IsAlive()then +self:GetMenu(TaskGroup) +if self:IsGroupAssigned(TaskGroup)then +else +if TaskGroup:IsAir()then +self:AssignTask(TaskGroup) +end +end +end +end +end +function COMMANDCENTER:AddGroups() +local GroupSet=SET_GROUP:New() +for MissionID,Mission in pairs(self.Missions)do +local Mission=Mission +GroupSet=Mission:AddGroups(GroupSet) +end +return GroupSet +end +function COMMANDCENTER:IsGroupAssigned(TaskGroup) +local Assigned=false +for MissionID,Mission in pairs(self.Missions)do +local Mission=Mission +if Mission:IsGroupAssigned(TaskGroup)then +Assigned=true +break +end +end +return Assigned +end +function COMMANDCENTER:HasGroup(MissionGroup) +local Has=false +for MissionID,Mission in pairs(self.Missions)do +local Mission=Mission +if Mission:HasGroup(MissionGroup)then +Has=true +break +end +end +return Has +end +function COMMANDCENTER:MessageToAll(Message) +self:GetPositionable():MessageToAll(Message,self.MessageDuration,self:GetName()) +end +function COMMANDCENTER:MessageToGroup(Message,MessageGroup) +self:GetPositionable():MessageToGroup(Message,self.MessageDuration,MessageGroup,self:GetShortText()) +end +function COMMANDCENTER:MessageTypeToGroup(Message,MessageGroup,MessageType) +self:GetPositionable():MessageTypeToGroup(Message,MessageType,MessageGroup,self:GetShortText()) +end +function COMMANDCENTER:MessageToCoalition(Message) +local CCCoalition=self:GetPositionable():GetCoalition() +self:GetPositionable():MessageToCoalition(Message,self.MessageDuration,CCCoalition,self:GetShortText()) +end +function COMMANDCENTER:MessageTypeToCoalition(Message,MessageType) +local CCCoalition=self:GetPositionable():GetCoalition() +self:GetPositionable():MessageTypeToCoalition(Message,MessageType,CCCoalition,self:GetShortText()) +end +function COMMANDCENTER:ReportSummary(ReportGroup) +self:F(ReportGroup) +local Report=REPORT:New() +local Name=self:GetName() +Report:Add(string.format('%s - Report Summary Missions',Name)) +for MissionID,Mission in pairs(self.Missions)do +local Mission=Mission +Report:Add(" - "..Mission:ReportSummary(ReportGroup)) +end +self:MessageToGroup(Report:Text(),ReportGroup) +end +function COMMANDCENTER:ReportMissionsPlayers(ReportGroup) +self:F(ReportGroup) +local Report=REPORT:New() +Report:Add("Players active in all missions.") +for MissionID,MissionData in pairs(self.Missions)do +local Mission=MissionData +Report:Add(" - "..Mission:ReportPlayersPerTask(ReportGroup)) +end +self:MessageToGroup(Report:Text(),ReportGroup) +end +function COMMANDCENTER:ReportDetails(ReportGroup,Task) +self:F(ReportGroup) +local Report=REPORT:New() +for MissionID,Mission in pairs(self.Missions)do +local Mission=Mission +Report:Add(" - "..Mission:ReportDetails()) +end +self:MessageToGroup(Report:Text(),ReportGroup) +end +function COMMANDCENTER:SetFlashStatus(Flash) +self:F() +self.FlashStatus=Flash and true +end +function COMMANDCENTER:SetMessageDuration(seconds) +self:F() +self.MessageDuration=10 or seconds +end +MISSION={ +ClassName="MISSION", +Name="", +MissionStatus="PENDING", +AssignedGroups={}, +} +function MISSION:New(CommandCenter,MissionName,MissionPriority,MissionBriefing,MissionCoalition) +local self=BASE:Inherit(self,FSM:New()) +self:T({MissionName,MissionPriority,MissionBriefing,MissionCoalition}) +self.CommandCenter=CommandCenter +CommandCenter:AddMission(self) +self.Name=MissionName +self.MissionPriority=MissionPriority +self.MissionBriefing=MissionBriefing +self.MissionCoalition=MissionCoalition +self.Tasks={} +self.TaskNumber=0 +self.PlayerNames={} +self:SetStartState("IDLE") +self:AddTransition("IDLE","Start","ENGAGED") +self:AddTransition("ENGAGED","Stop","IDLE") +self:AddTransition("ENGAGED","Complete","COMPLETED") +self:AddTransition("*","Fail","FAILED") +self:AddTransition("*","MissionGoals","*") +CommandCenter:SetMenu() +return self +end +function MISSION:onenterCOMPLETED(From,Event,To) +self:GetCommandCenter():MessageTypeToCoalition(self:GetText().." has been completed! Good job guys!",MESSAGE.Type.Information) +end +function MISSION:GetName() +return self.Name +end +function MISSION:GetText() +return string.format('Mission "%s (%s)"',self.Name,self.MissionPriority) +end +function MISSION:GetShortText() +return string.format('Mission "%s"',self.Name) +end +function MISSION:JoinUnit(PlayerUnit,PlayerGroup) +self:T({Mission=self:GetName(),PlayerUnit=PlayerUnit,PlayerGroup=PlayerGroup}) +local PlayerUnitAdded=false +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +if Task:JoinUnit(PlayerUnit,PlayerGroup)then +PlayerUnitAdded=true +end +end +return PlayerUnitAdded +end +function MISSION:AbortUnit(PlayerUnit) +self:F({PlayerUnit=PlayerUnit}) +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local PlayerGroup=PlayerUnit:GetGroup() +Task:AbortGroup(PlayerGroup) +end +return self +end +function MISSION:CrashUnit(PlayerUnit) +self:F({PlayerUnit=PlayerUnit}) +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local PlayerGroup=PlayerUnit:GetGroup() +Task:CrashGroup(PlayerGroup) +end +return self +end +function MISSION:AddScoring(Scoring) +self.Scoring=Scoring +return self +end +function MISSION:GetScoring() +return self.Scoring +end +function MISSION:GetGroups() +return self:AddGroups() +end +function MISSION:AddGroups(GroupSet) +GroupSet=GroupSet or SET_GROUP:New() +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +GroupSet=Task:AddGroups(GroupSet) +end +return GroupSet +end +function MISSION:SetMenu(MenuTime) +self:F({self:GetName(),MenuTime}) +local MenuCount={} +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local TaskType=Task:GetType() +MenuCount[TaskType]=MenuCount[TaskType]or 1 +if MenuCount[TaskType]<=10 then +Task:SetMenu(MenuTime) +MenuCount[TaskType]=MenuCount[TaskType]+1 +end +end +end +function MISSION:RemoveMenu(MenuTime) +self:F({self:GetName(),MenuTime}) +for _,Task in pairs(self:GetTasks())do +local Task=Task +Task:RemoveMenu(MenuTime) +end +end +do +function MISSION:IsGroupAssigned(MissionGroup) +local MissionGroupName=MissionGroup:GetName() +if self.AssignedGroups[MissionGroupName]==MissionGroup then +self:T2({"Mission is assigned to:",MissionGroup:GetName()}) +return true +end +self:T2({"Mission is not assigned to:",MissionGroup:GetName()}) +return false +end +function MISSION:SetGroupAssigned(MissionGroup) +local MissionName=self:GetName() +local MissionGroupName=MissionGroup:GetName() +self.AssignedGroups[MissionGroupName]=MissionGroup +self:T(string.format("Mission %s is assigned to %s",MissionName,MissionGroupName)) +return self +end +function MISSION:ClearGroupAssignment(MissionGroup) +local MissionName=self:GetName() +local MissionGroupName=MissionGroup:GetName() +self.AssignedGroups[MissionGroupName]=nil +return self +end +end +function MISSION:GetCommandCenter() +return self.CommandCenter +end +function MISSION:RemoveTaskMenu(Task) +Task:RemoveMenu() +end +function MISSION:GetRootMenu(TaskGroup) +local CommandCenter=self:GetCommandCenter() +local CommandCenterMenu=CommandCenter:GetMenu(TaskGroup) +local MissionName=self:GetText() +self.MissionMenu=MENU_COALITION:New(self.MissionCoalition,MissionName,CommandCenterMenu) +return self.MissionMenu +end +function MISSION:GetMenu(TaskGroup) +local CommandCenter=self:GetCommandCenter() +local CommandCenterMenu=CommandCenter:GetMenu(TaskGroup) +self.MissionGroupMenu=self.MissionGroupMenu or{} +self.MissionGroupMenu[TaskGroup]=self.MissionGroupMenu[TaskGroup]or{} +local GroupMenu=self.MissionGroupMenu[TaskGroup] +local MissionText=self:GetText() +self.MissionMenu=MENU_GROUP:New(TaskGroup,MissionText,CommandCenterMenu) +GroupMenu.BriefingMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Mission Briefing",self.MissionMenu,self.MenuReportBriefing,self,TaskGroup) +GroupMenu.MarkTasks=MENU_GROUP_COMMAND:New(TaskGroup,"Mark Task Locations on Map",self.MissionMenu,self.MarkTargetLocations,self,TaskGroup) +GroupMenu.TaskReportsMenu=MENU_GROUP:New(TaskGroup,"Task Reports",self.MissionMenu) +GroupMenu.ReportTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Tasks Summary",GroupMenu.TaskReportsMenu,self.MenuReportTasksSummary,self,TaskGroup) +GroupMenu.ReportPlannedTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Planned Tasks",GroupMenu.TaskReportsMenu,self.MenuReportTasksPerStatus,self,TaskGroup,"Planned") +GroupMenu.ReportAssignedTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Assigned Tasks",GroupMenu.TaskReportsMenu,self.MenuReportTasksPerStatus,self,TaskGroup,"Assigned") +GroupMenu.ReportSuccessTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Successful Tasks",GroupMenu.TaskReportsMenu,self.MenuReportTasksPerStatus,self,TaskGroup,"Success") +GroupMenu.ReportFailedTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Failed Tasks",GroupMenu.TaskReportsMenu,self.MenuReportTasksPerStatus,self,TaskGroup,"Failed") +GroupMenu.ReportHeldTasksMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Held Tasks",GroupMenu.TaskReportsMenu,self.MenuReportTasksPerStatus,self,TaskGroup,"Hold") +GroupMenu.PlayerReportsMenu=MENU_GROUP:New(TaskGroup,"Statistics Reports",self.MissionMenu) +GroupMenu.ReportMissionHistory=MENU_GROUP_COMMAND:New(TaskGroup,"Report Mission Progress",GroupMenu.PlayerReportsMenu,self.MenuReportPlayersProgress,self,TaskGroup) +GroupMenu.ReportPlayersPerTaskMenu=MENU_GROUP_COMMAND:New(TaskGroup,"Report Players per Task",GroupMenu.PlayerReportsMenu,self.MenuReportPlayersPerTask,self,TaskGroup) +return self.MissionMenu +end +function MISSION:GetTask(TaskName) +self:F({TaskName}) +return self.Tasks[TaskName] +end +function MISSION:GetNextTaskID(Task) +self.TaskNumber=self.TaskNumber+1 +return self.TaskNumber +end +function MISSION:AddTask(Task) +local TaskName=Task:GetTaskName() +self:T({"==> Adding TASK ",MissionName=self:GetName(),TaskName=TaskName}) +self.Tasks[TaskName]=Task +self:GetCommandCenter():SetMenu() +return Task +end +function MISSION:RemoveTask(Task) +local TaskName=Task:GetTaskName() +self:T({"<== Removing TASK ",MissionName=self:GetName(),TaskName=TaskName}) +self:F(TaskName) +self.Tasks[TaskName]=self.Tasks[TaskName]or{n=0} +self.Tasks[TaskName]=nil +Task=nil +collectgarbage() +self:GetCommandCenter():SetMenu() +return nil +end +function MISSION:IsCOMPLETED() +return self:Is("COMPLETED") +end +function MISSION:IsIDLE() +return self:Is("IDLE") +end +function MISSION:IsENGAGED() +return self:Is("ENGAGED") +end +function MISSION:IsFAILED() +return self:Is("FAILED") +end +function MISSION:IsHOLD() +return self:Is("HOLD") +end +function MISSION:HasGroup(TaskGroup) +local Has=false +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +if Task:HasGroup(TaskGroup)then +Has=true +break +end +end +return Has +end +function MISSION:GetTasksRemaining() +local TasksRemaining=0 +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +if Task:IsStateSuccess()or Task:IsStateFailed()then +else +TasksRemaining=TasksRemaining+1 +end +end +return TasksRemaining +end +function MISSION:GetTaskTypes() +local TaskTypeList={} +local TasksRemaining=0 +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local TaskType=Task:GetType() +TaskTypeList[TaskType]=TaskType +end +return TaskTypeList +end +function MISSION:AddPlayerName(PlayerName) +self.PlayerNames=self.PlayerNames or{} +self.PlayerNames[PlayerName]=PlayerName +return self +end +function MISSION:GetPlayerNames() +return self.PlayerNames +end +function MISSION:ReportBriefing() +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - Mission Briefing Report',Name,Status)) +Report:Add(self.MissionBriefing) +return Report:Text() +end +function MISSION:ReportPlayersPerTask(ReportGroup) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - Players per Task Report',Name,Status)) +local PlayerList={} +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local PlayerNames=Task:GetPlayerNames() +for PlayerName,PlayerGroup in pairs(PlayerNames)do +PlayerList[PlayerName]=Task:GetName() +end +end +for PlayerName,TaskName in pairs(PlayerList)do +Report:Add(string.format(' - Player (%s): Task "%s"',PlayerName,TaskName)) +end +return Report:Text() +end +function MISSION:ReportPlayersProgress(ReportGroup) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - Players per Task Progress Report',Name,Status)) +local PlayerList={} +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +local TaskName=Task:GetName() +local Goal=Task:GetGoal() +PlayerList[TaskName]=PlayerList[TaskName]or{} +if Goal then +local TotalContributions=Goal:GetTotalContributions() +local PlayerContributions=Goal:GetPlayerContributions() +self:F({TotalContributions=TotalContributions,PlayerContributions=PlayerContributions}) +for PlayerName,PlayerContribution in pairs(PlayerContributions)do +PlayerList[TaskName][PlayerName]=string.format('Player (%s): Task "%s": %d%%',PlayerName,TaskName,PlayerContributions[PlayerName]*100/TotalContributions) +end +else +PlayerList[TaskName]["_"]=string.format('Player (---): Task "%s": %d%%',TaskName,0) +end +end +for TaskName,TaskData in pairs(PlayerList)do +for PlayerName,TaskText in pairs(TaskData)do +Report:Add(string.format(' - %s',TaskText)) +end +end +return Report:Text() +end +function MISSION:MarkTargetLocations(ReportGroup) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - All Tasks are marked on the map. Select a Task from the Mission Menu and Join the Task!!!',Name,Status)) +for TaskID,Task in UTILS.spairs(self:GetTasks(),function(t,a,b)return t[a]:ReportOrder(ReportGroup)<t[b]:ReportOrder(ReportGroup)end)do +local Task=Task +Task:MenuMarkToGroup(ReportGroup) +end +return Report:Text() +end +function MISSION:ReportSummary(ReportGroup) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - Task Overview Report',Name,Status)) +for TaskID,Task in UTILS.spairs(self:GetTasks(),function(t,a,b)return t[a]:ReportOrder(ReportGroup)<t[b]:ReportOrder(ReportGroup)end)do +local Task=Task +Report:Add("- "..Task:ReportSummary(ReportGroup)) +end +return Report:Text() +end +function MISSION:ReportOverview(ReportGroup,TaskStatus) +self:F({TaskStatus=TaskStatus}) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - %s Tasks Report',Name,Status,TaskStatus)) +local Tasks=0 +for TaskID,Task in UTILS.spairs(self:GetTasks(),function(t,a,b)return t[a]:ReportOrder(ReportGroup)<t[b]:ReportOrder(ReportGroup)end)do +local Task=Task +if Task:Is(TaskStatus)then +Report:Add(string.rep("-",140)) +Report:Add(Task:ReportOverview(ReportGroup)) +end +Tasks=Tasks+1 +if Tasks>=8 then +break +end +end +return Report:Text() +end +function MISSION:ReportDetails(ReportGroup) +local Report=REPORT:New() +local Name=self:GetText() +local Status="<"..self:GetState()..">" +Report:Add(string.format('%s - %s - Task Detailed Report',Name,Status)) +local TasksRemaining=0 +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +Report:Add(string.rep("-",140)) +Report:Add(Task:ReportDetails(ReportGroup)) +end +return Report:Text() +end +function MISSION:GetTasks() +return self.Tasks or{} +end +function MISSION:GetGroupTasks(TaskGroup) +local Tasks={} +for TaskID,Task in pairs(self:GetTasks())do +local Task=Task +if Task:HasGroup(TaskGroup)then +Tasks[#Tasks+1]=Task +end +end +return Tasks +end +function MISSION:MenuReportBriefing(ReportGroup) +local Report=self:ReportBriefing() +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Briefing) +end +function MISSION:MenuMarkTargetLocations(ReportGroup) +local Report=self:MarkTargetLocations(ReportGroup) +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Overview) +end +function MISSION:MenuReportTasksSummary(ReportGroup) +local Report=self:ReportSummary(ReportGroup) +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Overview) +end +function MISSION:MenuReportTasksPerStatus(ReportGroup,TaskStatus) +local Report=self:ReportOverview(ReportGroup,TaskStatus) +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Overview) +end +function MISSION:MenuReportPlayersPerTask(ReportGroup) +local Report=self:ReportPlayersPerTask() +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Overview) +end +function MISSION:MenuReportPlayersProgress(ReportGroup) +local Report=self:ReportPlayersProgress() +self:GetCommandCenter():MessageTypeToGroup(Report,ReportGroup,MESSAGE.Type.Overview) +end +TASK={ +ClassName="TASK", +TaskScheduler=nil, +ProcessClasses={}, +Processes={}, +Players=nil, +Scores={}, +Menu={}, +SetGroup=nil, +FsmTemplate=nil, +Mission=nil, +CommandCenter=nil, +TimeOut=0, +AssignedGroups={}, +} +function TASK:New(Mission,SetGroupAssign,TaskName,TaskType,TaskBriefing) +local self=BASE:Inherit(self,FSM_TASK:New(TaskName)) +self:SetStartState("Planned") +self:AddTransition("Planned","Assign","Assigned") +self:AddTransition("Assigned","AssignUnit","Assigned") +self:AddTransition("Assigned","Success","Success") +self:AddTransition("Assigned","Hold","Hold") +self:AddTransition("Assigned","Fail","Failed") +self:AddTransition({"Planned","Assigned"},"Abort","Aborted") +self:AddTransition("Assigned","Cancel","Cancelled") +self:AddTransition("Assigned","Goal","*") +self.Fsm={} +local Fsm=self:GetUnitProcess() +Fsm:SetStartState("Planned") +Fsm:AddProcess("Planned","Accept",ACT_ASSIGN_ACCEPT:New(self.TaskBriefing),{Assigned="Assigned",Rejected="Reject"}) +Fsm:AddTransition("Assigned","Assigned","*") +self:AddTransition("*","PlayerCrashed","*") +self:AddTransition("*","PlayerAborted","*") +self:AddTransition("*","PlayerRejected","*") +self:AddTransition("*","PlayerDead","*") +self:AddTransition({"Failed","Aborted","Cancelled"},"Replan","Planned") +self:AddTransition("*","TimeOut","Cancelled") +self:F("New TASK "..TaskName) +self.Processes={} +self.Mission=Mission +self.CommandCenter=Mission:GetCommandCenter() +self.SetGroup=SetGroupAssign +self:SetType(TaskType) +self:SetName(TaskName) +self:SetID(Mission:GetNextTaskID(self)) +self:SetBriefing(TaskBriefing) +self.TaskInfo=TASKINFO:New(self) +self.TaskProgress={} +return self +end +function TASK:GetUnitProcess(TaskUnit) +if TaskUnit then +return self:GetStateMachine(TaskUnit) +else +self.FsmTemplate=self.FsmTemplate or FSM_PROCESS:New() +return self.FsmTemplate +end +end +function TASK:SetUnitProcess(FsmTemplate) +self.FsmTemplate=FsmTemplate +end +function TASK:JoinUnit(PlayerUnit,PlayerGroup) +self:F({PlayerUnit=PlayerUnit,PlayerGroup=PlayerGroup}) +local PlayerUnitAdded=false +local PlayerGroups=self:GetGroups() +if PlayerGroups:IsIncludeObject(PlayerGroup)then +if self:IsStatePlanned()or self:IsStateReplanned()then +end +if self:IsStateAssigned()then +local IsGroupAssigned=self:IsGroupAssigned(PlayerGroup) +self:F({IsGroupAssigned=IsGroupAssigned}) +if IsGroupAssigned then +self:AssignToUnit(PlayerUnit) +self:MessageToGroups(PlayerUnit:GetPlayerName().." joined Task "..self:GetName()) +end +end +end +return PlayerUnitAdded +end +function TASK:RejectGroup(PlayerGroup) +local PlayerGroups=self:GetGroups() +if PlayerGroups:IsIncludeObject(PlayerGroup)then +if self:IsStatePlanned()then +local IsGroupAssigned=self:IsGroupAssigned(PlayerGroup) +if IsGroupAssigned then +local PlayerName=PlayerGroup:GetUnit(1):GetPlayerName() +self:GetMission():GetCommandCenter():MessageToGroup("Task "..self:GetName().." has been rejected! We will select another task.",PlayerGroup) +self:UnAssignFromGroup(PlayerGroup) +self:PlayerRejected(PlayerGroup:GetUnit(1)) +end +end +end +return self +end +function TASK:AbortGroup(PlayerGroup) +local PlayerGroups=self:GetGroups() +if PlayerGroups:IsIncludeObject(PlayerGroup)then +if self:IsStateAssigned()then +local IsGroupAssigned=self:IsGroupAssigned(PlayerGroup) +if IsGroupAssigned then +local PlayerName=PlayerGroup:GetUnit(1):GetPlayerName() +self:UnAssignFromGroup(PlayerGroup) +PlayerGroups:Flush(self) +local IsRemaining=false +for GroupName,AssignedGroup in pairs(PlayerGroups:GetSet()or{})do +if self:IsGroupAssigned(AssignedGroup)==true then +IsRemaining=true +self:F({Task=self:GetName(),IsRemaining=IsRemaining}) +break +end +end +self:F({Task=self:GetName(),IsRemaining=IsRemaining}) +if IsRemaining==false then +self:Abort() +end +self:PlayerAborted(PlayerGroup:GetUnit(1)) +end +end +end +return self +end +function TASK:CrashGroup(PlayerGroup) +self:F({PlayerGroup=PlayerGroup}) +local PlayerGroups=self:GetGroups() +if PlayerGroups:IsIncludeObject(PlayerGroup)then +if self:IsStateAssigned()then +local IsGroupAssigned=self:IsGroupAssigned(PlayerGroup) +self:F({IsGroupAssigned=IsGroupAssigned}) +if IsGroupAssigned then +local PlayerName=PlayerGroup:GetUnit(1):GetPlayerName() +self:MessageToGroups(PlayerName.." crashed! ") +self:UnAssignFromGroup(PlayerGroup) +PlayerGroups:Flush(self) +local IsRemaining=false +for GroupName,AssignedGroup in pairs(PlayerGroups:GetSet()or{})do +if self:IsGroupAssigned(AssignedGroup)==true then +IsRemaining=true +self:F({Task=self:GetName(),IsRemaining=IsRemaining}) +break +end +end +self:F({Task=self:GetName(),IsRemaining=IsRemaining}) +if IsRemaining==false then +self:Abort() +end +self:PlayerCrashed(PlayerGroup:GetUnit(1)) +end +end +end +return self +end +function TASK:GetMission() +return self.Mission +end +function TASK:GetGroups() +return self.SetGroup +end +function TASK:AddGroups(GroupSet) +GroupSet=GroupSet or SET_GROUP:New() +self.SetGroup:ForEachGroup( +function(GroupItem) +GroupSet:Add(GroupItem:GetName(),GroupItem) +end +) +return GroupSet +end +do +function TASK:IsGroupAssigned(TaskGroup) +local TaskGroupName=TaskGroup:GetName() +if self.AssignedGroups[TaskGroupName]then +return true +end +return false +end +function TASK:SetGroupAssigned(TaskGroup) +local TaskName=self:GetName() +local TaskGroupName=TaskGroup:GetName() +self.AssignedGroups[TaskGroupName]=TaskGroup +self:F(string.format("Task %s is assigned to %s",TaskName,TaskGroupName)) +self:GetMission():SetGroupAssigned(TaskGroup) +local SetAssignedGroups=self:GetGroups() +return self +end +function TASK:ClearGroupAssignment(TaskGroup) +local TaskName=self:GetName() +local TaskGroupName=TaskGroup:GetName() +self.AssignedGroups[TaskGroupName]=nil +self:GetMission():ClearGroupAssignment(TaskGroup) +local SetAssignedGroups=self:GetGroups() +SetAssignedGroups:ForEachGroup( +function(AssignedGroup) +if self:IsGroupAssigned(AssignedGroup)then +else +end +end +) +return self +end +end +do +function TASK:SetAssignMethod(AcceptClass) +local ProcessTemplate=self:GetUnitProcess() +ProcessTemplate:SetProcess("Planned","Accept",AcceptClass) +end +function TASK:AssignToGroup(TaskGroup) +self:F(TaskGroup:GetName()) +local TaskGroupName=TaskGroup:GetName() +local Mission=self:GetMission() +local CommandCenter=Mission:GetCommandCenter() +self:SetGroupAssigned(TaskGroup) +local TaskUnits=TaskGroup:GetUnits() +for UnitID,UnitData in pairs(TaskUnits)do +local TaskUnit=UnitData +local PlayerName=TaskUnit:GetPlayerName() +self:F(PlayerName) +if PlayerName~=nil and PlayerName~=""then +self:AssignToUnit(TaskUnit) +CommandCenter:MessageToGroup( +string.format('Task "%s": Briefing for player (%s):\n%s', +self:GetName(), +PlayerName, +self:GetBriefing() +),TaskGroup +) +end +end +CommandCenter:SetMenu() +self:MenuFlashTaskStatus(TaskGroup,self:GetMission():GetCommandCenter().FlashStatus) +return self +end +function TASK:UnAssignFromGroup(TaskGroup) +self:F2({TaskGroup=TaskGroup:GetName()}) +self:ClearGroupAssignment(TaskGroup) +local TaskUnits=TaskGroup:GetUnits() +for UnitID,UnitData in pairs(TaskUnits)do +local TaskUnit=UnitData +local PlayerName=TaskUnit:GetPlayerName() +if PlayerName~=nil and PlayerName~=""then +self:UnAssignFromUnit(TaskUnit) +end +end +local Mission=self:GetMission() +local CommandCenter=Mission:GetCommandCenter() +CommandCenter:SetMenu() +self:MenuFlashTaskStatus(TaskGroup,false) +end +end +function TASK:HasGroup(FindGroup) +local SetAttackGroup=self:GetGroups() +return SetAttackGroup:FindGroup(FindGroup:GetName()) +end +function TASK:AssignToUnit(TaskUnit) +self:F(TaskUnit:GetName()) +local FsmTemplate=self:GetUnitProcess() +local FsmUnit=self:SetStateMachine(TaskUnit,FsmTemplate:Copy(TaskUnit,self)) +FsmUnit:SetStartState("Planned") +FsmUnit:Accept() +return self +end +function TASK:UnAssignFromUnit(TaskUnit) +self:F(TaskUnit:GetName()) +self:RemoveStateMachine(TaskUnit) +self:RemoveTaskControlMenu(TaskUnit) +return self +end +function TASK:SetTimeOut(Timer) +self:F(Timer) +self.TimeOut=Timer +self:__TimeOut(self.TimeOut) +return self +end +function TASK:MessageToGroups(Message) +self:F({Message=Message}) +local Mission=self:GetMission() +local CC=Mission:GetCommandCenter() +for TaskGroupName,TaskGroup in pairs(self.SetGroup:GetSet())do +TaskGroup=TaskGroup +if TaskGroup:IsAlive()==true then +CC:MessageToGroup(Message,TaskGroup,TaskGroup:GetName()) +end +end +end +function TASK:SendBriefingToAssignedGroups() +self:F2() +for TaskGroupName,TaskGroup in pairs(self.SetGroup:GetSet())do +if TaskGroup:IsAlive()then +if self:IsGroupAssigned(TaskGroup)then +TaskGroup:Message(self.TaskBriefing,60) +end +end +end +end +function TASK:UnAssignFromGroups() +self:F2() +for TaskGroupName,TaskGroup in pairs(self.SetGroup:GetSet())do +if TaskGroup:IsAlive()==true then +if self:IsGroupAssigned(TaskGroup)then +self:UnAssignFromGroup(TaskGroup) +end +end +end +end +function TASK:HasAliveUnits() +self:F() +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if TaskGroup:IsAlive()==true then +if self:IsStateAssigned()then +if self:IsGroupAssigned(TaskGroup)then +for TaskUnitID,TaskUnit in pairs(TaskGroup:GetUnits())do +if TaskUnit:IsAlive()then +self:T({HasAliveUnits=true}) +return true +end +end +end +end +end +end +self:T({HasAliveUnits=false}) +return false +end +function TASK:SetMenu(MenuTime) +self:F({self:GetName(),MenuTime}) +for TaskGroupID,TaskGroupData in pairs(self.SetGroup:GetSet())do +local TaskGroup=TaskGroupData +if TaskGroup:IsAlive()==true and TaskGroup:GetPlayerNames()then +local Mission=self:GetMission() +local MissionMenu=Mission:GetMenu(TaskGroup) +if MissionMenu then +self:SetMenuForGroup(TaskGroup,MenuTime) +end +end +end +end +function TASK:SetMenuForGroup(TaskGroup,MenuTime) +if self:IsStatePlanned()or self:IsStateAssigned()then +self:SetPlannedMenuForGroup(TaskGroup,MenuTime) +if self:IsGroupAssigned(TaskGroup)then +self:SetAssignedMenuForGroup(TaskGroup,MenuTime) +end +end +end +function TASK:SetPlannedMenuForGroup(TaskGroup,MenuTime) +self:F(TaskGroup:GetName()) +local Mission=self:GetMission() +local MissionName=Mission:GetName() +local MissionMenu=Mission:GetMenu(TaskGroup) +local TaskType=self:GetType() +local TaskPlayerCount=self:GetPlayerCount() +local TaskPlayerString=string.format(" (%dp)",TaskPlayerCount) +local TaskText=string.format("%s",self:GetName()) +local TaskName=string.format("%s",self:GetName()) +self.MenuPlanned=self.MenuPlanned or{} +self.MenuPlanned[TaskGroup]=MENU_GROUP_DELAYED:New(TaskGroup,"Join Planned Task",MissionMenu,Mission.MenuReportTasksPerStatus,Mission,TaskGroup,"Planned"):SetTime(MenuTime):SetTag("Tasking") +local TaskTypeMenu=MENU_GROUP_DELAYED:New(TaskGroup,TaskType,self.MenuPlanned[TaskGroup]):SetTime(MenuTime):SetTag("Tasking") +local TaskTypeMenu=MENU_GROUP_DELAYED:New(TaskGroup,TaskText,TaskTypeMenu):SetTime(MenuTime):SetTag("Tasking") +if not Mission:IsGroupAssigned(TaskGroup)then +local JoinTaskMenu=MENU_GROUP_COMMAND_DELAYED:New(TaskGroup,string.format("Join Task"),TaskTypeMenu,self.MenuAssignToGroup,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +local MarkTaskMenu=MENU_GROUP_COMMAND_DELAYED:New(TaskGroup,string.format("Mark Task Location on Map"),TaskTypeMenu,self.MenuMarkToGroup,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +end +local ReportTaskMenu=MENU_GROUP_COMMAND_DELAYED:New(TaskGroup,string.format("Report Task Details"),TaskTypeMenu,self.MenuTaskStatus,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +return self +end +function TASK:SetAssignedMenuForGroup(TaskGroup,MenuTime) +self:F({TaskGroup:GetName(),MenuTime}) +local TaskType=self:GetType() +local TaskPlayerCount=self:GetPlayerCount() +local TaskPlayerString=string.format(" (%dp)",TaskPlayerCount) +local TaskText=string.format("%s%s",self:GetName(),TaskPlayerString) +local TaskName=string.format("%s",self:GetName()) +for UnitName,TaskUnit in pairs(TaskGroup:GetPlayerUnits())do +local TaskUnit=TaskUnit +if TaskUnit then +local MenuControl=self:GetTaskControlMenu(TaskUnit) +local TaskControl=MENU_GROUP:New(TaskGroup,"Control Task",MenuControl):SetTime(MenuTime):SetTag("Tasking") +if self:IsStateAssigned()then +local TaskMenu=MENU_GROUP_COMMAND:New(TaskGroup,string.format("Abort Task"),TaskControl,self.MenuTaskAbort,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +end +local MarkMenu=MENU_GROUP_COMMAND:New(TaskGroup,string.format("Mark Task Location on Map"),TaskControl,self.MenuMarkToGroup,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +local TaskTypeMenu=MENU_GROUP_COMMAND:New(TaskGroup,string.format("Report Task Details"),TaskControl,self.MenuTaskStatus,self,TaskGroup):SetTime(MenuTime):SetTag("Tasking") +if not self.FlashTaskStatus then +local TaskFlashStatusMenu=MENU_GROUP_COMMAND:New(TaskGroup,string.format("Flash Task Details"),TaskControl,self.MenuFlashTaskStatus,self,TaskGroup,true):SetTime(MenuTime):SetTag("Tasking") +else +local TaskFlashStatusMenu=MENU_GROUP_COMMAND:New(TaskGroup,string.format("Stop Flash Task Details"),TaskControl,self.MenuFlashTaskStatus,self,TaskGroup,nil):SetTime(MenuTime):SetTag("Tasking") +end +end +end +return self +end +function TASK:RemoveMenu(MenuTime) +self:F({self:GetName(),MenuTime}) +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if TaskGroup:IsAlive()==true then +local TaskGroup=TaskGroup +if TaskGroup:IsAlive()==true and TaskGroup:GetPlayerNames()then +self:RefreshMenus(TaskGroup,MenuTime) +end +end +end +end +function TASK:RefreshMenus(TaskGroup,MenuTime) +self:F({TaskGroup:GetName(),MenuTime}) +local Mission=self:GetMission() +local MissionName=Mission:GetName() +local MissionMenu=Mission:GetMenu(TaskGroup) +local TaskName=self:GetName() +self.MenuPlanned=self.MenuPlanned or{} +local PlannedMenu=self.MenuPlanned[TaskGroup] +self.MenuAssigned=self.MenuAssigned or{} +local AssignedMenu=self.MenuAssigned[TaskGroup] +if PlannedMenu then +self.MenuPlanned[TaskGroup]=PlannedMenu:Remove(MenuTime,"Tasking") +PlannedMenu:Set() +end +if AssignedMenu then +self.MenuAssigned[TaskGroup]=AssignedMenu:Remove(MenuTime,"Tasking") +AssignedMenu:Set() +end +end +function TASK:RemoveAssignedMenuForGroup(TaskGroup) +self:F() +local Mission=self:GetMission() +local MissionName=Mission:GetName() +local MissionMenu=Mission:GetMenu(TaskGroup) +if MissionMenu then +MissionMenu:RemoveSubMenus() +end +end +function TASK:MenuAssignToGroup(TaskGroup) +self:F("Join Task menu selected") +self:AssignToGroup(TaskGroup) +end +function TASK:MenuMarkToGroup(TaskGroup) +self:F() +self:UpdateTaskInfo(self.DetectedItem) +local TargetCoordinates=self.TaskInfo:GetData("Coordinates") +if TargetCoordinates then +for TargetCoordinateID,TargetCoordinate in pairs(TargetCoordinates)do +local Report=REPORT:New():SetIndent(0) +self.TaskInfo:Report(Report,"M",TaskGroup,self) +local MarkText=Report:Text(", ") +self:F({Coordinate=TargetCoordinate,MarkText=MarkText}) +TargetCoordinate:MarkToGroup(MarkText,TaskGroup) +end +else +local TargetCoordinate=self.TaskInfo:GetData("Coordinate") +if TargetCoordinate then +local Report=REPORT:New():SetIndent(0) +self.TaskInfo:Report(Report,"M",TaskGroup,self) +local MarkText=Report:Text(", ") +self:F({Coordinate=TargetCoordinate,MarkText=MarkText}) +TargetCoordinate:MarkToGroup(MarkText,TaskGroup) +end +end +end +function TASK:MenuTaskStatus(TaskGroup) +if TaskGroup:IsAlive()then +local ReportText=self:ReportDetails(TaskGroup) +self:T(ReportText) +self:GetMission():GetCommandCenter():MessageTypeToGroup(ReportText,TaskGroup,MESSAGE.Type.Detailed) +end +end +function TASK:MenuFlashTaskStatus(TaskGroup,Flash) +self.FlashTaskStatus=Flash +if self.FlashTaskStatus then +self.FlashTaskScheduler,self.FlashTaskScheduleID=SCHEDULER:New(self,self.MenuTaskStatus,{TaskGroup},0,60) +else +if self.FlashTaskScheduler then +self.FlashTaskScheduler:Stop(self.FlashTaskScheduleID) +self.FlashTaskScheduler=nil +self.FlashTaskScheduleID=nil +end +end +end +function TASK:MenuTaskAbort(TaskGroup) +self:AbortGroup(TaskGroup) +end +function TASK:GetTaskName() +return self.TaskName +end +function TASK:GetTaskBriefing() +return self.TaskBriefing +end +function TASK:GetProcessTemplate(ProcessName) +local ProcessTemplate=self.ProcessClasses[ProcessName] +return ProcessTemplate +end +function TASK:FailProcesses(TaskUnitName) +for ProcessID,ProcessData in pairs(self.Processes[TaskUnitName])do +local Process=ProcessData +Process.Fsm:Fail() +end +end +function TASK:SetStateMachine(TaskUnit,Fsm) +self:F2({TaskUnit,self.Fsm[TaskUnit]~=nil,Fsm:GetClassNameAndID()}) +self.Fsm[TaskUnit]=Fsm +return Fsm +end +function TASK:GetStateMachine(TaskUnit) +self:F2({TaskUnit,self.Fsm[TaskUnit]~=nil}) +return self.Fsm[TaskUnit] +end +function TASK:RemoveStateMachine(TaskUnit) +self:F({TaskUnit=TaskUnit:GetName(),HasFsm=(self.Fsm[TaskUnit]~=nil)}) +if self.Fsm[TaskUnit]then +self.Fsm[TaskUnit]:Remove() +self.Fsm[TaskUnit]=nil +end +collectgarbage() +self:F("Garbage Collected, Processes should be finalized now ...") +end +function TASK:HasStateMachine(TaskUnit) +self:F({TaskUnit,self.Fsm[TaskUnit]~=nil}) +return(self.Fsm[TaskUnit]~=nil) +end +function TASK:GetScoring() +return self.Mission:GetScoring() +end +function TASK:GetTaskIndex() +local TaskType=self:GetType() +local TaskName=self:GetName() +return TaskType.."."..TaskName +end +function TASK:SetName(TaskName) +self.TaskName=TaskName +end +function TASK:GetName() +return self.TaskName +end +function TASK:SetType(TaskType) +self.TaskType=TaskType +end +function TASK:GetType() +return self.TaskType +end +function TASK:SetID(TaskID) +self.TaskID=TaskID +end +function TASK:GetID() +return self.TaskID +end +function TASK:StateSuccess() +self:SetState(self,"State","Success") +return self +end +function TASK:IsStateSuccess() +return self:Is("Success") +end +function TASK:StateFailed() +self:SetState(self,"State","Failed") +return self +end +function TASK:IsStateFailed() +return self:Is("Failed") +end +function TASK:StatePlanned() +self:SetState(self,"State","Planned") +return self +end +function TASK:IsStatePlanned() +return self:Is("Planned") +end +function TASK:StateAborted() +self:SetState(self,"State","Aborted") +return self +end +function TASK:IsStateAborted() +return self:Is("Aborted") +end +function TASK:StateCancelled() +self:SetState(self,"State","Cancelled") +return self +end +function TASK:IsStateCancelled() +return self:Is("Cancelled") +end +function TASK:StateAssigned() +self:SetState(self,"State","Assigned") +return self +end +function TASK:IsStateAssigned() +return self:Is("Assigned") +end +function TASK:StateHold() +self:SetState(self,"State","Hold") +return self +end +function TASK:IsStateHold() +return self:Is("Hold") +end +function TASK:StateReplanned() +self:SetState(self,"State","Replanned") +return self +end +function TASK:IsStateReplanned() +return self:Is("Replanned") +end +function TASK:GetStateString() +return self:GetState(self,"State") +end +function TASK:SetBriefing(TaskBriefing) +self:F(TaskBriefing) +self.TaskBriefing=TaskBriefing +return self +end +function TASK:GetBriefing() +return self.TaskBriefing +end +function TASK:onenterAssigned(From,Event,To,PlayerUnit,PlayerName) +if From~="Assigned"then +local PlayerNames=self:GetPlayerNames() +local PlayerText=REPORT:New() +for PlayerName,TaskName in pairs(PlayerNames)do +PlayerText:Add(PlayerName) +end +self:GetMission():GetCommandCenter():MessageToCoalition("Task "..self:GetName().." is assigned to players "..PlayerText:Text(",")..". Good Luck!") +self:SetGoalTotal() +if self.Dispatcher then +self:F("Firing Assign event ") +self.Dispatcher:Assign(self,PlayerUnit,PlayerName) +end +self:GetMission():__Start(1) +self:__Goal(-10,PlayerUnit,PlayerName) +self:SetMenu() +self:F({"--> Task Assigned",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"--> Task Player Names",PlayerNames=PlayerNames}) +end +end +function TASK:onenterSuccess(From,Event,To) +self:F({"<-> Task Replanned",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"<-> Task Player Names",PlayerNames=self:GetPlayerNames()}) +self:GetMission():GetCommandCenter():MessageToCoalition("Task "..self:GetName().." is successful! Good job!") +self:UnAssignFromGroups() +self:GetMission():__MissionGoals(1) +end +function TASK:onenterAborted(From,Event,To) +self:F({"<-- Task Aborted",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"<-- Task Player Names",PlayerNames=self:GetPlayerNames()}) +if From~="Aborted"then +self:GetMission():GetCommandCenter():MessageToCoalition("Task "..self:GetName().." has been aborted! Task may be replanned.") +self:__Replan(5) +self:SetMenu() +end +end +function TASK:onenterCancelled(From,Event,To) +self:F({"<-- Task Cancelled",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"<-- Player Names",PlayerNames=self:GetPlayerNames()}) +if From~="Cancelled"then +self:GetMission():GetCommandCenter():MessageToCoalition("Task "..self:GetName().." has been cancelled! The tactical situation has changed.") +self:UnAssignFromGroups() +self:SetMenu() +end +end +function TASK:onafterReplan(From,Event,To) +self:F({"Task Replanned",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"Task Player Names",PlayerNames=self:GetPlayerNames()}) +self:GetMission():GetCommandCenter():MessageToCoalition("Replanning Task "..self:GetName()..".") +self:SetMenu() +end +function TASK:onenterFailed(From,Event,To) +self:F({"Task Failed",TaskName=self:GetName(),Mission=self:GetMission():GetName()}) +self:F({"Task Player Names",PlayerNames=self:GetPlayerNames()}) +self:GetMission():GetCommandCenter():MessageToCoalition("Task "..self:GetName().." has failed!") +self:UnAssignFromGroups() +end +function TASK:onstatechange(From,Event,To) +if self:IsTrace()then +end +if self.Scores[To]then +local Scoring=self:GetScoring() +if Scoring then +self:F({self.Scores[To].ScoreText,self.Scores[To].Score}) +Scoring:_AddMissionScore(self.Mission,self.Scores[To].ScoreText,self.Scores[To].Score) +end +end +end +function TASK:onenterPlanned(From,Event,To) +if not self.TimeOut==0 then +self.__TimeOut(self.TimeOut) +end +end +function TASK:onbeforeTimeOut(From,Event,To) +if From=="Planned"then +self:RemoveMenu() +return true +end +return false +end +do +function TASK:SetGoal(Goal) +self.Goal=Goal +end +function TASK:GetGoal() +return self.Goal +end +function TASK:SetDispatcher(Dispatcher) +self.Dispatcher=Dispatcher +end +function TASK:SetDetection(Detection,DetectedItem) +self:F({DetectedItem,Detection}) +self.Detection=Detection +self.DetectedItem=DetectedItem +end +end +do +function TASK:ReportSummary(ReportGroup) +self:UpdateTaskInfo(self.DetectedItem) +local Report=REPORT:New() +Report:Add("Task "..self:GetName()) +Report:Add("State: <"..self:GetState()..">") +self.TaskInfo:Report(Report,"S",ReportGroup,self) +return Report:Text(', ') +end +function TASK:ReportOverview(ReportGroup) +self:UpdateTaskInfo(self.DetectedItem) +local TaskName=self:GetName() +local Report=REPORT:New() +self.TaskInfo:Report(Report,"O",ReportGroup,self) +return Report:Text() +end +function TASK:GetPlayerCount() +local PlayerCount=0 +for TaskGroupID,PlayerGroup in pairs(self:GetGroups():GetSet())do +local PlayerGroup=PlayerGroup +if PlayerGroup:IsAlive()==true then +if self:IsGroupAssigned(PlayerGroup)then +local PlayerNames=PlayerGroup:GetPlayerNames() +PlayerCount=PlayerCount+((PlayerNames)and#PlayerNames or 0) +end +end +end +return PlayerCount +end +function TASK:GetPlayerNames() +local PlayerNameMap={} +for TaskGroupID,PlayerGroup in pairs(self:GetGroups():GetSet())do +local PlayerGroup=PlayerGroup +if PlayerGroup:IsAlive()==true then +if self:IsGroupAssigned(PlayerGroup)then +local PlayerNames=PlayerGroup:GetPlayerNames() +for PlayerNameID,PlayerName in pairs(PlayerNames or{})do +PlayerNameMap[PlayerName]=PlayerGroup +end +end +end +end +return PlayerNameMap +end +function TASK:ReportDetails(ReportGroup) +self:UpdateTaskInfo(self.DetectedItem) +local Report=REPORT:New():SetIndent(3) +local Name=self:GetName() +local Status="<"..self:GetState()..">" +Report:Add("Task "..Name.." - "..Status.." - Detailed Report") +local PlayerNames=self:GetPlayerNames() +local PlayerReport=REPORT:New() +for PlayerName,PlayerGroup in pairs(PlayerNames)do +PlayerReport:Add("Players group "..PlayerGroup:GetCallsign()..": "..PlayerName) +end +local Players=PlayerReport:Text() +if Players~=""then +Report:AddIndent("Players assigned:","-") +Report:AddIndent(Players) +end +self.TaskInfo:Report(Report,"D",ReportGroup,self) +return Report:Text() +end +end +do +function TASK:AddProgress(PlayerName,ProgressText,ProgressTime,ProgressPoints) +self.TaskProgress=self.TaskProgress or{} +self.TaskProgress[ProgressTime]=self.TaskProgress[ProgressTime]or{} +self.TaskProgress[ProgressTime].PlayerName=PlayerName +self.TaskProgress[ProgressTime].ProgressText=ProgressText +self.TaskProgress[ProgressTime].ProgressPoints=ProgressPoints +self:GetMission():AddPlayerName(PlayerName) +return self +end +function TASK:GetPlayerProgress(PlayerName) +local ProgressPlayer=0 +for ProgressTime,ProgressData in pairs(self.TaskProgress)do +if PlayerName==ProgressData.PlayerName then +ProgressPlayer=ProgressPlayer+ProgressData.ProgressPoints +end +end +return ProgressPlayer +end +function TASK:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountPlayer","Player "..PlayerName.." has achieved progress.",Score) +return self +end +function TASK:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","The task is a success!",Score) +return self +end +function TASK:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The task is a failure!",Penalty) +return self +end +end +do +function TASK:InitTaskControlMenu(TaskUnit) +self.TaskControlMenuTime=timer.getTime() +return self.TaskControlMenuTime +end +function TASK:GetTaskControlMenu(TaskUnit,TaskName) +TaskName=TaskName or"" +local TaskGroup=TaskUnit:GetGroup() +local TaskPlayerCount=TaskGroup:GetPlayerCount() +if TaskPlayerCount<=1 then +self.TaskControlMenu=MENU_GROUP:New(TaskUnit:GetGroup(),"Task "..self:GetName().." control"):SetTime(self.TaskControlMenuTime) +else +self.TaskControlMenu=MENU_GROUP:New(TaskUnit:GetGroup(),"Task "..self:GetName().." control for "..TaskUnit:GetPlayerName()):SetTime(self.TaskControlMenuTime) +end +return self.TaskControlMenu +end +function TASK:RemoveTaskControlMenu(TaskUnit) +if self.TaskControlMenu then +self.TaskControlMenu:Remove() +self.TaskControlMenu=nil +end +end +function TASK:RefreshTaskControlMenu(TaskUnit,MenuTime,MenuTag) +if self.TaskControlMenu then +self.TaskControlMenu:Remove(MenuTime,MenuTag) +end +end +end +TASKINFO={ +ClassName="TASKINFO", +} +TASKINFO.Detail="" +function TASKINFO:New(Task) +local self=BASE:Inherit(self,BASE:New()) +self.Task=Task +self.VolatileInfo=SET_BASE:New() +self.PersistentInfo=SET_BASE:New() +self.Info=self.VolatileInfo +return self +end +function TASKINFO:AddInfo(Key,Data,Order,Detail,Keep,ShowKey,Type) +self.VolatileInfo:Add(Key,{Data=Data,Order=Order,Detail=Detail,ShowKey=ShowKey,Type=Type}) +if Keep==true then +self.PersistentInfo:Add(Key,{Data=Data,Order=Order,Detail=Detail,ShowKey=ShowKey,Type=Type}) +end +return self +end +function TASKINFO:GetInfo(Key) +local Object=self:Get(Key) +return Object.Data,Object.Order,Object.Detail +end +function TASKINFO:GetData(Key) +local Object=self.Info:Get(Key) +return Object and Object.Data +end +function TASKINFO:AddText(Key,Text,Order,Detail,Keep) +self:AddInfo(Key,Text,Order,Detail,Keep) +return self +end +function TASKINFO:AddTaskName(Order,Detail,Keep) +self:AddInfo("TaskName",self.Task:GetName(),Order,Detail,Keep) +return self +end +function TASKINFO:AddCoordinate(Coordinate,Order,Detail,Keep,ShowKey,Name) +self:AddInfo(Name or"Coordinate",Coordinate,Order,Detail,Keep,ShowKey,"Coordinate") +return self +end +function TASKINFO:GetCoordinate(Name) +return self:GetData(Name or"Coordinate") +end +function TASKINFO:AddCoordinates(Coordinates,Order,Detail,Keep) +self:AddInfo("Coordinates",Coordinates,Order,Detail,Keep) +return self +end +function TASKINFO:AddThreat(ThreatText,ThreatLevel,Order,Detail,Keep) +self:AddInfo("Threat"," ["..string.rep("■",ThreatLevel)..string.rep("□",10-ThreatLevel).."]:"..ThreatText,Order,Detail,Keep) +return self +end +function TASKINFO:GetThreat() +self:GetInfo("Threat") +return self +end +function TASKINFO:AddTargetCount(TargetCount,Order,Detail,Keep) +self:AddInfo("Counting",string.format("%d",TargetCount),Order,Detail,Keep) +return self +end +function TASKINFO:AddTargets(TargetCount,TargetTypes,Order,Detail,Keep) +self:AddInfo("Targets",string.format("%d of %s",TargetCount,TargetTypes),Order,Detail,Keep) +return self +end +function TASKINFO:GetTargets() +self:GetInfo("Targets") +return self +end +function TASKINFO:AddQFEAtCoordinate(Coordinate,Order,Detail,Keep) +self:AddInfo("QFE",Coordinate,Order,Detail,Keep) +return self +end +function TASKINFO:AddTemperatureAtCoordinate(Coordinate,Order,Detail,Keep) +self:AddInfo("Temperature",Coordinate,Order,Detail,Keep) +return self +end +function TASKINFO:AddWindAtCoordinate(Coordinate,Order,Detail,Keep) +self:AddInfo("Wind",Coordinate,Order,Detail,Keep) +return self +end +function TASKINFO:AddCargo(Cargo,Order,Detail,Keep) +self:AddInfo("Cargo",Cargo,Order,Detail,Keep) +return self +end +function TASKINFO:AddCargoSet(SetCargo,Order,Detail,Keep) +local CargoReport=REPORT:New() +CargoReport:Add("") +SetCargo:ForEachCargo( +function(Cargo) +CargoReport:Add(string.format(' - %s (%s) %s - status %s ',Cargo:GetName(),Cargo:GetType(),Cargo:GetTransportationMethod(),Cargo:GetCurrentState())) +end +) +self:AddInfo("Cargo",CargoReport:Text(),Order,Detail,Keep) +return self +end +function TASKINFO:Report(Report,Detail,ReportGroup,Task) +local Line=0 +local LineReport=REPORT:New() +if not self.Task:IsStatePlanned()and not self.Task:IsStateAssigned()then +self.Info=self.PersistentInfo +end +for Key,Data in UTILS.spairs(self.Info.Set,function(t,a,b)return t[a].Order<t[b].Order end)do +if Data.Detail:find(Detail)then +local Text="" +local ShowKey=(Data.ShowKey==nil or Data.ShowKey==true) +if Key=="TaskName"then +Key=nil +Text=Data.Data +elseif Data.Type and Data.Type=="Coordinate"then +local Coordinate=Data.Data +Text=Coordinate:ToString(ReportGroup:GetUnit(1),nil,Task) +elseif Key=="Threat"then +local DataText=Data.Data +Text=DataText +elseif Key=="Counting"then +local DataText=Data.Data +Text=DataText +elseif Key=="Targets"then +local DataText=Data.Data +Text=DataText +elseif Key=="QFE"then +local Coordinate=Data.Data +Text=Coordinate:ToStringPressure(ReportGroup:GetUnit(1),nil,Task) +elseif Key=="Temperature"then +local Coordinate=Data.Data +Text=Coordinate:ToStringTemperature(ReportGroup:GetUnit(1),nil,Task) +elseif Key=="Wind"then +local Coordinate=Data.Data +Text=Coordinate:ToStringWind(ReportGroup:GetUnit(1),nil,Task) +elseif Key=="Cargo"then +local DataText=Data.Data +Text=DataText +elseif Key=="Friendlies"then +local DataText=Data.Data +Text=DataText +elseif Key=="Players"then +local DataText=Data.Data +Text=DataText +else +local DataText=Data.Data +if type(DataText)=="string"then +Text=DataText +end +end +if Line<math.floor(Data.Order/10)then +if Line==0 then +Report:AddIndent(LineReport:Text(", "),"-") +else +Report:AddIndent(LineReport:Text(", ")) +end +LineReport=REPORT:New() +Line=math.floor(Data.Order/10) +end +if Text~=""then +LineReport:Add(((Key and ShowKey==true)and(Key..": ")or"")..Text) +end +end +end +Report:AddIndent(LineReport:Text(", ")) +end +do +TASK_MANAGER={ +ClassName="TASK_MANAGER", +SetGroup=nil, +} +function TASK_MANAGER:New(SetGroup) +local self=BASE:Inherit(self,FSM:New()) +self.SetGroup=SetGroup +self:SetStartState("Stopped") +self:AddTransition("Stopped","StartTasks","Started") +self:AddTransition("Started","StopTasks","Stopped") +self:AddTransition("Started","Manage","Started") +self:AddTransition("Started","Success","Started") +self:AddTransition("Started","Failed","Started") +self:AddTransition("Started","Aborted","Started") +self:AddTransition("Started","Cancelled","Started") +self:SetRefreshTimeInterval(30) +return self +end +function TASK_MANAGER:onafterStartTasks(From,Event,To) +self:Manage() +end +function TASK_MANAGER:onafterManage(From,Event,To) +self:__Manage(-self._RefreshTimeInterval) +self:ManageTasks() +end +function TASK_MANAGER:SetRefreshTimeInterval(RefreshTimeInterval) +self:F2() +self._RefreshTimeInterval=RefreshTimeInterval +end +function TASK_MANAGER:ManageTasks() +end +end +do +DETECTION_MANAGER={ +ClassName="DETECTION_MANAGER", +SetGroup=nil, +Detection=nil, +} +DETECTION_MANAGER.CC=nil +function DETECTION_MANAGER:New(SetGroup,Detection) +local self=BASE:Inherit(self,FSM:New()) +self.SetGroup=SetGroup +self.Detection=Detection +self:SetStartState("Stopped") +self:AddTransition("Stopped","Start","Started") +self:AddTransition("Started","Stop","Stopped") +self:AddTransition("Started","Success","Started") +self:AddTransition("Started","Failed","Started") +self:AddTransition("Started","Aborted","Started") +self:AddTransition("Started","Cancelled","Started") +self:AddTransition("Started","Report","Started") +self:SetRefreshTimeInterval(30) +self:SetReportDisplayTime(25) +Detection:__Start(3) +return self +end +function DETECTION_MANAGER:onafterStart(From,Event,To) +self:Report() +end +function DETECTION_MANAGER:onafterReport(From,Event,To) +self:__Report(-self._RefreshTimeInterval) +self:ProcessDetected(self.Detection) +end +function DETECTION_MANAGER:SetRefreshTimeInterval(RefreshTimeInterval) +self:F2() +self._RefreshTimeInterval=RefreshTimeInterval +end +function DETECTION_MANAGER:SetReportDisplayTime(ReportDisplayTime) +self:F2() +self._ReportDisplayTime=ReportDisplayTime +end +function DETECTION_MANAGER:GetReportDisplayTime() +self:F2() +return self._ReportDisplayTime +end +function DETECTION_MANAGER:SetTacticalMenu(DispatcherMainMenuText,DispatcherMenuText) +local DispatcherMainMenu=MENU_MISSION:New(DispatcherMainMenuText,nil) +local DispatcherMenu=MENU_MISSION_COMMAND:New(DispatcherMenuText,DispatcherMainMenu, +function() +self:ShowTacticalDisplay(self.Detection) +end +) +return self +end +function DETECTION_MANAGER:SetCommandCenter(CommandCenter) +self.CC=CommandCenter +return self +end +function DETECTION_MANAGER:GetCommandCenter() +return self.CC +end +function DETECTION_MANAGER:MessageToPlayers(Squadron,Message,DefenderGroup) +self:F({Message=Message}) +if self.CC then +self.CC:MessageToCoalition(Message) +end +Message=Message:gsub("°"," degrees ") +Message=Message:gsub("(%d)%.(%d)","%1 dot %2") +local RadioQueue=Squadron.RadioQueue +if RadioQueue then +local DefenderUnit=DefenderGroup:GetUnit(1) +if DefenderUnit and DefenderUnit:IsAlive()then +RadioQueue:SetSenderUnitName(DefenderUnit:GetName()) +end +RadioQueue:Speak(Message,Squadron.Language) +end +return self +end +function DETECTION_MANAGER:ProcessDetected(Detection) +end +end +do +DETECTION_REPORTING={ +ClassName="DETECTION_REPORTING", +} +function DETECTION_REPORTING:New(SetGroup,Detection) +local self=BASE:Inherit(self,DETECTION_MANAGER:New(SetGroup,Detection)) +self:Schedule(1,30) +return self +end +function DETECTION_REPORTING:GetDetectedItemsText(DetectedSet) +self:F2() +local MT={} +local UnitTypes={} +for DetectedUnitID,DetectedUnitData in pairs(DetectedSet:GetSet())do +local DetectedUnit=DetectedUnitData +if DetectedUnit:IsAlive()then +local UnitType=DetectedUnit:GetTypeName() +if not UnitTypes[UnitType]then +UnitTypes[UnitType]=1 +else +UnitTypes[UnitType]=UnitTypes[UnitType]+1 +end +end +end +for UnitTypeID,UnitType in pairs(UnitTypes)do +MT[#MT+1]=UnitType.." of "..UnitTypeID +end +return table.concat(MT,", ") +end +function DETECTION_REPORTING:ProcessDetected(Group,Detection) +self:F2(Group) +local DetectedMsg={} +for DetectedAreaID,DetectedAreaData in pairs(Detection:GetDetectedAreas())do +local DetectedArea=DetectedAreaData +DetectedMsg[#DetectedMsg+1]=" - Group #"..DetectedAreaID..": "..self:GetDetectedItemsText(DetectedArea.Set) +end +local FACGroup=Detection:GetDetectionGroups() +FACGroup:MessageToGroup("Reporting detected target groups:\n"..table.concat(DetectedMsg,"\n"),self:GetReportDisplayTime(),Group) +return true +end +end +do +TASK_A2G_DISPATCHER={ +ClassName="TASK_A2G_DISPATCHER", +Mission=nil, +Detection=nil, +Tasks={} +} +function TASK_A2G_DISPATCHER:New(Mission,SetGroup,Detection) +local self=BASE:Inherit(self,DETECTION_MANAGER:New(SetGroup,Detection)) +self.Detection=Detection +self.Mission=Mission +self.FlashNewTask=true +self.Detection:FilterCategories({Unit.Category.GROUND_UNIT}) +self:AddTransition("Started","Assign","Started") +self:__Start(5) +return self +end +function TASK_A2G_DISPATCHER:SetSendMessages(onoff) +self.FlashNewTask=onoff +end +function TASK_A2G_DISPATCHER:EvaluateSEAD(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +local RadarCount=DetectedSet:HasSEAD() +if RadarCount>0 then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterHasSEAD() +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2G_DISPATCHER:EvaluateCAS(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +local GroundUnitCount=DetectedSet:HasGroundUnits() +local FriendliesNearBy=self.Detection:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +local RadarCount=DetectedSet:HasSEAD() +if RadarCount==0 and GroundUnitCount>0 and FriendliesNearBy==true then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2G_DISPATCHER:EvaluateBAI(DetectedItem,FriendlyCoalition) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +local GroundUnitCount=DetectedSet:HasGroundUnits() +local FriendliesNearBy=self.Detection:IsFriendliesNearBy(DetectedItem,Unit.Category.GROUND_UNIT) +local RadarCount=DetectedSet:HasSEAD() +if RadarCount==0 and GroundUnitCount>0 and FriendliesNearBy==false then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2G_DISPATCHER:RemoveTask(TaskIndex) +self.Mission:RemoveTask(self.Tasks[TaskIndex]) +self.Tasks[TaskIndex]=nil +end +function TASK_A2G_DISPATCHER:EvaluateRemoveTask(Mission,Task,TaskIndex,DetectedItemChanged) +if Task then +if(Task:IsStatePlanned()and DetectedItemChanged==true)or Task:IsStateCancelled()then +self:RemoveTask(TaskIndex) +end +end +return Task +end +function TASK_A2G_DISPATCHER:ProcessDetected(Detection) +self:F() +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local Mission=self.Mission +if Mission:IsIDLE()or Mission:IsENGAGED()then +local TaskReport=REPORT:New() +for TaskIndex,TaskData in pairs(self.Tasks)do +local Task=TaskData +if Task:IsStatePlanned()then +local DetectedItem=Detection:GetDetectedItemByIndex(TaskIndex) +if not DetectedItem then +local TaskText=Task:GetName() +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if self.FlashNewTask then +Mission:GetCommandCenter():MessageToGroup(string.format("Obsolete A2G task %s for %s removed.",TaskText,Mission:GetShortText()),TaskGroup) +end +end +Task=self:RemoveTask(TaskIndex) +end +end +end +for DetectedItemID,DetectedItem in pairs(Detection:GetDetectedItems())do +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +local DetectedItemID=DetectedItem.ID +local TaskIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +self:F({DetectedItemChanged=DetectedItemChanged,DetectedItemID=DetectedItemID,TaskIndex=TaskIndex}) +local Task=self.Tasks[TaskIndex] +if Task then +if Task:IsStateAssigned()then +if DetectedItemChanged==true then +local TargetsReport=REPORT:New() +local TargetSetUnit=self:EvaluateSEAD(DetectedItem) +if TargetSetUnit then +if Task:IsInstanceOf(TASK_A2G_SEAD)then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +TargetsReport:Add(Detection:GetChangeText(DetectedItem)) +else +Task:Cancel() +end +else +local TargetSetUnit=self:EvaluateCAS(DetectedItem) +if TargetSetUnit then +if Task:IsInstanceOf(TASK_A2G_CAS)then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +TargetsReport:Add(Detection:GetChangeText(DetectedItem)) +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +else +local TargetSetUnit=self:EvaluateBAI(DetectedItem) +if TargetSetUnit then +if Task:IsInstanceOf(TASK_A2G_BAI)then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +TargetsReport:Add(Detection:GetChangeText(DetectedItem)) +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +end +end +end +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +local TargetsText=TargetsReport:Text(", ") +if(Mission:IsGroupAssigned(TaskGroup))and TargetsText~=""and self.FlashNewTask then +Mission:GetCommandCenter():MessageToGroup(string.format("Task %s has change of targets:\n %s",Task:GetName(),TargetsText),TaskGroup) +end +end +end +end +end +if Task then +if Task:IsStatePlanned()then +if DetectedItemChanged==true then +if Task:IsInstanceOf(TASK_A2G_SEAD)then +local TargetSetUnit=self:EvaluateSEAD(DetectedItem) +if TargetSetUnit then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +else +if Task:IsInstanceOf(TASK_A2G_CAS)then +local TargetSetUnit=self:EvaluateCAS(DetectedItem) +if TargetSetUnit then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +else +if Task:IsInstanceOf(TASK_A2G_BAI)then +local TargetSetUnit=self:EvaluateBAI(DetectedItem) +if TargetSetUnit then +Task:SetTargetSetUnit(TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +else +Task:Cancel() +Task=self:RemoveTask(TaskIndex) +end +end +end +end +end +end +if not Task then +local TargetSetUnit=self:EvaluateSEAD(DetectedItem) +if TargetSetUnit then +Task=TASK_A2G_SEAD:New(Mission,self.SetGroup,string.format("SEAD.%03d",DetectedItemID),TargetSetUnit) +DetectedItem.DesignateMenuName=string.format("SEAD.%03d",DetectedItemID) +Task:SetDetection(Detection,DetectedItem) +end +if not Task then +local TargetSetUnit=self:EvaluateCAS(DetectedItem) +if TargetSetUnit then +Task=TASK_A2G_CAS:New(Mission,self.SetGroup,string.format("CAS.%03d",DetectedItemID),TargetSetUnit) +DetectedItem.DesignateMenuName=string.format("CAS.%03d",DetectedItemID) +Task:SetDetection(Detection,DetectedItem) +end +if not Task then +local TargetSetUnit=self:EvaluateBAI(DetectedItem,self.Mission:GetCommandCenter():GetPositionable():GetCoalition()) +if TargetSetUnit then +Task=TASK_A2G_BAI:New(Mission,self.SetGroup,string.format("BAI.%03d",DetectedItemID),TargetSetUnit) +DetectedItem.DesignateMenuName=string.format("BAI.%03d",DetectedItemID) +Task:SetDetection(Detection,DetectedItem) +end +end +end +if Task then +self.Tasks[TaskIndex]=Task +Task:SetTargetZone(DetectedZone) +Task:SetDispatcher(self) +Task:UpdateTaskInfo(DetectedItem) +Mission:AddTask(Task) +function Task.OnEnterSuccess(Task,From,Event,To) +self:Success(Task) +end +function Task.OnEnterCancelled(Task,From,Event,To) +self:Cancelled(Task) +end +function Task.OnEnterFailed(Task,From,Event,To) +self:Failed(Task) +end +function Task.OnEnterAborted(Task,From,Event,To) +self:Aborted(Task) +end +TaskReport:Add(Task:GetName()) +else +self:F("This should not happen") +end +end +Detection:AcceptChanges(DetectedItem) +end +Mission:GetCommandCenter():SetMenu() +local TaskText=TaskReport:Text(", ") +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if(not Mission:IsGroupAssigned(TaskGroup))and TaskText~=""and self.FlashNewTask then +Mission:GetCommandCenter():MessageToGroup(string.format("%s has tasks %s. Subscribe to a task using the radio menu.",Mission:GetShortText(),TaskText),TaskGroup) +end +end +end +return true +end +end +do +TASK_A2G={ +ClassName="TASK_A2G" +} +function TASK_A2G:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskType,TaskBriefing) +local self=BASE:Inherit(self,TASK:New(Mission,SetGroup,TaskName,TaskType,TaskBriefing)) +self:F() +self.TargetSetUnit=TargetSetUnit +self.TaskType=TaskType +local Fsm=self:GetUnitProcess() +Fsm:AddTransition("Assigned","RouteToRendezVous","RoutingToRendezVous") +Fsm:AddProcess("RoutingToRendezVous","RouteToRendezVousPoint",ACT_ROUTE_POINT:New(),{Arrived="ArriveAtRendezVous"}) +Fsm:AddProcess("RoutingToRendezVous","RouteToRendezVousZone",ACT_ROUTE_ZONE:New(),{Arrived="ArriveAtRendezVous"}) +Fsm:AddTransition({"Arrived","RoutingToRendezVous"},"ArriveAtRendezVous","ArrivedAtRendezVous") +Fsm:AddTransition({"ArrivedAtRendezVous","HoldingAtRendezVous"},"Engage","Engaging") +Fsm:AddTransition({"ArrivedAtRendezVous","HoldingAtRendezVous"},"HoldAtRendezVous","HoldingAtRendezVous") +Fsm:AddProcess("Engaging","Account",ACT_ACCOUNT_DEADS:New(),{}) +Fsm:AddTransition("Engaging","RouteToTarget","Engaging") +Fsm:AddProcess("Engaging","RouteToTargetZone",ACT_ROUTE_ZONE:New(),{}) +Fsm:AddProcess("Engaging","RouteToTargetPoint",ACT_ROUTE_POINT:New(),{}) +Fsm:AddTransition("Engaging","RouteToTargets","Engaging") +Fsm:AddTransition("Rejected","Reject","Aborted") +Fsm:AddTransition("Failed","Fail","Failed") +function Fsm:onafterAssigned(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:RouteToRendezVous() +end +function Fsm:onafterRouteToRendezVous(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Task:GetRendezVousZone(TaskUnit)then +self:__RouteToRendezVousZone(0.1) +else +if Task:GetRendezVousCoordinate(TaskUnit)then +self:__RouteToRendezVousPoint(0.1) +else +self:__ArriveAtRendezVous(0.1) +end +end +end +function Fsm:OnAfterArriveAtRendezVous(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:__Engage(0.1) +end +function Fsm:onafterEngage(TaskUnit,Task) +self:F({self}) +self:__Account(0.1) +self:__RouteToTarget(0.1) +self:__RouteToTargets(-10) +end +function Fsm:onafterRouteToTarget(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Task:GetTargetZone(TaskUnit)then +self:__RouteToTargetZone(0.1) +else +local TargetUnit=Task.TargetSetUnit:GetFirst() +if TargetUnit then +local Coordinate=TargetUnit:GetPointVec3() +self:T({TargetCoordinate=Coordinate,Coordinate:GetX(),Coordinate:GetY(),Coordinate:GetZ()}) +Task:SetTargetCoordinate(Coordinate,TaskUnit) +end +self:__RouteToTargetPoint(0.1) +end +end +function Fsm:onafterRouteToTargets(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +local TargetUnit=Task.TargetSetUnit:GetFirst() +if TargetUnit then +Task:SetTargetCoordinate(TargetUnit:GetCoordinate(),TaskUnit) +end +self:__RouteToTargets(-10) +end +return self +end +function TASK_A2G:SetTargetSetUnit(TargetSetUnit) +self.TargetSetUnit=TargetSetUnit +end +function TASK_A2G:GetPlannedMenuText() +return self:GetStateString().." - "..self:GetTaskName().." ( "..self.TargetSetUnit:GetUnitTypesText().." )" +end +function TASK_A2G:SetRendezVousCoordinate(RendezVousCoordinate,RendezVousRange,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousPoint") +ActRouteRendezVous:SetCoordinate(RendezVousCoordinate) +ActRouteRendezVous:SetRange(RendezVousRange) +end +function TASK_A2G:GetRendezVousCoordinate(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousPoint") +return ActRouteRendezVous:GetCoordinate(),ActRouteRendezVous:GetRange() +end +function TASK_A2G:SetRendezVousZone(RendezVousZone,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousZone") +ActRouteRendezVous:SetZone(RendezVousZone) +end +function TASK_A2G:GetRendezVousZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousZone") +return ActRouteRendezVous:GetZone() +end +function TASK_A2G:SetTargetCoordinate(TargetCoordinate,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetPoint") +ActRouteTarget:SetCoordinate(TargetCoordinate) +end +function TASK_A2G:GetTargetCoordinate(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetPoint") +return ActRouteTarget:GetCoordinate() +end +function TASK_A2G:SetTargetZone(TargetZone,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetZone") +ActRouteTarget:SetZone(TargetZone) +end +function TASK_A2G:GetTargetZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetZone") +return ActRouteTarget:GetZone() +end +function TASK_A2G:SetGoalTotal() +self.GoalTotal=self.TargetSetUnit:CountAlive() +end +function TASK_A2G:GetGoalTotal() +return self.GoalTotal +end +function TASK_A2G:ReportOrder(ReportGroup) +self:UpdateTaskInfo(self.DetectedItem) +local Coordinate=self.TaskInfo:GetData("Coordinate") +local Distance=ReportGroup:GetCoordinate():Get2DDistance(Coordinate) +return Distance +end +function TASK_A2G:onafterGoal(TaskUnit,From,Event,To) +local TargetSetUnit=self.TargetSetUnit +if TargetSetUnit:CountAlive()==0 then +self:Success() +end +self:__Goal(-10) +end +function TASK_A2G:UpdateTaskInfo(DetectedItem) +if self:IsStatePlanned()or self:IsStateAssigned()then +local TargetCoordinate=DetectedItem and self.Detection:GetDetectedItemCoordinate(DetectedItem)or self.TargetSetUnit:GetFirst():GetCoordinate() +self.TaskInfo:AddTaskName(0,"MSOD") +self.TaskInfo:AddCoordinate(TargetCoordinate,1,"SOD") +local ThreatLevel,ThreatText +if DetectedItem then +ThreatLevel,ThreatText=self.Detection:GetDetectedItemThreatLevel(DetectedItem) +else +ThreatLevel,ThreatText=self.TargetSetUnit:CalculateThreatLevelA2G() +end +self.TaskInfo:AddThreat(ThreatText,ThreatLevel,10,"MOD",true) +if self.Detection then +local DetectedItemsCount=self.TargetSetUnit:CountAlive() +local ReportTypes=REPORT:New() +local TargetTypes={} +for TargetUnitName,TargetUnit in pairs(self.TargetSetUnit:GetSet())do +local TargetType=self.Detection:GetDetectedUnitTypeName(TargetUnit) +if not TargetTypes[TargetType]then +TargetTypes[TargetType]=TargetType +ReportTypes:Add(TargetType) +end +end +self.TaskInfo:AddTargetCount(DetectedItemsCount,11,"O",true) +self.TaskInfo:AddTargets(DetectedItemsCount,ReportTypes:Text(", "),20,"D",true) +else +local DetectedItemsCount=self.TargetSetUnit:CountAlive() +local DetectedItemsTypes=self.TargetSetUnit:GetTypeNames() +self.TaskInfo:AddTargetCount(DetectedItemsCount,11,"O",true) +self.TaskInfo:AddTargets(DetectedItemsCount,DetectedItemsTypes,20,"D",true) +end +self.TaskInfo:AddQFEAtCoordinate(TargetCoordinate,30,"MOD") +self.TaskInfo:AddTemperatureAtCoordinate(TargetCoordinate,31,"MD") +self.TaskInfo:AddWindAtCoordinate(TargetCoordinate,32,"MD") +end +end +function TASK_A2G:GetAutoAssignPriority(AutoAssignMethod,CommandCenter,TaskGroup) +if AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Random then +return math.random(1,9) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Distance then +local Coordinate=self.TaskInfo:GetData("Coordinate") +local Distance=Coordinate:Get2DDistance(CommandCenter:GetPositionable():GetCoordinate()) +self:F({Distance=Distance}) +return math.floor(Distance) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Priority then +return 1 +end +return 0 +end +end +do +TASK_A2G_SEAD={ +ClassName="TASK_A2G_SEAD" +} +function TASK_A2G_SEAD:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2G:New(Mission,SetGroup,TaskName,TargetSetUnit,"SEAD",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or"Execute a Suppression of Enemy Air Defenses.") +return self +end +function TASK_A2G_SEAD:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has SEADed a target.",Score) +return self +end +function TASK_A2G_SEAD:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All radar emitting targets have been successfully SEADed!",Score) +return self +end +function TASK_A2G_SEAD:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The SEADing has failed!",Penalty) +return self +end +end +do +TASK_A2G_BAI={ClassName="TASK_A2G_BAI"} +function TASK_A2G_BAI:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2G:New(Mission,SetGroup,TaskName,TargetSetUnit,"BAI",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or"Execute a Battlefield Air Interdiction of a group of enemy targets.") +return self +end +function TASK_A2G_BAI:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has destroyed a target in Battlefield Air Interdiction (BAI).",Score) +return self +end +function TASK_A2G_BAI:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All targets have been successfully destroyed! The Battlefield Air Interdiction (BAI) is a success!",Score) +return self +end +function TASK_A2G_BAI:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The Battlefield Air Interdiction (BAI) has failed!",Penalty) +return self +end +end +do +TASK_A2G_CAS={ClassName="TASK_A2G_CAS"} +function TASK_A2G_CAS:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2G:New(Mission,SetGroup,TaskName,TargetSetUnit,"CAS",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or("Execute a Close Air Support for a group of enemy targets. ".."Beware of friendlies at the vicinity! ")) +return self +end +function TASK_A2G_CAS:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has destroyed a target in Close Air Support (CAS).",Score) +return self +end +function TASK_A2G_CAS:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All targets have been successfully destroyed! The Close Air Support (CAS) was a success!",Score) +return self +end +function TASK_A2G_CAS:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The Close Air Support (CAS) has failed!",Penalty) +return self +end +end +do +TASK_A2A_DISPATCHER={ +ClassName="TASK_A2A_DISPATCHER", +Mission=nil, +Detection=nil, +Tasks={}, +SweepZones={}, +} +function TASK_A2A_DISPATCHER:New(Mission,SetGroup,Detection) +local self=BASE:Inherit(self,DETECTION_MANAGER:New(SetGroup,Detection)) +self.Detection=Detection +self.Mission=Mission +self.FlashNewTask=false +self.Detection:FilterCategories(Unit.Category.AIRPLANE,Unit.Category.HELICOPTER) +self.Detection:InitDetectRadar(true) +self.Detection:SetRefreshTimeInterval(30) +self:AddTransition("Started","Assign","Started") +self:__Start(5) +return self +end +function TASK_A2A_DISPATCHER:SetEngageRadius(EngageRadius) +self.Detection:SetFriendliesRange(EngageRadius or 100000) +return self +end +function TASK_A2A_DISPATCHER:SetSendMessages(onoff) +self.FlashNewTask=onoff +end +function TASK_A2A_DISPATCHER:EvaluateINTERCEPT(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +if DetectedItem.IsDetected==true then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2A_DISPATCHER:EvaluateSWEEP(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +if DetectedItem.IsDetected==false then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2A_DISPATCHER:EvaluateENGAGE(DetectedItem) +self:F({DetectedItem.ItemID}) +local DetectedSet=DetectedItem.Set +local DetectedZone=DetectedItem.Zone +local PlayersCount,PlayersReport=self:GetPlayerFriendliesNearBy(DetectedItem) +if PlayersCount>0 and DetectedItem.IsDetected==true then +local TargetSetUnit=SET_UNIT:New() +TargetSetUnit:SetDatabase(DetectedSet) +TargetSetUnit:FilterOnce() +return TargetSetUnit +end +return nil +end +function TASK_A2A_DISPATCHER:EvaluateRemoveTask(Mission,Task,Detection,DetectedItem,DetectedItemIndex,DetectedItemChanged) +if Task then +if Task:IsStatePlanned()then +local TaskName=Task:GetName() +local TaskType=TaskName:match("(%u+)%.%d+") +self:T2({TaskType=TaskType}) +local Remove=false +local IsPlayers=Detection:IsPlayersNearBy(DetectedItem) +if TaskType=="ENGAGE"then +if IsPlayers==false then +Remove=true +end +end +if TaskType=="INTERCEPT"then +if IsPlayers==true then +Remove=true +end +if DetectedItem.IsDetected==false then +Remove=true +end +end +if TaskType=="SWEEP"then +if DetectedItem.IsDetected==true then +Remove=true +end +end +local DetectedSet=DetectedItem.Set +if DetectedSet:Count()==0 then +Remove=true +end +if DetectedItemChanged==true or Remove then +Task=self:RemoveTask(DetectedItemIndex) +end +end +end +return Task +end +function TASK_A2A_DISPATCHER:GetFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local FriendlyUnitsNearBy=self.Detection:GetFriendliesNearBy(DetectedItem,Unit.Category.AIRPLANE) +local FriendlyTypes={} +local FriendliesCount=0 +if FriendlyUnitsNearBy then +local DetectedTreatLevel=DetectedSet:CalculateThreatLevelA2G() +for FriendlyUnitName,FriendlyUnitData in pairs(FriendlyUnitsNearBy)do +local FriendlyUnit=FriendlyUnitData +if FriendlyUnit:IsAirPlane()then +local FriendlyUnitThreatLevel=FriendlyUnit:GetThreatLevel() +FriendliesCount=FriendliesCount+1 +local FriendlyType=FriendlyUnit:GetTypeName() +FriendlyTypes[FriendlyType]=FriendlyTypes[FriendlyType]and(FriendlyTypes[FriendlyType]+1)or 1 +if DetectedTreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local FriendlyTypesReport=REPORT:New() +if FriendliesCount>0 then +for FriendlyType,FriendlyTypeCount in pairs(FriendlyTypes)do +FriendlyTypesReport:Add(string.format("%d of %s",FriendlyTypeCount,FriendlyType)) +end +else +FriendlyTypesReport:Add("-") +end +return FriendliesCount,FriendlyTypesReport +end +function TASK_A2A_DISPATCHER:GetPlayerFriendliesNearBy(DetectedItem) +local DetectedSet=DetectedItem.Set +local PlayersNearBy=self.Detection:GetPlayersNearBy(DetectedItem) +local PlayerTypes={} +local PlayersCount=0 +if PlayersNearBy then +local DetectedTreatLevel=DetectedSet:CalculateThreatLevelA2G() +for PlayerUnitName,PlayerUnitData in pairs(PlayersNearBy)do +local PlayerUnit=PlayerUnitData +local PlayerName=PlayerUnit:GetPlayerName() +if PlayerUnit:IsAirPlane()and PlayerName~=nil then +local FriendlyUnitThreatLevel=PlayerUnit:GetThreatLevel() +PlayersCount=PlayersCount+1 +local PlayerType=PlayerUnit:GetTypeName() +PlayerTypes[PlayerName]=PlayerType +if DetectedTreatLevel<FriendlyUnitThreatLevel+2 then +end +end +end +end +local PlayerTypesReport=REPORT:New() +if PlayersCount>0 then +for PlayerName,PlayerType in pairs(PlayerTypes)do +PlayerTypesReport:Add(string.format('"%s" in %s',PlayerName,PlayerType)) +end +else +PlayerTypesReport:Add("-") +end +return PlayersCount,PlayerTypesReport +end +function TASK_A2A_DISPATCHER:RemoveTask(TaskIndex) +self.Mission:RemoveTask(self.Tasks[TaskIndex]) +self.Tasks[TaskIndex]=nil +end +function TASK_A2A_DISPATCHER:ProcessDetected(Detection) +self:F() +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local Mission=self.Mission +if Mission:IsIDLE()or Mission:IsENGAGED()then +local TaskReport=REPORT:New() +for TaskIndex,TaskData in pairs(self.Tasks)do +local Task=TaskData +if Task:IsStatePlanned()then +local DetectedItem=Detection:GetDetectedItemByIndex(TaskIndex) +if not DetectedItem then +local TaskText=Task:GetName() +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +Mission:GetCommandCenter():MessageToGroup(string.format("Obsolete A2A task %s for %s removed.",TaskText,Mission:GetShortText()),TaskGroup) +end +Task=self:RemoveTask(TaskIndex) +end +end +end +for DetectedItemID,DetectedItem in pairs(Detection:GetDetectedItems())do +local DetectedItem=DetectedItem +local DetectedSet=DetectedItem.Set +local DetectedCount=DetectedSet:Count() +local DetectedZone=DetectedItem.Zone +local DetectedID=DetectedItem.ID +local TaskIndex=DetectedItem.Index +local DetectedItemChanged=DetectedItem.Changed +local Task=self.Tasks[TaskIndex] +Task=self:EvaluateRemoveTask(Mission,Task,Detection,DetectedItem,TaskIndex,DetectedItemChanged) +if not Task and DetectedCount>0 then +local TargetSetUnit=self:EvaluateENGAGE(DetectedItem) +if TargetSetUnit then +Task=TASK_A2A_ENGAGE:New(Mission,self.SetGroup,string.format("ENGAGE.%03d",DetectedID),TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +else +local TargetSetUnit=self:EvaluateINTERCEPT(DetectedItem) +if TargetSetUnit then +Task=TASK_A2A_INTERCEPT:New(Mission,self.SetGroup,string.format("INTERCEPT.%03d",DetectedID),TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +else +local TargetSetUnit=self:EvaluateSWEEP(DetectedItem) +if TargetSetUnit then +Task=TASK_A2A_SWEEP:New(Mission,self.SetGroup,string.format("SWEEP.%03d",DetectedID),TargetSetUnit) +Task:SetDetection(Detection,DetectedItem) +Task:UpdateTaskInfo(DetectedItem) +end +end +end +if Task then +self.Tasks[TaskIndex]=Task +Task:SetTargetZone(DetectedZone,DetectedItem.Coordinate.y,DetectedItem.Coordinate.Heading) +Task:SetDispatcher(self) +Mission:AddTask(Task) +function Task.OnEnterSuccess(Task,From,Event,To) +self:Success(Task) +end +function Task.OnEnterCancelled(Task,From,Event,To) +self:Cancelled(Task) +end +function Task.OnEnterFailed(Task,From,Event,To) +self:Failed(Task) +end +function Task.OnEnterAborted(Task,From,Event,To) +self:Aborted(Task) +end +TaskReport:Add(Task:GetName()) +else +self:F("This should not happen") +end +end +if Task then +local FriendliesCount,FriendliesReport=self:GetFriendliesNearBy(DetectedItem,Unit.Category.AIRPLANE) +Task.TaskInfo:AddText("Friendlies",string.format("%d ( %s )",FriendliesCount,FriendliesReport:Text(",")),40,"MOD") +local PlayersCount,PlayersReport=self:GetPlayerFriendliesNearBy(DetectedItem) +Task.TaskInfo:AddText("Players",string.format("%d ( %s )",PlayersCount,PlayersReport:Text(",")),40,"MOD") +end +Detection:AcceptChanges(DetectedItem) +end +Mission:GetCommandCenter():SetMenu() +local TaskText=TaskReport:Text(", ") +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if(not Mission:IsGroupAssigned(TaskGroup))and TaskText~=""and(self.FlashNewTask)then +Mission:GetCommandCenter():MessageToGroup(string.format("%s has tasks %s. Subscribe to a task using the radio menu.",Mission:GetShortText(),TaskText),TaskGroup) +end +end +end +return true +end +end +do +TASK_A2A={ +ClassName="TASK_A2A" +} +function TASK_A2A:New(Mission,SetAttack,TaskName,TargetSetUnit,TaskType,TaskBriefing) +local self=BASE:Inherit(self,TASK:New(Mission,SetAttack,TaskName,TaskType,TaskBriefing)) +self:F() +self.TargetSetUnit=TargetSetUnit +self.TaskType=TaskType +local Fsm=self:GetUnitProcess() +Fsm:AddTransition("Assigned","RouteToRendezVous","RoutingToRendezVous") +Fsm:AddProcess("RoutingToRendezVous","RouteToRendezVousPoint",ACT_ROUTE_POINT:New(),{Arrived="ArriveAtRendezVous"}) +Fsm:AddProcess("RoutingToRendezVous","RouteToRendezVousZone",ACT_ROUTE_ZONE:New(),{Arrived="ArriveAtRendezVous"}) +Fsm:AddTransition({"Arrived","RoutingToRendezVous"},"ArriveAtRendezVous","ArrivedAtRendezVous") +Fsm:AddTransition({"ArrivedAtRendezVous","HoldingAtRendezVous"},"Engage","Engaging") +Fsm:AddTransition({"ArrivedAtRendezVous","HoldingAtRendezVous"},"HoldAtRendezVous","HoldingAtRendezVous") +Fsm:AddProcess("Engaging","Account",ACT_ACCOUNT_DEADS:New(),{}) +Fsm:AddTransition("Engaging","RouteToTarget","Engaging") +Fsm:AddProcess("Engaging","RouteToTargetZone",ACT_ROUTE_ZONE:New(),{}) +Fsm:AddProcess("Engaging","RouteToTargetPoint",ACT_ROUTE_POINT:New(),{}) +Fsm:AddTransition("Engaging","RouteToTargets","Engaging") +Fsm:AddTransition("Rejected","Reject","Aborted") +Fsm:AddTransition("Failed","Fail","Failed") +function Fsm:OnLeaveAssigned(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:SelectAction() +end +function Fsm:onafterRouteToRendezVous(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Task:GetRendezVousZone(TaskUnit)then +self:__RouteToRendezVousZone(0.1) +else +if Task:GetRendezVousCoordinate(TaskUnit)then +self:__RouteToRendezVousPoint(0.1) +else +self:__ArriveAtRendezVous(0.1) +end +end +end +function Fsm:OnAfterArriveAtRendezVous(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:__Engage(0.1) +end +function Fsm:onafterEngage(TaskUnit,Task) +self:F({self}) +self:__Account(0.1) +self:__RouteToTarget(0.1) +self:__RouteToTargets(-10) +end +function Fsm:onafterRouteToTarget(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Task:GetTargetZone(TaskUnit)then +self:__RouteToTargetZone(0.1) +else +local TargetUnit=Task.TargetSetUnit:GetFirst() +if TargetUnit then +local Coordinate=TargetUnit:GetPointVec3() +self:T({TargetCoordinate=Coordinate,Coordinate:GetX(),Coordinate:GetAlt(),Coordinate:GetZ()}) +Task:SetTargetCoordinate(Coordinate,TaskUnit) +end +self:__RouteToTargetPoint(0.1) +end +end +function Fsm:onafterRouteToTargets(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +local TargetUnit=Task.TargetSetUnit:GetFirst() +if TargetUnit then +Task:SetTargetCoordinate(TargetUnit:GetCoordinate(),TaskUnit) +end +self:__RouteToTargets(-10) +end +return self +end +function TASK_A2A:SetTargetSetUnit(TargetSetUnit) +self.TargetSetUnit=TargetSetUnit +end +function TASK_A2A:GetPlannedMenuText() +return self:GetStateString().." - "..self:GetTaskName().." ( "..self.TargetSetUnit:GetUnitTypesText().." )" +end +function TASK_A2A:SetRendezVousCoordinate(RendezVousCoordinate,RendezVousRange,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousPoint") +ActRouteRendezVous:SetCoordinate(RendezVousCoordinate) +ActRouteRendezVous:SetRange(RendezVousRange) +end +function TASK_A2A:GetRendezVousCoordinate(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousPoint") +return ActRouteRendezVous:GetCoordinate(),ActRouteRendezVous:GetRange() +end +function TASK_A2A:SetRendezVousZone(RendezVousZone,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousZone") +ActRouteRendezVous:SetZone(RendezVousZone) +end +function TASK_A2A:GetRendezVousZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteRendezVous=ProcessUnit:GetProcess("RoutingToRendezVous","RouteToRendezVousZone") +return ActRouteRendezVous:GetZone() +end +function TASK_A2A:SetTargetCoordinate(TargetCoordinate,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetPoint") +ActRouteTarget:SetCoordinate(TargetCoordinate) +end +function TASK_A2A:GetTargetCoordinate(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetPoint") +return ActRouteTarget:GetCoordinate() +end +function TASK_A2A:SetTargetZone(TargetZone,Altitude,Heading,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetZone") +ActRouteTarget:SetZone(TargetZone,Altitude,Heading) +end +function TASK_A2A:GetTargetZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetZone") +return ActRouteTarget:GetZone() +end +function TASK_A2A:SetGoalTotal() +self.GoalTotal=self.TargetSetUnit:Count() +end +function TASK_A2A:GetGoalTotal() +return self.GoalTotal +end +function TASK_A2A:ReportOrder(ReportGroup) +self:UpdateTaskInfo(self.DetectedItem) +local Coordinate=self.TaskInfo:GetData("Coordinate") +local Distance=ReportGroup:GetCoordinate():Get2DDistance(Coordinate) +return Distance +end +function TASK_A2A:onafterGoal(TaskUnit,From,Event,To) +local TargetSetUnit=self.TargetSetUnit +if TargetSetUnit:Count()==0 then +self:Success() +end +self:__Goal(-10) +end +function TASK_A2A:UpdateTaskInfo(DetectedItem) +if self:IsStatePlanned()or self:IsStateAssigned()then +local TargetCoordinate=DetectedItem and self.Detection:GetDetectedItemCoordinate(DetectedItem)or self.TargetSetUnit:GetFirst():GetCoordinate() +self.TaskInfo:AddTaskName(0,"MSOD") +self.TaskInfo:AddCoordinate(TargetCoordinate,1,"SOD") +local ThreatLevel,ThreatText +if DetectedItem then +ThreatLevel,ThreatText=self.Detection:GetDetectedItemThreatLevel(DetectedItem) +else +ThreatLevel,ThreatText=self.TargetSetUnit:CalculateThreatLevelA2G() +end +self.TaskInfo:AddThreat(ThreatText,ThreatLevel,10,"MOD",true) +if self.Detection then +local DetectedItemsCount=self.TargetSetUnit:Count() +local ReportTypes=REPORT:New() +local TargetTypes={} +for TargetUnitName,TargetUnit in pairs(self.TargetSetUnit:GetSet())do +local TargetType=self.Detection:GetDetectedUnitTypeName(TargetUnit) +if not TargetTypes[TargetType]then +TargetTypes[TargetType]=TargetType +ReportTypes:Add(TargetType) +end +end +self.TaskInfo:AddTargetCount(DetectedItemsCount,11,"O",true) +self.TaskInfo:AddTargets(DetectedItemsCount,ReportTypes:Text(", "),20,"D",true) +else +local DetectedItemsCount=self.TargetSetUnit:Count() +local DetectedItemsTypes=self.TargetSetUnit:GetTypeNames() +self.TaskInfo:AddTargetCount(DetectedItemsCount,11,"O",true) +self.TaskInfo:AddTargets(DetectedItemsCount,DetectedItemsTypes,20,"D",true) +end +end +end +function TASK_A2A:GetAutoAssignPriority(AutoAssignMethod,CommandCenter,TaskGroup) +if AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Random then +return math.random(1,9) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Distance then +local Coordinate=self.TaskInfo:GetData("Coordinate") +local Distance=Coordinate:Get2DDistance(CommandCenter:GetPositionable():GetCoordinate()) +return math.floor(Distance) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Priority then +return 1 +end +return 0 +end +end +do +TASK_A2A_INTERCEPT={ +ClassName="TASK_A2A_INTERCEPT" +} +function TASK_A2A_INTERCEPT:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2A:New(Mission,SetGroup,TaskName,TargetSetUnit,"INTERCEPT",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or"Intercept incoming intruders.\n") +return self +end +function TASK_A2A_INTERCEPT:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has intercepted a target.",Score) +return self +end +function TASK_A2A_INTERCEPT:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All targets have been successfully intercepted!",Score) +return self +end +function TASK_A2A_INTERCEPT:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The intercept has failed!",Penalty) +return self +end +end +do +TASK_A2A_SWEEP={ +ClassName="TASK_A2A_SWEEP" +} +function TASK_A2A_SWEEP:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2A:New(Mission,SetGroup,TaskName,TargetSetUnit,"SWEEP",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or"Perform a fighter sweep. Incoming intruders were detected and could be hiding at the location.\n") +return self +end +function TASK_A2A_SWEEP:onafterGoal(TaskUnit,From,Event,To) +local TargetSetUnit=self.TargetSetUnit +if TargetSetUnit:Count()==0 then +self:Success() +end +self:__Goal(-10) +end +function TASK_A2A_SWEEP:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has sweeped a target.",Score) +return self +end +function TASK_A2A_SWEEP:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All targets have been successfully sweeped!",Score) +return self +end +function TASK_A2A_SWEEP:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The sweep has failed!",Penalty) +return self +end +end +do +TASK_A2A_ENGAGE={ +ClassName="TASK_A2A_ENGAGE" +} +function TASK_A2A_ENGAGE:New(Mission,SetGroup,TaskName,TargetSetUnit,TaskBriefing) +local self=BASE:Inherit(self,TASK_A2A:New(Mission,SetGroup,TaskName,TargetSetUnit,"ENGAGE",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:SetBriefing(TaskBriefing or"Bogeys are nearby! Players close by are ordered to ENGAGE the intruders!\n") +return self +end +function TASK_A2A_ENGAGE:SetScoreOnProgress(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","AccountForPlayer","Player "..PlayerName.." has engaged and destroyed a target.",Score) +return self +end +function TASK_A2A_ENGAGE:SetScoreOnSuccess(PlayerName,Score,TaskUnit) +self:F({PlayerName,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success","All targets have been successfully engaged!",Score) +return self +end +function TASK_A2A_ENGAGE:SetScoreOnFail(PlayerName,Penalty,TaskUnit) +self:F({PlayerName,Penalty,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed","The target engagement has failed!",Penalty) +return self +end +end +do +TASK_CARGO={ +ClassName="TASK_CARGO", +} +function TASK_CARGO:New(Mission,SetGroup,TaskName,SetCargo,TaskType,TaskBriefing) +local self=BASE:Inherit(self,TASK:New(Mission,SetGroup,TaskName,TaskType,TaskBriefing)) +self:F({Mission,SetGroup,TaskName,SetCargo,TaskType}) +self.SetCargo=SetCargo +self.TaskType=TaskType +self.SmokeColor=SMOKECOLOR.Red +self.CargoItemCount={} +self.CargoLimit=10 +self.DeployZones={} +self:AddTransition("*","CargoDeployed","*") +self:AddTransition("*","CargoPickedUp","*") +local Fsm=self:GetUnitProcess() +Fsm:AddTransition({"Planned","Assigned","Cancelled","WaitingForCommand","ArrivedAtPickup","ArrivedAtDeploy","Boarded","UnBoarded","Loaded","UnLoaded","Landed","Boarding"},"SelectAction","*") +Fsm:AddTransition("*","RouteToPickup","RoutingToPickup") +Fsm:AddProcess("RoutingToPickup","RouteToPickupPoint",ACT_ROUTE_POINT:New(),{Arrived="ArriveAtPickup",Cancelled="CancelRouteToPickup"}) +Fsm:AddTransition("Arrived","ArriveAtPickup","ArrivedAtPickup") +Fsm:AddTransition("Cancelled","CancelRouteToPickup","Cancelled") +Fsm:AddTransition("*","RouteToDeploy","RoutingToDeploy") +Fsm:AddProcess("RoutingToDeploy","RouteToDeployZone",ACT_ROUTE_ZONE:New(),{Arrived="ArriveAtDeploy",Cancelled="CancelRouteToDeploy"}) +Fsm:AddTransition("Arrived","ArriveAtDeploy","ArrivedAtDeploy") +Fsm:AddTransition("Cancelled","CancelRouteToDeploy","Cancelled") +Fsm:AddTransition({"ArrivedAtPickup","ArrivedAtDeploy","Landing"},"Land","Landing") +Fsm:AddTransition("Landing","Landed","Landed") +Fsm:AddTransition("*","PrepareBoarding","AwaitBoarding") +Fsm:AddTransition("AwaitBoarding","Board","Boarding") +Fsm:AddTransition("Boarding","Boarded","Boarded") +Fsm:AddTransition("*","Load","Loaded") +Fsm:AddTransition("*","PrepareUnBoarding","AwaitUnBoarding") +Fsm:AddTransition("AwaitUnBoarding","UnBoard","UnBoarding") +Fsm:AddTransition("UnBoarding","UnBoarded","UnBoarded") +Fsm:AddTransition("*","Unload","Unloaded") +Fsm:AddTransition("*","Planned","Planned") +Fsm:AddTransition("Deployed","Success","Success") +Fsm:AddTransition("Rejected","Reject","Aborted") +Fsm:AddTransition("Failed","Fail","Failed") +function Fsm:OnAfterAssigned(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:SelectAction() +end +function Fsm:onafterSelectAction(TaskUnit,Task) +local TaskUnitName=TaskUnit:GetName() +local MenuTime=Task:InitTaskControlMenu(TaskUnit) +local MenuControl=Task:GetTaskControlMenu(TaskUnit) +Task.SetCargo:ForEachCargo( +function(Cargo) +if Cargo:IsAlive()then +local TaskGroup=TaskUnit:GetGroup() +if Cargo:IsUnLoaded()then +local CargoBayFreeWeight=TaskUnit:GetCargoBayFreeWeight() +local CargoWeight=Cargo:GetWeight() +self:F({CargoBayFreeWeight=CargoBayFreeWeight}) +if CargoBayFreeWeight>CargoWeight then +if Cargo:IsInReportRadius(TaskUnit:GetPointVec2())then +local NotInDeployZones=true +for DeployZoneName,DeployZone in pairs(Task.DeployZones)do +if Cargo:IsInZone(DeployZone)then +NotInDeployZones=false +end +end +if NotInDeployZones then +if not TaskUnit:InAir()then +if Cargo:CanBoard()==true then +if Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +Cargo:Report("Ready for boarding.","board",TaskUnit:GetGroup()) +local BoardMenu=MENU_GROUP:New(TaskGroup,"Board cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,BoardMenu,self.MenuBoardCargo,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +else +Cargo:Report("Board at "..Cargo:GetCoordinate():ToString(TaskUnit:GetGroup().."."),"reporting",TaskUnit:GetGroup()) +end +else +if Cargo:CanLoad()==true then +if Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +Cargo:Report("Ready for loading.","load",TaskUnit:GetGroup()) +local LoadMenu=MENU_GROUP:New(TaskGroup,"Load cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,LoadMenu,self.MenuLoadCargo,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +else +Cargo:Report("Load at "..Cargo:GetCoordinate():ToString(TaskUnit:GetGroup()).." within "..Cargo.NearRadius..".","reporting",TaskUnit:GetGroup()) +end +else +if Cargo:CanSlingload()==true then +if Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +Cargo:Report("Ready for sling loading.","slingload",TaskUnit:GetGroup()) +local SlingloadMenu=MENU_GROUP:New(TaskGroup,"Slingload cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,SlingloadMenu,self.MenuLoadCargo,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +else +Cargo:Report("Slingload at "..Cargo:GetCoordinate():ToString(TaskUnit:GetGroup())..".","reporting",TaskUnit:GetGroup()) +end +end +end +end +else +Cargo:ReportResetAll(TaskUnit:GetGroup()) +end +end +else +if not Cargo:IsDeployed()==true then +local RouteToPickupMenu=MENU_GROUP:New(TaskGroup,"Route to pickup cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +Cargo:ReportResetAll(TaskUnit:GetGroup()) +if Cargo:CanBoard()==true then +if not Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +local BoardMenu=MENU_GROUP:New(TaskGroup,"Board cargo",RouteToPickupMenu):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,BoardMenu,self.MenuRouteToPickup,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +end +else +if Cargo:CanLoad()==true then +if not Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +local LoadMenu=MENU_GROUP:New(TaskGroup,"Load cargo",RouteToPickupMenu):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,LoadMenu,self.MenuRouteToPickup,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +end +else +if Cargo:CanSlingload()==true then +if not Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +local SlingloadMenu=MENU_GROUP:New(TaskGroup,"Slingload cargo",RouteToPickupMenu):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,SlingloadMenu,self.MenuRouteToPickup,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +end +end +end +end +end +end +end +for DeployZoneName,DeployZone in pairs(Task.DeployZones)do +if Cargo:IsInZone(DeployZone)then +Task:I({CargoIsDeployed=Task.CargoDeployed and"true"or"false"}) +if Cargo:IsDeployed()==false then +Cargo:SetDeployed(true) +Task:I({CargoIsAlive=Cargo:IsAlive()and"true"or"false"}) +if Cargo:IsAlive()then +Task:CargoDeployed(TaskUnit,Cargo,DeployZone) +end +end +end +end +end +if Cargo:IsLoaded()==true and Cargo:IsLoadedInCarrier(TaskUnit)==true then +if not TaskUnit:InAir()then +if Cargo:CanUnboard()==true then +local UnboardMenu=MENU_GROUP:New(TaskGroup,"Unboard cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,UnboardMenu,self.MenuUnboardCargo,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +else +if Cargo:CanUnload()==true then +local UnloadMenu=MENU_GROUP:New(TaskGroup,"Unload cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),Cargo.Name,UnloadMenu,self.MenuUnloadCargo,self,Cargo):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +end +end +end +end +for DeployZoneName,DeployZone in pairs(Task.DeployZones)do +if not Cargo:IsInZone(DeployZone)then +local RouteToDeployMenu=MENU_GROUP:New(TaskGroup,"Route to deploy cargo",MenuControl):SetTime(MenuTime):SetTag("Cargo") +MENU_GROUP_COMMAND:New(TaskUnit:GetGroup(),"Zone "..DeployZoneName,RouteToDeployMenu,self.MenuRouteToDeploy,self,DeployZone):SetTime(MenuTime):SetTag("Cargo"):SetRemoveParent() +end +end +end +end +) +Task:RefreshTaskControlMenu(TaskUnit,MenuTime,"Cargo") +self:__SelectAction(-1) +end +function Fsm:OnLeaveWaitingForCommand(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +end +function Fsm:MenuBoardCargo(Cargo) +self:__PrepareBoarding(1.0,Cargo) +end +function Fsm:MenuLoadCargo(Cargo) +self:__Load(1.0,Cargo) +end +function Fsm:MenuUnboardCargo(Cargo,DeployZone) +self:__PrepareUnBoarding(1.0,Cargo,DeployZone) +end +function Fsm:MenuUnloadCargo(Cargo,DeployZone) +self:__Unload(1.0,Cargo,DeployZone) +end +function Fsm:MenuRouteToPickup(Cargo) +self:__RouteToPickup(1.0,Cargo) +end +function Fsm:MenuRouteToDeploy(DeployZone) +self:__RouteToDeploy(1.0,DeployZone) +end +function Fsm:onafterRouteToPickup(TaskUnit,Task,From,Event,To,Cargo) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Cargo:IsAlive()then +self.Cargo=Cargo +Task:SetCargoPickup(self.Cargo,TaskUnit) +self:__RouteToPickupPoint(-0.1) +end +end +function Fsm:onafterArriveAtPickup(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if self.Cargo:IsAlive()then +if TaskUnit:IsAir()then +Task:GetMission():GetCommandCenter():MessageToGroup("Land",TaskUnit:GetGroup()) +self:__Land(-0.1,"Pickup") +else +self:__SelectAction(-0.1) +end +end +end +function Fsm:onafterCancelRouteToPickup(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +Task:GetMission():GetCommandCenter():MessageToGroup("Cancelled routing to Cargo "..self.Cargo:GetName(),TaskUnit:GetGroup()) +self:__SelectAction(-0.1) +end +function Fsm:onafterRouteToDeploy(TaskUnit,Task,From,Event,To,DeployZone) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:F(DeployZone) +self.DeployZone=DeployZone +Task:SetDeployZone(self.DeployZone,TaskUnit) +self:__RouteToDeployZone(-0.1) +end +function Fsm:onafterArriveAtDeploy(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if TaskUnit:IsAir()then +Task:GetMission():GetCommandCenter():MessageToGroup("Land",TaskUnit:GetGroup()) +self:__Land(-0.1,"Deploy") +else +self:__SelectAction(-0.1) +end +end +function Fsm:onafterCancelRouteToDeploy(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +Task:GetMission():GetCommandCenter():MessageToGroup("Cancelled routing to deploy zone "..self.DeployZone:GetName(),TaskUnit:GetGroup()) +self:__SelectAction(-0.1) +end +function Fsm:onafterLand(TaskUnit,Task,From,Event,To,Action) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Action=="Pickup"then +if self.Cargo:IsAlive()then +if self.Cargo:IsInReportRadius(TaskUnit:GetPointVec2())then +if TaskUnit:InAir()then +self:__Land(-10,Action) +else +Task:GetMission():GetCommandCenter():MessageToGroup("Landed at pickup location...",TaskUnit:GetGroup()) +self:__Landed(-0.1,Action) +end +else +self:__RouteToPickup(-0.1,self.Cargo) +end +end +else +if TaskUnit:IsAlive()then +if TaskUnit:IsInZone(self.DeployZone)then +if TaskUnit:InAir()then +self:__Land(-10,Action) +else +Task:GetMission():GetCommandCenter():MessageToGroup("Landed at deploy zone "..self.DeployZone:GetName(),TaskUnit:GetGroup()) +self:__Landed(-0.1,Action) +end +else +self:__RouteToDeploy(-0.1,self.Cargo) +end +end +end +end +function Fsm:onafterLanded(TaskUnit,Task,From,Event,To,Action) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Action=="Pickup"then +if self.Cargo:IsAlive()then +if self.Cargo:IsInReportRadius(TaskUnit:GetPointVec2())then +if TaskUnit:InAir()then +self:__Land(-0.1,Action) +else +self:__SelectAction(-0.1) +end +else +self:__RouteToPickup(-0.1,self.Cargo) +end +end +else +if TaskUnit:IsAlive()then +if TaskUnit:IsInZone(self.DeployZone)then +if TaskUnit:InAir()then +self:__Land(-10,Action) +else +self:__SelectAction(-0.1) +end +else +self:__RouteToDeploy(-0.1,self.Cargo) +end +end +end +end +function Fsm:onafterPrepareBoarding(TaskUnit,Task,From,Event,To,Cargo) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Cargo and Cargo:IsAlive()then +self:__Board(-0.1,Cargo) +end +end +function Fsm:onafterBoard(TaskUnit,Task,From,Event,To,Cargo) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +function Cargo:OnEnterLoaded(From,Event,To,TaskUnit,TaskProcess) +self:F({From,Event,To,TaskUnit,TaskProcess}) +TaskProcess:__Boarded(0.1,self) +end +if Cargo:IsAlive()then +if Cargo:IsInLoadRadius(TaskUnit:GetPointVec2())then +if TaskUnit:InAir()then +else +Cargo:MessageToGroup("Boarding ...",TaskUnit:GetGroup()) +if not Cargo:IsBoarding()then +Cargo:Board(TaskUnit,nil,self) +end +end +else +end +end +end +function Fsm:onafterBoarded(TaskUnit,Task,From,Event,To,Cargo) +local TaskUnitName=TaskUnit:GetName() +self:F({TaskUnit=TaskUnitName,Task=Task and Task:GetClassNameAndID()}) +Cargo:MessageToGroup("Boarded cargo "..Cargo:GetName(),TaskUnit:GetGroup()) +self:__Load(-0.1,Cargo) +end +function Fsm:onafterLoad(TaskUnit,Task,From,Event,To,Cargo) +local TaskUnitName=TaskUnit:GetName() +self:F({TaskUnit=TaskUnitName,Task=Task and Task:GetClassNameAndID()}) +if not Cargo:IsLoaded()then +Cargo:Load(TaskUnit) +end +Cargo:MessageToGroup("Loaded cargo "..Cargo:GetName(),TaskUnit:GetGroup()) +TaskUnit:AddCargo(Cargo) +Task:CargoPickedUp(TaskUnit,Cargo) +self:SelectAction(-1) +end +function Fsm:onafterPrepareUnBoarding(TaskUnit,Task,From,Event,To,Cargo) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID(),From,Event,To,Cargo}) +self.Cargo=Cargo +self.DeployZone=nil +if Cargo:IsAlive()then +for DeployZoneName,DeployZone in pairs(Task.DeployZones)do +if Cargo:IsInZone(DeployZone)then +self.DeployZone=DeployZone +break +end +end +self:__UnBoard(-0.1,Cargo,self.DeployZone) +end +end +function Fsm:onafterUnBoard(TaskUnit,Task,From,Event,To,Cargo,DeployZone) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID(),From,Event,To,Cargo,DeployZone}) +function self.Cargo:OnEnterUnLoaded(From,Event,To,DeployZone,TaskProcess) +self:F({From,Event,To,DeployZone,TaskProcess}) +TaskProcess:__UnBoarded(-0.1) +end +if self.Cargo:IsAlive()then +self.Cargo:MessageToGroup("UnBoarding ...",TaskUnit:GetGroup()) +if DeployZone then +self.Cargo:UnBoard(DeployZone:GetCoordinate():GetRandomCoordinateInRadius(25,10),400,self) +else +self.Cargo:UnBoard(TaskUnit:GetCoordinate():GetRandomCoordinateInRadius(25,10),400,self) +end +end +end +function Fsm:onafterUnBoarded(TaskUnit,Task) +local TaskUnitName=TaskUnit:GetName() +self:F({TaskUnit=TaskUnitName,Task=Task and Task:GetClassNameAndID()}) +self.Cargo:MessageToGroup("UnBoarded cargo "..self.Cargo:GetName(),TaskUnit:GetGroup()) +self:Unload(self.Cargo) +end +function Fsm:onafterUnload(TaskUnit,Task,From,Event,To,Cargo,DeployZone) +local TaskUnitName=TaskUnit:GetName() +self:F({TaskUnit=TaskUnitName,Task=Task and Task:GetClassNameAndID()}) +if not Cargo:IsUnLoaded()then +if DeployZone then +Cargo:UnLoad(DeployZone:GetCoordinate():GetRandomCoordinateInRadius(25,10),400,self) +else +Cargo:UnLoad(TaskUnit:GetCoordinate():GetRandomCoordinateInRadius(25,10),400,self) +end +end +TaskUnit:RemoveCargo(Cargo) +Cargo:MessageToGroup("Unloaded cargo "..Cargo:GetName(),TaskUnit:GetGroup()) +self:Planned() +self:__SelectAction(1) +end +return self +end +function TASK_CARGO:SetCargoLimit(CargoLimit) +self.CargoLimit=CargoLimit +return self +end +function TASK_CARGO:SetSmokeColor(SmokeColor) +if SmokeColor==nil then +self.SmokeColor=SMOKECOLOR.Red +elseif type(SmokeColor)=="number"then +self:F2(SmokeColor) +if SmokeColor>0 and SmokeColor<=5 then +self.SmokeColor=SMOKECOLOR.SmokeColor +end +end +end +function TASK_CARGO:GetSmokeColor() +return self.SmokeColor +end +function TASK_CARGO:GetPlannedMenuText() +return self:GetStateString().." - "..self:GetTaskName().." ( "..self.TargetSetUnit:GetUnitTypesText().." )" +end +function TASK_CARGO:GetCargoSet() +return self.SetCargo +end +function TASK_CARGO:GetDeployZones() +return self.DeployZones +end +function TASK_CARGO:SetCargoPickup(Cargo,TaskUnit) +self:F({Cargo,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local MenuTime=self:InitTaskControlMenu(TaskUnit) +local MenuControl=self:GetTaskControlMenu(TaskUnit) +local ActRouteCargo=ProcessUnit:GetProcess("RoutingToPickup","RouteToPickupPoint") +ActRouteCargo:Reset() +ActRouteCargo:SetCoordinate(Cargo:GetCoordinate()) +ActRouteCargo:SetRange(Cargo:GetLoadRadius()) +ActRouteCargo:SetMenuCancel(TaskUnit:GetGroup(),"Cancel Routing to Cargo "..Cargo:GetName(),MenuControl,MenuTime,"Cargo") +ActRouteCargo:Start() +return self +end +function TASK_CARGO:SetDeployZone(DeployZone,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local MenuTime=self:InitTaskControlMenu(TaskUnit) +local MenuControl=self:GetTaskControlMenu(TaskUnit) +local ActRouteDeployZone=ProcessUnit:GetProcess("RoutingToDeploy","RouteToDeployZone") +ActRouteDeployZone:Reset() +ActRouteDeployZone:SetZone(DeployZone) +ActRouteDeployZone:SetMenuCancel(TaskUnit:GetGroup(),"Cancel Routing to Deploy Zone"..DeployZone:GetName(),MenuControl,MenuTime,"Cargo") +ActRouteDeployZone:Start() +return self +end +function TASK_CARGO:AddDeployZone(DeployZone,TaskUnit) +self.DeployZones[DeployZone:GetName()]=DeployZone +return self +end +function TASK_CARGO:RemoveDeployZone(DeployZone,TaskUnit) +self.DeployZones[DeployZone:GetName()]=nil +return self +end +function TASK_CARGO:SetDeployZones(DeployZones,TaskUnit) +for DeployZoneID,DeployZone in pairs(DeployZones or{})do +self.DeployZones[DeployZone:GetName()]=DeployZone +end +return self +end +function TASK_CARGO:GetTargetZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteTarget=ProcessUnit:GetProcess("Engaging","RouteToTargetZone") +return ActRouteTarget:GetZone() +end +function TASK_CARGO:SetScoreOnProgress(Text,Score,TaskUnit) +self:F({Text,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScoreProcess("Engaging","Account","Account",Text,Score) +return self +end +function TASK_CARGO:SetScoreOnSuccess(Text,Score,TaskUnit) +self:F({Text,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Success",Text,Score) +return self +end +function TASK_CARGO:SetScoreOnFail(Text,Penalty,TaskUnit) +self:F({Text,Score,TaskUnit}) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +ProcessUnit:AddScore("Failed",Text,Penalty) +return self +end +function TASK_CARGO:SetGoalTotal() +self.GoalTotal=self.SetCargo:Count() +end +function TASK_CARGO:GetGoalTotal() +return self.GoalTotal +end +function TASK_CARGO:UpdateTaskInfo() +if self:IsStatePlanned()or self:IsStateAssigned()then +self.TaskInfo:AddTaskName(0,"MSOD") +self.TaskInfo:AddCargoSet(self.SetCargo,10,"SOD",true) +local Coordinates={} +for CargoName,Cargo in pairs(self.SetCargo:GetSet())do +local Cargo=Cargo +if not Cargo:IsLoaded()then +Coordinates[#Coordinates+1]=Cargo:GetCoordinate() +end +end +self.TaskInfo:AddCoordinates(Coordinates,1,"M") +end +end +function TASK_CARGO:ReportOrder(ReportGroup) +return 0 +end +function TASK_CARGO:GetAutoAssignPriority(AutoAssignMethod,TaskGroup) +if AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Random then +return math.random(1,9) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Distance then +return 0 +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Priority then +return 1 +end +return 0 +end +end +do +TASK_CARGO_TRANSPORT={ +ClassName="TASK_CARGO_TRANSPORT", +} +function TASK_CARGO_TRANSPORT:New(Mission,SetGroup,TaskName,SetCargo,TaskBriefing) +local self=BASE:Inherit(self,TASK_CARGO:New(Mission,SetGroup,TaskName,SetCargo,"Transport",TaskBriefing)) +self:F() +Mission:AddTask(self) +local Fsm=self:GetUnitProcess() +local CargoReport=REPORT:New("Transport Cargo. The following cargo needs to be transported including initial positions:") +SetCargo:ForEachCargo( +function(Cargo) +local CargoType=Cargo:GetType() +local CargoName=Cargo:GetName() +local CargoCoordinate=Cargo:GetCoordinate() +CargoReport:Add(string.format('- "%s" (%s) at %s',CargoName,CargoType,CargoCoordinate:ToStringMGRS())) +end +) +self:SetBriefing( +TaskBriefing or +CargoReport:Text() +) +return self +end +function TASK_CARGO_TRANSPORT:ReportOrder(ReportGroup) +return 0 +end +function TASK_CARGO_TRANSPORT:IsAllCargoTransported() +local CargoSet=self:GetCargoSet() +local Set=CargoSet:GetSet() +local DeployZones=self:GetDeployZones() +local CargoDeployed=true +for CargoID,CargoData in pairs(Set)do +local Cargo=CargoData +self:F({Cargo=Cargo:GetName(),CargoDeployed=Cargo:IsDeployed()}) +if Cargo:IsDeployed()then +else +CargoDeployed=false +end +end +self:F({CargoDeployed=CargoDeployed}) +return CargoDeployed +end +function TASK_CARGO_TRANSPORT:onafterGoal(TaskUnit,From,Event,To) +local CargoSet=self.CargoSet +if self:IsAllCargoTransported()then +self:Success() +end +self:__Goal(-10) +end +end +do +TASK_CARGO_CSAR={ +ClassName="TASK_CARGO_CSAR", +} +function TASK_CARGO_CSAR:New(Mission,SetGroup,TaskName,SetCargo,TaskBriefing) +local self=BASE:Inherit(self,TASK_CARGO:New(Mission,SetGroup,TaskName,SetCargo,"CSAR",TaskBriefing)) +self:F() +Mission:AddTask(self) +self:AddTransition("*","CargoPickedUp","*") +self:AddTransition("*","CargoDeployed","*") +self:F({CargoDeployed=self.CargoDeployed~=nil and"true"or"false"}) +local Fsm=self:GetUnitProcess() +local CargoReport=REPORT:New("Rescue a downed pilot from the following position:") +SetCargo:ForEachCargo( +function(Cargo) +local CargoType=Cargo:GetType() +local CargoName=Cargo:GetName() +local CargoCoordinate=Cargo:GetCoordinate() +CargoReport:Add(string.format('- "%s" (%s) at %s',CargoName,CargoType,CargoCoordinate:ToStringMGRS())) +end +) +self:SetBriefing( +TaskBriefing or +CargoReport:Text() +) +return self +end +function TASK_CARGO_CSAR:ReportOrder(ReportGroup) +return 0 +end +function TASK_CARGO_CSAR:IsAllCargoTransported() +local CargoSet=self:GetCargoSet() +local Set=CargoSet:GetSet() +local DeployZones=self:GetDeployZones() +local CargoDeployed=true +for CargoID,CargoData in pairs(Set)do +local Cargo=CargoData +self:F({Cargo=Cargo:GetName(),CargoDeployed=Cargo:IsDeployed()}) +if Cargo:IsDeployed()then +else +CargoDeployed=false +end +end +self:F({CargoDeployed=CargoDeployed}) +return CargoDeployed +end +function TASK_CARGO_CSAR:onafterGoal(TaskUnit,From,Event,To) +local CargoSet=self.CargoSet +if self:IsAllCargoTransported()then +self:Success() +end +self:__Goal(-10) +end +end +do +TASK_CARGO_DISPATCHER={ +ClassName="TASK_CARGO_DISPATCHER", +Mission=nil, +Tasks={}, +CSAR={}, +CSARSpawned=0, +Transport={}, +TransportCount=0, +} +function TASK_CARGO_DISPATCHER:New(Mission,SetGroup) +local self=BASE:Inherit(self,TASK_MANAGER:New(SetGroup)) +self.Mission=Mission +self:AddTransition("Started","Assign","Started") +self:AddTransition("Started","CargoPickedUp","Started") +self:AddTransition("Started","CargoDeployed","Started") +self:SetCSARRadius() +self:__StartTasks(5) +self.MaxCSAR=nil +self.CountCSAR=0 +self:HandleEvent(EVENTS.Ejection) +return self +end +function TASK_CARGO_DISPATCHER:SetCSARZones(SetZonesCSAR) +self.SetZonesCSAR=SetZonesCSAR +end +function TASK_CARGO_DISPATCHER:SetMaxCSAR(MaxCSAR) +self.MaxCSAR=MaxCSAR +end +function TASK_CARGO_DISPATCHER:OnEventEjection(EventData) +self:F({EventData=EventData}) +if self.CSARTasks==true then +local CSARCoordinate=EventData.IniUnit:GetCoordinate() +local CSARCoalition=EventData.IniUnit:GetCoalition() +local CSARCountry=EventData.IniUnit:GetCountry() +local CSARHeading=EventData.IniUnit:GetHeading() +if CSARCoalition==self.Mission:GetCommandCenter():GetCoalition()then +if not self.SetZonesCSAR or(self.SetZonesCSAR and self.SetZonesCSAR:IsCoordinateInZone(CSARCoordinate))then +if not self.MaxCSAR or(self.MaxCSAR and self.CountCSAR<self.MaxCSAR)then +local CSARTaskName=self:AddCSARTask(self.CSARTaskName,CSARCoordinate,CSARHeading,CSARCountry,self.CSARBriefing) +self:SetCSARDeployZones(CSARTaskName,self.CSARDeployZones) +self.CountCSAR=self.CountCSAR+1 +end +end +end +end +return self +end +function TASK_CARGO_DISPATCHER:SetDefaultDeployZone(DefaultDeployZone) +self.DefaultDeployZones={DefaultDeployZone} +return self +end +function TASK_CARGO_DISPATCHER:SetDefaultDeployZones(DefaultDeployZones) +self.DefaultDeployZones=DefaultDeployZones +return self +end +function TASK_CARGO_DISPATCHER:StartCSARTasks(CSARTaskName,CSARDeployZones,CSARBriefing) +if not self.CSARTasks then +self.CSARTasks=true +self.CSARTaskName=CSARTaskName +self.CSARDeployZones=CSARDeployZones +self.CSARBriefing=CSARBriefing +else +error("TASK_CARGO_DISPATCHER: The generation of CSAR tasks has already started.") +end +return self +end +function TASK_CARGO_DISPATCHER:StopCSARTasks() +if self.CSARTasks then +self.CSARTasks=nil +self.CSARTaskName=nil +self.CSARDeployZones=nil +self.CSARBriefing=nil +else +error("TASK_CARGO_DISPATCHER: The generation of CSAR tasks was not yet started.") +end +return self +end +function TASK_CARGO_DISPATCHER:AddCSARTask(CSARTaskPrefix,CSARCoordinate,CSARHeading,CSARCountry,CSARBriefing) +local CSARCoalition=self.Mission:GetCommandCenter():GetCoalition() +CSARHeading=CSARHeading or 0 +CSARCountry=CSARCountry or self.Mission:GetCommandCenter():GetCountry() +self.CSARSpawned=self.CSARSpawned+1 +local CSARTaskName=string.format((CSARTaskPrefix or"CSAR")..".%03d",self.CSARSpawned) +local Template={ +["visible"]=false, +["hidden"]=false, +["task"]="Ground Nothing", +["name"]=string.format("CSAR Pilot#%03d",self.CSARSpawned), +["x"]=CSARCoordinate.x, +["y"]=CSARCoordinate.z, +["units"]= +{ +[1]= +{ +["type"]=(CSARCoalition==coalition.side.BLUE)and"Soldier M4"or"Infantry AK", +["name"]=string.format("CSAR Pilot#%03d-01",self.CSARSpawned), +["skill"]="Excellent", +["playerCanDrive"]=false, +["x"]=CSARCoordinate.x, +["y"]=CSARCoordinate.z, +["heading"]=CSARHeading, +}, +}, +} +local CSARGroup=GROUP:NewTemplate(Template,CSARCoalition,Group.Category.GROUND,CSARCountry) +self.CSAR[CSARTaskName]={} +self.CSAR[CSARTaskName].PilotGroup=CSARGroup +self.CSAR[CSARTaskName].Briefing=CSARBriefing +self.CSAR[CSARTaskName].Task=nil +self.CSAR[CSARTaskName].TaskPrefix=CSARTaskPrefix +return CSARTaskName +end +function TASK_CARGO_DISPATCHER:SetCSARRadius(CSARRadius) +self.CSARRadius=CSARRadius or 50000 +return self +end +function TASK_CARGO_DISPATCHER:SetCSARDeployZone(CSARTaskName,CSARDeployZone) +if CSARTaskName then +self.CSAR[CSARTaskName].DeployZones={CSARDeployZone} +end +return self +end +function TASK_CARGO_DISPATCHER:SetCSARDeployZones(CSARTaskName,CSARDeployZones) +if CSARTaskName and self.CSAR[CSARTaskName]then +self.CSAR[CSARTaskName].DeployZones=CSARDeployZones +end +return self +end +function TASK_CARGO_DISPATCHER:AddTransportTask(TaskPrefix,SetCargo,Briefing,Silent) +self.TransportCount=self.TransportCount+1 +local verbose=Silent or false +local TaskName=string.format((TaskPrefix or"Transport")..".%03d",self.TransportCount) +self.Transport[TaskName]={} +self.Transport[TaskName].SetCargo=SetCargo +self.Transport[TaskName].Briefing=Briefing +self.Transport[TaskName].Task=nil +self.Transport[TaskName].TaskPrefix=TaskPrefix +self:ManageTasks(verbose) +return self.Transport[TaskName]and self.Transport[TaskName].Task +end +function TASK_CARGO_DISPATCHER:SetTransportDeployZone(Task,TransportDeployZone) +if self.Transport[Task.TaskName]then +self.Transport[Task.TaskName].DeployZones={TransportDeployZone} +else +error("Task does not exist") +end +self:ManageTasks() +return self +end +function TASK_CARGO_DISPATCHER:SetTransportDeployZones(Task,TransportDeployZones) +if self.Transport[Task.TaskName]then +self.Transport[Task.TaskName].DeployZones=TransportDeployZones +else +error("Task does not exist") +end +self:ManageTasks() +return self +end +function TASK_CARGO_DISPATCHER:EvaluateCSAR(CSARUnit) +local CSARCargo=CARGO_GROUP:New(CSARUnit,"Pilot",CSARUnit:GetName(),80,1500,10) +local SetCargo=SET_CARGO:New() +SetCargo:AddCargosByName(CSARUnit:GetName()) +SetCargo:Flush(self) +return SetCargo +end +function TASK_CARGO_DISPATCHER:ManageTasks(Silent) +self:F() +local verbose=Silent and true +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local Mission=self.Mission +if Mission:IsIDLE()or Mission:IsENGAGED()then +local TaskReport=REPORT:New() +for TaskIndex,TaskData in pairs(self.Tasks)do +local Task=TaskData +if Task:IsStatePlanned()then +end +end +for CSARName,CSAR in pairs(self.CSAR)do +if not CSAR.Task then +local SetCargo=self:EvaluateCSAR(CSAR.PilotGroup) +CSAR.Task=TASK_CARGO_CSAR:New(Mission,self.SetGroup,CSARName,SetCargo,CSAR.Briefing) +CSAR.Task.TaskPrefix=CSAR.TaskPrefix +Mission:AddTask(CSAR.Task) +TaskReport:Add(CSARName) +if CSAR.DeployZones then +CSAR.Task:SetDeployZones(CSAR.DeployZones or{}) +else +CSAR.Task:SetDeployZones(self.DefaultDeployZones or{}) +end +function CSAR.Task.OnAfterCargoPickedUp(Task,From,Event,To,TaskUnit,Cargo) +self:CargoPickedUp(Task,Task.TaskPrefix,TaskUnit,Cargo) +end +function CSAR.Task.OnAfterCargoDeployed(Task,From,Event,To,TaskUnit,Cargo,DeployZone) +self:CargoDeployed(Task,Task.TaskPrefix,TaskUnit,Cargo,DeployZone) +end +end +end +for TransportName,Transport in pairs(self.Transport)do +if not Transport.Task then +Transport.Task=TASK_CARGO_TRANSPORT:New(Mission,self.SetGroup,TransportName,Transport.SetCargo,Transport.Briefing) +Transport.Task.TaskPrefix=Transport.TaskPrefix +Mission:AddTask(Transport.Task) +TaskReport:Add(TransportName) +function Transport.Task.OnEnterSuccess(Task,From,Event,To) +self:Success(Task) +end +function Transport.Task.OnEnterCancelled(Task,From,Event,To) +self:Cancelled(Task) +end +function Transport.Task.OnEnterFailed(Task,From,Event,To) +self:Failed(Task) +end +function Transport.Task.OnEnterAborted(Task,From,Event,To) +self:Aborted(Task) +end +function Transport.Task.OnAfterCargoPickedUp(Task,From,Event,To,TaskUnit,Cargo) +self:CargoPickedUp(Task,Task.TaskPrefix,TaskUnit,Cargo) +end +function Transport.Task.OnAfterCargoDeployed(Task,From,Event,To,TaskUnit,Cargo,DeployZone) +self:CargoDeployed(Task,Task.TaskPrefix,TaskUnit,Cargo,DeployZone) +end +end +if Transport.DeployZones then +Transport.Task:SetDeployZones(Transport.DeployZones or{}) +else +Transport.Task:SetDeployZones(self.DefaultDeployZones or{}) +end +end +Mission:GetCommandCenter():SetMenu() +local TaskText=TaskReport:Text(", ") +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if(not Mission:IsGroupAssigned(TaskGroup))and TaskText~=""and not verbose then +Mission:GetCommandCenter():MessageToGroup(string.format("%s has tasks %s. Subscribe to a task using the radio menu.",Mission:GetShortText(),TaskText),TaskGroup) +end +end +end +return true +end +end +do +TASK_ZONE_GOAL={ +ClassName="TASK_ZONE_GOAL", +} +function TASK_ZONE_GOAL:New(Mission,SetGroup,TaskName,ZoneGoal,TaskType,TaskBriefing) +local self=BASE:Inherit(self,TASK:New(Mission,SetGroup,TaskName,TaskType,TaskBriefing)) +self:F() +self.ZoneGoal=ZoneGoal +self.TaskType=TaskType +local Fsm=self:GetUnitProcess() +Fsm:AddTransition("Assigned","StartMonitoring","Monitoring") +Fsm:AddTransition("Monitoring","Monitor","Monitoring",{}) +Fsm:AddProcess("Monitoring","RouteToZone",ACT_ROUTE_ZONE:New(),{}) +Fsm:AddTransition("Rejected","Reject","Aborted") +Fsm:AddTransition("Failed","Fail","Failed") +self:SetTargetZone(self.ZoneGoal:GetZone()) +function Fsm:OnAfterAssigned(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +self:__StartMonitoring(0.1) +self:__RouteToZone(0.1) +end +function Fsm:onafterStartMonitoring(TaskUnit,Task) +self:F({self}) +self:__Monitor(0.1) +end +function Fsm:onafterMonitor(TaskUnit,Task) +self:F({self}) +self:__Monitor(15) +end +function Fsm:onafterRouteTo(TaskUnit,Task) +self:F({TaskUnit=TaskUnit,Task=Task and Task:GetClassNameAndID()}) +if Task:GetTargetZone(TaskUnit)then +self:__RouteToZone(0.1) +end +end +return self +end +function TASK_ZONE_GOAL:SetProtect(ZoneGoal) +self.ZoneGoal=ZoneGoal +end +function TASK_ZONE_GOAL:GetPlannedMenuText() +return self:GetStateString().." - "..self:GetTaskName().." ( "..self.ZoneGoal:GetZoneName().." )" +end +function TASK_ZONE_GOAL:SetTargetZone(TargetZone,TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteZone=ProcessUnit:GetProcess("Monitoring","RouteToZone") +ActRouteZone:SetZone(TargetZone) +end +function TASK_ZONE_GOAL:GetTargetZone(TaskUnit) +local ProcessUnit=self:GetUnitProcess(TaskUnit) +local ActRouteZone=ProcessUnit:GetProcess("Monitoring","RouteToZone") +return ActRouteZone:GetZone() +end +function TASK_ZONE_GOAL:SetGoalTotal(GoalTotal) +self.GoalTotal=GoalTotal +end +function TASK_ZONE_GOAL:GetGoalTotal() +return self.GoalTotal +end +end +do +TASK_CAPTURE_ZONE={ +ClassName="TASK_CAPTURE_ZONE", +} +function TASK_CAPTURE_ZONE:New(Mission,SetGroup,TaskName,ZoneGoalCoalition,TaskBriefing) +local self=BASE:Inherit(self,TASK_ZONE_GOAL:New(Mission,SetGroup,TaskName,ZoneGoalCoalition,"CAPTURE",TaskBriefing)) +self:F() +Mission:AddTask(self) +self.TaskCoalition=ZoneGoalCoalition:GetCoalition() +self.TaskCoalitionName=ZoneGoalCoalition:GetCoalitionName() +self.TaskZoneName=ZoneGoalCoalition:GetZoneName() +ZoneGoalCoalition:MonitorDestroyedUnits() +self:SetBriefing( +TaskBriefing or +"Capture Zone "..self.TaskZoneName +) +self:UpdateTaskInfo(true) +self:SetGoal(self.ZoneGoal.Goal) +return self +end +function TASK_CAPTURE_ZONE:UpdateTaskInfo(Persist) +Persist=Persist or false +local ZoneCoordinate=self.ZoneGoal:GetZone():GetCoordinate() +self.TaskInfo:AddTaskName(0,"MSOD",Persist) +self.TaskInfo:AddCoordinate(ZoneCoordinate,1,"SOD",Persist) +local SetUnit=self.ZoneGoal:GetScannedSetUnit() +local ThreatLevel,ThreatText=SetUnit:CalculateThreatLevelA2G() +local ThreatCount=SetUnit:Count() +self.TaskInfo:AddThreat(ThreatText,ThreatLevel,20,"MOD",Persist) +self.TaskInfo:AddInfo("Remaining Units",ThreatCount,21,"MOD",Persist,true) +if self.Dispatcher then +local DefenseTaskCaptureDispatcher=self.Dispatcher:GetDefenseTaskCaptureDispatcher() +if DefenseTaskCaptureDispatcher then +for TaskName,CaptureZone in pairs(DefenseTaskCaptureDispatcher.Zones or{})do +local Task=CaptureZone.Task +if Task and Task:IsStateAssigned()then +self.TaskInfo:AddInfo("Defense Player Zone",Task.ZoneGoal:GetName(),30,"MOD",Persist) +self.TaskInfo:AddCoordinate(Task.ZoneGoal:GetZone():GetCoordinate(),31,"MOD",Persist,false,"Defense Player Coordinate") +end +end +end +local DefenseAIA2GDispatcher=self.Dispatcher:GetDefenseAIA2GDispatcher() +if DefenseAIA2GDispatcher then +for Defender,Task in pairs(DefenseAIA2GDispatcher:GetDefenderTasks()or{})do +local DetectedItem=DefenseAIA2GDispatcher:GetDefenderTaskTarget(Defender) +if DetectedItem then +local DetectedZone=DefenseAIA2GDispatcher.Detection:GetDetectedItemZone(DetectedItem) +if DetectedZone then +self.TaskInfo:AddInfo("Defense AI Zone",DetectedZone:GetName(),40,"MOD",Persist) +self.TaskInfo:AddCoordinate(DetectedZone:GetCoordinate(),41,"MOD",Persist,false,"Defense AI Coordinate") +end +end +end +end +end +end +function TASK_CAPTURE_ZONE:ReportOrder(ReportGroup) +local Coordinate=self.TaskInfo:GetCoordinate() +local Distance=ReportGroup:GetCoordinate():Get2DDistance(Coordinate) +return Distance +end +function TASK_CAPTURE_ZONE:OnAfterGoal(From,Event,To,PlayerUnit,PlayerName) +self:F({PlayerUnit=PlayerUnit,Achieved=self.ZoneGoal.Goal:IsAchieved()}) +if self.ZoneGoal then +if self.ZoneGoal.Goal:IsAchieved()then +local TotalContributions=self.ZoneGoal.Goal:GetTotalContributions() +local PlayerContributions=self.ZoneGoal.Goal:GetPlayerContributions() +self:F({TotalContributions=TotalContributions,PlayerContributions=PlayerContributions}) +for PlayerName,PlayerContribution in pairs(PlayerContributions)do +local Scoring=self:GetScoring() +if Scoring then +Scoring:_AddMissionGoalScore(self.Mission,PlayerName,"Zone "..self.ZoneGoal:GetZoneName().." captured",PlayerContribution*200/TotalContributions) +end +end +self:Success() +end +end +self:__Goal(-10,PlayerUnit,PlayerName) +end +function TASK_CAPTURE_ZONE:GetAutoAssignPriority(AutoAssignMethod,CommandCenter,TaskGroup,AutoAssignReference) +if AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Random then +return math.random(1,9) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Distance then +local Coordinate=self.TaskInfo:GetCoordinate() +local Distance=Coordinate:Get2DDistance(CommandCenter:GetPositionable():GetCoordinate()) +return math.floor(Distance) +elseif AutoAssignMethod==COMMANDCENTER.AutoAssignMethods.Priority then +return 1 +end +return 0 +end +end +do +TASK_CAPTURE_DISPATCHER={ +ClassName="TASK_CAPTURE_DISPATCHER", +Mission=nil, +Tasks={}, +Zones={}, +ZoneCount=0, +} +TASK_CAPTURE_DISPATCHER.AI_A2G_Dispatcher=nil +function TASK_CAPTURE_DISPATCHER:New(Mission,SetGroup) +local self=BASE:Inherit(self,TASK_MANAGER:New(SetGroup)) +self.Mission=Mission +self.FlashNewTask=false +self:AddTransition("Started","Assign","Started") +self:AddTransition("Started","ZoneCaptured","Started") +self:__StartTasks(5) +return self +end +function TASK_CAPTURE_DISPATCHER:SetDefenseTaskCaptureDispatcher(DefenseTaskCaptureDispatcher) +self.DefenseTaskCaptureDispatcher=DefenseTaskCaptureDispatcher +end +function TASK_CAPTURE_DISPATCHER:GetDefenseTaskCaptureDispatcher() +return self.DefenseTaskCaptureDispatcher +end +function TASK_CAPTURE_DISPATCHER:SetDefenseAIA2GDispatcher(DefenseAIA2GDispatcher) +self.DefenseAIA2GDispatcher=DefenseAIA2GDispatcher +end +function TASK_CAPTURE_DISPATCHER:GetDefenseAIA2GDispatcher() +return self.DefenseAIA2GDispatcher +end +function TASK_CAPTURE_DISPATCHER:AddCaptureZoneTask(TaskPrefix,CaptureZone,Briefing) +local TaskName=TaskPrefix or"Capture" +if self.Zones[TaskName]then +self.ZoneCount=self.ZoneCount+1 +TaskName=string.format("%s.%03d",TaskName,self.ZoneCount) +end +self.Zones[TaskName]={} +self.Zones[TaskName].CaptureZone=CaptureZone +self.Zones[TaskName].Briefing=Briefing +self.Zones[TaskName].Task=nil +self.Zones[TaskName].TaskPrefix=TaskPrefix +self:ManageTasks() +return self.Zones[TaskName]and self.Zones[TaskName].Task +end +function TASK_CAPTURE_DISPATCHER:Link_AI_A2G_Dispatcher(AI_A2G_Dispatcher) +self.AI_A2G_Dispatcher=AI_A2G_Dispatcher +AI_A2G_Dispatcher.Detection:LockDetectedItems() +return self +end +function TASK_CAPTURE_DISPATCHER:ManageTasks() +self:F() +local AreaMsg={} +local TaskMsg={} +local ChangeMsg={} +local Mission=self.Mission +if Mission:IsIDLE()or Mission:IsENGAGED()then +local TaskReport=REPORT:New() +for TaskIndex,TaskData in pairs(self.Tasks)do +local Task=TaskData +if Task:IsStatePlanned()then +end +end +for TaskName,CaptureZone in pairs(self.Zones)do +if not CaptureZone.Task then +CaptureZone.Task=TASK_CAPTURE_ZONE:New(Mission,self.SetGroup,TaskName,CaptureZone.CaptureZone,CaptureZone.Briefing) +CaptureZone.Task.TaskPrefix=CaptureZone.TaskPrefix +Mission:AddTask(CaptureZone.Task) +TaskReport:Add(TaskName) +CaptureZone.Task:SetDispatcher(self) +CaptureZone.Task:UpdateTaskInfo() +function CaptureZone.Task.OnEnterAssigned(Task,From,Event,To) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Unlock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=true +end +function CaptureZone.Task.OnEnterSuccess(Task,From,Event,To) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Lock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=false +end +function CaptureZone.Task.OnEnterCancelled(Task,From,Event,To) +self:Cancelled(Task) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Lock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=false +end +function CaptureZone.Task.OnEnterFailed(Task,From,Event,To) +self:Failed(Task) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Lock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=false +end +function CaptureZone.Task.OnEnterAborted(Task,From,Event,To) +self:Aborted(Task) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Lock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=false +end +function CaptureZone.Task.OnAfterCaptured(Task,From,Event,To,TaskUnit) +self:Captured(Task,Task.TaskPrefix,TaskUnit) +if self.AI_A2G_Dispatcher then +self.AI_A2G_Dispatcher:Lock(Task.TaskZoneName) +end +CaptureZone.Task:UpdateTaskInfo() +CaptureZone.Task.ZoneGoal.Attacked=false +end +end +end +Mission:GetCommandCenter():SetMenu() +local TaskText=TaskReport:Text(", ") +for TaskGroupID,TaskGroup in pairs(self.SetGroup:GetSet())do +if(not Mission:IsGroupAssigned(TaskGroup))and TaskText~=""and(not self.FlashNewTask)then +Mission:GetCommandCenter():MessageToGroup(string.format("%s has tasks %s. Subscribe to a task using the radio menu.",Mission:GetShortText(),TaskText),TaskGroup) +end +end +end +return true +end +end +_EVENTDISPATCHER=EVENT:New() +_SCHEDULEDISPATCHER=SCHEDULEDISPATCHER:New() +_DATABASE=DATABASE:New() +_SETTINGS=SETTINGS:Set() +_SETTINGS:SetPlayerMenuOn() +_DATABASE:_RegisterCargos() +_DATABASE:_RegisterZones() +_DATABASE:_RegisterAirbases() +BASE:I("Checking de-sanitization of os, io and lfs:") +local __na=false +if os then +BASE:I("- os available") +else +BASE:I("- os NOT available! Some functions may not work.") +__na=true +end +if io then +BASE:I("- io available") +else +BASE:I("- io NOT available! Some functions may not work.") +__na=true +end +if lfs then +BASE:I("- lfs available") +else +BASE:I("- lfs NOT available! Some functions may not work.") +__na=true +end +if __na then +BASE:I("Check <DCS install folder>/Scripts/MissionScripting.lua and comment out the lines with sanitizeModule(''). Use at your own risk!)") +end +BASE.ServerName="Unknown" +if lfs and loadfile then +local serverfile=lfs.writedir()..'Config/serverSettings.lua' +if UTILS.FileExists(serverfile)then +loadfile(serverfile)() +if cfg and cfg.name then +BASE.ServerName=cfg.name +end +end +BASE.ServerName=BASE.ServerName or"Unknown" +BASE:I("Server Name: "..tostring(BASE.ServerName)) +end +BASE:TraceOnOff(false) +env.info('*** MOOSE INCLUDE END *** ') diff --git a/Moose_CTLD_Pure/Moose_CTLD.lua b/Moose_CTLD_Pure/Moose_CTLD.lua new file mode 100644 index 0000000..cf04e6f --- /dev/null +++ b/Moose_CTLD_Pure/Moose_CTLD.lua @@ -0,0 +1,552 @@ +-- Moose_CTLD.lua +-- Pure-MOOSE, template-free CTLD-style logistics & troop transport +-- Drop-in script: no MIST, no mission editor templates required +-- Dependencies: Moose.lua must be loaded before this script +-- Author: Copilot (generated) + +-- Contract +-- Inputs: Config table or defaults. No ME templates needed. Zones may be named ME trigger zones or provided via coordinates in config. +-- Outputs: F10 menus for helo/transport groups; crate spawning/building; troop load/unload; optional JTAC hookup (via FAC module); +-- Error modes: missing Moose -> abort; unknown crate key -> message; spawn blocked in enemy airbase; zone missing -> message. + +if not _G.Moose or not _G.BASE then + env.info('[Moose_CTLD] Moose not detected (BASE class missing). Ensure Moose.lua is loaded before Moose_CTLD.lua') +end + +local CTLD = {} +CTLD.__index = CTLD + +-- ========================= +-- Defaults and State +-- ========================= +CTLD.Version = '0.1.0-alpha' + +CTLD.Config = { + CoalitionSide = coalition.side.BLUE, -- default coalition this instance serves (menus created for this side) + AllowedAircraft = { -- transport-capable unit type names (case-sensitive as in DCS DB) + 'UH-1H','Mi-8MTV2','Mi-24P','SA342M','SA342L','SA342Minigun','Ka-50','Ka-50_3','AH-64D_BLK_II','UH-60L','CH-47Fbl1','CH-47F','Mi-17','GazelleAI' + }, + UseGroupMenus = true, -- if true, F10 menus per player group; otherwise coalition-wide + UseCategorySubmenus = true, -- if true, organize crate requests by category submenu (menuCategory) + BuildRadius = 60, -- meters around build point to collect crates + CrateLifetime = 3600, -- seconds before crates auto-clean + MessageDuration = 15, -- seconds for on-screen messages + Debug = false, + PickupZoneSmokeColor = trigger.smokeColor.Green, -- default smoke color when spawning crates at pickup zones + + Zones = { -- Optional: supply by name (ME trigger zones) or define coordinates inline + PickupZones = { + -- examples: + -- { name = 'PICKUP_BLUE_MAIN' }, + -- { name = 'Pickup-West', smoke = trigger.smokeColor.Green }, + -- { coord = { x = 12345, y = 0, z = 67890 }, radius = 150, name = 'ScriptPickup1' }, + }, + DropZones = { + -- { name = 'DROP_BLUE_1' }, + }, + FOBZones = { + -- optional: where FOB crates can unpack to spawn FARP/FOB assets + }, + }, + + -- Crate catalog: key -> crate properties and build recipe + -- No ME templates; unit compositions are defined directly here. + CrateCatalog = { + -- Example: MANPADS team requiring 2 crates + MANPADS = { + description = '2x Crates -> MANPADS team', + weight = 120, -- affects sling/limits only informationally (no physics in script) + dcsCargoType = 'uh1h_cargo', -- static cargo type (can adjust per DCS version); user-tunable + required = 2, -- number of crates to assemble + side = coalition.side.BLUE, + category = Group.Category.GROUND, + build = function(point, headingDeg) + local u1 = { type = 'Soldier stinger', name = string.format('CTLD-MANPADS-%d', math.random(100000,999999)), + x = point.x, y = point.z, heading = math.rad(headingDeg or 0) } + local group = { + visible = false, lateActivation = false, tasks = {}, task = 'Ground Nothing', + units = { u1 }, route = { }, name = string.format('CTLD_MANPADS_%d', math.random(100000,999999)) + } + return group + end, + }, + -- Example: AAA site needing 3 crates + AAA = { + description = '3x Crates -> ZU-23 site', + weight = 400, + dcsCargoType = 'container_cargo', + required = 3, + side = coalition.side.BLUE, + category = Group.Category.GROUND, + build = function(point, headingDeg) + local hdg = math.rad(headingDeg or 0) + local function offset(dx, dz) return { x = point.x + dx, z = point.z + dz } end + local units = { + { type='ZU-23 Emplacement', name=string.format('CTLD-ZU23-%d', math.random(100000,999999)), x=point.x, y=point.z, heading=hdg }, + { type='Ural-375', name=string.format('CTLD-TRK-%d', math.random(100000,999999)), x=offset(15, 12).x, y=offset(15, 12).z, heading=hdg }, + { type='Infantry AK', name=string.format('CTLD-INF-%d', math.random(100000,999999)), x=offset(-12,-15).x, y=offset(-12,-15).z, heading=hdg }, + } + return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', units=units, route={}, name=string.format('CTLD_AAA_%d', math.random(100000,999999)) } + end, + }, + -- Example: FARP/FOB build from 4 crates (spawns helipads + support statics/vehicles) + FOB = { + description = '4x Crates -> FARP/FOB', + weight = 500, + dcsCargoType = 'container_cargo', + required = 4, + side = coalition.side.BLUE, + category = Group.Category.GROUND, + build = function(point, headingDeg) + local heading = math.rad(headingDeg or 0) + -- Spawn statics that provide FARP services + local function addStatic(typeName, dx, dz, nameSuffix) + local p = { x = point.x + dx, z = point.z + dz } + local st = { + name = string.format('CTLD-FOB-%s-%d', nameSuffix, math.random(100000,999999)), + type = typeName, + x = p.x, y = p.z, + heading = heading, + } + coalition.addStaticObject(coalition.side.BLUE, st) + end + -- Common FARP layout + addStatic('FARP', 0, 0, 'PAD') + addStatic('FARP Ammo Dump Coating', 15, 10, 'AMMO') + addStatic('FARP Fuel Depot', -15, 10, 'FUEL') + addStatic('FARP Tent', 10, -12, 'TENT1') + addStatic('FARP Tent', -10, -12, 'TENT2') + -- Ground support vehicles to enable rearm/refuel/repair + local units = { + { type='HEMTT TFFT', name=string.format('CTLD-FOB-FUEL-%d', math.random(100000,999999)), x=point.x + 20, y=point.z + 15, heading=heading }, + { type='Ural-375 PBU', name=string.format('CTLD-FOB-REPAIR-%d', math.random(100000,999999)), x=point.x - 20, y=point.z + 15, heading=heading }, + { type='Ural-375', name=string.format('CTLD-FOB-AMMO-%d', math.random(100000,999999)), x=point.x, y=point.z - 18, heading=heading }, + } + return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', units=units, route={}, name=string.format('CTLD_FOB_%d', math.random(100000,999999)) } + end, + }, + }, +} + +-- Internal state tables +CTLD._instances = CTLD._instances or {} +CTLD._crates = {} -- [crateName] = { key, zone, side, spawnTime, point } +CTLD._troopsLoaded = {} -- [groupName] = { count, typeKey } + +-- ========================= +-- Utilities +-- ========================= +local function _isIn(list, value) + for _,v in ipairs(list or {}) do if v == value then return true end end + return false +end + +local function _msgGroup(group, text, t) + if not group then return end + MESSAGE:New(text, t or CTLD.Config.MessageDuration):ToGroup(group) +end + +local function _msgCoalition(side, text, t) + MESSAGE:New(text, t or CTLD.Config.MessageDuration):ToCoalition(side) +end + +local function _findZone(z) + if z.name then + local mz = ZONE:FindByName(z.name) + if mz then return mz end + end + if z.coord then + local r = z.radius or 150 + local v = VECTOR2:New(z.coord.x, z.coord.z) + return ZONE_RADIUS:New(z.name or ('CTLD_ZONE_'..math.random(10000,99999)), v, r) + end + return nil +end + +local function _getUnitType(unit) + local ud = unit and unit:GetDesc() or nil + return ud and ud.typeName or unit and unit:GetTypeName() +end + +local function _nearestZonePoint(unit, list) + if not unit or not unit:IsAlive() then return nil end + local p3 = unit:GetPointVec3() + local best, bestd = nil, 1e12 + for _,z in ipairs(list or {}) do + local mz = _findZone(z) + if mz then + local d = p3:DistanceFromPoint(mz:GetPointVec3()) + if d < bestd then best, bestd = mz, d end + end + end + return best, bestd +end + +local function _coalitionAddGroup(side, category, groupData) + -- Enforce side/category in groupData just to be safe + groupData.category = category + return coalition.addGroup(side, category, groupData) +end + +local function _spawnStaticCargo(side, point, cargoType, name) + local static = { + name = name, + type = cargoType, + x = point.x, + y = point.z, + heading = 0, + canCargo = true, + } + return coalition.addStaticObject(side, static) +end + +local function _vec3FromUnit(unit) + local p = unit:GetPointVec3() + return { x = p.x, y = p.y, z = p.z } +end + +-- ========================= +-- Construction +-- ========================= +function CTLD:New(cfg) + local o = setmetatable({}, self) + o.Config = BASE:DeepCopy(CTLD.Config) + if cfg then o.Config = BASE:Inherit(o.Config, cfg) end + o.Side = o.Config.CoalitionSide + o.MenuRoots = {} + o.MenusByGroup = {} + o:InitZones() + o:InitMenus() + + -- Periodic cleanup for crates + o.Sched = SCHEDULER:New(nil, function() + o:CleanupCrates() + end, {}, 60, 60) + + table.insert(CTLD._instances, o) + _msgCoalition(o.Side, string.format('CTLD %s initialized for coalition', CTLD.Version)) + return o +end + +function CTLD:InitZones() + self.PickupZones = {} + self.DropZones = {} + self.FOBZones = {} + self._ZoneDefs = { PickupZones = {}, DropZones = {}, FOBZones = {} } + for _,z in ipairs(self.Config.Zones.PickupZones or {}) do + local mz = _findZone(z) + if mz then table.insert(self.PickupZones, mz); self._ZoneDefs.PickupZones[mz:GetName()] = z end + end + for _,z in ipairs(self.Config.Zones.DropZones or {}) do + local mz = _findZone(z) + if mz then table.insert(self.DropZones, mz); self._ZoneDefs.DropZones[mz:GetName()] = z end + end + for _,z in ipairs(self.Config.Zones.FOBZones or {}) do + local mz = _findZone(z) + if mz then table.insert(self.FOBZones, mz); self._ZoneDefs.FOBZones[mz:GetName()] = z end + end +end + +-- ========================= +-- Menus +-- ========================= +function CTLD:InitMenus() + if self.Config.UseGroupMenus then + self:WireBirthHandler() + else + self.MenuRoot = MENU_COALITION:New(self.Side, 'CTLD') + self:BuildCoalitionMenus(self.MenuRoot) + end +end + +function CTLD:WireBirthHandler() + local handler = EVENTHANDLER:New() + handler:HandleEvent(EVENTS.Birth) + local selfref = self + function handler:OnEventBirth(eventData) + local unit = eventData.IniUnit + if not unit or not unit:IsAlive() then return end + if unit:GetCoalition() ~= selfref.Side then return end + local typ = _getUnitType(unit) + if not _isIn(selfref.Config.AllowedAircraft, typ) then return end + local grp = unit:GetGroup() + if not grp then return end + local gname = grp:GetName() + if selfref.MenusByGroup[gname] then return end + selfref.MenusByGroup[gname] = selfref:BuildGroupMenus(grp) + _msgGroup(grp, 'CTLD menu available (F10)') + end + self.BirthHandler = handler +end + +function CTLD:BuildGroupMenus(group) + local root = MENU_GROUP:New(group, 'CTLD') + -- Request crate submenu per catalog entry + local reqRoot = MENU_GROUP:New(group, 'Request Crate', root) + if self.Config.UseCategorySubmenus then + local submenus = {} + local function getSubmenu(catLabel) + if not submenus[catLabel] then + submenus[catLabel] = MENU_GROUP:New(group, catLabel, reqRoot) + end + return submenus[catLabel] + end + for key,def in pairs(self.Config.CrateCatalog) do + local label = (def and (def.menu or def.description)) or key + local sideOk = (not def.side) or def.side == self.Side + if sideOk then + local catLabel = (def and def.menuCategory) or 'Other' + local parent = getSubmenu(catLabel) + MENU_GROUP_COMMAND:New(group, label, parent, function() + self:RequestCrateForGroup(group, key) + end) + end + end + else + for key,def in pairs(self.Config.CrateCatalog) do + local label = (def and (def.menu or def.description)) or key + local sideOk = (not def.side) or def.side == self.Side + if sideOk then + MENU_GROUP_COMMAND:New(group, label, reqRoot, function() + self:RequestCrateForGroup(group, key) + end) + end + end + end + -- Troops + MENU_GROUP_COMMAND:New(group, 'Load Troops', root, function() self:LoadTroops(group) end) + MENU_GROUP_COMMAND:New(group, 'Unload Troops', root, function() self:UnloadTroops(group) end) + + -- Build + MENU_GROUP_COMMAND:New(group, 'Build Here', root, function() + self:BuildAtGroup(group) + end) + + return root +end + +function CTLD:BuildCoalitionMenus(root) + -- Optional: implement coalition-level crate spawns at pickup zones + for key,_ in pairs(self.Config.CrateCatalog) do + MENU_COALITION_COMMAND:New(self.Side, 'Spawn '..key..' at nearest Pickup Zone', root, function() + -- Not group-context; skip here + _msgCoalition(self.Side, 'Group menus recommended for crate requests') + end) + end +end + +-- ========================= +-- Crates +-- ========================= +function CTLD:RequestCrateForGroup(group, crateKey) + local cat = self.Config.CrateCatalog[crateKey] + if not cat then _msgGroup(group, 'Unknown crate type: '..tostring(crateKey)) return end + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + local zone, dist = _nearestZonePoint(unit, self.Config.Zones.PickupZones) + local spawnPoint + if zone and dist < 10000 then + spawnPoint = zone:GetPointVec3() + -- if pickup zone has smoke configured, mark it + local zdef = self._ZoneDefs.PickupZones[zone:GetName()] + local smokeColor = (zdef and zdef.smoke) or self.Config.PickupZoneSmokeColor + if smokeColor then + trigger.action.smoke({ x = spawnPoint.x, z = spawnPoint.z }, smokeColor) + end + else + -- fallback: spawn near aircraft current position (safe offset) + local p = unit:GetPointVec3() + spawnPoint = POINT_VEC3:New(p.x + 10, p.y, p.z + 10) + end + local cname = string.format('CTLD_CRATE_%s_%d', crateKey, math.random(100000,999999)) + _spawnStaticCargo(self.Side, { x = spawnPoint.x, z = spawnPoint.z }, cat.dcsCargoType or 'uh1h_cargo', cname) + CTLD._crates[cname] = { + key = crateKey, + side = self.Side, + spawnTime = timer.getTime(), + point = { x = spawnPoint.x, z = spawnPoint.z }, + } + _msgGroup(group, string.format('Spawned crate %s at %s', crateKey, zone and zone:GetName() or 'current pos')) +end + +function CTLD:GetNearbyCrates(point, radius) + local result = {} + for name,meta in pairs(CTLD._crates) do + local dx = (meta.point.x - point.x) + local dz = (meta.point.z - point.z) + local d = math.sqrt(dx*dx + dz*dz) + if d <= radius then + table.insert(result, { name = name, meta = meta }) + end + end + return result +end + +function CTLD:CleanupCrates() + local now = timer.getTime() + local life = self.Config.CrateLifetime + for name,meta in pairs(CTLD._crates) do + if now - (meta.spawnTime or now) > life then + local obj = StaticObject.getByName(name) + if obj then obj:destroy() end + CTLD._crates[name] = nil + if self.Config.Debug then env.info('[CTLD] Cleaned up crate '..name) end + end + end +end + +-- ========================= +-- Build logic +-- ========================= +function CTLD:BuildAtGroup(group) + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + local p = unit:GetPointVec3() + local here = { x = p.x, z = p.z } + local radius = self.Config.BuildRadius + local nearby = self:GetNearbyCrates(here, radius) + if #nearby == 0 then _msgGroup(group, 'No crates within '..radius..'m') return end + + -- Count by key + local counts = {} + for _,c in ipairs(nearby) do + counts[c.meta.key] = (counts[c.meta.key] or 0) + 1 + end + + -- Helper to consume crates of a given key/qty + local function consumeCrates(key, qty) + local removed = 0 + for _,c in ipairs(nearby) do + if removed >= qty then break end + if c.meta.key == key then + local obj = StaticObject.getByName(c.name) + if obj then obj:destroy() end + CTLD._crates[c.name] = nil + removed = removed + 1 + end + end + end + + -- Try composite recipes first (requires is a map of key->qty) + for recipeKey,cat in pairs(self.Config.CrateCatalog) do + if type(cat.requires) == 'table' and cat.build then + local ok = true + for reqKey,qty in pairs(cat.requires) do + if (counts[reqKey] or 0) < qty then ok = false; break end + end + if ok then + local hdg = unit:GetHeading() + local gdata = cat.build({ x = here.x, z = here.z }, math.deg(hdg)) + local g = _coalitionAddGroup(cat.side or self.Side, cat.category or Group.Category.GROUND, gdata) + if g then + for reqKey,qty in pairs(cat.requires) do consumeCrates(reqKey, qty) end + _msgGroup(group, string.format('Built %s at your location', cat.description or recipeKey)) + return + else + _msgGroup(group, 'Build failed: DCS group spawn error') + return + end + end + end + end + + -- Then single-key recipes + for key,count in pairs(counts) do + local cat = self.Config.CrateCatalog[key] + if cat and cat.build and (not cat.requires) and count >= (cat.required or 1) then + local hdg = unit:GetHeading() + local gdata = cat.build({ x = here.x, z = here.z }, math.deg(hdg)) + local g = _coalitionAddGroup(cat.side or self.Side, cat.category or Group.Category.GROUND, gdata) + if g then + consumeCrates(key, cat.required or 1) + _msgGroup(group, string.format('Built %s at your location', cat.description or key)) + return + else + _msgGroup(group, 'Build failed: DCS group spawn error') + return + end + end + end + + _msgGroup(group, 'Insufficient crates to build any asset here') +end + +-- ========================= +-- Troops +-- ========================= +function CTLD:LoadTroops(group, opts) + local gname = group:GetName() + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + + local capacity = 6 -- simple default; can be adjusted per type later + CTLD._troopsLoaded[gname] = { + count = capacity, + typeKey = 'RIFLE', + } + _msgGroup(group, string.format('Loaded %d troops (virtual). Use Unload Troops to deploy.', capacity)) +end + +function CTLD:UnloadTroops(group) + local gname = group:GetName() + local load = CTLD._troopsLoaded[gname] + if not load or (load.count or 0) == 0 then _msgGroup(group, 'No troops onboard') return end + + local unit = group:GetUnit(1) + if not unit or not unit:IsAlive() then return end + local p = unit:GetPointVec3() + local here = { x = p.x, z = p.z } + local hdg = unit:GetHeading() + + local count = load.count + -- Spawn a simple infantry fireteam + local units = {} + for i=1, math.min(count, 8) do + table.insert(units, { + type = 'Infantry AK', name = string.format('CTLD-TROOP-%d', math.random(100000,999999)), + x = here.x + i*1.5, y = here.z + (i%2==0 and 2 or -2), heading = hdg + }) + end + local groupData = { + visible=false, lateActivation=false, tasks={}, task='Ground Nothing', + units=units, route={}, name=string.format('CTLD_TROOPS_%d', math.random(100000,999999)) + } + local spawned = _coalitionAddGroup(self.Side, Group.Category.GROUND, groupData) + if spawned then + CTLD._troopsLoaded[gname] = nil + _msgGroup(group, string.format('Deployed %d troops', #units)) + else + _msgGroup(group, 'Deploy failed: DCS group spawn error') + end +end + +-- ========================= +-- Public helpers +-- ========================= +function CTLD:RegisterCrate(key, def) + self.Config.CrateCatalog[key] = def +end + +function CTLD:MergeCatalog(tbl) + for k,v in pairs(tbl or {}) do self.Config.CrateCatalog[k] = v end +end + +function CTLD:AddPickupZone(z) + local mz = _findZone(z) + if mz then table.insert(self.PickupZones, mz); table.insert(self.Config.Zones.PickupZones, z) end +end + +function CTLD:AddDropZone(z) + local mz = _findZone(z) + if mz then table.insert(self.DropZones, mz); table.insert(self.Config.Zones.DropZones, z) end +end + +function CTLD:SetAllowedAircraft(list) + self.Config.AllowedAircraft = BASE:DeepCopy(list) +end + +-- ========================= +-- Return factory +-- ========================= +_MOOSE_CTLD = CTLD +return CTLD diff --git a/Moose_CTLD_Pure/Moose_CTLD_FAC.lua b/Moose_CTLD_Pure/Moose_CTLD_FAC.lua new file mode 100644 index 0000000..66a11f6 --- /dev/null +++ b/Moose_CTLD_Pure/Moose_CTLD_FAC.lua @@ -0,0 +1,207 @@ +-- Moose_CTLD_FAC.lua +-- FAC/RECCE features integrated with pure-MOOSE CTLD +-- Provides: recce zones, auto target marking (smoke/illum), JTAC auto-lase bootstrap, optional artillery mark tasks + +if not _G.Moose or not _G.BASE then + env.info('[Moose_CTLD_FAC] Moose not detected. Ensure Moose.lua is loaded before this script.') +end + +local FAC = {} +FAC.__index = FAC +FAC.Version = '0.1.0-alpha' + +FAC.Config = { + CoalitionSide = coalition.side.BLUE, + ScanInterval = 20, -- seconds between scans + MarkSmokeColor = trigger.smokeColor.Red, + MarkIllum = false, -- drop illumination at night if true + MarkText = true, -- place map marks with target info + DetectionRadius = 5000, -- meters within zone + MinReportSeparation = 400, -- meters between subsequent marks to reduce spam + UseGroupMenus = true, + Debug = false, + Arty = { -- optional artillery support + Enabled = true, + Groups = { -- names of friendly artillery groups to use for marking + -- 'BLUE_ARTY_1', + }, + Rounds = 3, + Spread = 120, -- meters randomization around mark point + } +} + +FAC._lastMarks = {} -- [zoneName] = { lastPoint = {x,z} } + +function FAC:New(ctld, cfg) + local o = setmetatable({}, self) + o.CTLD = ctld + o.Config = BASE:DeepCopy(FAC.Config) + if cfg then o.Config = BASE:Inherit(o.Config, cfg) end + o.Side = o.Config.CoalitionSide + o.Zones = {} + o.MenusByGroup = {} + + if o.Config.UseGroupMenus then o:WireBirthHandler() end + return o +end + +function FAC:WireBirthHandler() + local handler = EVENTHANDLER:New() + handler:HandleEvent(EVENTS.Birth) + local selfref = self + function handler:OnEventBirth(eventData) + local unit = eventData.IniUnit + if not unit or not unit:IsAlive() then return end + if unit:GetCoalition() ~= selfref.Side then return end + local grp = unit:GetGroup() + if not grp then return end + local gname = grp:GetName() + if selfref.MenusByGroup[gname] then return end + -- Simple menu: FAC actions + local root = MENU_GROUP:New(grp, 'FAC/RECCE') + MENU_GROUP_COMMAND:New(grp, 'List Recce Zones', root, function() selfref:MenuListZones(grp) end) + MENU_GROUP_COMMAND:New(grp, 'Mark Contacts (all zones)', root, function() selfref:ForceScanAll(grp) end) + selfref.MenusByGroup[gname] = root + MESSAGE:New('FAC/RECCE menu available (F10)', 10):ToGroup(grp) + end + self.BirthHandler = handler +end + +function FAC:AddRecceZone(def) + -- def: { name='ZONE_NAME' } or { coord={x,y,z}, radius=NN, name='Recce1' } + local z + if def.name then + z = ZONE:FindByName(def.name) + end + if not z and def.coord then + local r = def.radius or 5000 + z = ZONE_RADIUS:New(def.name or ('FAC_ZONE_'..math.random(10000,99999)), VECTOR2:New(def.coord.x, def.coord.z), r) + end + if not z then return nil end + local Z = { + Zone = z, + Name = z:GetName(), + Detector = self:CreateDetector(z), + LastScan = 0, + } + table.insert(self.Zones, Z) + return Z +end + +function FAC:CreateDetector(zone) + -- Detection in areas using Moose detection classes + local enemySide = (self.Side == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + local setEnemies = SET_GROUP:New():FilterCoalitions(enemySide):FilterCategoryGround():FilterStart() + local det = DETECTION_AREAS:New(setEnemies, zone:GetRadius()) + det:BoundZone(zone) + return det +end + +function FAC:MenuListZones(group) + local names = {} + for _,Z in ipairs(self.Zones) do table.insert(names, Z.Name) end + MESSAGE:New('Recce zones: '..(table.concat(names, ', '):gsub('^%s+$','none')), 15):ToGroup(group) +end + +function FAC:ForceScanAll(group) + for _,Z in ipairs(self.Zones) do self:ScanZone(Z, group) end +end + +function FAC:Run() + -- schedule periodic scanning + if self.Sched then self.Sched:Stop() end + self.Sched = SCHEDULER:New(nil, function() + for _,Z in ipairs(self.Zones) do self:ScanZone(Z) end + end, {}, 5, self.Config.ScanInterval) +end + +local function _p3(v2) + return { x = v2.x, y = land.getHeight({x=v2.x, y=v2.y}), z = v2.y } +end + +function FAC:ScanZone(Z, notifyGroup) + local now = timer.getTime() + local det = Z.Detector + det:DetectionUpdate() + local reports = det:GetDetectedItems() + if not reports or #reports == 0 then + if notifyGroup then MESSAGE:New('No contacts detected in '..Z.Name, 10):ToGroup(notifyGroup) end + return + end + + local enemySide = (self.Side == coalition.side.BLUE) and coalition.side.RED or coalition.side.BLUE + for _,rep in ipairs(reports) do + local contact = rep.object -- wrapper around GROUP or UNIT + local pos2 = rep.point -- vec2 + if pos2 then + local markPoint = { x = pos2.x, z = pos2.y } + local allow = true + local last = FAC._lastMarks[Z.Name] + if last then + local dx = (markPoint.x - last.x); local dz = (markPoint.z - last.z) + if math.sqrt(dx*dx+dz*dz) < self.Config.MinReportSeparation then allow = false end + end + if allow then + FAC._lastMarks[Z.Name] = { x = markPoint.x, z = markPoint.z } + self:MarkTarget(Z, markPoint, rep, enemySide) + if notifyGroup then MESSAGE:New(string.format('Marked contact in %s', Z.Name), 10):ToGroup(notifyGroup) end + end + end + end +end + +function FAC:MarkTarget(Z, point, rep, enemySide) + -- Smoke + trigger.action.smoke(point, self.Config.MarkSmokeColor) + -- Map mark + if self.Config.MarkText then + local txt = string.format('FAC: %s at %s', rep.type or 'Contact', coord.LLtoString(coord.LOtoLL(point), 0)) + trigger.action.markToCoalition(math.random(100000,999999), txt, point, self.Side, true) + end + -- Optional arty marking + if self.Config.Arty.Enabled then + self:ArtyMark(point) + end +end + +function FAC:ArtyMark(point) + local rounds = self.Config.Arty.Rounds or 1 + for _,gname in ipairs(self.Config.Arty.Groups or {}) do + local g = Group.getByName(gname) + if g and g:isExist() then + local ctrl = g:getController() + if ctrl then + for i=1,rounds do + local spread = self.Config.Arty.Spread or 0 + local tgt = { x = point.x + math.random(-spread, spread), y = point.z + math.random(-spread, spread) } + local task = { + id = 'FireAtPoint', + params = { + point = { x = tgt.x, y = land.getHeight({x=tgt.x, y=tgt.y}), z = tgt.y }, + expendQty = 1, + dispersion = 50, + attackQty = 1, + weaponType = 0, + } + } + ctrl:setTask(task) + end + end + end + end +end + +-- Bootstrap a JTAC on a spawned unit/group via MOOSE FAC_AUTO +function FAC:StartJTACOnGroup(groupName, code, smoke) + local grp = GROUP:FindByName(groupName) + if not grp then return nil end + local fac = FAC_AUTO:New(grp) + fac:SetLaser(true, code or 1688) + fac:SetSmoke(smoke or self.Config.MarkSmokeColor) + fac:SetDetectVehicles() + fac:Start() + return fac +end + +_MOOSE_CTLD_FAC = FAC +return FAC diff --git a/Moose_CTLD_Pure/README.md b/Moose_CTLD_Pure/README.md new file mode 100644 index 0000000..ff354b6 --- /dev/null +++ b/Moose_CTLD_Pure/README.md @@ -0,0 +1,106 @@ +# Moose_CTLD_Pure + +Pure-MOOSE CTLD-style logistics and FAC/RECCE without MIST or mission editor templates. Drop-in, config-driven. + +## What this is + +- Logistics and troop transport similar to popular CTLD scripts, implemented directly on MOOSE. +- No MIST. No mission editor templates. Unit compositions are defined in config tables. +- Optional FAC/RECCE module that auto-marks targets in zones and can drive artillery marking and JTAC auto-lase. + +## Quick start + +1) Load `Moose.lua` first, then include these files (order matters): + - `Moose_CTLD_Pure/Moose_CTLD.lua` + - `Moose_CTLD_Pure/Moose_CTLD_FAC.lua` (optional, for FAC/RECCE) + +2) Initialize CTLD with minimal config: + +```lua +local CTLD = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\Moose_CTLD.lua]]) +local ctld = CTLD:New({ + CoalitionSide = coalition.side.BLUE, + Zones = { + PickupZones = { { name = 'PICKUP_BLUE_MAIN' } }, + DropZones = { { name = 'DROP_BLUE_1' } }, + }, +}) + +-- Optionally load a larger crate catalog extracted from your CTLD.lua +local extracted = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\catalogs\CrateCatalog_CTLD_Extract.lua]]) +ctld:MergeCatalog(extracted) +``` + +- If you don't have ME trigger zones, define by coordinates: + +```lua +Zones = { + PickupZones = { + { coord = { x=123456, y=0, z=654321 }, radius=150, name='ScriptPickup1' }, + } +} +``` + +3) (Optional) FAC/RECCE: + +```lua +local FAC = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\Moose_CTLD_FAC.lua]]) +local fac = FAC:New(ctld, { + CoalitionSide = coalition.side.BLUE, + Arty = { Enabled = true, Groups = { 'BLUE_ARTY_1' }, Rounds = 3, Spread = 100 }, +}) +fac:AddRecceZone({ name = 'RECCE_ZONE_1' }) +fac:Run() +``` + +4) In mission, pilots of allowed aircraft (configured in `AllowedAircraft`) will see F10 menus: +- CTLD > Request Crate > [Type] +- CTLD > Load Troops / Unload Troops +- CTLD > Build Here +- FAC/RECCE > List Recce Zones / Mark Contacts (all zones) + +## Configuring crates and builds (no templates) + +Edit `CrateCatalog` in `Moose_CTLD.lua`. Each entry defines: +- `required`: how many crates to assemble +- `weight`: informational +- `dcsCargoType`: DCS static cargo type string (e.g., `uh1h_cargo`, `container_cargo`); tweak per map/mods +- `build(point, headingDeg)`: function returning a DCS group table for `coalition.addGroup` + +Example snippet: + +```lua +CrateCatalog = { + MANPADS = { + description = '2x Crates -> MANPADS team', + weight = 120, + dcsCargoType = 'uh1h_cargo', + required = 2, + side = coalition.side.BLUE, + category = Group.Category.GROUND, + build = function(point, headingDeg) + return { visible=false, lateActivation=false, units={ + { type='Soldier stinger', name='CTLD-MANPADS-1', x=point.x, y=point.z, heading=math.rad(headingDeg or 0) } + } } + end, + }, +} +``` + +## Notes and limitations + +- This avoids sling-load event dependency by using a player command "Build Here" that consumes nearby crates within a radius. You can still sling crates physically. +- Cargo static types vary across DCS versions. If a spawned crate isn’t sling-loadable, change `dcsCargoType` strings in `CrateCatalog` (e.g., `uh1h_cargo`, `container_cargo`, `ammo_cargo`, `container_20ft` depending on map/version). +- Troops are virtually loaded and spawned on unload. Adjust capacity logic if you want type-based capacities. +- FAC/RECCE detection leverages Moose `DETECTION_AREAS`. Tweak `ScanInterval`, `DetectionRadius`, and `MinReportSeparation` to balance spam/performance. +- Artillery marking uses `Controller.setTask('FireAtPoint')` on configured groups. Ensure those groups exist and are artillery-capable. +- JTAC Auto-Lase helper provided: `fac:StartJTACOnGroup(groupName, laserCode, smokeColor)` uses `FAC_AUTO`. + +## Extending + +- Add radio beacons, FOB build recipes, fuel/ammo crates, and CSAR hooks by registering more `CrateCatalog` entries and/or adding helper methods. +- To support per-airframe capacities and sling-only rules, extend `AllowedAircraft` and add a type->capacity map. + +## Changelog + +- 0.1.0-alpha: Initial release: CTLD crate/troops/build, FAC recce zones + arty mark + JTAC bootstrap. diff --git a/Moose_CTLD_Pure/catalogs/CrateCatalog_CTLD_Extract.lua b/Moose_CTLD_Pure/catalogs/CrateCatalog_CTLD_Extract.lua new file mode 100644 index 0000000..d8b7ba9 --- /dev/null +++ b/Moose_CTLD_Pure/catalogs/CrateCatalog_CTLD_Extract.lua @@ -0,0 +1,166 @@ +-- CrateCatalog_CTLD_Extract.lua +-- Auto-generated from CTLD.lua (Operation_Polar_Shield) spawnableCrates config +-- Returns a table of crate definitions suitable for CTLD:MergeCatalog() +-- Notes: +-- - Each entry has keys: description/menu, dcsCargoType, required or requires (composite), side, category, build(point, headingDeg) +-- - Single-unit entries spawn one unit by DCS type. Composite "SITE" entries spawn a multi-unit group approximating system components. + +local function singleUnit(unitType) + return function(point, headingDeg) + local name = string.format('%s-%d', unitType, math.random(100000,999999)) + local hdg = math.rad(headingDeg or 0) + return { + visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={}, + units={ { type=unitType, name=name, x=point.x, y=point.z, heading=hdg } }, + name = 'CTLD_'..name + } + end +end + +local function multiUnits(units) + -- units: array of { type, dx, dz } + return function(point, headingDeg) + local hdg = math.rad(headingDeg or 0) + local function off(dx, dz) return { x = point.x + dx, z = point.z + dz } end + local list = {} + for i,u in ipairs(units) do + local p = off(u.dx or 0, u.dz or 3*i) + table.insert(list, { + type = u.type, name = string.format('CTLD-%s-%d', u.type, math.random(100000,999999)), + x = p.x, y = p.z, heading = hdg + }) + end + return { visible=false, lateActivation=false, tasks={}, task='Ground Nothing', route={}, units=list, name=string.format('CTLD_SITE_%d', math.random(100000,999999)) } + end +end + +local BLUE = coalition.side.BLUE +local RED = coalition.side.RED + +local cat = {} + +-- Combat Vehicles (BLUE) +cat['BLUE_M1128_STRYKER_MGS'] = { menuCategory='Combat Vehicles', menu='M1128 Stryker MGS', description='M1128 Stryker MGS', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1128 Stryker MGS') } +cat['BLUE_M60A3_PATTON'] = { menuCategory='Combat Vehicles', menu='M-60A3 Patton', description='M-60A3 Patton', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-60') } +cat['BLUE_HMMWV_TOW'] = { menuCategory='Combat Vehicles', menu='Humvee - TOW', description='Humvee - TOW', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1045 HMMWV TOW') } +cat['BLUE_M1134_STRYKER_ATGM']= { menuCategory='Combat Vehicles', menu='M1134 Stryker ATGM',description='M1134 Stryker ATGM',dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1134 Stryker ATGM') } +cat['BLUE_LAV25'] = { menuCategory='Combat Vehicles', menu='LAV-25', description='LAV-25', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('LAV-25') } +cat['BLUE_M2A2_BRADLEY'] = { menuCategory='Combat Vehicles', menu='M2A2 Bradley', description='M2A2 Bradley', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-2 Bradley') } +cat['BLUE_VAB_MEPHISTO'] = { menuCategory='Combat Vehicles', menu='ATGM VAB Mephisto', description='ATGM VAB Mephisto', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('VAB_Mephisto') } +cat['BLUE_M1A2C_ABRAMS'] = { menuCategory='Combat Vehicles', menu='M1A2C Abrams', description='M1A2C Abrams', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1A2C_SEP_V3') } + +-- Combat Vehicles (RED) +cat['RED_BTR82A'] = { menuCategory='Combat Vehicles', menu='BTR-82A', description='BTR-82A', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('BTR-82A') } +cat['RED_BRDM2'] = { menuCategory='Combat Vehicles', menu='BRDM-2', description='BRDM-2', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('BRDM-2') } +cat['RED_BMP3'] = { menuCategory='Combat Vehicles', menu='BMP-3', description='BMP-3', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('BMP-3') } +cat['RED_T55'] = { menuCategory='Combat Vehicles', menu='T-55', description='T-55', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('T-55') } +cat['RED_T72B3'] = { menuCategory='Combat Vehicles', menu='T-72B3', description='T-72B3', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('T-72B3') } + +-- Support (BLUE) +cat['BLUE_MRAP_JTAC'] = { menuCategory='Support', menu='MRAP - JTAC', description='JTAC MRAP', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MaxxPro_MRAP') } +cat['BLUE_M818_AMMO'] = { menuCategory='Support', menu='M-818 Ammo Truck', description='M-818 Ammo Truck', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M 818') } +cat['BLUE_M978_TANKER'] = { menuCategory='Support', menu='M-978 Tanker', description='M-978 Tanker', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M978 HEMTT Tanker') } +cat['BLUE_EWR_FPS117'] = { menuCategory='Support', menu='EWR Radar FPS-117', description='EWR Radar FPS-117', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('FPS-117') } + +-- Support (RED) +cat['RED_TIGR_JTAC'] = { menuCategory='Support', menu='Tigr - JTAC', description='JTAC Tigr', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('Tigr_233036') } +cat['RED_URAL4320_AMMO'] = { menuCategory='Support', menu='Ural-4320-31 Ammo Truck', description='Ural-4320-31 Ammo Truck', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-4320-31') } +cat['RED_ATZ10_TANKER'] = { menuCategory='Support', menu='ATZ-10 Refueler', description='ATZ-10 Refueler', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('ATZ-10') } +cat['RED_EWR_1L13'] = { menuCategory='Support', menu='EWR Radar 1L13', description='EWR Radar 1L13', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('1L13 EWR') } + +-- Artillery (BLUE) +cat['BLUE_MLRS'] = { menuCategory='Artillery', menu='MLRS', description='MLRS', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('MLRS') } +cat['BLUE_SMERCH_CM'] = { menuCategory='Artillery', menu='Smerch_CM', description='Smerch (CM)', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch') } +cat['BLUE_L118_105MM'] = { menuCategory='Artillery', menu='L118 Light Artillery 105mm', description='L118 105mm', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('L118_Unit') } +cat['BLUE_SMERCH_HE'] = { menuCategory='Artillery', menu='Smerch_HE', description='Smerch (HE)', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Smerch_HE') } +cat['BLUE_M109'] = { menuCategory='Artillery', menu='M-109', description='M-109', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M-109') } + +-- Artillery (RED) +cat['RED_GVOZDika'] = { menuCategory='Artillery', menu='SAU Gvozdika', description='SAU Gvozdika', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Gvozdika') } +cat['RED_2S19_MSTA'] = { menuCategory='Artillery', menu='SPH 2S19 Msta', description='SPH 2S19 Msta', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('SAU Msta') } +cat['RED_URAGAN_BM27'] = { menuCategory='Artillery', menu='Uragan_BM-27', description='Uragan BM-27', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('Uragan_BM-27') } +cat['RED_BM21_GRAD'] = { menuCategory='Artillery', menu='BM-21 Grad Ural', description='BM-21 Grad Ural', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('Grad-URAL') } +cat['RED_PLZ05'] = { menuCategory='Artillery', menu='PLZ-05 Mobile Artillery', description='PLZ-05', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('PLZ05') } + +-- AAA (BLUE) +cat['BLUE_GEPARD'] = { menuCategory='AAA', menu='Gepard AAA', description='Gepard AAA', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Gepard') } +cat['BLUE_CRAM'] = { menuCategory='AAA', menu='LPWS C-RAM', description='LPWS C-RAM', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('HEMTT_C-RAM_Phalanx') } +cat['BLUE_VULCAN_M163'] = { menuCategory='AAA', menu='SPAAA Vulcan M163', description='Vulcan M163', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Vulcan') } +cat['BLUE_BOFORS40'] = { menuCategory='AAA', menu='Bofors 40mm', description='Bofors 40mm', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('bofors40') } + +-- AAA (RED) +cat['RED_URAL_ZU23'] = { menuCategory='AAA', menu='Ural-375 ZU-23', description='Ural-375 ZU-23', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('Ural-375 ZU-23') } +cat['RED_SHILKA'] = { menuCategory='AAA', menu='ZSU-23-4 Shilka', description='ZSU-23-4 Shilka', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU-23-4 Shilka') } +cat['RED_ZSU57_2'] = { menuCategory='AAA', menu='ZSU_57_2', description='ZSU_57_2', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('ZSU_57_2') } + +-- SAM short range (BLUE) +cat['BLUE_M1097_AVENGER'] = { menuCategory='SAM short range', menu='M1097 Avenger', description='M1097 Avenger', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M1097 Avenger') } +cat['BLUE_M48_CHAPARRAL'] = { menuCategory='SAM short range', menu='M48 Chaparral', description='M48 Chaparral', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M48 Chaparral') } +cat['BLUE_ROLAND_ADS'] = { menuCategory='SAM short range', menu='Roland ADS', description='Roland ADS', dcsCargoType='container_cargo', required=2, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Roland ADS') } +cat['BLUE_M6_LINEBACKER'] = { menuCategory='SAM short range', menu='M6 Linebacker', description='M6 Linebacker', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('M6 Linebacker') } +-- Rapier components and site +cat['BLUE_RAPIER_LN'] = { menuCategory='SAM short range', menu='Rapier Launcher', description='Rapier Launcher', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_launcher') } +cat['BLUE_RAPIER_SR'] = { menuCategory='SAM short range', menu='Rapier SR', description='Rapier SR', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_blindfire_radar') } +cat['BLUE_RAPIER_TR'] = { menuCategory='SAM short range', menu='Rapier Tracker', description='Rapier Tracker', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('rapier_fsa_optical_tracker_unit') } +cat['BLUE_RAPIER_SITE'] = { menuCategory='SAM short range', menu='Rapier - All crates', description='Rapier Site', dcsCargoType='container_cargo', requires={ BLUE_RAPIER_LN=1, BLUE_RAPIER_SR=1, BLUE_RAPIER_TR=1 }, side=BLUE, category=Group.Category.GROUND, + build=multiUnits({ {type='rapier_fsa_launcher'}, {type='rapier_fsa_blindfire_radar', dx=12, dz=6}, {type='rapier_fsa_optical_tracker_unit', dx=-12, dz=6} }) } + +-- SAM short range (RED) +cat['RED_OSA_9K33'] = { menuCategory='SAM short range', menu='9K33 Osa', description='9K33 Osa', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('Osa 9A33 ln') } +cat['RED_STRELA1_9P31'] = { menuCategory='SAM short range', menu='9P31 Strela-1', description='9P31 Strela-1', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-1 9P31') } +cat['RED_TUNGUSKA_2S6'] = { menuCategory='SAM short range', menu='2K22 Tunguska', description='2K22 Tunguska', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('2S6 Tunguska') } +cat['RED_STRELA10M3'] = { menuCategory='SAM short range', menu='SA-13 Strela-10M3', description='SA-13 Strela-10M3', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('Strela-10M3') } +-- HQ-7 components and site +cat['RED_HQ7_LN'] = { menuCategory='SAM short range', menu='HQ-7_Launcher', description='HQ-7 Launcher', dcsCargoType='container_cargo', required=2, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_LN_SP') } +cat['RED_HQ7_STR'] = { menuCategory='SAM short range', menu='HQ-7_STR_SP', description='HQ-7 STR', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('HQ-7_STR_SP') } +cat['RED_HQ7_SITE'] = { menuCategory='SAM short range', menu='HQ-7 - All crates', description='HQ-7 Site', dcsCargoType='container_cargo', requires={ RED_HQ7_LN=1, RED_HQ7_STR=1 }, side=RED, category=Group.Category.GROUND, + build=multiUnits({ {type='HQ-7_LN_SP'}, {type='HQ-7_STR_SP', dx=10, dz=8} }) } + +-- SAM mid range (BLUE) HAWK + NASAMS +cat['BLUE_HAWK_LN'] = { menuCategory='SAM mid range', menu='HAWK Launcher', description='HAWK Launcher', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk ln') } +cat['BLUE_HAWK_SR'] = { menuCategory='SAM mid range', menu='HAWK Search Radar', description='HAWK SR', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk sr') } +cat['BLUE_HAWK_TR'] = { menuCategory='SAM mid range', menu='HAWK Track Radar', description='HAWK TR', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk tr') } +cat['BLUE_HAWK_PCP'] = { menuCategory='SAM mid range', menu='HAWK PCP', description='HAWK PCP', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk pcp') } +cat['BLUE_HAWK_CWAR'] = { menuCategory='SAM mid range', menu='HAWK CWAR', description='HAWK CWAR', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Hawk cwar') } +cat['BLUE_HAWK_SITE'] = { menuCategory='SAM mid range', menu='HAWK - All crates', description='HAWK Site', dcsCargoType='container_cargo', requires={ BLUE_HAWK_LN=1, BLUE_HAWK_SR=1, BLUE_HAWK_TR=1, BLUE_HAWK_PCP=1, BLUE_HAWK_CWAR=1 }, side=BLUE, category=Group.Category.GROUND, + build=multiUnits({ {type='Hawk ln'}, {type='Hawk sr', dx=12, dz=8}, {type='Hawk tr', dx=-12, dz=8}, {type='Hawk pcp', dx=18, dz=12}, {type='Hawk cwar', dx=-18, dz=12} }) } + +cat['BLUE_NASAMS_LN'] = { menuCategory='SAM mid range', menu='NASAMS Launcher 120C', description='NASAMS LN 120C', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_LN_C') } +cat['BLUE_NASAMS_RADAR'] = { menuCategory='SAM mid range', menu='NASAMS Search/Track Radar', description='NASAMS Radar', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Radar_MPQ64F1') } +cat['BLUE_NASAMS_CP'] = { menuCategory='SAM mid range', menu='NASAMS Command Post', description='NASAMS CP', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('NASAMS_Command_Post') } +cat['BLUE_NASAMS_SITE'] = { menuCategory='SAM mid range', menu='NASAMS - All crates', description='NASAMS Site', dcsCargoType='container_cargo', requires={ BLUE_NASAMS_LN=1, BLUE_NASAMS_RADAR=1, BLUE_NASAMS_CP=1 }, side=BLUE, category=Group.Category.GROUND, + build=multiUnits({ {type='NASAMS_LN_C'}, {type='NASAMS_Radar_MPQ64F1', dx=12, dz=8}, {type='NASAMS_Command_Post', dx=-12, dz=8} }) } + +-- SAM mid range (RED) KUB +cat['RED_KUB_LN'] = { menuCategory='SAM mid range', menu='KUB Launcher', description='KUB Launcher', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 2P25 ln') } +cat['RED_KUB_RADAR'] = { menuCategory='SAM mid range', menu='KUB Radar', description='KUB Radar', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('Kub 1S91 str') } +cat['RED_KUB_SITE'] = { menuCategory='SAM mid range', menu='KUB - All crates', description='KUB Site', dcsCargoType='container_cargo', requires={ RED_KUB_LN=1, RED_KUB_RADAR=1 }, side=RED, category=Group.Category.GROUND, + build=multiUnits({ {type='Kub 2P25 ln'}, {type='Kub 1S91 str', dx=12, dz=8} }) } + +-- SAM long range (BLUE) Patriot +cat['BLUE_PATRIOT_LN'] = { menuCategory='SAM long range', menu='Patriot Launcher', description='Patriot Launcher', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ln') } +cat['BLUE_PATRIOT_RADAR'] = { menuCategory='SAM long range', menu='Patriot Radar', description='Patriot Radar', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot str') } +cat['BLUE_PATRIOT_ECS'] = { menuCategory='SAM long range', menu='Patriot ECS', description='Patriot ECS', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.GROUND, build=singleUnit('Patriot ECS') } +cat['BLUE_PATRIOT_SITE'] = { menuCategory='SAM long range', menu='Patriot - All crates', description='Patriot Site', dcsCargoType='container_cargo', requires={ BLUE_PATRIOT_LN=1, BLUE_PATRIOT_RADAR=1, BLUE_PATRIOT_ECS=1 }, side=BLUE, category=Group.Category.GROUND, + build=multiUnits({ {type='Patriot ln'}, {type='Patriot str', dx=14, dz=10}, {type='Patriot ECS', dx=-14, dz=10} }) } + +-- SAM long range (RED) BUK +cat['RED_BUK_LN'] = { menuCategory='SAM long range', menu='BUK Launcher', description='BUK Launcher', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk LN 9A310M1') } +cat['RED_BUK_SR'] = { menuCategory='SAM long range', menu='BUK Search Radar', description='BUK Search Radar', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk SR 9S18M1') } +cat['RED_BUK_CC'] = { menuCategory='SAM long range', menu='BUK CC Radar', description='BUK CC Radar', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.GROUND, build=singleUnit('SA-11 Buk CC 9S470M1') } +cat['RED_BUK_SITE'] = { menuCategory='SAM long range', menu='BUK - All crates', description='BUK Site', dcsCargoType='container_cargo', requires={ RED_BUK_LN=1, RED_BUK_SR=1, RED_BUK_CC=1 }, side=RED, category=Group.Category.GROUND, + build=multiUnits({ {type='SA-11 Buk LN 9A310M1'}, {type='SA-11 Buk SR 9S18M1', dx=12, dz=8}, {type='SA-11 Buk CC 9S470M1', dx=-12, dz=8} }) } + +-- Drones (JTAC) +cat['BLUE_MQ9'] = { menuCategory='Drones', menu='MQ-9 Reaper - JTAC', description='MQ-9 JTAC', dcsCargoType='container_cargo', required=1, side=BLUE, category=Group.Category.AIRPLANE, build=singleUnit('MQ-9 Reaper') } +cat['RED_WINGLOONG'] = { menuCategory='Drones', menu='WingLoong-I - JTAC', description='WingLoong-I JTAC', dcsCargoType='container_cargo', required=1, side=RED, category=Group.Category.AIRPLANE, build=singleUnit('WingLoong-I') } + +-- FOB crates (Support) — three small crates build a FOB site +cat['FOB_SMALL'] = { menuCategory='Support', menu='FOB Crate - Small', description='FOB small crate', dcsCargoType='container_cargo', required=1, side=nil, category=Group.Category.GROUND, build=function(point, headingDeg) + -- spawns a harmless placeholder truck for visibility; consumed by FOB_SITE build + return singleUnit('Ural-375')(point, headingDeg) +end } +cat['FOB_SITE'] = { menuCategory='Support', menu='FOB Crates - All', description='FOB Site', dcsCargoType='container_cargo', requires={ FOB_SMALL=3 }, side=nil, category=Group.Category.GROUND, + build=multiUnits({ {type='HEMTT TFFT'}, {type='Ural-375 PBU', dx=10, dz=8}, {type='Ural-375', dx=-10, dz=8} }) } + +return cat diff --git a/Moose_CTLD_Pure/init_example.lua b/Moose_CTLD_Pure/init_example.lua new file mode 100644 index 0000000..24c947c --- /dev/null +++ b/Moose_CTLD_Pure/init_example.lua @@ -0,0 +1,44 @@ +-- init_example.lua (optional dev harness snippet) +-- Load Moose before this. Then do: +-- dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\init_example.lua]]) + +local CTLD = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\Moose_CTLD.lua]]) +local ctld = CTLD:New({ + CoalitionSide = coalition.side.BLUE, + Zones = { + PickupZones = { { name = 'PICKUP_BLUE_MAIN' } }, + DropZones = { { name = 'DROP_BLUE_1' } }, + }, +}) + +-- Load the extracted CTLD-based crate catalog +local extracted = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\catalogs\CrateCatalog_CTLD_Extract.lua]]) +ctld:MergeCatalog(extracted) + +-- Register a SAM site built from 4 crates +ctld:RegisterCrate('IR-SAM', { + description = '4x crates -> IR SAM site', + weight = 300, + dcsCargoType = 'container_cargo', + required = 4, + side = coalition.side.BLUE, + category = Group.Category.GROUND, + build = function(point, headingDeg) + local hdg = math.rad(headingDeg or 0) + local function off(dx, dz) return { x=point.x+dx, z=point.z+dz } end + local units = { + { type='Strela-10M3', name='CTLD-SAM-1', x=point.x, y=point.z, heading=hdg }, + { type='Ural-375', name='CTLD-SAM-SUP', x=off(10,12).x, y=off(10,12).z, heading=hdg }, + } + return { visible=false, lateActivation=false, units=units, name='CTLD_SAM_'..math.random(100000,999999) } + end, +}) + +-- FAC/RECCE setup +local FAC = dofile(lfs.writedir()..[[Scripts\Moose_CTLD_Pure\Moose_CTLD_FAC.lua]]) +local fac = FAC:New(ctld, { + CoalitionSide = coalition.side.BLUE, + Arty = { Enabled=true, Groups={'BLUE_ARTY_1'}, Rounds=2, Spread=80 }, +}) +fac:AddRecceZone({ name = 'RECCE_ZONE_1' }) +fac:Run() diff --git a/Patch-MooseMissions/Download-MooseInclude.ps1 b/Patch-MooseMissions/Download-MooseInclude.ps1 new file mode 100644 index 0000000..145bcc4 --- /dev/null +++ b/Patch-MooseMissions/Download-MooseInclude.ps1 @@ -0,0 +1,83 @@ +# Download latest Moose_.lua from GitHub + +[CmdletBinding()] +param( + # Destination path for Moose_.lua. Defaults to repo root alongside Patch-MooseMissions folder + [Parameter(Mandatory=$false)] + [string]$MooseLuaPath = (Join-Path (Split-Path $PSScriptRoot -Parent) 'Moose_.lua'), + + # Use -Force to actually download; otherwise runs in WhatIf/preview mode + [Parameter(Mandatory=$false)] + [switch]$Force +) + +# Determine WhatIf mode (preview by default) +$runInWhatIfMode = -not $Force + +# Ensure destination directory exists (avoid null/invalid path issues) +if ([string]::IsNullOrWhiteSpace($MooseLuaPath)) { + throw "Destination path for Moose_.lua is empty. Provide -MooseLuaPath." +} + +$destDir = Split-Path -Path $MooseLuaPath -Parent +if (-not [string]::IsNullOrWhiteSpace($destDir) -and -not (Test-Path $destDir)) { + New-Item -Path $destDir -ItemType Directory -Force -WhatIf:$false | Out-Null +} + +# Enable TLS 1.2 for GitHub downloads on older environments +try { + [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor [System.Net.SecurityProtocolType]::Tls12 +} catch {} + +if (-not $runInWhatIfMode) { + Write-Host "Downloading latest Moose_.lua from GitHub..." -ForegroundColor Yellow + + $mooseGitHubUrl = "https://raw.githubusercontent.com/FlightControl-Master/MOOSE_INCLUDE/develop/Moose_Include_Static/Moose_.lua" + $backupPath = "$MooseLuaPath.backup" + + try { + # Create a single backup of existing Moose_.lua if it exists and backup doesn't exist yet + if ((Test-Path $MooseLuaPath) -and -not (Test-Path $backupPath)) { + Write-Host " Creating backup: $backupPath" -ForegroundColor Gray + Copy-Item $MooseLuaPath $backupPath -Force -WhatIf:$false + } + + # Download the file + $ProgressPreference = 'SilentlyContinue' # Speeds up Invoke-WebRequest + Invoke-WebRequest -Uri $mooseGitHubUrl -OutFile $MooseLuaPath -ErrorAction Stop + $ProgressPreference = 'Continue' + + # Verify the download + if (Test-Path $MooseLuaPath) { + $fileSize = (Get-Item $MooseLuaPath).Length + Write-Host " SUCCESS: Downloaded Moose_.lua ($([math]::Round($fileSize/1MB, 2)) MB)" -ForegroundColor Green + } else { + throw "Downloaded file not found after download" + } + } + catch { + Write-Error "Failed to download Moose_.lua from GitHub: $_" + Write-Host " URL: $mooseGitHubUrl" -ForegroundColor Red + + # Check if we have a backup or existing file to use + if (Test-Path $MooseLuaPath) { + Write-Warning "Using existing Moose_.lua file instead" + } else { + Write-Error "No Moose_.lua file available. Cannot proceed." + exit 1 + } + } + + Write-Host "" +} else { + Write-Host "WHATIF: Would download latest Moose_.lua from GitHub" -ForegroundColor Magenta + Write-Host " URL: https://raw.githubusercontent.com/FlightControl-Master/MOOSE_INCLUDE/develop/Moose_Include_Static/Moose_.lua" -ForegroundColor Gray + Write-Host " Destination: $MooseLuaPath" -ForegroundColor Gray + + # Still need to verify file exists for WhatIf to show what would be patched + if (-not (Test-Path $MooseLuaPath)) { + Write-Warning "Moose_.lua not found at $MooseLuaPath - run with -Force to download it" + Write-Warning "Continuing with WhatIf to show which missions would be processed..." + } + Write-Host "" +} \ No newline at end of file diff --git a/Patch-MooseMissions/README.md b/Patch-MooseMissions/README.md index de08f42..d6032b9 100644 --- a/Patch-MooseMissions/README.md +++ b/Patch-MooseMissions/README.md @@ -25,6 +25,27 @@ PowerShell script to automatically patch DCS mission files (.miz) with updated L ## Usage +### Get the latest Moose_.lua + +Use the helper script to fetch the latest Moose_.lua into the repo root (C:\DCS_MissionDev\Moose_.lua by default): + +```powershell +# Preview (no changes) +./Download-MooseInclude.ps1 + +# Actually download +./Download-MooseInclude.ps1 -Force + +# Optional: choose a different destination +./Download-MooseInclude.ps1 -Force -MooseLuaPath 'D:\Scripts\Moose_.lua' +``` + +If your system blocks script execution, temporarily allow scripts for the current session only: + +```powershell +Set-ExecutionPolicy -Scope Process -ExecutionPolicy Bypass +``` + ### Basic Usage Update a mission with automatic version increment:

      sefxwr5t6yM7 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%0AAw?(S-q0%FP1$*a%^I8u-KMtKw?3D$5raDy0 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

  • {LQs#`4ogQz^PZ_Fs&`Y9F2C4rfR+s2=6; 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