From 01531f0c734b9e6ea76b4360f17d4ae69766fdb0 Mon Sep 17 00:00:00 2001 From: svenvandevelde Date: Wed, 11 May 2016 17:18:50 +0200 Subject: [PATCH] Progress --- Moose/Client.lua | 8 +- Moose/MissileTrainer.lua | 85 +++++++++++++----- .../Moose_Test_MISSILETRAINER.miz | Bin 114424 -> 114675 bytes 3 files changed, 67 insertions(+), 26 deletions(-) diff --git a/Moose/Client.lua b/Moose/Client.lua index 00315964c..12d3b9888 100644 --- a/Moose/Client.lua +++ b/Moose/Client.lua @@ -242,9 +242,7 @@ end -- @return DCSTypes#Group.ID function CLIENT:GetClientGroupID() - if not self.ClientGroupID then - local ClientGroup = self:GetDCSGroup() - end + local ClientGroup = self:GetDCSGroup() self:E( self.ClientGroupID ) -- Determined in GetDCSGroup() return self.ClientGroupID @@ -256,9 +254,7 @@ end -- @return #string function CLIENT:GetClientGroupName() - if not self.ClientGroupName then - local ClientGroup = self:GetDCSGroup() - end + local ClientGroup = self:GetDCSGroup() self:T( self.ClientGroupName ) -- Determined in GetDCSGroup() return self.ClientGroupName diff --git a/Moose/MissileTrainer.lua b/Moose/MissileTrainer.lua index f5080dbfc..852a7fe89 100644 --- a/Moose/MissileTrainer.lua +++ b/Moose/MissileTrainer.lua @@ -24,6 +24,9 @@ function MISSILETRAINER:New( Distance ) self.Schedulers = {} self.SchedulerID = 0 + self.MessageInterval = 2 + self.MessageLastTime = timer.getTime() + self.Distance = Distance _EVENTDISPATCHER:OnShot( self._EventShot, self ) @@ -32,28 +35,47 @@ function MISSILETRAINER:New( Distance ) self.DBClients = self.DB.Clients self.DBUnits = self.DB.Units - self.DB:ForEachClient( - --- @param Client#CLIENT Client - function( Client ) - Client:Message( "Welcome to the Missile Trainer", 10, "ID", "TEST" ) - --Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) - --Client.MenuOnOff = MENU_CLIENT:New( Client, "On/Off", Client.MainMenu ) - --Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuOnOff, MISSILETRAINER._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) - --Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuOnOff, MISSILETRAINER._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) - end - ) + for ClientID, Client in pairs( self.DBClients ) do + Client:Message( "Welcome to the Missile Trainer", 10, "ID", "TEST" ) + Client.MainMenu = MENU_CLIENT:New( Client, "Missile Trainer", nil ) + Client.MenuMessages = MENU_CLIENT:New( Client, "Messages", Client.MainMenu ) + Client.MenuOn = MENU_CLIENT_COMMAND:New( Client, "Messages On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = true } ) + Client.MenuOff = MENU_CLIENT_COMMAND:New( Client, "Messages Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesOnOff = false } ) + Client.MenuToAll = MENU_CLIENT_COMMAND:New( Client, "To All", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesToAll = true } ) + Client.MenuToTarget = MENU_CLIENT_COMMAND:New( Client, "To Target", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesToAll = false } ) + Client.MenuTrackOn = MENU_CLIENT_COMMAND:New( Client, "Tracking On", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesTrack = true } ) + Client.MenuTrackOff = MENU_CLIENT_COMMAND:New( Client, "Tracking Off", Client.MenuMessages, self._MenuMessages, { MenuSelf = self, MessagesTrack = false } ) + end +-- self.DB:ForEachClient( +-- --- @param Client#CLIENT Client +-- function( Client ) +-- +-- end +-- ) - self.DisplayMessages = true + self.MessagesOnOff = true + self.MessagesToAll = false + self.MessagesTrack = true return self end -function MISSILETRAINER._MenuMessages( MenuParameters ) +function MISSILETRAINER:_MenuMessages( MenuParameters ) local self = MenuParameters.MenuSelf - local MessagesOnOff = MenuParameters.MessagesOnOff - self.DisplayMessages = MessagesOnOff + if MenuParameters.MessagesOnOff then + self.MessagesOnOff = MenuParameters.MessagesOnOff + end + + if MenuParameters.MessagesToAll then + self.MessagesToAll = MenuParameters.MessagesToAll + end + + if MenuParameters.MessagesTrack then + self.MessagesTrack = MenuParameters.MessagesTrack + end + end --- Detects if an SA site was shot with an anti radiation missile. In this case, take evasive actions based on the skill level set within the ME. @@ -86,9 +108,9 @@ end --- -- @param #MISSILETRAINER self --- @param DCSUnit#Unit TrainerSourceDCSUnit +-- @param Unit#UNIT TrainerSourceDCSUnit -- @param DCSWeapon#Weapon TrainerWeapon --- @param DCSUnit#Unit TrainerTargetDCSUnit +-- @param Unit#UNIT TrainerTargetDCSUnit -- @param Client#CLIENT Client function MISSILETRAINER:_FollowMissile( TrainerSourceUnit, TrainerWeapon, TrainerTargetUnit, Client ) self:F( { TrainerSourceUnit, TrainerWeapon, TrainerTargetUnit, Client } ) @@ -101,16 +123,39 @@ function MISSILETRAINER:_FollowMissile( TrainerSourceUnit, TrainerWeapon, Traine ( PositionMissile.z - PositionTarget.z )^2 ) ^ 0.5 - if self.DisplayMessages then + + if self.MessagesOnOff and self.MessagesTrack and self.MessageLastTime + 2 <= timer.getTime() then self:T( Distance ) - MESSAGE:New( "Distance Missile = " .. Distance, "TEST", 0.2, "ID" ):ToAll() + self.MessageLastTime = timer.getTime() + local Message = MESSAGE:New( + string.format( "%s launched by %s: %4.2f km", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetName(), + Distance + ),"Tracking", 2, "ID" ) + + if self.MessagesToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end end if Distance <= self.Distance then TrainerWeapon:destroy() - if self.DisplayMessages then + if self.MessagesOnOff then self:T( "Destroyed" ) - MESSAGE:New( "Missile Destroyed", "TEST", 5, "ID" ):ToAll() + local Message = MESSAGE:New( + string.format( "%s launched by %s destroyed", + TrainerWeapon:getTypeName(), + TrainerSourceUnit:GetName(), + Distance + ),"Tracking", 2, "ID" ) + if self.MessagesToAll then + Message:ToAll() + else + Message:ToClient( Client ) + end end return false end diff --git a/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz b/Test Missions/Moose_Test_MISSILETRAINER/Moose_Test_MISSILETRAINER.miz index 53610c076c73c8595b0efac05f984f2d68f4f879..e971eab9dd73dc800c111328ee56f68ae5b16fe2 100644 GIT binary patch delta 7823 zcmZ9RWlY>byY_LnQfP74#jUu*!s4#Q-QDG1phzju;w|p(Qhb5p?kw&UFDzcHZ=dJ= za86DpGn2_&_vB6{`F*&q`)9PPzi1zt5T`S+Ks0piET{+wiA3ou8HkiXvB9R>ju1iU zL2X@Yw3E7t+|P5RkUW>ed>02)Z~f9S%_wuY|Fe;?zMzkbwUZW@x+O`6*M z4iDap^C+ih#dmL25G=cGjM}>Ld#1_>WqKTNlG;akw6@5&0T490hX}dqY3y;_rn4|U zncB%-M^=^hDLyN;K$EKgAU{s|+PKl-uzuY%P8Xl3$p`7V{ZnF>Ufev=g9)zGg@#sx zy?&J&IhoY4b9cb$=@!ZZ!Q~l~S^+$t!4@rW#C9g>ZB&HzMekKwIb6)ng+P|c+HZ+m z-fdGN*FuNI>r$4p9YT{ULCZ$4`jw__knn||zfNaT+yf8Z#?JsG>}eR|;WJunYOJUsh(E3rE=ZYY?$o!66QeYd6kz$*CPe=!qx%1<@ zPK_S#0{g*!JSX*lv20iMtoI~%ELT}qe%Prg3TiD0bf9@W4YYLgMIj;KDJEonm7>Au zi!kAg>ucs|_Z&zy+G*@rHmR>}jfB9F~6bEgo#nl^;Jmgws7CB$+>o^i*p&uuD z>-&-S^-c?e8bDzb(Wb+j9w^kR*_7y6wgh3H7)=|*SGJ`p#IWe{bGQi~dkmw+^8Q-t z%8!yqW4tOhvO#uZyxUGy+JBjNf6+rbgRRRxNrq1KG1LPnBzz@{KR`qX{_x&4iMx5P zdc`4+_EJc{bmIGEpRNHGF{t2R)JjNE{Awa0ZDJ0#>|Dis9agw59r@&)k;?Gp&dS~&boBZWVsZOLVmzT=m%K)xol_M(DqDCw|oXz01=CMXFo z_!)XF)Jm4NWc&qmPKZP64^yp+xr=gsF}m1_F#XbbNOOVAllrWS0}gH_Rg^rZ`G~>u z&nkO0WjJUI1LnEI0)AGD@%lX1XyWQMiDdbB>7D{n#I%K);j|+pdcKjovGFx|KDw}I z-~FwHnY&UGeSla8cK^P?; zs((JqnFxi_mQf%Tih5%SJ`*?GQfnw9qohF*$PS*%5(wsS zZFzfzj(aURj(|LFt9ONbBuS=};_{u2G09iAg3!Z8d2f3=0Df`t)d&qj*q;aw+MO|@ zCM^m+E(U}Qu3xewNB+*0UgKt!6uCA8wVCCYp zH|YkS3<1ac-6OSd2qK*DIW0kG=z=@lBT42*UR`~tz6R1gHxmG(n6U4(<)LkWBbr!qfb59Nqh0z8(#+shTTriW_57& zrvW$KXbU=Ls}{PQQ(4srMzX$u*bA#V{4c}}Sd5P0fr&C%wrq?6>pv{|f1v6`Zs5*h zXB5AkFK+o+jMi$)_g)(T<{055(ASLOeg?d2_2qkStn~R#ct9twF<5xtD#hAjH1~S< zj~EW!{IGsLbm3$)hBGw$SgmPtan@We_bmCwMj<5+ipv{O#ZUnA zrx3@_ENdlbxCqHHM>D8@55*$pB2X+oU72Kpz_k#=rByd+`}O2%ygN6S zA@oATjsU0Nqe|TzKUB7}B82y_KN)2^vx8x_MnNyo>WOq``Tnyiy14pld3orh8$dJpSx^Q;6d25 z9-sEUlrp=;e>NYfeIN{lzT-sSVyJyOxk|nZSYZDs+Nh08^|XdQ$)FgQteVd^XY)kyRZ7G;5^=xe^xd*)Mzy#dnMf#pBPlW+!swM z&&{BqKa~!hIC_NF5z9nOq}20AYY4KN{_8D_k5ppfpLyuO`~g_VVguI8f3DA{AD|uy zTNPPMOYgevS&%jJ4%Bn+s&C=@?~Kzt<&@G9d$-wfeqH(2@FkCKTmzbFtbb-5!s^T= z{tzlyQhy3FT_moavS+rb%`FeT6lIi^w#p*r3Nrf(p920qY?}SO%l*s44Sjh&`5XMq z^-!zNICene=+Rlv1Clh@RhL4u6I|3u&dl}UNPEPDpg~>D&iw^aF2W3)#6^0 z^+0zx8rwl};LS!U{O_}!8284+@A`6g`uP>eHajsSGL@y>5WS2 zBeLp5)GlVszi6#!$%|bxE2!Mb7hSRH@fOD=RvE4lQ7$2sZ@U8sw;@RqJeTeo5+=EY zsIj-hO|Rb2#%ndObTVZ#1Sf2uK)5k~(wJz|2|GuU#wJY|>r*twzHQc=rVYj^Alha| zGyMK@Sg{5cbojO~TN~?6t%2VZeE6vzs}X^;KaxhPKL$0T)_tjwCKsxtIy_)9{tOxh z@%0I1HdlSS`{V@RIqg+z)!up{y^hV*bt9?b&ZwC!8+@l1rNka^HLVvcn7m0GpyAjz zIknVJPRH=xg~$EQF|9h?ec%UZ#beuR2A+= zfOX@xcNl%q{%Z@fM)2=`vn{P1fq08yw492==E1wz)|L^#D4os`cd1lcyoNX`HS+9-<_)rq zh8Nsogbr!e4z8cQhVSc(=o4GavF2tY%k~1e6;CsY1T1E!l#jB$eJQRr1YJvpDOUO=n-6J5?m!a|+wNj6Xwo~s`>8ErEUX={?sZK8X$thh;sTwh^ zAX>9%gFRxi?=uqigLLGu9VS}NH_gNZH~QUeJLQjb**8{eFTQP8r?s(ERFv1H#5vo2 z$xa=yBZDNas5ig*F^X*e9y=`^ywG}}#|x+j6lU{c#xx7lSMWX248;{xHEE&J@Vf+BNmsx7}&4otqQ4Z--banC~K<_xc`DCO_h z)$TDFyBGSegN3CVNeLgXiRbMZjymuV6_*KUe!$w#LNUl^#SAx-Qp_xc8J+tmJhc5dA zsiU|3EM1xTACFY3N2^OGU zvCN2+!pM0=q;f9%K%1;W-FKLG;g-Q`6nL)m9K8)I9zjtBjQy}`#dsmbHb6vC_)Ms) zr_Qzigr$ulMT|oPa&citv>W-+Jb$pM&0?LB#gZCp58tuWR7K{QV%M0uF~oeJ@mOlCs*%)8tSa=Atbr)&L~pF! zQdpXe-Rntz1CxHkK%3449w6ykM!+vh`(?lF4Jp({Vw?isEPq?d!(|^#CR0<|UCPnd zU@u#yvqLzJ*mT1MVdJDtRBhtNtt*v(M>vJ#clqPK6W@>i|9v7qpfw*IXijq*m>ElL zb?~}ELfJ$bL(cOjGF;lH`PMhK1O8(KM~bx1NP~pmuqoc-jsSUcXyN6w>e5VX!`NdK zXg?6v)y&0v$a)q;SwvW2xwpgbRNb~xFt^U)Dv&{ME6n%WI7ycH|ItoTuGmL+F$M{6 zbpxRj#-(#};g>0K2T9HS5)Z3n0ades+oFFlX<wA(myU z4mbNkL4v>;UumLk`onrdzEf-jFUz}9D8nY=m701T-?WZWIZQv>YTSHn>xW#&EF{(4 z4x1U;DXsW(g%zULLFAw`Ub>;notdvVu|IWbESGTHHa2yFH7R4G$N9TMQJ#D>eDRx* zcqK`xJ22Z+CyE1EAwF_=!^P!9spM&`?I>y*bU_rA!)IWc;&+yGLW48L@tyqRwoKFJ zh+Amhu6yfTj~B@$n^)P8IV*0IzlPJtDf4R_bV0?w(^uQS?|Emla~}+Wk~*VJa*| zS_j0 zsrB|MY+Z}u1qsJ0Xn|k1ZsaE%4=-vRpxJm+KQtsJU-X@&=OXvBW%I_4xv&({P-pzN zol7t}Xm|Lk1wyYxZ?82N4RzdOX!igf_Ya_OrP8<^Px8?+{#ptMDaTl2vyMY$+{-Z9 zkgxXoe}w^_|8yaj|JAV>$730)56yw?>?z;$)q~T@6X#)7@%SM#!@^y&Yv##1(<>@L znFc`6x1oxs*jr+gtxUpBy2}hRGz|*Z^off~2K$@C_=~{~p{`M&ZGO!la5eo3GcWZ6 z>S^S9X0V^@eizE~=j23aS8GxgDa9FdCl-|Xd1uYFn{m=&*dlqUn z?k?QMn>=fPAzl%Pet&P)%jFl~oZgl2EqZ|!i*|BFeUsvBi8F|t7r&gZ;Lgwg-(BqY z=vg-2qs{g2Cbs~YJr%fi`>lUSD&VvAd-9~=t>)E5pn@3vvXy&u?(+IgP!1!ee#b4C zM(o=nrQ?GuzQFSqx){;obCZo$xgJG=b9@~gYJ9AA zucnY?y)D7`{D&xv7Q9WHb@Fxi{$$ceM|$J7En#l#3JNekAVubRymb=jhv~z~shr5Q zrp%^qiOFQEVlBP)2r7&ImO9hn<5hqz6~7Bk)a&SbN8CunP_v~e$#Dg4eZH`HDVJ&W zaVaLfJv-1;@qPzoku0nxl4KFzO~z(ToGfslC>Fx&n@tb=S|5u}P0AhJi2-=6S`DC8 zICUe_t^|0pJg*PDV8K4nt#fz z2Z9`zbaf-`{D`+!L}-58x`=j&dPf%~+Blf1&J&q<+S~@-g`LUB_FSTE{9uWu`9e@~ zj3j#&5}MqjG1L4YU_Nxzdf54N*;V7bu)VL33IhD4CVJlOT#Fff9XMd@$4#2javICTno6KSW~1mAQiQeVK#(hpdYyR0 z27pWyR7Ib#0P!S{>3CUJ2zD^A^;mQHdnLrIJUdq`Xn|va!Prl^nVw@oWefkq!F_@i z@~Wn(S1PvPl$Xl$XEH%eYnTAXvobyT8&^=epr(0Cv%B`%b3S)_s&P>6dfJQl6$Ozi zt6u8?3s?5RbO2uV!Nr+4I*i(2a@f<^4mdO#eZ6~2MQKhQs@ZgI{9ADsihxzz>!s1n z(tbrDGL_%uofAQVI`X&#b>PkWc=HUMySTm`$6w2Sna7SG{|MWSZw~XKm%QMM@V717 z3q7}K&W=RXy6jD`+^clmmtPdjR%XNj9R({LBjw)C%jNRpb{g4YOM{x)Bxb{R__QTehy_zX zEV+8^R&dR#f1;)_whp_N3mQkUv~+kydG@pHb!?T&PX+^LaDEYi2mhx}#1sn4NxW_t z)&Y08mnsW5(a>Idh)`-i!84HnK)UOl{*xusx-_{$WayBKG`8eK3)g7YG4&gBz5E=b z_oc@lmkAvei57jVdyAW7|59eL623Z33X6~VB z`tSk!Gdz>2k!@f93Gsgd#UR!PJ>-CNg%EiJTlj1jo9TYW1_Y zQN{NX;fpoey5JxTmHqeQsxqaLBEj2eYl(hrnAtg_=@cw=oE(M5ZO!SEUIc~HjNXf{ zj>OP^{QDiF$HzTk3da1oD+;&d*z(}}P;xjWUPyK=n-&XhLd2-P9ZTJ$$00@Z?W{1K zB@va3MCts#jfn(vi%B{#1qq{I%YDtVul29B-eIrje5*{Tm57qQ7*(rr(7l?=l}$Wo zNU-DMBw3A#%z*`F_Cw%JAA>iD3@;>NCTsd=BqaU_kF3k!+Wv2leMB+)|FaCdA%73;b0tN!&zx7spi*XAX z0pT;w|92_f+`a#qlwR?A%3iBr9O#L@y?260iFQZZwYjlx@Ym#oqF=K|?s+B}{r+uZ z%h5#5$$w2XimWBlT>W>EJ`bU9^<~T^&$vE30^XPB)}xzdd=Nu09Se~4Y?7^C+FX@p zhqwSq3iG_rXOwmyB37*Ps1N4=`6UIAixhb5S+LO@tn;&DZILANqLIi$~#PU~)qh1bM=*D&Y- zQ{~IeVN{LE^j3lBmqy;zK|{$TtS`*+9cx2w2Miu(kj}w@Hw@of%TUTyyxcVCSaxTE z@9YK2u(tg@Og{aL5WIy0y5gxG((d*!vQcG9bgYcv5Ffp~76#k(ozy`Olz6Z{Q>)}V z;Wuvbe3Yo48TBQoV2Js9CmuqXMzzAgpRM1$8>}{XEW4wkFB8=xKJIXNV>1=*|@ne9y{X#)vt(vR_x73Flum#Ly0t;9AG zY6zv!>iE!85?v<#lq_%FUn|@IEniMi*)ng-GgQd&6<2>)Q7x%R+sk}g@^0j7pyPQy zja{>22+kdG01ga0$EFgVMvA`Q!+0@W{*fn`-3?vt9BIEaI@tbF zyp3t3swR&jNn{^F88VW zfvwIwSYBIqRUBd(?ie)JN_sKpsQayMwKFYv0G$D-j1j@z_#C9d>l&vHYvQ$Y~E0i5%lUi9cunc|zz-X)7~2x@qO;RZj<> zi!|ZLT*#_lCG$^wn74_>(dN@L&!8RUh=CFLG#^<%l@B&$8nga}1462W0q}}fg`9%X zO$;`{?E;re`p3kT`Z*(C(wYMD)nAbR1B3Lsf0;##e=DLY>i-Ubr@9bz5vkJ|p@?kc z|2NC{2af;J0|8+!-RWO7#s9^~{|Gdi)AON-d|Iy(6 O8;k$&gWmZc82vv+CIG?! delta 7560 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