From 357927902dd893bc5361b7845087aaccbe00d79d Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:14:55 +0200 Subject: [PATCH 01/62] Fixed incorrect variable getting in openPlaceUI function. --- addons/explosives/functions/fnc_openPlaceUI.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/explosives/functions/fnc_openPlaceUI.sqf b/addons/explosives/functions/fnc_openPlaceUI.sqf index 1bb78248d2..5ad79381b1 100644 --- a/addons/explosives/functions/fnc_openPlaceUI.sqf +++ b/addons/explosives/functions/fnc_openPlaceUI.sqf @@ -51,7 +51,7 @@ _actions = [localize "STR_ACE_Explosives_PlaceMenu", localize "STR_ACE_Explosive }, { call EFUNC(interaction,hideMenu); - if !(profileNamespace getVariable [EGVAR(interaction,AutoCloseMenu), false]) then { + if !(profileNamespace getVariable [QUOTE(EGVAR(interaction,AutoCloseMenu)), false]) then { "ACE_Explosives" call EFUNC(interaction,openMenuSelf); }; } From f2ef53168bc25801dfaca7e19221b05be67d6635 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:15:31 +0200 Subject: [PATCH 02/62] Added the cellphone as a item. --- addons/explosives/CfgWeapons.hpp | 14 ++++++++++++++ addons/explosives/Data/UI/Cellphone_UI.paa | Bin 0 -> 34032 bytes addons/explosives/config.cpp | 2 +- 3 files changed, 15 insertions(+), 1 deletion(-) create mode 100644 addons/explosives/Data/UI/Cellphone_UI.paa diff --git a/addons/explosives/CfgWeapons.hpp b/addons/explosives/CfgWeapons.hpp index e239ed8841..fd142019e8 100644 --- a/addons/explosives/CfgWeapons.hpp +++ b/addons/explosives/CfgWeapons.hpp @@ -47,6 +47,20 @@ class CfgWeapons { ACE_Range = 100; ACE_Detonator = 1; + class ItemInfo: ACE_ExplosiveItem { + mass = 2; + uniformModel = "\A3\weapons_F\ammo\mag_univ.p3d"; + }; + }; + class ACE_Cellphone: ACE_ItemCore { + scope = 2; + displayName = $STR_ACE_Explosives_cellphone_displayName; + descriptionShort = $STR_ACE_Explosives_cellphone_description; + picture = PATHTOF(Data\UI\Cellphone_UI.paa); + model = "\A3\weapons_F\ammo\mag_univ.p3d"; + ACE_Range = 15000; + ACE_Detonator = 1; + class ItemInfo: ACE_ExplosiveItem { mass = 2; uniformModel = "\A3\weapons_F\ammo\mag_univ.p3d"; diff --git a/addons/explosives/Data/UI/Cellphone_UI.paa b/addons/explosives/Data/UI/Cellphone_UI.paa new file mode 100644 index 0000000000000000000000000000000000000000..38360ee4da26acbb2eb7a66449043e60a5049491 GIT binary patch literal 34032 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%0A&PpcZ=TY-uM>c!6a8ZU25}nEh-SZ$XM1!r4In zq6Do!#hfkkP&79K7jCv;wKj~5uHF~`1V387Osb{CiZ!PsP-`V^!@!ozT=iR1r%tt@ zXLB3~v?GQzQAqsS-w7TDa3y(^@+o4!>)_XN!+5n^C2PP4c>ijv;n&WQLl zC{F#zdA{~VP)?N^OIL9hMQepJuG@$7G74d)5SzJJP#c(wjn-DM(_MWb@C5elW%L+ zqWODDN^molAf+ZIyd*3Od?ImRu6l+uISm)B^loTG;_(oqA!r>Eft!(+1ryLB1s;st z=4GtZ3xbgk;#dk2H?Mw80CpGC`f8CF)JKOjY6@7C5%wi0m_(Y=op^ms%?g|d%y1UM zeXqo!NHcE5HhSL)@dJ+FnFEzNe#U=A@~mPuuuWZFl4`AYaLUlrB7@^fl|Z_1;o`-d zt51g*hW~q3upt64dC`VNzs{@8o##e=nde)VdnD&7&lW%sU|cNeLX(~~xu8;AQ0V1l zL!T(XhGN!6P-d-1{v2{184j+JzxI?`K^pnGpgS5jM@6?F7}dr)lQ{WquV%T{nXmO?exaVYMqdmUGft^L zlqm%w2IG`!qf|jzgB;asf(U^Q*%Xbb%6={B;!T~BLYR%jAL4SDMlYl9^=*OXT$7h1DHnn@i(VTp}ZSQdVIV@0`iQW z)_8eQ+_^#aS`a^=yqvFfbx_@2=;JecE^fkL5GCvYzRuM@)vzDgG8k>)Taf@Isz@8+hb-~SnlOdDjT5U_?9?wbJ8j+I6mkIDn?&K) zz?TtgP6d2mr`2fnyR>~rUwt^oaC9ki&B7pE-#!w?%t1+0hfcEDe4|c zQpZrA+^&TmBZ%Ystc826-&9&}_&F>`BO}AY#*x0<%_awU=E~M8U%=|`c^hRjpL*&k zob+naNCYG{aQwOtfiafKUJ>jUSeNI-s^+4I3rqlGlS<&?!VgAP>9=Ln{!C4hU#f3U z#Vw%;L(7ftarne^@TKnQ#I=+p8Ar{}1NTOQ6|Ddquc?c=x_+>sZmEvLq>|)|X2s|k zs>QY&M&SEXKmij!gm;Z{hkN5kl0f28QgB;`I@*=VTlf+JYVvuWki^zC9HItyU2{3; zeJQfyC0_91LN>W7MvsPtMMhHi5tt*wtjCD@Tw%94dt1fzW|yLcavVgv(!!V5;LP5AU& z8-*;fK@9FPf^O>@xetTtODW~+urD+`9knYn% zY`9Vc1RPn3iz>avT#H`EH)pzT!W z+SxpJH!`?@AMC%;m1G1t?>}$=^w~*QQXp~#Tkq!=451RZN8*#`g>~2&@ALdxED5;o zlhAvw0*^9RrZTQhWC%@O=-D4eq!f{g%eHRBYtcK{XqRm}h1aR`#$KFQ0bfDh(F*^8$vpZZ(TWS%wvHD0T!qhzVLyDJ(uahSbo zV|STZNQN0F+W6)#S85^RBRa@?)HQXsVH;%|zdLRm^GuYngY$5RT<)m1rKKIiwSmlQ z>ZG3TQ9MNQp-ia#lC??o!NUE93m5QOuVvmD?=wLc73jn9+Pssq2=Rm+hTM#sl^HjZ zpC$svNGIl8;SpjKBZg~Z^a9XZa|*I$N51-M3wSdN%xUF2H*{^FDA1(2@V86#xG9J6 zn!tAVF325@k+b~-)YSX<`S=Mf!oyry2t zGaKSNh2oS;^~?FDc=WBt3bj!8ep)$3hKH}^holB-XA!H=k6%g4oi&D8f(;w4*Xe&e z>PIBA(n_2b{knerdOUbql^c1ho-YbU^UH&>gr-q&AYT#Og-8eV;C`8(1c8?d$^?9? zm%r-}W7CO=egQ(g_^leFK;-qpuhGZqgkrCEOO2iv#BRXJn|_8g0ToiRHx>JTEuki3 z$~4n*+yrQE`m3?MPACcl)mb+Jny+${gI)~iQ)A2&#K5-(T;qkz>WmkP49w>ROJx%9 zvM`VrUU5Airk<0Uq#mlP72`wzD?#>gbzShH@EDRuteUhda7^Q?h-AkGa-J$+-uhW@ zO<6Bn3Is~8L>v3%ub4yl*IzJy5RXJ9wPX_S>0)c}dMjuC7TX`Y<(a~cXGS_i$?bf8Bdr3ch zeO#yCvj-Qo@h)FYSh*4xFE0&Z3Utd`svJKiZiMkgIS%gHu7%gb;yH}^Sf}zyY*gU2Y@h%75f>wUY8Nd^1%jJY#+p$I!%fi! zBMFYz3O5&{4L+A=Fe7j)x;%ynZrwE%=HgWP2|olWSLvQG>cL`n%h;HWPav#&wT{nt zdCf1uwGNC5wIn{p6B1Nk=e!zZGw0S>fOkJ zYF8385TFQr5ZMrz^*m(~mNQ=!xL^=|>p2ygc!9{~P+e6fS43=wtQ+&|>${^Di>7E<(tF~uje#r!qzGT z*808f(y-GU7%jV3K7a1qsv{TA#I~Jfw>d8YqzsZkhq)5BPQdROI3Knw^~pD5Iq>W_6_5vKxSGAw{t@; zuKk`FUh;x6R*9RIFb9rLwAm7Hz%?){#)uPU=0IMhIs(B>?u@f}*EI^t&>zVOh~5cb zSc(#h#?J;k9zwa}I=49m?D_kEs$cVhcO!xj`po3^VPH(l@+{ffTX zuHHroa+7-2X~c;d>Z=0Ixl>s-G*|6Pviz<+7rJ=I8NUpD5^vtDwQI-h1?KpAf3@nJ z>Q|?2&haHItoaRZUZBJqraZ}Id8kkV4V&APz+f)i;hr@X+kd8NA| zjNpwA9CyFq?}3ZmEa`~A)ai}{^PZ2{4h(fc>9V~%jv7!;6jEmZHR*=-M3owGeITYa zdTZMSA>U`q)>(n)FF^*)AlU8XMD*{wp&s}-i&Q1g)6C1)0{ z?O?@NA{!#&bi;t5S~l^A$<9D0NNe+N#PdT!b~Iq4#?trrw!<;Eu^;BojN_YU+-!*< zDdV`KG2&%JKqNA!G(^T0DS$5971_X@)m3he$XvjZkyhRWJR!nZZ#5o}KlQ=opMe=B zeO_Tm!9^%znY4qC3T&L-C?Sa`N=n^#Arr?^;Iny>_``4FqCi%U99-py*+FYa(%Rul z@;+JPy?#Al3Q;a#%3k#T{U&lWmrN@O%356c!DqPHwMiosjWXAnyB2zN;Nrk(9Y4G8 zVlz7;v^tkS<^avReN81tsER+FwEKl*3Fg#+3Z$bH@JD1F;7Oh z63;-h<-Qv;>}-Z4FawuvKUU5cJ;OSiQx;WJYD~ZhZ$`G<%Mr9P z56HYhtB(`tG54@~fykX%awUj?055UC6Z!b|&wSAqwqNvB`4_j2m^EMOiB^)h@j-}ZpM1$LY04xM(+zNI@9n(es5^sGj&*OtejJ0*jHfGHx6>=Yr1~ zEw-PMi5rlN7KT_n%@c^oNL-ui&OEIm`MBtgJF*g0y+gWrN{+MUn}t%Ar&5oT;#UQT zAUGhOM=FP-H-Rl@PA;$|orV+*7Z6jX6FSiA%&+onlZNZz8+s(?RuOKU@w)q^CER*% z4#V&aGcc>TH{l!vEs)GL7&`ePDXYNZr~dH7doWdU#uY*QbzD#v===;2(H&+EmrBA~ z202U#CL|^~gsOVwM)S8gaWRH;FxM^OpZY}jYkf0P%NCNSl) zs>>_XVJTr@941q=u;-}fg_#!c8kHtR0TuTosyfTc_@;X1P}MT&d|4qj49`yhw0`^-jZrVpix<$W&39x$r5kutvS*CdrI z=~6d8c#tEUoZi7J?c!`|9WXm0G#5anjAlC5pR zMM;oiT+_NEgYx#bx7n^)(StnmK`LJ!%AHrLY3C@I{i&xN=Yt45vkg*k--X4OceKL>+(b$CG`SSu~>fDTP0EZkKCf^vQUuO8k&lXT! z&dYcw3^W|5zq*)CnZ^1?b}{%mZ%evvn%)HucF&GOo9pq~rq>`3V%!f? zJCQ%{FTs+fdoyl8zN8ZH*l6kqhE)1X8yhUPMvFDTidFgAykc*&FL?;+I%`_Kh)s{@ zi$Yl28;5G+qHcgwt^^j^j_fPqz(Pm6Kosk4_!3>T@4XY$YE5M0(nX|_kKx*t=v8?{ zEpGE~sp45rGw_flpx`dV86dTWX3GZSz)5Vab!XOF@7=JW({4}Q%~3Ra;2F0BI?4F<6*)QpbXqIP{-oQlz4oAz&WRj$R@Xdy! zRgOejL^EG!nOp!$|0m1OxK-Ti`oe_y`Sa(5d{^LID<0eqKGnO9o=R|vCuPon z@#|qk&Wr9Ku*$D<@0Ig{i@F6NTp2`X5s;6AwT!#>aPxW?KYwmBZbOG^+0(cJGoz&n zn~x)~u!Xc%x$zGfaNVy*%iWmuakv$!nELFT%;G+QN#a~4`-{K7|6EC~^_#-U^%#u) zWfRGrYQwS3Yw3R-LZ$|@wq zmM;jtX(jJ&EkmAA#DyReVaS@hjNW+dW+Ttm=?!_|P-eC)-|Ea1nkBK79CS%XB2VmJ zUMl3*BB4_yVsuMkT{1jLSK7(9t@e%P>4OZV7pE|v4HF_D91P!R?+G19v(O|(6%k5} z(5jp-MV?y7vneYxW)ortY6r!Bm_D-1=~ zfwbUl>kwgZg}}$O67=t)!MJ+dCf3M!Az>#@SkZjtAW3!z%)eZfyNw1QxPIm`DJiI{ z%rD0wh?vB@L^gvzuGcwR@8a5B$~1+-0}uA@!91&w>q3GnG+l6KzLZsq2+ehzEDp2& z7v|RTR|I!{^0kUXoJfZN+kO;s?em!}7VDO5I*( zjkG67Pah5g!_~>W6NSjXm*b*jW|_=s@`44pn0;N%;4m(%XyMsblJ{^^FmtrsSH)rj zPexAN&90Y#lW~Umv%q;*=2hI}=Dyr-x%vfuFk0)_)v+}~pk2unNUvYNF^p@^Ktcud z83r;W`uj^S;RFZPxRHI|f>DHA-}m@YGaihVVN8bO1f1xfv};u#h_IJanS5S|cs}Cf z*pI~O7fwYu=vw($_>eh*{a5JIR(&;Sr9(be>>Hjf)-wXv72a%t{HcLa1rc6tCwfJJ z*M%76h(Oz???I4GzSXxn?*3g8*M@*+m>_cmLEtc-%|IlGC$fa;X%1C|E}@KyYxJwd z!rGY!GT8Arxy5M_VQ@8}%;~p%qf0z+TZpF_^Li7RC?LgGqt5x57>sOL2vX!jirMiI z0!V7@4azJohF}Zhk$R8$RW8h>yPlRI$!hSI3K2ClKaFSw2||Np&&PC|g@BG(sv^(LK{+R^o0b6{yTnfW)e?S@8UUkzQ9{%n>o!%HC<5t_upU|l{hBxFzrIY^*3Ik?>*B*M^Q zW9bPYVMT2n=}!s?gctle1J}*;1#QI)sw#Jdcssnr+bo8WLac{NON~W)t>_`;F^hGl zCo&LYUecOYIaE8XrD&S9IjqD)#i-8)dU+;{@sOR^vt~tab>9Z^5--G9qCi*6k^$ zO?XC3nl~vz{vyH&5m=}DHjrZQfd^P@Hec(`BUj0gdR&_cw&*!`#KrAzU?t6L)wq2T!%KLZhf z80if!%Dq35_uSO?-#=9WT7E8b%JrYlxRGZ|8(JWhCCKJyW z&u(Zx9ou%suWcno7|=yeHdu&z$?v{&;=~kG!gUxpo~Vipixd!b;CAhVj1pl&v!%72 zxLH)8f$a1YhSXf4#ztYyOhAgVWx;F)Ll`1yjhKQW0pKbN7R9$hz=JV2N}Ux7QYfMv zhLzP-Mo_D~YMXpJm<{i`koOc7eBEK!Xg8mtol{sBn<9q%#0Xi6OkwW2RRuL=?!G*| zMR&){H(Okz-7lqlzPZtg=7Pt?)AAf=l-8aJZu^Mc=1-9WoKg~TKAeDT$>TUad$=d6 zA4O7x;+d@q4}sR-TNEPHih0)H2%%MkyD^))1R01kPZ!c0j}z0OkZtJh6cmk5n;M5SPN@7%*pP%K5m9J483xO_4Zv@5}7MS-Z1ih2{;2oe#45L^&>He z!lpP#4Cu`kfpi^nHlC4mfEOaZ9)pMYyMZ)H1JlZNsMB94uV&!5tW@|p)NFx3TCMl) zLKN-3#EUhBxx}xFr?b^dK;7t2_5_e&_gP1ZA*<-dJd?K+@+Z{YmxJ!zxPBdcpBNVj z+&YP8<)+}ezbZ;z*@^(uVIb{}li)(e*T>CgefSxM0dG?OTcLEc+5|Uzy2(uI-9iGm77dTnR65Z~N+OucRTs-9UlLFq3)dosy;I84rW zTI8jV0H=u;Vk?JqUZXY{bYecwY(Wh0CCz;a!ywQ$!n(ao=Ddr9)o28YqvDOlTwKI( zzi<(}Mo0j%nUGOoF#FRt$~v0?*&ewY1l}C9KG&f)>ZrP=$ zT?z;vGsU||?8=R;Qzh|e(hrjh{H>U8hF&8yg`lHT$uv;?s8(rNDGd4IR@)SGNl2oe z6{;)*n>%Bb=BOtkne^<8^CRA#NIQJdL~RogD;Yg<)15xP`Gl{^wGG``=6z8pT8UcU z$qu9j{)OD!Nc;+Un+`JBGxHf&C99&b#%swBt~_lnYQ(#r5kd~4XxaL`)SKN7o!tfj z=PP{yUYQIR$l}Q=c8++W?x)-Jesg)hh(BVJYAOL+Ul+na-nrl|y*@8Fz=qwcVwutr z1eRIRPtVV|O!0(obPN`KNN8fCr?ZUOp?SOE1o8Ak2TsGP^bY_4O+T`?}Utl!5Lee~+?d*;E9J^i7XQYPt*Wx0JP=und zzHzybg4g{c@g4A3<>1M5Z9CsUWxQk|3oLzbv$>7*ydXX7Zg`sI7wqRZarVbEylqOq z1h4E-L!# zWg*nC`n)&tGQ{`kJ7PT<{=U%;o#@2=?z6%=&i?bC@Ph;WV8OVnyTXg|i7cPCtrTiu z_3-m~fENdSH)iKgLQxWGZVJ9H)cT`8oIg|nggMsHBM=2J%jDkZ0jj>_?4m{}MvFli zva_PDi$X02{VFy84J&#zhKWolPWfsIITvw=M<#NU^X|w82mj$W0a>}vN)e#XjPsPNtWQRzx*-ER2Z%4ArsUV0JM>U*Lv$M-6Z@J$^K zSLIh_^-lZwrb(aqv5jy=O@4rNSB0-dnFvUrrIp)By;6+MXF+ zZpvis{)wz48xEu$ zjd4W9q#g>mKuUJCzfG~*yeG~#3Pn)SZH~=_GCo$eOs7l>A#2}3x&7&rkO9Yh2LC>J z|H?6T+f&Rv0n6op!ftH`*B?P9#8g~KhSKsj%=_conB5HQNz&^^EK0<^QW?f$#3D$+ zUe32nE4tb*7zyOMX%Q|KjI8EP04E6UigVvUaM@U|tOz?^(y&q?_@M zWvYY(+G~*xc-z=9Uef+Og1Cdk!hhhi(+3y6P(}8S;qe)GJRg5fesCKr*+1ft3KhlB zsNu1|Ks9b0oSTv}2A3Wx8iW7h0ww-%9x)VBaKXfGC`+c`P2(m1gI^sVgC{!{B{Q(0&juG#cj)0sri= z)?XdtpRlFlvjsT_`0`kv(zE^h=VQeINSZ)w&WOPN@ZNkv~*~M`*=oMZxrxr zczF09#sB~H``1-LW7oXo+e1|Q6CCvXbF>N41DTn2c@NBL(&&30%C9B8Nu%p3wbQ>z zb9*7orJeqpvqIId#_3BxuSw&pde>+?PQ#dXqs(Y5K0(7t>O@s{g|UlTCKMDr_-TSn-kS86A=-y=Kpp2{Zahg??5vIbih?p_I=NuOnSZpv;3mJf3LWh zhF52CvXr*&A{q|NvZO0@5A{2yZA#bchwb!h(p;58c{@U1Px%WoAAt{P4yhICJ$>}~ zL+T{;NOz~*UX1ZWcemZ13>?2I-=30^;=OacTAmI5r93R`u|0Ue0Nk;;rDyYB_XqGD z&>`4oAz+yrf$m2;{lCuZ*Q|?75%!-Im+VwTX5Bh|M{6X1^ zk*JhTs(cBvF#JALnHp#MNo`WyJ+`EoU^fez~J=PT6sB81Uu=Z6Iip(>3=^Wyx> zI_o7pahbCJVG@btG5yD9fD0eL#~*ASX-KyIWFh8){GWh>rsop{L0R9zLBl@LmlyiY zm=R3FZmFkKe$LJ=H0-Zsr;;Nz*^k1?(Z2I`IJH-!BsbXY`5ny{YMsuufj)mteM&Vv ze8o=hQz|E^;nc@=|6xZ%qWVQR_EnCzno{~7$S)bk{$JO3kFOt}0WN${{DMxh<&qWg9B)ICD6aTy!@Z& zzsRVLpwCnEztY(rO~ZcLJL>)sn}vp{Uc-^@?iw1tqrRr@y0wcz!`GmX^xT`n*J*fr z!y&awwSK+nl9;$m5?B3TLx9Khr)TH))8D~5UQYe41wp!g{`qJ6i9cYiw_O2)Vihikv8bd7}qZWsqEC`!J!TsW~bg!BSjDWdkQ9Z>UH$_ zKJ^_n^sC;X;cIH6tUo43Lc=>6D>Yld;V-O#n(#W}(qsAmefEBwIuH5fZ@)mLV0$w0 z5#|3ub1FUGo@RG#%9i!d(r}Z;aZ&ZhrW-WumI`~lOe{-#2yX(3G%6m#IlqCS3#;hi z`8(=Opur!7SNs!vCdXxso)mk~&wC5#9~l|5HtFzqPe3JXH32Pv@xR6AF+4s4T=@7` z{6Rwv&>tFN(;)tLhJ&8($Od0kCi)O=q59N@sb`KqKMnH3kLLI1lmM(W*v}6fH_8-` z`2Sn7U^@V~m%jh&Jjnl(h>?a@XC+Y2v-=-SngrS0fQQ$w&MK34B_xb+{nhR0`s3m^Xq{hvx1m;cG&|2sb-|2rC&NwJfKc6;Aa1w9GH{CJvP`Q>Nx z3>PEq`Ju=LS5-IJ!lchHXgH`QBObsktaWdn^eaKhJqM{%Q96z}5@vq?f;PS`$f(P^ULC-zN z|0VrE4nh1^Qc^gdnvvJjD#f!-zpi!)fI!RNQm7M`?JdHdF;IZ+8Bm=#MOLFwo~G7xc=t;Y!7l zd}zgieHSSGPx+^h={Y_FT=@7s{2#s-`mw8%ei#7z&tlECum4n6Rj6TkC7hoB1r6CU zbf{2I!};Zw^a%`TW_w@{!b=8@ck6Zz)9}D?OZs+$!A`#;IhOR2q9VI~f2)zBr5fny z>p_1+8%p1|+XF?3Z?q&V-0n|M9cIIQBW7OPUf3XJM%#>51cAnZh{yE*WAqnDw#zba=_?C^m8a|$4Thd3)~c;I-W2FPz;--8Bf zu-M2>`uwzxtMc63Av=93d5@2Qa_9%o3sw0>w<#Zmd*$!eoUb`~{Y)s;mYxjqPmS*} z{r?#KkvS6VM~T~yXMaQgp(>+{h?zc}ribYELA63zdWwcyz@94<@pgT^pn-xFc7NT| zyaHe=m%hFl{0D_XX}|t#9(7(ZnLfX+(KlM5D6>BwTF|2vX_QVI$1gC;HChoH9a;3= z>9IDC$MpYw`u=~&3vBB^(SOTt=wA);J$<^Cpy&TBu{iJ?3mU=qI*<{+~Xbu;+t!G-k_k zx(s%CZmCLA`}jY!=QS;fDi2T3X8QgejjOYc-?*`hhKFi{vWz7sJ88JJ);0RcCq3=* zJyhGMsn}X-m;X5>u)-%UileW;uIZ8A_@<-Pu!JIk zjQkr7A1$Zkz1e>KoDvs!ei`sMC^|U$(|hEtt>4|)W&rs=?f2OKgE{$k$p6IYK!1q; zZo>Ls$s_e&3mP^`XU=@r9{+#Z!qJ}E)N7ajwDMj#Qtf1?=Uc!ZApiL^y&}OMJon~} zA{w4k5(@tRQ+9ghgFSfi$tPRs^OQZAkb25af6D$N=PT^~LO<+Tb))UO)(xAX_z&n$ zZ3z9?|EFi~_v?SeWqeyN>PfJ#mz{pCu=$G3rnAd`OI2@_qWPgc|0)miyQH;~9ziJ7 zd+VT0jfTI<>ybMvnn4AOi7&D_=c+tjp;XeaE3^xBBl`?AJf{Tw1%<+1PcUx(AHMI9 z`l`I}SmEJSG2`~%|1teRmgw301N0|gPd9|YrS!iC9P|^{H7o=9pV>~so(-pD$kR^n z&T)DU)dp&fWgpt<_ZGx&`5vD3`xi7cYK+H^Pob}$Qvy4nAxJO{-#y+VKRS8xlQc}l zdrn!e*`GhT06GAi*%#^aO;BI_=9`6uGnPV|KluLvWAtCUc6>B{0RIOM;KJv>Wj_C8 z&--zpT6G>axTE~PN9hkcO3SqbVUPcUv{&V`L3(L=P;g4dLpT(+hVa>$ZO`AeR`tjk zAkg&nlzs1f1g7MFeQr@PeZEp-lsUuIG@JzMzcGW4!dK;)Ts!Oo1yE^eF6hv-C6#e-YIqx9Y7OG)!Gjj>10Q51!vEzbeN@o2tpv)cYrJ zuY>&u^E8*ifqe~5C$`;y^{R-7aEK7c4=#Mb;2zxlSReeW^FeKhNbLgo>nWf=$fxIR zYc8=i$!8ACuVLQ_dwxC<{ChJo5<}0hZ#49KbdT8Oo04a)@Q|K9Pr=^CbD$x{>EpV_ zC^s5M?DXxCm&vn@ut&y&^Aud#ov0w84h0VGA=rx}L!p=*b%Y$ee3IQptxu5w(U0YQ zd^-QHtzSNCSh{|!dm8!ysRm91f{gJ?;BVlt-@v~;|66$VgX?vMW%1PW>H8;SIKN22 z$AJ%o@V*D={$IoQ@%zSSfD0dw^(n2Le!o4DAQA-OjL#|jp9}x~6VvMOo3`v(VIV`* z?0GA|O&*h?mDCUp%Tqw?02WdZb#UR|e_}k;v#Em%|Naxtcj>Ht(PwM2^{eb-f?J9y<{vpR5jU%bal& zj2fc&6SNg=`f|K&gL2y*E!*d4D>Sj>qir~_yYhq)2O58>ZI`^=*GR)-ZFXdLx8u(7 zvicz4kAw{yHjK~Ke~x~C^!d{*@T+FSmE=Nb1AMe>eKV99=tjDVX#6+KeJ}JGbBRFpJnUi#^$pJ@EPgf^Vg zs&adpj-9$frF^8Vnw<*Eu-!%W`6*X_E}OWssNZcZ`3p1wi072BqhtOAWi^IFfdBmt z@@RRW_LWzjf1bvFl@^!&b6WyCwY#{}UUop0p~uDP^z`-D;Kz^pJ3A%O@l>1nKwW;h zpX$$0R~7SFmY(*EJ@p#7adR4Z|{) zYOO-SSpAZoxGE+tC4;p58QMzTd>ekp2&RCtSLh@757j2BxIKza8ox+bmN`(a7^LBF zScW+p`4E3gI? z#NVE#3sv<%8g0a$mZj3F2E=GjyHW7SaGQc09UCFnH98x%;TRF8{RCz8d)aL_pbaE_ z`JXS%79<%@Q*j=ol_bAOQ~eh9ko`E)@wo&~N$w4U66Ssj&U!S>wAg6nqsK{jBxiZF zjwFkAl#O>IP^)K=k$=1!WyRL5up3X(4`+Xa{{nM`rnG0!z8VX=E2*3=rk@l{9w!@Hp@4IQrrIr5wLA1yzqUeLZEg2w-ef>2e?Cpm*&{D1HJ7e6;%jZX0& zYY)q=*7Cuu;}L<)^!vYt>H?=BrwHe1yzC=@fe;5mb4 zp|aIRBW#FA!Js*4SbHC;(cpTj8x@)r{*T#e4wVW-|A!jjd{+HEwFyf;wF%FMAAZRG z@wD}d*xE{YW8v}t=S>c-eGfZ0^d%FN7@XjpKrezTb6Ib_WPwfe{uOKf{>P2Uls7Tv zO@Wvl`C!}|-VAI2O?L70fVuDmCg6b(Jj@Pp$XC|?C2l?Zv^8Ldo?vluC~uN|gG&0x z$0z&`wsboWjwVCj1me!lpu%jq$-iu)U2!>O`0BPJaWp5$; mM8}L9)b$|kQ4XL{VLo?MPw4$DDY2fTg`fFavSi8lX#YQj-{xBY literal 0 HcmV?d00001 diff --git a/addons/explosives/config.cpp b/addons/explosives/config.cpp index 8bf463c9f4..5f2264c620 100644 --- a/addons/explosives/config.cpp +++ b/addons/explosives/config.cpp @@ -3,7 +3,7 @@ class CfgPatches { class ADDON { units[] = {}; - weapons[] = {"ACE_Clacker", "ACE_DefusalKit", "ACE_M26_Clacker", "ACE_DeadManSwitch"}; + weapons[] = {"ACE_Clacker", "ACE_DefusalKit", "ACE_M26_Clacker", "ACE_DeadManSwitch", "ACE_Cellphone"}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common", "ace_interaction"}; author[] = {"Garth 'L-H' de Wet"}; From 749d068d2df21efe4df9b9236a1177aacb1cae41 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:16:47 +0200 Subject: [PATCH 03/62] Added IED handling (for the player and support for AI). Can dial an IED and it will ring before exploding. --- addons/explosives/CfgACE_Triggers.hpp | 6 + addons/explosives/CfgMagazines.hpp | 29 +++ addons/explosives/CfgVehicles.hpp | 33 +++ .../explosives/Data/Audio/Cellphone_Ring.wss | Bin 0 -> 87338 bytes addons/explosives/Data/Audio/DialTone.wss | Bin 0 -> 88158 bytes .../Data/UI/Cellphone_Background.paa | Bin 0 -> 258205 bytes addons/explosives/ExplosivesUI.hpp | 226 +++++++++++++++++- addons/explosives/XEH_postInit.sqf | 1 + addons/explosives/XEH_preInit.sqf | 6 + .../functions/fnc_addCellphoneIED.sqf | 47 ++++ .../functions/fnc_addToSpeedDial.sqf | 37 +++ addons/explosives/functions/fnc_dialPhone.sqf | 68 ++++++ .../functions/fnc_getSpeedDialExplosive.sqf | 28 +++ .../functions/fnc_removeFromSpeedDial.sqf | 26 ++ .../explosives/functions/fnc_setSpeedDial.sqf | 28 +++ 15 files changed, 529 insertions(+), 6 deletions(-) create mode 100644 addons/explosives/Data/Audio/Cellphone_Ring.wss create mode 100644 addons/explosives/Data/Audio/DialTone.wss create mode 100644 addons/explosives/Data/UI/Cellphone_Background.paa create mode 100644 addons/explosives/functions/fnc_addCellphoneIED.sqf create mode 100644 addons/explosives/functions/fnc_addToSpeedDial.sqf create mode 100644 addons/explosives/functions/fnc_dialPhone.sqf create mode 100644 addons/explosives/functions/fnc_getSpeedDialExplosive.sqf create mode 100644 addons/explosives/functions/fnc_removeFromSpeedDial.sqf create mode 100644 addons/explosives/functions/fnc_setSpeedDial.sqf diff --git a/addons/explosives/CfgACE_Triggers.hpp b/addons/explosives/CfgACE_Triggers.hpp index 1b686d6092..789786bb4f 100644 --- a/addons/explosives/CfgACE_Triggers.hpp +++ b/addons/explosives/CfgACE_Triggers.hpp @@ -24,6 +24,12 @@ class CfgACE_Triggers { picture = PATHTOF(Data\UI\DeadmanSwitch.paa); requires[] = {"ACE_DeadManSwitch"}; }; + class Cellphone:Command { + displayName = $STR_ACE_Explosives_cellphone_displayName; + picture = PATHTOF(Data\UI\Cellphone_UI.paa); + onPlace = QUOTE(_this call FUNC(addCellphoneIED);false); + requires[] = {"ACE_Cellphone"}; + }; class PressurePlate { displayName = $STR_ACE_Explosives_PressurePlate; picture = PATHTOF(Data\UI\PressurePlate.paa); diff --git a/addons/explosives/CfgMagazines.hpp b/addons/explosives/CfgMagazines.hpp index 7cc1c8a8bd..51c85e607f 100644 --- a/addons/explosives/CfgMagazines.hpp +++ b/addons/explosives/CfgMagazines.hpp @@ -95,4 +95,33 @@ class CfgMagazines { }; }; }; + + class IEDUrbanBig_Remote_Mag: DemoCharge_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanBig"; + class ACE_Triggers { + SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone"}; + class Command { + FuseTime = 0.5; + }; + class DeadmanSwitch:Command{}; + class Cellphone:Command{}; + }; + }; + class IEDLandBig_Remote_Mag: IEDUrbanBig_Remote_Mag{ + ACE_SetupObject = "ACE_Explosives_Place_IEDLandBig"; + }; + class IEDUrbanSmall_Remote_Mag: DemoCharge_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDUrbanSmall"; + class ACE_Triggers { + SupportedTriggers[] = {"Command","DeadmanSwitch", "Cellphone"}; + class Command { + FuseTime = 0.5; + }; + class DeadmanSwitch:Command{}; + class Cellphone:Command{}; + }; + }; + class IEDLandSmall_Remote_Mag: IEDUrbanSmall_Remote_Mag { + ACE_SetupObject = "ACE_Explosives_Place_IEDLandSmall"; + }; }; diff --git a/addons/explosives/CfgVehicles.hpp b/addons/explosives/CfgVehicles.hpp index 73477ddce5..983bc0972a 100644 --- a/addons/explosives/CfgVehicles.hpp +++ b/addons/explosives/CfgVehicles.hpp @@ -49,6 +49,15 @@ class CfgVehicles { priority = 0.8; hotkey = "F"; }; + class ACE_Cellphone { + displayName = $STR_ACE_Explosives_cellphone_displayName; + condition = "('ACE_Cellphone' in (items ace_player))"; + statement = "closeDialog 0;createDialog 'Rsc_ACE_PhoneInterface';"; + exceptions[] = {"ACE_Interaction_isNotSwimming"}; + showDisabled = 0; + icon = PATHTOF(Data\UI\Cellphone_UI.paa); + priority = 0.8; + }; }; }; }; @@ -105,6 +114,27 @@ class CfgVehicles { model = "\A3\Weapons_F\Explosives\mine_SLAM_directional"; }; + // IEDs + class ACE_Explosives_Place_IEDUrbanBig:ACE_Explosives_Place { + displayName = "IED Urban Big"; + model = "\A3\Weapons_F\Explosives\IED_urban_big"; + }; + + class ACE_Explosives_Place_IEDLandBig:ACE_Explosives_Place { + displayName = "IED Land Big"; + model = "\A3\Weapons_F\Explosives\IED_land_big"; + }; + + class ACE_Explosives_Place_IEDUrbanSmall:ACE_Explosives_Place { + displayName = "IED Urban Small"; + model = "\A3\Weapons_F\Explosives\IED_urban_small"; + }; + + class ACE_Explosives_Place_IEDLandSmall:ACE_Explosives_Place { + displayName = "IED Land Small"; + model = "\A3\Weapons_F\Explosives\IED_land_small"; + }; + class NATO_Box_Base; class EAST_Box_Base; class IND_Box_Base; @@ -133,6 +163,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,6) MACRO_ADDITEM(ACE_DefusalKit,12) MACRO_ADDITEM(ACE_Deadmanswitch,2) + MACRO_ADDITEM(ACE_Cellphone,3) }; }; @@ -142,6 +173,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,2) MACRO_ADDITEM(ACE_DefusalKit,2) MACRO_ADDITEM(ACE_Deadmanswitch,1) + MACRO_ADDITEM(ACE_Cellphone,2) }; }; @@ -151,6 +183,7 @@ class CfgVehicles { MACRO_ADDITEM(ACE_M26_Clacker,6) MACRO_ADDITEM(ACE_DefusalKit,12) MACRO_ADDITEM(ACE_Deadmanswitch,6) + MACRO_ADDITEM(ACE_Cellphone,10) }; }; diff --git a/addons/explosives/Data/Audio/Cellphone_Ring.wss b/addons/explosives/Data/Audio/Cellphone_Ring.wss new file mode 100644 index 0000000000000000000000000000000000000000..bafdf7596a9ca9e26d14a5daba6935887f79b505 GIT binary patch literal 87338 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

^*r4RY<=DJnI_HV6Kkq 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 literal 0 HcmV?d00001 diff --git a/addons/explosives/Data/UI/Cellphone_Background.paa b/addons/explosives/Data/UI/Cellphone_Background.paa new file mode 100644 index 0000000000000000000000000000000000000000..9cafe97af830d77d6d80293fba5ea24bd9483562 GIT binary patch literal 258205 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%0A#z#y(9ncxELCU~_D#0Z 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 z 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 literal 0 HcmV?d00001 diff --git a/addons/explosives/ExplosivesUI.hpp b/addons/explosives/ExplosivesUI.hpp index c6c76e573c..769b3dc167 100644 --- a/addons/explosives/ExplosivesUI.hpp +++ b/addons/explosives/ExplosivesUI.hpp @@ -4,16 +4,49 @@ #define GUI_GRID_H (0.04) #define ST_CENTER 0x02 +#define X_OFFSET 0.25 class RscText; class RscButton; - -#define X_OFFSET 0.25 - class RscXSliderH; class IGUIBack; +class RscPicture; +class RscEdit; -class Rsc_ACE_Timer_Slider:RscXSliderH{ +class Rsc_ACE_CallScreen_Edit:RscEdit { + canModify = 1; + colorBackground[] = {0,0,0,1}; + colorText[] = {0,0,0,1}; + colorDisabled[] = {1,1,1,0.25}; + colorSelection[] = { + "(profilenamespace getvariable ['GUI_BCG_RGB_R',0.69])", + "(profilenamespace getvariable ['GUI_BCG_RGB_G',0.75])", + "(profilenamespace getvariable ['GUI_BCG_RGB_B',0.5])", + 1 + }; + text = ""; + style = "0x00 + 0x40 + 0x200"; + shadow = 1; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 20) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; +}; +class Rsc_ACE_HiddenButton:RscButton { + colorText[] = {0, 0, 0, 0}; + colorDisabled[] = {0, 0, 0, 0}; + colorBackground[] = {0, 0, 0, 0}; + colorBackgroundDisabled[] = {0, 0, 0, 0}; + colorBackgroundActive[] = {0, 0, 0, 0}; + colorFocused[] = {0, 0, 0, 0}; + colorShadow[] = {0, 0, 0, 0}; + colorBorder[] = {0, 0, 0, 0}; + w = 0.095589; + h = 0.039216; + shadow = 0; +}; + +class Rsc_ACE_Timer_Slider:RscXSliderH { x = 0.4; y = 0.2; w = 0.3; @@ -21,8 +54,7 @@ class Rsc_ACE_Timer_Slider:RscXSliderH{ colorBackground[] = {0,0,0,0.5}; }; -class RscACE_SelectTimeUI -{ +class RscACE_SelectTimeUI { idd = 8854; movingEnable = 0; class controls { @@ -72,3 +104,185 @@ class RscACE_SelectTimeUI }; }; }; + +class Rsc_ACE_NumKeyButton: Rsc_ACE_HiddenButton{}; +class Rsc_ACE_PhoneInterface { + idd = 8855; + movingEnable = 1; + onLoad = QUOTE(GVAR(IED_CurrentSpeedDial) = -1); + class controls { + class RscPicture_1200: RscPicture { + idc = 1200; + text = PATHTOF(Data\UI\Cellphone_Background.paa); + x = 0.231875 * safezoneW + safezoneX; + y = 0.104 * safezoneH + safezoneY; + w = 0.195937 * safezoneW; + h = 0.704 * safezoneH; + }; + class numkey_1: Rsc_ACE_NumKeyButton { + idc = 1600; + x = 0.278281 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "1"; + action = "ctrlSetText [1400,((ctrlText 1400) + '1')];"; + }; + class numkey_2: Rsc_ACE_NumKeyButton { + idc = 1601; + x = 0.314375 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "2"; + action = "ctrlSetText [1400,((ctrlText 1400) + '2')];"; + }; + class numkey_3: Rsc_ACE_NumKeyButton { + idc = 1602; + x = 0.350469 * safezoneW + safezoneX; + y = 0.533 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "3"; + action = "ctrlSetText [1400,((ctrlText 1400) + '3')];"; + }; + class numkey_4: Rsc_ACE_NumKeyButton { + idc = 1603; + x = 0.278281 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "4"; + action = "ctrlSetText [1400,((ctrlText 1400) + '4')];"; + }; + class numkey_5: Rsc_ACE_NumKeyButton { + idc = 1604; + x = 0.314375 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "5"; + action = "ctrlSetText [1400,((ctrlText 1400) + '5')];"; + }; + class numkey_6: Rsc_ACE_NumKeyButton { + idc = 1605; + x = 0.350469 * safezoneW + safezoneX; + y = 0.577 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "6"; + action = "ctrlSetText [1400,((ctrlText 1400) + '6')];"; + }; + class numkey_7: Rsc_ACE_NumKeyButton { + idc = 1606; + x = 0.278281 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "7"; + action = "ctrlSetText [1400,((ctrlText 1400) + '7')];"; + }; + class numkey_8: Rsc_ACE_NumKeyButton { + idc = 1607; + x = 0.314375 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "8"; + action = "ctrlSetText [1400,((ctrlText 1400) + '8')];"; + }; + class numkey_9: Rsc_ACE_NumKeyButton { + idc = 1608; + x = 0.350469 * safezoneW + safezoneX; + y = 0.621 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "9"; + action = "ctrlSetText [1400,((ctrlText 1400) + '9')];"; + }; + class numkey_0: Rsc_ACE_NumKeyButton { + idc = 1609; + x = 0.314375 * safezoneW + safezoneX; + y = 0.676 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "0"; + action = "ctrlSetText [1400,((ctrlText 1400) + '0')];"; + }; + class speedDialAdd: Rsc_ACE_NumKeyButton { + idc = 1610; + x = 0.278281 * safezoneW + safezoneX; + y = 0.676 * safezoneH + safezoneY; + w = 0.0309375 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_AddToSpeedDial"; + action = QUOTE([ARR_2(ctrlText 1401,ctrlText 1400)] call FUNC(addToSpeedDial);); + }; + class clear: Rsc_ACE_HiddenButton { + idc = 1610; + x = 0.278281 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Clear"; + action = QUOTE(ctrlSetText [ARR_2(1400,'')];[ctrlText 1401] call FUNC(removeFromSpeedDial);ctrlSetText [ARR_2(1401,'')];); + }; + class dial: Rsc_ACE_HiddenButton { + idc = 1611; + x = 0.309219 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.04125 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Dial"; + action = QUOTE([ARR_2(ace_player,ctrlText 1400)] call FUNC(dialPhone);); + }; + class up: Rsc_ACE_HiddenButton { + idc = 1612; + x = 0.360781 * safezoneW + safezoneX; + y = 0.445 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Up"; + action = QUOTE([true] call FUNC(setSpeedDial)); + }; + class down: Rsc_ACE_HiddenButton { + idc = 1613; + x = 0.345312 * safezoneW + safezoneX; + y = 0.485 * safezoneH + safezoneY; + w = 0.020625 * safezoneW; + h = 0.033 * safezoneH; + tooltip = "$STR_ACE_Explosives_Phone_Down"; + action = QUOTE([false] call FUNC(setSpeedDial)); + }; + class speedDial_Text: RscText { + idc = 1405; + y = 0.302 * safezoneH + safezoneY; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; + text = "Name"; + }; + class speedDial_edit: Rsc_ACE_CallScreen_Edit { + idc = 1401; + y = 0.302 * safezoneH + safezoneY; + x = 0.318 * safezoneW + safezoneX; + w = 0.1; + }; + class numberEdit_Text: RscText { + idc = 1406; + y = 0.348 * safezoneH + safezoneY; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 22) * 1)"; + x = 0.288594 * safezoneW + safezoneX; + w = 0.0825 * safezoneW; + h = 0.044 * safezoneH; + text = "#"; + }; + class number_edit: Rsc_ACE_CallScreen_Edit { + canModify = 0; + idc = 1400; + y = 0.348 * safezoneH + safezoneY; + x = 0.3 * safezoneW + safezoneX; + }; + }; +}; diff --git a/addons/explosives/XEH_postInit.sqf b/addons/explosives/XEH_postInit.sqf index 2ede878a37..e3b40308c3 100644 --- a/addons/explosives/XEH_postInit.sqf +++ b/addons/explosives/XEH_postInit.sqf @@ -18,6 +18,7 @@ if !(hasInterface) exitWith {}; GVAR(PlacedCount) = 0; GVAR(Setup) = objNull; GVAR(pfeh_running) = false; +GVAR(CurrentSpeedDial) = 0; [{(_this select 0) call FUNC(handleScrollWheel);}] call EFUNC(Common,addScrollWheelEventHandler); player addEventHandler ["Killed", { diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index 801ded6615..d8f8dc1216 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -17,11 +17,14 @@ ADDON = false; +PREP(addCellphoneIED); PREP(addClacker); +PREP(addToSpeedDial); PREP(canDefuse); PREP(canDetonate); PREP(defuseExplosive); PREP(detonateExplosive); +PREP(dialPhone); PREP(handleScrollWheel); @@ -30,6 +33,7 @@ PREP(hasPlacedExplosives); PREP(getDetonators); PREP(getPlacedExplosives); +PREP(getSpeedDialExplosive); PREP(openDetonateUI); PREP(openPlaceUI); @@ -41,10 +45,12 @@ PREP(place_Approve); PREP(place_Cancel); PREP(placeExplosive); +PREP(removeFromSpeedDial); PREP(selectTrigger); PREP(setupExplosive); PREP(setPosition); +PREP(setSpeedDial); PREP(startDefuse); PREP(startTimer); PREP(triggerType); diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf new file mode 100644 index 0000000000..0678f56f6b --- /dev/null +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -0,0 +1,47 @@ +/* + * Author: Garth 'L-H' de Wet + * Adds an IED to the cellphone list + * + * Arguments: + * 0: Unit + * 1: Explosive + * 2: Magazine classname + * 3: Extra variables + * + * Return Value: + * None + * + * Example: + * Handled by PlaceExplosive. + * + * Public: No + */ +#include "script_component.hpp" +EXPLODE_4_PVT(_this,_unit,_explosive,_magazineClass,_extra); +// Config is the last item in the list of passed in items. +_config = (_this select 3) select (count (_this select 3) - 1); + +_requiredItems = getArray(_config >> "requires"); +_hasRequired = true; +_detonators = [_unit] call FUNC(getDetonators); +{ + if !(_x in _detonators) exitWith{ + _hasRequired = false; + }; +} count _requiredItems; +private ["_code", "_count"]; +_code = str(round (random 9999)); +_count = 4 - count (toArray _code); +while {_count > 0} do { + _code = "0" + _code; + _count = _count - 1; +}; +if (isNil QGVAR(CellphoneIEDs)) then { + GVAR(CellphoneIEDs) = []; +}; +_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code]; +_count = _count + 1; +publicVariable QGVAR(CellphoneIEDs); +_unit sideChat format ["IED %1 code: %2", _count,_code]; +if !(_hasRequired) exitWith {}; +[format ["IED %1", _count],_code] call FUNC(addToSpeedDial); diff --git a/addons/explosives/functions/fnc_addToSpeedDial.sqf b/addons/explosives/functions/fnc_addToSpeedDial.sqf new file mode 100644 index 0000000000..142996e4c3 --- /dev/null +++ b/addons/explosives/functions/fnc_addToSpeedDial.sqf @@ -0,0 +1,37 @@ +/* + * Author: Garth 'L-H' de Wet + * Sets the speed dial for the UI. + * + * Arguments: + * 0: Name of speed dial + * 1: Code to add to speed dial + * + * Return Value: + * None + * + * Example: + * ["My Speed Dial","2131"] call ACE_explosives_fnc_addToSpeedDial; + * + * Public: Yes + */ +#include "script_component.hpp" +private ["_speedDial", "_found"]; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +_found = false; + +EXPLODE_2_PVT(_this,_name,_code); + +if ((_code) == "") ExitWith { + [_name] call FUNC(removeFromSpeedDial); +}; +{ + if ((_x select 0) == _name) exitWith { + _speedDial set [_foreachindex, _this]; + _found = true; + }; +} foreach _speedDial; +if (!_found) then { + _speedDial pushBack _this; +}; + +ace_player setVariable [QGVAR(SpeedDial), _speedDial]; diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf new file mode 100644 index 0000000000..3bb2cc45e8 --- /dev/null +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -0,0 +1,68 @@ +/* + * Author: Garth 'L-H' de Wet + * Dials the number passed and detonates the explosive. + * + * Arguments: + * 0: Unit to do dialing + * 1: Code to dial + * + * Return Value: + * None + * + * Example: + * [ace_player,"2131"] call ACE_explosives_fnc_dialPhone; + * + * Public: Yes + */ +#include "script_component.hpp" +private ["_arr", "_ran", "_i","_speedDial"]; +EXPLODE_2_PVT(_this,_unit,_code); +if (_unit getVariable [QGVAR(Dialing),false]) exitWith {}; +if !(alive _unit) exitWith {}; +_unit setVariable [QGVAR(Dialing), true, true]; + +_ran = (ceil(random 8)) + 1; +_arr = []; +for [{_i=0}, {_i<_ran}, {_i=_i+1}] do { + _arr = _arr + ['.','..','...','']; +}; +if (_unit == ace_player) then { + ctrlSetText [1400,"Calling"]; + [{ + EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); + if ((_i mod 4) == 0) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; + }; + ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; + if (_i >= (count _arr + 2)) then { + [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + }; + _unit setVariable [QGVAR(Dialing), false, true]; + if (_unit == ace_player) then { + ctrlSetText [1400,"Call Ended!"]; + }; + }; + if (_i == (count _arr)) then { + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + }; + }; + (_this select 0) set [1, _i + 1]; + }, 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); +} else { + private ["_explosive"]; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [{ + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_this select 1),3.16228,1,75]; + (_this select 0) setVariable [QGVAR(Dialing), false, true]; + }, [_unit,_explosive], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); + [_explosive,0.25 * (count _arr - 1)] call FUNC(startTimer); + }; +}; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf new file mode 100644 index 0000000000..f5b3172c46 --- /dev/null +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -0,0 +1,28 @@ +/* + * Author: Garth 'L-H' de Wet + * Gets the explosive object or objNull from the speed dial entry. + * + * Arguments: + * 0: Unit + * 1: Speed dial entry + * + * Return Value: + * Associated explosive (or ObjNull) + * + * Example: + * [ace_player, "2113"] call ace_explosives_fnc_getSpeedDialExplosive; + * + * Public: Yes + */ +#include "script_component.hpp" +EXPLODE_2_PVT(_this,_unit,_code); +private ["_explosive"]; +if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; +_explosive = objNull; +{ + if ((_x select 1) == _code) exitWith { + _explosive = _x select 0; + }; + false +} count GVAR(CellphoneIEDs); +_explosive diff --git a/addons/explosives/functions/fnc_removeFromSpeedDial.sqf b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf new file mode 100644 index 0000000000..c0a467e6f1 --- /dev/null +++ b/addons/explosives/functions/fnc_removeFromSpeedDial.sqf @@ -0,0 +1,26 @@ +/* + * Author: Garth 'L-H' de Wet + * Removes the specified speed dial from unit's speed dial. + * + * Arguments: + * 0: Speed dial name + * + * Return Value: + * None + * + * Example: + * ["IED 1"] call ACE_explosives_fnc_removeFromSpeedDial; + * + * Public: Yes + */ +#include "script_component.hpp" +private "_speedDial"; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +if (count _speedDial == 0) exitWith {}; +{ + if ((_x select 0) == (_this select 0)) exitWith { + _speedDial set [_foreachIndex, "x"]; + _speedDial = _speedDial - ["x"]; + ace_player setVariable [QGVAR(SpeedDial),_speedDial]; + }; +} foreach _speedDial; diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf new file mode 100644 index 0000000000..20a32a1224 --- /dev/null +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -0,0 +1,28 @@ +/* + * Author: Garth 'L-H' de Wet + * Sets the speed dial for the UI. + * + * Arguments: + * 0: Whether to increase or decrease speed dial index + * + * Return Value: + * None + * + * Example: + * [true] call ACE_explosives_fnc_setSpeedDial; // increase + * [false] call ACE_explosives_fnc_setSpeedDial; // decrease + * + * Public: No + */ + #include "script_component.hpp" +private ["_speedDial", "_amount"]; +_speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; +if (count _speedDial == 0) exitWith {}; +_amount = if((_this select 0))then{1}else{-1}; + +GVAR(CurrentSpeedDial) = GVAR(CurrentSpeedDial) + _amount; +GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) < 0)then{(count _speedDial)-1}else{GVAR(CurrentSpeedDial)}; +GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) >= (count _speedDial))then{0}else{GVAR(CurrentSpeedDial)}; + +ctrlSetText [1400,(_speedDial select GVAR(CurrentSpeedDial)) select 1]; +ctrlSetText [1401,(_speedDial select GVAR(CurrentSpeedDial)) select 0]; From 4d38e19f8cd7327c16c69c372e953a3e0419833a Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Wed, 4 Feb 2015 02:19:56 +0200 Subject: [PATCH 04/62] Should avoid potential conflicts of IED codes. --- .../explosives/functions/fnc_addCellphoneIED.sqf | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 0678f56f6b..b13473cf25 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -29,12 +29,16 @@ _detonators = [_unit] call FUNC(getDetonators); _hasRequired = false; }; } count _requiredItems; -private ["_code", "_count"]; -_code = str(round (random 9999)); -_count = 4 - count (toArray _code); -while {_count > 0} do { - _code = "0" + _code; - _count = _count - 1; +private ["_code", "_count", "_codeSet"]; +_codeSet = false; +while {!_codeSet} do { + _code = str(round (random 9999)); + _count = 4 - count (toArray _code); + while {_count > 0} do { + _code = "0" + _code; + _count = _count - 1; + }; + _codeSet = (isNull [objNull,_code] call FUNC(getSpeedDialExplosive)); }; if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; From 155503d4a105ee5c2b64deb05da5467d194cd821 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:06:55 +0100 Subject: [PATCH 05/62] Merged GUI into common. Removed unnecessary GUI functions. Updated displayIcon function to be more dynamic Added client side settings for displaying icons. --- addons/common/HintConfig.hpp | 96 ++++++++++ addons/common/ProgressScreen.hpp | 3 - addons/common/XEH_preInit.sqf | 2 + addons/common/config.cpp | 10 + addons/{gui/UI => common}/define.hpp | 12 +- .../functions/fnc_blurScreen.sqf | 2 +- addons/common/functions/fnc_displayIcon.sqf | 111 +++++++++++ .../functions/fnc_displayInformation.sqf | 4 +- .../functions/fnc_displayMessage.sqf | 5 +- addons/common/functions/fnc_progressBar.sqf | 4 +- .../fnc_sendDisplayInformationTo.sqf | 2 +- .../functions/fnc_sendDisplayMessageTo.sqf | 2 +- addons/common/stringtable.xml | 6 + addons/gui/CfgEventHandlers.hpp | 11 -- addons/gui/GUI.hpp | 2 - addons/gui/README.md | 11 -- addons/gui/UI/RscTitles.hpp | 179 ------------------ addons/gui/XEH_postInit.sqf | 11 -- addons/gui/XEH_preInit.sqf | 25 --- addons/gui/config.cpp | 27 --- addons/gui/data/buttonDisabled.paa | Bin 1564 -> 0 bytes addons/gui/data/buttonDisabled_gradient.paa | Bin 1816 -> 0 bytes addons/gui/data/buttonNormal.paa | Bin 1564 -> 0 bytes addons/gui/data/buttonNormal_gradient.paa | Bin 1989 -> 0 bytes addons/gui/data/buttonNormal_gradient2.paa | Bin 2035 -> 0 bytes addons/gui/data/buttonNormal_gradient3.paa | Bin 2044 -> 0 bytes addons/gui/data/buttonNormal_gradient_top.paa | Bin 1995 -> 0 bytes .../gui/data/buttonNormal_gradient_top_w.paa | Bin 1856 -> 0 bytes addons/gui/empty.hpp | 21 -- addons/gui/functions/fnc_displayIcon.sqf | 79 -------- addons/gui/functions/fnc_loadingbar.sqf | 64 ------- addons/gui/functions/fnc_sendHintTo.sqf | 26 --- addons/gui/functions/fnc_sendMessageTo.sqf | 31 --- addons/gui/functions/script_component.hpp | 12 -- addons/gui/script_component.hpp | 12 -- addons/gui/stringtable.xml | 7 - addons/medical/config.cpp | 2 +- .../fnc_ActionCheckBloodPressureLocal.sqf | 2 +- .../functions/fnc_ActionCheckPulse.sqf | 6 +- .../fnc_ActioncheckBloodPressure.sqf | 6 +- .../medical/functions/fnc_actionCarryUnit.sqf | 4 +- .../functions/fnc_actionCheckPulseLocal.sqf | 2 +- .../functions/fnc_actionCheckResponse.sqf | 8 +- .../medical/functions/fnc_actionDragUnit.sqf | 4 +- .../functions/fnc_actionRemoveTourniquet.sqf | 4 +- addons/medical/functions/fnc_handleHeal.sqf | 2 +- ...fnc_handleTreatment_Action_AirwayLocal.sqf | 2 +- ...nc_handleTreatment_Action_BandageLocal.sqf | 2 +- .../fnc_handleTreatment_Action_CPR.sqf | 4 +- .../fnc_handleTreatment_Action_Stitching.sqf | 10 +- .../fnc_handleTreatment_Action_fullHeal.sqf | 8 +- .../fnc_handleTreatment_Category_Advanced.sqf | 6 +- .../fnc_handleTreatment_Category_Airway.sqf | 6 +- ...fnc_handleTreatment_Category_Bandaging.sqf | 8 +- ...nc_handleTreatment_Category_Medication.sqf | 6 +- .../functions/fnc_initalizeModuleCMS.sqf | 2 +- .../fnc_moduleAssignMedicalEquipment.sqf | 1 - .../functions/fnc_onTreatmentCompleted.sqf | 2 +- addons/medical/ui/define.hpp | 2 +- addons/medical/ui/menu.hpp | 4 +- 60 files changed, 292 insertions(+), 588 deletions(-) rename addons/{gui/UI => common}/define.hpp (97%) rename addons/{gui => common}/functions/fnc_blurScreen.sqf (99%) create mode 100644 addons/common/functions/fnc_displayIcon.sqf rename addons/{gui => common}/functions/fnc_displayInformation.sqf (92%) rename addons/{gui => common}/functions/fnc_displayMessage.sqf (85%) rename addons/{gui => common}/functions/fnc_sendDisplayInformationTo.sqf (95%) rename addons/{gui => common}/functions/fnc_sendDisplayMessageTo.sqf (95%) delete mode 100644 addons/gui/CfgEventHandlers.hpp delete mode 100644 addons/gui/GUI.hpp delete mode 100644 addons/gui/README.md delete mode 100644 addons/gui/UI/RscTitles.hpp delete mode 100644 addons/gui/XEH_postInit.sqf delete mode 100644 addons/gui/XEH_preInit.sqf delete mode 100644 addons/gui/config.cpp delete mode 100644 addons/gui/data/buttonDisabled.paa delete mode 100644 addons/gui/data/buttonDisabled_gradient.paa delete mode 100644 addons/gui/data/buttonNormal.paa delete mode 100644 addons/gui/data/buttonNormal_gradient.paa delete mode 100644 addons/gui/data/buttonNormal_gradient2.paa delete mode 100644 addons/gui/data/buttonNormal_gradient3.paa delete mode 100644 addons/gui/data/buttonNormal_gradient_top.paa delete mode 100644 addons/gui/data/buttonNormal_gradient_top_w.paa delete mode 100644 addons/gui/empty.hpp delete mode 100644 addons/gui/functions/fnc_displayIcon.sqf delete mode 100644 addons/gui/functions/fnc_loadingbar.sqf delete mode 100644 addons/gui/functions/fnc_sendHintTo.sqf delete mode 100644 addons/gui/functions/fnc_sendMessageTo.sqf delete mode 100644 addons/gui/functions/script_component.hpp delete mode 100644 addons/gui/script_component.hpp delete mode 100644 addons/gui/stringtable.xml diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 3e3493a8ba..8c8dc38abb 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -52,6 +52,102 @@ class RscTitles { }; }; }; + class ACE_RscDisplayMessage { + duration = 7; + idd = 86411; + movingenable = 0; + onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];" + fadein = 0; + class controlsBackground { + class header: ACE_gui_staticBase { + idc = 1; + type = CT_STATIC; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (30 * (safeZoneH / 40))"; + w = "(safeZoneW / 10)"; + h = "(safeZoneH / 40)"; + style = ST_LEFT; + font = FontCSE; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.85, 0.85, 0.85, 1.0}; + colorBackground[] = {0, 0, 0, 0.9}; + text = ""; + }; + class text: header { + idc = 2; + y = "safezoneY + (31 * (safeZoneH / 40))"; + w = "(safeZoneW / 10) * 1.3"; + colorText[] = {0.0, 0.0, 0.0, 1.0}; + colorBackground[] = {1, 1, 1, 0.9}; + text = ""; + }; + }; + }; + + class ACE_RscDisplayInformation { + duration = 15; + idd = 86412; + movingenable = 0; + onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];" + fadein = 0; + class controlsBackground { + class header: ACE_gui_staticBase { + idc = 1; + type = CT_STATIC; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (6 * (safeZoneH / 40))"; + w = "(safeZoneW / 10)"; + h = "(safeZoneH / 40)"; + style = ST_LEFT; + font = FontCSE; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; + colorText[] = {0.85, 0.85, 0.85, 1.0}; + colorBackground[] = {0, 0, 0, 0.9}; + text = ""; + }; + class text: header { + idc = 2; + y = "safezoneY + (7.1 * (safeZoneH / 40))"; + w = "(safeZoneW / 10) * 1.3"; + colorText[] = {0.0, 0.0, 0.0, 1.0}; + colorBackground[] = {1, 1, 1, 0.9}; + text = ""; + }; + class text2: text { + idc = 3; + y = "safezoneY + (8.2 * (safeZoneH / 40))"; + }; + class text3: text { + idc = 4; + y = "safezoneY + (9.3 * (safeZoneH / 40))"; + }; + class text4: text { + idc = 5; + y = "safezoneY + (10.4 * (safeZoneH / 40))"; + }; + class text5: text { + idc = 6; + y = "safezoneY + (11.5 * (safeZoneH / 40))"; + }; + + + class icon: ACE_gui_backgroundBase { + type = CT_STATIC; + idc = 10; + style = ST_PICTURE; + colorBackground[] = {0,0,0,1}; + colorText[] = {1, 1, 1, 1}; + font = FontCSE; + text = ""; + sizeEx = 0.032; + x = "safezoneX + (safezoneW / 10)"; + y = "safezoneY + (4 * (safeZoneH / 40))"; + w = "(safeZoneH / 40)*2"; + h = "(safeZoneH / 40)*2"; + }; + }; + }; + class ACE_EventHandlerHelper: ACE_Rsc_Display_Base { idd = -1; class controls { diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index 31184f00f4..d7df49efdf 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -1,6 +1,3 @@ -class ACE_gui_RscProgress; -class ACE_gui_staticBase; - class GVAR(ProgressBar_Dialog) { idd = -1; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 64a06a0f8c..079d0cf686 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -16,6 +16,7 @@ PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); PREP(binarizeNumber); +PREP(blurScreen); PREP(callCustomEventHandlers); PREP(callCustomEventHandlersGlobal); PREP(canGetInPosition); @@ -31,6 +32,7 @@ PREP(convertKeyCode); PREP(createOrthonormalReference); PREP(currentChannel); PREP(disableUserInput); +PREP(displayIcon); PREP(displayText); PREP(displayTextPicture); PREP(displayTextStructured); diff --git a/addons/common/config.cpp b/addons/common/config.cpp index 84052cbdfb..b1c479b54f 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -94,8 +94,18 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_Common_EnableNumberHotkeys"; }; + class GVAR(settingFeedbackIcons) { + value = 1; + typeName = "SCALAR"; + force = 0; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; + description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; + values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; + }; }; +#include "define.hpp" #include #include #include diff --git a/addons/gui/UI/define.hpp b/addons/common/define.hpp similarity index 97% rename from addons/gui/UI/define.hpp rename to addons/common/define.hpp index 13ce7d8a3e..f1cc009864 100644 --- a/addons/gui/UI/define.hpp +++ b/addons/common/define.hpp @@ -182,12 +182,12 @@ class ACE_gui_buttonBase { bottom = 0.00; }; textureNoShortcut = ""; - animTextureNormal = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa) ); - animTextureDisabled = QUOTE( PATHTOF(data\buttonDisabled_gradient.paa)); - animTextureOver = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTextureFocused = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTexturePressed = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); - animTextureDefault = QUOTE( PATHTOF(data\buttonNormal_gradient_top.paa)); + animTextureNormal = "#(argb,8,8,3)color(0,0,0,0.9)"; + animTextureDisabled = "#(argb,8,8,3)color(0,0,0,0.8)"; + animTextureOver = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureFocused = "#(argb,8,8,3)color(1,1,1,1)"; + animTexturePressed = "#(argb,8,8,3)color(1,1,1,1)"; + animTextureDefault = "#(argb,8,8,3)color(1,1,1,1)"; period = 0.5; font = FontCSE; soundClick[] = {"\A3\ui_f\data\sound\RscButton\soundClick",0.09,1}; diff --git a/addons/gui/functions/fnc_blurScreen.sqf b/addons/common/functions/fnc_blurScreen.sqf similarity index 99% rename from addons/gui/functions/fnc_blurScreen.sqf rename to addons/common/functions/fnc_blurScreen.sqf index 1cde214587..c3d101a37e 100644 --- a/addons/gui/functions/fnc_blurScreen.sqf +++ b/addons/common/functions/fnc_blurScreen.sqf @@ -39,4 +39,4 @@ if (_show) then { GVAR(MENU_ppHandle_GUI_BLUR_SCREEN) = nil; }; }; -}; \ No newline at end of file +}; diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf new file mode 100644 index 0000000000..94fa887da9 --- /dev/null +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -0,0 +1,111 @@ +/** + * fn_gui_displayIcon.sqf + * @Descr: + * @Author: Glowbal + * + * @Arguments: [] + * @Return: + * @PublicAPI: true + * + * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; + */ + +#include "script_component.hpp" + +// positions for the icon UI +#define RIGHT_SIDE (safezoneW + safezoneX) +#define LEFT_SIDE safezoneX +#define TOP_SIDE safeZoneY +#define BOTTOM_SIDE (safeZoneH + safezoneY) +#define ICON_WIDTH (2 * (((safezoneW / safezoneH) min 1.2) / 40)) +#define X_POS_ICONS (RIGHT_SIDE - (1.5 * ICON_WIDTH)) +#define Y_POS_ICONS (TOP_SIDE + (2.5 * ICON_WIDTH)) +#define DIFFERENCE_ICONS (1.1 * ICON_WIDTH) +#define X_POS_ICONS_SECOND (RIGHT_SIDE - (4.4 * ICON_WIDTH)) +#define Y_POS_ICONS_SECOND (TOP_SIDE + (1.1 * ICON_WIDTH)) + +// setting values +#define TOP_RIGHT_DOWN 1 +#define TOP_RIGHT_LEFT 2 +#define TOP_LEFT_DOWN 3 +#define TOP_LEFT_RIGHT 4 + +// other constants +#define DEFAULT_TIME 6 + +private ["_iconId", "_show", "_icon", "_allControls", "_refresh", "_timeAlive", "_list", "_color"]; +_iconId = _this select 0; +_show = _this select 1; +_icon = _this select 2; +_color = _this select 3; +_timeAlive = if (count _this > 4) then {_this select 4} else {DEFAULT_TIME}; + +disableSerialization; +_list = missionNamespace getvariable [QGVAR(displayIconList),[]]; + +_refresh = { + private ["_allControls"]; + // Refreshing of all icons.. + _allControls = missionNamespace getvariable [QGVAR(displayIconListControls), []]; + { + ctrlDelete _x; + }foreach _allControls; + + _allControls = []; + + private ["_ctrl", "_setting"]; + _setting = missionNamespace getvariable[QGVAR(settingFeedbackIcons), 0]; + if (_setting > 0) then { + { + // +19000 because we want to make certain we are using free IDCs.. + _ctrl = ((findDisplay 46) ctrlCreate ["RscPicture", _foreachIndex + 19000]); + _position = switch (_setting) do { + case TOP_RIGHT_DOWN: {[X_POS_ICONS, Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + case TOP_RIGHT_LEFT: {[X_POS_ICONS_SECOND - ((_foreachIndex+3) * DIFFERENCE_ICONS), Y_POS_ICONS_SECOND - (ICON_WIDTH / 2), ICON_WIDTH, ICON_WIDTH]}; + case TOP_LEFT_DOWN: {[LEFT_SIDE + (0.5 * ICON_WIDTH), Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + case TOP_LEFT_RIGHT: {[LEFT_SIDE + (0.5 * ICON_WIDTH) - ((_foreachIndex+3) * DIFFERENCE_ICONS), Y_POS_ICONS_SECOND, ICON_WIDTH, ICON_WIDTH]}; + default {[X_POS_ICONS, Y_POS_ICONS + (_foreachIndex * DIFFERENCE_ICONS), ICON_WIDTH, ICON_WIDTH]}; + }; + _ctrl ctrlSetPosition _position; + _ctrl ctrlsetText (_x select 1); + _ctrl ctrlSetTextColor (_x select 2); + _ctrl ctrlCommit 0; + _allControls pushback _ctrl; + }foreach (missionNamespace getvariable [QGVAR(displayIconList),[]]); + }; + missionNamespace setvariable [QGVAR(displayIconListControls), _allControls]; +}; + +if (_show) then { + if ({(_x select 0 == _iconId)} count _list == 0) then { + _list pushback [_iconId, _icon, _color, time]; + } else { + { + if (_x select 0 == _iconId) exitwith { + _list set [_foreachIndex, [_iconId, _icon, _color, time]]; + }; + }foreach _list; + }; + missionNamespace setvariable [QGVAR(displayIconList), _list]; + call _refresh; + + if (_timeAlive >= 0) then { + [{ + [_this select 0, false, "", [0,0,0], 0] call FUNC(displayIcon); + }, [_iconId], _timeAlive, _timeAlive] call EFUNC(common,waitAndExecute); + }; + +} else { + if ({(_x select 0 == _iconId)} count _list == 1) then { + private "_newList"; + _newList = []; + { + if (_x select 0 != _iconId) then { + _newList pushback _x; + }; + }foreach _list; + + missionNamespace setvariable [QGVAR(displayIconList), _newList]; + call _refresh; + }; +}; diff --git a/addons/gui/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf similarity index 92% rename from addons/gui/functions/fnc_displayInformation.sqf rename to addons/common/functions/fnc_displayInformation.sqf index c4eb96984b..64a27b0e40 100644 --- a/addons/gui/functions/fnc_displayInformation.sqf +++ b/addons/common/functions/fnc_displayInformation.sqf @@ -19,10 +19,10 @@ _type = [_this, 2, 0, [0]] call BIS_fnc_Param; _icon = [_this, 3, "",[""]] call BIS_fnc_Param; if (_title != "") then { - DISPLAY_LAYER cutRsc [QGVAR(RSC_DISPLAY_INFORMATION),"PLAIN"]; + DISPLAY_LAYER cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; disableSerialization; - _display = uiNamespace getvariable QGVAR(RSC_DISPLAY_INFORMATION); + _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; if (!isnil "_display") then { _headerCtrl = _display displayCtrl 1; _headerCtrl ctrlSetText _title; diff --git a/addons/gui/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf similarity index 85% rename from addons/gui/functions/fnc_displayMessage.sqf rename to addons/common/functions/fnc_displayMessage.sqf index 3dceab2638..317de8b240 100644 --- a/addons/gui/functions/fnc_displayMessage.sqf +++ b/addons/common/functions/fnc_displayMessage.sqf @@ -18,10 +18,10 @@ _content = [_this, 1, "",[""]] call BIS_fnc_Param; _type = [_this, 2, 0, [0]] call BIS_fnc_Param; if (_title != "" && _content != "") then { - DISPLAY_LAYER cutRsc [QGVAR(RSC_DISPLAY_MESSAGE),"PLAIN"]; + DISPLAY_LAYER cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; disableSerialization; - _display = uiNamespace getvariable QGVAR(RSC_DISPLAY_MESSAGE); + _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; if (!isnil "_display") then { _headerCtrl = _display displayCtrl 1; _contentCtrl = _display displayCtrl 2; @@ -29,6 +29,7 @@ if (_title != "" && _content != "") then { _headerCtrl ctrlSetText _title; _contentCtrl ctrlSetText _content; + // TODO get a font that has the same width characters for all. Ask Jaynus. _contentAmountOfChars = count (toArray _content); _pos = ctrlPosition _contentCtrl; _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index ab4cb7b69c..1d73cccc79 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -36,10 +36,10 @@ _perFrameFunction = { PARAMS_2(_parameters,_pfhID); EXPLODE_8_PVT(_parameters,_args,_onFinish,_onFail,_condition,_player,_startTime,_totalTime,_exceptions); private ["_elapsedTime", "_errorCode"]; - + _elapsedTime = time - _startTime; _errorCode = -1; - + if (isNull (uiNamespace getVariable [QGVAR(ctrlProgressBar), controlNull])) then { _errorCode = 1; } else { diff --git a/addons/gui/functions/fnc_sendDisplayInformationTo.sqf b/addons/common/functions/fnc_sendDisplayInformationTo.sqf similarity index 95% rename from addons/gui/functions/fnc_sendDisplayInformationTo.sqf rename to addons/common/functions/fnc_sendDisplayInformationTo.sqf index ae4012b5fe..f22894e057 100644 --- a/addons/gui/functions/fnc_sendDisplayInformationTo.sqf +++ b/addons/common/functions/fnc_sendDisplayInformationTo.sqf @@ -42,6 +42,6 @@ if (isPlayer _reciever) then { }foreach _content; - [_title,_content,_type] call EFUNC(gui,displayInformation); + [_title,_content,_type] call EFUNC(common,displayInformation); }; }; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendDisplayMessageTo.sqf b/addons/common/functions/fnc_sendDisplayMessageTo.sqf similarity index 95% rename from addons/gui/functions/fnc_sendDisplayMessageTo.sqf rename to addons/common/functions/fnc_sendDisplayMessageTo.sqf index c66af97266..3c5b399659 100644 --- a/addons/gui/functions/fnc_sendDisplayMessageTo.sqf +++ b/addons/common/functions/fnc_sendDisplayMessageTo.sqf @@ -41,6 +41,6 @@ if (isPlayer _reciever) then { }foreach _parameters; _content = format _localizationArray; - [_title,_content,_type] call EFUNC(gui,displayMessage); + [_title,_content,_type] call EFUNC(common,displayMessage); }; }; \ No newline at end of file diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index f2d944eb7a..f7705f8ad9 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -315,6 +315,12 @@ Ignoruj prośby wysłane przez innych graczy. Akceptacji wymagają między innymi akcje używania / współdzielenia wyposażenia, wykonywania określonych czynności. Rechazar Peticiones de otros jugadores. Pueden ser solicitudes para usar / compartir equipamiento, realizar ciertas acciones. + + Feedback icons + + + Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. + \ No newline at end of file diff --git a/addons/gui/CfgEventHandlers.hpp b/addons/gui/CfgEventHandlers.hpp deleted file mode 100644 index c9142e676b..0000000000 --- a/addons/gui/CfgEventHandlers.hpp +++ /dev/null @@ -1,11 +0,0 @@ -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE( call compile preprocessFileLineNumbers QUOTE(QUOTE(PATHTOF(XEH_preInit.sqf))) ); - }; -}; - -class Extended_PostInit_EventHandlers { - class ADDON { - init = QUOTE( call compile preprocessFileLineNumbers QUOTE(QUOTE(PATHTOF(XEH_postInit.sqf))) ); - }; -}; \ No newline at end of file diff --git a/addons/gui/GUI.hpp b/addons/gui/GUI.hpp deleted file mode 100644 index 71e8dc0090..0000000000 --- a/addons/gui/GUI.hpp +++ /dev/null @@ -1,2 +0,0 @@ -#include "UI\define.hpp" -#include "UI\RscTitles.hpp" diff --git a/addons/gui/README.md b/addons/gui/README.md deleted file mode 100644 index a6fe74f6c2..0000000000 --- a/addons/gui/README.md +++ /dev/null @@ -1,11 +0,0 @@ -ace_gui -======= - -to be scrapped. - - -## Maintainers - -The people responsible for merging changes to this component or answering potential questions. - -- [Glowbal](https://github.com/Glowbal) diff --git a/addons/gui/UI/RscTitles.hpp b/addons/gui/UI/RscTitles.hpp deleted file mode 100644 index 02e68e8d32..0000000000 --- a/addons/gui/UI/RscTitles.hpp +++ /dev/null @@ -1,179 +0,0 @@ - -#define RIGHT_SIDE (safezoneW + safezoneX) -#define LEFT_SIDE safezoneX -#define TOP_SIDE safeZoneY -#define BOTTOM_SIDE (safeZoneH + safezoneY) - -#define ICON_WIDTH (1.75 * (((safezoneW / safezoneH) min 1.2) / 40)) -#define X_POS_ICONS RIGHT_SIDE - (1.1 * ICON_WIDTH) -#define Y_POS_ICONS TOP_SIDE + (2.2 * ICON_WIDTH) -#define DIFFERENCE_ICONS (1.1 * ICON_WIDTH) - -class RscTitles { - class GVAR(iconsDisplay) { - duration = 1e+011; - idd = 1111; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(iconsDisplay)), _this select 0)]); - class controlsBackground { - class icon_1: ACE_gui_backgroundBase { - text = ""; - colorText[] = {0.0,1.0,0.0,0.4}; - idc = 10501; - x = X_POS_ICONS; - y = Y_POS_ICONS + (0 * DIFFERENCE_ICONS); - w = ICON_WIDTH; - h = ICON_WIDTH; - }; - class icon_2: icon_1 { - idc = 10502; - y = Y_POS_ICONS + (1 * DIFFERENCE_ICONS); - }; - class icon_3: icon_1 { - idc = 10503; - y = Y_POS_ICONS + (2 * DIFFERENCE_ICONS); - }; - class icon_4: icon_1 { - idc = 10504; - y = Y_POS_ICONS + (3 * DIFFERENCE_ICONS); - }; - class icon_5: icon_1 { - idc = 10505; - y = Y_POS_ICONS + (4 * DIFFERENCE_ICONS); - }; - class icon_6: icon_1 { - idc = 10506; - y = Y_POS_ICONS + (5 * DIFFERENCE_ICONS); - }; - }; - }; - - class GVAR(RSC_PROGRESSBAR_LOADING) { - idd = -1; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_PROGRESSBAR_LOADING)), _this select 0)]); - fadein = 0; - fadeout = 0; - duration = 10e10; - class Controls { - class background: ACE_gui_backgroundBase { - idc = -1; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - text = "#(argb,8,8,3)color(0,0,0,0.4)"; - }; - - class Progress: ACE_gui_RscProgress { - idc = 6; - x = "1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2)"; - y = "29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; - w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; - h = "0.4 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0}; - colorBar[] = {0.27,0.5,0.31,0.6}; - texture = "#(argb,8,8,3)color(1,1,1,0.7)"; - }; - }; - }; - - - class GVAR(RSC_DISPLAY_MESSAGE) { - duration = 7; - idd = 86411; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_DISPLAY_MESSAGE)), _this select 0)]); - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (30 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (31 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - }; - }; - - class GVAR(RSC_DISPLAY_INFORMATION) { - duration = 15; - idd = 86412; - movingenable = 0; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(RSC_DISPLAY_INFORMATION)), _this select 0)]); - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (6 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (7.1 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - class text2: text { - idc = 3; - y = "safezoneY + (8.2 * (safeZoneH / 40))"; - }; - class text3: text { - idc = 4; - y = "safezoneY + (9.3 * (safeZoneH / 40))"; - }; - class text4: text { - idc = 5; - y = "safezoneY + (10.4 * (safeZoneH / 40))"; - }; - class text5: text { - idc = 6; - y = "safezoneY + (11.5 * (safeZoneH / 40))"; - }; - - - class icon: ACE_gui_backgroundBase { - type = CT_STATIC; - idc = 10; - style = ST_PICTURE; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - font = FontCSE; - text = ""; - sizeEx = 0.032; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (4 * (safeZoneH / 40))"; - w = "(safeZoneH / 40)*2"; - h = "(safeZoneH / 40)*2"; - }; - }; - }; - -}; \ No newline at end of file diff --git a/addons/gui/XEH_postInit.sqf b/addons/gui/XEH_postInit.sqf deleted file mode 100644 index 4172145202..0000000000 --- a/addons/gui/XEH_postInit.sqf +++ /dev/null @@ -1,11 +0,0 @@ -/** - * XEH_postInit.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" diff --git a/addons/gui/XEH_preInit.sqf b/addons/gui/XEH_preInit.sqf deleted file mode 100644 index b5cc064d18..0000000000 --- a/addons/gui/XEH_preInit.sqf +++ /dev/null @@ -1,25 +0,0 @@ -/** - * XEH_preInit.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -ADDON = false; - -PREP(loadingBar); -PREP(displayInformation); -PREP(displayMessage); -PREP(blurScreen); -PREP(displayIcon); -PREP(sendHintTo); -PREP(sendMessageTo); -PREP(sendDisplayInformationTo); -PREP(sendDisplayMessageTo); - -ADDON = true; diff --git a/addons/gui/config.cpp b/addons/gui/config.cpp deleted file mode 100644 index 2f7666be13..0000000000 --- a/addons/gui/config.cpp +++ /dev/null @@ -1,27 +0,0 @@ - -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_main"}; - version = VERSION; - author[] = {$STR_ACE_Common_ACETeam}; - authorUrl = "http://csemod.com"; // TODO website link? - }; -}; -class CfgAddons { - class PreloadAddons { - class ADDON { - list[] = {QUOTE(ADDON)}; - }; - }; -}; - -#include "CfgEventHandlers.hpp" - -// TODO Port over the UI defines -#include "GUI.hpp" -#include "empty.hpp" diff --git a/addons/gui/data/buttonDisabled.paa b/addons/gui/data/buttonDisabled.paa deleted file mode 100644 index 2c2a10856b22386ce5dccdda85c34006259f1086..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmWF)b$53Radr=LWMN=n@bvWj59UWW`hxiXfdIr0c60N00P+if_zg&cY%q;MfuWRz zfmw4Y6F&knAea!=r~qn+jE2W(c#P&3SQ;QbH!wDY{rT_BAi$u^I9m1~B_t+(w6Nr3 MTp;@YKcsjE0G`c5>Hq)$ diff --git a/addons/gui/data/buttonDisabled_gradient.paa b/addons/gui/data/buttonDisabled_gradient.paa deleted file mode 100644 index 43b1b8d100e67efb7e607cc0fdc3e83437268092..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1816 zcmeH|KWI}y9LIn6yZ0w4iMhMHK4T~)EisZKNC+hqDUyFAz8KOV*@}e@x#NEK`~Kj5cYKcf-L1(= zCBIy(tmG8{sMTujU%i^Y*3+)ndirL$d_Cvs4R5?tJ#*~VgcuZ6ph+7;!wy5Y?~Mch z5;+Es+nV39la5KHPbtL}6RR0tz>h&`ghsOM_jeOfi!teZk#;r1tcz!zWYMXbputsE zX3i9W6qsa=L_BNY65HfHi!?YRGJ-j>9lp;WH^>@U=IE?pZQltq!yVV1T?3g_9J z-%yuDfkU09D8o9xC+cKDGzA1OOVjv_Baomw9KLkoA@0&VgU>B67KW1Izr?q(2kkGXhOuHB*a8lK<2HHJO3u%7=?JWWN>xk zz<@-59`pELJf7=a_X;q$K~AEQ#sqA)jtJ^F0}$RmV!}mvBpfS0QLx t{Ys{FsahW$c^NgxkcUvU+Zxyf#gQ0%XRx-+aK$alM4U< diff --git a/addons/gui/data/buttonNormal.paa b/addons/gui/data/buttonNormal.paa deleted file mode 100644 index 84936d83562e20d2d7bc064e6487a87305e0e4f8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1564 zcmWF)b$53Radr=LWMN=nU}R+c59UWW`hxiXfdIr0c60N00P+if_zg&cY%q;MfuWRz zftjI!i5~$O5KIVbQ~)(ZM#Ez?JVx^iEDeyJ8yFcDeEaXsAi$u^I9m1~B_t+(w6Nr3 MWLWX{KcsjE04MuGD*ylh diff --git a/addons/gui/data/buttonNormal_gradient.paa b/addons/gui/data/buttonNormal_gradient.paa deleted file mode 100644 index 2210f987411ee2a407ba63733091384a6fb00e35..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1989 zcmdT_&ubGw6n^i`>}H#8eh^j&A%;x|A%qxmh@liI-2~c*5iQ10LMW01ky1oTD5XdV zW(tceWsx8rJv350dF)9HfMs1s%Rgz@S6EqX&-6k##14 zoqg<%uDQg!h@x`jT$ZvVP^8AfZX~)Q<)jrU`sF??U2l4Fcy+05DM}( z&Ok(-$1)Y5%6J9aPzb{(o~0I6I6Q#_JY$7J%7?~5p3Z4N9-Au?1Uv~(bAlQvL`y-= z0$k-GjAI%)ZmKdbOOTE#3!t^p2tYAI3z(6UXqD2miYgR!%s{aNum*mR(ZT?}hAgzX z9>(X8r8+FJ#v-l*HdDAjRmjsizCsge2b&?j;y~mm!$NpYlSIB_#BPq(b$70-QEPYZ zqfMZqEdso2mm@4sb}K>&Y^kWEX$s=dN;!L8CND~&1fmAhSaMR@f)Zg8?_pPAZ4i?n ziA63R;tE6{NEIpf7++$yPAz*16AWrtpc<{AO&ZCp0-)12EWswz@CCeQkHEi)%b2DP zi3ze%_Ct*P{GbAd-(x!dpTL_V9g5Po2U~W(*SAIQ(uM*XJ0(s_hs zm{V41B~CIAvph?V=RN;at|wLdKDg#=kusim_6LV*6<1V@RG-Xyi+pa$Io8~AOqNV7 zHJ(Fb5(;q)Qwk#ijEaJJTCCFEkDj9Dd8MW`44=%TGn!_<_Xww4f4SvO ZgP=MCJpJCmus=_!xITRSF&N#$KLJ6wth)dJ diff --git a/addons/gui/data/buttonNormal_gradient2.paa b/addons/gui/data/buttonNormal_gradient2.paa deleted file mode 100644 index cabe6c7feda6907aca65b3aad4ee27ce6c91f491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2035 zcmd5-L1^1%6n^jhzkVyR9C@A=jOV$w2__g}JTRflN{Qr=1lBRud07adnAnUG(rz>% zgfdE&sNfAzL@;6Ov_dk%PCM=}#&#P$-uHj+ zz3+eif9a#wW@e05b7s!q0AQNt(Xl^oyyy8x?&bL(PEWr-<@%qwzb)b3{`a*DMMw%@ zZ~aATI3P5AE9*VP5N!HxY(4@gOus;C1Q-zFF{XUnzZbQ{msUYmIC3teI$1+l9m)?Q z(Iu%NtxLa_ZqhBB7i(mZ1(KCx#U6ZuGG0mSyva&dG}qwLzN`USJm@6ElXX6W)POU% ziXZKBUd-4LLuE~+5kph8RPQIjWyvyn#v&MR_sSZSdqxH;{2hgDFmsXGl8xn@fQx8~ z1Du9}n8zz*f;`7sxCUk(9`ZVMvEAZ3P=T-MoBL+(`Pzb&#Q=ptu%>_$SN>u~*qQS> z7|j!_lJ+9?3t4Ou6qD)H$7Zi%(oz*|8G*A5S9lJ`P={ffW9<=Ep&}|QgZ5GeO3fNw z!r! z3hHEChB4??-SaPK1TC5cD-TmR>o&CugnQ$79k*q+2G%54w9Ku~aUBYfrIz#+=Dx@6 zMd~`2vBDM*Oj@AZ=#WN&wV+6F04s2hY4{!d#JfcA!B|FFYPSLq)(Lby#8xkIxnL%p>cs?>YPZ{ZAdM ze^-XPea`OhD=deU7ze8edr;&BR$~p)A1?aDy-JhVWoOrVF?C4$hymS%NKOSCv5X`g#qmSMv;8bQ(4{*>Mc=!4LLaG}> zY5*wA=xge*C=01qO*YWjngnwU^Hg<@=yJ(K_oWpbZnYrPhuv%;z?03Ert+k%u_Ybt z5hiq_V~6n@zIpY*>fxxbBb@6b?A60CRo$Q2l`O}zPOZ{o#Q;}GICfL}*biOLDv-K* Y`1H|}lIQ#qnM*x=^yiI#kNmIpe=FM30RR91 diff --git a/addons/gui/data/buttonNormal_gradient3.paa b/addons/gui/data/buttonNormal_gradient3.paa deleted file mode 100644 index 7da9fbcf8a7bea39e3108f236c4322101bac95a2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2044 zcmd5--)kF35dLO%Z*`VWKM>atgb-)d2qA=!gD}PoMkf_J(3Fx^5ymwk$fAT0LI}nL zQ-Z12pq3+CgIv-+g%XtzD3p>wDQ#)rO5d6XKjfci9|C=8QCD$Qx#U4$3dtUKyK}qq z%{Q|%yXRk7S@D~Vm6k67%+1XWp2@5Jn?reE+E9LHdHJoHk*}HeGi5%uNV^DcPDz}r!xe1Q@Zo-Xqzf;n-wBPmD;lI|+ zxyW_>6y@dXj<_M}>wM7)D3?}Ppt`zG%gCx#I?Hv~EzzV+)H8S@E8HP8jimt46~oBsRknz%f~hrxXnchY?2}+9hs(CLJ3iBiMYtKM~+C*bkI(rQRWL&Rt5Sv zDDe$)(D0~?26nKGBoqadq90H}ZBu6GE-Ji^E24dw_$D@rbb(u#=bQ8u$u50E8)>;^ zAgWvzNYl}*dWrMu?uh5pbGt5gzJ7WxWH=P+l-&I^%!+vqJ6Xnj0tJj0aJl4(XK5vp`(k?m!*E6wvfe1zSOinq6f6Q&Yf_HkQZxI=QZA@ zkX=>+O?Z4CS8z+X^aXwv-Uqlv*Nwp))(adGR5Hg&IpX>f$8&Px?u@-Kr=r~-g!jUJ zuOI4ndwVwadQ$WqQ7{P<6br4i66;Q!g$ZEL6oRNo)V{qk`E+yF`oB;{8*+MB6m@ z^^d_Drku_b#Fvkb(tdU^#A$Rf{5YPA(~O=RN^hhPwahUXRsEc@y2a@#`HQIkK1&&M z3Zx8Dy*nAJHo`J}tl=ge$mzfp?GgoXYlDI#vnDi?;hZ6i4o7N}6)ujJa;)Eb&O)5T UZ{PpBV#FX$-~Rd6;PCqX8=e`$(*OVf diff --git a/addons/gui/data/buttonNormal_gradient_top.paa b/addons/gui/data/buttonNormal_gradient_top.paa deleted file mode 100644 index 904e1a62f7a1cf7e03644d5a965fbe3b177b23b4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1995 zcmd5--Afxm5TBXdyPWaz!Epr%A)G;u5JK=lg4iOtOHrYg);0}dMZ|<6B2pxXNRiO2 zkd{NPBBgzkVu}cbQV{x3O8Zv&C$#@W9|WIDdeMdi`Vh!Nb(g)}*}3`62Q#w|u1!u_ z`P^i|;s9WpX5*ZmwQe`*hBun@{fUV?S&x3~tu@*E^gLdI0cR4hd*3P4p3pvCoCcbk z;)BWs`47K`i)>qmUov#xGZ9l%j-1QVFo`})_C@_jbVC}EHl(kEYqXBDa+w4P*bxzC z)Zh^+IPC)_2HQ{+>cNyt64?twTn|yu(nETn_DSZ7B&?b>57zZsT!(ng($M5LRkq3O zd0Lblj7MY`MO!|?35dzFI88Pv1(wG$*irbwhpB{+=X+qnD`x+7>yo_dLG2s4FGrvS z%s_FJmMDpif}Ckwg9>ax z7-V!%!_P1b*)osf0SwbTtg@vQq-`iBae)eup>2GRyoMjK7~vZp#0aGsM6fffu5ex* zwCp^csp?eva601>sOSofS6{m^mLazkBNIzu6;m`0Lr_Y3RWFl2h++!F9At6I3#nTI z!UQg3Rbgci{xJ|MTs*-Ih`|6Y=cVU(jMaH6x#I{Xn?sxCXbWA^NoJ4-gN|SocA1WE z;Ttoa!Y;0R3M(W=$wiREaSHR6tyegn-4nOc_QLCmO1z rltL#c718P7dJj~0IJF5Q+?H5(fyLIZ6sYfa*P!_Ne*SJ;yvBb36MwL| diff --git a/addons/gui/data/buttonNormal_gradient_top_w.paa b/addons/gui/data/buttonNormal_gradient_top_w.paa deleted file mode 100644 index 23dd190afc5bab9aecf46185e74c365abbfd22fb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1856 zcmeHIL1+^}6#f6tB)gR~nVH?hZK$;kwMr;aODUd0616E6QPc*hl0y;6!9(yAq?97+ zp@$xehth+G;?Yyd!7S2?AmT|pxr<0I;>S)!M;#^Vi$B6<8bJ9v{Dv3ve~)??b`x*R}-xa5Dt#)(47p8g$%U z&uUM)*6?=WAM3}&LB)B+!uEYz2gi4P`<~|} z&}%4YM1WrsI@n=MLqQ3$h?~qJw;wn>ARSExIULkxD9Hs~;4h6TLIyb%@G(5YMa;5~ zJ@5vy+8TU~eLA(>vl(wDU^cYQ_45(A!E|^>y#mHW0*R$qANIluSXelrxwHLck>h}EU7_VJyk!9VSPzW@TT$21nbOb zDyn`OR%-fUl$|@>+4B4K920wL9&+RUdx2Qf+HPF~0gn)v^?kn_J5@A_|FnwE?+-}b z?p2@A31fsQ^aQ>(iL)Va(qL!E+04)g1SqHyo^#f-{Ygw}u7D&w_bs%ip+*%Ph6a_v eUZ5;0mS$u43ZcRdM2Q`3Qd3hWqpjBN7x)YODXS;| diff --git a/addons/gui/empty.hpp b/addons/gui/empty.hpp deleted file mode 100644 index 698784e2c6..0000000000 --- a/addons/gui/empty.hpp +++ /dev/null @@ -1,21 +0,0 @@ -#include "\z\ace\addons\gui\UI\define.hpp" - -class ACE_common_empty_screen { - idd = 679123; - onLoad = "uiNamespace setVariable [""ACE_common_empty_screen"", _this select 0]"; - onUnload = "if (missionNamespace getvariable [""ACE_common_DISABLE_USER_INPUT_SCREEN"", false)]) then { createDialog ""ACE_common_empty_screen""; }"; - class controlsBackground { - class background : ACE_gui_backgroundBase { - idc = 1; - x = safezoneX; - y = safezoneY; - w = safezoneW; - h = safezoneH; - text = ""; - moving = 0; - }; - }; - - class controls { - }; -}; diff --git a/addons/gui/functions/fnc_displayIcon.sqf b/addons/gui/functions/fnc_displayIcon.sqf deleted file mode 100644 index 98895c6346..0000000000 --- a/addons/gui/functions/fnc_displayIcon.sqf +++ /dev/null @@ -1,79 +0,0 @@ -/** - * fn_gui_displayIcon.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - * - * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1]] call ace_gui_fnc_displayIcon; - */ - -#include "script_component.hpp" - -#define MAX_N_ICONS 6 - -private ["_iconId", "_show", "_icon", "_spot", "_idc", "_display","_next_IDC", "_nextText"]; -_iconId = _this select 0; -_show = _this select 1; -_icon = _this select 2; -_color = _this select 3; - -disableSerialization; -_list = missionNamespace getvariable [QGVAR(displayIconList),[]]; -_display = uiNamespace getvariable QGVAR(iconsDisplay); - -if (isNil "_display") then { - // Display the icons - 11401 cutRsc [QGVAR(iconsDisplay),"PLAIN"]; - _display = uiNamespace getvariable QGVAR(iconsDisplay); -}; - -if (_show) then { - if ({(_x select 0 == _iconId)} count _list == 0) then { - _list pushback [_iconId, _icon, _color]; - } else { - { - if (_x select 0 == _iconId) exitwith { - _list set [_foreachIndex, [_iconId, _icon, _color]]; - }; - }foreach _list; - }; - - missionNamespace setvariable [QGVAR(displayIconList), _list]; - - { - if (_x select 0 == _iconId) exitwith { - _idc = 10501 + _foreachIndex; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText _icon; - _ctrl ctrlSetTextColor _color; - }; - }foreach _list; -} else { - if ({(_x select 0 == _iconId)} count _list == 1) then { - _newList = []; - { - if (_x select 0 != _iconId) then { - _newList pushback _x; - }; - }foreach _list; - - missionNamespace setvariable [QGVAR(displayIconList), _newList]; - - for "_i" from 0 to (MAX_N_ICONS - 1) /* step +1 */ do { - _idc = 10501 + _i; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText ""; - _ctrl ctrlSetTextColor [1,1,1,1]; - }; - - { - _idc = 10501 + _foreachIndex; - _ctrl = _display displayCtrl _idc; - _ctrl ctrlsetText (_x select 1); - _ctrl ctrlSetTextColor (_x select 2); - }foreach _newList; - }; -}; diff --git a/addons/gui/functions/fnc_loadingbar.sqf b/addons/gui/functions/fnc_loadingbar.sqf deleted file mode 100644 index 4aba751235..0000000000 --- a/addons/gui/functions/fnc_loadingbar.sqf +++ /dev/null @@ -1,64 +0,0 @@ -/** - * fn_gui_loadingbar.sqf - * @Descr: Displays a loading bar and halts script until loading bar has finished - * @Author: Glowbal - * - * @Arguments: [timeToWait NUMBER, condition CODE (Optional), onSuccess CODE (Optional), onFailure CODE (Optional), arguments ARRAY (Optional)] - * @Return: BOOl Returns true if loading bar has fully finished. Otherwise false - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_timeToWait","_cond","_onfailure","_onSuccess","_args"]; -_timeToWait = _this select 0; -_cond = [_this, 1, {true}, [{true}]] call BIS_fnc_Param; -_onSuccess = [_this, 2, {}, [{}]] call BIS_fnc_Param; -_onfailure = [_this, 3, {}, [{}]] call BIS_fnc_Param; -_args = [_this, 4, [], [[]]] call BIS_fnc_Param; - - -if (_timeToWait > 0) exitwith { - GVAR(LOADING_BAR_STATUS) = 0; - disableSerialization; - 1534 cutRsc [QGVAR(RSC_PROGRESSBAR_LOADING),"plain"]; - [{ - private ["_args","_timeToWait","_start","_cond","_onSuccess","_onfailure","_params"]; - _args = _this select 0; - - _start = _args select 0; - _timeToWait = _args select 1; - _cond = _args select 2; - _onSuccess = _args select 3; - _onfailure = _args select 4; - _params = _args select 5; - - if !(_params call _cond) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - 1534 cutText ["","plain"]; - _params call _onfailure; - }; - - if (GVAR(LOADING_BAR_STATUS) >= 1) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - 1534 cutText ["","plain"]; - _params call _onSuccess; - }; - private "_dialog"; - disableSerialization; - _dialog = uiNamespace getvariable QGVAR(RSC_PROGRESSBAR_LOADING); - - GVAR(LOADING_BAR_STATUS) = (diag_tickTime - _start) / _timeToWait; - (_dialog displayCtrl 6) progressSetPosition GVAR(LOADING_BAR_STATUS); - - }, 0, [diag_tickTime, _timeToWait, _cond, _onSuccess, _onfailure, _args]] call CBA_fnc_addPerFrameHandler; - true; -}; - -if (_args call _cond) exitwith { - _args call _onSuccess; - true; -}; - -_args call _onfailure; -false; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendHintTo.sqf b/addons/gui/functions/fnc_sendHintTo.sqf deleted file mode 100644 index 0454cc5691..0000000000 --- a/addons/gui/functions/fnc_sendHintTo.sqf +++ /dev/null @@ -1,26 +0,0 @@ -/** - * fn_sendHintTo.sqf - * @Descr: Sends a hint to player unit across network - * @Author: Glowbal - * - * @Arguments: [reciever OBJECT, message STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_reciever","_message"]; -_reciever = _this select 0; -_message = _this select 1; - -if (isPlayer _reciever) then { - if (!local _reciever) then { - [_this, QUOTE(FUNC(sendHintTo)), _reciever, false] call EFUNC(common,execRemoteFnc); - } else { - if (isLocalized _message) then { - _message = localize _message; - }; - hintsilent format ["%1",_message]; - }; -}; \ No newline at end of file diff --git a/addons/gui/functions/fnc_sendMessageTo.sqf b/addons/gui/functions/fnc_sendMessageTo.sqf deleted file mode 100644 index a4e0e4ccd5..0000000000 --- a/addons/gui/functions/fnc_sendMessageTo.sqf +++ /dev/null @@ -1,31 +0,0 @@ -/** - * fn_sendMessageTo.sqf - * @Descr: Sends a chat message to player unit across the network - * @Author: Glowbal - * - * @Arguments: [reciever OBJECT, message STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_reciever","_message"]; -_reciever = _this select 0; -_message = _this select 1; - - -if (isPlayer _reciever) then { - if (!local _reciever) then { - [_this, QUOTE(FUNC(sendMessageTo)), _reciever, false] call EFUNC(common,execRemoteFnc); - } else { - if (isnil QGVAR(LOGIC_OBJECT)) exitwith { - // need to create an object instead - }; - - if (isLocalized _message) then { - _message = localize _message; - }; - GVAR(LOGIC_OBJECT) globalChat format ["%1",_message]; - }; -}; diff --git a/addons/gui/functions/script_component.hpp b/addons/gui/functions/script_component.hpp deleted file mode 100644 index e9276928ad..0000000000 --- a/addons/gui/functions/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT GUI -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_GUI - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_GUI - #define DEBUG_SETTINGS DEBUG_SETTINGS_GUI -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/gui/script_component.hpp b/addons/gui/script_component.hpp deleted file mode 100644 index e9276928ad..0000000000 --- a/addons/gui/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT GUI -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_GUI - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_GUI - #define DEBUG_SETTINGS DEBUG_SETTINGS_GUI -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file diff --git a/addons/gui/stringtable.xml b/addons/gui/stringtable.xml deleted file mode 100644 index 6a7807c925..0000000000 --- a/addons/gui/stringtable.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/addons/medical/config.cpp b/addons/medical/config.cpp index 96af8ac1ca..19fae7d3e8 100644 --- a/addons/medical/config.cpp +++ b/addons/medical/config.cpp @@ -7,7 +7,7 @@ class CfgPatches units[] = {"ACE_medical_supply_crate_cms", "ACE_bandage_basicItem","ACE_packing_bandageItem","ACE_bandageElasticItem","ACE_tourniquetItem","ACE_splintItem","ACE_morphineItem","ACE_atropineItem","ACE_epinephrineItem","ACE_plasma_ivItem","ACE_plasma_iv_500Item","ACE_plasma_iv250Item","ACE_blood_ivItem","ACE_blood_iv_500Item","ACE_blood_iv_250Item","ACE_saline_ivItem","ACE_saline_iv_500Item","ACE_saline_iv_250Item","ACE_quikclotItem","ACE_nasopharyngeal_tubeItem","ACE_opaItem","ACE_liquidSkinItem","ACE_chestsealItem","ACE_personal_aid_kitItem"}; weapons[] = {"ACE_surgical_kit"}; requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ACE_gui","ACE_common"}; + requiredAddons[] = {"ACE_common"}; version = VERSION; author[] = {$STR_ACE_Common_ACETeam, "Glowbal"}; authorUrl = "http://csemod.com"; diff --git a/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf b/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf index 9f645e80ad..bd17d769ec 100644 --- a/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf +++ b/addons/medical/functions/fnc_ActionCheckBloodPressureLocal.sqf @@ -51,7 +51,7 @@ if ([_caller] call FUNC(isMedic)) then { _title = format["STR_ACE_CHECK_BLOODPRESSURE"]; _content = ["STR_ACE_CHECK_BLOODPRESSURE_CHECKED_MEDIC", _output]; -[_caller, _title, _content, 0,[[_unit] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)] ] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content, 0,[[_unit] call EFUNC(common,getName), round(_bloodPressureHigh),round(_bloodPressureLow)] ] call EFUNC(common,sendDisplayInformationTo); if (_logOutPut != "") then { [_unit,"examine",format["%1 checked Blood Pressure: %2",[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToQuickViewLog); diff --git a/addons/medical/functions/fnc_ActionCheckPulse.sqf b/addons/medical/functions/fnc_ActionCheckPulse.sqf index 52e9158329..00e7f49490 100644 --- a/addons/medical/functions/fnc_ActionCheckPulse.sqf +++ b/addons/medical/functions/fnc_ActionCheckPulse.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_PULSE"]; _content = ["STR_ACE_CHECK_PULSE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -32,8 +32,8 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf b/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf index d96ae8b19c..2f79bad6b2 100644 --- a/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf +++ b/addons/medical/functions/fnc_ActioncheckBloodPressure.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_BLOODPRESSURE"]; _content = ["STR_ACE_CHECK_BLOODPRESSURE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -32,9 +32,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionCarryUnit.sqf b/addons/medical/functions/fnc_actionCarryUnit.sqf index d3cfb35aee..2dd1bb8f7f 100644 --- a/addons/medical/functions/fnc_actionCarryUnit.sqf +++ b/addons/medical/functions/fnc_actionCarryUnit.sqf @@ -87,9 +87,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0), false] call FUNC(treatmentMutex); [(_this select 0), objNull,[0, 0, 0]] call EFUNC(common,carryObj); }, // on failure [_caller, _unit, _killOnDrop] // arguments -] call EFUNC(gui,loadingBar); \ No newline at end of file +] call EFUNC(common,loadingBar); \ No newline at end of file diff --git a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf index ae69f52272..5707f403df 100644 --- a/addons/medical/functions/fnc_actionCheckPulseLocal.sqf +++ b/addons/medical/functions/fnc_actionCheckPulseLocal.sqf @@ -44,7 +44,7 @@ if (_heartRate > 1.0) then { _title = "STR_ACE_CHECK_PULSE"; _content = ["STR_ACE_CHECK_PULSE_CHECKED_MEDIC",_heartRateOutput]; -[_caller, _title, _content, 0, [[_unit] call EFUNC(common,getName), round(_heartRate)]] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content, 0, [[_unit] call EFUNC(common,getName), round(_heartRate)]] call EFUNC(common,sendDisplayInformationTo); if (_logOutPut != "") then { [_unit,"examine",format["%1 checked Heart Rate: %2",[_caller] call EFUNC(common,getName),_logOutPut]] call FUNC(addToQuickViewLog); diff --git a/addons/medical/functions/fnc_actionCheckResponse.sqf b/addons/medical/functions/fnc_actionCheckResponse.sqf index d2201e15f2..4ec2d269ad 100644 --- a/addons/medical/functions/fnc_actionCheckResponse.sqf +++ b/addons/medical/functions/fnc_actionCheckResponse.sqf @@ -19,7 +19,7 @@ if ([_caller] call FUNC(isSetTreatmentMutex)) exitwith {}; _title = format["STR_ACE_CHECK_RESPONSE"]; _content = ["STR_ACE_CHECK_RESPONSE_CONTENT"]; -[_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); +[_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [2 + round(random(1)), @@ -38,14 +38,14 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; _title = format["STR_ACE_CHECK_RESPONSE"]; _content = [format[localize "STR_ACE_CHECK_REPONSE_YOU_CHECKED",[_target] call EFUNC(common,getName)],_output]; - [_caller, _title, _content] call EFUNC(gui,sendDisplayInformationTo); + [_caller, _title, _content] call EFUNC(common,sendDisplayInformationTo); [_target,"examine",_output] call FUNC(addToQuickViewLog); [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionDragUnit.sqf b/addons/medical/functions/fnc_actionDragUnit.sqf index d0fa1c70ea..d43b9a54dc 100644 --- a/addons/medical/functions/fnc_actionDragUnit.sqf +++ b/addons/medical/functions/fnc_actionDragUnit.sqf @@ -94,9 +94,9 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0), false] call FUNC(treatmentMutex); [(_this select 0), objNull,[0, 0, 0]] call EFUNC(common,carryObj); }, // on failure [_caller, _unit, _killOnDrop] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf index 30363453e2..4d747eb3b5 100644 --- a/addons/medical/functions/fnc_actionRemoveTourniquet.sqf +++ b/addons/medical/functions/fnc_actionRemoveTourniquet.sqf @@ -53,10 +53,10 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,false] call FUNC(treatmentMutex); }, // on success { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); [(_this select 0),false] call FUNC(treatmentMutex); }, // on failure [_caller, _target, _selectionName] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); diff --git a/addons/medical/functions/fnc_handleHeal.sqf b/addons/medical/functions/fnc_handleHeal.sqf index 04e17a5d4c..ffd910116b 100644 --- a/addons/medical/functions/fnc_handleHeal.sqf +++ b/addons/medical/functions/fnc_handleHeal.sqf @@ -19,7 +19,7 @@ if (!(isPlayer _healer) && GVAR(setting_allowAIFullHeal) && !([_unit] call EFUNC [_unit, QGVAR(bandagedWounds),[[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0],[0,0,0]]] call EFUNC(common,setDefinedVariable); if (_unit != _healer) then { - [_unit,"STR_ACE_BANDAGED","STR_ACE_IS_BANDAGING_YOU", 0, [[_healer] call EFUNC(common,getName)]] call EFUNC(gui,sendDisplayMessageTo); + [_unit,"STR_ACE_BANDAGED","STR_ACE_IS_BANDAGING_YOU", 0, [[_healer] call EFUNC(common,getName)]] call EFUNC(common,sendDisplayMessageTo); }; [_unit,"treatment",format["%1 has patched up the patient",[_healer] call EFUNC(common,getName)]] call FUNC(addActivityToLog); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf index a140f74f6b..8d468aa60a 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_AirwayLocal.sqf @@ -19,7 +19,7 @@ _removeItem = _this select 3; if (!local _target) exitwith{}; -[_target,"STR_ACE_AIRWAY","STR_ACE_IS_TREATING_YOUR_AIRWAY",0, [([_caller] call EFUNC(common,getName))]] call EFUNC(gui,sendDisplayMessageTo); +[_target,"STR_ACE_AIRWAY","STR_ACE_IS_TREATING_YOUR_AIRWAY",0, [([_caller] call EFUNC(common,getName))]] call EFUNC(common,sendDisplayMessageTo); [_target,_removeItem] call FUNC(addToTriageList); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf index c6a09fa4de..e39f12596e 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_BandageLocal.sqf @@ -24,7 +24,7 @@ if (!local _target) exitwith{ }; if (_caller != _target) then { - [_target,"STR_ACE_BANDAGING", "STR_ACE_IS_BANDAGING_YOU", 0, [[_treatingPerson] call EFUNC(common,getName)]] call EFUNC(gui,sendDisplayMessageTo); + [_target,"STR_ACE_BANDAGING", "STR_ACE_IS_BANDAGING_YOU", 0, [[_treatingPerson] call EFUNC(common,getName)]] call EFUNC(common,sendDisplayMessageTo); }; [_target,_removeItem] call FUNC(addToTriageList); diff --git a/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf b/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf index 61e12687a7..eea3b459ee 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_CPR.sqf @@ -56,7 +56,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -66,6 +66,6 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf b/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf index a6e9156966..69e8848acf 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_Stitching.sqf @@ -23,7 +23,7 @@ _selectionName = _this select 2; _removeItem = _this select 3; _prevAnim = _this select 4; -[_caller,"STR_ACE_STITCHING","STR_ACE_START_STITCHING_INJURIES", 0, [[_injuredPerson] call EFUNC(common,getName),_selectionName]] call EFUNC(gui,sendDisplayMessageTo); +[_caller,"STR_ACE_STITCHING","STR_ACE_START_STITCHING_INJURIES", 0, [[_injuredPerson] call EFUNC(common,getName),_selectionName]] call EFUNC(common,sendDisplayMessageTo); _bandagedWounds = [_injuredPerson,QGVAR(bandagedWounds)] call EFUNC(common,getDefinedVariable); _bodyPartN = [_selectionName] call FUNC(getBodyPartNumber); @@ -46,12 +46,12 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; _prevAnim = _args select 4; if ((vehicle _caller != _caller) || ((getPos _caller) distance (_caller getvariable GVAR(ORIGINAL_POSITION_PLAYER))) >= 1) then { - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_Stitching", [_caller, _target, _selectionName, _removeItem, false]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; @@ -83,7 +83,7 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_Stitching", [_caller, _target, _selectionName, _removeItem, true]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; @@ -99,6 +99,6 @@ _caller setvariable [QGVAR(lastStichPerformed), diag_tickTime]; {}, // on success {}, // on failure [_caller] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf index 53f82f74f0..d48ac82e1a 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_fullHeal.sqf @@ -42,7 +42,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_FullHeal", [_caller, _target, _selectionName, _removeItem, true]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on success @@ -54,18 +54,18 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; _removeItem = _this select 3; _prevAnim = _this select 4; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); }; - [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); ["Medical_handleTreatment_FullHeal", [_caller, _target, _selectionName, _removeItem, false]] call ace_common_fnc_localEvent; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); if (!(_unit getvariable [QEGVAR(common,isDead),false]) && alive _unit) then { diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf index 2189a57a29..e74f86c438 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Advanced.sqf @@ -31,7 +31,7 @@ if (vehicle _caller == _caller && (vehicle _target == _target) && !(stance _call if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_advanced_treatment.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; _isHandled = switch (_removeItem) do { @@ -77,7 +77,7 @@ _isHandled = switch (_removeItem) do { _selectionName = _this select 2; _removeItem = _this select 3; _prevAnim = _this select 4; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -87,7 +87,7 @@ _isHandled = switch (_removeItem) do { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments - ] call EFUNC(gui,loadingBar); + ] call EFUNC(common,loadingBar); true; }; }; diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf index 3456e6df18..0c6d2b0f65 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Airway.sqf @@ -31,7 +31,7 @@ if (_part == 0 || _part == 1) exitwith { if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_airway_management.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\icon_airway_management.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -57,7 +57,7 @@ if (_part == 0 || _part == 1) exitwith { }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -67,7 +67,7 @@ if (_part == 0 || _part == 1) exitwith { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments - ] call EFUNC(gui,loadingBar); + ] call EFUNC(common,loadingBar); true; }; // TODO display message to caller diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf index c1113166f5..64239d7a83 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Bandaging.sqf @@ -39,11 +39,11 @@ if (ACE_player == _caller) then { }; default { - [_caller, "STR_ACE_BANDAGING", "STR_ACE_APPLY_BANDAGE", 0, [[_target] call EFUNC(common,getName), _selectionName]] call EFUNC(gui,sendDisplayMessageTo); + [_caller, "STR_ACE_BANDAGING", "STR_ACE_APPLY_BANDAGE", 0, [[_target] call EFUNC(common,getName), _selectionName]] call EFUNC(common,sendDisplayMessageTo); }; }; // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\bandage_fracture_small.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\bandage_fracture_small.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -83,7 +83,7 @@ if (isnil QGVAR(setting_bandageWaitingTime)) then { }, // on success { private ["_caller","_target","_selectedData", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -92,6 +92,6 @@ if (isnil QGVAR(setting_bandageWaitingTime)) then { ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf b/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf index f57ab20783..980c478226 100644 --- a/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Category_Medication.sqf @@ -28,7 +28,7 @@ if (vehicle _caller == _caller && (vehicle _target == _target) && !(stance _call if (ACE_player == _caller) then { // Displaying the treatment icon action - [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\medication_small.paa)), [1,1,1,1]] call EFUNC(gui,displayIcon); + [QGVAR(treatmentIconID), true, QUOTE(PATHTOF(data\icons\medication_small.paa)), [1,1,1,1]] call EFUNC(common,displayIcon); }; // Get the current position for the treatment person @@ -54,7 +54,7 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; }, // on success { private ["_caller","_target", "_selectionName", "_prevAnim"]; - [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(gui,sendDisplayInformationTo); + [(_this select 0), "STR_ACE_CANCELED", ["STR_ACE_ACTION_CANCELED","STR_ACE_YOU_MOVED_AWAY"]] call EFUNC(common,sendDisplayInformationTo); if (_prevAnim != "") then { [_caller,_prevAnim, 0] call EFUNC(common,doAnimation); @@ -64,6 +64,6 @@ _caller setvariable [QGVAR(StartingPositionHandleTreatment), getPos _caller]; ["Medical_treatmentCompleted", [_caller, _target, _selectionName, _removeItem]] call ace_common_fnc_localEvent; }, // on failure [_caller, _target, _selectionName, _removeItem, _prevAnim] // arguments -] call EFUNC(gui,loadingBar); +] call EFUNC(common,loadingBar); true; diff --git a/addons/medical/functions/fnc_initalizeModuleCMS.sqf b/addons/medical/functions/fnc_initalizeModuleCMS.sqf index 40e50c6fb0..79d9f8083d 100644 --- a/addons/medical/functions/fnc_initalizeModuleCMS.sqf +++ b/addons/medical/functions/fnc_initalizeModuleCMS.sqf @@ -46,7 +46,7 @@ if (GVAR(setting_AdvancedLevel) == -1) exitwith{}; GVAR(isEnabled) = true; -waituntil{!isnil "ACE_gui" && !isnil "ACE_common"}; +waituntil{!isnil "ACE_common"}; if (GVAR(setting_AdvancedLevel) > 0) then { diff --git a/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf b/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf index f26cfd9ffc..7ffeea2002 100644 --- a/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf +++ b/addons/medical/functions/fnc_moduleAssignMedicalEquipment.sqf @@ -21,7 +21,6 @@ private ["_logic","_setting","_objects", "_medicsLoadout", "_nonMedics", "_code" _logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; if (!isNull _logic) then { _setting = _logic getvariable ["equipment",0]; - waituntil {!isnil "ACE_gui"}; // ensure the player unit is available. waituntil {time>0}; _start = diag_tickTime; diff --git a/addons/medical/functions/fnc_onTreatmentCompleted.sqf b/addons/medical/functions/fnc_onTreatmentCompleted.sqf index 4505575f00..146e55c3b1 100644 --- a/addons/medical/functions/fnc_onTreatmentCompleted.sqf +++ b/addons/medical/functions/fnc_onTreatmentCompleted.sqf @@ -23,4 +23,4 @@ if (primaryWeapon _caller == "ACE_FakePrimaryWeapon") then { [_caller,false] call FUNC(treatmentMutex); // TODO: BUG: if AI finishes treatment, it will also hide the icon for the player -[QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(gui,displayIcon); +[QGVAR(treatmentIconID), false, "", [1,1,1,1]] call EFUNC(common,displayIcon); diff --git a/addons/medical/ui/define.hpp b/addons/medical/ui/define.hpp index 3af837e4f1..be45e0ff90 100644 --- a/addons/medical/ui/define.hpp +++ b/addons/medical/ui/define.hpp @@ -1 +1 @@ -#include "\z\ace\addons\gui\UI\define.hpp" \ No newline at end of file +#include "\z\ace\addons\common\define.hpp" \ No newline at end of file diff --git a/addons/medical/ui/menu.hpp b/addons/medical/ui/menu.hpp index f65b5ab807..db7266d0e7 100644 --- a/addons/medical/ui/menu.hpp +++ b/addons/medical/ui/menu.hpp @@ -1,8 +1,8 @@ class GVAR(medicalMenu) { idd = 314412; movingEnable = true; - onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [ARR_2(QUOTE(QGVAR(id)), true)] call EFUNC(gui,blurScreen); [_this select 0] call FUNC(onMenuOpen);); - onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(gui,blurScreen); [ARR_2(QUOTE(QGVAR(onMenuOpen)), 'onEachFrame')] call BIS_fnc_removeStackedEventHandler;); + onLoad = QUOTE(uiNamespace setVariable [ARR_2(QUOTE(QGVAR(medicalMenu)), _this select 0)]; [ARR_2(QUOTE(QGVAR(id)), true)] call EFUNC(common,blurScreen); [_this select 0] call FUNC(onMenuOpen);); + onUnload = QUOTE([ARR_2(QUOTE(QGVAR(id)), false)] call EFUNC(common,blurScreen); [ARR_2(QUOTE(QGVAR(onMenuOpen)), 'onEachFrame')] call BIS_fnc_removeStackedEventHandler;); class controlsBackground { class HeaderBackground: ACE_gui_backgroundBase{ idc = -1; From 13c21275744977da578b973f0a2c393b6cc85f69 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:29:07 +0100 Subject: [PATCH 06/62] Clean up of old CSE code Removed all _F suffixes Reorganized the RPEP list. Removed unnecessary functions. --- addons/common/CfgEventHandlers.hpp | 2 +- addons/common/XEH_preInit.sqf | 131 ++++++++---------- .../functions/fnc_broadcastSound3D_f.sqf | 16 --- .../functions/fnc_closeAllDialogs_f.sqf | 14 -- ...{fnc_disableAI_f.sqf => fnc_disableAI.sqf} | 0 addons/common/functions/fnc_dropWeapon_f.sqf | 39 ------ addons/common/functions/fnc_findItem.sqf | 25 ---- addons/common/functions/fnc_findMagazine.sqf | 21 --- .../common/functions/fnc_getCanInteract.sqf | 12 -- .../functions/fnc_getCustomResults_f.sqf | 45 ------ .../common/functions/fnc_getWeaponItems_f.sqf | 14 -- .../{fnc_inWater_f.sqf => fnc_inWater.sqf} | 0 addons/common/functions/fnc_isHC.sqf | 24 ---- ..._isModLoaded_f.sqf => fnc_isModLoaded.sqf} | 0 ...nc_loadPerson_f.sqf => fnc_loadPerson.sqf} | 6 +- ...sonLocal_f.sqf => fnc_loadPersonLocal.sqf} | 6 +- .../common/functions/fnc_moveToTempGroup.sqf | 6 +- ...efaults_f.sqf => fnc_resetAllDefaults.sqf} | 10 +- .../common/functions/fnc_revealObject_f.sqf | 15 -- ..._sendRequest_f.sqf => fnc_sendRequest.sqf} | 0 .../fnc_setDisableUserInputStatus.sqf | 10 +- ...{fnc_setVolume_f.sqf => fnc_setVolume.sqf} | 0 ...upSide_f.sqf => fnc_switchToGroupSide.sqf} | 6 +- ...nloadPerson_f.sqf => fnc_unloadPerson.sqf} | 8 +- addons/medical/XEH_postInit.sqf | 4 +- addons/medical/XEH_preInit.sqf | 4 +- .../medical/functions/fnc_actionCarryUnit.sqf | 2 +- .../medical/functions/fnc_actionDragUnit.sqf | 2 +- .../medical/functions/fnc_actionLoadUnit.sqf | 2 +- .../functions/fnc_actionPlaceInBodyBag.sqf | 2 +- .../functions/fnc_actionUnloadUnit.sqf | 2 +- ...OfBody_f.sqf => fnc_cleanUpCopyOfBody.sqf} | 6 +- .../functions/fnc_getBloodVolumeChange.sqf | 2 +- .../functions/fnc_getUnconsciousCondition.sqf | 6 +- .../medical/functions/fnc_handleDropUnit.sqf | 2 +- ...c_handleTreatment_Action_fullHealLocal.sqf | 2 +- .../functions/fnc_handleUnitVitals.sqf | 2 +- ...opyOfBody_f.sqf => fnc_makeCopyOfBody.sqf} | 0 .../functions/fnc_moduleBasicRevive.sqf | 8 +- addons/medical/functions/fnc_onKilled.sqf | 4 +- .../functions/fnc_onStartMovingUnit.sqf | 2 +- .../fnc_registerUnconsciousCondition.sqf | 6 +- addons/medical/functions/fnc_setDead.sqf | 16 +-- .../functions/fnc_setUnconsciousState.sqf | 14 +- 44 files changed, 129 insertions(+), 369 deletions(-) delete mode 100644 addons/common/functions/fnc_broadcastSound3D_f.sqf delete mode 100644 addons/common/functions/fnc_closeAllDialogs_f.sqf rename addons/common/functions/{fnc_disableAI_f.sqf => fnc_disableAI.sqf} (100%) delete mode 100644 addons/common/functions/fnc_dropWeapon_f.sqf delete mode 100644 addons/common/functions/fnc_findItem.sqf delete mode 100644 addons/common/functions/fnc_findMagazine.sqf delete mode 100644 addons/common/functions/fnc_getCanInteract.sqf delete mode 100644 addons/common/functions/fnc_getCustomResults_f.sqf delete mode 100644 addons/common/functions/fnc_getWeaponItems_f.sqf rename addons/common/functions/{fnc_inWater_f.sqf => fnc_inWater.sqf} (100%) delete mode 100644 addons/common/functions/fnc_isHC.sqf rename addons/common/functions/{fnc_isModLoaded_f.sqf => fnc_isModLoaded.sqf} (100%) rename addons/common/functions/{fnc_loadPerson_f.sqf => fnc_loadPerson.sqf} (86%) rename addons/common/functions/{fnc_loadPersonLocal_f.sqf => fnc_loadPersonLocal.sqf} (83%) rename addons/common/functions/{fnc_resetAllDefaults_f.sqf => fnc_resetAllDefaults.sqf} (74%) delete mode 100644 addons/common/functions/fnc_revealObject_f.sqf rename addons/common/functions/{fnc_sendRequest_f.sqf => fnc_sendRequest.sqf} (100%) rename addons/common/functions/{fnc_setVolume_f.sqf => fnc_setVolume.sqf} (100%) rename addons/common/functions/{fnc_switchToGroupSide_f.sqf => fnc_switchToGroupSide.sqf} (92%) rename addons/common/functions/{fnc_unloadPerson_f.sqf => fnc_unloadPerson.sqf} (89%) rename addons/medical/functions/{fnc_cleanUpCopyOfBody_f.sqf => fnc_cleanUpCopyOfBody.sqf} (76%) rename addons/medical/functions/{fnc_makeCopyOfBody_f.sqf => fnc_makeCopyOfBody.sqf} (100%) diff --git a/addons/common/CfgEventHandlers.hpp b/addons/common/CfgEventHandlers.hpp index b9c5d7e4ce..522df03d4f 100644 --- a/addons/common/CfgEventHandlers.hpp +++ b/addons/common/CfgEventHandlers.hpp @@ -38,7 +38,7 @@ class Extended_Respawn_EventHandlers { respawn = QUOTE(_this call FUNC(setName)); }; class GVAR(RESETDefaults) { - respawn = QUOTE(_this call FUNC(resetAllDefaults_F)); + respawn = QUOTE(_this call FUNC(resetAllDefaults)); }; }; }; diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 64a06a0f8c..7a70ae7bb3 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -15,12 +15,16 @@ PREP(addSetting); PREP(adminKick); PREP(ambientBrightness); PREP(applyForceWalkStatus); +PREP(beingCarried); PREP(binarizeNumber); PREP(callCustomEventHandlers); PREP(callCustomEventHandlersGlobal); PREP(canGetInPosition); +PREP(canInteract); PREP(canInteractWith); PREP(canUseWeapon); +PREP(carriedByObj); +PREP(carryObj); PREP(changeProjectileDirection); PREP(checkPBOs); PREP(claim); @@ -30,6 +34,10 @@ PREP(codeToString); PREP(convertKeyCode); PREP(createOrthonormalReference); PREP(currentChannel); +PREP(debug); +PREP(debugModule); +PREP(defineVariable); +PREP(disableAI); PREP(disableUserInput); PREP(displayText); PREP(displayTextPicture); @@ -42,12 +50,21 @@ PREP(execRemoteFnc); PREP(executePersistent); PREP(filter); PREP(fixLoweredRifleAnimation); +PREP(getAllDefinedSetVariables); PREP(getAllGear); PREP(getCaptivityStatus); +PREP(getCarriedBy); +PREP(getCarriedObj); PREP(getConfigCommander); PREP(getConfigGunner); +PREP(getDeathAnim); PREP(getDefaultAnim); +PREP(getDefinedVariable); +PREP(getDefinedVariableDefault); +PREP(getDefinedVariableInfo); PREP(getDoorTurrets); +PREP(getFirstObjectIntersection); +PREP(getFirstTerrainIntersection); PREP(getForceWalkStatus); PREP(getGunner); PREP(getHitPoints); @@ -56,6 +73,7 @@ PREP(getInPosition); PREP(getMarkerType); PREP(getName); PREP(getNumberFromMissionSQM); +PREP(getNumberMagazinesIn); PREP(getPitchBankYaw); PREP(getSettingData); PREP(getStringFromMissionSQM); @@ -74,29 +92,44 @@ PREP(getUavControlPosition); PREP(getVehicleCargo); PREP(getVehicleCodriver); PREP(getVehicleCrew); +PREP(getVersion); PREP(getWeaponAzimuthAndInclination); PREP(getWeaponIndex); PREP(getWeaponType); PREP(getWindDirection); PREP(goKneeling); PREP(hadamardProduct); +PREP(hasItem); +PREP(hasMagazine); +PREP(inheritsFrom); +PREP(insertionSort); PREP(interpolateFromArray); PREP(inTransitionAnim); +PREP(inWater); +PREP(isArrested); PREP(isAutoWind); +PREP(isAwake); PREP(isEngineer); PREP(isEOD); +PREP(isHC); PREP(isInBuilding); +PREP(isModLoaded); PREP(isPlayer); PREP(isTurnedOut); PREP(letterToCode); +PREP(limitMovementSpeed); +PREP(loadPerson); +PREP(loadPersonLocal); PREP(loadSettingsFromProfile); PREP(loadSettingsOnServer); PREP(map); PREP(moduleCheckPBOs); PREP(moduleLSDVehicles); +PREP(moveToTempGroup); PREP(muteUnit); PREP(numberToDigits); PREP(numberToDigitsString); +PREP(onAnswerRequest); PREP(onLoadRscDisplayChannel); PREP(owned); PREP(player); @@ -104,33 +137,53 @@ PREP(playerSide); PREP(progressBar); PREP(queueAnimation); PREP(readSettingFromModule); +PREP(receiveRequest); PREP(removeActionEventHandler); PREP(removeActionMenuEventHandler); PREP(removeCameraEventHandler); PREP(removeCustomEventHandler); PREP(removeMapMarkerCreatedEventHandler); PREP(removeScrollWheelEventHandler); +PREP(requestCallback); +PREP(resetAllDefaults); PREP(restoreVariablesJIP); PREP(revertKeyCodeLocalized); PREP(sanitizeString); +PREP(sendRequest); PREP(serverLog); +PREP(setArrestState); +PREP(setCanInteract); PREP(setCaptivityStatus); +PREP(setCarriedBy); +PREP(setDefinedVariable); +PREP(setDisableUserInputStatus); PREP(setForceWalkStatus); +PREP(setHearingCapability); PREP(setName); PREP(setParameter); PREP(setPitchBankYaw); -PREP(setVariableJIP); -PREP(setVariablePublic); +PREP(setProne); PREP(setSetting); PREP(setSettingFromConfig); +PREP(setVariableJIP); +PREP(setVariablePublic); +PREP(setVolume); +PREP(sortAlphabeticallyBy); +PREP(stringCompare); PREP(stringToColoredText); +PREP(string_removeWhiteSpace); PREP(subString); +PREP(switchToGroupSide); +PREP(throttledPublicVariable); PREP(toBin); PREP(toBitmask); PREP(toHex); PREP(toNumber); -PREP(throttledPublicVariable); +PREP(uniqueElementsOnly); +PREP(unloadPerson); PREP(unmuteUnit); +PREP(useItem); +PREP(useMagazine); PREP(waitAndExecute); // ACE_Debug @@ -195,74 +248,6 @@ if (hasInterface) then { }, 0, []] call cba_fnc_addPerFrameHandler; }; -PREP(stringCompare); -PREP(string_removeWhiteSpace); -PREP(isHC); -PREP(sendRequest_f); -PREP(requestCallback); -PREP(receiveRequest); -PREP(onAnswerRequest); -PREP(debug); -PREP(debugModule); -PREP(defineVariable); -PREP(setDefinedVariable); -PREP(getDefinedVariable); -PREP(getAllDefinedSetVariables); -PREP(getDefinedVariableInfo); -PREP(getDefinedVariableDefault); -PREP(getDeathAnim); -PREP(insertionSort); -PREP(uniqueElementsOnly); -PREP(sortAlphabeticallyBy); -PREP(hasMagazine); -PREP(useMagazine); -PREP(findMagazine); -PREP(hasItem); -PREP(useItem); -PREP(findItem); -PREP(getNumberMagazinesIn); -PREP(setCanInteract); -PREP(getCanInteract); -PREP(canInteract); -PREP(resetAllDefaults_f); -PREP(broadcastSound3D_f); - -PREP(isAwake); -PREP(setProne); - -PREP(setDisableUserInputStatus); - -PREP(dropWeapon_f); -PREP(inWater_f); -PREP(setVolume_f); -PREP(closeAllDialogs_f); -PREP(disableAI_f); -PREP(switchToGroupSide_f); -PREP(getFirstObjectIntersection); -PREP(getFirstTerrainIntersection); -PREP(setHearingCapability); -PREP(revealObject_f); -PREP(getWeaponItems_f); -PREP(isModLoaded_f); -PREP(inheritsFrom); -PREP(getVersion); -PREP(carryObj); -PREP(carriedByObj); -PREP(getCarriedObj); -PREP(getCarriedBy); -PREP(beingCarried); -PREP(setCarriedBy); - - -PREP(moveToTempGroup); - - -PREP(limitMovementSpeed); -PREP(setArrestState); -PREP(isArrested); -PREP(loadPerson_F); -PREP(loadPersonLocal_F); -PREP(unloadPerson_F); - - ADDON = true; + +isHC = !(hasInterface || isDedicated); diff --git a/addons/common/functions/fnc_broadcastSound3D_f.sqf b/addons/common/functions/fnc_broadcastSound3D_f.sqf deleted file mode 100644 index 93f95bb431..0000000000 --- a/addons/common/functions/fnc_broadcastSound3D_f.sqf +++ /dev/null @@ -1,16 +0,0 @@ -/** - * fn_broadcastSound3D_f.sqf - * @Descr: Plays a sound in 3D - * @Author: Glowbal - * - * @Arguments: [unit OBJECT, sound STRING] - * @Return: void - * @PublicAPI: true - */ - -#include "script_component.hpp" - -if (isDedicated) exitwith{}; -_unit = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; -_sound = [_this, 1, "",[""]] call BIS_fnc_Param; -_unit say3D _sound; \ No newline at end of file diff --git a/addons/common/functions/fnc_closeAllDialogs_f.sqf b/addons/common/functions/fnc_closeAllDialogs_f.sqf deleted file mode 100644 index b5ce1bc280..0000000000 --- a/addons/common/functions/fnc_closeAllDialogs_f.sqf +++ /dev/null @@ -1,14 +0,0 @@ -/** - * fn_closeAllDialogs_f.sqf - * @Descr: Close all dialogs - * @Author: Glowbal - * - * @Arguments: [] - * @Return: void - * @PublicAPI: true - */ -#include "script_component.hpp" - -while {dialog} do { - closeDialog 0; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_disableAI_f.sqf b/addons/common/functions/fnc_disableAI.sqf similarity index 100% rename from addons/common/functions/fnc_disableAI_f.sqf rename to addons/common/functions/fnc_disableAI.sqf diff --git a/addons/common/functions/fnc_dropWeapon_f.sqf b/addons/common/functions/fnc_dropWeapon_f.sqf deleted file mode 100644 index bf1358b5e7..0000000000 --- a/addons/common/functions/fnc_dropWeapon_f.sqf +++ /dev/null @@ -1,39 +0,0 @@ -/** - * fn_dropWeapon_f.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" -private ["_unit","_currentWeapon","_currentAnimation", "_WeaponHolder"]; -_unit = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; - -_currentWeapon = currentWeapon _unit; -_currentAnimation = animationState _unit; -_WeaponHolder = "GroundWeaponHolder" createVehicle position _unit; - -_unit removeWeapon _currentWeapon; -_weaponHolder addWeaponCargoGlobal [_currentWeapon, 1]; -//_unit action [ "DropWeapon", _WeaponHolder, _currentWeapon ]; -_WeaponHolder setPos (getPos _unit); -//_unit switchMove _currentAnimation; - -_primairyWeapon = primaryWeapon _unit; -_secondairyWeapon = secondaryWeapon _unit; -_handGunWeapon = handgunWeapon _unit; - -switch (_currentWeapon) do { - case _primairyWeapon: { - - }; - case _secondairyWeapon: { - - }; - case _handGunWeapon: { - - }; - default {}; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_findItem.sqf b/addons/common/functions/fnc_findItem.sqf deleted file mode 100644 index 5c4469ea7f..0000000000 --- a/addons/common/functions/fnc_findItem.sqf +++ /dev/null @@ -1,25 +0,0 @@ -/** - * fn_findItem.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - */ -#include "script_component.hpp" -private ["_unit","_magazine","_return"]; -_unit = _this select 0; -_item = _this select 1; - -if (_item in (uniformItems _unit)) exitwith {1}; -if (_item in (vestItems _unit)) exitwith {2}; -if (_item in (backpackItems _unit)) exitwith {3}; -if (_item in (assignedItems _unit)) exitwith {4}; -if (_item in (primaryWeaponItems _unit)) exitwith {5}; -if (_item in (secondaryWeaponItems _unit)) exitwith {6}; -if (_item in (handgunItems _unit)) exitwith {7}; -if (_item in (items _unit)) exitwith {8}; // in case it is in items but cannot be found in any other container (should never reach this) - -// If we cannot find the item, return 0. -0; \ No newline at end of file diff --git a/addons/common/functions/fnc_findMagazine.sqf b/addons/common/functions/fnc_findMagazine.sqf deleted file mode 100644 index 549d016e8d..0000000000 --- a/addons/common/functions/fnc_findMagazine.sqf +++ /dev/null @@ -1,21 +0,0 @@ -/** - * fn_findMagazine.sqf - * @Descr: Find where the current magazines are. Order: uniform, vest, backpack, any. - * @Author: Glowbal - * - * @Arguments: [unit OBJECT, magazine STRING (Classname of magazine)] - * @Return: NUMBER 0 = none, 1 = in uniform, 2 = in vest, 3 = in backpack, 4 = found outside container - * @PublicAPI: true - */ -#include "script_component.hpp" -private ["_unit","_magazine"]; -_unit = _this select 0; -_magazine = _this select 1; - -if (_magazine in (getMagazineCargo uniformContainer _unit)) exitwith {1}; -if (_magazine in (getMagazineCargo vestContainer _unit)) exitwith {2}; -if (_magazine in (getMagazineCargo backpackContainer _unit)) exitwith {3}; -if (_magazine in (magazines _unit)) exitwith {4}; // in case it cannot be found in any other container. Most likely loaded in a weapon. - -// If we cannot find the item, return 0. -0; \ No newline at end of file diff --git a/addons/common/functions/fnc_getCanInteract.sqf b/addons/common/functions/fnc_getCanInteract.sqf deleted file mode 100644 index 87f572b93d..0000000000 --- a/addons/common/functions/fnc_getCanInteract.sqf +++ /dev/null @@ -1,12 +0,0 @@ -/** - * fn_getCanInteract.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" - -((_this select 0) getvariable [QGVAR(canInteract),0]) \ No newline at end of file diff --git a/addons/common/functions/fnc_getCustomResults_f.sqf b/addons/common/functions/fnc_getCustomResults_f.sqf deleted file mode 100644 index 4b68f85c9c..0000000000 --- a/addons/common/functions/fnc_getCustomResults_f.sqf +++ /dev/null @@ -1,45 +0,0 @@ -/** - * fn_getCustomResults_f.sqf - * @Descr: Executes custom results eventhandlers, collects their output and returns this. - * @Author: Glowbal - * - * @Arguments: [arguments ANY, handle STRING] - * @Return: ARRAY Collection of all return values of all executed CustomResult handlers - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_arguments","_handle","_ehCfg","_eventHandlerCollection","_eventHandlerName","_cfg","_code","_classType", "_return"]; -_arguments = _this select 0; -_handle = _this select 1; - -_eventHandlerName = ("ace_f_custom_results_eventhandler_" + _handle); -_eventHandlerCollection = missionNamespace getvariable _eventHandlerName; -if (isnil "_eventHandlerCollection") then { - _eventHandlerCollection = []; - - // TODO Get a replacement for this - _cfg = (ConfigFile >> "Advanced_Combat_Environment" >> "CustomResults" >> _handle); - if (isClass _cfg) then { - _numberOfEH = count _cfg; - for [{_EHiterator=0}, {(_EHiterator< _numberOfEH)}, {_EHiterator=_EHiterator+1}] do { - _ehCfg = _cfg select _EHiterator; - if (isClass _ehCfg) then { - _classType = (ConfigName _ehCfg); - _code = (compile getText(_ehCfg >> "onCall")); - _eventHandlerCollection pushback [_classType, _code]; - true; - }; - }; - }; - missionNamespace setvariable [_eventHandlerName, _eventHandlerCollection]; -}; - -_return = []; -{ - _return pushback (_arguments call (_x select 1)); - false; -}count _eventHandlerCollection; - -_return diff --git a/addons/common/functions/fnc_getWeaponItems_f.sqf b/addons/common/functions/fnc_getWeaponItems_f.sqf deleted file mode 100644 index d18ce28a72..0000000000 --- a/addons/common/functions/fnc_getWeaponItems_f.sqf +++ /dev/null @@ -1,14 +0,0 @@ -/** - * fn_getWeaponItems_f.sqf - * @Descr: Get the weapon items from the unit. - * @Author: Glowbal - * - * @Arguments: [unit OBJECT] - * @Return: - * @PublicAPI: false - */ -#include "script_component.hpp" -private "_unit"; -_unit = _this select 0; - -[primaryWeaponItems _unit, secondaryWeaponItems _unit, handgunItems _unit]; \ No newline at end of file diff --git a/addons/common/functions/fnc_inWater_f.sqf b/addons/common/functions/fnc_inWater.sqf similarity index 100% rename from addons/common/functions/fnc_inWater_f.sqf rename to addons/common/functions/fnc_inWater.sqf diff --git a/addons/common/functions/fnc_isHC.sqf b/addons/common/functions/fnc_isHC.sqf deleted file mode 100644 index 82a9d49ba2..0000000000 --- a/addons/common/functions/fnc_isHC.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/** - * fn_isHC.sqf - * @Descr: Check if current locality is a headless client - * @Author: Glowbal - * - * @Arguments: [] - * @Return: BOOL True if locality is headless client OR is not in multiplayer - * @PublicAPI: true - */ - -#include "script_component.hpp" - -private ["_return"]; - -if (!isMultiplayer) then { - _return = true; -} else { - if (isServer && !isDedicated) then { - _return = true; - } else { - _return = !(hasInterface || isDedicated); - }; -}; -_return \ No newline at end of file diff --git a/addons/common/functions/fnc_isModLoaded_f.sqf b/addons/common/functions/fnc_isModLoaded.sqf similarity index 100% rename from addons/common/functions/fnc_isModLoaded_f.sqf rename to addons/common/functions/fnc_isModLoaded.sqf diff --git a/addons/common/functions/fnc_loadPerson_f.sqf b/addons/common/functions/fnc_loadPerson.sqf similarity index 86% rename from addons/common/functions/fnc_loadPerson_f.sqf rename to addons/common/functions/fnc_loadPerson.sqf index 5944879c62..0d2995db1b 100644 --- a/addons/common/functions/fnc_loadPerson_f.sqf +++ b/addons/common/functions/fnc_loadPerson.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson_F)) +#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) private ["_caller", "_unit","_vehicle", "_loadcar", "_loadhelicopter", "_loadtank"]; _caller = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; @@ -34,9 +34,9 @@ if (_unit distance _loadcar <= 10) then { }; }; if (!isNull _vehicle) then { - [_unit, true, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide_f); + [_unit, true, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide); [_caller,objNull] call FUNC(carryObj); [_unit,objNull] call FUNC(carryObj); - [[_unit, _vehicle,_caller], QUOTE(FUNC(loadPersonLocal_F)), _unit, false] call EFUNC(common,execRemoteFnc); + [[_unit, _vehicle,_caller], QUOTE(FUNC(loadPersonLocal)), _unit, false] call EFUNC(common,execRemoteFnc); }; _vehicle \ No newline at end of file diff --git a/addons/common/functions/fnc_loadPersonLocal_f.sqf b/addons/common/functions/fnc_loadPersonLocal.sqf similarity index 83% rename from addons/common/functions/fnc_loadPersonLocal_f.sqf rename to addons/common/functions/fnc_loadPersonLocal.sqf index dbba09111a..6e31050cf9 100644 --- a/addons/common/functions/fnc_loadPersonLocal_f.sqf +++ b/addons/common/functions/fnc_loadPersonLocal.sqf @@ -16,13 +16,13 @@ _vehicle = [_this, 1, ObjNull,[ObjNull]] call BIS_fnc_Param; _caller = [_this, 2, ObjNull,[ObjNull]] call BIS_fnc_Param; if (!alive _unit) then { - _unit = [_unit,_caller] call FUNC(makeCopyOfBody_F); + _unit = [_unit,_caller] call FUNC(makeCopyOfBody); }; _unit moveInCargo _vehicle; -_loaded = _vehicle getvariable [QGVAR(loaded_persons_F),[]]; +_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; _loaded pushback _unit; -_vehicle setvariable [QGVAR(loaded_persons_F),_loaded,true]; +_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; if (!([_unit] call FUNC(isAwake))) then { _handle = [_unit,_vehicle] spawn { private ["_unit","_vehicle"]; diff --git a/addons/common/functions/fnc_moveToTempGroup.sqf b/addons/common/functions/fnc_moveToTempGroup.sqf index b146e67ef3..802bc2285d 100644 --- a/addons/common/functions/fnc_moveToTempGroup.sqf +++ b/addons/common/functions/fnc_moveToTempGroup.sqf @@ -18,12 +18,12 @@ if (_moveTo) then { _previousGroup = group _unit; _newGroup = createGroup (side _previousGroup); [_unit] joinSilent _newGroup; - _unit setvariable [QGVAR(previousGroup_F),_previousGroup]; + _unit setvariable [QGVAR(previousGroup),_previousGroup]; } else { - _previousGroup = _unit getvariable QGVAR(previousGroup_F); + _previousGroup = _unit getvariable QGVAR(previousGroup); if (!isnil "_previousGroup") then { _currentGroup = group _unit; - _unit setvariable [QGVAR(previousGroup_F),nil]; + _unit setvariable [QGVAR(previousGroup),nil]; [_unit] joinSilent _previousGroup; if (count units _currentGroup == 0) then { deleteGroup _currentGroup; diff --git a/addons/common/functions/fnc_resetAllDefaults_f.sqf b/addons/common/functions/fnc_resetAllDefaults.sqf similarity index 74% rename from addons/common/functions/fnc_resetAllDefaults_f.sqf rename to addons/common/functions/fnc_resetAllDefaults.sqf index c415b5b32c..63e6764d01 100644 --- a/addons/common/functions/fnc_resetAllDefaults_f.sqf +++ b/addons/common/functions/fnc_resetAllDefaults.sqf @@ -17,17 +17,17 @@ _unit setvariable ["ACE_isDead",nil,true]; _unit setvariable ["ACE_isUnconscious", nil, true]; if (isPlayer _unit) then { - [true] call FUNC(setVolume_f); - [false] call FUNC(disableKeyInput_f); - if (["ace_medical"] call FUNC(isModLoader_f)) then { + [true] call FUNC(setVolume); + [false] call FUNC(disableKeyInput); + if (["ace_medical"] call FUNC(isModLoader)) then { [false] call EFUNC(medical,effectBlackOut); }; - if !(isnil QGVAR(DISABLE_USER_INPUT_COLLECTION_F)) then { + if !(isnil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { // clear all disable user input { [_X, false] call FUNC(setDisableUserInputStatus); - }foreach GVAR(DISABLE_USER_INPUT_COLLECTION_F); + }foreach GVAR(DISABLE_USER_INPUT_COLLECTION); }; }; diff --git a/addons/common/functions/fnc_revealObject_f.sqf b/addons/common/functions/fnc_revealObject_f.sqf deleted file mode 100644 index 9c5a34f59a..0000000000 --- a/addons/common/functions/fnc_revealObject_f.sqf +++ /dev/null @@ -1,15 +0,0 @@ -/** - * fnc_revealObject_f.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -if (hasInterface) then { - player reveal (_this select 0); -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_sendRequest_f.sqf b/addons/common/functions/fnc_sendRequest.sqf similarity index 100% rename from addons/common/functions/fnc_sendRequest_f.sqf rename to addons/common/functions/fnc_sendRequest.sqf diff --git a/addons/common/functions/fnc_setDisableUserInputStatus.sqf b/addons/common/functions/fnc_setDisableUserInputStatus.sqf index 2451cbe90f..2cf25b827a 100644 --- a/addons/common/functions/fnc_setDisableUserInputStatus.sqf +++ b/addons/common/functions/fnc_setDisableUserInputStatus.sqf @@ -13,16 +13,16 @@ _id = _this select 0; _disable = _this select 1; -if (isnil QGVAR(DISABLE_USER_INPUT_COLLECTION_F)) then { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) = []; +if (isnil QGVAR(DISABLE_USER_INPUT_COLLECTION)) then { + GVAR(DISABLE_USER_INPUT_COLLECTION) = []; }; if (_disable) then { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) pushback _id; + GVAR(DISABLE_USER_INPUT_COLLECTION) pushback _id; [true] call FUNC(disableUserInput); } else { - GVAR(DISABLE_USER_INPUT_COLLECTION_F) = GVAR(DISABLE_USER_INPUT_COLLECTION_F) - [_id]; - if (GVAR(DISABLE_USER_INPUT_COLLECTION_F) isEqualTo []) then { + GVAR(DISABLE_USER_INPUT_COLLECTION) = GVAR(DISABLE_USER_INPUT_COLLECTION) - [_id]; + if (GVAR(DISABLE_USER_INPUT_COLLECTION) isEqualTo []) then { [false] call FUNC(disableUserInput); }; }; \ No newline at end of file diff --git a/addons/common/functions/fnc_setVolume_f.sqf b/addons/common/functions/fnc_setVolume.sqf similarity index 100% rename from addons/common/functions/fnc_setVolume_f.sqf rename to addons/common/functions/fnc_setVolume.sqf diff --git a/addons/common/functions/fnc_switchToGroupSide_f.sqf b/addons/common/functions/fnc_switchToGroupSide.sqf similarity index 92% rename from addons/common/functions/fnc_switchToGroupSide_f.sqf rename to addons/common/functions/fnc_switchToGroupSide.sqf index 97b043adbe..528d32853c 100644 --- a/addons/common/functions/fnc_switchToGroupSide_f.sqf +++ b/addons/common/functions/fnc_switchToGroupSide.sqf @@ -16,7 +16,7 @@ _switch = [_this, 1, false,[false]] call BIS_fnc_Param; _id = [_this, 2, "", [""]] call BIS_fnc_Param; _side = [_this, 3, side _unit,[west]] call BIS_fnc_Param; -_previousGroupsList = _unit getvariable [QGVAR(previousGroupSwitchTo_F),[]]; +_previousGroupsList = _unit getvariable [QGVAR(previousGroupSwitchTo),[]]; if (_switch) then { // go forward _previousGroup = group _unit; @@ -30,7 +30,7 @@ if (_switch) then { [_unit] joinSilent _newGroup; _previousGroupsList pushback [_previousGroup, _originalSide, _id, true]; - _unit setvariable [QGVAR(previousGroupSwitchTo_F), _previousGroupsList, true]; + _unit setvariable [QGVAR(previousGroupSwitchTo), _previousGroupsList, true]; } else { // go one back { @@ -60,5 +60,5 @@ if (_switch) then { }foreach _previousGroupsList; _previousGroupsList = _previousGroupsList - [objNull]; reverse _previousGroupsList; // we have to reverse again, to ensure the list is in the right order. - _unit setvariable [QGVAR(previousGroupSwitchTo_F), _previousGroupsList, true]; + _unit setvariable [QGVAR(previousGroupSwitchTo), _previousGroupsList, true]; }; diff --git a/addons/common/functions/fnc_unloadPerson_f.sqf b/addons/common/functions/fnc_unloadPerson.sqf similarity index 89% rename from addons/common/functions/fnc_unloadPerson_f.sqf rename to addons/common/functions/fnc_unloadPerson.sqf index 1aaaee84a1..33c0e9c0c2 100644 --- a/addons/common/functions/fnc_unloadPerson_f.sqf +++ b/addons/common/functions/fnc_unloadPerson.sqf @@ -10,7 +10,7 @@ #include "script_component.hpp" -#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson_F)) +#define GROUP_SWITCH_ID QUOTE(FUNC(loadPerson)) private ["_caller", "_unit","_vehicle", "_loaded"]; _caller = [_this, 0, ObjNull,[ObjNull]] call BIS_fnc_Param; @@ -27,11 +27,11 @@ if (!alive _unit) then { _unit action ["Eject", vehicle _unit]; }; -[_unit, false, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide_f); +[_unit, false, GROUP_SWITCH_ID, side group _caller] call FUNC(switchToGroupSide); -_loaded = _vehicle getvariable [QGVAR(loaded_persons_F),[]]; +_loaded = _vehicle getvariable [QGVAR(loaded_persons),[]]; _loaded = _loaded - [_unit]; -_vehicle setvariable [QGVAR(loaded_persons_F),_loaded,true]; +_vehicle setvariable [QGVAR(loaded_persons),_loaded,true]; if (!([_unit] call FUNC(isAwake))) then { _handle = [_unit,_vehicle] spawn { diff --git a/addons/medical/XEH_postInit.sqf b/addons/medical/XEH_postInit.sqf index 062df32ddf..6f5c1b5978 100644 --- a/addons/medical/XEH_postInit.sqf +++ b/addons/medical/XEH_postInit.sqf @@ -50,8 +50,8 @@ call FUNC(handleDisplayEffects); ["onUnconscious", FUNC(onUnconscious)] call ace_common_fnc_addEventHandler; ["carryObjectDropped", FUNC(onCarryObjectDropped)] call ace_common_fnc_addEventHandler; -if (isNil QGVAR(ENABLE_REVIVE_F)) then { - GVAR(ENABLE_REVIVE_F) = 0; +if (isNil QGVAR(ENABLE_REVIVE)) then { + GVAR(ENABLE_REVIVE) = 0; }; diff --git a/addons/medical/XEH_preInit.sqf b/addons/medical/XEH_preInit.sqf index 57800cd5b7..144c877aeb 100644 --- a/addons/medical/XEH_preInit.sqf +++ b/addons/medical/XEH_preInit.sqf @@ -141,8 +141,8 @@ PREP(setUnconsciousState); PREP(isUnconscious); PREP(getUnconsciousCondition); PREP(registerUnconsciousCondition); -PREP(cleanUpCopyOfBody_F); -PREP(makeCopyOfBody_F); +PREP(cleanUpCopyOfBody); +PREP(makeCopyOfBody); PREP(canGoUnconsciousState); PREP(setDead); PREP(moduleBasicRevive); diff --git a/addons/medical/functions/fnc_actionCarryUnit.sqf b/addons/medical/functions/fnc_actionCarryUnit.sqf index d3cfb35aee..f717efb403 100644 --- a/addons/medical/functions/fnc_actionCarryUnit.sqf +++ b/addons/medical/functions/fnc_actionCarryUnit.sqf @@ -42,7 +42,7 @@ if (!alive _unit) exitwith { [_caller, false] call FUNC(treatmentMutex); [{ _this call FUNC(actionCarryUnit); - }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody_F)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); + }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); }; if !([_caller,_unit] call EFUNC(common,carryObj)) exitwith { diff --git a/addons/medical/functions/fnc_actionDragUnit.sqf b/addons/medical/functions/fnc_actionDragUnit.sqf index d0fa1c70ea..56f88ead9c 100644 --- a/addons/medical/functions/fnc_actionDragUnit.sqf +++ b/addons/medical/functions/fnc_actionDragUnit.sqf @@ -40,7 +40,7 @@ if (!alive _unit) exitwith { [_caller, false] call FUNC(treatmentMutex); [{ _this call FUNC(actionDragUnit); - }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody_F)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); + }, [_caller, ([_unit,_caller] call FUNC(makeCopyOfBody)), _killOnDrop], 0.25, 0.25] call EFUNC(common,waitAndExecute); }; if (primaryWeapon _caller == "") then { diff --git a/addons/medical/functions/fnc_actionLoadUnit.sqf b/addons/medical/functions/fnc_actionLoadUnit.sqf index cd20140bdb..afe70746d2 100644 --- a/addons/medical/functions/fnc_actionLoadUnit.sqf +++ b/addons/medical/functions/fnc_actionLoadUnit.sqf @@ -22,7 +22,7 @@ if ([_unit] call cse_fnc_isAwake) exitwith { [_caller,objNull] call cse_fnc_carryObj; [_unit,objNull] call cse_fnc_carryObj; -_vehicle = [_caller, _unit] call EFUNC(common,loadPerson_F); +_vehicle = [_caller, _unit] call EFUNC(common,loadPerson); if (!isNull _vehicle) then { if (!isnil QGVAR(DROP_ADDACTION)) then { _caller removeAction GVAR(DROP_ADDACTION); diff --git a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf index 8df95c24d9..fc43fe06d8 100644 --- a/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf +++ b/addons/medical/functions/fnc_actionPlaceInBodyBag.sqf @@ -36,7 +36,7 @@ _bodyBagCreated setvariable [QEGVAR(common,nameOfBody), _nameOfUnit, true]; // reset the position to ensure it is on the correct one. _bodyBagCreated setPos _onPosition; -[[_bodyBagCreated], QEFUNC(common,revealObject_f), true] call BIS_fnc_MP; +[[_bodyBagCreated], QEFUNC(common,revealObject), true] call BIS_fnc_MP; _bodyBagCreated setvariable [QEGVAR(logistics,enableDrag), true, true]; diff --git a/addons/medical/functions/fnc_actionUnloadUnit.sqf b/addons/medical/functions/fnc_actionUnloadUnit.sqf index 6eefb4b138..0b6b6fe9de 100644 --- a/addons/medical/functions/fnc_actionUnloadUnit.sqf +++ b/addons/medical/functions/fnc_actionUnloadUnit.sqf @@ -19,7 +19,7 @@ _drag = [_this, 2, false, [false]] call BIS_fnc_Param; if (vehicle _unit == _unit) exitwith {}; if (([_unit] call cse_fnc_isAwake)) exitwith {}; -if ([_caller, _unit] call EFUNC(common,unloadPerson_F)) then { +if ([_caller, _unit] call EFUNC(common,unloadPerson)) then { if (_drag) then { if ((vehicle _caller) == _caller) then { [[_caller,_unit], QUOTE(FUNC(actionDragUnit)), _caller, false] call BIS_fnc_MP; diff --git a/addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf b/addons/medical/functions/fnc_cleanUpCopyOfBody.sqf similarity index 76% rename from addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf rename to addons/medical/functions/fnc_cleanUpCopyOfBody.sqf index b20169e9f5..292f332f91 100644 --- a/addons/medical/functions/fnc_cleanUpCopyOfBody_f.sqf +++ b/addons/medical/functions/fnc_cleanUpCopyOfBody.sqf @@ -13,12 +13,12 @@ private ["_unit", "_copy"]; _unit = _this select 0; -_copy = _unit getvariable QGVAR(copyOfBody_f); +_copy = _unit getvariable QGVAR(copyOfBody); if (isnil "_copy") exitwith {false}; [format["Cleaning up a copy of Body: %1 %2", _unit, _copy]] call EFUNC(common,debug); // lets clean it up -_unit setvariable [QGVAR(originalCopy_f), nil, true]; -_unit setvariable [QGVAR(copyOfBody_f), nil, true]; +_unit setvariable [QGVAR(originalCopy), nil, true]; +_unit setvariable [QGVAR(copyOfBody), nil, true]; if (!isNull _copy) then { deleteVehicle _copy; }; diff --git a/addons/medical/functions/fnc_getBloodVolumeChange.sqf b/addons/medical/functions/fnc_getBloodVolumeChange.sqf index 69b240b1d7..cfec53e157 100644 --- a/addons/medical/functions/fnc_getBloodVolumeChange.sqf +++ b/addons/medical/functions/fnc_getBloodVolumeChange.sqf @@ -38,7 +38,7 @@ if (_bloodVolume < 100.0) then { _bloodVolumeChange = _bloodVolumeChange + BLOOD_CHANGE_PER_SECOND; _ivVolume = (_unit getvariable [QGVAR(salineIVVolume), 0]) + IV_CHANGE_PER_SECOND; _unit setvariable [QGVAR(salineIVVolume),_ivVolume]; - if ([QEGVAR(fieldRations,module)] call EFUNC(common,isModuleEnabled_F)) then { + if ([QEGVAR(fieldRations,module)] call EFUNC(common,isModuleEnabled)) then { if ([_unit] call EFUNC(fieldRations,canDrink)) then { _unit setvariable [QEGVAR(fieldRations,drinkStatus), (_unit getvariable [QEGVAR(fieldRations,drinkStatus), 100]) + 0.2]; }; diff --git a/addons/medical/functions/fnc_getUnconsciousCondition.sqf b/addons/medical/functions/fnc_getUnconsciousCondition.sqf index 097a5682ec..a322439742 100644 --- a/addons/medical/functions/fnc_getUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_getUnconsciousCondition.sqf @@ -13,8 +13,8 @@ private ["_unit","_return"]; _unit = _this select 0; -if (isnil QGVAR(unconsciousConditions_F)) then { - GVAR(unconsciousConditions_F) = []; +if (isnil QGVAR(unconsciousConditions)) then { + GVAR(unconsciousConditions) = []; }; _return = false; @@ -25,5 +25,5 @@ _return = false; }; }; if (_return) exitwith{}; -}foreach GVAR(unconsciousConditions_F); +}foreach GVAR(unconsciousConditions); _return \ No newline at end of file diff --git a/addons/medical/functions/fnc_handleDropUnit.sqf b/addons/medical/functions/fnc_handleDropUnit.sqf index c82fe8ce79..45e1268d30 100644 --- a/addons/medical/functions/fnc_handleDropUnit.sqf +++ b/addons/medical/functions/fnc_handleDropUnit.sqf @@ -26,7 +26,7 @@ if ((isNull ([_caller] call EFUNC(common,getCarriedObj))) || !([_caller] call EF _caller removeWeapon "ACE_FakePrimaryWeapon"; }; - [_target, false] call EFUNC(common,disableAI_f); + [_target, false] call EFUNC(common,disableAI); _caller setvariable[QGVAR(onStartMovingUnitParams), nil]; // handle the drag & carry administration diff --git a/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf b/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf index 1d08a00e23..414c5c4a28 100644 --- a/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf +++ b/addons/medical/functions/fnc_handleTreatment_Action_fullHealLocal.sqf @@ -56,7 +56,7 @@ if (alive _unit) exitwith { _unit setDamage 0; // Resetting potential revive state - [_unit,QEGVAR(common,ENABLE_REVIVE_SETDEAD_F), 0] call EFUNC(common,setDefinedVariable); + [_unit,QEGVAR(common,ENABLE_REVIVE_SETDEAD), 0] call EFUNC(common,setDefinedVariable); [_unit,QEGVAR(common,ENABLE_REVIVE_COUNTER), 0] call EFUNC(common,setDefinedVariable); diff --git a/addons/medical/functions/fnc_handleUnitVitals.sqf b/addons/medical/functions/fnc_handleUnitVitals.sqf index 7ced1ec393..cb2e77b342 100644 --- a/addons/medical/functions/fnc_handleUnitVitals.sqf +++ b/addons/medical/functions/fnc_handleUnitVitals.sqf @@ -93,7 +93,7 @@ if ((missionNamespace getvariable[QGVAR(setting_AdvancedLevel), 0]) > 0) exitwit // Check vitals for medical status // TODO check for in revive state instead of variable - if ((_unit getvariable[QEGVAR(common,ENABLE_REVIVE_SETDEAD_F),0]) == 0) then { + if ((_unit getvariable[QEGVAR(common,ENABLE_REVIVE_SETDEAD),0]) == 0) then { _bloodPressureL = _bloodPressure select 0; _bloodPressureH = _bloodPressure select 1; diff --git a/addons/medical/functions/fnc_makeCopyOfBody_f.sqf b/addons/medical/functions/fnc_makeCopyOfBody.sqf similarity index 100% rename from addons/medical/functions/fnc_makeCopyOfBody_f.sqf rename to addons/medical/functions/fnc_makeCopyOfBody.sqf diff --git a/addons/medical/functions/fnc_moduleBasicRevive.sqf b/addons/medical/functions/fnc_moduleBasicRevive.sqf index b02d873313..79da194024 100644 --- a/addons/medical/functions/fnc_moduleBasicRevive.sqf +++ b/addons/medical/functions/fnc_moduleBasicRevive.sqf @@ -15,10 +15,10 @@ _logic = _this select 0; GVAR(Module) = true; -[_logic, QGVAR(ENABLE_REVIVE_F), "enableFor" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(REVIVE_TIMER_MAX_F), "timer" ] call EFUNC(common,readSettingFromModule); -[_logic, QGVAR(REVIVE_NUMBER_MAX_F), "amountOf" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(ENABLE_REVIVE), "enableFor" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(REVIVE_TIMER_MAX), "timer" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(REVIVE_NUMBER_MAX), "amountOf" ] call EFUNC(common,readSettingFromModule); [ - {(((_this select 0) getvariable[QGVAR(ENABLE_REVIVE_SETDEAD_F),0]) > 0)} + {(((_this select 0) getvariable[QGVAR(ENABLE_REVIVE_SETDEAD),0]) > 0)} ] call FUNC(registerUnconsciousCondition); diff --git a/addons/medical/functions/fnc_onKilled.sqf b/addons/medical/functions/fnc_onKilled.sqf index e3609a57e5..2b8dd987b6 100644 --- a/addons/medical/functions/fnc_onKilled.sqf +++ b/addons/medical/functions/fnc_onKilled.sqf @@ -6,7 +6,7 @@ if (!local _unit) exitwith {}; [_unit, QGVAR(amountOfPain),0,true] call EFUNC(common,setDefinedVariable); [_unit, QGVAR(heartRate),0,true] call EFUNC(common,setDefinedVariable); [_unit, QGVAR(bloodPressure), [0,0],true] call EFUNC(common,setDefinedVariable); -if (_unit getvariable[QEGVAR(common,unconscious_non_captive_f),false]) then { +if (_unit getvariable[QEGVAR(common,unconscious_non_captive),false]) then { _unit setCaptive false; - _unit setvariable[QEGVAR(common,unconscious_non_captive_f),nil]; + _unit setvariable[QEGVAR(common,unconscious_non_captive),nil]; }; \ No newline at end of file diff --git a/addons/medical/functions/fnc_onStartMovingUnit.sqf b/addons/medical/functions/fnc_onStartMovingUnit.sqf index 7fe3dd8d65..84678d5379 100644 --- a/addons/medical/functions/fnc_onStartMovingUnit.sqf +++ b/addons/medical/functions/fnc_onStartMovingUnit.sqf @@ -20,6 +20,6 @@ _dragging = _this select 3; _caller setvariable[QGVAR(onStartMovingUnitParams), [_caller, _target, _killOnDrop, _dragging]]; -[_target, true] call EFUNC(common,disableAI_f); +[_target, true] call EFUNC(common,disableAI); nil; \ No newline at end of file diff --git a/addons/medical/functions/fnc_registerUnconsciousCondition.sqf b/addons/medical/functions/fnc_registerUnconsciousCondition.sqf index f34d05b57d..1e0413e8d6 100644 --- a/addons/medical/functions/fnc_registerUnconsciousCondition.sqf +++ b/addons/medical/functions/fnc_registerUnconsciousCondition.sqf @@ -10,13 +10,13 @@ #include "script_component.hpp" -if (isnil QGVAR(unconsciousConditions_F)) then { - GVAR(unconsciousConditions_F) = []; +if (isnil QGVAR(unconsciousConditions)) then { + GVAR(unconsciousConditions) = []; }; if (typeName _this == typeName []) then { { if (typeName _x == typeName {}) then { - GVAR(unconsciousConditions_F) pushback _x; + GVAR(unconsciousConditions) pushback _x; }; }foreach _this; }; \ No newline at end of file diff --git a/addons/medical/functions/fnc_setDead.sqf b/addons/medical/functions/fnc_setDead.sqf index d43c1e1afc..2d91911a3c 100644 --- a/addons/medical/functions/fnc_setDead.sqf +++ b/addons/medical/functions/fnc_setDead.sqf @@ -24,11 +24,11 @@ if (!local _unit) exitwith { [[_unit, _force], QUOTE(FUNC(setDead)), _unit, false] call BIS_fnc_MP; }; -if (isnil QGVAR(ENABLE_REVIVE_F)) then { - GVAR(ENABLE_REVIVE_F) = 0; +if (isnil QGVAR(ENABLE_REVIVE)) then { + GVAR(ENABLE_REVIVE) = 0; }; -if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == 2)) && !_force && (alive (vehicle _unit))) exitwith { +if (((GVAR(ENABLE_REVIVE) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE) == 2)) && !_force && (alive (vehicle _unit))) exitwith { // enter revive state _unit setvariable ["ACE_inReviveState", true, true]; @@ -36,11 +36,11 @@ if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == [_unit] call FUNC(setUnconsciousState); // setting the revive default values - if (isnil QGVAR(REVIVE_TIMER_F)) then { - GVAR(REVIVE_TIMER_F) = 10; + if (isnil QGVAR(REVIVE_TIMER)) then { + GVAR(REVIVE_TIMER) = 10; }; - if (isnil QGVAR(REVIVE_NUMBER_MAX_F)) then { - GVAR(REVIVE_NUMBER_MAX_F) = -1; + if (isnil QGVAR(REVIVE_NUMBER_MAX)) then { + GVAR(REVIVE_NUMBER_MAX) = -1; }; [{ @@ -58,7 +58,7 @@ if (((GVAR(ENABLE_REVIVE_F) == 1 && isPlayer _unit) || (GVAR(ENABLE_REVIVE_F) == }; _counter = _unit getvariable ["ACE_reviveCounterValue", 0]; - if (_counter >= GVAR(REVIVE_TIMER_F)) exitwith{ + if (_counter >= GVAR(REVIVE_TIMER)) exitwith{ if (isPlayer _unit) then { titleText ["You died..","PLAIN DOWN"]; }; diff --git a/addons/medical/functions/fnc_setUnconsciousState.sqf b/addons/medical/functions/fnc_setUnconsciousState.sqf index 3f53e629e9..7fbd3c7f8a 100644 --- a/addons/medical/functions/fnc_setUnconsciousState.sqf +++ b/addons/medical/functions/fnc_setUnconsciousState.sqf @@ -41,17 +41,17 @@ _originalPos = unitPos _unit; // Handle the on screen effects if (isPlayer _unit) then { - [] call EFUNC(common,closeAllDialogs_f); + [] call EFUNC(common,closeAllDialogs); [true] call FUNC(effectBlackOut); ["unconscious", true] call EFUNC(common,setDisableUserInputStatus); - [false] call EFUNC(common,setVolume_f); + [false] call EFUNC(common,setVolume); } else { _unit setUnitPos "DOWN"; - [_unit, true] call EFUNC(common,disableAI_F); + [_unit, true] call EFUNC(common,disableAI); }; // So the AI does not get stuck, we are moving the unit to a temp group on its own. -[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide_f); +[_unit, true, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); _captiveSwitch = [_unit, true] call EFUNC(common,setCaptiveSwitch); [_unit, [_unit] call EFUNC(common,getDeathAnim), 1, true] call EFUNC(common,doAnimation); @@ -110,15 +110,15 @@ _minWaitingTime = (round(random(10)+5)); _unit setUnconscious false; // Swhich the unit back to its original group - [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide_f); + [_unit, false, "ACE_isUnconscious", side group _unit] call EFUNC(common,switchToGroupSide); // Reset any visual and audio effects for players, or enable everything again for AI. if (isPlayer _unit) then { [false] call FUNC(effectBlackOut); - [true] call EFUNC(common,setVolume_f); + [true] call EFUNC(common,setVolume); ["unconscious", false] call EFUNC(common,setDisableUserInputStatus); } else { - [_unit, false] call EFUNC(common,disableAI_F); + [_unit, false] call EFUNC(common,disableAI); _unit setUnitPos _originalPos; // This is not position but stance (DOWN, MIDDLE, UP) }; From c3cd9d281d0c9b3480670f68afa5348c75201875 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sat, 14 Feb 2015 20:31:44 +0100 Subject: [PATCH 07/62] Removed isHC function. #139 --- addons/common/XEH_preInit.sqf | 1 - 1 file changed, 1 deletion(-) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 7a70ae7bb3..3710963c63 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -111,7 +111,6 @@ PREP(isAutoWind); PREP(isAwake); PREP(isEngineer); PREP(isEOD); -PREP(isHC); PREP(isInBuilding); PREP(isModLoaded); PREP(isPlayer); From 827ef91fced046842bb2d3b8bc2e9717bd3e66a9 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 10:03:58 +0100 Subject: [PATCH 08/62] Ported CSE Ambiance sound module --- .../functions/fn_moduleAmbianceSoundLoop.sqf | 98 -------------- addons/missionModules/$PBOPREFIX$ | 1 + addons/missionModules/CfgEventHandlers.hpp | 6 + addons/missionModules/CfgFactionClasses.hpp | 6 + addons/missionModules/CfgVehicles.hpp | 68 ++++++++++ addons/missionModules/XEH_preInit.sqf | 7 + addons/missionModules/config.cpp | 17 +++ addons/missionModules/data/moduleSound.paa | Bin 0 -> 5625 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ++++++++++++++++++ .../functions/script_component.hpp | 1 + addons/missionModules/script_component.hpp | 12 ++ 11 files changed, 241 insertions(+), 98 deletions(-) delete mode 100644 TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf create mode 100644 addons/missionModules/$PBOPREFIX$ create mode 100644 addons/missionModules/CfgEventHandlers.hpp create mode 100644 addons/missionModules/CfgFactionClasses.hpp create mode 100644 addons/missionModules/CfgVehicles.hpp create mode 100644 addons/missionModules/XEH_preInit.sqf create mode 100644 addons/missionModules/config.cpp create mode 100644 addons/missionModules/data/moduleSound.paa create mode 100644 addons/missionModules/functions/fnc_moduleAmbianceSound.sqf create mode 100644 addons/missionModules/functions/script_component.hpp create mode 100644 addons/missionModules/script_component.hpp diff --git a/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf b/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf deleted file mode 100644 index 4b4d93d453..0000000000 --- a/TO_MERGE/cse/sys_misc/functions/fn_moduleAmbianceSoundLoop.sqf +++ /dev/null @@ -1,98 +0,0 @@ -/** - * fn_moduleAmbianceSoundLoop.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_units = [_this,1,[],[[]]] call BIS_fnc_param; -_activated = [_this,2,true,[true]] call BIS_fnc_param; - -if (_activated && isServer) then { - _ambianceSounds = []; - _unparsedSounds = _logic getvariable ["soundFiles", ""]; - _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; - _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; - _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; - _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; - _volume = (_logic getvariable ["soundVolume", 30]) max 1; - _followPlayers = _logic getvariable ["followPlayers", false]; - - _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; - - _nilCheckPassedList = ""; - { - _x = [_x] call cse_fnc_string_removeWhiteSpace; - _splittedList set [_foreachIndex, _x]; - }foreach _splittedList; - - _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; - { - if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); - } else { - if (isclass (configFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); - }; - }; - }foreach _splittedList; - - if (count _ambianceSounds == 0) exitwith { - [format["No Ambiance sounds available"]] call cse_fnc_debug; - }; - { - if !([".", _x, true] call BIS_fnc_inString) then { - [format["Ambiance soundfile does not contain a file extension %1", _x]] call cse_fnc_debug; - _ambianceSounds set [_foreachIndex, _x + ".wss"]; - }; - }foreach _ambianceSounds; - [format["Ambiance sounds %1", _ambianceSounds]] call cse_fnc_debug; - - while {alive _logic} do { - _allUnits = switch (true) do { - case isMultiplayer: {playableUnits}; - case isDedicated: {[_logic]}; - default {[player]}; - }; - - if (count _allUnits > 0) then { - _targetUnit = _allUnits select (round(random((count _allUnits)-1))); - - _newPos = (getPos _targetUnit); - if (!_followPlayers) then { - _newPos = getPos _logic; - }; - - if (random(1) >= 0.5) then { - if (random(1) >= 0.5) then { - _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; - }; - } else { - if (random(1) >= 0.5) then { - _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; - }; - }; - - if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - - _soundToPlay = _ambianceSounds select (round(random((count _ambianceSounds)-1))); - playSound3D [_soundToPlay, _targetUnit, false, _newPos, _volume, 1, 1000]; - - [format["Played a sound %1", _soundToPlay]] call cse_fnc_debug; - - sleep (_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds; - }; - }; - }; -}; - -true; \ No newline at end of file diff --git a/addons/missionModules/$PBOPREFIX$ b/addons/missionModules/$PBOPREFIX$ new file mode 100644 index 0000000000..ea1be0daee --- /dev/null +++ b/addons/missionModules/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionModules/CfgEventHandlers.hpp b/addons/missionModules/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0a9f14d91 --- /dev/null +++ b/addons/missionModules/CfgEventHandlers.hpp @@ -0,0 +1,6 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/missionModules/CfgFactionClasses.hpp b/addons/missionModules/CfgFactionClasses.hpp new file mode 100644 index 0000000000..792f4d31e3 --- /dev/null +++ b/addons/missionModules/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class ACE_missionModules: NO_CATEGORY { + displayName = "ACE Mission Modules"; + }; +}; \ No newline at end of file diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp new file mode 100644 index 0000000000..570883ee5f --- /dev/null +++ b/addons/missionModules/CfgVehicles.hpp @@ -0,0 +1,68 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + + // TODO make a curator variant for this + class cse_moduleAmbianceSound: Module_F { + scope = 2; + displayName = "Ambiance Sounds [ACE]"; + icon = QUOTE(PATHTOF(data\moduleSound.paa)); + category = "ACE_missionModules"; + function = QUOTE(FUNC(moduleAmbianceSound); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Glowbal"; + class Arguments { + class soundFiles { + displayName = "Sounds"; + description = "Classnames of the ambiance sounds played. Seperated by ','. "; + typeName = "STRING"; + defaultValue = ""; + }; + class minimalDistance { + displayName = "Minimal Distance"; + description = "Minimal Distance"; + typeName = "NUMBER"; + defaultValue = 400; + }; + class maximalDistance { + displayName = "Maximal Distance"; + description = "Maximal Distance"; + typeName = "NUMBER"; + defaultValue = 900; + }; + class minimalDelay { + displayName = "Minimal Delay"; + description = "Minimal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 10; + }; + class maximalDelay { + displayName = "Maximal Delay"; + description = "Maximal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 170; + }; + class followPlayers { + displayName = "Follow Players"; + description = "Follow players. If set to false, loop will play sounds only nearby logic position."; + typeName = "BOOL"; + defaultValue = 0; + }; + class soundVolume { + displayName = "Volume"; + description = "The volume of the sounds played"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Ambiance sounds loop (synced across MP)"; + sync[] = {}; + }; + }; +}; diff --git a/addons/missionModules/XEH_preInit.sqf b/addons/missionModules/XEH_preInit.sqf new file mode 100644 index 0000000000..cadbbabdd1 --- /dev/null +++ b/addons/missionModules/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(moduleAmbianceSound); + +ADDON = true; diff --git a/addons/missionModules/config.cpp b/addons/missionModules/config.cpp new file mode 100644 index 0000000000..0867b486c6 --- /dev/null +++ b/addons/missionModules/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"cse_moduleAmbianceSound"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Glowbal"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missionModules/data/moduleSound.paa b/addons/missionModules/data/moduleSound.paa new file mode 100644 index 0000000000000000000000000000000000000000..bfe3b8032717dcc98269b4b42a620cffe550ffc2 GIT binary patch literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 + * 1: Units + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * N/A + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; +_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +_units = [_this,1,[],[[]]] call BIS_fnc_param; +_activated = [_this,2,true,[true]] call BIS_fnc_param; + +// We only play this on the locality of the logic, since the sounds are broadcasted across the network +if (_activated && local _logic) then { + _ambianceSounds = []; + _unparsedSounds = _logic getvariable ["soundFiles", ""]; + _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; + _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; + _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; + _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; + _volume = (_logic getvariable ["soundVolume", 30]) max 1; + _followPlayers = _logic getvariable ["followPlayers", false]; + + _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; + + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,removeWhiteSpace); + _splittedList set [_foreachIndex, _x]; + }foreach _splittedList; + + _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; + { + if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); + } else { + if (isclass (configFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); + }; + }; + }foreach _splittedList; + + if (count _ambianceSounds == 0) exitwith {}; + { + if !([".", _x, true] call BIS_fnc_inString) then { + _ambianceSounds set [_foreachIndex, _x + ".wss"]; + }; + }foreach _ambianceSounds; + + [{ + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + _args = _this select 0; + _logic = _args select 0; + _lastTimePlayed = _args select 8; + + if (!alive _logic) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + _ambianceSounds = _args select 1; + _minimalDistance = _args select 2; + _maximalDistance = _args select 3; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; + _followPlayers = _args select 7; + + // Find all players in session. + _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; + + // Check if there are enough players to even start playing this sound. + if (count _allUnits > 0) then { + + // Select a target unit at random. + _targetUnit = _allUnits select (round(random((count _allUnits)-1))); + + // find the position from which we are going to play this sound from. + _newPos = (getPos _targetUnit); + if (!_followPlayers) then { + _newPos = getPos _logic; + }; + + // Randomize this position. + if (random(1) >= 0.5) then { + if (random(1) >= 0.5) then { + _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; + }; + } else { + if (random(1) >= 0.5) then { + _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; + }; + }; + + // If no unit is to close to this position, we will play the sound. + if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { + + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), _targetUnit, false, _newPos, _volume, 1, 1000]; + _args set [8, time]; + }; + }; + }; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; +}; + +true; diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp new file mode 100644 index 0000000000..e49740a89e --- /dev/null +++ b/addons/missionModules/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\missionModules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionModules/script_component.hpp b/addons/missionModules/script_component.hpp new file mode 100644 index 0000000000..a567966c7b --- /dev/null +++ b/addons/missionModules/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT missionModules +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MISSIONMODULES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MISSIONMODULES + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From 6540158ce1e93a425957e01f1011c0e0b6f9dc1e Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 10:05:48 +0100 Subject: [PATCH 09/62] Removed left over CSE prefix --- addons/missionModules/CfgVehicles.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp index 570883ee5f..afdb58006b 100644 --- a/addons/missionModules/CfgVehicles.hpp +++ b/addons/missionModules/CfgVehicles.hpp @@ -6,7 +6,7 @@ class CfgVehicles { }; // TODO make a curator variant for this - class cse_moduleAmbianceSound: Module_F { + class ACE_moduleAmbianceSound: Module_F { scope = 2; displayName = "Ambiance Sounds [ACE]"; icon = QUOTE(PATHTOF(data\moduleSound.paa)); From ac54e8dfd797e94c2629628e04396743f8c21025 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 15 Feb 2015 12:44:34 +0100 Subject: [PATCH 10/62] Added UAV exchange battery sound --- addons/logistics_uavbattery/CfgSounds.hpp | 7 +++++++ addons/logistics_uavbattery/config.cpp | 1 + .../functions/fnc_refuelUAV.sqf | 1 + .../sounds/exchange_battery.ogg | Bin 0 -> 34349 bytes 4 files changed, 9 insertions(+) create mode 100644 addons/logistics_uavbattery/CfgSounds.hpp create mode 100644 addons/logistics_uavbattery/sounds/exchange_battery.ogg diff --git a/addons/logistics_uavbattery/CfgSounds.hpp b/addons/logistics_uavbattery/CfgSounds.hpp new file mode 100644 index 0000000000..530c5b86a9 --- /dev/null +++ b/addons/logistics_uavbattery/CfgSounds.hpp @@ -0,0 +1,7 @@ +class CfgSounds { + class ACE_replaceUAVBattery { + name = "ACE_replaceUAVBattery"; + sound[]={QUOTE(PATHTOF(sounds\exchange_battery.ogg)),1,1}; + titles[]={}; + }; +}; diff --git a/addons/logistics_uavbattery/config.cpp b/addons/logistics_uavbattery/config.cpp index 046a2665d0..32d8c49978 100644 --- a/addons/logistics_uavbattery/config.cpp +++ b/addons/logistics_uavbattery/config.cpp @@ -15,3 +15,4 @@ class CfgPatches { #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" +#include "CfgSounds.hpp" diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index 9384044f00..5a248bf812 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -21,6 +21,7 @@ if (!(_this call FUNC(canRefuelUAV))) exitWith {}; _onFinish = { EXPLODE_2_PVT((_this select 0),_caller,_target); _caller removeItem "ACE_UAVBattery"; + playSound3D [QUOTE(PATHTO_R(sounds\exchange_battery.ogg)), objNull, false, getPosASL _caller, 1, 1, 10]; ["VehicleSetFuel", [_target], [_target, 1]] call EFUNC(common,targetEvent); //setFuel is local }; diff --git a/addons/logistics_uavbattery/sounds/exchange_battery.ogg b/addons/logistics_uavbattery/sounds/exchange_battery.ogg new file mode 100644 index 0000000000000000000000000000000000000000..5a40ddb47a7aa5db7a2ba779baa37072286fc37c GIT binary patch literal 34349 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≈eyu+XoU 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 literal 0 HcmV?d00001 From da19a89be867d51cffbf000092ffd025cf25e061 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Mon, 16 Feb 2015 15:56:36 +0100 Subject: [PATCH 11/62] Replaced _targetUnit for ObjNull Replaced _targetUnit for objNull. --- addons/missionModules/functions/fnc_moduleAmbianceSound.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf index f35f14b30c..95153be8d1 100644 --- a/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionModules/functions/fnc_moduleAmbianceSound.sqf @@ -112,7 +112,7 @@ if (_activated && local _logic) then { // If no unit is to close to this position, we will play the sound. if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), _targetUnit, false, _newPos, _volume, 1, 1000]; + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; _args set [8, time]; }; }; From 1f737dc91495f5ef801e6712a4b83dd202847cec Mon Sep 17 00:00:00 2001 From: KoffeinFlummi Date: Mon, 16 Feb 2015 19:08:27 +0100 Subject: [PATCH 12/62] Add editorconfig --- .editorconfig | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .editorconfig diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000..f6f23b8d1b --- /dev/null +++ b/.editorconfig @@ -0,0 +1,13 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true +charset = utf-8 +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[*.md] +trim_trailing_whitespace = false + From d60081a9c311620e61926d8a7e87ac4da3a6e5cf Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:49:37 +0100 Subject: [PATCH 13/62] Renamed missionModules to missionmodules. --- addons/missionModules/functions/script_component.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp index e49740a89e..42d34d4801 100644 --- a/addons/missionModules/functions/script_component.hpp +++ b/addons/missionModules/functions/script_component.hpp @@ -1 +1 @@ -#include "\z\ace\addons\missionModules\script_component.hpp" \ No newline at end of file +#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file From d86e2464b3d35315e5c38b5a3e459a0b016e1ee5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:51:35 +0100 Subject: [PATCH 14/62] Removed missionModules --- addons/missionModules/$PBOPREFIX$ | 1 - addons/missionModules/CfgEventHandlers.hpp | 6 - addons/missionModules/CfgFactionClasses.hpp | 6 - addons/missionModules/CfgVehicles.hpp | 68 ---------- addons/missionModules/XEH_preInit.sqf | 7 - addons/missionModules/config.cpp | 17 --- addons/missionModules/data/moduleSound.paa | Bin 5625 -> 0 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ------------------ .../functions/script_component.hpp | 1 - addons/missionModules/script_component.hpp | 12 -- 10 files changed, 241 deletions(-) delete mode 100644 addons/missionModules/$PBOPREFIX$ delete mode 100644 addons/missionModules/CfgEventHandlers.hpp delete mode 100644 addons/missionModules/CfgFactionClasses.hpp delete mode 100644 addons/missionModules/CfgVehicles.hpp delete mode 100644 addons/missionModules/XEH_preInit.sqf delete mode 100644 addons/missionModules/config.cpp delete mode 100644 addons/missionModules/data/moduleSound.paa delete mode 100644 addons/missionModules/functions/fnc_moduleAmbianceSound.sqf delete mode 100644 addons/missionModules/functions/script_component.hpp delete mode 100644 addons/missionModules/script_component.hpp diff --git a/addons/missionModules/$PBOPREFIX$ b/addons/missionModules/$PBOPREFIX$ deleted file mode 100644 index ea1be0daee..0000000000 --- a/addons/missionModules/$PBOPREFIX$ +++ /dev/null @@ -1 +0,0 @@ -z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionModules/CfgEventHandlers.hpp b/addons/missionModules/CfgEventHandlers.hpp deleted file mode 100644 index f0a9f14d91..0000000000 --- a/addons/missionModules/CfgEventHandlers.hpp +++ /dev/null @@ -1,6 +0,0 @@ - -class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit)); - }; -}; diff --git a/addons/missionModules/CfgFactionClasses.hpp b/addons/missionModules/CfgFactionClasses.hpp deleted file mode 100644 index 792f4d31e3..0000000000 --- a/addons/missionModules/CfgFactionClasses.hpp +++ /dev/null @@ -1,6 +0,0 @@ -class CfgFactionClasses { - class NO_CATEGORY; - class ACE_missionModules: NO_CATEGORY { - displayName = "ACE Mission Modules"; - }; -}; \ No newline at end of file diff --git a/addons/missionModules/CfgVehicles.hpp b/addons/missionModules/CfgVehicles.hpp deleted file mode 100644 index afdb58006b..0000000000 --- a/addons/missionModules/CfgVehicles.hpp +++ /dev/null @@ -1,68 +0,0 @@ -class CfgVehicles { - class Logic; - class Module_F: Logic { - class ArgumentsBaseUnits { - }; - }; - - // TODO make a curator variant for this - class ACE_moduleAmbianceSound: Module_F { - scope = 2; - displayName = "Ambiance Sounds [ACE]"; - icon = QUOTE(PATHTOF(data\moduleSound.paa)); - category = "ACE_missionModules"; - function = QUOTE(FUNC(moduleAmbianceSound); - functionPriority = 1; - isGlobal = 1; - isTriggerActivated = 0; - author = "Glowbal"; - class Arguments { - class soundFiles { - displayName = "Sounds"; - description = "Classnames of the ambiance sounds played. Seperated by ','. "; - typeName = "STRING"; - defaultValue = ""; - }; - class minimalDistance { - displayName = "Minimal Distance"; - description = "Minimal Distance"; - typeName = "NUMBER"; - defaultValue = 400; - }; - class maximalDistance { - displayName = "Maximal Distance"; - description = "Maximal Distance"; - typeName = "NUMBER"; - defaultValue = 900; - }; - class minimalDelay { - displayName = "Minimal Delay"; - description = "Minimal Delay between sounds played"; - typeName = "NUMBER"; - defaultValue = 10; - }; - class maximalDelay { - displayName = "Maximal Delay"; - description = "Maximal Delay between sounds played"; - typeName = "NUMBER"; - defaultValue = 170; - }; - class followPlayers { - displayName = "Follow Players"; - description = "Follow players. If set to false, loop will play sounds only nearby logic position."; - typeName = "BOOL"; - defaultValue = 0; - }; - class soundVolume { - displayName = "Volume"; - description = "The volume of the sounds played"; - typeName = "NUMBER"; - defaultValue = 0; - }; - }; - class ModuleDescription { - description = "Ambiance sounds loop (synced across MP)"; - sync[] = {}; - }; - }; -}; diff --git a/addons/missionModules/XEH_preInit.sqf b/addons/missionModules/XEH_preInit.sqf deleted file mode 100644 index cadbbabdd1..0000000000 --- a/addons/missionModules/XEH_preInit.sqf +++ /dev/null @@ -1,7 +0,0 @@ -#include "script_component.hpp" - -ADDON = false; - -PREP(moduleAmbianceSound); - -ADDON = true; diff --git a/addons/missionModules/config.cpp b/addons/missionModules/config.cpp deleted file mode 100644 index 0867b486c6..0000000000 --- a/addons/missionModules/config.cpp +++ /dev/null @@ -1,17 +0,0 @@ -#include "script_component.hpp" - -class CfgPatches { - class ADDON { - units[] = {"cse_moduleAmbianceSound"}; - weapons[] = {}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"Glowbal"}; - authorUrl = ""; - VERSION_CONFIG; - }; -}; - -#include "CfgEventHandlers.hpp" -#include "CfgFactionClasses.hpp" -#include "CfgVehicles.hpp" diff --git a/addons/missionModules/data/moduleSound.paa b/addons/missionModules/data/moduleSound.paa deleted file mode 100644 index bfe3b8032717dcc98269b4b42a620cffe550ffc2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 - * 1: Units - * 2: Activated - * - * Return Value: - * Nothing - * - * Example: - * N/A - * - * Public: No - */ - -#include "script_component.hpp" - -private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; -_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; -_units = [_this,1,[],[[]]] call BIS_fnc_param; -_activated = [_this,2,true,[true]] call BIS_fnc_param; - -// We only play this on the locality of the logic, since the sounds are broadcasted across the network -if (_activated && local _logic) then { - _ambianceSounds = []; - _unparsedSounds = _logic getvariable ["soundFiles", ""]; - _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; - _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; - _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; - _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; - _volume = (_logic getvariable ["soundVolume", 30]) max 1; - _followPlayers = _logic getvariable ["followPlayers", false]; - - _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; - - _nilCheckPassedList = ""; - { - _x = [_x] call EFUNC(common,removeWhiteSpace); - _splittedList set [_foreachIndex, _x]; - }foreach _splittedList; - - _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; - { - if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); - } else { - if (isclass (configFile >> "CfgSounds" >> _x)) then { - _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); - }; - }; - }foreach _splittedList; - - if (count _ambianceSounds == 0) exitwith {}; - { - if !([".", _x, true] call BIS_fnc_inString) then { - _ambianceSounds set [_foreachIndex, _x + ".wss"]; - }; - }foreach _ambianceSounds; - - [{ - private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] - _args = _this select 0; - _logic = _args select 0; - _lastTimePlayed = _args select 8; - - if (!alive _logic) exitwith { - [(_this select 1)] call cba_fnc_removePerFrameHandler; - }; - - if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { - _ambianceSounds = _args select 1; - _minimalDistance = _args select 2; - _maximalDistance = _args select 3; - _minDelayBetweensounds = _args select 4; - _maxDelayBetweenSounds = _args select 5; - _volume = _args select 6; - _followPlayers = _args select 7; - - // Find all players in session. - _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; - - // Check if there are enough players to even start playing this sound. - if (count _allUnits > 0) then { - - // Select a target unit at random. - _targetUnit = _allUnits select (round(random((count _allUnits)-1))); - - // find the position from which we are going to play this sound from. - _newPos = (getPos _targetUnit); - if (!_followPlayers) then { - _newPos = getPos _logic; - }; - - // Randomize this position. - if (random(1) >= 0.5) then { - if (random(1) >= 0.5) then { - _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; - }; - } else { - if (random(1) >= 0.5) then { - _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; - } else { - _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; - }; - }; - - // If no unit is to close to this position, we will play the sound. - if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; - _args set [8, time]; - }; - }; - }; - }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; -}; - -true; diff --git a/addons/missionModules/functions/script_component.hpp b/addons/missionModules/functions/script_component.hpp deleted file mode 100644 index 42d34d4801..0000000000 --- a/addons/missionModules/functions/script_component.hpp +++ /dev/null @@ -1 +0,0 @@ -#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionModules/script_component.hpp b/addons/missionModules/script_component.hpp deleted file mode 100644 index a567966c7b..0000000000 --- a/addons/missionModules/script_component.hpp +++ /dev/null @@ -1,12 +0,0 @@ -#define COMPONENT missionModules -#include "\z\ace\addons\main\script_mod.hpp" - -#ifdef DEBUG_ENABLED_MISSIONMODULES - #define DEBUG_MODE_FULL -#endif - -#ifdef DEBUG_SETTINGS_MISSIONMODULES - #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES -#endif - -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From bfc748fbbef1d9745c0a0d0cb35133a17b9b9c6f Mon Sep 17 00:00:00 2001 From: Glowbal Date: Tue, 17 Feb 2015 07:51:51 +0100 Subject: [PATCH 15/62] Added missionmodules. --- addons/missionmodules/$PBOPREFIX$ | 1 + addons/missionmodules/CfgEventHandlers.hpp | 6 + addons/missionmodules/CfgFactionClasses.hpp | 6 + addons/missionmodules/CfgVehicles.hpp | 68 ++++++++++ addons/missionmodules/XEH_preInit.sqf | 7 + addons/missionmodules/config.cpp | 17 +++ addons/missionmodules/data/moduleSound.paa | Bin 0 -> 5625 bytes .../functions/fnc_moduleAmbianceSound.sqf | 123 ++++++++++++++++++ .../functions/script_component.hpp | 1 + addons/missionmodules/script_component.hpp | 12 ++ 10 files changed, 241 insertions(+) create mode 100644 addons/missionmodules/$PBOPREFIX$ create mode 100644 addons/missionmodules/CfgEventHandlers.hpp create mode 100644 addons/missionmodules/CfgFactionClasses.hpp create mode 100644 addons/missionmodules/CfgVehicles.hpp create mode 100644 addons/missionmodules/XEH_preInit.sqf create mode 100644 addons/missionmodules/config.cpp create mode 100644 addons/missionmodules/data/moduleSound.paa create mode 100644 addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf create mode 100644 addons/missionmodules/functions/script_component.hpp create mode 100644 addons/missionmodules/script_component.hpp diff --git a/addons/missionmodules/$PBOPREFIX$ b/addons/missionmodules/$PBOPREFIX$ new file mode 100644 index 0000000000..ea1be0daee --- /dev/null +++ b/addons/missionmodules/$PBOPREFIX$ @@ -0,0 +1 @@ +z\ace\addons\missionModules \ No newline at end of file diff --git a/addons/missionmodules/CfgEventHandlers.hpp b/addons/missionmodules/CfgEventHandlers.hpp new file mode 100644 index 0000000000..f0a9f14d91 --- /dev/null +++ b/addons/missionmodules/CfgEventHandlers.hpp @@ -0,0 +1,6 @@ + +class Extended_PreInit_EventHandlers { + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit)); + }; +}; diff --git a/addons/missionmodules/CfgFactionClasses.hpp b/addons/missionmodules/CfgFactionClasses.hpp new file mode 100644 index 0000000000..792f4d31e3 --- /dev/null +++ b/addons/missionmodules/CfgFactionClasses.hpp @@ -0,0 +1,6 @@ +class CfgFactionClasses { + class NO_CATEGORY; + class ACE_missionModules: NO_CATEGORY { + displayName = "ACE Mission Modules"; + }; +}; \ No newline at end of file diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp new file mode 100644 index 0000000000..afdb58006b --- /dev/null +++ b/addons/missionmodules/CfgVehicles.hpp @@ -0,0 +1,68 @@ +class CfgVehicles { + class Logic; + class Module_F: Logic { + class ArgumentsBaseUnits { + }; + }; + + // TODO make a curator variant for this + class ACE_moduleAmbianceSound: Module_F { + scope = 2; + displayName = "Ambiance Sounds [ACE]"; + icon = QUOTE(PATHTOF(data\moduleSound.paa)); + category = "ACE_missionModules"; + function = QUOTE(FUNC(moduleAmbianceSound); + functionPriority = 1; + isGlobal = 1; + isTriggerActivated = 0; + author = "Glowbal"; + class Arguments { + class soundFiles { + displayName = "Sounds"; + description = "Classnames of the ambiance sounds played. Seperated by ','. "; + typeName = "STRING"; + defaultValue = ""; + }; + class minimalDistance { + displayName = "Minimal Distance"; + description = "Minimal Distance"; + typeName = "NUMBER"; + defaultValue = 400; + }; + class maximalDistance { + displayName = "Maximal Distance"; + description = "Maximal Distance"; + typeName = "NUMBER"; + defaultValue = 900; + }; + class minimalDelay { + displayName = "Minimal Delay"; + description = "Minimal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 10; + }; + class maximalDelay { + displayName = "Maximal Delay"; + description = "Maximal Delay between sounds played"; + typeName = "NUMBER"; + defaultValue = 170; + }; + class followPlayers { + displayName = "Follow Players"; + description = "Follow players. If set to false, loop will play sounds only nearby logic position."; + typeName = "BOOL"; + defaultValue = 0; + }; + class soundVolume { + displayName = "Volume"; + description = "The volume of the sounds played"; + typeName = "NUMBER"; + defaultValue = 0; + }; + }; + class ModuleDescription { + description = "Ambiance sounds loop (synced across MP)"; + sync[] = {}; + }; + }; +}; diff --git a/addons/missionmodules/XEH_preInit.sqf b/addons/missionmodules/XEH_preInit.sqf new file mode 100644 index 0000000000..cadbbabdd1 --- /dev/null +++ b/addons/missionmodules/XEH_preInit.sqf @@ -0,0 +1,7 @@ +#include "script_component.hpp" + +ADDON = false; + +PREP(moduleAmbianceSound); + +ADDON = true; diff --git a/addons/missionmodules/config.cpp b/addons/missionmodules/config.cpp new file mode 100644 index 0000000000..0867b486c6 --- /dev/null +++ b/addons/missionmodules/config.cpp @@ -0,0 +1,17 @@ +#include "script_component.hpp" + +class CfgPatches { + class ADDON { + units[] = {"cse_moduleAmbianceSound"}; + weapons[] = {}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"Glowbal"}; + authorUrl = ""; + VERSION_CONFIG; + }; +}; + +#include "CfgEventHandlers.hpp" +#include "CfgFactionClasses.hpp" +#include "CfgVehicles.hpp" diff --git a/addons/missionmodules/data/moduleSound.paa b/addons/missionmodules/data/moduleSound.paa new file mode 100644 index 0000000000000000000000000000000000000000..bfe3b8032717dcc98269b4b42a620cffe550ffc2 GIT binary patch literal 5625 zcmd5=e{2)i9e)QtpfrHPa-m>_7$qGojBP2JHAXidD=lKvOSnciRHiZp3io($CfVu3Ih4Y{*BB>0gjI}tEY4lCyKj^3 zi|MspB)_I9Qgx5++xQ+GAF#}rEAi6)SgR2uT;uV0M$+GvaQ(#H9}xS?WmyKjWzk^2 zNzcQW;MZidnf$!>++Lhj?%eeIpGtziBC+buc2ZUhGN$7o{p|Y_&10xliB==phYGcr8`S2cb3wu zSJO0FbEhH0o>*@a^2330*Os!%?HPIs=*>Ht3JmIghu|*BN=Fax<2*v*2zg37n~I_l zvuOp1~efUHq1t$YIb<=rbwS zTrcQpUhjzXYHsxVyH5nfdE>YxM~e3~1{1=bAg7M@d>{Fz$PcEznj%j-Sr-`;E@UQk zQ%W=8le|+&`CYHlo@`?-%h+-aPK=XB!7Q0@uvl zk~H~J)3;+sOn<@gdX~1F2=F@pO`4Y=pKA{{ih0US7~4l2ZHeSrF3!i~kXHre!}Y@c zP~XdDtCPF%p;?fZ%~k(hpV7__KYu$I&W)uH29ukQ!Cc^o8gi!2->3UUe9E%THmf0Q zTsUN8<7HeGl+Vt~a$AbuYUH0o|BNJeHbGk-Z{+Ere3Dmnv_1+KqTMjB=U(a$b{;-6 zzc4iZ3Di4N{_5i{f3GXhO~_`GW%kmP#F*J;J)-sFmSP?uO!IU;(7&&hr;0QC@2ovz z3-%y>l5ihkZ6=ksK>1eVIAM@i^LD}cUF(EDfV@(07E3F~Wc@c6Pf23lh`?V>iWc4M z`dp0j&)*$#tfK$P|G#y0L*l&qaS?wMfyF&b{MX`O{fI8!$wXwry{egRWm$pFp z{y>`MA)mBh5Aqkkb=l&hj--Fhjd&oPi5~=z^p(|AlqMfu%Gp?i68y-kT`Dz1+<3b z<$c9;CtdTx;i6ck|MGfA>_>9#Q+h5Q7_jV*@=E>2Esi71(4W)NRDZ#3xHI;cHA?@; z<(G?d&v#ynUfUZd{#1V?*3m-&#@%$Iy`|^e#>Hkc9?+hA!G5{)M~i2jYll6|dd$$D zR)0X8Be1{8Upe@-w3`5=Q9-=?2KtXFp9)OTGQSFkA2Lj=c}(p3w}oZ4G=ctW9oi4< zr*2R=xTFyP!>q?9KaP56@|$%on7G*D6aK=`UyoLwyIp@@cmGg)E1Kr+;jL-cv!*;u z)@FA=&{SZHDJ_#uoFU1F>~(_jCm+&BtmntyvDT}g$DiA1>Bl@;UiY3!nfQUa_gvq* zwb%dKekXIHkY=R<$fjcYGlSh9iZ&KyjMBcs8aBK9SId5$Z9^J1hwG!^7Z8h7Chc~y zzRAF|A*~;Z!VEp4O~Z+c&YynMaN;8TU{bH0yK>v3G(%zjHqY*)0JwO9CW)BVG zJ*YDB^0;y9tW`GfULspIGVAAGN0_?S3436ZaxYoN8IUw|Rqu_G7u7KTl-MPM?0gOc`ug7=QW2VESaxEQ|DzF~Gcf`Ss=k z!5@80$+70ue>^-^&<8!+w(EE;@MgU@FXFFWrn38tNE@g!N=@f3^qiN9Y5(x27AJTU z=ZAa#5twV0X_O^x28Z$A&pS=)$^KtzKk;MPDzj+fwB>Q#-`x>urFlHnvF~!UO>diN z1yv&Jpc(olz3l-5or{nk44&+4GA;!F4$kl&=$B9LESij$36p&hUd;VmNUJ6YMgF6JLbOVk`ZbHcCR84R!G;@r-_u zAOuge55r}#NM0sQs>9M`hMq}%DBkSUY)Wi(n$)N*vDA>Kx9MZQ8d)rk1;xlSy{&nF z{&N3bnupD7Ptbb2a4^?R|X+6c1 zGkO0 + * 1: Units + * 2: Activated + * + * Return Value: + * Nothing + * + * Example: + * N/A + * + * Public: No + */ + +#include "script_component.hpp" + +private ["_logic", "_units", "_activated","_ambianceSounds", "_soundFiles", "_minimalDistance","_maximalDistance", "_minimalDistance", "_maxDelayBetweenSounds", "_allUnits", "_newPos", "_targetUnit", "_soundToPlay", "_soundPath", "_unparsedSounds", "_list", "_splittedList", "_nilCheckPassedList"]; +_logic = [_this,0,objNull,[objNull]] call BIS_fnc_param; +_units = [_this,1,[],[[]]] call BIS_fnc_param; +_activated = [_this,2,true,[true]] call BIS_fnc_param; + +// We only play this on the locality of the logic, since the sounds are broadcasted across the network +if (_activated && local _logic) then { + _ambianceSounds = []; + _unparsedSounds = _logic getvariable ["soundFiles", ""]; + _minimalDistance = (_logic getvariable ["minimalDistance", 400]) max 1; + _maximalDistance = (_logic getvariable ["maximalDistance", 10]) max _minimalDistance; + _minDelayBetweensounds = (_logic getvariable ["minimalDelay", 10]) max 1; + _maxDelayBetweenSounds = (_logic getvariable ["maximalDelay", 170]) max _minDelayBetweensounds; + _volume = (_logic getvariable ["soundVolume", 30]) max 1; + _followPlayers = _logic getvariable ["followPlayers", false]; + + _splittedList = [_unparsedSounds, ","] call BIS_fnc_splitString; + + _nilCheckPassedList = ""; + { + _x = [_x] call EFUNC(common,removeWhiteSpace); + _splittedList set [_foreachIndex, _x]; + }foreach _splittedList; + + _soundPath = [(str missionConfigFile), 0, -15] call BIS_fnc_trimString; + { + if (isclass (missionConfigFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback (_soundPath + (getArray(missionConfigFile >> "CfgSounds" >> _x >> "sound") select 0)); + } else { + if (isclass (configFile >> "CfgSounds" >> _x)) then { + _ambianceSounds pushback ((getArray(configFile >> "CfgSounds" >> _x >> "sound") select 0)); + }; + }; + }foreach _splittedList; + + if (count _ambianceSounds == 0) exitwith {}; + { + if !([".", _x, true] call BIS_fnc_inString) then { + _ambianceSounds set [_foreachIndex, _x + ".wss"]; + }; + }foreach _ambianceSounds; + + [{ + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + _args = _this select 0; + _logic = _args select 0; + _lastTimePlayed = _args select 8; + + if (!alive _logic) exitwith { + [(_this select 1)] call cba_fnc_removePerFrameHandler; + }; + + if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + _ambianceSounds = _args select 1; + _minimalDistance = _args select 2; + _maximalDistance = _args select 3; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; + _followPlayers = _args select 7; + + // Find all players in session. + _allUnits = if (isMultiplayer) then {playableUnits} else {[ACE_player]}; + + // Check if there are enough players to even start playing this sound. + if (count _allUnits > 0) then { + + // Select a target unit at random. + _targetUnit = _allUnits select (round(random((count _allUnits)-1))); + + // find the position from which we are going to play this sound from. + _newPos = (getPos _targetUnit); + if (!_followPlayers) then { + _newPos = getPos _logic; + }; + + // Randomize this position. + if (random(1) >= 0.5) then { + if (random(1) >= 0.5) then { + _newPos set [0, (_newPos select 0) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [0, (_newPos select 0) - (_minimalDistance + random(_maximalDistance))]; + }; + } else { + if (random(1) >= 0.5) then { + _newPos set [1, (_newPos select 1) + (_minimalDistance + random(_maximalDistance))]; + } else { + _newPos set [1, (_newPos select 1) - (_minimalDistance + random(_maximalDistance))]; + }; + }; + + // If no unit is to close to this position, we will play the sound. + if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { + + playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; + _args set [8, time]; + }; + }; + }; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; +}; + +true; diff --git a/addons/missionmodules/functions/script_component.hpp b/addons/missionmodules/functions/script_component.hpp new file mode 100644 index 0000000000..42d34d4801 --- /dev/null +++ b/addons/missionmodules/functions/script_component.hpp @@ -0,0 +1 @@ +#include "\z\ace\addons\missionmodules\script_component.hpp" \ No newline at end of file diff --git a/addons/missionmodules/script_component.hpp b/addons/missionmodules/script_component.hpp new file mode 100644 index 0000000000..a567966c7b --- /dev/null +++ b/addons/missionmodules/script_component.hpp @@ -0,0 +1,12 @@ +#define COMPONENT missionModules +#include "\z\ace\addons\main\script_mod.hpp" + +#ifdef DEBUG_ENABLED_MISSIONMODULES + #define DEBUG_MODE_FULL +#endif + +#ifdef DEBUG_SETTINGS_MISSIONMODULES + #define DEBUG_SETTINGS DEBUG_SETTINGS_MISSIONMODULES +#endif + +#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file From c3b5430bc4b15a7cf92738cc00845a2732abf01b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:05:52 -0600 Subject: [PATCH 16/62] NVG KeyBinds --- addons/nightvision/XEH_postInitClient.sqf | 37 +++++++++++++++++++ addons/nightvision/config.cpp | 43 +++++------------------ 2 files changed, 46 insertions(+), 34 deletions(-) diff --git a/addons/nightvision/XEH_postInitClient.sqf b/addons/nightvision/XEH_postInitClient.sqf index b81bedc07b..7513b1df16 100644 --- a/addons/nightvision/XEH_postInitClient.sqf +++ b/addons/nightvision/XEH_postInitClient.sqf @@ -35,3 +35,40 @@ GVAR(ppEffectMuzzleFlash) ppEffectCommit 0; ["cameraViewChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); ["playerVehicleChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); ["playerTurretChanged", {_this call FUNC(updatePPEffects)}] call EFUNC(common,addEventHandler); + +// Add keybinds +["ACE3", +localize "STR_ACE_NightVision_IncreaseNVGBrightness", +{ + // Conditions: canInteract + _exceptions = [QEGVAR(captives,isNotEscorting)]; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if ((currentVisionMode _player != 1)) exitWith {false}; + + // Statement + [ACE_player, 1] call FUNC(changeNVGBrightness); + true +}, +[201, [false, false, true]], //PageUp + ALT +false, +"keydown" +] call cba_fnc_registerKeybind; + +["ACE3", +localize "STR_ACE_NightVision_DecreaseNVGBrightness", +{ + // Conditions: canInteract + _exceptions = [QEGVAR(captives,isNotEscorting)]; + if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; + // Conditions: specific + if ((currentVisionMode _player != 1)) exitWith {false}; + + // Statement + [ACE_player, -1] call FUNC(changeNVGBrightness); + true +}, +[209, [false, false, true]], //PageDown + ALT +false, +"keydown" +] call cba_fnc_registerKeybind; diff --git a/addons/nightvision/config.cpp b/addons/nightvision/config.cpp index 32c563bfb6..4e6aa2e39a 100644 --- a/addons/nightvision/config.cpp +++ b/addons/nightvision/config.cpp @@ -1,42 +1,17 @@ #include "script_component.hpp" class CfgPatches { - class ADDON { - units[] = {}; - weapons[] = {"ACE_NVG_Gen1", "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4", "ACE_NVG_Wide"}; - requiredVersion = REQUIRED_VERSION; - requiredAddons[] = {"ace_common"}; - author[] = {"commy2", "KoffeinFlummi", "PabstMirror"}; - authorUrl = "https://github.com/commy2/"; - VERSION_CONFIG; - }; + class ADDON { + units[] = {}; + weapons[] = {"ACE_NVG_Gen1", "ACE_NVG_Gen2", /*"ACE_NVG_Gen3",*/ "ACE_NVG_Gen4", "ACE_NVG_Wide"}; + requiredVersion = REQUIRED_VERSION; + requiredAddons[] = {"ace_common"}; + author[] = {"commy2", "KoffeinFlummi", "PabstMirror"}; + authorUrl = "https://github.com/commy2/"; + VERSION_CONFIG; + }; }; #include "CfgEventHandlers.hpp" #include "CfgVehicles.hpp" #include "CfgWeapons.hpp" - - -// class EGVAR(common,Default_Keys) { //??? -class ACE_common_Default_Keys { - class increaseNVGBrightness { - displayName = "$STR_ACE_NightVision_IncreaseNVGBrightness"; - condition = QUOTE( currentVisionMode _player == 1 ); - statement = QUOTE( [_player, _vehicle] call FUNC(increaseNVGBrightness) ); - key = 201; - shift = 0; - control = 0; - alt = 1; - allowHolding = 1; - }; - class decreaseNVGBrightness { - displayName = "$STR_ACE_NightVision_DecreaseNVGBrightness"; - condition = QUOTE( currentVisionMode _player == 1 ); - statement = QUOTE( [_player, _vehicle] call FUNC(decreaseNVGBrightness) ); - key = 209; - shift = 0; - control = 0; - alt = 1; - allowHolding = 1; - }; -}; From c291f297029ae4dda6d2f516aba3f8248371f806 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:06:37 -0600 Subject: [PATCH 17/62] Move model to folder --- addons/nightvision/CfgWeapons.hpp | 94 +++++++++--------- .../{ => models}/ace_nvg_wide_optics.p3d | Bin 2 files changed, 47 insertions(+), 47 deletions(-) rename addons/nightvision/{ => models}/ace_nvg_wide_optics.p3d (100%) diff --git a/addons/nightvision/CfgWeapons.hpp b/addons/nightvision/CfgWeapons.hpp index 99cc55db20..c40885c2c4 100644 --- a/addons/nightvision/CfgWeapons.hpp +++ b/addons/nightvision/CfgWeapons.hpp @@ -1,56 +1,56 @@ class CfgWeapons { - class Binocular; - class NVGoggles: Binocular { - displayName = "$STR_ACE_NightVision_NVG_Gen3_brown"; - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - ACE_NightVision_radBlur = 0.001; - }; - class NVGoggles_OPFOR: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_black"; - }; - class NVGoggles_INDEP: NVGoggles { - displayName = "$STR_ACE_NightVision_NVG_Gen3_green"; - }; + class Binocular; + class NVGoggles: Binocular { + displayName = "$STR_ACE_NightVision_NVG_Gen3_brown"; + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + ACE_NightVision_radBlur = 0.001; + }; + class NVGoggles_OPFOR: NVGoggles { + displayName = "$STR_ACE_NightVision_NVG_Gen3_black"; + }; + class NVGoggles_INDEP: NVGoggles { + displayName = "$STR_ACE_NightVision_NVG_Gen3_green"; + }; - class ACE_NVG_Gen1: NVGoggles_OPFOR { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen1"; - ACE_NightVision_grain = 2.25; - ACE_NightVision_blur = 0.22; - ACE_NightVision_radBlur = 0.004; - }; - class ACE_NVG_Gen2: NVGoggles_INDEP { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen2"; - ACE_NightVision_grain = 1.5; - ACE_NightVision_blur = 0.11; - ACE_NightVision_radBlur = 0.002; - }; - /*class ACE_NVG_Gen3: NVGoggles { + class ACE_NVG_Gen1: NVGoggles_OPFOR { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen1"; + ACE_NightVision_grain = 2.25; + ACE_NightVision_blur = 0.22; + ACE_NightVision_radBlur = 0.004; + }; + class ACE_NVG_Gen2: NVGoggles_INDEP { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen2"; + ACE_NightVision_grain = 1.5; + ACE_NightVision_blur = 0.11; + ACE_NightVision_radBlur = 0.002; + }; + /*class ACE_NVG_Gen3: NVGoggles { author = "$STR_ACE_Common_ACETeam"; modelOptics = "\A3\weapons_f\reticle\optics_night"; displayName = "$STR_ACE_NightVision_NVG_Gen3"; ACE_NightVision_grain = 0.75; ACE_NightVision_blur = 0.055; ACE_NightVision_radBlur = 0.001; - };*/ - class ACE_NVG_Gen4: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = "\A3\weapons_f\reticle\optics_night"; - displayName = "$STR_ACE_NightVision_NVG_Gen4"; - ACE_NightVision_grain = 0.0; - ACE_NightVision_blur = 0.0; - ACE_NightVision_radBlur = 0.0; - }; - class ACE_NVG_Wide: NVGoggles { - author = "$STR_ACE_Common_ACETeam"; - modelOptics = QUOTE(PATHTOF(ACE_nvg_wide_optics)); - displayName = "$STR_ACE_NightVision_NVG_FullScreen"; - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - ACE_NightVision_radBlur = 0.001; - }; +};*/ + class ACE_NVG_Gen4: NVGoggles { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = "\A3\weapons_f\reticle\optics_night"; + displayName = "$STR_ACE_NightVision_NVG_Gen4"; + ACE_NightVision_grain = 0.0; + ACE_NightVision_blur = 0.0; + ACE_NightVision_radBlur = 0.0; + }; + class ACE_NVG_Wide: NVGoggles { + author = "$STR_ACE_Common_ACETeam"; + modelOptics = QUOTE(PATHTOF(models\ACE_nvg_wide_optics)); + displayName = "$STR_ACE_NightVision_NVG_FullScreen"; + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + ACE_NightVision_radBlur = 0.001; + }; }; diff --git a/addons/nightvision/ace_nvg_wide_optics.p3d b/addons/nightvision/models/ace_nvg_wide_optics.p3d similarity index 100% rename from addons/nightvision/ace_nvg_wide_optics.p3d rename to addons/nightvision/models/ace_nvg_wide_optics.p3d From e649c8e8532082a4c39930764b7a5314cf625a4b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:07:29 -0600 Subject: [PATCH 18/62] Headers and formating --- addons/nightvision/CfgEventHandlers.hpp | 20 +++---- addons/nightvision/CfgVehicles.hpp | 38 ++++++------ addons/nightvision/XEH_preInit.sqf | 3 +- addons/nightvision/functions/fnc_blending.sqf | 58 +++++++++++++------ .../functions/fnc_changeNVGBrightness.sqf | 33 +++++++++++ .../functions/fnc_decreaseNVGBrightness.sqf | 21 ------- .../functions/fnc_increaseNVGBrightness.sqf | 21 ------- .../functions/fnc_updatePPEffects.sqf | 16 ++++- 8 files changed, 117 insertions(+), 93 deletions(-) create mode 100644 addons/nightvision/functions/fnc_changeNVGBrightness.sqf delete mode 100644 addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf delete mode 100644 addons/nightvision/functions/fnc_increaseNVGBrightness.sqf diff --git a/addons/nightvision/CfgEventHandlers.hpp b/addons/nightvision/CfgEventHandlers.hpp index d76482dd7f..380f190f47 100644 --- a/addons/nightvision/CfgEventHandlers.hpp +++ b/addons/nightvision/CfgEventHandlers.hpp @@ -1,19 +1,19 @@ class Extended_PreInit_EventHandlers { - class ADDON { - init = QUOTE(call COMPILE_FILE(XEH_preInit) ); - }; + class ADDON { + init = QUOTE(call COMPILE_FILE(XEH_preInit) ); + }; }; class Extended_PostInit_EventHandlers { - class ADDON { - clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); - }; + class ADDON { + clientInit = QUOTE(call COMPILE_FILE(XEH_postInitClient) ); + }; }; class Extended_FiredBIS_EventHandlers { - class AllVehicles { - class ADDON { - clientFiredBIS = QUOTE( _this call FUNC(blending) ); + class AllVehicles { + class ADDON { + clientFiredBIS = QUOTE( _this call FUNC(blending) ); + }; }; - }; }; diff --git a/addons/nightvision/CfgVehicles.hpp b/addons/nightvision/CfgVehicles.hpp index 63abfb47e2..d53ce54467 100644 --- a/addons/nightvision/CfgVehicles.hpp +++ b/addons/nightvision/CfgVehicles.hpp @@ -1,22 +1,22 @@ class CfgVehicles { - class All { - ACE_NightVision_grain = 0.75; - ACE_NightVision_blur = 0.055; - }; - - #define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ - name = #ITEM; \ - count = COUNT; \ - }; - - class Box_NATO_Support_F; - class ACE_Box_Misc: Box_NATO_Support_F { - class TransportItems { - MACRO_ADDITEM(ACE_NVG_Gen1,6) - MACRO_ADDITEM(ACE_NVG_Gen2,6) - //MACRO_ADDITEM(ACE_NVG_Gen3,6) - MACRO_ADDITEM(ACE_NVG_Gen4,6) - MACRO_ADDITEM(ACE_NVG_Wide,6) + class All { + ACE_NightVision_grain = 0.75; + ACE_NightVision_blur = 0.055; + }; + +#define MACRO_ADDITEM(ITEM,COUNT) class _xx_##ITEM { \ + name = #ITEM; \ + count = COUNT; \ + }; + + class Box_NATO_Support_F; + class ACE_Box_Misc: Box_NATO_Support_F { + class TransportItems { + MACRO_ADDITEM(ACE_NVG_Gen1,6) + MACRO_ADDITEM(ACE_NVG_Gen2,6) + //MACRO_ADDITEM(ACE_NVG_Gen3,6) + MACRO_ADDITEM(ACE_NVG_Gen4,6) + MACRO_ADDITEM(ACE_NVG_Wide,6) + }; }; - }; }; diff --git a/addons/nightvision/XEH_preInit.sqf b/addons/nightvision/XEH_preInit.sqf index 9f59a01418..27f8ea7d48 100644 --- a/addons/nightvision/XEH_preInit.sqf +++ b/addons/nightvision/XEH_preInit.sqf @@ -3,8 +3,7 @@ ADDON = false; PREP(blending); -PREP(decreaseNVGBrightness); -PREP(increaseNVGBrightness); +PREP(changeNVGBrightness); PREP(updatePPEffects); ADDON = true; diff --git a/addons/nightvision/functions/fnc_blending.sqf b/addons/nightvision/functions/fnc_blending.sqf index df46c62b58..41c61cd687 100644 --- a/addons/nightvision/functions/fnc_blending.sqf +++ b/addons/nightvision/functions/fnc_blending.sqf @@ -1,4 +1,24 @@ -// by commy2 +/* + * Author: commy2 + * Change the blending when the player fires?? + * + * Arguments: + * 0: unit - Object the event handler is assigned to + * 1: weapon - Fired weapon + * 2: muzzle - Muzzle that was used + * 3: mode - Current mode of the fired weapon + * 4: ammo - Ammo used + * 5: magazine - magazine name which was used + * 6: projectile - Object of the projectile that was shot + * + * Return Value: + * Nothing + * + * Example: + * [clientFiredBIS-XEH] call ace_nightvision_fnc_blending + * + * Public: No + */ #include "script_component.hpp" private ["_vehicle", "_weapon", "_ammo", "_magazine", "_player"]; @@ -8,26 +28,26 @@ _weapon = _this select 1; _ammo = _this select 4; _magazine = _this select 5; -if ((_vehicle != (vehicle ACE_player)) || {(currentVisionMode _vehicle) != 1}) exitWith {}; - _player = ACE_player; +if ((_vehicle != (vehicle _player)) || {(currentVisionMode _player) != 1}) exitWith {}; + if (_player != _vehicle && {!(_weapon in (_vehicle weaponsTurret ([_player] call EFUNC(common,getTurretIndex))))}) exitWith {}; private ["_silencer", "_visibleFireCoef", "_visibleFireTimeCoef", "_visibleFire", "_visibleFireTime", "_nvgBrightnessCoef", "_fnc_isTracer", "_darkness"]; _silencer = switch (_weapon) do { - case (primaryWeapon _player) : {primaryWeaponItems _player select 0}; - case (secondaryWeapon _player) : {secondaryWeaponItems _player select 0}; - case (handgunWeapon _player) : {handgunItems _player select 0}; - default {""}; +case (primaryWeapon _player) : {primaryWeaponItems _player select 0}; +case (secondaryWeapon _player) : {secondaryWeaponItems _player select 0}; +case (handgunWeapon _player) : {handgunItems _player select 0}; + default {""}; }; _visibleFireCoef = 1; _visibleFireTimeCoef = 1; if (_silencer != "") then { - _visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire"); - _visibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFireTime"); + _visibleFireCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFire"); + _visibleFireTimeCoef = getNumber (configFile >> "CfgWeapons" >> _silencer >> "ItemInfo" >> "AmmoCoef" >> "visibleFireTime"); }; _visibleFire = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFire"); @@ -36,24 +56,24 @@ _visibleFireTime = getNumber (configFile >> "CfgAmmo" >> _ammo >> "visibleFireTi _nvgBrightnessCoef = 1 + (_player getVariable [QGVAR(NVGBrightness), 0]) / 4; _fnc_isTracer = { - private ["_indexShot", "_lastRoundsTracer", "_tracersEvery"]; + private ["_indexShot", "_lastRoundsTracer", "_tracersEvery"]; - if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false}; + if (getNumber (configFile >> "CfgAmmo" >> _ammo >> "nvgOnly") > 0) exitWith {false}; - _indexShot = (_player ammo _weapon) + 1; + _indexShot = (_player ammo _weapon) + 1; - _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer"); - if (_indexShot <= _lastRoundsTracer) exitWith {true}; + _lastRoundsTracer = getNumber (configFile >> "CfgMagazines" >> _magazine >> "lastRoundsTracer"); + if (_indexShot <= _lastRoundsTracer) exitWith {true}; - _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery"); - if (_tracersEvery == 0) exitWith {false}; + _tracersEvery = getNumber (configFile >> "CfgMagazines" >> _magazine >> "tracersEvery"); + if (_tracersEvery == 0) exitWith {false}; - (_indexShot - _lastRoundsTracer) % _tracersEvery == 0 + (_indexShot - _lastRoundsTracer) % _tracersEvery == 0 }; if (call _fnc_isTracer) then { - _visibleFire = _visibleFire + 2; - _visibleFireTime = _visibleFireTime + 2; + _visibleFire = _visibleFire + 2; + _visibleFireTime = _visibleFireTime + 2; }; _darkness = 1 - (call EFUNC(common,ambientBrightness)); diff --git a/addons/nightvision/functions/fnc_changeNVGBrightness.sqf b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf new file mode 100644 index 0000000000..e1894aba00 --- /dev/null +++ b/addons/nightvision/functions/fnc_changeNVGBrightness.sqf @@ -0,0 +1,33 @@ +/* + * Author: commy2 + * Change the brightness of the unit's NVG + * + * Arguments: + * 0: The Unit + * 1: Change in brightness (1 or -1) + * + * Return Value: + * Nothing + * + * Example: + * [player, 1] call ace_nightvision_fnc_changeNVGBrightness + * + * Public: No + */ +#include "script_component.hpp" + +private ["_brightness"]; + +PARAMS_2(_player,_changeInBrightness); + +_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; + +_brightness = ((round (10 * _brightness + _changeInBrightness) / 10) min 1) max -1; + +_player setVariable [QGVAR(NVGBrightness), _brightness, false]; + +GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; +GVAR(ppEffectNVGBrightness) ppEffectCommit 0; + +[format [(localize "STR_ACE_NightVision_NVGBrightness"), (_brightness * 100)]] call EFUNC(common,displayTextStructured); +playSound "ACE_Sound_Click"; diff --git a/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf b/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf deleted file mode 100644 index 0fb2de9d33..0000000000 --- a/addons/nightvision/functions/fnc_decreaseNVGBrightness.sqf +++ /dev/null @@ -1,21 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private ["_player", "_vehicle", "_brightness"]; - -_player = _this select 0; -_vehicle = _this select 1; - -_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; - -if (_brightness > -1) then { - _brightness = round (10 * _brightness - 1) / 10; - - _player setVariable [QGVAR(NVGBrightness), _brightness, false]; - - GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; - GVAR(ppEffectNVGBrightness) ppEffectCommit 0; - - [format [localize "STR_ACE_NightVision_NVGBrightness", format ["%1%", _brightness * 100]]] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; -}; diff --git a/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf b/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf deleted file mode 100644 index e2143d5a5e..0000000000 --- a/addons/nightvision/functions/fnc_increaseNVGBrightness.sqf +++ /dev/null @@ -1,21 +0,0 @@ -// by commy2 -#include "script_component.hpp" - -private ["_player", "_vehicle", "_brightness"]; - -_player = _this select 0; -_vehicle = _this select 1; - -_brightness = _player getVariable [QGVAR(NVGBrightness), 0]; - -if (_brightness < 1) then { - _brightness = round (10 * _brightness + 1) / 10; - - _player setVariable [QGVAR(NVGBrightness), _brightness, false]; - - GVAR(ppEffectNVGBrightness) ppEffectAdjust [1, 1, _brightness / 4, [0, 0, 0, 0], [0, 0, 0, 1], [0, 0, 0, 1]]; - GVAR(ppEffectNVGBrightness) ppEffectCommit 0; - - [format [localize "STR_ACE_NightVision_NVGBrightness", format ["%1%", _brightness * 100]]] call EFUNC(common,displayTextStructured); - playSound "ACE_Sound_Click"; -}; diff --git a/addons/nightvision/functions/fnc_updatePPEffects.sqf b/addons/nightvision/functions/fnc_updatePPEffects.sqf index 1fdfbb9778..3edfe28e74 100644 --- a/addons/nightvision/functions/fnc_updatePPEffects.sqf +++ b/addons/nightvision/functions/fnc_updatePPEffects.sqf @@ -1,4 +1,18 @@ -//by commy2, PabstMirror and CAA-Picard +/* + * Author: commy2, PabstMirror and CAA-Picard + * Update the ppEffects everytime something changes + * + * Arguments: + * Nothing + * + * Return Value: + * Nothing + * + * Example: + * [someEvent] call ace_nightvision_fnc_updatePPEffects + * + * Public: No + */ #include "script_component.hpp" private ["_currentVehicle", "_grainSetting", "_blurSetting", "_radBlurSetting", "_config"]; From c6c200a6849e5004a387d031bf9d5d7b2de3e5f1 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:24:37 -0600 Subject: [PATCH 19/62] comments --- addons/nightvision/functions/fnc_blending.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/nightvision/functions/fnc_blending.sqf b/addons/nightvision/functions/fnc_blending.sqf index 41c61cd687..96e7f404a5 100644 --- a/addons/nightvision/functions/fnc_blending.sqf +++ b/addons/nightvision/functions/fnc_blending.sqf @@ -29,9 +29,9 @@ _ammo = _this select 4; _magazine = _this select 5; _player = ACE_player; - +//If our vehicle didn't shoot, or we're not in NVG mode, exit if ((_vehicle != (vehicle _player)) || {(currentVisionMode _player) != 1}) exitWith {}; - +//If we are mounted, and it wasn't our weapon system that fired, exit if (_player != _vehicle && {!(_weapon in (_vehicle weaponsTurret ([_player] call EFUNC(common,getTurretIndex))))}) exitWith {}; private ["_silencer", "_visibleFireCoef", "_visibleFireTimeCoef", "_visibleFire", "_visibleFireTime", "_nvgBrightnessCoef", "_fnc_isTracer", "_darkness"]; From b86869d7a1c7e90b5b06b55eec50472d130b9657 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Tue, 17 Feb 2015 22:37:04 -0600 Subject: [PATCH 20/62] UAV-Recharge Headers --- .../functions/fnc_canRefuelUAV.sqf | 30 ++++++++++--------- .../functions/fnc_refuelUAV.sqf | 30 ++++++++++--------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf index 4256ddabf9..aaaac3077d 100644 --- a/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_canRefuelUAV.sqf @@ -1,17 +1,19 @@ -/* fnc_refuel.sqf -* -* Author: marc_book (modified by PabstMirror) -* -* Tests if unit can refuel the target UAV -* -* Argument: -* 0: OBJECT - Player unit -* 1: OBJECT - UAV to test -* -* Return value: -* BOOL -*/ - +/* + * Author: marc_book + * Tests if unit can refuel the target UAV + * + * Arguments: + * 0: Player + * 1: UAV + * + * Return Value: + * Can the player rechange the UAV + * + * Example: + * [player, theUAV] call ace_logistics_uavbattery_fnc_canRefuelUAV + * + * Public: No + */ #include "script_component.hpp" PARAMS_2(_caller,_target); diff --git a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf index 5a248bf812..a23969aa9f 100644 --- a/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf +++ b/addons/logistics_uavbattery/functions/fnc_refuelUAV.sqf @@ -1,17 +1,19 @@ -/* fnc_refuel.sqf -* -* Author: marc_book (modified by PabstMirror) -* -* Starts refueling/recharging the 'Dartar' UAVs -* -* Argument: -* 0: OBJECT - Player unit -* 1: OBJECT - UAV -* -* Return value: -* NOTHING -*/ - +/* + * Author: marc_book + * Starts refueling/recharging the 'Dartar' UAVs + * + * Arguments: + * 0: Player + * 1: UAV + * + * Return Value: + * Nothing + * + * Example: + * [player, theUAV] call ace_logistics_uavbattery_fnc_refuelUAV + * + * Public: No + */ #include "script_component.hpp" PARAMS_2(_caller,_target); From 043987fc9339a70431b459d379f58e05c6459f77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Wed, 18 Feb 2015 18:58:06 -0300 Subject: [PATCH 21/62] basic self actions --- addons/interact_menu/CfgEventHandlers.hpp | 2 +- addons/interact_menu/XEH_clientInit.sqf | 18 +++- addons/interact_menu/XEH_preInit.sqf | 4 + .../functions/fnc_compileMenuSelfAction.sqf | 99 +++++++++++++++++++ .../functions/fnc_keyDownSelfAction.sqf | 11 +++ .../functions/fnc_keyUpSelfAction.sqf | 15 +++ addons/interact_menu/functions/fnc_render.sqf | 43 ++++---- addons/interaction/XEH_clientInit.sqf | 72 -------------- 8 files changed, 172 insertions(+), 92 deletions(-) create mode 100644 addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf create mode 100644 addons/interact_menu/functions/fnc_keyDownSelfAction.sqf create mode 100644 addons/interact_menu/functions/fnc_keyUpSelfAction.sqf diff --git a/addons/interact_menu/CfgEventHandlers.hpp b/addons/interact_menu/CfgEventHandlers.hpp index ae9c93b32e..1301f022d3 100644 --- a/addons/interact_menu/CfgEventHandlers.hpp +++ b/addons/interact_menu/CfgEventHandlers.hpp @@ -13,7 +13,7 @@ class Extended_PostInit_EventHandlers { class Extended_InitPost_EventHandlers { class All { class GVAR(compileMenu) { - init = QUOTE(_this call FUNC(compileMenu)); + init = QUOTE(_this call FUNC(compileMenu);_this call FUNC(compileMenuSelfAction)); }; }; }; \ No newline at end of file diff --git a/addons/interact_menu/XEH_clientInit.sqf b/addons/interact_menu/XEH_clientInit.sqf index a02bf4d558..a2ce5ef8a6 100644 --- a/addons/interact_menu/XEH_clientInit.sqf +++ b/addons/interact_menu/XEH_clientInit.sqf @@ -15,13 +15,27 @@ _fnc = { ["ACE3", "Interact Key", {_this call FUNC(keyDown)}, -[15, [false, false, false]], +[219, [false, false, false]], false, "keydown"] call cba_fnc_registerKeybind; ["ACE3", "Interact Key", {_this call FUNC(keyUp)}, -[15, [false, false, false]], +[219, [false, false, false]], +false, +"keyUp"] call cba_fnc_registerKeybind; + +["ACE3", +"Self Actions Key", +{_this call FUNC(keyDownSelfAction)}, +[219, [false, true, false]], +false, +"keydown"] call cba_fnc_registerKeybind; + +["ACE3", +"Self Actions Key", +{_this call FUNC(keyUpSelfAction)}, +[219, [false, true, false]], false, "keyUp"] call cba_fnc_registerKeybind; \ No newline at end of file diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index 42795d6c75..da01026425 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -10,14 +10,18 @@ PREP(probe); PREP(rotateVectLineGetMap); PREP(rotateVectLine); PREP(keyDown); +PREP(keyDownSelfAction); PREP(keyUp); +PREP(keyUpSelfAction); PREP(compileMenu); +PREP(compileMenuSelfAction); PREP(addAction); PREP(removeAction); GVAR(toRender) = []; GVAR(keyDown) = false; +GVAR(keyDownSelfAction) = false; GVAR(keyDownTime) = 0; GVAR(lastTime) = diag_tickTime; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf new file mode 100644 index 0000000000..0c057d7296 --- /dev/null +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -0,0 +1,99 @@ +//fnc_compileMenuSelfAction.sqf +#include "script_component.hpp"; +// diag_log text format["COMPILE ACTIONS: %1", _this]; + +_object = _this select 0; +_objectType = typeOf _object; + + +/* +displayName = "$STR_ACE_Hearing_Earbuds_On"; +condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarBuds' in items _player} ); +statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); +showDisabled = 0; +priority = 2.5; +icon = PATHTOF(UI\ACE_earplugs_x_ca.paa); +hotkey = "E"; +enableInside = 1; +*/ + +/* +[ + [ + "Launch", + "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + [0,0,0], + { (_this select 0) setVelocity [0,0,10]; }, + { true }, + 1, + [] + ] +] +*/ + +_actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; + + +_recurseFnc = { + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_condition", "_showDisabled", + "_enableInside", "_children", "_entry", "_actionsCfg"]; + _actions = []; + _actionsCfg = _this select 0; + for "_i" from 0 to (count _actionsCfg)-1 do { + _entryCfg = _actionsCfg select _i; + if(isClass _entryCfg) then { + _displayName = getText (_entryCfg >> "displayName"); + _icon = getText (_entryCfg >> "icon"); + _statement = compile (getText (_entryCfg >> "statement")); + + _condition = getText (_entryCfg >> "condition"); + if (_condition == "") then {_condition = "true"}; + + // Add canInteract (including exceptions) and canInteractWith to condition + _condition = _condition + format [QUOTE( && {%1 call EGVAR(common,canInteract)} && {[ARR_2(ACE_player, _target)] call EFUNC(common,canInteractWith)} ), getArray (_entryCfg >> "exceptions")]; + + _showDisabled = getNumber (_entryCfg >> "showDisabled"); + _enableInside = getNumber (_entryCfg >> "enableInside"); + + _condition = compile _condition; + // diag_log text format["_condition: %1", _condition]; + _children = []; + if(isArray (_entryCfg >> "subMenu")) then { + _subMenuDef = getArray (_entryCfg >> "subMenu"); + _childMenuName = _subMenuDef select 0; + _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions" >> _childMenuName; + _children = [_childMenuCfg] call _recurseFnc; + }; + _entry = [ + _displayName, + _icon, + [0,0,0], + _statement, + _condition, + 3, //distace + _children, + GVAR(uidCounter) + ]; + GVAR(uidCounter) = GVAR(uidCounter) + 1; + _actions pushBack _entry; + }; + }; + _actions +}; + +_actions = [_actionsCfg] call _recurseFnc; + +_actions = [[ + "Self Actions", + "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", + "Spine3", + { true }, + { true }, + 5, + _actions, + GVAR(uidCounter) +] +]; +GVAR(uidCounter) = GVAR(uidCounter) + 1; + +_object setVariable [QUOTE(GVAR(selfActionData)), _actions]; diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf new file mode 100644 index 0000000000..b44fed6457 --- /dev/null +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -0,0 +1,11 @@ +//fnc_keyDownSelfAction.sqf +#include "script_component.hpp" + +if(!GVAR(keyDownSelfAction)) then { + GVAR(keyDownSelfAction) = true; + GVAR(keyDown) = false; + GVAR(keyDownTime) = diag_tickTime; + + GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; +}; +true diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf new file mode 100644 index 0000000000..0029e3bd05 --- /dev/null +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -0,0 +1,15 @@ +//fnc_keyUp.sqf +#include "script_component.hpp" + +GVAR(keyDownSelfAction) = false; +if(GVAR(actionSelected)) then { + this = GVAR(selectedTarget); + _player = ACE_Player; + _target = GVAR(selectedTarget); + [GVAR(selectedTarget), player] call GVAR(selectedAction); +}; +GVAR(expanded) = false; +GVAR(lastPath) = []; +GVAR(menuDepthPath) = []; +GVAR(vecLineMap) = []; +true diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 29033e3407..ba444c1a7a 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -6,7 +6,7 @@ _foundTarget = false; _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; GVAR(currentOptions) = []; -if((count GVAR(toRender)) > 0 && GVAR(keyDown)) then { +if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) then { if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { GVAR(lastPos) = getPosASL player; _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; @@ -15,23 +15,32 @@ if((count GVAR(toRender)) > 0 && GVAR(keyDown)) then { _p = (_cursorVec call CBA_fnc_vect2polar); _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; - + GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); }; - { - if(!(_forEachIndex in GVAR(filter))) then { - GVAR(renderDepth) = 0; - _renderTargets = _x; - { - [_renderTargets select 0, _x, 0] call FUNC(renderMenu); - } forEach (_renderTargets select 1); - }; - } forEach GVAR(toRender); + if (GVAR(keyDown)) then { + // Render all nearby interaction menus + { + if(!(_forEachIndex in GVAR(filter))) then { + GVAR(renderDepth) = 0; + _renderTargets = _x; + { + [_renderTargets select 0, _x, 0] call FUNC(renderMenu); + } forEach (_renderTargets select 1); + }; + } forEach GVAR(toRender); + } else { + // Render only the self action menu + _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset); + [ACE_player, _actions, 0, _pos] call FUNC(renderMenu); + }; + // player sideChat format["c: %1", count GVAR(toRender)]; }; -if(GVAR(keyDown)) then { - +if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { + _cursorScreenPos = worldToScreen _cursorPos2; _closestDistance = 1000000; _closestSelection = -1; @@ -46,11 +55,11 @@ if(GVAR(keyDown)) then { }; }; } forEach GVAR(currentOptions); - + if(_closestSelection != -1) then { - + _closest = GVAR(currentOptions) select _closestSelection; - + _pos = _closest select 1; _cTime = diag_tickTime; _delta = _cTime - GVAR(lastTime); @@ -75,7 +84,7 @@ if(GVAR(keyDown)) then { }; } forEach GVAR(lastPath); }; - + if(_misMatch) then { GVAR(lastPath) = _hoverPath; GVAR(startHoverTime) = diag_tickTime; diff --git a/addons/interaction/XEH_clientInit.sqf b/addons/interaction/XEH_clientInit.sqf index 047e528ad6..85232d1fcd 100644 --- a/addons/interaction/XEH_clientInit.sqf +++ b/addons/interaction/XEH_clientInit.sqf @@ -16,78 +16,6 @@ GVAR(isOpeningDoor) = false; // Add keybinds -["ACE3", - localize "STR_ACE_Interaction_InteractionMenu", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(isNull (findDisplay 1713999)) exitWith {false}; - - // Statement - call FUNC(onButtonDown); - true - }, - [219, [false, false, false]], - false, - "keydown" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenu", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(!isNull (findDisplay 1713999) && {QGVAR(AutoCloseMenu)}) exitWith {false}; - - // Statement - if (GVAR(MenuType) mod 2 == 0) then {call FUNC(onButtonUp)}; - true - }, - [219, [false, false, false]], - false, - "keyup" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenuSelf", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming", "ACE_Common_notOnMap"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(isNull (findDisplay 1713999)) exitWith {false}; - - // Statement - call FUNC(onButtonDownSelf); - true - }, - [219, [false, true, false]], - false, - "keydown" -] call cba_fnc_registerKeybind; - -["ACE3", - localize "STR_ACE_Interaction_InteractionMenuSelf", - { - // Conditions: canInteract - _exceptions = ["ACE_Drag_isNotDragging", "ACE_Medical_canTreat", QEGVAR(captives,isNotEscorting), QEGVAR(captives,isNotSurrendering), "ACE_Interaction_isNotSwimming"]; - if !(_exceptions call EGVAR(common,canInteract)) exitWith {false}; - // Conditions: specific - if !(!isNull (findDisplay 1713999) && {QGVAR(AutoCloseMenu)}) exitWith {false}; - - // Statement - if (GVAR(MenuType) mod 2 == 1) then {call FUNC(onButtonUp)}; - true - }, - [219, [false, true, false]], - false, - "keyup" -] call cba_fnc_registerKeybind; - ["ACE3", localize "STR_ACE_Interaction_OpenDoor", { From 244d7a5572735c086184dab89e338fda3b1cd31c Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 03:02:58 -0600 Subject: [PATCH 22/62] Fix opacity fading on other render levels --- addons/interact_menu/functions/fnc_renderIcon.sqf | 5 +---- addons/interact_menu/functions/fnc_renderMenu.sqf | 6 +++--- 2 files changed, 4 insertions(+), 7 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 39b4b120b9..30821ffdac 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -18,12 +18,9 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = "" + _text; + _text = format ["%3", _icon, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - _ctrl ctrlSetForegroundColor _color; - _opacity = _color select 3; - _control ctrlSetTextColor _color; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 0337d4e8c9..3635241426 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -25,13 +25,13 @@ if(_cursorScreenPos distance _pos <= _distance) then { }; _menuDepth = (count GVAR(menuDepthPath)); - _opacity = 1; + _color = "#FFFFFFFF"; // ARGB Color (First Hex Pair is transparancy) if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - _opacity = ((GVAR(renderDepth)/_menuDepth)) max 0.25; + _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; _path set[(count _path), _index]; // player sideChat format["r: %1", _actionData select 2]; - [_actionData select 0, [1,1,1,_opacity], _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); + [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; _currentRenderDepth = GVAR(renderDepth); From 8c833206752f625396fec58977721e6b3719313d Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:32:41 +0200 Subject: [PATCH 23/62] Separated dialing phone code into separate function to neaten up the original function. --- addons/explosives/functions/fnc_dialPhone.sqf | 28 +----------- .../explosives/functions/fnc_dialingPhone.sqf | 44 +++++++++++++++++++ 2 files changed, 45 insertions(+), 27 deletions(-) create mode 100644 addons/explosives/functions/fnc_dialingPhone.sqf diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index 3bb2cc45e8..f694ff3d5f 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -28,33 +28,7 @@ for [{_i=0}, {_i<_ran}, {_i=_i+1}] do { }; if (_unit == ace_player) then { ctrlSetText [1400,"Calling"]; - [{ - EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); - if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; - }; - ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; - if (_i >= (count _arr + 2)) then { - [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { - [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); - }; - _unit setVariable [QGVAR(Dialing), false, true]; - if (_unit == ace_player) then { - ctrlSetText [1400,"Call Ended!"]; - }; - }; - if (_i == (count _arr)) then { - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; - }; - }; - (_this select 0) set [1, _i + 1]; - }, 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); + [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); } else { private ["_explosive"]; _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf new file mode 100644 index 0000000000..7b71d0e5af --- /dev/null +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -0,0 +1,44 @@ +/* + * Author: Garth 'L-H' de Wet + * Performs the dial tones and detonation of explosive. + * + * Arguments: + * 0: Unit to do dialing + * 1: Index + * 2: Dialing points + * 3: IED code + * + * Return Value: + * None + * + * Example: + * [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); + * + * Public: No + */ +#include "script_component.hpp" +EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); +if ((_i mod 4) == 0) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; +}; +ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; +if (_i >= (count _arr + 2)) then { + [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + }; + _unit setVariable [QGVAR(Dialing), false, true]; + if (_unit == ace_player) then { + ctrlSetText [1400,"Call Ended!"]; + }; +}; +if (_i == (count _arr)) then { + private "_explosive"; + _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (!isNull (_explosive)) then { + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + }; +}; +(_this select 0) set [1, _i + 1]; From 00643c3c83011b1d5038f4213e87d2733f1871f9 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:39:13 +0200 Subject: [PATCH 24/62] Ensured actual fuse time is used instead of simply 1. --- addons/explosives/functions/fnc_addCellphoneIED.sqf | 2 +- addons/explosives/functions/fnc_dialingPhone.sqf | 12 ++++++------ .../functions/fnc_getSpeedDialExplosive.sqf | 2 +- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index b13473cf25..49bec07f1b 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -43,7 +43,7 @@ while {!_codeSet} do { if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; }; -_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code]; +_count = GVAR(CellphoneIEDs) pushBack [_explosive,_code,GetNumber(ConfigFile >> "CfgMagazines" >> _magazineClass >> "ACE_Triggers" >> "Cellphone" >> "FuseTime")]; _count = _count + 1; publicVariable QGVAR(CellphoneIEDs); _unit sideChat format ["IED %1 code: %2", _count,_code]; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 7b71d0e5af..c50f618abe 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -22,12 +22,14 @@ if ((_i mod 4) == 0) then { playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; + +private "_explosive"; +_explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); + if (_i >= (count _arr + 2)) then { [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { - [_unit, -1, [_explosive, 1]] call FUNC(detonateExplosive); + [_unit, -1, [_explosive select 0, _explosive select 2]] call FUNC(detonateExplosive); }; _unit setVariable [QGVAR(Dialing), false, true]; if (_unit == ace_player) then { @@ -35,10 +37,8 @@ if (_i >= (count _arr + 2)) then { }; }; if (_i == (count _arr)) then { - private "_explosive"; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL _explosive,3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index f5b3172c46..c00f15b5ed 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -21,7 +21,7 @@ if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; _explosive = objNull; { if ((_x select 1) == _code) exitWith { - _explosive = _x select 0; + _explosive = _x; }; false } count GVAR(CellphoneIEDs); From 89a81dbed1d5ddcc6b8dcb7f8ad9d0a6b9aed677 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 12:40:21 +0200 Subject: [PATCH 25/62] Forgotten function added. --- addons/explosives/XEH_preInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/explosives/XEH_preInit.sqf b/addons/explosives/XEH_preInit.sqf index d8f8dc1216..3747151d16 100644 --- a/addons/explosives/XEH_preInit.sqf +++ b/addons/explosives/XEH_preInit.sqf @@ -25,6 +25,7 @@ PREP(canDetonate); PREP(defuseExplosive); PREP(detonateExplosive); PREP(dialPhone); +PREP(dialingPhone); PREP(handleScrollWheel); From f5a6f6f4047524e081eef354892e72e188fb0906 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 15:30:01 +0200 Subject: [PATCH 26/62] Fixed various points raised in the PR. --- addons/explosives/functions/fnc_dialPhone.sqf | 6 +++--- addons/explosives/functions/fnc_dialingPhone.sqf | 2 +- addons/explosives/functions/fnc_setSpeedDial.sqf | 4 +--- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index f694ff3d5f..58d3dab716 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -34,9 +34,9 @@ if (_unit == ace_player) then { _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); if (!isNull (_explosive)) then { [{ - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_this select 1),3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; - }, [_unit,_explosive], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); - [_explosive,0.25 * (count _arr - 1)] call FUNC(startTimer); + }, [_unit,_explosive select 0], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); + [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2)] call FUNC(startTimer); }; }; diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index c50f618abe..003fd734c1 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -38,7 +38,7 @@ if (_i >= (count _arr + 2)) then { }; if (_i == (count _arr)) then { if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosATL (_explosive select 0),3.16228,1,75]; + playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_setSpeedDial.sqf b/addons/explosives/functions/fnc_setSpeedDial.sqf index 20a32a1224..adb2e6af03 100644 --- a/addons/explosives/functions/fnc_setSpeedDial.sqf +++ b/addons/explosives/functions/fnc_setSpeedDial.sqf @@ -20,9 +20,7 @@ _speedDial = ace_player getVariable [QGVAR(SpeedDial), []]; if (count _speedDial == 0) exitWith {}; _amount = if((_this select 0))then{1}else{-1}; -GVAR(CurrentSpeedDial) = GVAR(CurrentSpeedDial) + _amount; -GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) < 0)then{(count _speedDial)-1}else{GVAR(CurrentSpeedDial)}; -GVAR(CurrentSpeedDial) = if(GVAR(CurrentSpeedDial) >= (count _speedDial))then{0}else{GVAR(CurrentSpeedDial)}; +GVAR(CurrentSpeedDial) = (GVAR(CurrentSpeedDial) + _amount + count _speedDial) mod (count _speedDial); ctrlSetText [1400,(_speedDial select GVAR(CurrentSpeedDial)) select 1]; ctrlSetText [1401,(_speedDial select GVAR(CurrentSpeedDial)) select 0]; From 8e6600d5ec3e9b00b7e987c005a36056704deecb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:36:59 -0300 Subject: [PATCH 27/62] Tweak distances --- addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf | 4 ++-- addons/interact_menu/functions/fnc_keyUp.sqf | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 0c057d7296..923b65e954 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -70,7 +70,7 @@ _recurseFnc = { [0,0,0], _statement, _condition, - 3, //distace + 10, //distace _children, GVAR(uidCounter) ]; @@ -89,7 +89,7 @@ _actions = [[ "Spine3", { true }, { true }, - 5, + 10, _actions, GVAR(uidCounter) ] diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 8f91b1322d..413fff11ad 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -1,4 +1,4 @@ -//fnc_keyUp.sqf +//fnc_keyUpSelfAction.sqf #include "script_component.hpp" GVAR(keyDown) = false; From 3b35d9d109bcab5af3c1c43c19379c30340ccfe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:38:09 -0300 Subject: [PATCH 28/62] Make interact sub menus open as circle sectors instead of full circles --- addons/interact_menu/functions/fnc_render.sqf | 6 +- .../functions/fnc_renderMenu.sqf | 72 ++++++++++++------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index ba444c1a7a..a4b699aab3 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -25,15 +25,15 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the GVAR(renderDepth) = 0; _renderTargets = _x; { - [_renderTargets select 0, _x, 0] call FUNC(renderMenu); + [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); } forEach (_renderTargets select 1); }; } forEach GVAR(toRender); } else { // Render only the self action menu _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; - _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset); - [ACE_player, _actions, 0, _pos] call FUNC(renderMenu); + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; + [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); }; // player sideChat format["c: %1", count GVAR(toRender)]; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 0337d4e8c9..80f39b91c5 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -5,11 +5,14 @@ private ["_object", "_actionData", "_distance", "_index", "_pos", "_cursorScreen _object = _this select 0; _actionData = _this select 1; -_distance = _actionData select 5; _index = _this select 2; +_angles = _this select 3; -if((count _this) > 3) then { - _pos = _this select 3; +_distance = _actionData select 5; +EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); + +if((count _this) > 4) then { + _pos = _this select 4; } else { if(typeName (_actionData select 2) == "ARRAY") then { _pos = _object modelToWorld (_actionData select 2); @@ -20,8 +23,8 @@ if((count _this) > 3) then { _cursorScreenPos = (positionCameraToWorld [0, 0, 0]); if(_cursorScreenPos distance _pos <= _distance) then { _path = []; - if((count _this) > 4) then { - _path = +(_this select 4); + if((count _this) > 5) then { + _path = +(_this select 5); }; _menuDepth = (count GVAR(menuDepthPath)); @@ -37,27 +40,46 @@ if(_cursorScreenPos distance _pos <= _distance) then { _currentRenderDepth = GVAR(renderDepth); GVAR(renderDepth) = GVAR(renderDepth) + 1; if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { - _radialOffset = 0; + // Count how many actions are active + private "_numActions"; + _numActions = 0; { - // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - // diag_log text format["_active: %1: %2", (_x select 0), _active]; - if(_active) then { - _offset = [GVAR(vecLineMap), (270*(GVAR(renderDepth)%2))-(_radialOffset*45)] call FUNC(rotateVectLine); - _mod = 0.1*_distance; - _newPos = [ - (_pos select 0) + ((_offset select 0)*_mod), - (_pos select 1) + ((_offset select 1)*_mod), - (_pos select 2) + ((_offset select 2)*_mod) - ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; - [_object, _x, _forEachIndex, _newPos, _path] call FUNC(renderMenu); - _radialOffset = _radialOffset + 1; - }; - // }; + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + if(_active) then { + _numActions = _numActions + 1; + }; + } forEach (_actionData select 6); + systemChat format ["_numActions: %1", _numActions]; + + private "_angleSpan"; + _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + + private "_angle"; + _angle = _centerAngle - _angleSpan / 2; + { + // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + // diag_log text format["_active: %1: %2", (_x select 0), _active]; + if(_active) then { + systemChat format ["_angle: %1", _angle]; + _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); + _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _newPos = [ + (_pos select 0) + ((_offset select 0)*_mod), + (_pos select 1) + ((_offset select 1)*_mod), + (_pos select 2) + ((_offset select 2)*_mod) + ]; + // drawLine3D [_pos, _newPos, [1,0,0,1]]; + [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); + _angle = _angle + _angleSpan / (_numActions); + }; + // }; } forEach (_actionData select 6); }; GVAR(renderDepth) = GVAR(renderDepth) - 1; From d05531566120e4705d72c852fc33936f88ff8a3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 10:49:36 -0300 Subject: [PATCH 29/62] interact_menu: tab to space --- .../functions/fnc_compileMenu.sqf | 4 +- .../interact_menu/functions/fnc_keyDown.sqf | 4 +- .../functions/fnc_keyDownSelfAction.sqf | 8 +- addons/interact_menu/functions/fnc_keyUp.sqf | 4 +- .../functions/fnc_keyUpSelfAction.sqf | 4 +- addons/interact_menu/functions/fnc_probe.sqf | 2 +- addons/interact_menu/functions/fnc_render.sqf | 174 +++++++++--------- .../functions/fnc_renderIcon.sqf | 20 +- .../functions/fnc_renderMenu.sqf | 125 +++++++------ 9 files changed, 172 insertions(+), 173 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 1b5e803ad6..647a78c7b2 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -77,7 +77,7 @@ _recurseFnc = { _children, GVAR(uidCounter) ]; - GVAR(uidCounter) = GVAR(uidCounter) + 1; + GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; }; @@ -97,6 +97,6 @@ _actions = [[ GVAR(uidCounter) ] ]; -GVAR(uidCounter) = GVAR(uidCounter) + 1; +GVAR(uidCounter) = GVAR(uidCounter) + 1; _object setVariable [QUOTE(GVAR(actionData)), _actions]; \ No newline at end of file diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index e18ec69ae8..fdd39e7dc8 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -2,7 +2,7 @@ #include "script_component.hpp" if(!GVAR(keyDown)) then { - GVAR(keyDown) = true; - GVAR(keyDownTime) = diag_tickTime; + GVAR(keyDown) = true; + GVAR(keyDownTime) = diag_tickTime; }; true diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf index b44fed6457..8e86cfd430 100644 --- a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -2,10 +2,10 @@ #include "script_component.hpp" if(!GVAR(keyDownSelfAction)) then { - GVAR(keyDownSelfAction) = true; - GVAR(keyDown) = false; - GVAR(keyDownTime) = diag_tickTime; + GVAR(keyDownSelfAction) = true; + GVAR(keyDown) = false; + GVAR(keyDownTime) = diag_tickTime; - GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; + GVAR(selfMenuOffset) = [sin getDir ACE_player, cos getDir ACE_player, 0] vectorMultiply 2; }; true diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 413fff11ad..922a5dedce 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -3,10 +3,10 @@ GVAR(keyDown) = false; if(GVAR(actionSelected)) then { - this = GVAR(selectedTarget); + this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index 0029e3bd05..b0023300bf 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -3,10 +3,10 @@ GVAR(keyDownSelfAction) = false; if(GVAR(actionSelected)) then { - this = GVAR(selectedTarget); + this = GVAR(selectedTarget); _player = ACE_Player; _target = GVAR(selectedTarget); - [GVAR(selectedTarget), player] call GVAR(selectedAction); + [GVAR(selectedTarget), player] call GVAR(selectedAction); }; GVAR(expanded) = false; GVAR(lastPath) = []; diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index 1f178180be..c7386c9bc6 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -9,7 +9,7 @@ if(!GVAR(keyDown)) then { { _actionObject = _x; _actionData = _actionObject getVariable [QUOTE(GVAR(actionData)), []]; - + if((count _actionData) > 0) then { _renderData = []; { diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index a4b699aab3..a6795e50a0 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -7,107 +7,107 @@ _cursorPos1 = positionCameraToWorld [0, 0, 0]; _cursorPos2 = positionCameraToWorld [0, 0, 2]; GVAR(currentOptions) = []; if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) then { - if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { - GVAR(lastPos) = getPosASL player; - _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; - _p1 = [0,0,0]; - _p2 = +_cursorVec; - _p = (_cursorVec call CBA_fnc_vect2polar); - _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; - _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; + if((count GVAR(vecLineMap)) == 0 || ((count GVAR(menuDepthPath)) > 0 && (getPosASL player) distance GVAR(lastPos) > 0.01)) then { + GVAR(lastPos) = getPosASL player; + _cursorVec = [_cursorPos2, _cursorPos1] call BIS_fnc_vectorFromXtoY; + _p1 = [0,0,0]; + _p2 = +_cursorVec; + _p = (_cursorVec call CBA_fnc_vect2polar); + _v = [(_p select 0), (_p select 1), (_p select 2)+90] call CBA_fnc_polar2vect; + _cp = [_cursorVec, _v] call BIS_fnc_crossProduct; - GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); - }; - if (GVAR(keyDown)) then { - // Render all nearby interaction menus - { - if(!(_forEachIndex in GVAR(filter))) then { - GVAR(renderDepth) = 0; - _renderTargets = _x; - { - [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); - } forEach (_renderTargets select 1); - }; - } forEach GVAR(toRender); - } else { - // Render only the self action menu - _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; - _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; - [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); - }; + GVAR(vecLineMap) = [_cp, _p1, _p2] call FUNC(rotateVectLineGetMap); + }; + if (GVAR(keyDown)) then { + // Render all nearby interaction menus + { + if(!(_forEachIndex in GVAR(filter))) then { + GVAR(renderDepth) = 0; + _renderTargets = _x; + { + [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); + } forEach (_renderTargets select 1); + }; + } forEach GVAR(toRender); + } else { + // Render only the self action menu + _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; + _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; + [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); + }; - // player sideChat format["c: %1", count GVAR(toRender)]; + // player sideChat format["c: %1", count GVAR(toRender)]; }; if(GVAR(keyDown) || GVAR(keyDownSelfAction)) then { - _cursorScreenPos = worldToScreen _cursorPos2; - _closestDistance = 1000000; - _closestSelection = -1; - { - _pos = _x select 1; - _sPos = worldToScreen _pos; - if(count _sPos > 0) then { - _disSq = (((_cursorScreenPos select 0) - (_sPos select 0))^2 + ((_cursorScreenPos select 1) - (_sPos select 1))^2); - if(_disSq < 0.0125 && _disSq < _closestDistance) then { - _closestDistance = _disSq; - _closestSelection = _forEachIndex; - }; - }; - } forEach GVAR(currentOptions); + _cursorScreenPos = worldToScreen _cursorPos2; + _closestDistance = 1000000; + _closestSelection = -1; + { + _pos = _x select 1; + _sPos = worldToScreen _pos; + if(count _sPos > 0) then { + _disSq = (((_cursorScreenPos select 0) - (_sPos select 0))^2 + ((_cursorScreenPos select 1) - (_sPos select 1))^2); + if(_disSq < 0.0125 && _disSq < _closestDistance) then { + _closestDistance = _disSq; + _closestSelection = _forEachIndex; + }; + }; + } forEach GVAR(currentOptions); - if(_closestSelection != -1) then { + if(_closestSelection != -1) then { - _closest = GVAR(currentOptions) select _closestSelection; + _closest = GVAR(currentOptions) select _closestSelection; - _pos = _closest select 1; - _cTime = diag_tickTime; - _delta = _cTime - GVAR(lastTime); - GVAR(lastTime) = _cTime; - GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); - if(GVAR(rotationAngle) > 360) then { - GVAR(rotationAngle) = GVAR(rotationAngle) - 360; - }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; - _foundTarget = true; - GVAR(actionSelected) = true; - GVAR(selectedTarget) = (_closest select 0) select 0; - GVAR(selectedAction) = ((_closest select 0) select 1) select 3; - _misMatch = false; - _hoverPath = (_closest select 2); - if((count GVAR(lastPath)) != (count _hoverPath)) then { - _misMatch = true; - } else { - { - if(_x != (_hoverPath select _forEachIndex)) exitWith { - _misMatch = true; - }; - } forEach GVAR(lastPath); - }; + _pos = _closest select 1; + _cTime = diag_tickTime; + _delta = _cTime - GVAR(lastTime); + GVAR(lastTime) = _cTime; + GVAR(rotationAngle) = GVAR(rotationAngle) + (180*_delta); + if(GVAR(rotationAngle) > 360) then { + GVAR(rotationAngle) = GVAR(rotationAngle) - 360; + }; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selectover_ca.paa", [1,0,0,.75], _pos, 0.6*SafeZoneW, 0.6*SafeZoneW, GVAR(rotationAngle), "", 0.5, 0.025, "TahomaB"]; + _foundTarget = true; + GVAR(actionSelected) = true; + GVAR(selectedTarget) = (_closest select 0) select 0; + GVAR(selectedAction) = ((_closest select 0) select 1) select 3; + _misMatch = false; + _hoverPath = (_closest select 2); + if((count GVAR(lastPath)) != (count _hoverPath)) then { + _misMatch = true; + } else { + { + if(_x != (_hoverPath select _forEachIndex)) exitWith { + _misMatch = true; + }; + } forEach GVAR(lastPath); + }; - if(_misMatch) then { - GVAR(lastPath) = _hoverPath; - GVAR(startHoverTime) = diag_tickTime; - GVAR(expanded) = false; - } else { - if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { - GVAR(expanded) = true; - GVAR(menuDepthPath) = +GVAR(lastPath); - }; - }; - }; - drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; + if(_misMatch) then { + GVAR(lastPath) = _hoverPath; + GVAR(startHoverTime) = diag_tickTime; + GVAR(expanded) = false; + } else { + if(!GVAR(expanded) && diag_tickTime-GVAR(startHoverTime) > 0.25) then { + GVAR(expanded) = true; + GVAR(menuDepthPath) = +GVAR(lastPath); + }; + }; + }; + drawIcon3D ["\a3\ui_f\data\IGUI\Cfg\Cursors\selected_ca.paa", [1,0,0,1], _cursorPos2, 1, 1, 0, "", 0.5, 0.025, "TahomaB"]; }; if(!_foundTarget && GVAR(actionSelected)) then { - GVAR(actionSelected) = false; - GVAR(expanded) = false; - GVAR(lastPath) = []; - if(!GVAR(keyDown)) then { - GVAR(vecLineMap) = []; - }; + GVAR(actionSelected) = false; + GVAR(expanded) = false; + GVAR(lastPath) = []; + if(!GVAR(keyDown)) then { + GVAR(vecLineMap) = []; + }; }; for "_i" from GVAR(iconCount) to (count GVAR(iconCtrls))-1 do { - ctrlDelete (GVAR(iconCtrls) select _i); + ctrlDelete (GVAR(iconCtrls) select _i); }; GVAR(iconCtrls) resize GVAR(iconCount); GVAR(iconCount) = 0; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 30821ffdac..4aa5e29aff 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -9,18 +9,18 @@ _icon = _this select 6; _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { - // player sideChat format["render!"]; - if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { - GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); - }; - _ctrl = GVAR(iconCtrls) select GVAR(iconCount); - GVAR(iconCount) = GVAR(iconCount) + 1; + // player sideChat format["render!"]; + if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { + GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); + }; + _ctrl = GVAR(iconCtrls) select GVAR(iconCount); + GVAR(iconCount) = GVAR(iconCount) + 1; if(_icon == "") then { _icon = DEFAULT_ICON; }; _text = format ["%3", _icon, _color, _text]; - _ctrl ctrlSetStructuredText (parseText _text); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - // _ctrl ctrlSetBackgroundColor [1,0,0,1]; - _ctrl ctrlCommit 0; + _ctrl ctrlSetStructuredText (parseText _text); + _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; + // _ctrl ctrlSetBackgroundColor [1,0,0,1]; + _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 3510037b0b..1072a53906 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -12,75 +12,74 @@ _distance = _actionData select 5; EXPLODE_2_PVT(_angles,_centerAngle,_maxAngleSpan); if((count _this) > 4) then { - _pos = _this select 4; + _pos = _this select 4; } else { - if(typeName (_actionData select 2) == "ARRAY") then { - _pos = _object modelToWorld (_actionData select 2); - } else { - _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); - }; + if(typeName (_actionData select 2) == "ARRAY") then { + _pos = _object modelToWorld (_actionData select 2); + } else { + _pos = _object modelToWorld (_object selectionPosition (_actionData select 2)); + }; }; _cursorScreenPos = (positionCameraToWorld [0, 0, 0]); if(_cursorScreenPos distance _pos <= _distance) then { - _path = []; - if((count _this) > 5) then { - _path = +(_this select 5); - }; - _menuDepth = (count GVAR(menuDepthPath)); + _path = []; + if((count _this) > 5) then { + _path = +(_this select 5); + }; + _menuDepth = (count GVAR(menuDepthPath)); - _color = "#FFFFFFFF"; // ARGB Color (First Hex Pair is transparancy) - if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + // ARGB Color (First Hex Pair is transparancy) + _color = "#FFFFFFFF"; + if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; - }; - _path set[(count _path), _index]; - // player sideChat format["r: %1", _actionData select 2]; - [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); - GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; - _currentRenderDepth = -1; - _currentRenderDepth = GVAR(renderDepth); - GVAR(renderDepth) = GVAR(renderDepth) + 1; - if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { - // Count how many actions are active - private "_numActions"; - _numActions = 0; - { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - if(_active) then { - _numActions = _numActions + 1; - }; - } forEach (_actionData select 6); - systemChat format ["_numActions: %1", _numActions]; + }; + _path set[(count _path), _index]; + // player sideChat format["r: %1", _actionData select 2]; + [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); + GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; + _currentRenderDepth = -1; + _currentRenderDepth = GVAR(renderDepth); + GVAR(renderDepth) = GVAR(renderDepth) + 1; + if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { + // Count how many actions are active + private "_numActions"; + _numActions = 0; + { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + if(_active) then { + _numActions = _numActions + 1; + }; + } forEach (_actionData select 6); + systemChat format ["_numActions: %1", _numActions]; - private "_angleSpan"; - _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + private "_angleSpan"; + _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); - private "_angle"; - _angle = _centerAngle - _angleSpan / 2; - { - // if(_index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { - this = _object; - _target = _object; - _player = ACE_player; - _active = [_object, ACE_player] call (_x select 4); - // diag_log text format["_active: %1: %2", (_x select 0), _active]; - if(_active) then { - systemChat format ["_angle: %1", _angle]; - _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); - _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; - _newPos = [ - (_pos select 0) + ((_offset select 0)*_mod), - (_pos select 1) + ((_offset select 1)*_mod), - (_pos select 2) + ((_offset select 2)*_mod) - ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; - [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / (_numActions); - }; - // }; - } forEach (_actionData select 6); - }; - GVAR(renderDepth) = GVAR(renderDepth) - 1; + private "_angle"; + _angle = _centerAngle - _angleSpan / 2; + { + this = _object; + _target = _object; + _player = ACE_player; + _active = [_object, ACE_player] call (_x select 4); + // diag_log text format["_active: %1: %2", (_x select 0), _active]; + if(_active) then { + systemChat format ["_angle: %1", _angle]; + _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); + _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _newPos = [ + (_pos select 0) + ((_offset select 0)*_mod), + (_pos select 1) + ((_offset select 1)*_mod), + (_pos select 2) + ((_offset select 2)*_mod) + ]; + // drawLine3D [_pos, _newPos, [1,0,0,1]]; + [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); + _angle = _angle + _angleSpan / (_numActions); + }; + } forEach (_actionData select 6); + }; + GVAR(renderDepth) = GVAR(renderDepth) - 1; }; From 96404bc42a0bacf839cf73bcbc15ac056ae0f517 Mon Sep 17 00:00:00 2001 From: Garth L-H de Wet Date: Thu, 19 Feb 2015 15:59:14 +0200 Subject: [PATCH 30/62] Fixed isNull check not working. Fixed audio not being found. --- .../functions/fnc_addCellphoneIED.sqf | 2 +- addons/explosives/functions/fnc_dialPhone.sqf | 6 +- .../explosives/functions/fnc_dialingPhone.sqf | 10 +- .../functions/fnc_getSpeedDialExplosive.sqf | 13 +- .../functions/fnc_place_Approve.sqf | 133 +++++++++--------- 5 files changed, 81 insertions(+), 83 deletions(-) diff --git a/addons/explosives/functions/fnc_addCellphoneIED.sqf b/addons/explosives/functions/fnc_addCellphoneIED.sqf index 49bec07f1b..84cb57cf4e 100644 --- a/addons/explosives/functions/fnc_addCellphoneIED.sqf +++ b/addons/explosives/functions/fnc_addCellphoneIED.sqf @@ -38,7 +38,7 @@ while {!_codeSet} do { _code = "0" + _code; _count = _count - 1; }; - _codeSet = (isNull [objNull,_code] call FUNC(getSpeedDialExplosive)); + _codeSet = (count ([_code] call FUNC(getSpeedDialExplosive))) == 0; }; if (isNil QGVAR(CellphoneIEDs)) then { GVAR(CellphoneIEDs) = []; diff --git a/addons/explosives/functions/fnc_dialPhone.sqf b/addons/explosives/functions/fnc_dialPhone.sqf index 58d3dab716..41b2a4a4f7 100644 --- a/addons/explosives/functions/fnc_dialPhone.sqf +++ b/addons/explosives/functions/fnc_dialPhone.sqf @@ -31,10 +31,10 @@ if (_unit == ace_player) then { [FUNC(dialingPhone), 0.25, [_unit,4,_arr,_code]] call CALLSTACK(CBA_fnc_addPerFrameHandler); } else { private ["_explosive"]; - _explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); - if (!isNull (_explosive)) then { + _explosive = [_code] call FUNC(getSpeedDialExplosive); + if ((count _explosive) > 0) then { [{ - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_this select 1),3.16228,1,75]; (_this select 0) setVariable [QGVAR(Dialing), false, true]; }, [_unit,_explosive select 0], 0.25 * (count _arr - 4), 0] call EFUNC(common,waitAndExecute); [_explosive select 0,(0.25 * (count _arr - 1)) + (_explosive select 2)] call FUNC(startTimer); diff --git a/addons/explosives/functions/fnc_dialingPhone.sqf b/addons/explosives/functions/fnc_dialingPhone.sqf index 003fd734c1..d3c429c9fc 100644 --- a/addons/explosives/functions/fnc_dialingPhone.sqf +++ b/addons/explosives/functions/fnc_dialingPhone.sqf @@ -19,16 +19,16 @@ #include "script_component.hpp" EXPLODE_4_PVT(_this select 0,_unit,_i,_arr,_code); if ((_i mod 4) == 0) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; + playSound3D [QUOTE(PATHTO_R(Data\Audio\DialTone.wss)), objNull, false, (_unit ModelToWorld [0,0.2,2]), 15,1,2.5]; }; ctrlSetText [1400,format["Calling%1",_arr select (_i - 4)]]; private "_explosive"; -_explosive = [_unit, _code] call FUNC(getSpeedDialExplosive); +_explosive = [_code] call FUNC(getSpeedDialExplosive); if (_i >= (count _arr + 2)) then { [_this select 1] call CALLSTACK(cba_fnc_removePerFrameHandler); - if (!isNull (_explosive)) then { + if ((count _explosive) > 0) then { [_unit, -1, [_explosive select 0, _explosive select 2]] call FUNC(detonateExplosive); }; _unit setVariable [QGVAR(Dialing), false, true]; @@ -37,8 +37,8 @@ if (_i >= (count _arr + 2)) then { }; }; if (_i == (count _arr)) then { - if (!isNull (_explosive)) then { - playSound3D [QUOTE(PATHTOF_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; + if ((count _explosive) > 0) then { + playSound3D [QUOTE(PATHTO_R(Data\Audio\Cellphone_Ring.wss)),objNull, false, getPosASL (_explosive select 0),3.16228,1,75]; }; }; (_this select 0) set [1, _i + 1]; diff --git a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf index c00f15b5ed..d6d5b57b3b 100644 --- a/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf +++ b/addons/explosives/functions/fnc_getSpeedDialExplosive.sqf @@ -1,24 +1,23 @@ /* * Author: Garth 'L-H' de Wet - * Gets the explosive object or objNull from the speed dial entry. + * Gets the explosive from the speed dial entry. * * Arguments: - * 0: Unit - * 1: Speed dial entry + * 0: Speed dial entry * * Return Value: * Associated explosive (or ObjNull) * * Example: - * [ace_player, "2113"] call ace_explosives_fnc_getSpeedDialExplosive; + * ["2113"] call ace_explosives_fnc_getSpeedDialExplosive; * * Public: Yes */ #include "script_component.hpp" -EXPLODE_2_PVT(_this,_unit,_code); +EXPLODE_1_PVT(_this,_code); private ["_explosive"]; -if (isNil QGVAR(CellphoneIEDs)) exitWith {objNull}; -_explosive = objNull; +if (isNil QGVAR(CellphoneIEDs)) exitWith {[]}; +_explosive = []; { if ((_x select 1) == _code) exitWith { _explosive = _x; diff --git a/addons/explosives/functions/fnc_place_Approve.sqf b/addons/explosives/functions/fnc_place_Approve.sqf index 97528cb8f6..77cfbb92a1 100644 --- a/addons/explosives/functions/fnc_place_Approve.sqf +++ b/addons/explosives/functions/fnc_place_Approve.sqf @@ -28,79 +28,78 @@ _player = ACE_player; [_player, "DefaultAction", _player getVariable [QGVAR(Place), -1]] call EFUNC(Common,removeActionEventHandler); [_player, "MenuBack", _player getVariable [QGVAR(Cancel), -1]] call EFUNC(Common,removeActionEventHandler); call EFUNC(interaction,hideMouseHint); -if ((_setup getVariable [QGVAR(Class), ""]) != "") then { - _dir = (getDir _setup); - if (_dir > 180) then { - _dir = _dir - 180; - } else { - _dir = 180 + _dir; - }; - _setup setVariable [QGVAR(Direction), _dir]; - _player setVariable [QGVAR(PlantingExplosive), true]; - _setup addEventHandler ["EpeContactStart", { - if (!((_this select 0) getVariable [QGVAR(Handled), false])) then { - private ["_player", "_pos", "_attachTo"]; +if ((_setup getVariable [QGVAR(Class), ""]) == "") exitWith { + deleteVehicle _setup; +}; +_dir = (getDir _setup); +if (_dir > 180) then { + _dir = _dir - 180; +} else { + _dir = 180 + _dir; +}; +_setup setVariable [QGVAR(Direction), _dir]; +_player setVariable [QGVAR(PlantingExplosive), true]; +_setup addEventHandler ["EpeContactStart", { + if (!((_this select 0) getVariable [QGVAR(Handled), false])) then { + private ["_player", "_pos", "_attachTo"]; + _player = ACE_player; + _player setVariable [QGVAR(PlantingExplosive), false]; + _pos = getPosATL (_this select 0); + (_this select 0) enableSimulationGlobal false; + if (surfaceIsWater _pos) then { + _pos = getPosASL (_this select 0); + (_this select 0) setPosASL _pos; + }else{ + (_this select 0) setPosATL _pos; + }; + (_this select 0) setVariable [QGVAR(Handled), true]; + _attachTo = objNull; + if (!isNull (_this select 1) && {(_this select 1) isKindOf "AllVehicles"}) then { + _attachTo = (_this select 1); + }; + [(_this select 0),_attachTo, _pos] spawn { // TODO: Change to scheduled delay execution + private ["_mag", "_setup", "_dir", "_player"]; + _setup = _this select 0; _player = ACE_player; - _pos = getPosATL (_this select 0); - (_this select 0) enableSimulationGlobal false; - if (surfaceIsWater _pos) then { - _pos = getPosASL (_this select 0); - (_this select 0) setPosASL _pos; - }else{ - (_this select 0) setPosATL _pos; - }; - (_this select 0) setVariable [QGVAR(Handled), true]; - _player setVariable [QGVAR(PlantingExplosive), false]; - _attachTo = objNull; - if (!isNull (_this select 1) && {(_this select 1) isKindOf "AllVehicles"}) then { - _attachTo = (_this select 1); - }; - [(_this select 0),_attachTo, _pos] spawn { // TODO: Change to scheduled delay execution - private ["_mag", "_setup", "_dir", "_player"]; - _setup = _this select 0; - _player = ACE_player; - _mag = _setup getVariable [QGVAR(Class), ""]; - _dir = _setup getVariable [QGVAR(Direction), 0]; + _mag = _setup getVariable [QGVAR(Class), ""]; + _dir = _setup getVariable [QGVAR(Direction), 0]; - sleep getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime"); - _explosive = [_player, _this select 2, _dir, _mag, _setup getVariable QGVAR(Trigger), - [_setup getVariable QGVAR(Timer)], isNull (_this select 1)] call FUNC(placeExplosive); - deleteVehicle _setup; - if (!isNull(_explosive)) then { - _player RemoveMagazine _mag; - if (!isNull (_this select 1)) then { - _explosive attachTo [(_this select 1)]; - _dir = _dir - (getDir (_this select 1)); - [[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); - }; + sleep getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime"); + _explosive = [_player, _this select 2, _dir, _mag, _setup getVariable QGVAR(Trigger), + [_setup getVariable QGVAR(Timer)], isNull (_this select 1)] call FUNC(placeExplosive); + deleteVehicle _setup; + if (!isNull(_explosive)) then { + _player RemoveMagazine _mag; + if (!isNull (_this select 1)) then { + _explosive attachTo [(_this select 1)]; + _dir = _dir - (getDir (_this select 1)); + [[_explosive, _dir, 0], QFUNC(setPosition)] call EFUNC(common,execRemoteFnc); }; }; }; - }]; - _setup enableSimulationGlobal true; - _player playActionNow "MedicOther"; - [_setup] spawn { // TODO: Change to scheduled delay execution - private ["_setup", "_player"]; - _setup = _this select 0; - _player = ACE_player; - sleep 5; + }; +}]; +_setup enableSimulationGlobal true; +_player playActionNow "MedicOther"; +[_setup] spawn { // TODO: Change to scheduled delay execution + private ["_setup", "_player"]; + _setup = _this select 0; + _player = ACE_player; + sleep 5; + _player setVariable [QGVAR(PlantingExplosive), false]; + if (!isNull _setup) then { + private ["_mag", "_dir", "_delayTime"]; + _mag = _setup getVariable [QGVAR(Class), ""]; + _dir = _setup getVariable [QGVAR(Direction), 0]; + _delayTime = (getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime")) - 5; + if (_delayTime > 0) then { + sleep _delayTime; + }; if (!isNull _setup) then { - private ["_mag", "_dir", "_delayTime"]; - _mag = _setup getVariable [QGVAR(Class), ""]; - _dir = _setup getVariable [QGVAR(Direction), 0]; - _delayTime = (getNumber(ConfigFile >> "CfgMagazines" >> _mag >> "ACE_DelayTime")) - 5; - if (_delayTime > 0) then { - sleep _delayTime; - }; - if (!isNull _setup) then { - [_player, GetPosATL _setup, _dir, _mag, _setup getVariable QGVAR(Trigger), - [_setup getVariable QGVAR(Timer)], true] call FUNC(placeExplosive); - deleteVehicle _setup; - _player RemoveMagazine _mag; - _player setVariable [QGVAR(PlantingExplosive), false]; - }; + [_player, GetPosATL _setup, _dir, _mag, _setup getVariable QGVAR(Trigger), + [_setup getVariable QGVAR(Timer)], true] call FUNC(placeExplosive); + deleteVehicle _setup; + _player RemoveMagazine _mag; }; }; -}else{ - deleteVehicle _setup; }; From db5e8bcc3455a336a5072584a448c7f013538079 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:01:47 -0300 Subject: [PATCH 31/62] Modify the opacity of icons along with that of the text --- addons/interact_menu/functions/fnc_renderIcon.sqf | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 4aa5e29aff..ad381f691d 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -6,6 +6,7 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; + _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { @@ -18,7 +19,7 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%3", _icon, _color, _text]; + _text = format ["%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; From a8797fe45adf4b5a8b30c98a8128d6f440e98a8c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:02:48 -0300 Subject: [PATCH 32/62] Fix for the angular spacing of submenus --- addons/interact_menu/functions/fnc_renderMenu.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 1072a53906..532762d41b 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -75,9 +75,9 @@ if(_cursorScreenPos distance _pos <= _distance) then { (_pos select 1) + ((_offset select 1)*_mod), (_pos select 2) + ((_offset select 2)*_mod) ]; - // drawLine3D [_pos, _newPos, [1,0,0,1]]; + // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / (_numActions); + _angle = _angle + _angleSpan / ((_numActions-1) max 1); }; } forEach (_actionData select 6); }; From 30943cbfd43be373bb4a0431b847225ae3f48783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 12:03:20 -0300 Subject: [PATCH 33/62] move the main menu actions to the right cuadrant --- addons/interact_menu/functions/fnc_render.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index a6795e50a0..4893d7e819 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -25,7 +25,7 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the GVAR(renderDepth) = 0; _renderTargets = _x; { - [_renderTargets select 0, _x, 0, [270, 360]] call FUNC(renderMenu); + [_renderTargets select 0, _x, 0, [180, 360]] call FUNC(renderMenu); } forEach (_renderTargets select 1); }; } forEach GVAR(toRender); @@ -33,7 +33,7 @@ if((count GVAR(toRender)) > 0 && (GVAR(keyDown) || GVAR(keyDownSelfAction))) the // Render only the self action menu _actions = (ACE_player getVariable QGVAR(selfActionData)) select 0; _pos = (ACE_player modelToWorld (ACE_player selectionPosition "spine3")) vectorAdd GVAR(selfMenuOffset) vectorAdd [0,0,0.25]; - [ACE_player, _actions, 0, [270, 360], _pos] call FUNC(renderMenu); + [ACE_player, _actions, 0, [180, 360], _pos] call FUNC(renderMenu); }; // player sideChat format["c: %1", count GVAR(toRender)]; From 1ea35548e0713cf2610475ec8186bcb879178a1a Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 18:40:40 +0100 Subject: [PATCH 34/62] Fixed ambiance sounds module. --- addons/missionmodules/CfgVehicles.hpp | 4 ++-- .../functions/fnc_moduleAmbianceSound.sqf | 14 +++++++------- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/addons/missionmodules/CfgVehicles.hpp b/addons/missionmodules/CfgVehicles.hpp index afdb58006b..92c379efb2 100644 --- a/addons/missionmodules/CfgVehicles.hpp +++ b/addons/missionmodules/CfgVehicles.hpp @@ -11,7 +11,7 @@ class CfgVehicles { displayName = "Ambiance Sounds [ACE]"; icon = QUOTE(PATHTOF(data\moduleSound.paa)); category = "ACE_missionModules"; - function = QUOTE(FUNC(moduleAmbianceSound); + function = QUOTE(FUNC(moduleAmbianceSound)); functionPriority = 1; isGlobal = 1; isTriggerActivated = 0; @@ -57,7 +57,7 @@ class CfgVehicles { displayName = "Volume"; description = "The volume of the sounds played"; typeName = "NUMBER"; - defaultValue = 0; + defaultValue = 1; }; }; class ModuleDescription { diff --git a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf index 95153be8d1..943d795b7a 100644 --- a/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf +++ b/addons/missionmodules/functions/fnc_moduleAmbianceSound.sqf @@ -38,7 +38,7 @@ if (_activated && local _logic) then { _nilCheckPassedList = ""; { - _x = [_x] call EFUNC(common,removeWhiteSpace); + _x = [_x] call EFUNC(common,string_removeWhiteSpace); _splittedList set [_foreachIndex, _x]; }foreach _splittedList; @@ -61,21 +61,22 @@ if (_activated && local _logic) then { }foreach _ambianceSounds; [{ - private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"] + private ["_args", "_logic", "_ambianceSounds", "_minimalDistance", "_maximalDistance", "_minDelayBetweensounds", "_maxDelayBetweenSounds", "_volume", "_followPlayers","_lastTimePlayed", "_newPos"]; _args = _this select 0; _logic = _args select 0; + _minDelayBetweensounds = _args select 4; + _maxDelayBetweenSounds = _args select 5; _lastTimePlayed = _args select 8; if (!alive _logic) exitwith { [(_this select 1)] call cba_fnc_removePerFrameHandler; }; - if (_lastTimePlayed - time >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { + if (time - _lastTimePlayed >= ((_minDelayBetweensounds + random(_maxDelayBetweenSounds)) min _maxDelayBetweenSounds)) then { _ambianceSounds = _args select 1; _minimalDistance = _args select 2; _maximalDistance = _args select 3; - _minDelayBetweensounds = _args select 4; - _maxDelayBetweenSounds = _args select 5; + _volume = _args select 6; _followPlayers = _args select 7; @@ -111,13 +112,12 @@ if (_activated && local _logic) then { // If no unit is to close to this position, we will play the sound. if ({(_newPos distance _x < (_minimalDistance / 2))}count _allUnits == 0) then { - playSound3D [_ambianceSounds select (round(random((count _ambianceSounds)-1))), ObjNull, false, _newPos, _volume, 1, 1000]; _args set [8, time]; }; }; }; - }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call CBA_fnc_addPerFrameHandler; + }, 0.1, [_logic, _ambianceSounds, _minimalDistance, _maximalDistance, _minDelayBetweensounds, _maxDelayBetweenSounds, _volume, _followPlayers, time] ] call cba_fnc_addPerFrameHandler; }; true; From af3709f481226ecba3c8d470ddc02047a813ab87 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:07:19 +0100 Subject: [PATCH 35/62] Fixed forgotten missionModules. --- addons/missionmodules/$PBOPREFIX$ | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/missionmodules/$PBOPREFIX$ b/addons/missionmodules/$PBOPREFIX$ index ea1be0daee..6e7c7ebfc1 100644 --- a/addons/missionmodules/$PBOPREFIX$ +++ b/addons/missionmodules/$PBOPREFIX$ @@ -1 +1 @@ -z\ace\addons\missionModules \ No newline at end of file +z\ace\addons\missionmodules \ No newline at end of file From 612fa69c1c4cf7ed8b81c5086dc90877d0eda400 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:12:14 +0100 Subject: [PATCH 36/62] Renamed string_removeWhiteSpace to stringRemoveWhiteSpace. --- addons/common/XEH_preInit.sqf | 2 +- ...ring_removeWhiteSpace.sqf => fnc_stringRemoveWhiteSpace.sqf} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename addons/common/functions/{fnc_string_removeWhiteSpace.sqf => fnc_stringRemoveWhiteSpace.sqf} (100%) diff --git a/addons/common/XEH_preInit.sqf b/addons/common/XEH_preInit.sqf index 3710963c63..e193c81470 100644 --- a/addons/common/XEH_preInit.sqf +++ b/addons/common/XEH_preInit.sqf @@ -170,7 +170,7 @@ PREP(setVolume); PREP(sortAlphabeticallyBy); PREP(stringCompare); PREP(stringToColoredText); -PREP(string_removeWhiteSpace); +PREP(stringRemoveWhiteSpace); PREP(subString); PREP(switchToGroupSide); PREP(throttledPublicVariable); diff --git a/addons/common/functions/fnc_string_removeWhiteSpace.sqf b/addons/common/functions/fnc_stringRemoveWhiteSpace.sqf similarity index 100% rename from addons/common/functions/fnc_string_removeWhiteSpace.sqf rename to addons/common/functions/fnc_stringRemoveWhiteSpace.sqf From b0373de57632ae9ea1623f1757e73e457fa65279 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:14:52 +0100 Subject: [PATCH 37/62] Tabs to spaces --- .../functions/fnc_endRadioTransmission.sqf | 18 ++++----- addons/common/functions/fnc_exportConfig.sqf | 4 +- addons/common/functions/fnc_getGunner.sqf | 6 +-- addons/common/functions/fnc_getHitPoints.sqf | 34 ++++++++--------- .../fnc_getHitPointsWithSelections.sqf | 38 +++++++++---------- addons/common/functions/fnc_hashGet.sqf | 24 ++++++------ addons/common/functions/fnc_hashHasKey.sqf | 18 ++++----- .../functions/fnc_hashListCreateHash.sqf | 12 +++--- addons/common/functions/fnc_hashListPush.sqf | 12 +++--- .../common/functions/fnc_hashListSelect.sqf | 26 ++++++------- addons/common/functions/fnc_hashListSet.sqf | 24 ++++++------ addons/common/functions/fnc_hashRem.sqf | 34 ++++++++--------- addons/common/functions/fnc_hashSet.sqf | 28 +++++++------- .../common/functions/fnc_queueAnimation.sqf | 4 +- 14 files changed, 141 insertions(+), 141 deletions(-) diff --git a/addons/common/functions/fnc_endRadioTransmission.sqf b/addons/common/functions/fnc_endRadioTransmission.sqf index 990d4e03d8..772a34a06b 100644 --- a/addons/common/functions/fnc_endRadioTransmission.sqf +++ b/addons/common/functions/fnc_endRadioTransmission.sqf @@ -14,17 +14,17 @@ // ACRE if (isClass (configFile >> "CfgPatches" >> "acre_main")) then { - [-1] call acre_core_fnc_handleMultiPttKeyPressUp; - [0] call acre_core_fnc_handleMultiPttKeyPressUp; - [1] call acre_core_fnc_handleMultiPttKeyPressUp; - [2] call acre_core_fnc_handleMultiPttKeyPressUp; + [-1] call acre_core_fnc_handleMultiPttKeyPressUp; + [0] call acre_core_fnc_handleMultiPttKeyPressUp; + [1] call acre_core_fnc_handleMultiPttKeyPressUp; + [2] call acre_core_fnc_handleMultiPttKeyPressUp; }; // TFAR if (isClass (configFile >> "CfgPatches" >> "task_force_radio")) then { - call TFAR_fnc_onSwTangentReleased; - call TFAR_fnc_onAdditionalSwTangentReleased; - call TFAR_fnc_onLRTangentReleased; - call TFAR_fnc_onAdditionalLRTangentReleased; - call TFAR_fnc_onDDTangentReleased; + call TFAR_fnc_onSwTangentReleased; + call TFAR_fnc_onAdditionalSwTangentReleased; + call TFAR_fnc_onLRTangentReleased; + call TFAR_fnc_onAdditionalLRTangentReleased; + call TFAR_fnc_onDDTangentReleased; }; diff --git a/addons/common/functions/fnc_exportConfig.sqf b/addons/common/functions/fnc_exportConfig.sqf index 10c88d6bca..c298785c26 100644 --- a/addons/common/functions/fnc_exportConfig.sqf +++ b/addons/common/functions/fnc_exportConfig.sqf @@ -1,8 +1,8 @@ // by commy2 /* - usage: + usage: - (configFile >> "CfgAmmo") call FUNC(exportConfig); + (configFile >> "CfgAmmo") call FUNC(exportConfig); */ #include "script_component.hpp" diff --git a/addons/common/functions/fnc_getGunner.sqf b/addons/common/functions/fnc_getGunner.sqf index 0c82066e4b..71191083e0 100644 --- a/addons/common/functions/fnc_getGunner.sqf +++ b/addons/common/functions/fnc_getGunner.sqf @@ -20,9 +20,9 @@ private "_gunner"; _gunner = objNull; { - if (_weapon in (_vehicle weaponsTurret _x)) exitWith { - _gunner = _vehicle turretUnit _x; - }; + if (_weapon in (_vehicle weaponsTurret _x)) exitWith { + _gunner = _vehicle turretUnit _x; + }; } forEach allTurrets _vehicle; _gunner diff --git a/addons/common/functions/fnc_getHitPoints.sqf b/addons/common/functions/fnc_getHitPoints.sqf index a6d75e41b9..26b0b1b840 100644 --- a/addons/common/functions/fnc_getHitPoints.sqf +++ b/addons/common/functions/fnc_getHitPoints.sqf @@ -23,33 +23,33 @@ _hitpoints = []; private "_hitpointClasses"; _hitpointClasses = [_config >> "HitPoints"]; { - private "_class"; - _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; + private "_class"; + _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; - if (isClass _class) then { - _hitpointClasses pushBack _class; - }; + if (isClass _class) then { + _hitpointClasses pushBack _class; + }; } forEach allTurrets _vehicle; // iterate through all classes with hitpoints and their parents { - private "_class"; - _class = _x; + private "_class"; + _class = _x; - while {isClass _class} do { + while {isClass _class} do { - for "_i" from 0 to (count _class - 1) do { - private "_entry"; - _entry = configName (_class select _i); + for "_i" from 0 to (count _class - 1) do { + private "_entry"; + _entry = configName (_class select _i); - if (!(_entry in _hitpoints) && {!isNil {_vehicle getHitPointDamage _entry}}) then { - _hitpoints pushBack _entry; - }; - }; + if (!(_entry in _hitpoints) && {!isNil {_vehicle getHitPointDamage _entry}}) then { + _hitpoints pushBack _entry; + }; + }; - _class = inheritsFrom _class; - }; + _class = inheritsFrom _class; + }; } forEach _hitpointClasses; diff --git a/addons/common/functions/fnc_getHitPointsWithSelections.sqf b/addons/common/functions/fnc_getHitPointsWithSelections.sqf index e9a7a8fac5..f0c9801382 100644 --- a/addons/common/functions/fnc_getHitPointsWithSelections.sqf +++ b/addons/common/functions/fnc_getHitPointsWithSelections.sqf @@ -24,36 +24,36 @@ _selections = []; private "_hitpointClasses"; _hitpointClasses = [_config >> "HitPoints"]; { - private "_class"; - _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; + private "_class"; + _class = ([_config, _x] call FUNC(getTurretConfigPath)) >> "HitPoints"; - if (isClass _class) then { - _hitpointClasses pushBack _class; - }; + if (isClass _class) then { + _hitpointClasses pushBack _class; + }; } forEach allTurrets _vehicle; // iterate through all classes with hitpoints and their parents { - private "_class"; - _class = _x; + private "_class"; + _class = _x; - while {isClass _class} do { + while {isClass _class} do { - for "_i" from 0 to (count _class - 1) do { - private ["_entry", "_selection"]; + for "_i" from 0 to (count _class - 1) do { + private ["_entry", "_selection"]; - _entry = configName (_class select _i); - _selection = getText (_class select _i >> "name"); + _entry = configName (_class select _i); + _selection = getText (_class select _i >> "name"); - if (!(_selection in _selections) && {!isNil {_vehicle getHit _selection}}) then { - _hitpoints pushBack _entry; - _selections pushBack _selection; - }; - }; + if (!(_selection in _selections) && {!isNil {_vehicle getHit _selection}}) then { + _hitpoints pushBack _entry; + _selections pushBack _selection; + }; + }; - _class = inheritsFrom _class; - }; + _class = inheritsFrom _class; + }; } forEach _hitpointClasses; diff --git a/addons/common/functions/fnc_hashGet.sqf b/addons/common/functions/fnc_hashGet.sqf index 6147d06a73..7682b2f6a2 100644 --- a/addons/common/functions/fnc_hashGet.sqf +++ b/addons/common/functions/fnc_hashGet.sqf @@ -9,18 +9,18 @@ _key = _this select 1; ERRORDATA(2); _val = nil; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - _val = (_hash select 1) select _index; - if(IS_STRING(_val) && {_val == "ACREHASHREMOVEDONOTUSETHISVAL"}) then { - _val = nil; - }; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + _val = (_hash select 1) select _index; + if(IS_STRING(_val) && {_val == "ACREHASHREMOVEDONOTUSETHISVAL"}) then { + _val = nil; + }; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _val diff --git a/addons/common/functions/fnc_hashHasKey.sqf b/addons/common/functions/fnc_hashHasKey.sqf index d69ad2f3e8..8011e987fb 100644 --- a/addons/common/functions/fnc_hashHasKey.sqf +++ b/addons/common/functions/fnc_hashHasKey.sqf @@ -9,15 +9,15 @@ _key = _this select 1; ERRORDATA(2); _val = false; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - _val = true; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + _val = true; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _val diff --git a/addons/common/functions/fnc_hashListCreateHash.sqf b/addons/common/functions/fnc_hashListCreateHash.sqf index fef9c79b85..cdad5987cd 100644 --- a/addons/common/functions/fnc_hashListCreateHash.sqf +++ b/addons/common/functions/fnc_hashListCreateHash.sqf @@ -7,12 +7,12 @@ _hashList = _this select 0; ERRORDATA(1); _hashKeys = []; try { - if(VALIDHASH(_hashList)) then { - _hashKeys = (_hashList select 0); - } else { - ERROR("Input hashlist is not valid"); - }; + if(VALIDHASH(_hashList)) then { + _hashKeys = (_hashList select 0); + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; [_hashKeys, []]; diff --git a/addons/common/functions/fnc_hashListPush.sqf b/addons/common/functions/fnc_hashListPush.sqf index e783f7c324..afd092a1b9 100644 --- a/addons/common/functions/fnc_hashListPush.sqf +++ b/addons/common/functions/fnc_hashListPush.sqf @@ -7,11 +7,11 @@ _hashList = _this select 0; _value = _this select 1; ERRORDATA(2); try { - if(VALIDHASH(_hashList)) then { - [_hashList, (count (_hashList select 1)), _value] call FUNC(hashListSet); - } else { - ERROR("Input hashlist in push not valid"); - }; + if(VALIDHASH(_hashList)) then { + [_hashList, (count (_hashList select 1)), _value] call FUNC(hashListSet); + } else { + ERROR("Input hashlist in push not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_hashListSelect.sqf b/addons/common/functions/fnc_hashListSelect.sqf index e1ee0aae0f..0c552d072e 100644 --- a/addons/common/functions/fnc_hashListSelect.sqf +++ b/addons/common/functions/fnc_hashListSelect.sqf @@ -8,20 +8,20 @@ _index = _this select 1; ERRORDATA(2); _hash = nil; try { - if(VALIDHASH(_hashList)) then { - _keys = _hashList select 0; - _hashes = _hashList select 1; - if(_index < (count _hashes)) then { - _values = _hashes select _index; + if(VALIDHASH(_hashList)) then { + _keys = _hashList select 0; + _hashes = _hashList select 1; + if(_index < (count _hashes)) then { + _values = _hashes select _index; - _hash = [_keys, _values, 1]; - } else { - ERROR("Index of hashlist is out of range"); - }; - } else { - ERROR("Input hashlist is not valid"); - }; + _hash = [_keys, _values, 1]; + } else { + ERROR("Index of hashlist is out of range"); + }; + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; _hash; diff --git a/addons/common/functions/fnc_hashListSet.sqf b/addons/common/functions/fnc_hashListSet.sqf index 8b7239dffd..c384bc15c9 100644 --- a/addons/common/functions/fnc_hashListSet.sqf +++ b/addons/common/functions/fnc_hashListSet.sqf @@ -8,17 +8,17 @@ _index = _this select 1; _value = _this select 2; ERRORDATA(3); try { - if(VALIDHASH(_hashList)) then { - if(VALIDHASH(_value)) then { - _vals = _value select 1; - - (_hashList select 1) set[_index, _vals]; - } else { - ERROR("Set hash in hashlist is not valid"); - }; - } else { - ERROR("Input hashlist is not valid"); - }; + if(VALIDHASH(_hashList)) then { + if(VALIDHASH(_value)) then { + _vals = _value select 1; + + (_hashList select 1) set[_index, _vals]; + } else { + ERROR("Set hash in hashlist is not valid"); + }; + } else { + ERROR("Input hashlist is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_hashRem.sqf b/addons/common/functions/fnc_hashRem.sqf index 86898fb3df..000dbbefe0 100644 --- a/addons/common/functions/fnc_hashRem.sqf +++ b/addons/common/functions/fnc_hashRem.sqf @@ -8,23 +8,23 @@ _key = _this select 1; ERRORDATA(2); _val = nil; try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index != -1) then { - (_hash select 1) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; - // is this hash is not part of a hash list? - // if it is we need to leave the keys intact. - if((count _hash) == 2) then { - // if this is a standalone hash then we can clean it up - (_hash select 0) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; - _hash set[0, ((_hash select 0) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; - _hash set[1, ((_hash select 1) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; - }; - }; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index != -1) then { + (_hash select 1) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; + // is this hash is not part of a hash list? + // if it is we need to leave the keys intact. + if((count _hash) == 2) then { + // if this is a standalone hash then we can clean it up + (_hash select 0) set[_index, "ACREHASHREMOVEDONOTUSETHISVAL"]; + _hash set[0, ((_hash select 0) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; + _hash set[1, ((_hash select 1) - ["ACREHASHREMOVEDONOTUSETHISVAL"])]; + }; + }; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; true diff --git a/addons/common/functions/fnc_hashSet.sqf b/addons/common/functions/fnc_hashSet.sqf index 23438eaf83..0e374d5f12 100644 --- a/addons/common/functions/fnc_hashSet.sqf +++ b/addons/common/functions/fnc_hashSet.sqf @@ -9,19 +9,19 @@ _key = _this select 1; _val = _this select 2; ERRORDATA(3); try { - if(VALIDHASH(_hash)) then { - _index = (_hash select 0) find _key; - if(_index == -1) then { - _index = (_hash select 0) find "ACREHASHREMOVEDONOTUSETHISVAL"; - if(_index == -1) then { - _index = (count (_hash select 0)); - }; - (_hash select 0) set[_index, _key]; - }; - (_hash select 1) set[_index, _val]; - } else { - ERROR("Input hash is not valid"); - }; + if(VALIDHASH(_hash)) then { + _index = (_hash select 0) find _key; + if(_index == -1) then { + _index = (_hash select 0) find "ACREHASHREMOVEDONOTUSETHISVAL"; + if(_index == -1) then { + _index = (count (_hash select 0)); + }; + (_hash select 0) set[_index, _key]; + }; + (_hash select 1) set[_index, _val]; + } else { + ERROR("Input hash is not valid"); + }; } catch { - HANDLECATCH; + HANDLECATCH; }; diff --git a/addons/common/functions/fnc_queueAnimation.sqf b/addons/common/functions/fnc_queueAnimation.sqf index a489a46174..73f3dca109 100644 --- a/addons/common/functions/fnc_queueAnimation.sqf +++ b/addons/common/functions/fnc_queueAnimation.sqf @@ -4,7 +4,7 @@ terminate (missionNamespace getVariable [QGVAR(waitForAnimationHandle), scriptNull]); GVAR(waitForAnimationHandle) = _this spawn { - waitUntil {!([_this select 0] call FUNC(inTransitionAnim))}; + waitUntil {!([_this select 0] call FUNC(inTransitionAnim))}; - _this call FUNC(doAnimation); + _this call FUNC(doAnimation); }; From c8d4acfc81c81f246400ef85e07fd3120b888cf4 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:29:54 +0100 Subject: [PATCH 38/62] Refactored displayText to no longer use spawn. --- addons/common/functions/fnc_displayText.sqf | 38 +++++++++------------ 1 file changed, 17 insertions(+), 21 deletions(-) diff --git a/addons/common/functions/fnc_displayText.sqf b/addons/common/functions/fnc_displayText.sqf index c6a68cbab2..7121ef6813 100644 --- a/addons/common/functions/fnc_displayText.sqf +++ b/addons/common/functions/fnc_displayText.sqf @@ -18,36 +18,32 @@ #define DEFAULT_DELAY 2 #define DEFAULT_PRIORITY 0 -if (isNil QGVAR(lastHint)) then { - GVAR(lastHint) = [0, 0]; -}; - _this resize 4; -_this spawn { - private ["_text", "_sound", "_delay", "_priority", "_lastHintTime", "_lastHintPriority", "_time"]; +private ["_text", "_sound", "_delay", "_priority", "_lastHintTime", "_lastHintPriority", "_time"]; +_text = _this select 0; +_sound = _this select 1; +_delay = _this select 2; +_priority = _this select 3; - _text = _this select 0; - _sound = _this select 1; - _delay = _this select 2; - _priority = _this select 3; +if (isNil QGVAR(lastHint)) then { + GVAR(lastHint) = [0, 0]; +}; - _lastHintTime = GVAR(lastHint) select 0; - _lastHintPriority = GVAR(lastHint) select 1; +_lastHintTime = GVAR(lastHint) select 0; +_lastHintPriority = GVAR(lastHint) select 1; - if !(typeName _text in ["STRING", "TEXT"]) then {_text = str _text}; - if (isNil "_sound") then {_sound = DEFAULT_PLAY_SOUND}; - if (isNil "_delay") then {_delay = DEFAULT_DELAY}; - if (isNil "_priority") then {_priority = DEFAULT_PRIORITY}; +if !(typeName _text in ["STRING", "TEXT"]) then {_text = str _text}; +if (isNil "_sound") then {_sound = DEFAULT_PLAY_SOUND}; +if (isNil "_delay") then {_delay = DEFAULT_DELAY}; +if (isNil "_priority") then {_priority = DEFAULT_PRIORITY}; - _time = time; - if (_time > _lastHintTime + _delay || {_priority >= _lastHintPriority}) then { +_time = time; +if (_time > _lastHintTime + _delay || {_priority >= _lastHintPriority}) then { hintSilent _text; if (_sound) then {playSound "ACE_Sound_Click"}; GVAR(lastHint) set [0, _time]; GVAR(lastHint) set [1, _priority]; - sleep _delay; - if (_time == GVAR(lastHint) select 0) then {hintSilent ""}; - }; + [{if ((_this select 0) == GVAR(lastHint) select 0) then {hintSilent ""};}, [_time], _delay, 0] call FUNC(waitAndExecute); }; From 21199a4ee663f0f42178d84003f56c2c43ca92ad Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 19:32:49 +0100 Subject: [PATCH 39/62] Now uses BIS_fnc_rscLayer --- addons/common/functions/fnc_displayInformation.sqf | 7 ++----- addons/common/functions/fnc_displayMessage.sqf | 4 +--- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/addons/common/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf index 64a27b0e40..007e1c3e32 100644 --- a/addons/common/functions/fnc_displayInformation.sqf +++ b/addons/common/functions/fnc_displayInformation.sqf @@ -10,8 +10,6 @@ #include "script_component.hpp" -#define DISPLAY_LAYER 32547 - private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos","_icon","_iconCtrl"]; _title = [_this, 0, "",[""]] call BIS_fnc_Param; _content = [_this, 1, [""],[[""]]] call BIS_fnc_Param; @@ -19,7 +17,7 @@ _type = [_this, 2, 0, [0]] call BIS_fnc_Param; _icon = [_this, 3, "",[""]] call BIS_fnc_Param; if (_title != "") then { - DISPLAY_LAYER cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; + ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; disableSerialization; _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; @@ -62,6 +60,5 @@ if (_title != "") then { }; }; } else { - - DISPLAY_LAYER cutText ["","PLAIN"]; + ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; }; \ No newline at end of file diff --git a/addons/common/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf index 317de8b240..7b3274cfc4 100644 --- a/addons/common/functions/fnc_displayMessage.sqf +++ b/addons/common/functions/fnc_displayMessage.sqf @@ -10,15 +10,13 @@ #include "script_component.hpp" -#define DISPLAY_LAYER 546 - private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos"]; _title = [_this, 0, "",[""]] call BIS_fnc_Param; _content = [_this, 1, "",[""]] call BIS_fnc_Param; _type = [_this, 2, 0, [0]] call BIS_fnc_Param; if (_title != "" && _content != "") then { - DISPLAY_LAYER cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; + ("ACE_RscDisplayMessage" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; disableSerialization; _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; From f7d5d615ee1cbc18aee5d2c259bec947114c639f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 15:36:27 -0300 Subject: [PATCH 40/62] allow actions to be defined for different selections --- addons/attach/CfgVehicles.hpp | 43 ++-- addons/captives/CfgVehicles.hpp | 173 ++++++++-------- .../functions/fnc_compileMenu.sqf | 36 ++-- addons/interact_menu/functions/fnc_probe.sqf | 1 + .../functions/fnc_renderIcon.sqf | 2 +- .../functions/fnc_renderMenu.sqf | 5 +- addons/interaction/CfgVehicles.hpp | 192 +++++++++--------- addons/interaction/stringtable.xml | 3 + addons/logistics_uavbattery/CfgVehicles.hpp | 4 +- addons/map/CfgVehicles.hpp | 14 +- addons/respawn/CfgVehicles.hpp | 111 ++++++---- addons/vehiclelock/CfgVehicles.hpp | 55 ++--- 12 files changed, 356 insertions(+), 283 deletions(-) diff --git a/addons/attach/CfgVehicles.hpp b/addons/attach/CfgVehicles.hpp index 1cd65127a6..b681c0f7f7 100644 --- a/addons/attach/CfgVehicles.hpp +++ b/addons/attach/CfgVehicles.hpp @@ -1,25 +1,30 @@ #define MACRO_ATTACHTOVEHICLE \ class ACE_Actions { \ - class GVAR(AttachVehicle) { \ - displayName = "$STR_ACE_Attach_AttachDetach"; \ - condition = QUOTE(([ARR_3(_player, _target, '')] call FUNC(canAttach))); \ - statement = QUOTE( [ARR_2(_player, _target)] call FUNC(openAttachUI);); \ - exceptions[] = {"ACE_Drag_isNotDragging"}; \ - showDisabled = 0; \ - priority = 0; \ - icon = PATHTOF(UI\attach_ca.paa); \ - distance = 4; \ - }; \ - class GVAR(DetachVehicle) { \ - displayName = "$STR_ACE_Attach_Detach"; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canDetach))); \ - statement = QUOTE( [ARR_2(_player, _target)] call FUNC(detach) ); \ - exceptions[] = {"ACE_Drag_isNotDragging"}; \ - showDisabled = 0; \ - priority = 0; \ - icon = PATHTOF(UI\detach_ca.paa); \ - distance = 4; \ + class ACE_MainActions { \ + selection = ""; \ + distance = 5; \ + condition = "true"; \ + class GVAR(AttachVehicle) { \ + displayName = "$STR_ACE_Attach_AttachDetach"; \ + condition = QUOTE(([ARR_3(_player, _target, '')] call FUNC(canAttach))); \ + statement = QUOTE( [ARR_2(_player, _target)] call FUNC(openAttachUI);); \ + exceptions[] = {"ACE_Drag_isNotDragging"}; \ + showDisabled = 0; \ + priority = 0; \ + icon = PATHTOF(UI\attach_ca.paa); \ + distance = 4; \ + }; \ + class GVAR(DetachVehicle) { \ + displayName = "$STR_ACE_Attach_Detach"; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canDetach))); \ + statement = QUOTE( [ARR_2(_player, _target)] call FUNC(detach) ); \ + exceptions[] = {"ACE_Drag_isNotDragging"}; \ + showDisabled = 0; \ + priority = 0; \ + icon = PATHTOF(UI\detach_ca.paa); \ + distance = 4; \ + }; \ }; \ }; diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d292402bcf..57f9644a4a 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -2,70 +2,78 @@ class CfgVehicles { class Man; class CAManBase: Man { class ACE_Actions { - class ACE_ApplyHandcuffs { - displayName = "$STR_ACE_Captives_SetCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); - exceptions[] = {}; - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "C"; + class ACE_RightHandActions { + selection = "righthand"; + displayName = "Right hand"; + distance = 5; + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)) || ([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs))); + class ACE_ApplyHandcuffs { + displayName = "$STR_ACE_Captives_SetCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canApplyHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doApplyHandcuffs)); + exceptions[] = {}; + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "C"; + }; + class ACE_RemoveHandcuffs { + displayName = "$STR_ACE_Captives_ReleaseCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); + exceptions[] = {}; + showDisabled = 0; + priority = 2.4; + icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); + hotkey = "R"; + }; }; - class ACE_RemoveHandcuffs { - displayName = "$STR_ACE_Captives_ReleaseCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canRemoveHandcuffs)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doRemoveHandcuffs)); - exceptions[] = {}; - showDisabled = 0; - priority = 2.4; - icon = QUOTE(PATHTOF(UI\handcuff_ca.paa)); - hotkey = "R"; - }; - class ACE_EscortCaptive { - displayName = "$STR_ACE_Captives_EscortCaptive"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); - statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); - exceptions[] = {}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_StopEscorting { - displayName = "$STR_ACE_Captives_StopEscorting"; - distance = 4; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); - statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); - exceptions[] = {QGVAR(isNotEscorting)}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.3; - hotkey = "E"; - }; - class ACE_LoadCaptive { - displayName = "$STR_ACE_Captives_LoadCaptive"; - distance = 4; - condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); - statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); - exceptions[] = {QGVAR(isNotEscorting)}; - showDisabled = 0; - icon = QUOTE(PATHTOF(UI\captive_ca.paa)); - priority = 2.2; - hotkey = "L"; - }; - class ACE_FriskPerson { - displayName = "$STR_ACE_Captives_FriskPerson"; - distance = 2; - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); - showDisabled = 0; - //icon = ""; //@todo - priority = 3; - hotkey = "F"; + class ACE_MainActions { + class ACE_EscortCaptive { + displayName = "$STR_ACE_Captives_EscortCaptive"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canEscortCaptive)); + statement = QUOTE([ARR_3(_player, _target, true)] call FUNC(doEscortCaptive)); + exceptions[] = {}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_StopEscorting { + displayName = "$STR_ACE_Captives_StopEscorting"; + distance = 4; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canStopEscorting)); + statement = QUOTE([ARR_3(_player,_target, false)] call FUNC(doEscortCaptive)); + exceptions[] = {QGVAR(isNotEscorting)}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.3; + hotkey = "E"; + }; + class ACE_LoadCaptive { + displayName = "$STR_ACE_Captives_LoadCaptive"; + distance = 4; + condition = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(canLoadCaptive)); + statement = QUOTE([ARR_3(_player, _target, objNull)] call FUNC(doLoadCaptive)); + exceptions[] = {QGVAR(isNotEscorting)}; + showDisabled = 0; + icon = QUOTE(PATHTOF(UI\captive_ca.paa)); + priority = 2.2; + hotkey = "L"; + }; + class ACE_FriskPerson { + displayName = "$STR_ACE_Captives_FriskPerson"; + distance = 2; + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canFriskPerson)); + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doFriskPerson)); + showDisabled = 0; + //icon = ""; //@todo + priority = 3; + hotkey = "F"; + }; }; }; @@ -100,24 +108,27 @@ class CfgVehicles { #define MACRO_LOADUNLOADCAPTIVE \ class ACE_Actions { \ - class ACE_LoadCaptive { \ - displayName = "$STR_ACE_Captives_LoadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ - statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ - exceptions[] = {QGVAR(isNotEscorting)}; \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "L"; \ - }; \ - class ACE_UnloadCaptive { \ - displayName = "$STR_ACE_Captives_UnloadCaptive"; \ - distance = 4; \ - condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ - statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ - showDisabled = 0; \ - priority = 1.2; \ - hotkey = "C"; \ + class ACE_MainActions { \ + selection = ""; \ + class ACE_LoadCaptive { \ + displayName = "$STR_ACE_Captives_LoadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(canLoadCaptive)); \ + statement = QUOTE([ARR_3(_player, objNull, _target)] call FUNC(doLoadCaptive)); \ + exceptions[] = {QGVAR(isNotEscorting)}; \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "L"; \ + }; \ + class ACE_UnloadCaptive { \ + displayName = "$STR_ACE_Captives_UnloadCaptive"; \ + distance = 4; \ + condition = QUOTE([ARR_2(_player, _target)] call FUNC(canUnloadCaptive)); \ + statement = QUOTE([ARR_2(_player, _target)] call FUNC(doUnloadCaptive)); \ + showDisabled = 0; \ + priority = 1.2; \ + hotkey = "C"; \ + }; \ }; \ }; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 647a78c7b2..1e89a1b969 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -37,7 +37,7 @@ _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; _recurseFnc = { - private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_condition", "_showDisabled", + private ["_actions", "_displayName", "_distance", "_icon", "_statement", "_selection", "_condition", "_showDisabled", "_enableInside", "_children", "_entry", "_actionsCfg"]; _actions = []; _actionsCfg = _this select 0; @@ -48,7 +48,10 @@ _recurseFnc = { _distance = getNumber (_entryCfg >> "distance"); _icon = getText (_entryCfg >> "icon"); _statement = compile (getText (_entryCfg >> "statement")); - + _selection = getText (_entryCfg >> "selection"); + if (_selection == "") then { + _selection = [0,0,0]; + }; _condition = getText (_entryCfg >> "condition"); if (_condition == "") then {_condition = "true"}; @@ -59,24 +62,18 @@ _recurseFnc = { _enableInside = getNumber (_entryCfg >> "enableInside"); _condition = compile _condition; - // diag_log text format["_condition: %1", _condition]; - _children = []; - if(isArray (_entryCfg >> "subMenu")) then { - _subMenuDef = getArray (_entryCfg >> "subMenu"); - _childMenuName = _subMenuDef select 0; - _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions" >> _childMenuName; - _children = [_childMenuCfg] call _recurseFnc; - }; + _children = [_entryCfg] call _recurseFnc; _entry = [ _displayName, _icon, - [0,0,0], + _selection, _statement, _condition, _distance, _children, GVAR(uidCounter) ]; + diag_log _entry; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; @@ -85,9 +82,20 @@ _recurseFnc = { }; _actions = [_actionsCfg] call _recurseFnc; +//diag_log _actions; +// Backward-compat, filter only base actions that have a selection +private ["_newActions","_oldActions","_selection"]; +_filteredActions = []; +{ + _selection = _x select 2; + if (typeName _selection == "STRING") then { + _filteredActions pushBack _x; + }; +} forEach _actions; +/* _actions = [[ - "TEST!", + "Interactions", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", "Spine3", { true }, @@ -98,5 +106,5 @@ _actions = [[ ] ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; - -_object setVariable [QUOTE(GVAR(actionData)), _actions]; \ No newline at end of file +*/ +_object setVariable [QUOTE(GVAR(actionData)), _filteredActions]; \ No newline at end of file diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index c7386c9bc6..9fdb166f6d 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -18,6 +18,7 @@ if(!GVAR(keyDown)) then { _target = _actionObject; _player = ACE_player; _active = [_target, ACE_player] call (_actionItem select 4); + systemChat format ["%1 %2 is active %3", _actionObject, _actionItem select 0, _active]; // player sideChat format["_active: %1 %2", _actionItem select 0, _active]; if(_active) then { _renderItem = +_actionItem; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index ad381f691d..63623aeae1 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -6,7 +6,7 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; - +//systemChat format ["Drawing icon %1", _text]; _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 532762d41b..a5eb2cbe22 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -34,7 +34,6 @@ if(_cursorScreenPos distance _pos <= _distance) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; _path set[(count _path), _index]; - // player sideChat format["r: %1", _actionData select 2]; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; @@ -53,7 +52,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { _numActions = _numActions + 1; }; } forEach (_actionData select 6); - systemChat format ["_numActions: %1", _numActions]; + systemChat format ["Menu %1, _numActions: %2", _actionData select 0, _numActions]; private "_angleSpan"; _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); @@ -67,7 +66,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { _active = [_object, ACE_player] call (_x select 4); // diag_log text format["_active: %1: %2", (_x select 0), _active]; if(_active) then { - systemChat format ["_angle: %1", _angle]; + //systemChat format ["_angle: %1", _angle]; _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; _newPos = [ diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index ce1a98abc5..78b87f0967 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -30,123 +30,133 @@ class CfgVehicles { class Man; class CAManBase: Man { class ACE_Actions { - class ACE_TeamManagement { - displayName = "$STR_ACE_Interaction_TeamManagement"; + class ACE_MainActions { + displayName = "$STR_ACE_Interaction_MainAction"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); + condition = QUOTE(true); statement = ""; - showDisabled = 0; - priority = 3.2; - icon = PATHTOF(UI\team\team_management_ca.paa); - subMenu[] = {"ACE_TeamManagement", 0}; - hotkey = "M"; - enableInside = 1; + icon = "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa"; + selection = "spine3"; - class ACE_JoinTeamRed { - displayName = "$STR_ACE_Interaction_JoinTeamRed"; + class ACE_TeamManagement { + displayName = "$STR_ACE_Interaction_TeamManagement"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_red_ca.paa); - priority = 2.4; - hotkey = "R"; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); + statement = ""; + showDisabled = 0; + priority = 3.2; + icon = PATHTOF(UI\team\team_management_ca.paa); + hotkey = "M"; + enableInside = 1; + + class ACE_JoinTeamRed { + displayName = "$STR_ACE_Interaction_JoinTeamRed"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'RED')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_red_ca.paa); + priority = 2.4; + hotkey = "R"; + enableInside = 1; + }; + class ACE_JoinTeamGreen { + displayName = "$STR_ACE_Interaction_JoinTeamGreen"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_green_ca.paa); + priority = 2.3; + hotkey = "G"; + enableInside = 1; + }; + class ACE_JoinTeamBlue { + displayName = "$STR_ACE_Interaction_JoinTeamBlue"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_blue_ca.paa); + priority = 2.2; + hotkey = "B"; + enableInside = 1; + }; + class ACE_JoinTeamYellow { + displayName = "$STR_ACE_Interaction_JoinTeamYellow"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); + statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_yellow_ca.paa); + priority = 2.1; + hotkey = "Y"; + enableInside = 1; + }; + + class ACE_LeaveTeam { + displayName = "$STR_ACE_Interaction_LeaveTeam"; + distance = 4; + condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}); + statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); + showDisabled = 1; + icon = PATHTOF(UI\team\team_white_ca.paa); + priority = 2.5; + hotkey = "N"; + enableInside = 1; + }; + }; + + class ACE_JoinGroup { + displayName = "$STR_ACE_Interaction_JoinGroup"; + distance = 4; + condition = QUOTE(side group _player == side group _target && {group _player != group _target}); + statement = QUOTE([_player] joinSilent group _target;); + showDisabled = 0; + priority = 2.6; + icon = PATHTOF(UI\team\team_management_ca.paa); + hotkey = "J"; enableInside = 1; }; - class ACE_JoinTeamGreen { - displayName = "$STR_ACE_Interaction_JoinTeamGreen"; + + class ACE_GetDown { + displayName = "$STR_ACE_Interaction_GetDown"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'GREEN')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_green_ca.paa); - priority = 2.3; - hotkey = "G"; - enableInside = 1; - }; - class ACE_JoinTeamBlue { - displayName = "$STR_ACE_Interaction_JoinTeamBlue"; - distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'BLUE')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_blue_ca.paa); + condition = QUOTE([_target] call DFUNC(canInteractWith)); + statement = QUOTE([_target] call DFUNC(getDown)); + showDisabled = 0; priority = 2.2; - hotkey = "B"; - enableInside = 1; }; - class ACE_JoinTeamYellow { - displayName = "$STR_ACE_Interaction_JoinTeamYellow"; + class ACE_SendAway { + displayName = "$STR_ACE_Interaction_SendAway"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player}); - statement = QUOTE([ARR_2(_target,'YELLOW')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_yellow_ca.paa); - priority = 2.1; - hotkey = "Y"; - enableInside = 1; + condition = QUOTE([_target] call DFUNC(canInteractWith)); + statement = QUOTE([_target] call DFUNC(sendAway)); + showDisabled = 0; + priority = 2.0; }; - - class ACE_LeaveTeam { - displayName = "$STR_ACE_Interaction_LeaveTeam"; + class ACE_Pardon { + displayName = "$STR_ACE_Interaction_Pardon"; distance = 4; - condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {assignedTeam _player != 'MAIN'}); - statement = QUOTE([ARR_2(_target,'MAIN')] call DFUNC(joinTeam)); - showDisabled = 1; - icon = PATHTOF(UI\team\team_white_ca.paa); + condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target}); + statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc)); + showDisabled = 0; priority = 2.5; - hotkey = "N"; enableInside = 1; }; }; class ACE_TapShoulder { displayName = "$STR_ACE_Interaction_TapShoulder"; + selection = "rightshoulder"; distance = 4; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); statement = QUOTE([ARR_2(_player, _target)] call DFUNC(tapShoulder)); - showDisabled = 1; + showDisabled = 0; priority = 2.8; hotkey = "Q"; enableInside = 1; }; - class ACE_JoinGroup { - displayName = "$STR_ACE_Interaction_JoinGroup"; - distance = 4; - condition = QUOTE(side group _player == side group _target && {group _player != group _target}); - statement = QUOTE([_player] joinSilent group _target;); - showDisabled = 0; - priority = 2.6; - icon = PATHTOF(UI\team\team_management_ca.paa); - hotkey = "J"; - enableInside = 1; - }; - - class ACE_GetDown { - displayName = "$STR_ACE_Interaction_GetDown"; - distance = 4; - condition = QUOTE([_target] call DFUNC(canInteractWith)); - statement = QUOTE([_target] call DFUNC(getDown)); - showDisabled = 0; - priority = 2.2; - }; - class ACE_SendAway { - displayName = "$STR_ACE_Interaction_SendAway"; - distance = 4; - condition = QUOTE([_target] call DFUNC(canInteractWith)); - statement = QUOTE([_target] call DFUNC(sendAway)); - showDisabled = 0; - priority = 2.0; - }; - class ACE_Pardon { - displayName = "$STR_ACE_Interaction_Pardon"; - distance = 4; - condition = QUOTE(rating _target < -2000 && {alive _target} && {side group _player == side group _target}); - statement = QUOTE([ARR_3(_target,'{_this addRating -rating _this}',_target)] call DEFUNC(common,execRemoteFnc)); - showDisabled = 0; - priority = 2.5; - enableInside = 1; - }; }; class ACE_SelfActions { diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index e58e808687..d0c5f47790 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -2,6 +2,9 @@ + + Interactions >> + Interaction Menu Interaktionsmenü diff --git a/addons/logistics_uavbattery/CfgVehicles.hpp b/addons/logistics_uavbattery/CfgVehicles.hpp index 933079071a..a3a3fc763d 100644 --- a/addons/logistics_uavbattery/CfgVehicles.hpp +++ b/addons/logistics_uavbattery/CfgVehicles.hpp @@ -2,6 +2,7 @@ class CfgVehicles { class Helicopter_Base_F; class UAV_01_base_F: Helicopter_Base_F { class ACE_Actions { + class ACE_MainActions { class GVAR(RefuelUAV) { displayName = "$STR_ACE_logistics_uavbattery_Recharge"; distance = 4; @@ -11,9 +12,10 @@ class CfgVehicles { priority = 1.245; \ icon = QUOTE(PATHTOF(ui\UAV_battery.paa)); }; + }; }; }; - + // Misc box content class Box_NATO_Support_F; class ACE_Box_Misc: Box_NATO_Support_F { diff --git a/addons/map/CfgVehicles.hpp b/addons/map/CfgVehicles.hpp index 6c2d4a1ee1..eafc85cdf1 100644 --- a/addons/map/CfgVehicles.hpp +++ b/addons/map/CfgVehicles.hpp @@ -85,12 +85,14 @@ class CfgVehicles { }; class ACE_Actions { - class ACE_CopyMap { - displayName = "$STR_ACE_Map_CopyMap"; - condition = QUOTE(([_target] call EFUNC(common,isPlayer) && {'ItemMap' in assigneditems _player} && {'ACE_MapTools' in items _player} && {'ItemMap' in assignedItems _target})); - statement = QUOTE([ARR_2(_player,_target)] call FUNC(copyMapStart)); - showDisabled = 0; - priority = -1; + class ACE_MainActions { + class ACE_CopyMap { + displayName = "$STR_ACE_Map_CopyMap"; + condition = QUOTE(([_target] call EFUNC(common,isPlayer) && {'ItemMap' in assigneditems _player} && {'ACE_MapTools' in items _player} && {'ItemMap' in assignedItems _target})); + statement = QUOTE([ARR_2(_player,_target)] call FUNC(copyMapStart)); + showDisabled = 0; + priority = -1; + }; }; }; }; diff --git a/addons/respawn/CfgVehicles.hpp b/addons/respawn/CfgVehicles.hpp index bdf4576eb3..cbf35b0baf 100644 --- a/addons/respawn/CfgVehicles.hpp +++ b/addons/respawn/CfgVehicles.hpp @@ -78,13 +78,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -98,13 +103,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -118,13 +128,18 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Rallypoint"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + selection = ""; + class ACE_Teleport { + displayName = "Teleport to Rallypoint"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player, side group _player, false)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -139,13 +154,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_nato_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == west); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == west); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -159,13 +178,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_CSAT_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == east); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == east); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; @@ -179,13 +202,17 @@ class CfgVehicles { init = QUOTE((_this select 0) setFlagTexture '\A3\Data_F\Flags\Flag_AAF_CO.paa'; _this call FUNC(initRallypoint)); }; class ACE_Actions : ACE_Actions { - class ACE_Teleport { - displayName = "Teleport to Base"; - distance = 4; - condition = QUOTE(side group _player == independent); - statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); - showDisabled = 1; - priority = 1; + class ACE_MainActions { + distance = 5; + condition = "true"; + class ACE_Teleport { + displayName = "Teleport to Base"; + distance = 4; + condition = QUOTE(side group _player == independent); + statement = QUOTE([ARR_3(_player, side group _player, true)] call FUNC(teleportToRallypoint)); + showDisabled = 1; + priority = 1; + }; }; }; }; diff --git a/addons/vehiclelock/CfgVehicles.hpp b/addons/vehiclelock/CfgVehicles.hpp index 79591280d8..2ffb4eee44 100644 --- a/addons/vehiclelock/CfgVehicles.hpp +++ b/addons/vehiclelock/CfgVehicles.hpp @@ -1,29 +1,34 @@ #define MACRO_LOCK_ACTIONS \ - class ACE_unlockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ - distance = 4; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ - statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ - priority = 0.3; \ - icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ - }; \ - class ACE_lockVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lock"; \ - distance = 4; \ - condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ - statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ - showDisabled = 0; \ - priority = 0.2; \ - icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ - }; \ - class ACE_lockpickVehicle { \ - displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ - distance = 4; \ - condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ - statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ - showDisabled = 0; \ - priority = 0.1; \ + class ACE_MainActions { \ + selection = ""; \ + distance = 5; \ + condition = "true"; \ + class ACE_unlockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_UnLock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(2,3)]}); \ + statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,false)])] call EFUNC(common,targetEvent)); \ + showDisabled = 0; \ + priority = 0.3; \ + icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lock"; \ + distance = 4; \ + condition = QUOTE(([ARR_2(_player, _target)] call FUNC(hasKeyForVehicle)) && {(locked _target) in [ARR_2(0,1)]}); \ + statement = QUOTE([ARR_3('SetVehicleLock', [_target], [ARR_2(_target,true)])] call EFUNC(common,targetEvent)); \ + showDisabled = 0; \ + priority = 0.2; \ + icon = QUOTE(PATHTOF(ui\key_menuIcon_ca.paa)); \ + }; \ + class ACE_lockpickVehicle { \ + displayName = "$STR_ACE_Vehicle_Action_Lockpick"; \ + distance = 4; \ + condition = QUOTE([ARR_3(_player, _target, 'canLockpick')] call FUNC(lockpick)); \ + statement = QUOTE([ARR_3(_player, _target, 'startLockpick')] call FUNC(lockpick)); \ + showDisabled = 0; \ + priority = 0.1; \ + }; \ }; class CfgVehicles { From 861a6b1775ca23ece2748dbee581c1c551fe6522 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 15:47:59 -0300 Subject: [PATCH 41/62] avoid all submenus opening simultaneously by switching menu paths to use uids --- addons/interact_menu/functions/fnc_renderMenu.sqf | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index a5eb2cbe22..e6b47241c4 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,11 +1,11 @@ //fnc_renderMenu.sqf #include "script_component.hpp" -private ["_object", "_actionData", "_distance", "_index", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; +private ["_object", "_actionData", "_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; _object = _this select 0; _actionData = _this select 1; -_index = _this select 2; +_uid = _actionData select 7;//_this select 2; _angles = _this select 3; _distance = _actionData select 5; @@ -30,16 +30,16 @@ if(_cursorScreenPos distance _pos <= _distance) then { // ARGB Color (First Hex Pair is transparancy) _color = "#FFFFFFFF"; - if(_menuDepth > 0 && _index != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { + if(_menuDepth > 0 && _uid != (GVAR(menuDepthPath) select (GVAR(renderDepth)))) then { _color = format ["#%1FFFFFF", [255 * (((GVAR(renderDepth)/_menuDepth)) max 0.25)] call EFUNC(common,toHex)]; }; - _path set[(count _path), _index]; + _path set[(count _path), _uid]; [_actionData select 0, _color, _pos, 1, 1, 0, _actionData select 1, 0.5, 0.025, "TahomaB"] call FUNC(renderIcon); GVAR(currentOptions) set[(count GVAR(currentOptions)), [_this, _pos, _path]]; _currentRenderDepth = -1; _currentRenderDepth = GVAR(renderDepth); GVAR(renderDepth) = GVAR(renderDepth) + 1; - if(_index == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { + if(_uid == (GVAR(menuDepthPath) select (GVAR(renderDepth)-1))) then { // Count how many actions are active private "_numActions"; _numActions = 0; From a8e269bc18d46f65d77599123194dc336d56277b Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Thu, 19 Feb 2015 14:34:08 -0600 Subject: [PATCH 42/62] Cleanup Escort Logic No more ERROR spam --- .../captives/functions/fnc_canStopEscorting.sqf | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index e6a5a0e568..56065a43fc 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -19,22 +19,10 @@ PARAMS_1(_unit); DEFAULT_PARAM(1,_target,objNull); -private ["_isAttached"]; - if (isNull _target) then { _target = _unit getVariable [QGVAR(escortedUnit), objNull]; }; -if (isNull _target) exitWith { - ERROR("Null Target (no ACE_escortedUnit)"); - false -}; +if (isNull _target) exitWith {false}; -_isAttached = _target in (attachedObjects _unit); - -if (_isAttached && (!(_target getVariable [QGVAR(isHandcuffed), false]))) exitWith { - ERROR("Attached But Not Captive"); - false -}; - -_isAttached +(_target in (attachedObjects _unit)) && {_target getVariable [QGVAR(isHandcuffed), false]} From a81c1fbef5cc637276325830e8f1e3ffe2c84876 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 21:38:51 +0100 Subject: [PATCH 43/62] Overhauled AGM hint. --- addons/common/HintConfig.hpp | 6 ++-- addons/common/config.cpp | 29 ++++++++++++++++++- .../functions/fnc_displayTextPicture.sqf | 2 +- .../functions/fnc_displayTextStructured.sqf | 29 ++++++++++--------- .../functions/fnc_setSettingFromConfig.sqf | 3 +- addons/common/stringtable.xml | 8 ++++- 6 files changed, 56 insertions(+), 21 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 8c8dc38abb..28346c3da3 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -25,6 +25,7 @@ class RscTitles { y = safeZoneY + 0.2 * safezoneH; w = 0.2 * safeZoneW; h = 0.1 * SafeZoneH; + font = "PuristaMedium"; }; }; }; @@ -36,7 +37,6 @@ class RscTitles { fadeIn = 0.2; fadeOut = 0.2; name = "ACE_RscErrorHint"; - class controls { class HintBox: RscStructuredText { idc = 1; @@ -56,7 +56,7 @@ class RscTitles { duration = 7; idd = 86411; movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];" + onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];"; fadein = 0; class controlsBackground { class header: ACE_gui_staticBase { @@ -88,7 +88,7 @@ class RscTitles { duration = 15; idd = 86412; movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];" + onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];"; fadein = 0; class controlsBackground { class header: ACE_gui_staticBase { diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b1c479b54f..b86744f0a9 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -102,7 +102,14 @@ class ACE_Settings { displayName = "$STR_ACE_Common_SettingFeedbackIconsName"; description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; - }; + }; + class GVAR(displayTextColor) { + value[] = {0,0,0,0}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; + description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; + }; }; #include "define.hpp" @@ -113,3 +120,23 @@ class ACE_Settings { #include #include +class CfgUIGrids { + class IGUI { + class Presets { + class Arma3 { + class Variables { + grid_ACE_displayText[] = {{safeZoneW + safeZoneX - 0.175 * safezoneW, safeZoneY + 0.175 * safezoneH, 0.15 * safeZoneW, 0.125 * SafeZoneH}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; + }; + }; + }; + + class Variables { + class grid_ACE_displayText { + displayName = "ACE Hint"; + description = "Textual in game feedback to the player."; + preview = "\a3\Ui_f\data\GUI\Cfg\UIGrids\grid_hint_ca.paa"; + saveToProfile[] = {0,1}; + }; + }; + }; +}; diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 8d46d8d38e..060f04f591 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -22,7 +22,7 @@ if (typeName _text != "TEXT") then { }; _text = composeText [ - parseText format ["", _image], + parseText format ["", _image], lineBreak, _text ]; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 62db6a829f..e103c904b3 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -12,7 +12,7 @@ */ #include "script_component.hpp" -private ["_text", "_size", "_isShown", "_ctrlHint"]; +private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; _text = _this select 0; _size = _this select 1; @@ -20,7 +20,10 @@ _size = _this select 1; if (isNil "_size") then {_size = 1}; if (typeName _text != "TEXT") then { - _text = composeText [lineBreak, parseText format ["%1", _text]]; + if (typeName _text == "STRING" && {isLocalized _text}) then { + _text = localize _text; + }; + _text = composeText [lineBreak, parseText format ["%1", _text]]; }; _isShown = ctrlShown (uiNamespace getVariable ["ACE_ctrlHint", controlNull]); @@ -30,19 +33,17 @@ _isShown = ctrlShown (uiNamespace getVariable ["ACE_ctrlHint", controlNull]); disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; -_ctrlHint ctrlSetPosition [ - safeZoneW + safeZoneX - 0 * safezoneW, - safeZoneY + 0.2 * safezoneH, - 0.2 * safeZoneW, - _size * 0.1 * SafeZoneH -]; +_ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); + +_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", safeZoneW + safeZoneX - 0.175 * safezoneW]; +_yPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_Y", safeZoneY + 0.175 * safezoneH]; +_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", 0.15 * safeZoneW]; +_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", 0.125 * SafeZoneH]; +_position = [_xPos, _yPos, _wPos, _size * _hPos]; + +_ctrlHint ctrlSetPosition _position; _ctrlHint ctrlCommit 0; _ctrlHint ctrlSetStructuredText _text; -_ctrlHint ctrlSetPosition [ - safeZoneW + safeZoneX - 0.2 * safezoneW, - safeZoneY + 0.2 * safezoneH, - 0.2 * safeZoneW, - _size * 0.1 * SafeZoneH -]; +_ctrlHint ctrlSetPosition _position; _ctrlHint ctrlCommit ([0.2, 0] select _isShown); diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 4151f3e0e4..577f3083e6 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -17,7 +17,8 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - _value = getNumber (_optionEntry >> "value"); + _valueConfig = (_optionEntry >> "value"); + _value = if (!(isArray _valueConfig) && !(isText _valueConfig)) then { getNumber (_optionEntry >> "value"); } else { 0 }; TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index f7705f8ad9..3ece4206d7 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -320,7 +320,13 @@ Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. - + + + Hint Background color + + + The color of the background from the ACE hints. + \ No newline at end of file From b58abaa2c03dc175fd2ff04f43bf2bbef137db67 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Thu, 19 Feb 2015 22:01:09 +0100 Subject: [PATCH 44/62] Added a transparant background --- addons/common/config.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b86744f0a9..201e44e181 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -104,7 +104,7 @@ class ACE_Settings { values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; }; class GVAR(displayTextColor) { - value[] = {0,0,0,0}; + value[] = {0,0,0,0.1}; typeName = "COLOR"; isClientSetable = 1; displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; From 0dfeb22ec87084c04d8148276deee0b4153017be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:03:14 -0300 Subject: [PATCH 45/62] tidy up --- addons/interact_menu/XEH_preInit.sqf | 19 +++++++++---------- addons/interact_menu/config.cpp | 2 +- .../interact_menu/functions/fnc_addAction.sqf | 19 ++++++++++--------- .../functions/fnc_setToRender.sqf | 6 ------ 4 files changed, 20 insertions(+), 26 deletions(-) delete mode 100644 addons/interact_menu/functions/fnc_setToRender.sqf diff --git a/addons/interact_menu/XEH_preInit.sqf b/addons/interact_menu/XEH_preInit.sqf index da01026425..d3766cf765 100644 --- a/addons/interact_menu/XEH_preInit.sqf +++ b/addons/interact_menu/XEH_preInit.sqf @@ -2,21 +2,20 @@ ADDON = false; -PREP(setToRender); -PREP(render); -PREP(renderIcon); -PREP(renderMenu); -PREP(probe); -PREP(rotateVectLineGetMap); -PREP(rotateVectLine); +PREP(addAction); +PREP(compileMenu); +PREP(compileMenuSelfAction); PREP(keyDown); PREP(keyDownSelfAction); PREP(keyUp); PREP(keyUpSelfAction); -PREP(compileMenu); -PREP(compileMenuSelfAction); -PREP(addAction); +PREP(probe); PREP(removeAction); +PREP(render); +PREP(renderIcon); +PREP(renderMenu); +PREP(rotateVectLine); +PREP(rotateVectLineGetMap); GVAR(toRender) = []; diff --git a/addons/interact_menu/config.cpp b/addons/interact_menu/config.cpp index a7b7bae6df..784c6529d6 100644 --- a/addons/interact_menu/config.cpp +++ b/addons/interact_menu/config.cpp @@ -6,7 +6,7 @@ class CfgPatches { weapons[] = {}; requiredVersion = REQUIRED_VERSION; requiredAddons[] = {"ace_common"}; - author[] = {""}; + author[] = {"NouberNou", "CAA-Picard"}; authorUrl = ""; VERSION_CONFIG; }; diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 4b9243cfac..9c22023db4 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -1,19 +1,20 @@ /* * Author: commy2 - * * Add an ACE action to an object. Note: This function is NOT global. * * Argument: - * 0: Object the action should be assigned to (Object) - * 1: Name of the action shown in the menu (String) - * 2: Icon (String) - * 3: Position (Position or Selection Name) - * 4: Statement (Code) - * 5: Condition (Code) - * 6: Distance (Number) + * 0: Object the action should be assigned to + * 1: Name of the action shown in the menu + * 2: Icon + * 3: Position (Position or Selection Name) or + * 4: Statement + * 5: Condition + * 6: Distance * * Return value: - * The entry array, which can be used to remove the entry, or add children entries. + * The entry array, which can be used to remove the entry, or add children entries . + * + * Public: No */ #include "script_component.hpp" diff --git a/addons/interact_menu/functions/fnc_setToRender.sqf b/addons/interact_menu/functions/fnc_setToRender.sqf deleted file mode 100644 index 4cc7cfd68f..0000000000 --- a/addons/interact_menu/functions/fnc_setToRender.sqf +++ /dev/null @@ -1,6 +0,0 @@ -//fnc_setToRender.sqf -#include "script_component.hpp" -// No idea what this function was for, it was autogenerated out of my WIP file... -private ["_options"]; -_object = _this select 0; -_options = _this select 1; From 41145e5731b86d7ef3af40f349cb3248478ec8e6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:03:25 -0300 Subject: [PATCH 46/62] reduce size of the menu --- addons/interact_menu/functions/fnc_renderIcon.sqf | 3 ++- addons/interact_menu/functions/fnc_renderMenu.sqf | 13 +++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index 63623aeae1..a57a0642a1 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -19,9 +19,10 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%4", _icon, _color, _color, _text]; + _text = format ["%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; + // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index e6b47241c4..aafcf78f27 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -55,7 +55,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { systemChat format ["Menu %1, _numActions: %2", _actionData select 0, _numActions]; private "_angleSpan"; - _angleSpan = _maxAngleSpan min (35 * (_numActions - 1)); + _angleSpan = _maxAngleSpan min (55 * (_numActions - 1)); private "_angle"; _angle = _centerAngle - _angleSpan / 2; @@ -68,15 +68,20 @@ if(_cursorScreenPos distance _pos <= _distance) then { if(_active) then { //systemChat format ["_angle: %1", _angle]; _offset = [GVAR(vecLineMap), _angle] call FUNC(rotateVectLine); - _mod = 0.4 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; + _mod = 0.15 max (0.15 * (_cursorScreenPos distance _pos)); //0.5;//0.1*_distance; _newPos = [ (_pos select 0) + ((_offset select 0)*_mod), (_pos select 1) + ((_offset select 1)*_mod), (_pos select 2) + ((_offset select 2)*_mod) ]; // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - [_object, _x, _forEachIndex, [_angle, 180], _newPos, _path] call FUNC(renderMenu); - _angle = _angle + _angleSpan / ((_numActions-1) max 1); + [_object, _x, _forEachIndex, [_angle, 170], _newPos, _path] call FUNC(renderMenu); + + if (_angle == 360) then { + _angle = _angle + _angleSpan / _numActions; + } else { + _angle = _angle + _angleSpan / ((_numActions-1) max 1); + }; }; } forEach (_actionData select 6); }; From bc3a226c64dd7e15687823ab4c2a938bc6d5b9b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 18:56:43 -0300 Subject: [PATCH 47/62] Text under the icon --- addons/interact_menu/functions/fnc_renderIcon.sqf | 6 +++--- addons/interact_menu/functions/fnc_renderMenu.sqf | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index a57a0642a1..efa28907bf 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -19,10 +19,10 @@ if(count _sPos > 0) then { if(_icon == "") then { _icon = DEFAULT_ICON; }; - _text = format ["%4", _icon, _color, _color, _text]; + _text = format ["
%4", _icon, _color, _color, _text]; _ctrl ctrlSetStructuredText (parseText _text); - _ctrl ctrlSetPosition [(_sPos select 0)-(0.011*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.025*SafeZoneW]; - + _ctrl ctrlSetPosition [(_sPos select 0)-(0.2*SafeZoneW), (_sPos select 1)-(0.0095*SafeZoneW), 0.4*SafeZoneW, 0.035*SafeZoneW]; + //_ctrl ctrlSetBackgroundColor [1, 0, 0, 0.1]; // _ctrl ctrlSetBackgroundColor [1,0,0,1]; _ctrl ctrlCommit 0; }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index aafcf78f27..91104d9c6b 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -75,7 +75,7 @@ if(_cursorScreenPos distance _pos <= _distance) then { (_pos select 2) + ((_offset select 2)*_mod) ]; // drawLine3D [_pos, _newPos, [1,0,0,0.5]]; - [_object, _x, _forEachIndex, [_angle, 170], _newPos, _path] call FUNC(renderMenu); + [_object, _x, _forEachIndex, [_angle, 150], _newPos, _path] call FUNC(renderMenu); if (_angle == 360) then { _angle = _angle + _angleSpan / _numActions; From dd92c5e845b5cbeeaea04067703684c87c6b64a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 19:45:46 -0300 Subject: [PATCH 48/62] Tap on either shoulder. "Tap" animation --- addons/interaction/CfgVehicles.hpp | 17 ++++++++-- .../interaction/functions/fnc_tapShoulder.sqf | 21 ++++++------ addons/interaction/stringtable.xml | 34 +++++++++++++------ 3 files changed, 48 insertions(+), 24 deletions(-) diff --git a/addons/interaction/CfgVehicles.hpp b/addons/interaction/CfgVehicles.hpp index 78b87f0967..801e564384 100644 --- a/addons/interaction/CfgVehicles.hpp +++ b/addons/interaction/CfgVehicles.hpp @@ -146,12 +146,23 @@ class CfgVehicles { }; }; - class ACE_TapShoulder { + class ACE_TapShoulderRight { displayName = "$STR_ACE_Interaction_TapShoulder"; selection = "rightshoulder"; - distance = 4; + distance = 2.0; condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); - statement = QUOTE([ARR_2(_player, _target)] call DFUNC(tapShoulder)); + statement = QUOTE([ARR_3(_player, _target, 0)] call DFUNC(tapShoulder)); + showDisabled = 0; + priority = 2.8; + hotkey = "Q"; + enableInside = 1; + }; + class ACE_TapShoulderLeft { + displayName = "$STR_ACE_Interaction_TapShoulder"; + selection = "leftshoulder"; + distance = 2.0; + condition = QUOTE([ARR_2(_player, _target)] call DFUNC(canTapShoulder)); + statement = QUOTE([ARR_3(_player, _target, 1)] call DFUNC(tapShoulder)); showDisabled = 0; priority = 2.8; hotkey = "Q"; diff --git a/addons/interaction/functions/fnc_tapShoulder.sqf b/addons/interaction/functions/fnc_tapShoulder.sqf index 02eed88542..262012dbb9 100644 --- a/addons/interaction/functions/fnc_tapShoulder.sqf +++ b/addons/interaction/functions/fnc_tapShoulder.sqf @@ -1,21 +1,22 @@ // by commy2 #include "script_component.hpp" -private ["_unit", "_message"]; - -_tapper = _this select 0; -_target = _this select 1; +EXPLODE_3_PVT(_this,_tapper,_target,_shoulderNum); if (_target != ACE_player) exitWith { - addCamShake [4, 0.5, 5]; - if !(local _target) then { - [[_tapper, _target], QUOTE(DFUNC(tapShoulder)), _target] call EFUNC(common,execRemoteFnc); - }; + addCamShake [4, 0.5, 5]; + ACE_player playActionNow 'gestureAdvance'; + if !(local _target) then { + [[_tapper, _target, _shoulderNum], QUOTE(DFUNC(tapShoulder)), _target] call EFUNC(common,execRemoteFnc); + }; }; addCamShake [4, 0.5, 5]; -//_message = format ["%1 tapped you on your shoulder.", [_unit] call EFUNC(common,getName)]; -_message = localize "STR_ACE_Interaction_YouWereTapped"; +if (_shoulderNum == 0) then { + _message = localize "STR_ACE_Interaction_YouWereTappedRight"; +} else { + _message = localize "STR_ACE_Interaction_YouWereTappedLeft"; +}; [_message] call EFUNC(common,displayTextStructured); diff --git a/addons/interaction/stringtable.xml b/addons/interaction/stringtable.xml index d0c5f47790..960d136c0f 100644 --- a/addons/interaction/stringtable.xml +++ b/addons/interaction/stringtable.xml @@ -341,17 +341,29 @@ Tocar ombro Dai un colpetto - - You were tapped on the shoulder. - Dir wurde auf die Schulter geklopft - Te tocaron el hombro. - On te tape sur l'épaule. - Zostałeś klepnięty po ramieniu - Vállonveregettek - Někdo tě poklepal na rameno. - Вас похлопали по плечу - Você foi tocado no ombro. - Ti è stato dato un colpetto sulla spalla + + You were tapped on the RIGHT shoulder > + Te tocaron el hombro DERECHO > + Dir wurde auf die Schulter geklopft > + On te tape sur l'épaule > + Zostałeś klepnięty po ramieniu > + Vállonveregettek > + Někdo tě poklepal na rameno > + Вас похлопали по плечу > + Você foi tocado no ombro > + Ti è stato dato un colpetto sulla spalla > + + + < You were tapped on the LEFT shoulder. + < Te tocaron el hombro IZQUIERDO. + < Dir wurde auf die Schulter geklopft + < On te tape sur l'épaule. + < Zostałeś klepnięty po ramieniu + < Vállonveregettek + < Někdo tě poklepal na rameno. + < Вас похлопали по плечу + < Você foi tocado no ombro. + < Ti è stato dato un colpetto sulla spalla Cancel From 908f23a78f315c03ed6135d885c51c82b60a6fa2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Thu, 19 Feb 2015 20:10:07 -0300 Subject: [PATCH 49/62] Removed filtering actions --- .../functions/fnc_compileMenu.sqf | 26 +------------------ 1 file changed, 1 insertion(+), 25 deletions(-) diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index 1e89a1b969..e1168baa2b 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -82,29 +82,5 @@ _recurseFnc = { }; _actions = [_actionsCfg] call _recurseFnc; -//diag_log _actions; -// Backward-compat, filter only base actions that have a selection -private ["_newActions","_oldActions","_selection"]; -_filteredActions = []; -{ - _selection = _x select 2; - if (typeName _selection == "STRING") then { - _filteredActions pushBack _x; - }; -} forEach _actions; -/* -_actions = [[ - "Interactions", - "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", - "Spine3", - { true }, - { true }, - 5, - _actions, - GVAR(uidCounter) -] -]; -GVAR(uidCounter) = GVAR(uidCounter) + 1; -*/ -_object setVariable [QUOTE(GVAR(actionData)), _filteredActions]; \ No newline at end of file +_object setVariable [QUOTE(GVAR(actionData)), _actions]; From 6b7f649244e6d6f68930a795fe56b82497bdaaf1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=A1s=20Badano?= Date: Sat, 21 Feb 2015 17:11:03 -0300 Subject: [PATCH 50/62] interact_menu: add headers --- .../interact_menu/functions/fnc_addAction.sqf | 19 +++----- .../functions/fnc_compileMenu.sqf | 36 +++++++--------- .../functions/fnc_compileMenuSelfAction.sqf | 43 ++++++++----------- .../interact_menu/functions/fnc_keyDown.sqf | 13 +++++- .../functions/fnc_keyDownSelfAction.sqf | 13 +++++- addons/interact_menu/functions/fnc_keyUp.sqf | 13 +++++- .../functions/fnc_keyUpSelfAction.sqf | 13 +++++- addons/interact_menu/functions/fnc_probe.sqf | 18 ++++++-- .../functions/fnc_removeAction.sqf | 23 +++++----- addons/interact_menu/functions/fnc_render.sqf | 13 +++++- .../functions/fnc_renderIcon.sqf | 23 ++++++++-- .../functions/fnc_renderMenu.sqf | 18 +++++++- .../functions/fnc_rotateVectLine.sqf | 14 +++++- .../functions/fnc_rotateVectLineGetMap.sqf | 15 ++++++- 14 files changed, 190 insertions(+), 84 deletions(-) diff --git a/addons/interact_menu/functions/fnc_addAction.sqf b/addons/interact_menu/functions/fnc_addAction.sqf index 9c22023db4..3d445a4b13 100644 --- a/addons/interact_menu/functions/fnc_addAction.sqf +++ b/addons/interact_menu/functions/fnc_addAction.sqf @@ -1,9 +1,9 @@ /* - * Author: commy2 - * Add an ACE action to an object. Note: This function is NOT global. + * Author: commy2 and NouberNou + * Add an ACE action to an object or inside a parent action. Note: This function is NOT global. * * Argument: - * 0: Object the action should be assigned to + * 0: Object the action should be assigned to or parent action or * 1: Name of the action shown in the menu * 2: Icon * 3: Position (Position or Selection Name) or @@ -18,15 +18,10 @@ */ #include "script_component.hpp" -private ["_object", "_displayName", "_icon", "_position", "_statement", "_condition", "_distance", "_actions", "_entry"]; -_object = _this select 0; -_displayName = _this select 1; -_icon = _this select 2; -_position = _this select 3; -_statement = _this select 4; -_condition = _this select 5; -_distance = _this select 6; +EXPLODE_7_PVT(_this,_object,_displayName,_icon,_position,_statement,_condition,_distance); + +private ["_actions","_entry"]; _actions = []; if(IS_OBJECT(_object)) then { _actions = _object getVariable [QUOTE(GVAR(actionData)), []]; @@ -51,4 +46,4 @@ _entry = [ ]; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; -_entry; \ No newline at end of file +_entry; diff --git a/addons/interact_menu/functions/fnc_compileMenu.sqf b/addons/interact_menu/functions/fnc_compileMenu.sqf index e1168baa2b..0bcecf0732 100644 --- a/addons/interact_menu/functions/fnc_compileMenu.sqf +++ b/addons/interact_menu/functions/fnc_compileMenu.sqf @@ -1,23 +1,18 @@ -//fnc_compileMenu.sqf -#include "script_component.hpp"; -// diag_log text format["COMPILE ACTIONS: %1", _this]; - -_object = _this select 0; -_objectType = typeOf _object; - - /* -displayName = "$STR_ACE_Interaction_TeamManagement"; -distance = 4; -condition = QUOTE(alive _target && {!isPlayer _target} && {_target in units group _player} && {GVAR(EnableTeamManagement)}); -statement = ""; -showDisabled = 0; -priority = 3.2; -icon = PATHTOF(UI\team\team_management_ca.paa); -subMenu[] = {"ACE_TeamManagement", 0}; -hotkey = "M"; -enableInside = 1; -*/ + * Author: NouberNou + * Compile the action menu from config for a given object. + * + * Argument: + * 0: Object + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +EXPLODE_1_PVT(_this,_object); /* [ @@ -33,6 +28,8 @@ enableInside = 1; ] */ +private ["_objectType","_recurseFnc","_actions"]; +_objectType = typeOf _object; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_Actions"; @@ -73,7 +70,6 @@ _recurseFnc = { _children, GVAR(uidCounter) ]; - diag_log _entry; GVAR(uidCounter) = GVAR(uidCounter) + 1; _actions pushBack _entry; }; diff --git a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf index 923b65e954..0135d64eb8 100644 --- a/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_compileMenuSelfAction.sqf @@ -1,21 +1,18 @@ -//fnc_compileMenuSelfAction.sqf -#include "script_component.hpp"; -// diag_log text format["COMPILE ACTIONS: %1", _this]; - -_object = _this select 0; -_objectType = typeOf _object; - - /* -displayName = "$STR_ACE_Hearing_Earbuds_On"; -condition = QUOTE( !([_player] call FUNC(hasEarPlugsIn)) && {'ACE_EarBuds' in items _player} ); -statement = QUOTE( [_player] call FUNC(putInEarPlugs) ); -showDisabled = 0; -priority = 2.5; -icon = PATHTOF(UI\ACE_earplugs_x_ca.paa); -hotkey = "E"; -enableInside = 1; -*/ + * Author: NouberNou and CAA-Picard + * Compile the self action menu from config for a given object. + * + * Argument: + * 0: Object + * + * Return value: + * None + * + * Public: No + */ +#include "script_component.hpp"; + +EXPLODE_1_PVT(_this,_object); /* [ @@ -31,6 +28,8 @@ enableInside = 1; ] */ +private ["_objectType","_recurseFnc","_actions"]; +_objectType = typeOf _object; _actionsCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions"; @@ -56,14 +55,7 @@ _recurseFnc = { _enableInside = getNumber (_entryCfg >> "enableInside"); _condition = compile _condition; - // diag_log text format["_condition: %1", _condition]; - _children = []; - if(isArray (_entryCfg >> "subMenu")) then { - _subMenuDef = getArray (_entryCfg >> "subMenu"); - _childMenuName = _subMenuDef select 0; - _childMenuCfg = configFile >> "CfgVehicles" >> _objectType >> "ACE_SelfActions" >> _childMenuName; - _children = [_childMenuCfg] call _recurseFnc; - }; + _children = [_entryCfg] call _recurseFnc; _entry = [ _displayName, _icon, @@ -83,6 +75,7 @@ _recurseFnc = { _actions = [_actionsCfg] call _recurseFnc; +// Create a master action to base on self action _actions = [[ "Self Actions", "\a3\ui_f\data\IGUI\Cfg\Actions\eject_ca.paa", diff --git a/addons/interact_menu/functions/fnc_keyDown.sqf b/addons/interact_menu/functions/fnc_keyDown.sqf index fdd39e7dc8..5d37019858 100644 --- a/addons/interact_menu/functions/fnc_keyDown.sqf +++ b/addons/interact_menu/functions/fnc_keyDown.sqf @@ -1,4 +1,15 @@ -//fnc_keyDown.sqf +/* + * Author: NouberNou + * Handle interaction key down + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" if(!GVAR(keyDown)) then { diff --git a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf index 8e86cfd430..be46dd132c 100644 --- a/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyDownSelfAction.sqf @@ -1,4 +1,15 @@ -//fnc_keyDownSelfAction.sqf +/* + * Author: NouberNou + * Handle self action key down + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" if(!GVAR(keyDownSelfAction)) then { diff --git a/addons/interact_menu/functions/fnc_keyUp.sqf b/addons/interact_menu/functions/fnc_keyUp.sqf index 922a5dedce..6a39f40f95 100644 --- a/addons/interact_menu/functions/fnc_keyUp.sqf +++ b/addons/interact_menu/functions/fnc_keyUp.sqf @@ -1,4 +1,15 @@ -//fnc_keyUpSelfAction.sqf +/* + * Author: NouberNou + * Handle interaction key up + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" GVAR(keyDown) = false; diff --git a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf index b0023300bf..82130c9993 100644 --- a/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf +++ b/addons/interact_menu/functions/fnc_keyUpSelfAction.sqf @@ -1,4 +1,15 @@ -//fnc_keyUp.sqf +/* + * Author: NouberNou + * Handle self action key up + * + * Argument: + * None + * + * Return value: + * true + * + * Public: No + */ #include "script_component.hpp" GVAR(keyDownSelfAction) = false; diff --git a/addons/interact_menu/functions/fnc_probe.sqf b/addons/interact_menu/functions/fnc_probe.sqf index 9fdb166f6d..dc1b7e6c87 100644 --- a/addons/interact_menu/functions/fnc_probe.sqf +++ b/addons/interact_menu/functions/fnc_probe.sqf @@ -1,9 +1,21 @@ -//fnc_probe.sqf +/* + * Author: NouberNou + * Scan de vicinity of the player and collect every interaction available around it on + * the GVAR(toRender) array. + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_nearestObjects", "_actionObject", "_x", "_actionData", "_renderData", "_actionItem", "_active", "_renderItem", "_object", "_forEachIndex"]; if(!GVAR(keyDown)) then { - _nearestObjects = nearestObjects [(getPos player), ["All"], 100]; + _nearestObjects = nearestObjects [(getPos ACE_player), ["All"], 100]; GVAR(toRender) = []; { @@ -36,7 +48,7 @@ if(!GVAR(keyDown)) then { GVAR(filter) = []; { _object = _x select 0; - if(_object distance player > 100) then { + if(_object distance ACE_player > 100) then { GVAR(filter) set[(count GVAR(filter)), _forEachIndex]; }; } forEach GVAR(toRender); diff --git a/addons/interact_menu/functions/fnc_removeAction.sqf b/addons/interact_menu/functions/fnc_removeAction.sqf index 3b32f4d012..3ab4379768 100644 --- a/addons/interact_menu/functions/fnc_removeAction.sqf +++ b/addons/interact_menu/functions/fnc_removeAction.sqf @@ -1,24 +1,21 @@ /* - * Author: commy2 - * - * Add an ACE action to an object. Note: This function is global. + * Author: commy2 and NouberNou + * Remove an action from an object * * Argument: - * 0: Object the action should be assigned to (Object) - * 1: Entry to remove (Array or Number) + * 0: Object the action should be assigned to + * 1: Entry to remove or * * Return value: - * ID of the action (used to remove it later). + * None + * + * Public: No */ - #include "script_component.hpp" -private ["_object", "_entry", "_found", "_actions", "_searchFnc"]; - -_object = _this select 0; -_entry = _this select 1; - +EXPLODE_2_PVT(_this,_object,_entry); +private ["_found", "_actions", "_searchFnc"]; if(!IS_OBJECT(_object)) exitWith {false}; @@ -50,4 +47,4 @@ _searchFnc = { _actions = [_actions, _entry] call _searchFnc; _object setVariable [QUOTE(GVAR(actionData)), _actions]; -_found; \ No newline at end of file +_found; diff --git a/addons/interact_menu/functions/fnc_render.sqf b/addons/interact_menu/functions/fnc_render.sqf index 4893d7e819..79d300019a 100644 --- a/addons/interact_menu/functions/fnc_render.sqf +++ b/addons/interact_menu/functions/fnc_render.sqf @@ -1,4 +1,15 @@ -//fnc_render.sqf +/* + * Author: NouberNou and CAA-Picard + * Render all available nearby interactions + * + * Argument: + * None + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_cursorPos1", "_cursorPos2", "_cursorVec", "_p1", "_p2", "_p", "_v", "_cp", "_forEachIndex", "_renderTargets", "_x", "_cursorScreenPos", "_closestDistance", "_closestSelection", "_pos", "_sPos", "_disSq", "_closest", "_cTime", "_delta", "_foundTarget", "_misMatch", "_hoverPath", "_i"]; diff --git a/addons/interact_menu/functions/fnc_renderIcon.sqf b/addons/interact_menu/functions/fnc_renderIcon.sqf index efa28907bf..4b04ff6909 100644 --- a/addons/interact_menu/functions/fnc_renderIcon.sqf +++ b/addons/interact_menu/functions/fnc_renderIcon.sqf @@ -1,4 +1,21 @@ -//fnc_renderIcon.sqf +/* + * Author: NouberNou and CAA-Picard + * Render a single interaction icon + * + * Argument: + * 0: Text + * 1: Color + * 2: 3d position ASL + * 3: ? + * 4: ? + * 5: ? + * 6: Icon + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" #define DEFAULT_ICON QUOTE(\z\ace\addons\interaction\ui\dot_ca.paa) private ["_color", "_pos", "_sPos", "_ctrl", "_icon"]; @@ -6,11 +23,11 @@ _text = _this select 0; _color = _this select 1; _pos = _this select 2; _icon = _this select 6; -//systemChat format ["Drawing icon %1", _text]; + _sPos = worldToScreen _pos; // _sPos = _pos; if(count _sPos > 0) then { - // player sideChat format["render!"]; + if(GVAR(iconCount) > (count GVAR(iconCtrls))-1) then { GVAR(iconCtrls) pushBack ((findDisplay 46) ctrlCreate ["RscStructuredText", 54021+GVAR(iconCount)]); }; diff --git a/addons/interact_menu/functions/fnc_renderMenu.sqf b/addons/interact_menu/functions/fnc_renderMenu.sqf index 91104d9c6b..4c437aa6f3 100644 --- a/addons/interact_menu/functions/fnc_renderMenu.sqf +++ b/addons/interact_menu/functions/fnc_renderMenu.sqf @@ -1,4 +1,20 @@ -//fnc_renderMenu.sqf +/* + * Author: NouberNou and CAA-Picard + * Render a interaction menu + * + * Argument: + * 0: Object + * 1: Action data + * 2: ? + * 3: Angle range available for rendering + * 4: 3D position (Optional) + * 5: Path of UIDs (Optional) + * + * Return value: + * None + * + * Public: No + */ #include "script_component.hpp" private ["_object", "_actionData", "_distance", "_uid", "_pos", "_cursorScreenPos", "_path", "_menuDepth", "_opacity", "_currentRenderDepth", "_radialOffset", "_active", "_x", "_offset", "_newPos", "_forEachIndex"]; diff --git a/addons/interact_menu/functions/fnc_rotateVectLine.sqf b/addons/interact_menu/functions/fnc_rotateVectLine.sqf index d411ffbf84..4639a50903 100644 --- a/addons/interact_menu/functions/fnc_rotateVectLine.sqf +++ b/addons/interact_menu/functions/fnc_rotateVectLine.sqf @@ -1,4 +1,16 @@ -//fnc_rotateVectLine.sqf +/* + * Author: NouberNou + * Rotate a vector line (?) + * + * Argument: + * 0: Map + * 1: Theta + * + * Return value: + * 0: ?? + * + * Public: No + */ #include "script_component.hpp" private ["_theta", "_p", "_map", "_p1", "_p2", "_q1", "_q2", "_u", "_d"]; diff --git a/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf b/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf index 40a1d0ca0c..e695f3fa8e 100644 --- a/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf +++ b/addons/interact_menu/functions/fnc_rotateVectLineGetMap.sqf @@ -1,4 +1,17 @@ -//fnc_rotateVectLineGetMap.sqf +/* + * Author: NouberNou + * ? + * + * Argument: + * 0: p0 + * 1: p1 + * 2: p2 + * + * Return value: + * Map + * + * Public: No + */ #include "script_component.hpp" private ["_p", "_p1", "_p2", "_q1", "_q2", "_u", "_d"]; From 8945f99be1b23037c2be1477c4819ea53ab88a02 Mon Sep 17 00:00:00 2001 From: PabstMirror Date: Sat, 21 Feb 2015 21:19:54 -0600 Subject: [PATCH 51/62] Fix CurrentChannel GVAR -> FUNC onEachFrame exits when channel control is closed --- addons/common/RscInfoType.hpp | 2 +- .../common/functions/fnc_currentChannel.sqf | 2 +- .../functions/fnc_onLoadRscDisplayChannel.sqf | 41 +++++++------ .../functions/fnc_initInsertMarker.sqf | 61 +++++++++++-------- 4 files changed, 59 insertions(+), 47 deletions(-) diff --git a/addons/common/RscInfoType.hpp b/addons/common/RscInfoType.hpp index d0b08c50c2..fe21b05265 100644 --- a/addons/common/RscInfoType.hpp +++ b/addons/common/RscInfoType.hpp @@ -26,5 +26,5 @@ class RscDisplayInventory { }; class RscDisplayChannel { - onLoad = QUOTE(_this call GVAR(onLoadRscDisplayChannel)); + onLoad = QUOTE(_this call FUNC(onLoadRscDisplayChannel)); }; diff --git a/addons/common/functions/fnc_currentChannel.sqf b/addons/common/functions/fnc_currentChannel.sqf index 115364fb24..a7ca8c1dd5 100644 --- a/addons/common/functions/fnc_currentChannel.sqf +++ b/addons/common/functions/fnc_currentChannel.sqf @@ -14,4 +14,4 @@ #define CHANNELS ["group", "side", "global", "command", "vehicle", "direct"] #define CHANNELS_LOCALIZED [localize "str_channel_group", localize "str_channel_side", localize "str_channel_global", localize "str_channel_command", localize "str_channel_vehicle", localize "str_channel_direct"] -CHANNELS select (CHANNELS_LOCALIZED find (uiNamespace getVariable ["ACE_currentChannel", ""])) max 0 +CHANNELS select (CHANNELS_LOCALIZED find (uiNamespace getVariable [QGVAR(currentChannel), ""])) max 0 diff --git a/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf b/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf index 2a2fbfc9a4..ae8113c1b8 100644 --- a/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf +++ b/addons/common/functions/fnc_onLoadRscDisplayChannel.sqf @@ -1,24 +1,29 @@ /* - Name: FUNC(onLoadRscDisplayChannel) - - Author: Pabst Mirror, commy2 - - Description: - When the RscDisplayChannel is loaded, this will constantly uiNamespace variable "ACE_currentChannel" - with the raw localized text of CA_Channel (IDC=101). Only runs while the display is open. - - Parameters: - 0: DISPLAY - RscDisplayChannel - - Returns: - Nothing -*/ + * Author: Pabst Mirror, commy2 + * When the RscDisplayChannel is loaded, this will constantly uiNamespace variable ace_common_currentChannel + * with the raw localized text of CA_Channel (IDC=101). Only runs while the display is open. + * + * Arguments: + * 0: The RscDisplayChannel Display + * + * Return Value: + * Nothing + * + * Example: + * onLoad = QUOTE(_this call FUNC(onLoadRscDisplayChannel)); + * + * Public: No + */ #include "script_component.hpp" -uiNamespace setVariable ["ACE_ctrlChannel", (_this select 0) displayCtrl 101]; +uiNamespace setVariable [QGVAR(currentChannelControl), ((_this select 0) displayCtrl 101)]; ["ACE_currentChannel", "onEachFrame", { - if (ctrlText (uiNamespace getVariable ["ACE_ctrlChannel", controlNull]) != "") then { - uiNamespace setVariable ["ACE_currentChannel", ctrlText (uiNamespace getVariable ["ACE_ctrlChannel", controlNull])]; - }; + if (isNull (uiNamespace getVariable [QGVAR(currentChannelControl), controlNull])) then { + ["ACE_currentChannel", "onEachFrame"] call BIS_fnc_removeStackedEventHandler; + } else { + private "_localizedChannelText"; + _localizedChannelText = ctrlText (uiNamespace getVariable [QGVAR(currentChannelControl), controlNull]); + uiNamespace setVariable [QGVAR(currentChannel), _localizedChannelText]; + }; }] call BIS_fnc_addStackedEventhandler; diff --git a/addons/markers/functions/fnc_initInsertMarker.sqf b/addons/markers/functions/fnc_initInsertMarker.sqf index d172c6a532..e5328a7470 100644 --- a/addons/markers/functions/fnc_initInsertMarker.sqf +++ b/addons/markers/functions/fnc_initInsertMarker.sqf @@ -31,42 +31,49 @@ ctrlSetFocus _text; //Change ok button's text based on current channel - //if (isNull _buttonOK) exitWith {true}; + [{ + EXPLODE_2_PVT(_this,_params,_pfhId); + EXPLODE_1_PVT(_params,_buttonOK); - _channel = ""; - _textColor = [1,1,1,1]; - switch (call EFUNC(common,currentChannel)) do { + if (isNull _buttonOK) exitWith { + [_pfhId] call CBA_fnc_removePerFrameHandler; + }; + + _channel = ""; + _textColor = [1,1,1,1]; + switch (call EFUNC(common,currentChannel)) do { case ("global"): { - _channel = localize "str_channel_global"; - _textColor = [(216/255),(216/255),(216/255),1]; - }; + _channel = localize "str_channel_global"; + _textColor = [(216/255),(216/255),(216/255),1]; + }; case ("side"): { - _channel = localize "str_channel_side"; - _textColor = [(70/255),(211/255),(252/255),1]; - }; + _channel = localize "str_channel_side"; + _textColor = [(70/255),(211/255),(252/255),1]; + }; case ("group"): { - _channel = localize "str_channel_group"; - _textColor = [(181/255),(248/255),(98/255),1]; - }; + _channel = localize "str_channel_group"; + _textColor = [(181/255),(248/255),(98/255),1]; + }; case ("vehicle"): { - _channel = localize "str_channel_vehicle"; - _textColor = [(255/255),(208/255),(0/255),1]; - }; + _channel = localize "str_channel_vehicle"; + _textColor = [(255/255),(208/255),(0/255),1]; + }; case ("direct"): { - _channel = localize "str_channel_direct"; - _textColor = [(255/255),(255/255),(255/255),1]; - }; + _channel = localize "str_channel_direct"; + _textColor = [(255/255),(255/255),(255/255),1]; + }; case ("command"): { - _channel = localize "str_channel_command"; - _textColor = [(255/255),(255/255),(70/255),1]; + _channel = localize "str_channel_command"; + _textColor = [(255/255),(255/255),(70/255),1]; + }; }; - }; - //If localization not found, then don't touch anything (default is RscButtonMenuOK's localized text) - if (_channel != "") then { - _buttonOK ctrlSetTextColor _textColor; - _buttonOK ctrlSetText format [localize "STR_ACE_Markers_PlaceIn", _channel]; - }; + //If localization not found, then don't touch anything (default is RscButtonMenuOK's localized text) + if (_channel != "") then { + _buttonOK ctrlSetTextColor _textColor; + _buttonOK ctrlSetText format [localize "STR_ACE_Markers_PlaceIn", _channel]; + }; + }, 0, [_buttonOK]] call CBA_fnc_addPerFrameHandler; //--- Background _pos = ctrlposition _text; From 9f3a0fe8d49231a70cec116aba17642ab268a524 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:18:37 +0100 Subject: [PATCH 52/62] Removed displayInfo and displayMessage functions. --- .../functions/fnc_displayInformation.sqf | 64 ------------------- .../common/functions/fnc_displayMessage.sqf | 44 ------------- 2 files changed, 108 deletions(-) delete mode 100644 addons/common/functions/fnc_displayInformation.sqf delete mode 100644 addons/common/functions/fnc_displayMessage.sqf diff --git a/addons/common/functions/fnc_displayInformation.sqf b/addons/common/functions/fnc_displayInformation.sqf deleted file mode 100644 index 007e1c3e32..0000000000 --- a/addons/common/functions/fnc_displayInformation.sqf +++ /dev/null @@ -1,64 +0,0 @@ -/** - * fn_gui_displayInformation.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos","_icon","_iconCtrl"]; -_title = [_this, 0, "",[""]] call BIS_fnc_Param; -_content = [_this, 1, [""],[[""]]] call BIS_fnc_Param; -_type = [_this, 2, 0, [0]] call BIS_fnc_Param; -_icon = [_this, 3, "",[""]] call BIS_fnc_Param; - -if (_title != "") then { - ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayInformation',"PLAIN"]; - - disableSerialization; - _display = uiNamespace getvariable 'ACE_RscDisplayInformation'; - if (!isnil "_display") then { - _headerCtrl = _display displayCtrl 1; - _headerCtrl ctrlSetText _title; - _iconCtrl = _display displayCtrl 10; - _iconCtrl ctrlSetText _icon; - - _idc = 2; - { - _text = _x; - if (_text != "") then { - _contentCtrl = _display displayCtrl _idc; - _contentCtrl ctrlSetText _text; - - _contentAmountOfChars = count (toArray _text); - _pos = ctrlPosition _contentCtrl; - _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; - _contentCtrl ctrlSetPosition _pos; - _contentCtrl ctrlCommit 0; - - - if (_type >0) then { - if (_type == 1) then { - _contentCtrl ctrlSetBackgroundColor [0.7,0.2,0.2,0.8]; - _contentCtrl ctrlSetTextColor [1,1,1,0.9]; - }; - }; - _idc = _idc + 1; - }; - }foreach _content; - - while {(_idc < 7)} do { - _contentCtrl = _display displayCtrl _idc; - _contentCtrl ctrlSetPosition [0,0,0,0]; - _contentCtrl ctrlCommit 0; - - _idc = _idc + 1; - }; - }; -} else { - ("ACE_RscDisplayInformation" call BIS_fnc_rscLayer) cutText ["","PLAIN"]; -}; \ No newline at end of file diff --git a/addons/common/functions/fnc_displayMessage.sqf b/addons/common/functions/fnc_displayMessage.sqf deleted file mode 100644 index 7b3274cfc4..0000000000 --- a/addons/common/functions/fnc_displayMessage.sqf +++ /dev/null @@ -1,44 +0,0 @@ -/** - * fn_gui_displayMessage.sqf - * @Descr: N/A - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: false - */ - -#include "script_component.hpp" - -private["_title", "_content","_type","_display","_headerCtrl","_contentCtrl","_contentAmountOfChars","_pos"]; -_title = [_this, 0, "",[""]] call BIS_fnc_Param; -_content = [_this, 1, "",[""]] call BIS_fnc_Param; -_type = [_this, 2, 0, [0]] call BIS_fnc_Param; - -if (_title != "" && _content != "") then { - ("ACE_RscDisplayMessage" call BIS_fnc_rscLayer) cutRsc ['ACE_RscDisplayMessage',"PLAIN"]; - - disableSerialization; - _display = uiNamespace getvariable 'ACE_RscDisplayMessage'; - if (!isnil "_display") then { - _headerCtrl = _display displayCtrl 1; - _contentCtrl = _display displayCtrl 2; - - _headerCtrl ctrlSetText _title; - _contentCtrl ctrlSetText _content; - - // TODO get a font that has the same width characters for all. Ask Jaynus. - _contentAmountOfChars = count (toArray _content); - _pos = ctrlPosition _contentCtrl; - _pos set [2, _contentAmountOfChars * ((((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)/ 3.3) max (safeZoneW / 11)]; - _contentCtrl ctrlSetPosition _pos; - _contentCtrl ctrlCommit 0; - - if (_type >0) then { - if (_type == 1) then { - _contentCtrl ctrlSetBackgroundColor [0.7,0.2,0.2,0.8]; - _contentCtrl ctrlSetTextColor [1,1,1,0.9]; - }; - }; - }; -}; \ No newline at end of file From a57448716627668463ab1ef7337cb1202ee8f1b0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:19:10 +0100 Subject: [PATCH 53/62] Added localization support for displayText --- .../functions/fnc_displayTextPicture.sqf | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 060f04f591..4c175b0e27 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -1,30 +1,27 @@ /* - * Author: commy2 + * Author: commy2, Glowbal * * Display a structured text with image. * * Argument: - * 0: Text (Anything) - * 1: Image (String) + * 0: Text + * 1: Image * * Return value: * Nothing */ + #include "script_component.hpp" private ["_text", "_image"]; - _text = _this select 0; _image = _this select 1; if (typeName _text != "TEXT") then { - _text = parseText format ["%1", _text]; + if (typeName _text == "STRING" && {isLocalized _text}) then { + _text = localize _text; + }; + _text = parseText format ["%1", _text]; }; - -_text = composeText [ - parseText format ["", _image], - lineBreak, - _text -]; - -[_text] call FUNC(displayTextStructured); +_text = composeText [parseText format ["", _image], lineBreak, _text]; +[_text, 2] call FUNC(displayTextStructured); From 8393645df911d376c8ec8da8648b024b3585a8d1 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:19:32 +0100 Subject: [PATCH 54/62] Changed position to be inline with the weapon selector UI element by default --- addons/common/config.cpp | 2 +- .../functions/fnc_displayTextStructured.sqf | 24 ++++++++++++------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index b86744f0a9..000adc639f 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -125,7 +125,7 @@ class CfgUIGrids { class Presets { class Arma3 { class Variables { - grid_ACE_displayText[] = {{safeZoneW + safeZoneX - 0.175 * safezoneW, safeZoneY + 0.175 * safezoneH, 0.15 * safeZoneW, 0.125 * SafeZoneH}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; + grid_ACE_displayText[] = {{((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)),safeZoneY + 0.175 * safezoneH, (10 *(((safezoneW / safezoneH) min 1.2) / 40)), (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))}, "(((safezoneW / safezoneH) min 1.2) / 40)","((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"}; }; }; }; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index e103c904b3..4f5c7737a9 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -1,15 +1,16 @@ /* - * Author: commy2 + * Author: commy2, Glowbal * * Display a structured text. * * Argument: - * 0: Text (Anything) - * 1: Size of the textbox (Number, optional default: 1) + * 0: Text + * 1: Size of the textbox * * Return value: * Nothing */ + #include "script_component.hpp" private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; @@ -34,11 +35,18 @@ disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; _ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); - -_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", safeZoneW + safeZoneX - 0.175 * safezoneW]; +/* +// This does not function at the moment. Has been disabled until it fixed. +_xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))]; _yPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_Y", safeZoneY + 0.175 * safezoneH]; -_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", 0.15 * safeZoneW]; -_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", 0.125 * SafeZoneH]; +_wPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_W", (10 *(((safezoneW / safezoneH) min 1.2) / 40))]; +_hPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_H", (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25))]; +*/ + +_xPos = ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40)); +_yPos = safeZoneY + 0.175 * safezoneH; +_wPos = (10 *(((safezoneW / safezoneH) min 1.2) / 40)); +_hPos = (2 *((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)); _position = [_xPos, _yPos, _wPos, _size * _hPos]; _ctrlHint ctrlSetPosition _position; @@ -46,4 +54,4 @@ _ctrlHint ctrlCommit 0; _ctrlHint ctrlSetStructuredText _text; _ctrlHint ctrlSetPosition _position; -_ctrlHint ctrlCommit ([0.2, 0] select _isShown); +_ctrlHint ctrlCommit ([0.5, 0] select _isShown); From 1ed50bfe3e5653dfa367a076dfa5c9e2cd33f7e5 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:35:52 +0100 Subject: [PATCH 55/62] Fixed font size --- addons/common/HintConfig.hpp | 8 ++++---- addons/common/functions/fnc_displayTextStructured.sqf | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 28346c3da3..235b553f53 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -17,8 +17,8 @@ class RscTitles { class HintBox: RscStructuredText { idc = 1; text = ""; - size = "1 / 40 / (getResolution select 5)"; - sizeEx = 1; + //size = "1 / 40 / (getResolution select 5)"; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0, 0, 0, 0.5}; x = safeZoneW + safeZoneX - 0 * safezoneW; //safeZoneW + safeZoneX - 0.2 * safezoneW; @@ -41,8 +41,8 @@ class RscTitles { class HintBox: RscStructuredText { idc = 1; text = ""; - size = "1 / 40 / (getResolution select 5)"; - sizeEx = 1; + //size = "1 / 40 / (getResolution select 5)"; + SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; colorText[] = {1, 1, 1, 1}; colorBackground[] = {0.8, 0, 0, 0.5}; x = 0.3 * safeZoneW + safeZoneX; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 4f5c7737a9..613f06c1e2 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -18,7 +18,7 @@ private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", " _text = _this select 0; _size = _this select 1; -if (isNil "_size") then {_size = 1}; +if (isNil "_size") then {_size = 1.5}; if (typeName _text != "TEXT") then { if (typeName _text == "STRING" && {isLocalized _text}) then { From 14411a5ef085028470c373db56f788d0f0bfef38 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 11:36:21 +0100 Subject: [PATCH 56/62] Fixed weird fix for getNumber for Array bug in setSettingFromConfig. --- addons/common/functions/fnc_setSettingFromConfig.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 577f3083e6..27c727acab 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -18,7 +18,7 @@ _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); _valueConfig = (_optionEntry >> "value"); - _value = if (!(isArray _valueConfig) && !(isText _valueConfig)) then { getNumber (_optionEntry >> "value"); } else { 0 }; + _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 From 323d673eec05f39897a80009cc1e86ef15a8079c Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:20:17 +0100 Subject: [PATCH 57/62] Removed deprecated config entries (DisplayMessage and DisplayInformation) --- addons/common/HintConfig.hpp | 95 ------------------------------------ 1 file changed, 95 deletions(-) diff --git a/addons/common/HintConfig.hpp b/addons/common/HintConfig.hpp index 235b553f53..5dc0e6384a 100644 --- a/addons/common/HintConfig.hpp +++ b/addons/common/HintConfig.hpp @@ -52,101 +52,6 @@ class RscTitles { }; }; }; - class ACE_RscDisplayMessage { - duration = 7; - idd = 86411; - movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayMessage', _this select 0];"; - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (30 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (31 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - }; - }; - - class ACE_RscDisplayInformation { - duration = 15; - idd = 86412; - movingenable = 0; - onLoad = "uiNamespace setVariable ['ACE_RscDisplayInformation', _this select 0];"; - fadein = 0; - class controlsBackground { - class header: ACE_gui_staticBase { - idc = 1; - type = CT_STATIC; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (6 * (safeZoneH / 40))"; - w = "(safeZoneW / 10)"; - h = "(safeZoneH / 40)"; - style = ST_LEFT; - font = FontCSE; - SizeEx = "(((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) * 1)"; - colorText[] = {0.85, 0.85, 0.85, 1.0}; - colorBackground[] = {0, 0, 0, 0.9}; - text = ""; - }; - class text: header { - idc = 2; - y = "safezoneY + (7.1 * (safeZoneH / 40))"; - w = "(safeZoneW / 10) * 1.3"; - colorText[] = {0.0, 0.0, 0.0, 1.0}; - colorBackground[] = {1, 1, 1, 0.9}; - text = ""; - }; - class text2: text { - idc = 3; - y = "safezoneY + (8.2 * (safeZoneH / 40))"; - }; - class text3: text { - idc = 4; - y = "safezoneY + (9.3 * (safeZoneH / 40))"; - }; - class text4: text { - idc = 5; - y = "safezoneY + (10.4 * (safeZoneH / 40))"; - }; - class text5: text { - idc = 6; - y = "safezoneY + (11.5 * (safeZoneH / 40))"; - }; - - - class icon: ACE_gui_backgroundBase { - type = CT_STATIC; - idc = 10; - style = ST_PICTURE; - colorBackground[] = {0,0,0,1}; - colorText[] = {1, 1, 1, 1}; - font = FontCSE; - text = ""; - sizeEx = 0.032; - x = "safezoneX + (safezoneW / 10)"; - y = "safezoneY + (4 * (safeZoneH / 40))"; - w = "(safeZoneH / 40)*2"; - h = "(safeZoneH / 40)*2"; - }; - }; - }; class ACE_EventHandlerHelper: ACE_Rsc_Display_Base { idd = -1; From 9d44ec18b861d73d2d4126e4493646e496e4d960 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:35:05 +0100 Subject: [PATCH 58/62] Added a default text color setting --- addons/common/config.cpp | 7 +++++++ addons/common/functions/fnc_displayTextStructured.sqf | 1 + addons/common/stringtable.xml | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/addons/common/config.cpp b/addons/common/config.cpp index bbce1ae77b..ed1f947db9 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -110,6 +110,13 @@ class ACE_Settings { displayName = "$STR_ACE_Common_SettingDisplayTextColorName"; description = "$STR_ACE_Common_SettingDisplayTextColorDesc"; }; + class GVAR(displayTextFontColor) { + value[] = {1,1,1,1}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingDisplayTextFontColorName"; + description = "$STR_ACE_Common_SettingDisplayTextFontColorDesc"; + }; }; #include "define.hpp" diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 613f06c1e2..054e98de70 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -35,6 +35,7 @@ disableSerialization; _ctrlHint = uiNamespace getVariable "ACE_ctrlHint"; _ctrlHint ctrlSetBackgroundColor GVAR(displayTextColor); +_ctrlHint ctrlSetTextColor GVAR(displayTextFontColor); /* // This does not function at the moment. Has been disabled until it fixed. _xPos = profilenamespace getvariable ["IGUI_GRID_ACE_displayText_X", ((safezoneX + safezoneW) - (10 *(((safezoneW / safezoneH) min 1.2) / 40)) - 2.9 *(((safezoneW / safezoneH) min 1.2) / 40))]; diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 3ece4206d7..7e2920f11c 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -326,7 +326,13 @@ The color of the background from the ACE hints. - + + + Hint text font color + + + The color of the text font from the ACE hints. This color is the default color for all text displayed through the ACE Hint system, if the hint text has no other color specified. + \ No newline at end of file From dd51037c5e7fcb58167df1d95a9b1644de65cba0 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:44:17 +0100 Subject: [PATCH 59/62] Added support for image color --- addons/common/functions/fnc_displayTextPicture.sqf | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 4c175b0e27..8472b3d1b6 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -6,6 +6,7 @@ * Argument: * 0: Text * 1: Image + * 2: Image color * * Return value: * Nothing @@ -13,9 +14,11 @@ #include "script_component.hpp" -private ["_text", "_image"]; +private ["_text", "_image", "_imageColor"]; _text = _this select 0; _image = _this select 1; +_imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; +_imageColor resize 3; if (typeName _text != "TEXT") then { if (typeName _text == "STRING" && {isLocalized _text}) then { @@ -23,5 +26,5 @@ if (typeName _text != "TEXT") then { }; _text = parseText format ["%1", _text]; }; -_text = composeText [parseText format ["", _image], lineBreak, _text]; +_text = composeText [parseText format ["", _image, _imageColor call BIS_fnc_colorRGBtoHTML], lineBreak, _text]; [_text, 2] call FUNC(displayTextStructured); From 77666e80978a3ba2b64a8946ee02d7c4a1d37f70 Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 13:58:51 +0100 Subject: [PATCH 60/62] Added weapon resting state icon --- addons/resting/data/icons/icon_bipod.paa | Bin 0 -> 5625 bytes addons/resting/functions/fnc_restWeapon.sqf | 3 +++ addons/resting/functions/fnc_unRestWeapon.sqf | 4 ++++ 3 files changed, 7 insertions(+) create mode 100644 addons/resting/data/icons/icon_bipod.paa diff --git a/addons/resting/data/icons/icon_bipod.paa b/addons/resting/data/icons/icon_bipod.paa new file mode 100644 index 0000000000000000000000000000000000000000..c2b6a2fb3e1b92e0b33034dbd7dbffc855baa9e0 GIT binary patch literal 5625 zcmeGg3s6*5^gebU5tF-+Y)U{bilpV3&g7<{?%R~lIx0KGBd0CC*hd+t5= z-1EQZKAuKLTjHif$6K_7kmly*Q4F7DnSnS3Ks?$qJqmFS9>m{>ii#EB|1x;8{0PYo zAY_Aqkkjz=4g?|)0vsMNj3CzBFl(-sQbI&gG-xhLsZR3uK?N5;hQ}L5RhU-hz4}8N z>WfaC(G+-kRR_A4paaOTby8$4VAX)54|Qeh?NvFK%{XrZ0YK4oLpf z5J^E^X+=1b7Zjoq{x%etQoHN7Zdt~0758{z>y*+frQsUdv2N5Wp0f3gEmz4y@-)}ad`^`txhgQnOrn6!cLvS<_BisM-INTQ6Zk>5iE}Tj!2JTpK_*S~YeN(fDyH z{c{qf=W@CcWtMnrXQq78+{N?<^@VsMemH6Q!0|Y16D*d8t+no^dN%BGR8q;|lb@hG z9Js!qvAq!dovF(2e`xs(=Z;jCzqYtI@n(64mRF|NwWf74ZF!zweFj%zyp%wMc%8{%6dVtiO(+3HI(Wa4kNt<;AVag8Xxo>ohn z%N#P(mw>C{L$mlVDwzbnvb4L!?prp-P`|{u^Q3+4Ls?rPu< zz=bxf>pE4a#J``PAcS68y0`k;k8^PUhp#;$11?HQwHI97`4F8v1bjs&rDocEg3{nR zLY^F#2lXi|Ha86AgYtY!yx-H_%{E;v(bwa84)S4O8I{Xua{<}|^?fGm+BWmyv%_&7 zfD2{$xPt8m{Y9_s&A8mPexk_p`jZ!+Iu+3GU9dT<(;mp|D%Z=UihO4W(|kCCSY=+o4E@Rn9@UYrof;>#aQ9Q)<=0ZtGRo)8B?2OW#0Ctn1Z&(E$BoKs)9`Ash%3 zA-2juKA^w*9<KPXDj>g?z5HuGgY|BEO8!GZ^FFsRd$^Puq-ZM|D$cWb zfR{4jzh5tx(>4cUk7GOpPm+?={4+rQjcbA88=vg92V9wI=~aE8yKjaB?47m$r#2EJ zWR=GbfOuLN9J~`A`MZ=_9#hf9(hl-6Yz@@J1+uvs(-xfIe}`lFPW*5$1S33ZX!pcz zE-7_WMjDhsxMsmQL>KZfy(|)s#SL%H*3q*_jmKnuTX?uHG1qVFDjl+PpOO~W6T=8p zx8ski5sdKQJRCzee71@aGiNgL!#02XN9HA_oyxI`2k+3vPruu8FrCc<3r-iW zx9iG?9_ax*1~vk6Kl=~Ql@cT1B*67N^qE77kL($eDIaz76Mzi^BfOE{)QfONo6>8l znS4AyvcY7G{&>*WNblJkXjOXn%fJZl+sUJ8HZ63uHl4>y2y|hbca1~d|80m9udQ$m z@mxFA^?pUBvic^gg43~ zy7HUksAQ+2FDIt#-k#tra$lot*VA03=K`g~AgB~b58E52JM4R_>2U|fgVDrTvzJP* zj`SDKL%e9Md1~7xMmJq^bk{3w6YRzL7w-shW_4Afd_Ax2{k8us`h0#&KLQ4EKaPhs zWp0kAO|D(J3u z4q#ybx97OPy4myJ$(YaNfo7D`k=PaLY1y;;Rrvv121a-zfA7s1X)aR|mdEKX}I1x+y Date: Sun, 22 Feb 2015 14:38:48 +0100 Subject: [PATCH 61/62] Added option to toggle between progressbar top and bottom --- addons/common/ProgressScreen.hpp | 4 ++-- addons/common/config.cpp | 9 +++++++++ addons/common/functions/fnc_progressBar.sqf | 13 +++++++++++++ addons/common/stringtable.xml | 6 ++++++ 4 files changed, 30 insertions(+), 2 deletions(-) diff --git a/addons/common/ProgressScreen.hpp b/addons/common/ProgressScreen.hpp index d7df49efdf..751d48af9f 100644 --- a/addons/common/ProgressScreen.hpp +++ b/addons/common/ProgressScreen.hpp @@ -17,7 +17,7 @@ class GVAR(ProgressBar_Dialog) { type = 0; style = 0; size = 1; - colorBackground[] = {0, 0, 0, 0.1}; + colorBackground[] = {0, 0, 0, 0.0}; colorText[] = {0, 0, 0, 0}; x = "safezoneX"; y = "safezoneY"; @@ -31,7 +31,7 @@ class GVAR(ProgressBar_Dialog) { y = "0.1 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2)"; w = "38 * (((safezoneW / safezoneH) min 1.2) / 40)"; h = ".8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)"; - colorFrame[] = {0,0,0,0.025}; + colorFrame[] = {0,0,0,0.0}; colorBar[] = {0.27,0.5,0.31,0.8}; texture = "#(argb,8,8,3)color(1,1,1,0.7)"; }; diff --git a/addons/common/config.cpp b/addons/common/config.cpp index ed1f947db9..d562d185ec 100644 --- a/addons/common/config.cpp +++ b/addons/common/config.cpp @@ -103,6 +103,15 @@ class ACE_Settings { description = "$STR_ACE_Common_SettingFeedbackIconsDesc"; values[] = {"Hide", "Top right, downwards", "Top right, to the left", "Top left, downwards", "Top left, to the right"}; }; + class GVAR(SettingProgressBarLocation) { + value = 0; + typeName = "SCALAR"; + force = 0; + isClientSetable = 1; + displayName = "$STR_ACE_Common_SettingProgressbarLocationName"; + description = "$STR_ACE_Common_SettingProgressbarLocationDesc"; + values[] = {"Top", "Bottom"}; + }; class GVAR(displayTextColor) { value[] = {0,0,0,0.1}; typeName = "COLOR"; diff --git a/addons/common/functions/fnc_progressBar.sqf b/addons/common/functions/fnc_progressBar.sqf index 1d73cccc79..0b8fcc7ac4 100644 --- a/addons/common/functions/fnc_progressBar.sqf +++ b/addons/common/functions/fnc_progressBar.sqf @@ -15,6 +15,9 @@ * * Return value: * Nothing +* +* Example: +* [5, [], {Hint "Finished!"}, {hint "Failure!"}, "My Title"] call ace_common_fnc_progressBar */ #include "script_component.hpp" @@ -32,6 +35,16 @@ closeDialog 0; createDialog QGVAR(ProgressBar_Dialog); (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetText _localizedTitle; +if (GVAR(SettingProgressBarLocation) == 1) then { + private "_ctrlPos"; + _ctrlPos = [1 * (((safezoneW / safezoneH) min 1.2) / 40) + (safezoneX + (safezoneW - ((safezoneW / safezoneH) min 1.2))/2), 29 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25) + (safezoneY + (safezoneH - (((safezoneW / safezoneH) min 1.2) / 1.2))/2), 38 * (((safezoneW / safezoneH) min 1.2) / 40), 0.8 * ((((safezoneW / safezoneH) min 1.2) / 1.2) / 25)]; + (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlSetPosition _ctrlPos; + (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlSetPosition _ctrlPos; + (uiNamespace getVariable QGVAR(ctrlProgressBar)) ctrlCommit 0; + (uiNamespace getVariable QGVAR(ctrlProgressBarTitle)) ctrlCommit 0; +}; + + _perFrameFunction = { PARAMS_2(_parameters,_pfhID); EXPLODE_8_PVT(_parameters,_args,_onFinish,_onFail,_condition,_player,_startTime,_totalTime,_exceptions); diff --git a/addons/common/stringtable.xml b/addons/common/stringtable.xml index 7e2920f11c..d1462c1214 100644 --- a/addons/common/stringtable.xml +++ b/addons/common/stringtable.xml @@ -321,6 +321,12 @@ Select the position of or disable the feedback icons on your screen. These icons will show to provide extra feedback on your character status and actions performed. + + Progress bar location + + + Set the desired location of the progress bar on your screen. + Hint Background color From 82c181cd7c9bd5c1b7dca0ee4ffc84fac9cf0acb Mon Sep 17 00:00:00 2001 From: Glowbal Date: Sun, 22 Feb 2015 14:54:54 +0100 Subject: [PATCH 62/62] Fixed header --- addons/common/functions/fnc_displayIcon.sqf | 31 +++++++++++++-------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/addons/common/functions/fnc_displayIcon.sqf b/addons/common/functions/fnc_displayIcon.sqf index 94fa887da9..1fbc4e89aa 100644 --- a/addons/common/functions/fnc_displayIcon.sqf +++ b/addons/common/functions/fnc_displayIcon.sqf @@ -1,14 +1,23 @@ -/** - * fn_gui_displayIcon.sqf - * @Descr: - * @Author: Glowbal - * - * @Arguments: [] - * @Return: - * @PublicAPI: true - * - * @Example ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; - */ +/* +* Author: Glowbal +* +* Draw progress bar and execute given function if succesful. +* Finish/Failure/Conditional are all passed [_args, _elapsedTime, _totalTime, _errorCode] +* +* Argument: +* 0: icon ID +* 1: show +* 2: Icon Path +* 3: Icon color +* 4: timeAlive. -1 = forever +* +* Return value: +* Nothing +* +* Example: +* ["myID", true, QUOTE(PATHTOF(data\icon_group.paa)), [1,1,1,1], 0] call ace_gui_fnc_displayIcon; +*/ + #include "script_component.hpp"