From 19f31541042fa8b3dcdcaeba5468e241cfdfcf3a Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Thu, 12 Feb 2015 21:53:15 -0600 Subject: [PATCH 01/27] CSE Soundwaves --- addons/nametags/UI/soundwave0.paa | Bin 0 -> 25425 bytes addons/nametags/UI/soundwave1.paa | Bin 0 -> 26293 bytes addons/nametags/UI/soundwave2.paa | Bin 0 -> 26529 bytes addons/nametags/UI/soundwave3.paa | Bin 0 -> 26253 bytes addons/nametags/UI/soundwave4.paa | Bin 0 -> 26802 bytes addons/nametags/UI/soundwave5.paa | Bin 0 -> 26662 bytes addons/nametags/UI/soundwave6.paa | Bin 0 -> 26473 bytes addons/nametags/UI/soundwave7.paa | Bin 0 -> 26996 bytes addons/nametags/UI/soundwave8.paa | Bin 0 -> 27615 bytes addons/nametags/UI/soundwave9.paa | Bin 0 -> 27049 bytes addons/nametags/XEH_postInit.sqf | 2 + addons/nametags/config.cpp | 7 +- .../functions/fnc_drawNameTagIcon.sqf | 20 ++++- .../nametags/functions/fnc_initIsSpeaking.sqf | 77 ++++++++++++++++++ addons/nametags/stringtable.xml | 9 +- 15 files changed, 108 insertions(+), 7 deletions(-) create mode 100644 addons/nametags/UI/soundwave0.paa create mode 100644 addons/nametags/UI/soundwave1.paa create mode 100644 addons/nametags/UI/soundwave2.paa create mode 100644 addons/nametags/UI/soundwave3.paa create mode 100644 addons/nametags/UI/soundwave4.paa create mode 100644 addons/nametags/UI/soundwave5.paa create mode 100644 addons/nametags/UI/soundwave6.paa create mode 100644 addons/nametags/UI/soundwave7.paa create mode 100644 addons/nametags/UI/soundwave8.paa create mode 100644 addons/nametags/UI/soundwave9.paa create mode 100644 addons/nametags/functions/fnc_initIsSpeaking.sqf diff --git a/addons/nametags/UI/soundwave0.paa b/addons/nametags/UI/soundwave0.paa new file mode 100644 index 0000000000000000000000000000000000000000..27f34b38abc77d69ae2b9f0ed0793e00ec7f78fb GIT binary patch literal 25425 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave1.paa b/addons/nametags/UI/soundwave1.paa new file mode 100644 index 0000000000000000000000000000000000000000..ce4f85eb6941214cc6a169b42fc9afa0f15b76ef GIT binary patch literal 26293 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 Y%&6?v>ShSGEY3n{M(2=B;(pTq0bZ%YJOBUy literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave2.paa b/addons/nametags/UI/soundwave2.paa new file mode 100644 index 0000000000000000000000000000000000000000..0bc59cde24940b831d94bd6d4f9fb9f0af3fea27 GIT binary patch literal 26529 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave3.paa b/addons/nametags/UI/soundwave3.paa new file mode 100644 index 0000000000000000000000000000000000000000..39f3e8e95bd9e86515becd853e69cfe57ee29b2f GIT binary patch literal 26253 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 aumlpb=d8N;uGNA2NV>rZ8fK~t{{I29r?jR3 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave4.paa b/addons/nametags/UI/soundwave4.paa new file mode 100644 index 0000000000000000000000000000000000000000..7ab8b6d9442a2456f681099149d59fd112790773 GIT binary patch literal 26802 zcmeG_4SXDRm2YM@Z30PlNhzc@>AZZ@Y?4i~w2%feyE{#_BvNP*D)su2ZPGiclB9yR zMR%KN5k2p$Nh?Z^Ye)|5ft<*e${y+_yHd3EtF4@ef&646^;&*E@7&NLp)!-X_n*zo zZWl4ARS;)>n`Yj;|Hu1&Z!&MTIoh??F1>l#wI5h&2LM%7FW2EUORs0JMhAnhUAkg9 zgE{(P@J-8?uaxLqrl0rc11y>YaP>_9QYYbW1-M}|z!&M~O&q&`|KY_@1UNnR6l9)0 zNhB1)>eUAJ1rav!25?GD54BEp`Mo6~*(5?v4BGZqw(Yg6oOVCQ177YU>$n{z{Fv+I zV|!*PSg&w~;)<q(etRoac}q2S5YQ<CCj*bIfO(p5v`?XvDuuIw?3e(DG3k^d{9&hG zQH4Z-Ew|1KaeZQsT9OEH*c^hmR|Px5`&A)OH+)jAQ^wIjJV<h+Yb-KA7<N3Phyxmj z)jn<@xdvu=0$Tr5l`EdCbcv;_eq0+Y#R7dwxOD7b=~$z}<s45$Ha15(n~C<)oUqo` z|EacppTccKb|6}jTJsS<j7)M8U_+4OwHW6F#%l0gybP_oDqEp(m`h-Tw<Lif#h;o2 zkY-#^gtC!#8Qrwzq9})}6v3X1Y@AQ~-aj95@fuYKRRlY0#hi5o_E_S3J<9izxJVH~ z7t8pZBJ2>#7mFd_iTm6-AIOr+56@3RwG22n#HZZqMs)#?^EC)1?bs6KaiuC~xM9k# z0oFxrO`3mX(uqH!{r83nJy;tpBq}fMEyi449H}840xT6TLb!%0E3CDTOfuQ;h+dsy z<~{7PQ#_+X-&cejIq{j$=!5DgZYNe`iC5wdg#>cihH{>ATqEgh3to)Jqc(iV2LnlW z@V(r~B;@P!@17Ds7Zj&KUjJr5SJcKyy%V!()^_n?JVvts4tfEL?poZ~k#va-E1~U- zhNV835b)0EqT7KV$Ev7pu&QmMS6}mhCX7r<2tO5(lcd65(o(MBO94aCkD<p~B4NRZ zEvDV{o9mvgL>G}94;PFbDjmbqQ^Jws&iBTbaax?D@Xy|oz?^sox4Tl)oIcoeKewwA zPZK>K@{?q3==O67Etht@SrsI#R|^CFXc4ZT60{`Nc}wE>Yt?@o8-{Hf?iNM7G1!Jb z*11`#+g$5j?cAV-RlePUm~*bY9Y3fE2~BDNO~yL4For9|5`^PZ0!pG-fB|1gf<yO+ zt$zq_iP;h~3ZPyQD%7X!*vphm!`qp`eM=Drx;%KbA~<K;q=BRpTZq7_Xbw5=dJb#E zl1t_JSnDeRxo$^}T<-Rg)m<@c8(N}M_n)d?s`TzZja57L1+@0OqWvduQrGgUeVRfP zyM}EEyg>}&Z&krVZty5gz+Q13Hj!cckJ3K)&BjfON&m%zKh9H*AbiM+#1U;5!$Q*N zan+x|I<^LUME8%!$pm6pA1Wq}dZH(F6@uY0HH-`Cv-5b2J5!i;MOgo+gdbtjVy1eS z76~gchI~@-+a-Bx_vywCm%2}uxa#0JJtzdUynz!%w~gUBWw7kAlS&`fu#=|`6(Dpf zgZQ{Y)V!b!@{OH~8#kdVSWI!GS2>bLQ(!Z(l_x?)=$3qR_qG6#j2~7LBk$touA;cK z8p#LdbMufWc#JXhtOx_D6aD1dq&-P4oARIQE9RyBABTP{_CX+4ruq*eY|^=ZLg}T6 zk_eZ8#CMEQ@N$V4-84pl7%%ripy1Hn8cK^jM8is!9<NsgaQ*-!FPTKUSYnGM&h=@p zQh@7{`^y&9g$tZ};>&13^4+qSe+Y8js^4Dkm1G=>+MKYN8~Pd61ux5iA#N4qtOEQf zt^7FAz!7?@w4c*f@NLzKr)=cT!OEH_V4)8rd4m?|V&07_nTb5ILjb&5g!&lyLA*hQ zT{tA#d6Zx2PGU{;%kA7tLK}WEc$$O4aag4A73$p*I)-hSZ{sI>+X7>_ExHKd1TA=@ zSXWG%dx8pvwdz8|+eF^E9{#r&K4^m@k<NMFIXs`#k;BEcvqJ7Sh%q|eP4jx9o61N0 z#MVl&oGn1dZji7|gyPS%Jo@~k7`+wym|muw_>?9zY~gX6D#)vTf%BtZuNPt7(%^0Q zN%0eUSfa@#K1gWQPn0h7DmLdn=@foe5w23XWckQlg^0J1)Qj#q@@k*L0tW4OCY6p_ zNN|r+hQbYs-v%+tdPk9w0<RK@TnKaPhb6l^1mLvG131UGE0_E<NFq!fP8tQM_{&2T zslZK_f5EP$j#IjU=;xF^$k$8ac^I1#0<n27YkZ`0KE)-k^i?ud?W|w>!gR`mI?9O7 z<vSmgoR_uS7dw8LBvwYhi#S{sb}p1eTxo9b8#1Uiab0m?{1s!%<0g_a7TI#@NGC6l z6``hgNF#NXkPtaL>D151jyh^Z0a4}5L~o0x*<f}%y^wXP3*s%Q@Yv4A#$6(8&8Wzq zPwVA*phyI;6S!w*QAPh9!0SPyC{Nd(6XEZ<)e{^$|CtCb_jE)~FG~nxhYN7pPkGW~ zmZUN(NgL@>K(FvhN2?ULpX;i?T=tt%Gwt|c#j)X|tSVKwm+dr`hd5QARHRaI8c0<F zvo(lAE2p)x@$5LIIPkFQNUY~%1aL<SceDXtLpiZ_2NhOpL4GJv=J$<$NpnRDZ=lkn z$_Ji!yDd-oVU^;rZ()_&N1BO<LVJ?Rphu|;s+w{X2l6Yp{$oj{%FjvA-*5XlCl%Bd z@Q$<0sZPcgBs9A2ivq7D^a65;vS7OGQMoPXP=zGb+5#8Q3+W{aaI7MsLI&W!V-AWZ zwIP8=UZJ|1h>#;2*Rq=R62-B8PJGQayWH6QD@udxLiupHjDJUn%P;bVDC2we`tJH@ z1I{I-J5+~^0tH5dTnaJKM%rMMR!oN1vx=Caox>h)-KA0Lca1<BUlRfr#3uypC4ow{ zoOPFQ;}ql@qnw9o{hgsv5&`b<<vl-%{}nCbw+}_S=2wgEb>3R>eH3+b0$Swy(LJTl zqRYEMEAy}TK*vIwo3lMm6+4wfqUw;AC<Qsv8ozSbPsPJ6sv}uP#YbQ>)xp0`Dos)6 z?c2_3ONMPAj?B?eoN_iv<?7zuRbF1I8{X@@-!>3;QRXciwxc_0A1UanpbZ-6wxub0 zPx<g7TQlSM0k5OKd}M9w-X-33t##gYL+A+2mfgYG<)QV<Dnzk-M{{m&y||W0E>qVQ z)Ot%~ueW4K^j)k?dMUi(dJ@)@12%i3HY&o4as5@{{Og$F6O&~x;ko?ICBv7lYCq7c z9$^=$!YvrKOZda#kKt8XVWg|lr8K#Nm+s%T`GrPrew^+?@=;J6T>NBXHz_$+Twx2` zMpbDTzf782l1t$>Pje)+I2Nf6tV@md58GA|i`cF@9`btgJzl!pPxndQP;S5*oQ*fo z#z`y)&E8TUyd3XS9l4lKwmz3ae1g&BWhC7jy?MhCh$GCW?Ww4wGZ;`DSCa2Y@nb!Z zd!<VgwZY1&sM8L7aX?#ER1<_M6-LUv`@?ke(qPxNcGfm_Fh6XtZ8=ys7B0YYrD34- zYZ#*xLR(3RMlnCi@lLI+GH)?a`9O#g_Z-Dp_VslTs2Q<qTJ`Xi#rcPM<wzw}T;x}L ze|&3qMU9#hcL!(H`=K>(kY_c>R}}vm4W%jKrR=er!(CXdtStZc<>&gYR#vtziz$Z@ zT9lP&3$2QyG{U)t%FgysqO2Ade*6=a6cFqv_o<_OUUco)hH}~B=&_#L8rit=MbV19 zC8Xc?xq~J3-n`brLx=tOhwxrSXo$|i1tgt^;;kJu>fHDpbyS?WeAnmQMv_25b37Dp zY$hAiIB3<2wP#7nKZ(vM`(}k59ps|DN?(K0YwI{hw{ksATJH(%>@~{gnZnT-%%R_u zD!&;mtdD-GBGh7|iiXEL#j$QqS$A1buA|$|!YRjgx$MwgTf0vZX0R^03>T<_5;WHi zmq>L=37;#mqN>I#O6z*BAz#$Eon2%24bg{C)axYcL5hr|S=hx2T{^z6IC5I!&-AFz z^i)<4JD@hY+TITr4Z(9P0>DL6jwZ=X_V2sKDY<=X1Dndu_#+!h#eRES+fzEav(!mB zfeqzF2l_>zP2jiuDo>zXZQod}>~RP0A?L9Lw0|poZkJ0zyGL&9IosHQc`C%+#66Ag zNYO-R7cy)7j>T$4xDi&97-*-bS*1;X^OC9PCNOnqRM4zm{jdSj->WS6Z%ZCb<LQI` zVrs!@agaY)^2iW}B@fFUtoV@O5LSG!;$wz6Sn<({k5+ula0n|tTJbT%9IW_g#YZbX zW;lcuAOAe@F<)ZMFkRHZkXpY<hX>*Y?9Rd$XW<PM8RIQDC4s*hd3e|(=|07zcbqzF z=wrg+EPNmfKdo?cyanqLc)Q5s>2ck^D-3!{beJBc(ZLAyEYaJ?O#P3)oO-Ti;9&;+ z&+^dv_%Cd@zMj6mtd1J+v^iMy%(Q&|eDX*z`OE3`pP%G;f|B%5n?8m<G-OYAc{JcA z>3sdeq~YIeJsHAr!atKV?E|v>U-QtzY5ExJ!8mK?oJhmd1etgX)+O*4lgAAD2PrGQ zoBB`rGsMrw2ewmu(3B$v{WIx*3yU|c53u2SeAvO@ouOw9c-kCHd)Xqhc(t+F#E;Vm z>gF`y9sPu-W?Tc#p8s}-pVH$mYZy(*qh_3SX3Sk<z*?Y<d95jrak$}u%J+Sp;x+R} zdOnHtZ-zW(1tJ}1J^r)C{J;rn#%9f4bkImhzSh{Cq(%<|MvwMVZwCGk)jw=E;zMeE z&y}wZQd<UFUf-{9yiXmAsfP_%le6MO|M~F&laT^Ar%%`Cqa3j{f98%RbH08xEe}ZA zCCT1`2A<^6uM3kdFn*DQQ%OzMCZ1iS<MnWYdYyHY{?F_2sr8HzZx&w}i0rP+kVi{6 zQa4Hs1;%`BJWC#{s%|f*kBQIXH$EB8`*zr7`h!80F@CYMrSS9}K2yKiiSy$-yp|RJ zJz4la(Ero=r&bUWj&@}hKhE>*V<!D)^W&09`M*d1{YetW?~w;?2^ahaiNuf(41sie zroB%q)WlyfnCywVaA1h~*{|bGd+QF9^6&1VcttJvlu-W&{S&_z|Eoc7w!AzNDgTZ% zzi+I6>O`lu4ef&IKSjygPX9w5$JsDX@=npWX^50htuF>Vt!`64e?FM(0d$Mdw=nj{ z@pBHK6lTD)Rz0}5DbktN?+_cF3Tf<Yd;H*>v4aKX_;H4$?jmEpYbf0Pt4Oz5-|wQ< zA-{I0z`!S8qu?LuK54)d{|Wya!GQnN_@AwR-r1`hj;SWSGx<Nfqz!6gvrK*D%lF=K z_1&G#27TG~PVv75?aR&a5TKEiGL7;1NKJ|1w0xNi*<s*Q&|f30+Y`Pq{e(BM8T`#q z|M?|qL8Z1cQ$AVs-$?v?d|*4h^x#kDch42<?SeiwUC&(OzwFanJPjCSN`{d3zoLGM zhr8ZbKTet2R3jTr`vIhtGW1*2|4!9!N`7yw-#-#RgZ`oE{Q5q9|2Mtg4EO&t)&Ccq zpXmh+`?A(gN#Kp-v49o-jcNb0<N5i}(?tGFxA?~V@k#P;>XJ3!ng0F*<G+2hl1MPd zKQ-Q0I+~H+EdBg`{k-M!kzVYZdeO1a(4RC;`tQw;8?Za9$NyFXE)FpKiYE>DEvJ8) z0E?bKGCx@I(<NZpk7YkbEMvbdd$8=mvWK(;EPt^4A#Dv-e6;+*@(0Tw(h{)z!SaW+ zHCXw<@`rbtKQQZlm|hW29VzZC_?<2fiG2qE`|5(!!PIWr0A2dqgWqXxZSiB+Hv4U* zt+$6g*pRhB?%rhRW0np-VmDwzXYUl)zlHJpe<pv$TVB1(PalIn&zf_41o{~8YSsoC z+5J-k{_B-Tf;zIPr)TomFG}cR@UtM8#eYC${I?tUeG}V1cZ5C${EZ1+9!CvWoc>ZY z1D?=f-fXM<Q{`0_ru`Z>nQeB}^vt)1zVpl2&lO%?u6(!Me5~BkANE$Bj7=H%k{37R z`NnNN0|xczXZO>`fH8}IF>t>AbMHGhkZBL`qvy*b?;d#N*4|fcHP&mTw&e={8M95w z`Gl+<_P=bxaDpUK^yb^vmxQ-=FC!5c>%V8><AtYR`3Dnrop@@c@??+MrgcT|N5`k$ z(`@2PUL@vEoqXJwpXNWI0W|=>3I3TqB#iml{5Raw`|`EDcFDjK|7VDQ^Rd433ICa8 zez)0%z4Sz1-COzCKHL6Fvh?o>ocp4n{zNeN$+rK3qj%=VGxTAX=sUeK;GEW8_jfYj zKh^#(^n7RkRA**eV6oQv=}oP(-f!^h8G7xY@Y+r@K7M|pmEvF8{w_2<)_N%k81lE| zVabC@z_N!MKSyFPZ-F)KZv)ofyRoNyKsSRc512A|OW?Q1ZHgg~H*$--Cn8<8trb@p z`0}q&&id-WMFu?6{A|3ORo0fXn&q+wlE!-1zDzJYTx-BT2=1J_hCT-TqwVg;%4;8c z!GIm(5%0WtUkn-WCI1*%KiVGLVZi^S@0Wg?==0Eae)oMK*!@CA8gBaew+mev@ay-l z9eJVlN%L)=OU9qQ_r@=zyPfCkJ3aYb{cVwye)rM$g=Tj9XUk(IxaHf$oqZYfd<~qB zEX;U&V5a$RU;LfNh&Iy&HSI40JK3KCIYTOx4Zih^NdsMd)9{z{C9W{c?2`u~UCmo} zz1x7l0&TmhWSd#Nmw%OX7%ojWUG8_<*b2t@+6Py3R5gCsyt}A<u<gEhh8a~oT$ca4 ztHpJvX&I9RO?z{2F1^<x(f=($WYfEv)tVMcvNaAcZ@GbQG~m1gqaAB?>kB0rwFe+@ eGG)yv*ba6k&+DMABR*?C-7Aeu(lXO8!2LggM))QG literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave5.paa b/addons/nametags/UI/soundwave5.paa new file mode 100644 index 0000000000000000000000000000000000000000..f3e98d47aae32588a8e588d0a3d9be43374f5318 GIT binary patch literal 26662 zcmeHP4SW>knSW+>16fJ3O8^a$uuncTn`AdczyM}8JAgu>BB4sf6U<7uN`I0B^~6|r z*%9hl@2Uy3o}5Qaiqfig)dh49>n6Jb7Otm4ZI7b4V<TAU@7KF-1Zzm0$$QVtW_Fjf z)~`bSnE5U2{O5T;p0D?LpUpfo8EoOgx!28K`1QGF08kWVf`*sPU8G`0hl&@@y?TL) zIr^vKYZok7EYi6||1QV^_+c)<kG}@++)98KzX7o4768j?B7XF-0r-w_kPA4{^c_e) z-9s$oz|y5U^_T#wcpbbWq?#J1n*P3^D*3e=B8%ZbyDW1&gZj-SWj;V_EjidVU>!hs z+@BfCHf6fp5Y>#|s$3ZJb6Dets9OOu9+&M6tX#1(r{1rD%~9;$q6pS+HY=R;7{>!% zAV7vFg_`?9o#uoO9hNWaWE_^&a-H!Tpb9~h?R*64JIr-}rD0-50v_pHQ|@7A?;Yes zLWM#`;u63+vVG+AA=zHo+bE%vu59z0;-!Lb`4kQ^fw_G5Xwt-PhXGGj59fFJn!?%U zNbIMr@=xP9UAFtjN%*F0UvDp(A^3qOp)y^yAc+nS936x*32>61PdNS(Wh#$T82IC6 z-03$noaWAtVYZOZG2m>g0p~JL@1PA|AvQMqbE>c+oI@N=4CG-ZFZ7m^Kma>@CHNmI z=RwxkJE$u433*aNj;ZQpn{ZM?)FwlU-S0p0BjpIT$##<@@^aMbh-{SVd8fe9ykJ7f zA|GU=rMtowJQz0NleN$pclxg2dIup(9p?())Lc>Ehq@@9*xaHpVef@?8%pqi;)$VO z_7LZm4&vMqHgRHLU@Q%Fx33IerJ;ybH(>6@8PzM}4q@72s6WZDpcV$~cz1aE?ZEew zolIS&^#cLS?3ozBO1A(FOk>`m+Dk<ErGT6$=DbbAI(jAo`on*RRqlKdvwKYucJ1%4 zdc6c4vfUgFX7}wX=))5v^!|gPn`=T%HRy<#qNK8abmw~~L|1YTmXHLsu<9|6_&-4m ze$zviFrm}K#aJdyd!1qzu~NzLdcwK5V%W~&=yK;r@pp>nAWrKsF?>)EaEY&eM7+5I z@S;?=nU(w6aH{ZNhBp!{=-WYT+{WxNCe8yUp-ah$;9?;k;oz_xMM20$Z*6{zLuaq4 zqZ_Y}m}1llpi;IMEBnkC2=iL=M%jb#6WQL`T!nLFyKSsV?2OxR9`RTj&Zv~R6&#ie z`4gonSW%k~l52g2ROEC+CSKBG>Yk<P|KAmlSmNG#0!!C#@v=rs?$$#%sJX@Ib|!Z* z(y1wi*9boRgJQ3u)$uHKz<{tEXOk!WT5jxmp?cK}EcNAey=sy7BYe}1BoR#)!5m>6 z9#oycrH%o&s_eq^!*(K7`twMl*6?w<q8*8aR<24RJ}{Zbs4YQhl<g~?74cS8TdHgC zr9pynL?!N#J!Vl_*K(qIr9;^wiCmd)2(1(ayv)*hD0fXC4#{1GJCDolSgxMDzAGD{ zN$$euW#Z<T+{ITn&8S|54qqMxj)1)1LS0}riDeO>*nfQ%Is@|ni0P-5Snq}0qy~ym zOVx!ng`14T!A@16Hw5TZZ0HGdNY)djLgpE2FLB7GJD~&fYQY;RR6IKnR%z1jmIKsL z6kt4v{K`IxRu193Yx^iB;stK-X7AcuPJ3M|@vxY_VUc17+s{CBlS?!T`KCy0sGXgr zh}JB16i#;qvu&HA^J&1#C^$tt-H_>2JmyNbC}DTlWP{aQ_pi|9J3j-uxdzB+0KAPx zex7*Xh`dhR%CW2Y`ZBqyu=nn+lJYQMPA!PiO)S)`h67xzy2y{$+X3eYP#K}65S^yL z2J9BhJWB7k#IZd5cq8|&y&muJo!}s+AEwKEv2ve?)*cgPnfSp#y|<4d$8>~4G~g1! zl}DD_O<BN=%0-B41m3m+{x=V905I<lHBAZKJcaC$!A03Ad**W_866i>$JX$wqFxWl z)!;6Q6!koAE$>+c6~g1>W6;AktAo-}4I<VHkaz#QXO9jF;ajj>fGOOt4fiqow6#3m zrP!s0w{S}MnMwgB&-JardxURkF^xLs*Fuby?Jl^;Et_mx#CNdU4e_GhjX8+dlNoY1 z?myiwtC55zJDJ$2=8-0!cSCIXTjhaE83~o|rp&0BBo}x-LL1%zRM~>lBmw8g%*r0o z?DPZJ%u**#sNIlB9z9nWn`i`DXfEm5p4bSe+gsF)zSQF#&3i^p?Nx3skJroga-m=? zIDJ2$`Cu!X)601yliy=J=}`;BPmx=*Qy%uck^K;!QU|;|{4#0-L5x&Y5Pg3H!51{U zP-QV#PgrzB53dNYE-kG-s)mxpaTF->0Ne}Qcg9d!{u1CKU=-Eq+M5FWEw^-lQ_p`T zfWtWwfzO?GU!@56FuW~u8CsTD&qFn(gxX&GlHVL#!AZoMGn~D?9{6(F#wr3@`V_Tb zJ+o>VKxvOvO%f|T5QRF9)j4EqMxHm+-0@mmF7<FCbaa^ho68WRp=_X)LBk!76vP-2 zw8&T>TY2!(x~+p*GH_~UKv@OAe?_dcXe<179;b)741u!DDU>~w`ayEa1r$p%+Tx+? zBkjtO&I!?FcbTQ?mfzC8gyV;;M+euA!y9DliVMzjQ*+uu)aAV>JPog))Ib_ZM#suI zJjAU7PzMel={-}nSB9&p;cUN^(#j52J-i4+$}h*_GTCa52Ulo01c_&g)@@*?+toa# zo-g-<8gvKj>|MJWMwgH0`Y9+^hq)@5Gu`VyLa82Zs<j*)#9#F0wspJQ&ZtXpy0kqr zwCKpDf;X^K=9XLd=8mtgyomZ`v_&bMW<y=oGMHJ6vjHd0lCv|!WgdC2hxYsH6>Ho@ z`GR*fWxKzN%d^9_+wVHXX7!lBUtpWn%P|y&ZL>w|jeVg9OWnNa>X~SJ%+whz6DDDH zj~Sg|b8mKYG0ini=5RK}`JU;f8pSH%wpwdP^d?u`=5i$mEZ3bZbwgdiWRd?<;kwc4 zA1gWiW2;tJ<`)Y>(fXRq%u3-#GDV?sV|Il*Uvj(iyM@|uY)}xgGQdlDCw=giVJob5 zhfS1z=i!P=gIQN$>9936SokguWi`#}nb^>{J)rDYF9N0AJ!Y{oY{uPk!HP|IDa#2p zmpF&pc&LzbRv)W&XGJMP&O*Cv<)X){TgX>3g{w{8HI!)v@o_TxtW4SzEX*2XQOs4W z=t{Kq^q3k*ZfsPnPrBV%Rc^Z6L9XuhXL{Yfv3L#59>;9|*tM0u3-D3Jnu%Gm6(>>n zj;V~fi7$L4eBDj^)qQ9RO-~6Tok6E;ovCJ=(brlbbEbm{tgECnY%>F&=VkMA%Y9I) zKyQ(IYY-dcX=b*rsiJyiF=oosOlx<z`hwY5Bv0!s_&1EuenV4<v1%cUekj>keTiiT zak<S;d+-F=R`|?v@Rs+Q87u3VnU}Sfm-m-Y_Ebs>s3W?rrMO(lh&p{^Xd%{lckpUH z@r3MI#!wt4SqgVv7i`8dd2!JX7Ywz}kry}4kH~uw=E;lE<Zp<g*vmP(3s1GuMph<V zbmzB9s%rtI!s%Pv-RM|<7oE-szt*~@T5VP|JzQ*=MTWl8>C3NlTk3Ll?e%2s!bfEL zwD1I+O3HaMTDP)XnH0UlMR}H^c9CTbDFW@x`ed}ahWw6kKu$(M@(oh*&%+Z6Unn-C zbr_^rVQ=w})!{x*sto6v82t>|8pYLez_ju;`f1lXn*|QBQ<upPsUDzao`~uO`$9OU zGW_jg|2z}=go_GW3Vo6*T#Pxx);6hd*T!`%$I&8pxx({ts?sF_tLVuWU2;C3DXO_r zxmysI2QH%}%eZ@+`|vrT79lraBS*ruetx#gJx<Dcwx$-^Bp2n^08k^xY+ay5>l3oI z%qOgbj*@Bt!U2a+m{Au!+^QUIEh!6IowSBK;Jj{lQw=R}4>3(&>Txdj&;Ju(2`nXX zXx`V=M40~0BvDRGFmW)-q?RsyT8H#EA_IT5^r2cjb<kfG44hI2tp`INY3eZaVfcd) zAJP_t5g&~BnC1>fd^F;t5g*eQgb^Q&_?YGnMtn5lqY)p|7K9NWjrf@64n}-5;-e8C z(-y?pijT{Jq2@Joqf#HgN(yyGJ<2b1Jf@1uMev_hsM#aGpRlAH(Xq~=fzNjQj;Z>W zQu;nR$n!c%l+~tC3R^|8*Meh7`-+2vLEg`pI-Uf<DBVImoU*@u(^9u5t5R>j+EVej zpKch_N2lv^8u)D6|4)zKMr8q1(N(PL-=<-@drpUD8&RzYYERl91`{`>ll17BbZ;Bo zV`r*=B>I1p{nx7Tpl+MmT$^vbitqKmq2tm1u~y^n=9(nEpIT4>rjFNlP=Bgc)bZ&4 zpLe`Zl|Q7GbSCss-XFU8#?Yi?I%Zy~Frh=o{cz2;k}IDfd&N}!p>~HdO&?>tp_Qkq zJg4;b-a}OHtJYW1p^g*(pt>baWgj}mD)w$5jSipC{?K-&e^kvp-9?oc>hRipIsNTQ zUqsofV<wG?4;^R52c#Mm7}C0H{ZR^;YVN;dcCx>AHKh-Tn?=z)4|O`}qeD|BT~Osk za+VS*^i9&$i*)=kCViqt(*FBndSX1i#mA+Wc*(eF`j{6CxzrjQy+7+8rH_Wv+l%Ov zq>qv}IvBLP7&Il<gU*%SeulU<=foYgN&B)xYAp|+($5D}gG3*_J*yf;|J3%U>JCy4 zn>k7z+nN6HQT87#k3%Bk{~7yt#7P-{MjyB~nEkJ$5?x;CrV^!ee;+YulKvON<WE#s z1Km`RaTTBRx0WCo|Gs95S5#C_8|tU9Kgm1pUvz#)>#Is6<KK~z_rvW^wc-Hh{pIYR z;N){>|L!X5sUT1KPVl#?n~YB-EIJ-BchWv*50gKD<`LQy`ux~GWChv+bUdcvM>A%J zno{=dR+}e6ntIk2-7%qWM|QG(ze=QvA-%t&JJ|BuP)l-u-$2Db9=0o6r^i2_;2&x^ zu49V-ME|{A$DcL+kG4N=3&?vTN|N7?TL17a>tcOllJ>}w9=T)AeN8nwf1~}K;{QA} zFG#irFSVpCQ*WPz^c+JlrC(Kt>Y>vU=!=Lof5H#vpXf<yO1|f4^PivQZ+TI+$*f^@ zJPAA^{kWsTv7~-R<$t}=GwI$odM3e>+TW`#QH%fE)$ZEP)&F+8R?(?rlxQ=A)cVWq zpm@09!|g-)X;V$;=A{1s(nx9c&F%QI+Bc!U54Z2xq34JTv?o4vd)12cz)70FK=91` z-}wEPu#m2=b8WA4J>Rk*)wHJhLzU#|jHY4e|HHE-#FVa&ef{kPN7Csd4D0lB&A%~U zLIZ~W&rbX_{LAn!RRhNQGS-(K3k-iS)`JlbjCf$ggOmo0^<b=rls6drgRvfr^<b=r zlm?9TV62CfH+&xV2bH_0=@Ie7k+7D5zwG)D)pr2Udk#hp)$B<hple?}Y=kM@7u0WK z+cNyY@Q0KJ&enQ3e;M6V#7zNx{H1CcXz0OT>R9LCi-%(jiFr|d18se-r1Os~l>N23 zzh9-}DzCE1KD4P($6E&4zPq13I(}|I)5ifF3)*;_%{m^?FrO@|{H*#a4AOkntCD4Q zWpvNCm0t0s&*um(D3V`pOqP|*>j=6_jz@-ddj4;2vefpQYIO|Cfd{tIN5|+pz0pG- z9ShzeRermUGanu5Ovlj!XX?Z9eR%(t!27r8?dzy)x!7|uSte!MEh&3F?<FxDB8}vJ z{Ic~~!86NhE+4ov=fwNpNS3WQ4((ek?`chzX<g!b<>2t;HA#B@Z%Fuejz6#Smy$om zfC_*=hWx5NVtW74@=yDI;Jt+bv#8Ta{*xsCULD(Zdrr>xIFn`Aa}Tw<{+hS#*Y{uJ zO)opq<R6nN8>;dSJ#1HgZrAxA?f=;a?#@atOE8P-dplEQMj3Sh=Syk$v-<zJ?q3qU z@(levG*G9O^(X!5T=Qehm(YOjkA^-BeW)7v^83S*?~<6wpTLZLHL&*FjXB}tnwe*A zPwL>Wg1?wQyNYh5JuB3i^J$j}y_%NN<WyQ)q~<K=Z;R{WEqsqKJYAvVpTPr)b)T4} z<5$|8JBuoI9@DY4KjfY~`C-3~$A2fZ;z*-!y^jAun=kb=(L?lV+%u~0y}p)XY1{DZ z|9LUTk%qH+uiiWJZ<<W{c(1fo^d76&lYH7|eE%DdEcsrl+Ihm36N4{nPm3h%yM^8X znm(WIfcki!6wmR_J0p$wr2RiX?eBh#cu6in#?B44secOObS+S{|H<Jb4|Mfo<A2hI zxI{N&%Xada&<`%w@e@#gtW+{3v-hH>h#oB1qtjul&7_W?<C5)HuWU+lyNjQwe>5tk zvcuA+3$y-owz&KR4U-gsv5$u{>A4mWz<ry_cC&*qe_S17f+|L^^Hm*NZpWs?wEnot h?fC6)Ksq*qS=HzG%R|{?ysIde?H#0Hw8sbl{vXu9Ls0+# literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave6.paa b/addons/nametags/UI/soundwave6.paa new file mode 100644 index 0000000000000000000000000000000000000000..3f29976c9f699164faa77b00011657e2a55fcbf8 GIT binary patch literal 26473 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave7.paa b/addons/nametags/UI/soundwave7.paa new file mode 100644 index 0000000000000000000000000000000000000000..e705c70b422e2d41e0475a62810c5c2281c1cc92 GIT binary patch literal 26996 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 literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave8.paa b/addons/nametags/UI/soundwave8.paa new file mode 100644 index 0000000000000000000000000000000000000000..e6027d878a7d32fe6f30c326c15f8141b146863e GIT binary patch literal 27615 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 M2SSME><eB02UmgJOaK4? literal 0 HcmV?d00001 diff --git a/addons/nametags/UI/soundwave9.paa b/addons/nametags/UI/soundwave9.paa new file mode 100644 index 0000000000000000000000000000000000000000..91ddfd02df6f0953787d057c55cf30dabcf050d4 GIT binary patch literal 27049 zcmeHP3w%@cz5ksgwJEescwGXtJ-@WYzS0MxZJ{U4DJry+NjG(yyOf3&ym)8Zz#QUk z(j4%?+{6~9lYK6|jqYw^jD0M3yHRJ_MBRnCJ1N(_)FSD`QJvEi>kPH$<lNs$I7#TH zxCe8NoSuAozUTk`z5hAClQenNs)p;YT=l629RNs@loQ3DY52H;WjYkRs$um?1vB(f z@O3L!uHorgpid|hpkyvU)%5^18vyDz0bG4Ez`gYO0LKo{Y|4b$fM@HTg5=AmXbRbI z!wqWb%N%UbsNfWrsG7Qr((j{55-kU5yx`qcIN2{3IYBExZ=o!siEi8d-mH;Bxg&U+ zPn#x$ydC1HkSH>Y3{9F+C!m4q_`_b;^WT=9C%O2lWC&(y_2pIwC{prsk=4ioV}wR1 zvVvSr4YE1V_@Qw}VI$OtxePS*>KXxy1{qnCqrpa4>YAgg5}CA+yt1uu-OHC^k<5gr zcGijPy4*d58K5f>aUG)poX-JoSpnlVWgt4rMH@aYvK95v7y1lnt6=KKJ)+XJNVTU7 z<1`1{?9*bjGW=d-#or^;ORV4QTTw>$^PC&`V)LOZCt@|MzAF(LL{{hbu3zL`KZZXM zSuA&@3$fxAN-<B%13#brN+T51?*Kh6AJn=Eo$W;&3}wMoGgIo*=G(T@h{|mDW$ep! z%@lC6#D=lLl^&{grgyXXOVMsM_#c2*u-JLemzR&HD+ADAX@ciWk37{cV{wEH4wxf; z*9e}bN%;NRp|BBuN|!g0+Eq9+v>>?0)7{kY3XwJYEvVPjxv3Y@)aLF>JO^9kGgu<A zGM*tCUFuw{8<tPA@@bpGRD=UEI~0zx>%V<ABA@&imW!?RG=qVlcYU3=y$*|pnBm~& zUr*pRE(fb5TM%8o0vx90`-i<9BaNTMqVA2tz}gI)=`2EM5^V*p<w*0n%$mp3T1|ji zzPY$YVuM)eG+{S&Gc2*gSkYZHAj4OfJDc|2iMP>;?ADn<?So>#fW;(my&ju*#4R2{ zSP_}u7qU37W`@F$Ngcyg5<4{ukh%2QmkSjhr%lP*b6?n<`vQ(B-OvC>MV7=gqjwWv z@u1ej(b}oqWzHjMyra7F<U5^X_+yC;<<}o?pHc)csJqr&?+n{8gQi+Oqy-V*pf;^s zjxIcTxJx_{!r~!qC_L+qRXx%O!p#yZ<j-E0J({UCS_50sQ1JHY<ggpp+e|}Y9^vO! zbl|h1ZTD?}rGwfrG*HJd6k%Z!%Y9mn47`Ta0HHR*3IU7tyL<una;;>Pv2rkt$N6%D zE2Kq>%@maN2<=>6%QdshoF-$9W+@LGk&zgHmA-amSr3V9C5Kkgh&R(sc+|R1FfTbi zi6yq<z#DKYQC>g9(^vqXkFX&q6RQ~H2Xc*b_-ApM%m!tF$|^**K>Cpm1<__)$#ZzS z(pNyV?dvdpGVl#!x|Z(?8F4jfnaH#-SSqqDj0Vf-UxrW~VTAk=pLQ<)5>{Gs_#!UL zm=(C1dOalCX7TT8I!3D7#!7uVN$1~^aeh76<<^YZ`;JkKUr20~GP&KNt%ipDjo7;O zaZP(&b=y*e$E8-mxUylU-?*5cNp<PClj>A)Sup@`N|`0V6C!I&=kHmd!GJMV)JhY3 zgvZY*%Tv78(~1b}5&d*ID%y0su(flnx~+Kde+8Z~>V)57mSXYbjJ{*DZy^Rh7nPX3 zVi185`?b~WORL-J5FVr9GB_x3eL52@?iB#kDIZ~xH@l0rcAmtB2<g*}&`d_~hGLQJ zV;Fo~Vo$ghAtBdBWg-vLRN*baKFNqS9}~4CSS4mt5&WOnZv?mzcx)!^2C$0kKC)Ez zk+KCt@&r43weuwgGk>-aUZYa7ux7u_1A2>O(^Xh`g^RPuYE8-4wq3fi&A0+aXN7~? zbDzgsiH^$ZS>tat9@$pnD<GSHC~JiD7vU+ISs0gbP~itxC{QWE4*XWcW*EmKB0CF4 zHC<EQc3QyT<zoxqv4vT@joW90f2D$>A@M|)GK|(Qjr6$43DnXMrJB)fEVF^!Ux*8> zfSFp&gSzNQTZpKKt-u>MgJ<6+&B1gBq?_Pj;1>ki&4UGGVtfUrF+kEgz%?<>E~U#x zk-dCqgY3bNi?#*ZKi|H97s)W%{KFRCtw<tj`dZ){w01fch^!@&M?sOV2WQul5nSr) zHD&RSV6(^;IZgSl7ZDF|Ig6Nx5rYxdKaAzwMZy4Plj%B2IA~t-Mm3gjZ=?ymZt-cG z__WgRH8hpRdI-uT+wNK%nbPX;M!NGqWM__vtO+&=+f1-N>h->FMZDeRS@3AVR1X<% zZk;apsB45Mjqo{%HCWu2l6$rI8ZncDwYeO(+(g|s343Xj1`dp?o-FXAUbN-c@6c<| zPlMRW)?OQx1*!-Jy5kpZa|12ZAbO0_onJ&{mEis4UwL7&r_iW{Ok?$mEW6)04=S;> zJ|{ReYrE-`u|Y7U1*dwX=fACRD|+-%4{K-yyEP|hp0K@Yh+v8D8!d9bO=1i40vU&N zy%zBl&Zr0Q&t_12w%L6?79C^-u|jI~W4ilHP{y-GdwqFWO}(1LIz*1c&(L*)bxaXY z<#^R;#<U1)04x#BP8p*&DZcgPs+S+lNGiIHi+JiS9BfV6E}V!<Eu0{`MAX?1%+hq) zZafM2agbvU=|v7UGB=Df3hRHxL9ykm`6kPrXn!FuN673~1;{*AZx}0b0l!A^P}TKd zvbUxUQ0!Y2VNh6?(fC~PAR|}?8HZb&p?HNA_4=SZP>C?i8JR#d4iuTUb=9PT_E?Bp z>^4TD&>9h#Aeo{@sERNr!neB8wsoHwmMPw@7J)*SjD5$*>lFEnI^Nr{h(fNCL1S<4 ztSe|@j-a>vdD2#*&bu6vA{mZrneJ#zO>H$GQRvqQ6aewP(MYup(|sBZ1Y;3zv9C}k ztZa*%>WUQk8KFs2=G5urJ-yL@3*a8nkQR`u+X|}N%23Z`>9(acLz)rr)1pBWJR6+P z5)EcoS)hgK)<fCg9I%Ml6;_Zkwa5GN2lEBqX&uxC=%f4(TYTCwSH%pR)t&ALQq)&y z=BhQh&-Y6&ApDp{J9fOf^L6sOm~PDy%E?pl4vMYb4ApR%Y2@E1E}gQ)Mi1?Dy-+Gu zc4O9HfmET`K*_KnyDqi~aL!gX0o7K3uR*T{O@niJim3|8lUl)p28z=uRzFS-J+mTW z0Eg9@8REE1ZMQ%%^_g19CYdE$AOn7iChN=)1!I^e8nm}K4u`~}wL^2{lTgQaV1@^a zB!dH4T32QPGYZ+Gm`<Er-MmvO8@$TC8cLn%&Ru0<?G|RjMsZ)}iLf4jCK_~)dDlOo z1kRt17#v^9ep)(J%Vlap6Y^>QvTnUB&~zd+VkK6H24sikI9+S|mJMDPUfaj~ylLN$ zlu>0gNEAc(bk?DQz_EN+(di;ry3ut<Q?XA+(s=k(87<l3yh2m#*+Y9EooLK=wQ1`l zgMbfn28JKNXUd%Va%WRov!^f`L`%$LN(7SMU8mQhQDQwbiwP@dA*W}MU7SzbOi>~2 z=pqJF=(@1t_Ew1oVl-bds1vLbcsQR9Z|9(8H&(fzH^1KH?I@D8fpS-M<9}%TbTux0 zfV%WpteKBtD=luXXlSj`(_k60At(oM2XO)|)Jbc^ARIAwHy#e*e~E@_uERR0vs;}M z<X$5g^q5IRxr_Wo7u65q4=G*_AS|MtWk!T9pieYhA=Wd2qg|jsQ*7HvF$O8lC7?0c z<tt}<JC;ZXhw`oa2Cye$*y}NGS#`7vXN!iu+=B>J<R%?bWl+0QI^2cNh?S)-6mX7Q zMVe@_>LFj>P$n8moa71>zqXH7F%U7}gn4{TiP(v-TwH@%S91XQA?90;nJ2oGsEC++ ztH6;ckIPN>U)6MfjsLoC_oP{J_bij#&*V$)0Ded8YI$O^mNpfW1zZQQ!HvA!Md4h_ zJXT_=vai`wSmIl#v&)}qTYSmQ#lEr)%Sx<kw^7(M+23Rz!9!7!^pN&!?F`fA1s90@ z>)gNWS}yjRx7_x7mV%LfZIATgPIBp+XwoL}5u8WH6R8~-xNN*mG?e=0HA5Z69PZ=k ziwEyKR>Iw47VbhLRc{piEpvEWM4|EGh{3+WJW#OAS{E?;3QC=tO6d}()m0O=IBSsY z)(6MTTZ+BwQSU6)@mEpAx6_62jPDgq;MmsA*Kr2z8|}iO@{s`wcv>REB+c{5me_>q zwviI)2BF+Jmt@La&Xpk>jl{RmG<(DlAr@Jm&got*<<ZC#`Gd=6D6fZJ+8X5q%Ed+0 zuCamwE=5&WcTWaosn)vsq(K&cCKuO#7y0tR>x2hPg=DxLLGxv6d&((}hPhzGJPv42 zb0Q?2=&Ffi3Bh&0mbJC6kMUMzKU&VMrlEkQp+RA)r?Av^zaaOQx?Xc+%8cbnZwJBx z=O(3!a$HC^6dNHr#3TowfExgi?mfpTo>QPd;0eYKSqAd62UJL3)1~mmMGuAJi9`9O zIDul{9H(%C0x9~W<Rc*sDg8+4LrNb~`jDVNN*_}CkdTIye@N*=N*_}Ckf1<HA5!{| zkcO0hNa;gLA5!{|puokV5BHA7o=?Wt>xt$HDlq!}BUVwq;F7$PDuxizNS?5%_zu6f zqkta&sra*jSkjb=_4NF6WaZ0}ig`*o90Bo&idBlI@P}i6Mo-2bGOP4gXQ5)OzGB_U zD-!&dLrNB+2G#Otx+Fa*SF!9qw;btdutYgUYB_|I%*OF_Sq_qX3D7E&JlwtEQnlPB z5Y9-*M^&J4hfL3S)$;wLcSy?9a}~o7Nf15ki(@BYdQ=|AX9Y~fIS%TdvLIC)eFQ_< z0V*!`P&wrYsQ9BUpUu#;r;u`T)%8%G@18<hl!^mydOue;ppDbx5BSe7$(z{BhSmC^ zFy)yh>Hqoo4-U$gpi^x>P7k7$3{Vw=|J-tLtMU<>NmVT|KZ(DiVR|I`NP_?J5M@r# z8Sl?&80QV|*yA{s`>epIJ#z?N^P)%p?LF69^=(RyK9rlVccY2~jN8=q3Q~^0SKND? z<QKoLOfR}#F5unx&)dInql%~VH}EDgKg$20QXi+6*EL^O5!zA_x9{>9&?tEmYJZ@l z$-IyLPv<{`&*ks=_%GK^<8PRhJ4wH%^S@T;Ic=g-o!|8J2;oDs79HBW=)KCT_LH+q z@^|v6vfd<qdj!qzo~rnr+J48e5fYAsKcuSBBWmC9ETDgCef7?tiwo_sw0^byih)=* zk&5NfbLrK*cIW47>5P|0r6Mt(1pi}{nocihzIxp&bjI6Ho@?JP9RDeUS)tosng2%N z{ps-s{GUcIbc|<DII<J^aBLbq&N5h~*I&x-MEjr&dO{v?SiVLRm#5AFa)x(xkiR++ zrc&Xr&40d`7VF54+kg2z`A<ph05hih|Gzi=|I7KW(8CZ?`78g;_^)baOd?|OQ&b|N zH`MvS=%hipp<>eic6#OG-&L&kqT=)Ezm?ydH?}z`{yRg)AF@$x?+++B_nmQn`S;F$ zA^a%W|5+c{{*S({taO4^*PCg-ta75Nt4ziAV~X+D#_1j7PJ;d)HZE?av_<cFvJYoD zFVIC(!hXOTX`e)`63>%;`6K=x`OR#yKcx6?qE*T2RQpq2m--X@f9Rc93Vx#f`Qkqc z{*vPV(J<M&2VF_=Kb4cn$NQuB4@d*z_$&idOz|JlW8-`B-?N|MKT35|>wnn%yU^p0 z{)RFhX$z>Xce;JR<x8$TdHJ;o{r;2pe@DASN(ff_Pwf9<BUSM$+mu&U)N<rAZb`<V zWO63+cl7=Fd!gy|kJkV7loMV^TSArocA)Qnk}w9UI!{)27O3Svpd445T#%t+k8f+| zM3Vh?IOPd<l6^1*4tEtM@%INIw~~Vy=l4GvJukNPYzt5xa1uYS4^Vn@6292zky>wz z0;+vT(IZ6<g#sygP$R39Jf!3yr4K24kg^9cOPI2UDSMc*hbeoQvWF>qn4myPA5!{| zkcNxFKPam`K(C0$ju`h-_#d4fypn*X{H{UlP}m-q0lIbZ;gs1^WkLC$a)T*(NXbKj z0`H{{1xi})C9lOFGn;w|dw0e0svzOJM}2Dh8A_V3ch?3Lt0R15aIrFDA-+EQZKpz! zqlq-zg%6yYR^bmG{dEqV>iXn)%ojcBU-YP$4|sR!-hGHw@m=GazIWt{2ZJik33~f} zb$j1@73VtXwSh%%|BH$*^LYCLesPV8w<&4d-rPi*##sWZ<>#Zfd4Sr}ueYi7OUAt& zHI8+0T(SRftN0`vU%zZ$)~lsct&ifUww_KE`$x}Rf35S(9X2}Ea^60<o2665`=++t zdxTCE%Q;WwTj*3V|0Vb7SQ>lGK3y+oe9ca$T5kML|5SnPt@vYe->cKo*3Uzant`pI zR}u--{;nGTLiX4@H^p&<eASA=6>agy_8)xxL79GI4*m-3SJL?7^6&@if6MkR5qO(A z|Nd7gZKtRF&z6Vj@-l-zbxvA=Y4fu^V$y2{i+bN*{*BwFzOT$sonNMX^6UM*_Bef4 z@15)mPG&u)mbc1TS;=V&%XlSiCc&TP>nW`%2~VHzg~s!$&P}7~4*#<K2TAj}`o*KK z`|eJxFMG7{rqpBlRD7k%_l1_vRR1vwr09LVc>WXj5~bo>U|GI6Fe<+cs8h9swtbg> zGfo4#`?tsEW7CIIZrM*h&AUrb)u`<23jQ9iVwHe@E*7G1%k9yr?PpLJTkz&k{OyO@ zTWW_VZtsudpkw>|TN~!zs@DJMihB+|wD7<~D$WRfb@wM;c+jQdtgUxS&kj$<w;?aR zP4iEB+wi_=*_c_Ly3lKsV5hdPy@dwndL~pHbkN`p^W$OGvoja&-@b6~LA5+DM1wz& z$o?+bIy~jvnFw2sz8(9)c(wld=x6%f-RETc&3)-Bm%NY^W}L76N2mPuqcqpJ3d-`| z1{;;H0vVM`r1n4jWqb~F_XFeaC|&55sBAp|O>I-r_A#}sdxUsawmZIixakQ+4Euhf z)-U_!;kM-HHhn*31e-R-#n86D>EWl6*#5C6Ud#OB(d61O8aBQJS^i*HPw%zx0P_ye z7}cYTW!V){`pDf&*xUC{D*hgn^or43WmojAbhz*4G^$2qieVjDRHEm+cJHocy)yfu LFm-eGg|7bxu#VuD literal 0 HcmV?d00001 diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index c73ec08cfe..127f639003 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -1,6 +1,8 @@ // by commy2 and CAA-Picard #include "script_component.hpp" +[] call FUNC(initIsSpeaking); + if (!hasInterface) exitWith {}; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index aa55dd2aad..c7ee208a60 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -41,7 +41,12 @@ class ACE_Settings { isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowNamesForAI"; }; - + class GVAR(showSoundWaves) { + value = 0; + typeName = "BOOL"; + isClientSetable = 1; + displayName = "$STR_ACE_NameTags_ShowSoundWaves"; + }; class GVAR(PlayerNamesViewDistance) { value = 5; typeName = "SCALAR"; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index af3932f118..cd8b9b0452 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -13,7 +13,7 @@ */ #include "script_component.hpp" - + #define TEXTURES_RANKS [ \ "", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\private_gs.paa", \ @@ -46,11 +46,23 @@ _color = if !(group _target == group _player) then { _name = [_target, true] call EFUNC(common,getName); -_rank = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find rank _target) + 1); -_size = [0, 1] select GVAR(showPlayerRanks); +_icon = ""; +_size = 0; +if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then { + _icon = QUOTE(PATHTOF(UI\soundwave)); + _icon = _icon + str (floor (random 10)) + ".paa"; //random + // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order?? + _size = 2; +} else { + if (GVAR(showPlayerRanks)) then { + _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); + _size = 1; + }; +}; + drawIcon3D [ - _rank, + _icon, _color, _position, _size, diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf new file mode 100644 index 0000000000..7d632e51dd --- /dev/null +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -0,0 +1,77 @@ +/* + * Author: Glowbal, PabstMirror + * Starts up a PFEH to monitor the when players are talking. + * Compatiblity with TFR/ACRE and Arma's VON + * + * Arguments: + * NONE + * + * Return Value: + * NONE + * + * Example: + * [] call ACE_nametags_fnc_initIsSpeaking + * + * Public: No + */ +#include "script_component.hpp" + +if (isServer) then { + //If someone disconnects while speaking, reset their variable + addMissionEventHandler ["HandleDisconnect", { + PARAMS_1(_disconnectedPlayer); + if (_disconnectedPlayer getVariable [QGVAR(isSpeaking), false]) then { + _disconnectedPlayer setVariable [QGVAR(isSpeaking), false, true]; + }; + }]; +}; + +if (!hasInterface) exitWith {}; + +["playerChanged", { + //When player changes, make sure to reset old unit's variable + PARAMS_2(_newUnit,_oldUnit); + if (_oldUnit getVariable [QGVAR(isSpeaking), false]) then { + _oldUnit setVariable [QGVAR(isSpeaking), false, true]; + }; +}] call EFUNC(common,addEventHandler); + + +//For performance, chose different code paths at mission start based on installed mods (once, instead of checking each time) +_pfEHCode = switch (true) do { +case (isClass (configFile >> "cfgPatches" >> "acre_api")): { + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)}; + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + // ["IsTalking??", [ACE_player, _newSetting]] call localEvent //any use in ACE for a "speaking event"? + }; + }; + }; +case (isClass (configFile >> "cfgPatches" >> "task_force_radio")): { + //Note: TFAR has a TFAR_fnc_isSpeaking function, but it has a fairly costly `callExtension` + //I think it's much faster to use the internal "tf_isSpeaking" variable + //If we don't care about the built-in VON, we could switch this to a pure event driven system + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = (ACE_player getVariable ["tf_isSpeaking", false]) || {!(isNull findDisplay 55)}; + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + }; + }; + }; + default { + //Note: class RscDisplayVoiceChat {idd = 55}; //only present when talking + { + _oldSetting = ACE_player getVariable [QGVAR(isSpeaking), false]; + _newSetting = (!(isNull findDisplay 55)); + if (!(_oldSetting isEqualTo _newSetting)) then { + ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; + }; + }; + }; +}; + +//Is 0.05sec precision enough?? +[_pfEHCode, 0.05, []] call CBA_fnc_addPerFrameHandler; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index 9cd99adaef..aee850faee 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Edited with tabler - 2014-12-17 --> +<!-- Edited with tabler - 2015-02-12 --> <Project name="ACE"> <Package name="NameTags"> <Key ID="STR_ACE_NameTags_ShowNames"> @@ -69,5 +69,10 @@ <Key ID="STR_ACE_NameTags_ShowNamesForAI"> <English>Show name tags for AI units</English> </Key> + <Key ID="STR_ACE_NameTags_ShowSoundWaves"> + <English>Show SoundWaves when speaking</English> + <German>Zeigen Schallwelle im Gespräch</German> + <Spanish>Mostrar onda sonora cuando se habla</Spanish> + </Key> </Package> -</Project> +</Project> \ No newline at end of file From dbd33d52302fba6c560c3846a92c4921e9681cfb Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Thu, 12 Feb 2015 22:13:51 -0600 Subject: [PATCH 02/27] Missing fnc define Why doesn't calling a nil function throw an error? --- addons/nametags/XEH_preInit.sqf | 1 + 1 file changed, 1 insertion(+) diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index 79258c5cec..b56841c2aa 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -6,6 +6,7 @@ PREP(canShow); PREP(doShow); PREP(drawNameTagIcon); PREP(getVehicleData); +PREP(initIsSpeaking); PREP(moduleNameTags); PREP(onMouseZChanged); PREP(setText); From ba2ee53804b6c50cd9e81e6021f6c3f31e868079 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Fri, 13 Feb 2015 21:23:40 -0600 Subject: [PATCH 03/27] Nametag changes Adds user options for showing soundwaves and default nametag color Before nametags would show effectiveCommander for cursorTarget vehicles, moved this to a module option (default off). --- .../functions/fnc_setSettingFromConfig.sqf | 3 +- addons/nametags/CfgVehicles.hpp | 9 ++ addons/nametags/XEH_postInit.sqf | 106 ++++++++++-------- addons/nametags/config.cpp | 11 ++ .../functions/fnc_drawNameTagIcon.sqf | 42 ++++--- .../nametags/functions/fnc_moduleNameTags.sqf | 1 + addons/nametags/stringtable.xml | 11 +- 7 files changed, 108 insertions(+), 75 deletions(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index 4151f3e0e4..e68157bfdb 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -16,8 +16,7 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - - _value = getNumber (_optionEntry >> "value"); + _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning TRACE_3("_fnc_getValueWithType:", configName _optionEntry, _typeName, _value); if (_typeName == "BOOL") exitWith { _value > 0 diff --git a/addons/nametags/CfgVehicles.hpp b/addons/nametags/CfgVehicles.hpp index e3c4227834..d61c761bfc 100644 --- a/addons/nametags/CfgVehicles.hpp +++ b/addons/nametags/CfgVehicles.hpp @@ -55,6 +55,15 @@ class CfgVehicles { }; }; }; + class showCursorTagForVehicles { + displayName = "Show for Vehicles"; + description = "Show cursor NameTag for vehicle commander (only if client has name tags enabled)Default: No"; + typeName = "BOOL"; + class values { + class Yes {name = "Yes"; value = 1;}; + class No {default = 1; name = "No"; value = 0;}; + }; + }; }; }; }; diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 127f639003..fef1e4e4d3 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -28,56 +28,68 @@ if (!hasInterface) exitWith {}; // Draw handle addMissionEventHandler ["Draw3D", { - if (GVAR(showPlayerNames) == 0) exitWith {}; + if (GVAR(showPlayerNames) == 0) exitWith {}; - _player = ACE_player; - if (GVAR(showPlayerNames) in [2,4]) then { //only on cursor - _target = cursorTarget; - _target = if (_target in allUnitsUAV) then {objNull} else {effectiveCommander _target}; + _player = ACE_player; - if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } else { - _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; - - if (!surfaceIsWater _pos) then { - _pos = ATLtoASL _pos; - }; - _pos2 = positionCameraToWorld [0, 0, 1]; - if (!surfaceIsWater _pos2) then { - _pos2 = ATLtoASL _pos2; - }; - _vecy = _pos2 vectorDiff _pos; - - { - _target = if (_x in allUnitsUAV) then {objNull} else {effectiveCommander _x}; - - if (!isNull _target && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _relPos = (visiblePositionASL _target) vectorDiff _pos; - _distance = vectorMagnitude _relPos; - _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (1 - (time - GVAR(ShowNamesTime) - 1)); + //When cursorTarget is on a vehicle show the nametag for the commander. + //If set to "Only On Keypress" settings, fade just like main tags + if (GVAR(showCursorTagForVehicles)) then { + _target = cursorTarget; + if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then { + _target = effectiveCommander _target; + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; }; + }; - // Check if there is line of sight - if (_alpha > 0) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) then { - _alpha = 0; - }; + if (GVAR(showPlayerNames) in [2,4]) then { + //"Only Cursor" mode, only show nametags for humans + _target = cursorTarget; + if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) == 4)) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } forEach _targets; - }; + } else { + _pos = positionCameraToWorld [0, 0, 0]; + _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; + + if (!surfaceIsWater _pos) then { + _pos = ATLtoASL _pos; + }; + _pos2 = positionCameraToWorld [0, 0, 1]; + if (!surfaceIsWater _pos2) then { + _pos2 = ATLtoASL _pos2; + }; + _vecy = _pos2 vectorDiff _pos; + + { + _target = _x; + + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight + _relPos = (visiblePositionASL _target) vectorDiff _pos; + _distance = vectorMagnitude _relPos; + _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); + + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); + + if (GVAR(showPlayerNames) == 3) then { //only on keypress + _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); + }; + + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + } forEach _targets; + }; }]; diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index c7ee208a60..d17c156b78 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -16,6 +16,12 @@ class CfgPatches { #include "CfgVehicles.hpp" class ACE_Settings { + class GVAR(defaultNametagColor) { + value[] = {0.77, 0.51, 0.08, 1}; + typeName = "COLOR"; + isClientSetable = 1; + displayName = "$STR_ACE_NameTags_DefaultNametagColor"; + }; class GVAR(showPlayerNames) { value = 1; typeName = "SCALAR"; @@ -40,6 +46,11 @@ class ACE_Settings { typeName = "BOOL"; isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowNamesForAI"; + }; + class GVAR(showCursorTagForVehicles) { + value = 0; + typeName = "BOOL"; + isClientSetable = 0; }; class GVAR(showSoundWaves) { value = 0; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index cd8b9b0452..ca2ed39c5e 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -27,39 +27,37 @@ private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"]; -_player = _this select 0; -_target = _this select 1; -_alpha = _this select 2; -_heightOffset = _this select 3; - -_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find stance _target); - -_position = visiblePositionASL _target; -// Convert position to ASLW (expected by drawIcon3D) and add height offsets -_position set [2, ((_target modelToWorld [0,0,0]) select 2) + _height + _heightOffset]; - -_color = if !(group _target == group _player) then { - [0.77, 0.51, 0.08, _alpha] -} else { - [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0 -}; +PARAMS_4(_player,_target,_alpha,_heightOffset); _name = [_target, true] call EFUNC(common,getName); _icon = ""; _size = 0; -if (GVAR(showSoundWaves) && {_target getVariable [QGVAR(isSpeaking), false]}) then { - _icon = QUOTE(PATHTOF(UI\soundwave)); - _icon = _icon + str (floor (random 10)) + ".paa"; //random - // _icon = _icon + str (diag_frameno % 10) + ".paa"; //play in order?? - _size = 2; + +if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { + _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; + _size = 0.75; + _alpha = _alpha + 0.6;//Boost alpha when speaking } else { if (GVAR(showPlayerRanks)) then { _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); - _size = 1; + _size = 0.75; }; }; +if (_alpha < 0) exitWith {}; //Don't waste time if not visable + +if !(group _target == group _player) then { + _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings) + _color set [3, (_color select 3) * _alpha]; +} else { + _color = [[1, 1, 1, _alpha], [1, 0, 0, _alpha], [0, 1, 0, _alpha], [0, 0, 1, _alpha], [1, 1, 0, _alpha]] select (["MAIN", "RED", "GREEN", "BLUE", "YELLOW"] find (if (_target == _player) then {0} else {assignedTeam _target})) max 0 +}; + +_height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target)); + +// Convert position to ASLW (expected by drawIcon3D) and add height offsets +_position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)]; drawIcon3D [ _icon, diff --git a/addons/nametags/functions/fnc_moduleNameTags.sqf b/addons/nametags/functions/fnc_moduleNameTags.sqf index 24b30e5d6b..a998e5d8a3 100644 --- a/addons/nametags/functions/fnc_moduleNameTags.sqf +++ b/addons/nametags/functions/fnc_moduleNameTags.sqf @@ -25,5 +25,6 @@ GVAR(Module) = true; [_logic, QGVAR(PlayerNamesViewDistance), "PlayerNamesViewDistance" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(ShowNamesForAI), "ShowNamesForAI" ] call EFUNC(common,readSettingFromModule); [_logic, QGVAR(showVehicleCrewInfo), "showVehicleCrewInfo" ] call EFUNC(common,readSettingFromModule); +[_logic, QGVAR(showCursorTagForVehicles), "showCursorTagForVehicles" ] call EFUNC(common,readSettingFromModule); diag_log text "[ACE]: NameTags Module Initialized."; diff --git a/addons/nametags/stringtable.xml b/addons/nametags/stringtable.xml index aee850faee..622df44aca 100644 --- a/addons/nametags/stringtable.xml +++ b/addons/nametags/stringtable.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Edited with tabler - 2015-02-12 --> +<!-- Edited with tabler - 2015-02-13 --> <Project name="ACE"> <Package name="NameTags"> <Key ID="STR_ACE_NameTags_ShowNames"> @@ -70,9 +70,12 @@ <English>Show name tags for AI units</English> </Key> <Key ID="STR_ACE_NameTags_ShowSoundWaves"> - <English>Show SoundWaves when speaking</English> - <German>Zeigen Schallwelle im Gespräch</German> - <Spanish>Mostrar onda sonora cuando se habla</Spanish> + <English>Show SoundWaves (requires player names)</English> + <German>Zeigen Schallwelle (benötigt spielernamen)</German> + <Spanish>Mostrar onda sonora (requiere Mostrar nombres de jugadores)</Spanish> + </Key> + <Key ID="STR_ACE_NameTags_DefaultNametagColor"> + <English>Default Nametag Color (Non Group Members)</English> </Key> </Package> </Project> \ No newline at end of file From 1a2a9dd584fb4ed055c381b4a38e85b50a9066cf Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Sat, 14 Feb 2015 15:51:08 -0600 Subject: [PATCH 04/27] Remove support for Anthropomorphism --- addons/nametags/XEH_postInit.sqf | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index fef1e4e4d3..0837ce3e88 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -36,7 +36,7 @@ addMissionEventHandler ["Draw3D", { //If set to "Only On Keypress" settings, fade just like main tags if (GVAR(showCursorTagForVehicles)) then { _target = cursorTarget; - if ((!(_target isKindOf "Man")) && {!(_target in allUnitsUAV)}) then { + if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { _target = effectiveCommander _target; if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; @@ -52,7 +52,7 @@ addMissionEventHandler ["Draw3D", { if (GVAR(showPlayerNames) in [2,4]) then { //"Only Cursor" mode, only show nametags for humans _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "Man"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); if ((GVAR(showPlayerNames) == 4)) then { //only on keypress @@ -62,7 +62,7 @@ addMissionEventHandler ["Draw3D", { }; } else { _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["Man", GVAR(PlayerNamesViewDistance) + 5]; + _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; if (!surfaceIsWater _pos) then { _pos = ATLtoASL _pos; From dec34b4b30613e662a5d3d96e09b051076a35835 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Sun, 15 Feb 2015 14:55:17 -0600 Subject: [PATCH 05/27] Surrender Fixes Remove XEH GetIn and use vehicleChanged Event Handle Zeus (showHUD) Attempt to handle failed animation change --- addons/captives/CfgEventHandlers.hpp | 10 ----- addons/captives/XEH_postInit.sqf | 3 ++ addons/captives/XEH_preInit.sqf | 3 +- addons/captives/functions/fnc_handleGetIn.sqf | 24 ------------ .../functions/fnc_handleKnockedOut.sqf | 25 ++++++++++++- .../functions/fnc_handlePlayerChanged.sqf | 8 +++- .../functions/fnc_handleVehicleChanged.sqf | 30 +++++++++++++++ .../fnc_handleZeusDisplayChanged.sqf | 31 ++++++++++++++++ .../captives/functions/fnc_setHandcuffed.sqf | 3 ++ addons/captives/functions/fnc_surrender.sqf | 37 ++++++++++--------- 10 files changed, 120 insertions(+), 54 deletions(-) delete mode 100644 addons/captives/functions/fnc_handleGetIn.sqf create mode 100644 addons/captives/functions/fnc_handleVehicleChanged.sqf create mode 100644 addons/captives/functions/fnc_handleZeusDisplayChanged.sqf diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 722750f915..8829d0f275 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -10,15 +10,6 @@ class Extended_PostInit_EventHandlers { }; }; -//release escorted captive when entering a vehicle -class Extended_GetIn_EventHandlers { - class All { - class GVAR(AutoDetachCaptive) { - getIn = QUOTE(_this call FUNC(handleGetIn)); - }; - }; -}; - //reset captive animation after leaving vehicle class Extended_GetOut_EventHandlers { class All { @@ -45,4 +36,3 @@ class Extended_InitPost_EventHandlers { }; }; }; - diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 9d1a242d4d..9c124630ee 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -21,6 +21,9 @@ if (isServer) then { }]; }; +["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler); +["zeusDisplayChanged", {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler); + //TODO: Medical Integration Events??? // [_unit, "knockedOut", { diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 75ee77e9bc..f6ec44225f 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,12 +16,13 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); -PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); +PREP(handleVehicleChanged); +PREP(handleZeusDisplayChanged); PREP(handleWokeUp); PREP(moduleSurrender); PREP(setHandcuffed); diff --git a/addons/captives/functions/fnc_handleGetIn.sqf b/addons/captives/functions/fnc_handleGetIn.sqf deleted file mode 100644 index 54133e2362..0000000000 --- a/addons/captives/functions/fnc_handleGetIn.sqf +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Author: commy2 - * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle - * - * Arguments: - * 0: _vehicle <OBJECT> - * 2: dunno <OBJECT> - * 1: _unit <OBJECT> - * - * Return Value: - * The return value <BOOL> - * - * Example: - * [car2, x, player] call ACE_captives_fnc_handleGetIn - * - * Public: No - */ -#include "script_component.hpp" - -PARAMS_3(_vehicle,_dontcare,_unit); - -if ((local _unit) && (_unit getVariable [QGVAR(isEscorting), false])) then { - _unit setVariable [QGVAR(isEscorting), false, true]; -}; diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index 3257d544ca..aba01b194f 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -1,2 +1,25 @@ -// by commy2 +/* + * Author: PabstMirror + * Handles when a unit gets knocked out. Ends surrendering. + * + * Arguments: + * 0: Unit <OBJECT> + * + * Return Value: + * Nothing + * + * Example: + * [bob, true] call ACE_captives_fnc_handleKnockedOut + * + * Public: No + */ +#include "script_component.hpp" + +//ToDo: Waiting on medical integration + +PARAMS_1(_unit); + +if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, _false] call FUNC(surrender); +}; diff --git a/addons/captives/functions/fnc_handlePlayerChanged.sqf b/addons/captives/functions/fnc_handlePlayerChanged.sqf index 13e284ef80..21fd1e1ec3 100644 --- a/addons/captives/functions/fnc_handlePlayerChanged.sqf +++ b/addons/captives/functions/fnc_handlePlayerChanged.sqf @@ -18,10 +18,16 @@ PARAMS_2(_newUnit,_oldUnit); +//set showHUD based on new unit status: if ((_newUnit getVariable [QGVAR(isHandcuffed), false]) || {_newUnit getVariable [QGVAR(isSurrendering), false]}) then { TRACE_1("Player Change (showHUD false)",_newUnit); - showHUD false; + showHUD false; } else { TRACE_1("Player Change (showHUD true)",_newUnit); showHUD true; }; + +//If old player was escorting, stop +if (_oldUnit getVariable [QGVAR(isEscorting), false]) then { + _oldUnit setVariable [QGVAR(isEscorting), false, true]; +}; diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf new file mode 100644 index 0000000000..74f966ecc3 --- /dev/null +++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf @@ -0,0 +1,30 @@ +/* + * Author: commy2 + * Handles when a player's vehicle changes (supports scripted vehicle changes) + * + * Arguments: + * 0: unit <OBJECT> + * 1: newVehicle <OBJECT> + * + * Return Value: + * Nothing + * + * Example: + * [player, car] call ACE_captives_fnc_handleVehicleChanged + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_vehicle); + +//When moved into a vehicle (action or scripted) +if ((vehicle _unit) != _unit) then { + if (_unit getVariable [QGVAR(isEscorting), false]) then { + _unit setVariable [QGVAR(isEscorting), false, true]; + }; + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { + [_unit, false] call FUNC(surrender); + }; +}; diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf new file mode 100644 index 0000000000..e328d410fa --- /dev/null +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -0,0 +1,31 @@ +/* + * Author: PabstMirror + * Handles handles ZeusDisplayChanged event + * Need to reset showHUD after closing zeus + * + * Arguments: + * 0: Unit <OBJECT> + * 1: Display is now open <BOOL> + * + * Return Value: + * Nothing + * + * Example: + * [bob1, false] call ACE_captives_fnc_handleZeusDisplayChanged + * + * Public: No + */ +#include "script_component.hpp" + +PARAMS_2(_unit,_zeusIsOpen); + +//set showHUD based on unit status: +if (!_zeusIsOpen) then { + if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { + TRACE_1("Player Change (showHUD false)",_newUnit); + showHUD false; + } else { + TRACE_1("Player Change (showHUD true)",_newUnit); + showHUD true; + }; +}; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 912b00662f..06906167e9 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -30,6 +30,9 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; + if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, _false] call FUNC(surrender); + }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 1f0e232926..25d5e6a008 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -30,12 +30,7 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { if (_state) then { _unit setVariable [QGVAR(isSurrendering), true, true]; - [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); - - if (_unit == ACE_player) then { - showHUD false; - }; - + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); @@ -45,19 +40,27 @@ if (_state) then { }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); - //PFEH - (TODO: move to event system?) + //Start up a pfeh to make sure the unit actualy goes into the animation + //Only change variables and captivity when they reach that state + //fixes vaulting to break animation [{ - EXPLODE_1_PVT((_this select 0),_unit); - if (_unit getVariable [QGVAR(isSurrendering), false]) then { - //If unit dies, gets knocked out, or is handcuffed then end surrender - if ((!alive _unit) || {_unit getVariable ["ACE_isUnconscious", false]} || {_unit getVariable [QGVAR(isHandcuffed), false]}) then { - [_unit, false] call FUNC(surrender); - [(_this select 1)] call CBA_fnc_removePerFrameHandler; - }; - } else { - [(_this select 1)] call cba_fnc_removePerFrameHandler; + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + + if (time > _maxTime) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + _unit setVariable [QGVAR(isSurrendering), false, true]; + ERROR("Surrender animation failed"); }; - }, 0.0, [_unit]] call CBA_fnc_addPerFrameHandler; + if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + + if (_unit == ACE_player) then { + showHUD false; + }; + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); + }; + }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); From 3c65c422b1ab81db92640ee90a2c52f63fc67b02 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Sun, 15 Feb 2015 16:42:00 -0600 Subject: [PATCH 06/27] More Surrender Fixes Increase "drop hands" animation speed (now just 1/2 of normal) Use "AnimChanged" EH to watch for animation breaks while surrendering Only "crack" the hands up animation if we are in the right animation state --- addons/captives/CfgMoves.hpp | 2 +- .../captives/functions/fnc_canSurrender.sqf | 11 +++- addons/captives/functions/fnc_surrender.sqf | 62 +++++++++++-------- 3 files changed, 46 insertions(+), 29 deletions(-) diff --git a/addons/captives/CfgMoves.hpp b/addons/captives/CfgMoves.hpp index 6e67f3615b..d60fab5a33 100644 --- a/addons/captives/CfgMoves.hpp +++ b/addons/captives/CfgMoves.hpp @@ -72,7 +72,7 @@ class CfgMovesMaleSdr: CfgMovesBasic { InterpolateTo[] = {"Unconscious",0.01}; }; class ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon: ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon { - speed = 0.333; //for gameplay reasons, slow this down + speed = 0.5; //for gameplay reasons, slow this down actions = "CivilStandActions"; file = "\A3\anims_f\Data\Anim\Sdr\mov\erc\stp\sur\non\AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon"; ConnectTo[] = {"AmovPercMstpSnonWnonDnon",0.1}; diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 238087c62b..4c16e8ccd0 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -18,5 +18,12 @@ PARAMS_2(_unit,_newSurrenderState); -//TODO: any other conditions?? -(!((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _newSurrenderState)) +private "_returnValue"; + +_returnValue = if (_newSurrenderState) then { + !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering +} else { + (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}; +}; + +_returnValue diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index 25d5e6a008..f2103d2c1c 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -30,7 +30,12 @@ if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { if (_state) then { _unit setVariable [QGVAR(isSurrendering), true, true]; - + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); + + if (_unit == ACE_player) then { + showHUD false; + }; + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); @@ -38,37 +43,42 @@ if (_state) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; - }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); - //Start up a pfeh to make sure the unit actualy goes into the animation - //Only change variables and captivity when they reach that state - //fixes vaulting to break animation - [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); - - if (time > _maxTime) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - _unit setVariable [QGVAR(isSurrendering), false, true]; - ERROR("Surrender animation failed"); - }; - if ((animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon") exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - - if (_unit == ACE_player) then { - showHUD false; + //Adds an animation changed eh + //Should handle changes in animation + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { + ERROR("Surrender animation failed"); + systemChat "You Stop Surrendering"; + [_unit, false] call FUNC(surrender); }; - [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); - }; - }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + + }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); - if ((vehicle _unit) == _unit) then { - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) - [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); - }; + _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; + _unit removeEventHandler ["AnimChanged", _animChangedEHID]; + + //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter + [{ + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + //If maxtime or they re-surrendered, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler; if (_unit == ACE_player) then { //only re-enable HUD if not handcuffed From a0c2a00777052312583df4bac9e7c6954bf6d006 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Sun, 15 Feb 2015 16:45:13 -0600 Subject: [PATCH 07/27] Cleanup --- addons/captives/functions/fnc_canSurrender.sqf | 2 +- addons/captives/functions/fnc_handleKnockedOut.sqf | 2 +- addons/captives/functions/fnc_surrender.sqf | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/addons/captives/functions/fnc_canSurrender.sqf b/addons/captives/functions/fnc_canSurrender.sqf index 4c16e8ccd0..3ee687cfc1 100644 --- a/addons/captives/functions/fnc_canSurrender.sqf +++ b/addons/captives/functions/fnc_canSurrender.sqf @@ -23,7 +23,7 @@ private "_returnValue"; _returnValue = if (_newSurrenderState) then { !(_unit getVariable [QGVAR(isSurrendering), false]); //Not currently surrendering } else { - (_unit getVariable [QGVAR(isSurrendering), false]); //isSurrendering and on the hands up animation - // && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}; + (_unit getVariable [QGVAR(isSurrendering), false]); //is Surrendering }; _returnValue diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index aba01b194f..fadf63e971 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -1,5 +1,5 @@ /* - * Author: PabstMirror + * Author: commy2, PabstMirror * Handles when a unit gets knocked out. Ends surrendering. * * Arguments: diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index f2103d2c1c..adffc4d2aa 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -50,7 +50,6 @@ if (_state) then { PARAMS_2(_unit,_newAnimation); if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { ERROR("Surrender animation failed"); - systemChat "You Stop Surrendering"; [_unit, false] call FUNC(surrender); }; }]; From e0d1d08913061204d303135bdc4a7dcf6200eb7a Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Sun, 15 Feb 2015 18:19:01 -0600 Subject: [PATCH 08/27] Change AnimChange EH --- .../fnc_handleZeusDisplayChanged.sqf | 4 +- .../captives/functions/fnc_setHandcuffed.sqf | 2 +- addons/captives/functions/fnc_surrender.sqf | 51 +++++++++++-------- 3 files changed, 34 insertions(+), 23 deletions(-) diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf index e328d410fa..2299fa7031 100644 --- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -22,10 +22,10 @@ PARAMS_2(_unit,_zeusIsOpen); //set showHUD based on unit status: if (!_zeusIsOpen) then { if ((_unit getVariable [QGVAR(isHandcuffed), false]) || {_unit getVariable [QGVAR(isSurrendering), false]}) then { - TRACE_1("Player Change (showHUD false)",_newUnit); + TRACE_1("Player Change (showHUD false)",_unit); showHUD false; } else { - TRACE_1("Player Change (showHUD true)",_newUnit); + TRACE_1("Player Change (showHUD true)",_unit); showHUD true; }; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 06906167e9..0d404f6c6e 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -31,7 +31,7 @@ if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, _false] call FUNC(surrender); + [_unit, false] call FUNC(surrender); }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_surrender.sqf index adffc4d2aa..e1e4c19c11 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_surrender.sqf @@ -4,7 +4,7 @@ * * Arguments: * 0: Unit <OBJECT> - * 1: State <BOOL> + * 1: True to surrender, false to un-surrender <BOOL> * * Return Value: * Nothing @@ -45,12 +45,16 @@ if (_state) then { }; //Adds an animation changed eh - //Should handle changes in animation + //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering _animChangedEHID = _unit addEventHandler ["AnimChanged", { PARAMS_2(_unit,_newAnimation); + if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { - ERROR("Surrender animation failed"); - [_unit, false] call FUNC(surrender); + if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then { + ERROR("Surrender animation failed"); + systemChat "Debug: Surrender animation failed"; + [_unit, false] call FUNC(surrender); + }; }; }]; _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; @@ -62,22 +66,7 @@ if (_state) then { _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; - - //spin up a PFEH, to watching animationState for the next 10 seconds to make sure we don't enter - [{ - PARAMS_2(_args,_pfID); - EXPLODE_2_PVT(_args,_unit,_maxTime); - //If maxtime or they re-surrendered, exit loop - if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - }; - //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) - if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { - [_pfID] call CBA_fnc_removePerFrameHandler; - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) - [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); - }; - }, 0.05, [_unit, (time + 15)]] call CBA_fnc_addPerFrameHandler; + _unit setVariable [QGVAR(surrenderAnimEHID), -1]; if (_unit == ACE_player) then { //only re-enable HUD if not handcuffed @@ -85,4 +74,26 @@ if (_state) then { showHUD true; }; }; + + //if we are in "hands up" animationState, crack it now + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then { + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + } else { + //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter + //Handles long animation chains + [{ + PARAMS_2(_args,_pfID); + EXPLODE_2_PVT(_args,_unit,_maxTime); + //If maxtime or they re-surrendered, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + }; + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { + [_pfID] call CBA_fnc_removePerFrameHandler; + //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); + }; + }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }; }; From eee4b256cd3f5285640283517b70873ab28bebfa Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Mon, 16 Feb 2015 18:03:09 -0600 Subject: [PATCH 09/27] More Changes and add EH --- addons/captives/CfgVehicles.hpp | 6 +- addons/captives/XEH_postInit.sqf | 10 +-- addons/captives/XEH_preInit.sqf | 2 +- .../functions/fnc_handleKnockedOut.sqf | 2 +- .../functions/fnc_handleUnitInitPost.sqf | 2 +- .../functions/fnc_handleVehicleChanged.sqf | 2 +- .../functions/fnc_moduleSurrender.sqf | 11 +++- .../captives/functions/fnc_setHandcuffed.sqf | 34 +++++++--- ...c_surrender.sqf => fnc_setSurrendered.sqf} | 64 ++++++++++--------- 9 files changed, 79 insertions(+), 54 deletions(-) rename addons/captives/functions/{fnc_surrender.sqf => fnc_setSurrendered.sqf} (56%) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index d292402bcf..75b1a85803 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -81,8 +81,8 @@ class CfgVehicles { }; class ACE_StartSurrenderingSelf { displayName = "$STR_ACE_Captives_StartSurrendering"; - condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, true)] call FUNC(surrender)); + condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); + statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); exceptions[] = {}; showDisabled = 0; priority = 0; @@ -90,7 +90,7 @@ class CfgVehicles { class ACE_StopSurrenderingSelf { displayName = "$STR_ACE_Captives_StopSurrendering"; condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, false)] call FUNC(surrender)); + statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender)); exceptions[] = {QGVAR(isNotSurrendering)}; showDisabled = 0; priority = 0; diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index 9c124630ee..da92307815 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -1,9 +1,5 @@ #include "script_component.hpp" -["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); -["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); -["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); -["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); //Handles when someone starts escorting and then disconnects, leaving the captive attached //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC @@ -23,6 +19,12 @@ if (isServer) then { ["playerVehicleChanged", {_this call FUNC(handleVehicleChanged)}] call EFUNC(common,addEventHandler); ["zeusDisplayChanged", {_this call FUNC(handleZeusDisplayChanged)}] call EFUNC(common,addEventHandler); +["playerChanged", {_this call FUNC(handlePlayerChanged)}] call EFUNC(common,addEventhandler); +["MoveInCaptive", {_this call FUNC(vehicleCaptiveMoveIn)}] call EFUNC(common,addEventHandler); +["MoveOutCaptive", {_this call FUNC(vehicleCaptiveMoveOut)}] call EFUNC(common,addEventHandler); + +["SetHandcuffed", {_this call FUNC(setHandcuffed)}] call EFUNC(common,addEventHandler); +["SetSurrendered", {_this call FUNC(setSurrendered)}] call EFUNC(common,addEventHandler); //TODO: Medical Integration Events??? diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index f6ec44225f..728f5fff69 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -26,7 +26,7 @@ PREP(handleZeusDisplayChanged); PREP(handleWokeUp); PREP(moduleSurrender); PREP(setHandcuffed); -PREP(surrender); +PREP(setSurrendered); PREP(vehicleCaptiveMoveIn); PREP(vehicleCaptiveMoveOut); diff --git a/addons/captives/functions/fnc_handleKnockedOut.sqf b/addons/captives/functions/fnc_handleKnockedOut.sqf index fadf63e971..1cd969807d 100644 --- a/addons/captives/functions/fnc_handleKnockedOut.sqf +++ b/addons/captives/functions/fnc_handleKnockedOut.sqf @@ -21,5 +21,5 @@ PARAMS_1(_unit); if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, _false] call FUNC(surrender); + [_unit, false] call FUNC(setSurrendered); }; diff --git a/addons/captives/functions/fnc_handleUnitInitPost.sqf b/addons/captives/functions/fnc_handleUnitInitPost.sqf index 1a5a8f2ecd..a8b601300a 100644 --- a/addons/captives/functions/fnc_handleUnitInitPost.sqf +++ b/addons/captives/functions/fnc_handleUnitInitPost.sqf @@ -29,6 +29,6 @@ if (local _unit) then { if (_unit getVariable [QGVAR(isSurrendering), false]) then { _unit setVariable [QGVAR(isSurrendering), false]; - [_unit, true] call FUNC(surrender); + [_unit, true] call FUNC(setSurrendered); }; }; diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleVehicleChanged.sqf index 74f966ecc3..a5cd7004a4 100644 --- a/addons/captives/functions/fnc_handleVehicleChanged.sqf +++ b/addons/captives/functions/fnc_handleVehicleChanged.sqf @@ -25,6 +25,6 @@ if ((vehicle _unit) != _unit) then { }; if (_unit getVariable [QGVAR(isSurrendering), false]) then { - [_unit, false] call FUNC(surrender); + [_unit, false] call FUNC(setSurrender); }; }; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 5cbf43aacc..d2e3fc9f5e 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -28,7 +28,14 @@ if (local _logic) then { _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - [_mouseOverObject, true] call FUNC(surrender); + [_mouseOverObject, true] call FUNC(setSurrendered); + + if (!(_mouseOverObject getVariable [GVAR(), false])) then { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + } else { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + }; + } else { systemChat format ["Only use on dismounted inf"]; }; @@ -38,7 +45,7 @@ if (local _logic) then { } else {//an editor module { systemChat format ["Debug - module surrendering %1", (name _x)]; - [_x, true] call FUNC(surrender); + [_x, true] call FUNC(setSurrendered); } forEach _units; }; diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index 0d404f6c6e..cec1a007e7 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -18,22 +18,23 @@ PARAMS_2(_unit,_state); -// We only want this function to work on local machines -if (!local _unit) exitwith { - [_this, QUOTE(FUNC(setHandcuffed)), _unit] call EFUNC(common,execRemoteFnc); - TRACE_2("running setHandcuffed on remote unit",_unit,_state); -}; -if (_state isEqualTo (_unit getVariable [QGVAR(isHandcuffed), false])) then { - LOG("setHandcuffed: current state same as new"); +if (!local _unit) exitwith { + ERROR("running setHandcuffed on remote unit"); +}; +if ((_unit getVariable [QGVAR(isHandcuffed), false]) isEqualTo _state) exitWith { + ERROR("setHandcuffed: current state same as new"); }; if (_state) then { _unit setVariable [QGVAR(isHandcuffed), true, true]; - if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop - [_unit, false] call FUNC(surrender); - }; [_unit, QGVAR(Handcuffed), true] call EFUNC(common,setCaptivityStatus); + + if (_unit getVariable [QGVAR(isSurrendering), false]) then { //If surrendering, stop + [_unit, false] call FUNC(setSurrendered); + }; + + //Set unit cargoIndex (will be -1 if dismounted) _unit setVariable [QGVAR(CargoIndex), ((vehicle _unit) getCargoIndex _unit), true]; if (_unit == ACE_player) then { @@ -46,6 +47,19 @@ if (_state) then { if (_unit getVariable [QGVAR(isHandcuffed), false] && {vehicle _unit == _unit}) then { [_unit] call EFUNC(common,fixLoweredRifleAnimation); [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then { + ERROR("Handcuff animation interrupted"); + systemChat format ["debug %2: new %1", _newAnimation, time]; + [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); + }; + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { diff --git a/addons/captives/functions/fnc_surrender.sqf b/addons/captives/functions/fnc_setSurrendered.sqf similarity index 56% rename from addons/captives/functions/fnc_surrender.sqf rename to addons/captives/functions/fnc_setSurrendered.sqf index e1e4c19c11..e49c6e9453 100644 --- a/addons/captives/functions/fnc_surrender.sqf +++ b/addons/captives/functions/fnc_setSurrendered.sqf @@ -10,7 +10,7 @@ * Nothing * * Example: - * [Pierre, true] call ACE_captives_fnc_surrender; + * [Pierre, true] call ACE_captives_fnc_setSurrendered; * * Public: No */ @@ -18,52 +18,52 @@ PARAMS_2(_unit,_state); -// We only want this function to work on local machines + if (!local _unit) exitwith { - [_this, QUOTE(FUNC(surrender)), _unit] call EFUNC(common,execRemoteFnc); - TRACE_2("running surrender on remote unit",_unit,_state); + ERROR("running surrender on remote unit"); }; -if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) then { - LOG("Surrender: current state same as new"); +if ((_unit getVariable [QGVAR(isSurrendering), false]) isEqualTo _state) exitWith { + ERROR("Surrender: current state same as new"); }; if (_state) then { + if ((vehicle _unit) != _unit) exitWith {ERROR("Cannot surrender while mounted");}; + if (_unit getVariable [QGVAR(isHandcuffed), false]) exitWith {ERROR("Cannot surrender while handcuffed");}; + _unit setVariable [QGVAR(isSurrendering), true, true]; + [_unit, QGVAR(Surrendered), true] call EFUNC(common,setCaptivityStatus); if (_unit == ACE_player) then { showHUD false; }; + [_unit] call EFUNC(common,fixLoweredRifleAnimation); + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); + // fix anim on mission start (should work on dedicated servers) [{ PARAMS_1(_unit); - if (_unit getVariable [QGVAR(isSurrendering), false] && {vehicle _unit == _unit}) then { - [_unit] call EFUNC(common,fixLoweredRifleAnimation); - [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); - }; - - //Adds an animation changed eh - //If we get a change in animation before we've "locked" in the hands up animationState, then stop surrendering - _animChangedEHID = _unit addEventHandler ["AnimChanged", { - PARAMS_2(_unit,_newAnimation); - - if (_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") then { - if ((animationState _unit != "ACE_AmovPercMstpSnonWnonDnon_AmovPercMstpSsurWnonDnon") && (animationState _unit != "ACE_AmovPercMstpSsurWnonDnon")) then { - ERROR("Surrender animation failed"); - systemChat "Debug: Surrender animation failed"; - [_unit, false] call FUNC(surrender); + if (_unit getVariable [QGVAR(isSurrendering), false] && {(vehicle _unit) == _unit}) then { + //Adds an animation changed eh + //If we get a change in animation then redo the animation (handles people vaulting to break the animation chain) + _animChangedEHID = _unit addEventHandler ["AnimChanged", { + PARAMS_2(_unit,_newAnimation); + if ((_newAnimation != "ACE_AmovPercMstpSsurWnonDnon") && (_newAnimation != "Unconscious")) then { + ERROR("Surrender animation interrupted"); + systemChat format ["debug %2: new %1", _newAnimation, time]; + [_unit, "ACE_AmovPercMstpSsurWnonDnon", 1] call EFUNC(common,doAnimation); }; - }; - }]; - _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; - + }]; + _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isSurrendering), false, true]; [_unit, QGVAR(Surrendered), false] call EFUNC(common,setCaptivityStatus); + //remove AnimChanged EH _animChangedEHID = _unit getVariable [QGVAR(surrenderAnimEHID), -1]; _unit removeEventHandler ["AnimChanged", _animChangedEHID]; _unit setVariable [QGVAR(surrenderAnimEHID), -1]; @@ -75,25 +75,27 @@ if (_state) then { }; }; + if (_unit getVariable ["ACE_isUnconscious", false]) exitWith {}; //don't touch animations if unconscious + //if we are in "hands up" animationState, crack it now if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) then { [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); } else { - //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter + //spin up a PFEH, to watching animationState for the next 20 seconds to make sure we don't enter "hands up" //Handles long animation chains [{ PARAMS_2(_args,_pfID); EXPLODE_2_PVT(_args,_unit,_maxTime); - //If maxtime or they re-surrendered, exit loop - if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]}) exitWith { + //If waited long enough or they re-surrendered or they are unconscious, exit loop + if ((time > _maxTime) || {_unit getVariable [QGVAR(isSurrendering), false]} || {_unit getVariable ["ACE_isUnconscious", false]}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; }; - //Only break animation if they are actualy the "hands up" animation (because we are using switchmove) + //Only break animation if they are actualy the "hands up" animation (because we are using switchmove there won't be an transition) if (((vehicle _unit) == _unit) && {(animationState _unit) == "ACE_AmovPercMstpSsurWnonDnon"}) exitWith { [_pfID] call CBA_fnc_removePerFrameHandler; - //Break out of hands up animation loop (doAnimation handles Unconscious prioity) + //Break out of hands up animation loop [_unit, "ACE_AmovPercMstpSsurWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); }; - }, 0.05, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; + }, 0, [_unit, (time + 20)]] call CBA_fnc_addPerFrameHandler; }; }; From dc82e50d72cafb9744e692f2576ef937d33bd85a Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Mon, 16 Feb 2015 18:30:35 -0600 Subject: [PATCH 10/27] fix --- addons/captives/CfgVehicles.hpp | 2 +- addons/captives/XEH_postInit.sqf | 1 + addons/captives/XEH_preInit.sqf | 2 +- addons/captives/functions/fnc_moduleSurrender.sqf | 6 +++--- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 75b1a85803..47bd557efc 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -81,7 +81,7 @@ class CfgVehicles { }; class ACE_StartSurrenderingSelf { displayName = "$STR_ACE_Captives_StartSurrendering"; - condition = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); + condition = QUOTE([ARR_2(_player, true)] call FUNC(canSurrender)); statement = QUOTE([ARR_2(_player, true)] call FUNC(setSurrendered)); exceptions[] = {}; showDisabled = 0; diff --git a/addons/captives/XEH_postInit.sqf b/addons/captives/XEH_postInit.sqf index da92307815..ac86d71915 100644 --- a/addons/captives/XEH_postInit.sqf +++ b/addons/captives/XEH_postInit.sqf @@ -3,6 +3,7 @@ //Handles when someone starts escorting and then disconnects, leaving the captive attached //This is normaly handled by the PFEH in doEscortCaptive, but that won't be running if they DC + if (isServer) then { addMissionEventHandler ["HandleDisconnect", { PARAMS_1(_disconnectedPlayer); diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index 728f5fff69..d23d8759f8 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -22,8 +22,8 @@ PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); PREP(handleVehicleChanged); -PREP(handleZeusDisplayChanged); PREP(handleWokeUp); +PREP(handleZeusDisplayChanged); PREP(moduleSurrender); PREP(setHandcuffed); PREP(setSurrendered); diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index d2e3fc9f5e..a33c56fc09 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -29,13 +29,13 @@ if (local _logic) then { if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; [_mouseOverObject, true] call FUNC(setSurrendered); - - if (!(_mouseOverObject getVariable [GVAR(), false])) then { + + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); } else { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); }; - + } else { systemChat format ["Only use on dismounted inf"]; }; From 9cdf06383dc8f5f6dda5b9c846d785eb65dac650 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Mon, 16 Feb 2015 19:20:55 -0600 Subject: [PATCH 11/27] Back to getIn --- addons/captives/CfgEventHandlers.hpp | 11 ++++++++--- addons/captives/CfgVehicles.hpp | 2 +- addons/captives/XEH_preInit.sqf | 2 +- ...dleVehicleChanged.sqf => fnc_handleGetIn.sqf} | 16 ++++++++-------- .../captives/functions/fnc_moduleSurrender.sqf | 3 +-- 5 files changed, 19 insertions(+), 15 deletions(-) rename addons/captives/functions/{fnc_handleVehicleChanged.sqf => fnc_handleGetIn.sqf} (55%) diff --git a/addons/captives/CfgEventHandlers.hpp b/addons/captives/CfgEventHandlers.hpp index 8829d0f275..0ce09280a7 100644 --- a/addons/captives/CfgEventHandlers.hpp +++ b/addons/captives/CfgEventHandlers.hpp @@ -9,7 +9,14 @@ class Extended_PostInit_EventHandlers { init = QUOTE(call COMPILE_FILE(XEH_postInit)); }; }; - +//release escorted captive when entering a vehicle +class Extended_GetIn_EventHandlers { + class All { + class GVAR(AutoDetachCaptive) { + getIn = QUOTE(_this call FUNC(handleGetIn)); + }; + }; +}; //reset captive animation after leaving vehicle class Extended_GetOut_EventHandlers { class All { @@ -18,7 +25,6 @@ class Extended_GetOut_EventHandlers { }; }; }; - //reset captivity and escorting status when getting killed class Extended_Killed_EventHandlers { class CAManBase { @@ -27,7 +33,6 @@ class Extended_Killed_EventHandlers { }; }; }; - //mission start class Extended_InitPost_EventHandlers { class CAManBase { diff --git a/addons/captives/CfgVehicles.hpp b/addons/captives/CfgVehicles.hpp index 47bd557efc..31b0ac713f 100644 --- a/addons/captives/CfgVehicles.hpp +++ b/addons/captives/CfgVehicles.hpp @@ -90,7 +90,7 @@ class CfgVehicles { class ACE_StopSurrenderingSelf { displayName = "$STR_ACE_Captives_StopSurrendering"; condition = QUOTE([ARR_2(_player, false)] call FUNC(canSurrender)); - statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrender)); + statement = QUOTE([ARR_2(_player, false)] call FUNC(setSurrendered)); exceptions[] = {QGVAR(isNotSurrendering)}; showDisabled = 0; priority = 0; diff --git a/addons/captives/XEH_preInit.sqf b/addons/captives/XEH_preInit.sqf index d23d8759f8..34c9bca910 100644 --- a/addons/captives/XEH_preInit.sqf +++ b/addons/captives/XEH_preInit.sqf @@ -16,12 +16,12 @@ PREP(doFriskPerson); PREP(doLoadCaptive); PREP(doRemoveHandcuffs); PREP(doUnloadCaptive); +PREP(handleGetIn); PREP(handleGetOut); PREP(handleKilled); PREP(handleKnockedOut); PREP(handlePlayerChanged); PREP(handleUnitInitPost); -PREP(handleVehicleChanged); PREP(handleWokeUp); PREP(handleZeusDisplayChanged); PREP(moduleSurrender); diff --git a/addons/captives/functions/fnc_handleVehicleChanged.sqf b/addons/captives/functions/fnc_handleGetIn.sqf similarity index 55% rename from addons/captives/functions/fnc_handleVehicleChanged.sqf rename to addons/captives/functions/fnc_handleGetIn.sqf index a5cd7004a4..cf7d2c7271 100644 --- a/addons/captives/functions/fnc_handleVehicleChanged.sqf +++ b/addons/captives/functions/fnc_handleGetIn.sqf @@ -1,25 +1,25 @@ /* * Author: commy2 - * Handles when a player's vehicle changes (supports scripted vehicle changes) + * Handles when a unit gets in to a vehicle. Release escorted captive when entering a vehicle * * Arguments: - * 0: unit <OBJECT> - * 1: newVehicle <OBJECT> + * 0: _vehicle <OBJECT> + * 2: dunno <OBJECT> + * 1: _unit <OBJECT> * * Return Value: - * Nothing + * The return value <BOOL> * * Example: - * [player, car] call ACE_captives_fnc_handleVehicleChanged + * [car2, x, player] call ACE_captives_fnc_handleGetIn * * Public: No */ #include "script_component.hpp" -PARAMS_2(_unit,_vehicle); +PARAMS_3(_vehicle,_dontcare,_unit); -//When moved into a vehicle (action or scripted) -if ((vehicle _unit) != _unit) then { +if (local _unit) then { if (_unit getVariable [QGVAR(isEscorting), false]) then { _unit setVariable [QGVAR(isEscorting), false, true]; }; diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index a33c56fc09..9311c7a1b9 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -28,8 +28,7 @@ if (local _logic) then { _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - [_mouseOverObject, true] call FUNC(setSurrendered); - + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); } else { From 37216d51449665287dde4e9c3bdb702895887f2b Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Tue, 17 Feb 2015 17:05:07 -0600 Subject: [PATCH 12/27] Remove HandCuff animEH --- addons/captives/functions/fnc_setHandcuffed.sqf | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/addons/captives/functions/fnc_setHandcuffed.sqf b/addons/captives/functions/fnc_setHandcuffed.sqf index cec1a007e7..0deb68dc8b 100644 --- a/addons/captives/functions/fnc_setHandcuffed.sqf +++ b/addons/captives/functions/fnc_setHandcuffed.sqf @@ -58,13 +58,19 @@ if (_state) then { [_unit, "ACE_AmovPercMstpScapWnonDnon", 1] call EFUNC(common,doAnimation); }; }]; - _unit setVariable [QGVAR(surrenderAnimEHID), _animChangedEHID]; + _unit setVariable [QGVAR(handcuffAnimEHID), _animChangedEHID]; }; }, [_unit], 0.01, 0] call EFUNC(common,waitAndExecute); } else { _unit setVariable [QGVAR(isHandcuffed), false, true]; [_unit, QGVAR(Handcuffed), false] call EFUNC(common,setCaptivityStatus); + + //remove AnimChanged EH + _animChangedEHID = _unit getVariable [QGVAR(handcuffAnimEHID), -1]; + _unit removeEventHandler ["AnimChanged", _animChangedEHID]; + _unit setVariable [QGVAR(handcuffAnimEHID), -1]; + if ((vehicle _unit) == _unit) then { //Break out of hands up animation loop (doAnimation handles Unconscious prioity) [_unit, "ACE_AmovPercMstpScapWnonDnon_AmovPercMstpSnonWnonDnon", 2] call EFUNC(common,doAnimation); From ae61dff44e3474a6a6e050e64185dcf15d3c167e Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Thu, 19 Feb 2015 14:29:38 -0600 Subject: [PATCH 13/27] Move draw to function (wip) --- .../functions/fnc_canStopEscorting.sqf | 16 +--- addons/nametags/XEH_postInit.sqf | 67 +--------------- addons/nametags/XEH_preInit.sqf | 1 + addons/nametags/config.cpp | 5 +- .../functions/fnc_drawNameTagIcon.sqf | 2 +- .../nametags/functions/fnc_initIsSpeaking.sqf | 1 - addons/nametags/functions/fnc_onDraw3d.sqf | 77 +++++++++++++++++++ 7 files changed, 85 insertions(+), 84 deletions(-) create mode 100644 addons/nametags/functions/fnc_onDraw3d.sqf diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index e6a5a0e568..1767ea6ed0 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])} diff --git a/addons/nametags/XEH_postInit.sqf b/addons/nametags/XEH_postInit.sqf index 0837ce3e88..1ad0e38879 100644 --- a/addons/nametags/XEH_postInit.sqf +++ b/addons/nametags/XEH_postInit.sqf @@ -27,69 +27,4 @@ if (!hasInterface) exitWith {}; // Draw handle -addMissionEventHandler ["Draw3D", { - if (GVAR(showPlayerNames) == 0) exitWith {}; - - _player = ACE_player; - - //When cursorTarget is on a vehicle show the nametag for the commander. - //If set to "Only On Keypress" settings, fade just like main tags - if (GVAR(showCursorTagForVehicles)) then { - _target = cursorTarget; - if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { - _target = effectiveCommander _target; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - }; - }; - - if (GVAR(showPlayerNames) in [2,4]) then { - //"Only Cursor" mode, only show nametags for humans - _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "CAManBase"} && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - _distance = _player distance _target; - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) == 4)) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } else { - _pos = positionCameraToWorld [0, 0, 0]; - _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; - - if (!surfaceIsWater _pos) then { - _pos = ATLtoASL _pos; - }; - _pos2 = positionCameraToWorld [0, 0, 1]; - if (!surfaceIsWater _pos2) then { - _pos2 = ATLtoASL _pos2; - }; - _vecy = _pos2 vectorDiff _pos; - - { - _target = _x; - - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { - if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight - _relPos = (visiblePositionASL _target) vectorDiff _pos; - _distance = vectorMagnitude _relPos; - _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); - - _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - - if (GVAR(showPlayerNames) == 3) then { //only on keypress - _alpha = _alpha min (2 + (GVAR(ShowNamesTime) - time)); - }; - - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); - }; - } forEach _targets; - }; -}]; +addMissionEventHandler ["Draw3D", {_this call FUNC(onDraw3d);}]; diff --git a/addons/nametags/XEH_preInit.sqf b/addons/nametags/XEH_preInit.sqf index b56841c2aa..80c06cff1f 100644 --- a/addons/nametags/XEH_preInit.sqf +++ b/addons/nametags/XEH_preInit.sqf @@ -8,6 +8,7 @@ PREP(drawNameTagIcon); PREP(getVehicleData); PREP(initIsSpeaking); PREP(moduleNameTags); +PREP(onDraw3d); PREP(onMouseZChanged); PREP(setText); diff --git a/addons/nametags/config.cpp b/addons/nametags/config.cpp index d17c156b78..25992c0174 100644 --- a/addons/nametags/config.cpp +++ b/addons/nametags/config.cpp @@ -53,10 +53,11 @@ class ACE_Settings { isClientSetable = 0; }; class GVAR(showSoundWaves) { - value = 0; - typeName = "BOOL"; + value = 1; + typeName = "SCALAR"; isClientSetable = 1; displayName = "$STR_ACE_NameTags_ShowSoundWaves"; + values[] = {"Disabled", "Use Nametag settings", "Always Show All"}; }; class GVAR(PlayerNamesViewDistance) { value = 5; diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index ca2ed39c5e..d991baf433 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -25,7 +25,7 @@ "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ ] -private ["_player", "_target", "_alpha", "_heightOffset", "_height", "_position", "_color", "_name", "_rank", "_size"]; +private ["_height", "_position", "_color", "_name", "_rank", "_size"]; PARAMS_4(_player,_target,_alpha,_heightOffset); diff --git a/addons/nametags/functions/fnc_initIsSpeaking.sqf b/addons/nametags/functions/fnc_initIsSpeaking.sqf index 7d632e51dd..b7dc920fa2 100644 --- a/addons/nametags/functions/fnc_initIsSpeaking.sqf +++ b/addons/nametags/functions/fnc_initIsSpeaking.sqf @@ -45,7 +45,6 @@ case (isClass (configFile >> "cfgPatches" >> "acre_api")): { _newSetting = ([ACE_player] call ACRE_api_fnc_isBroadcasting) || {!(isNull findDisplay 55)}; if (!(_oldSetting isEqualTo _newSetting)) then { ACE_player setVariable [QGVAR(isSpeaking), _newSetting, true]; - // ["IsTalking??", [ACE_player, _newSetting]] call localEvent //any use in ACE for a "speaking event"? }; }; }; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf new file mode 100644 index 0000000000..49b4177dda --- /dev/null +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -0,0 +1,77 @@ +#include "script_component.hpp" + +_player = ACE_player; + +//don't show nametags in spectator +if (!alive _player) exitWith {}; + +_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 + +//If set to only show on keypress and nothing would be visable, exit +if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{}; + + +//When cursorTarget is on a vehicle show the nametag for the commander. +//If set to "Only On Keypress" settings, fade just like main tags +if (GVAR(showCursorTagForVehicles)) then { + _target = cursorTarget; + if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { + _target = effectiveCommander _target; + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + }; +}; + +//"Only Cursor" mode, only show nametags for humans +if (GVAR(showPlayerNames) in [2,4]) then { + _target = cursorTarget; + if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _distance = _player distance _target; + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); + if ((GVAR(showPlayerNames) == 4)) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; +}; + + +if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { + _pos = positionCameraToWorld [0, 0, 0]; + _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; + + if (!surfaceIsWater _pos) then { + _pos = ATLtoASL _pos; + }; + _pos2 = positionCameraToWorld [0, 0, 1]; + if (!surfaceIsWater _pos2) then { + _pos2 = ATLtoASL _pos2; + }; + _vecy = _pos2 vectorDiff _pos; + + { + _target = _x; + + if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight + _relPos = (visiblePositionASL _target) vectorDiff _pos; + _distance = vectorMagnitude _relPos; + _projDist = _relPos vectorDistance (_vecy vectorMultiply (_relPos vectorDotProduct _vecy)); + + _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); + + if (GVAR(showPlayerNames) == 3) then { //only on keypress + _alpha = _alpha min _onKeyPressAlphaMax; + }; + + [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + }; + } forEach _targets; +}; + From 3ade628d87430f180fc32123c0dc991dcd9872cd Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Thu, 19 Feb 2015 16:42:28 -0600 Subject: [PATCH 14/27] Handle 3 Soundwave options --- .../functions/fnc_canStopEscorting.sqf | 2 +- .../functions/fnc_drawNameTagIcon.sqf | 53 +++++++------ addons/nametags/functions/fnc_onDraw3d.sqf | 75 +++++++++++++------ addons/nametags/script_component.hpp | 8 +- 4 files changed, 92 insertions(+), 46 deletions(-) diff --git a/addons/captives/functions/fnc_canStopEscorting.sqf b/addons/captives/functions/fnc_canStopEscorting.sqf index 1767ea6ed0..56065a43fc 100644 --- a/addons/captives/functions/fnc_canStopEscorting.sqf +++ b/addons/captives/functions/fnc_canStopEscorting.sqf @@ -25,4 +25,4 @@ if (isNull _target) then { if (isNull _target) exitWith {false}; -(_target in (attachedObjects _unit)) && {!(_target getVariable [QGVAR(isHandcuffed), false])} +(_target in (attachedObjects _unit)) && {_target getVariable [QGVAR(isHandcuffed), false]} diff --git a/addons/nametags/functions/fnc_drawNameTagIcon.sqf b/addons/nametags/functions/fnc_drawNameTagIcon.sqf index d991baf433..8ccbfc9b4a 100644 --- a/addons/nametags/functions/fnc_drawNameTagIcon.sqf +++ b/addons/nametags/functions/fnc_drawNameTagIcon.sqf @@ -4,9 +4,11 @@ * Draw the nametag and rank icon. * * Argument: - * 0: Unit (Array) - * 1: alpha (Number) - * 2: Height offset (Number) + * 0: Unit (Player) <OBJECT> + * 1: Target <OBJECT> + * 2: alpha (Number) + * 4: Height offset (Number) + * 5: Draw Type <NUMBER> * * Return value: * None. @@ -23,30 +25,38 @@ "\A3\Ui_f\data\GUI\Cfg\Ranks\captain_gs.paa", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\major_gs.paa", \ "\A3\Ui_f\data\GUI\Cfg\Ranks\colonel_gs.paa" \ -] + ] private ["_height", "_position", "_color", "_name", "_rank", "_size"]; -PARAMS_4(_player,_target,_alpha,_heightOffset); +PARAMS_5(_player,_target,_alpha,_heightOffset,_iconType); -_name = [_target, true] call EFUNC(common,getName); +if (_alpha < 0) exitWith {}; //Don't waste time if not visable +if (_iconType == ICON_NONE) exitWith {}; //Don't waste time if not visable + +//Set Text: +_name = if (_iconType in [ICON_NAME, ICON_NAME_RANK, ICON_NAME_SPEAK]) then { + [_target, true] call EFUNC(common,getName) +} else { + "" +}; + +//Set Icon: _icon = ""; _size = 0; - -if (GVAR(showSoundWaves) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { +if ((_iconType == ICON_NAME_SPEAK) || (_iconType == ICON_SPEAK)) then { _icon = QUOTE(PATHTOF(UI\soundwave)) + str (floor (random 10)) + ".paa"; _size = 0.75; _alpha = _alpha + 0.6;//Boost alpha when speaking } else { - if (GVAR(showPlayerRanks)) then { + if (_iconType == ICON_NAME_RANK) then { _icon = TEXTURES_RANKS select ((["PRIVATE", "CORPORAL", "SERGEANT", "LIEUTENANT", "CAPTAIN", "MAJOR", "COLONEL"] find (rank _target)) + 1); _size = 0.75; }; }; -if (_alpha < 0) exitWith {}; //Don't waste time if not visable - +//Set Color: if !(group _target == group _player) then { _color = +GVAR(defaultNametagColor); //Make a copy, then multiply both alpha values (allows client to decrease alpha in settings) _color set [3, (_color select 3) * _alpha]; @@ -55,19 +65,18 @@ if !(group _target == group _player) then { }; _height = [2, 1.5, 1, 1.5, 1] select (["STAND", "CROUCH", "PRONE", "UNDEFINED", ""] find (stance _target)); - // Convert position to ASLW (expected by drawIcon3D) and add height offsets _position = _target modelToWorldVisual [0, 0, (_height + _heightOffset)]; drawIcon3D [ - _icon, - _color, - _position, - _size, - _size, - 0, - _name, - 2, - 0.033, - "PuristaMedium" +_icon, +_color, +_position, +_size, +_size, +0, +_name, +2, +0.033, +"PuristaMedium" ]; diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 49b4177dda..127afb8561 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -5,44 +5,61 @@ _player = ACE_player; //don't show nametags in spectator if (!alive _player) exitWith {}; -_onKeyPressAlphaMax = 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 - -//If set to only show on keypress and nothing would be visable, exit -if ((GVAR(showPlayerNames) in [3,4]) && {GVAR(showSoundWaves) < 2} && {(2 + (GVAR(ShowNamesTime) - time)) < 0}) exitWith{}; +_onKeyPressAlphaMax = if ((GVAR(showPlayerNames) in [3,4])) then { + 2 + (GVAR(ShowNamesTime) - time); //after release 1 second of full opacity, 1 second of fading to 0 +} else { + 1 +}; +_defaultIcon = if (GVAR(showPlayerRanks)) then { + ICON_NAME_RANK; +} else { + ICON_NAME; +}; //When cursorTarget is on a vehicle show the nametag for the commander. //If set to "Only On Keypress" settings, fade just like main tags -if (GVAR(showCursorTagForVehicles)) then { +if (GVAR(showCursorTagForVehicles) && {_onKeyPressAlphaMax > 0}) then { _target = cursorTarget; if ((!(_target isKindOf "CAManBase")) && {!(_target in allUnitsUAV)}) then { _target = effectiveCommander _target; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) in [3,4])) then { //only on keypress - _alpha = _alpha min _onKeyPressAlphaMax; - }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + _alpha = _alpha min _onKeyPressAlphaMax; + [_player, _target, _alpha, _distance * 0.026, _defaultIcon] call FUNC(drawNameTagIcon); }; }; }; -//"Only Cursor" mode, only show nametags for humans -if (GVAR(showPlayerNames) in [2,4]) then { +//"Only Cursor" mode, only show nametags for humans on cursorTarget +if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { _target = cursorTarget; - if ((!isNull _target) && {_target isKindOf "CAManBase"} && {(side (group _target)) == (side (group _player))} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + if ((!isNull _target) && + {_target isKindOf "CAManBase"} && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { _distance = _player distance _target; _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min 1) * GVAR(PlayerNamesMaxAlpha); - if ((GVAR(showPlayerNames) == 4)) then { //only on keypress - _alpha = _alpha min _onKeyPressAlphaMax; + _alpha = _alpha min _onKeyPressAlphaMax; + _icon = ICON_NONE; + if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; + } else { + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + + [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; }; - -if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { +if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(showSoundWaves) == 2}) then { _pos = positionCameraToWorld [0, 0, 0]; _targets = _pos nearObjects ["CAManBase", GVAR(PlayerNamesViewDistance) + 5]; @@ -58,7 +75,20 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { { _target = _x; - if ((!isNull _target) && {side group _target == playerSide} && {_target != _player} && {isPlayer _target || {GVAR(ShowNamesForAI)}} && {!(_target getVariable ["ACE_hideName", false])}) then { + _icon = ICON_NONE; + if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then { + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; + } else { + //showSoundWaves must be 2, only draw speak icon + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; + }; + + if ((_icon != ICON_NONE) && + {(side (group _target)) == (side (group _player))} && + {_target != _player} && + {GVAR(ShowNamesForAI) || {[_target] call EFUNC(common,isPlayer)}} && + {!(_target getVariable ["ACE_hideName", false])}) then { + if (lineIntersects [_pos, (visiblePositionASL _target) vectorAdd [0,0,1], vehicle _player, _target]) exitWith {}; // Check if there is line of sight _relPos = (visiblePositionASL _target) vectorDiff _pos; _distance = vectorMagnitude _relPos; @@ -66,12 +96,13 @@ if ((GVAR(showPlayerNames) in [1,3]) || {GVAR(showSoundWaves) == 2}) then { _alpha = ((1 - 0.2 * (_distance - GVAR(PlayerNamesViewDistance))) min (1 - 0.15 * (_projDist * 5 - _distance - 3)) min 1) * GVAR(PlayerNamesMaxAlpha); - if (GVAR(showPlayerNames) == 3) then { //only on keypress + if ((GVAR(showSoundWaves) == 2) && {(_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}}) then { + _alpha = 1; + } else { _alpha = _alpha min _onKeyPressAlphaMax; }; - [_player, _target, _alpha, _distance * 0.026] call FUNC(drawNameTagIcon); + [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); }; } forEach _targets; }; - diff --git a/addons/nametags/script_component.hpp b/addons/nametags/script_component.hpp index 6cffb95618..e80768a723 100644 --- a/addons/nametags/script_component.hpp +++ b/addons/nametags/script_component.hpp @@ -9,4 +9,10 @@ #define DEBUG_SETTINGS DEBUG_SETTINGS_NAMETAGS #endif -#include "\z\ace\addons\main\script_macros.hpp" \ No newline at end of file +#include "\z\ace\addons\main\script_macros.hpp" + +#define ICON_NONE 0 +#define ICON_NAME 1 +#define ICON_NAME_RANK 2 +#define ICON_NAME_SPEAK 3 +#define ICON_SPEAK 4 From 3511a74ef95a73ea2f1f61fe1f8861660d5c2036 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Thu, 19 Feb 2015 16:59:21 -0600 Subject: [PATCH 15/27] Don't show sound if not enabled --- addons/nametags/functions/fnc_onDraw3d.sqf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/nametags/functions/fnc_onDraw3d.sqf b/addons/nametags/functions/fnc_onDraw3d.sqf index 127afb8561..8aa503d377 100644 --- a/addons/nametags/functions/fnc_onDraw3d.sqf +++ b/addons/nametags/functions/fnc_onDraw3d.sqf @@ -52,7 +52,7 @@ if ((GVAR(showPlayerNames) in [2,4]) && {_onKeyPressAlphaMax > 0}) then { if (GVAR(showSoundWaves) == 2) then { //icon will be drawn below, so only show name here _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME} else {_defaultIcon}; } else { - _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {ICON_NAME_SPEAK} else {_defaultIcon}; + _icon = if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {ICON_NAME_SPEAK} else {_defaultIcon}; }; [_player, _target, _alpha, _distance * 0.026, _icon] call FUNC(drawNameTagIcon); @@ -77,7 +77,7 @@ if (((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) || {GVAR(sho _icon = ICON_NONE; if ((GVAR(showPlayerNames) in [1,3]) && {_onKeyPressAlphaMax > 0}) then { - if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; + if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target} && {GVAR(showSoundWaves) > 0}) then {_icon = ICON_NAME_SPEAK;} else {_icon = _defaultIcon}; } else { //showSoundWaves must be 2, only draw speak icon if ((_target getVariable [QGVAR(isSpeaking), false]) && {(vehicle _target) == _target}) then {_icon = ICON_SPEAK;}; From 6fde2de40f4b7d08eefa5b2aaa6cc851e582b482 Mon Sep 17 00:00:00 2001 From: Glowbal <thomasskooi@live.nl> Date: Tue, 24 Feb 2015 17:14:19 +0100 Subject: [PATCH 16/27] Improved localization support and sendDisplayText to remote client objects. --- .../functions/fnc_displayTextPicture.sqf | 19 ++++++++++++++++-- .../functions/fnc_displayTextStructured.sqf | 20 +++++++++++++++---- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 8472b3d1b6..6216adb20e 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -14,14 +14,29 @@ #include "script_component.hpp" -private ["_text", "_image", "_imageColor"]; +private ["_text", "_image", "_imageColor", "_target"]; _text = _this select 0; _image = _this select 1; _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; _imageColor resize 3; +_target = if (count _this > 3) then {_this select 3} else {ACE_player}; + +if (!local _target && {_target != ACE_player}) exitwith { + [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); +}; if (typeName _text != "TEXT") then { - if (typeName _text == "STRING" && {isLocalized _text}) then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; + if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; _text = parseText format ["<t align='center'>%1</t>", _text]; diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 054e98de70..be3e4b585b 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -13,14 +13,26 @@ #include "script_component.hpp" -private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position"]; - +private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"]; _text = _this select 0; -_size = _this select 1; +_size = if (count _this > 1) then {_this select 1} else {0.1;}; +_target = if (count _this > 2) then {_this select 2} else {ACE_player}; -if (isNil "_size") then {_size = 1.5}; +if (!local _target && {_target != ACE_player}) exitwith { + [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); +}; if (typeName _text != "TEXT") then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; From 85c568a061c4d9ac215fd4d2b2457f8b229dda7b Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Tue, 24 Feb 2015 10:27:53 -0600 Subject: [PATCH 17/27] Comments --- addons/captives/functions/fnc_handleZeusDisplayChanged.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf index 2299fa7031..84b90e78c2 100644 --- a/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf +++ b/addons/captives/functions/fnc_handleZeusDisplayChanged.sqf @@ -1,6 +1,6 @@ /* * Author: PabstMirror - * Handles handles ZeusDisplayChanged event + * Handles ZeusDisplayChanged event * Need to reset showHUD after closing zeus * * Arguments: From 278f0ab889cb3e5a19f80d67f97f5478ae1213f4 Mon Sep 17 00:00:00 2001 From: Glowbal <thomasskooi@live.nl> Date: Tue, 24 Feb 2015 18:02:41 +0100 Subject: [PATCH 18/27] Fixed indentation Added check for AI units --- .../functions/fnc_displayTextPicture.sqf | 27 ++++++++++--------- .../functions/fnc_displayTextStructured.sqf | 23 ++++++++-------- 2 files changed, 26 insertions(+), 24 deletions(-) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 6216adb20e..9885524db7 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -22,24 +22,25 @@ _imageColor resize 3; _target = if (count _this > 3) then {_this select 3} else {ACE_player}; if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); + [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); }; +if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { - if (typeName _text == "ARRAY") then { - if (count _text > 0) then { - { - if (typeName _x == "STRING" && {isLocalized _x}) then { - _text set [_foreachIndex, localize _x]; - }; - }foreach _text; - _text = format _text; - }; - }; - if (typeName _text == "STRING" && {isLocalized _text}) then { + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; + if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; - _text = parseText format ["<t align='center'>%1</t>", _text]; + _text = parseText format ["<t align='center'>%1</t>", _text]; }; _text = composeText [parseText format ["<img size='2' align='center' color='%2' image='%1'/>", _image, _imageColor call BIS_fnc_colorRGBtoHTML], lineBreak, _text]; [_text, 2] call FUNC(displayTextStructured); diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index be3e4b585b..90f066057b 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -19,20 +19,21 @@ _size = if (count _this > 1) then {_this select 1} else {0.1;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); + [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); }; +if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { - if (typeName _text == "ARRAY") then { - if (count _text > 0) then { - { - if (typeName _x == "STRING" && {isLocalized _x}) then { - _text set [_foreachIndex, localize _x]; - }; - }foreach _text; - _text = format _text; - }; - }; + if (typeName _text == "ARRAY") then { + if (count _text > 0) then { + { + if (typeName _x == "STRING" && {isLocalized _x}) then { + _text set [_foreachIndex, localize _x]; + }; + }foreach _text; + _text = format _text; + }; + }; if (typeName _text == "STRING" && {isLocalized _text}) then { _text = localize _text; }; From 37031b5002ec9b0630ceb1bcd757f8adf7698b8d Mon Sep 17 00:00:00 2001 From: Glowbal <thomasskooi@live.nl> Date: Tue, 24 Feb 2015 18:10:40 +0100 Subject: [PATCH 19/27] Replaced execRemoteFnc by ACE event system --- addons/common/XEH_postInit.sqf | 3 +++ addons/common/functions/fnc_displayTextPicture.sqf | 3 --- addons/common/functions/fnc_displayTextStructured.sqf | 3 --- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/addons/common/XEH_postInit.sqf b/addons/common/XEH_postInit.sqf index dbb665d446..35b0f5c3fe 100644 --- a/addons/common/XEH_postInit.sqf +++ b/addons/common/XEH_postInit.sqf @@ -158,3 +158,6 @@ GVAR(OldPlayerTurret) = [ACE_player] call FUNC(getTurretIndex); PARAMS_2(_vehicle,_fuelLevel); _vehicle setFuel _fuelLevel; }] call FUNC(addEventhandler); + +["displayTextStructured", FUNC(displayTextStructured)] call FUNC(addEventhandler); +["displayTextPicture", FUNC(displayTextPicture)] call FUNC(addEventhandler); diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index 9885524db7..a2c6ec51e1 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -21,9 +21,6 @@ _imageColor = if (count _this > 2) then {_this select 2} else {[1,1,1]}; _imageColor resize 3; _target = if (count _this > 3) then {_this select 3} else {ACE_player}; -if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextPicture)), _target] call FUNC(execRemoteFnc); -}; if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 90f066057b..3953f218d0 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -18,9 +18,6 @@ _text = _this select 0; _size = if (count _this > 1) then {_this select 1} else {0.1;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; -if (!local _target && {_target != ACE_player}) exitwith { - [_this, QUOTE(DFUNC(displayTextStructured)), _target] call FUNC(execRemoteFnc); -}; if (_target != ACE_player) exitWith {}; if (typeName _text != "TEXT") then { From 5364980997d49662a57126c17f002d8e590f5b58 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Tue, 24 Feb 2015 11:36:49 -0600 Subject: [PATCH 20/27] Zeus Module Hints --- .../functions/fnc_moduleSurrender.sqf | 21 ++++++++++--------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 9311c7a1b9..07e7c1b9ad 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -27,24 +27,25 @@ if (local _logic) then { if ((count _bisMouseOver) == 2) then {//check what mouse was over before the module was placed _mouseOverObject = _bisMouseOver select 1; if ((_mouseOverObject isKindOf "CAManBase") && {(vehicle _mouseOverObject) == _mouseOverObject}) then { - systemChat format ["Debug - module surrendering %1", (name _mouseOverObject)]; - - if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + TRACE_2("Debug - module surrendering %1",_mouseOverObject,(name _mouseOverObject)); + if (alive _mouseOverObject) then { + if (!(_mouseOverObject getVariable [QGVAR(isSurrendering), false])) then { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, true]] call EFUNC(common,targetEvent); + } else { + ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + }; } else { - ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); + ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured); }; - } else { - systemChat format ["Only use on dismounted inf"]; + ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured); }; } else { - systemChat format ["Nothing under mouse"]; + ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); }; } else {//an editor module { - systemChat format ["Debug - module surrendering %1", (name _x)]; - [_x, true] call FUNC(setSurrendered); + ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); } forEach _units; }; From ae3de331c465b5a3590c5b226ec80c82db6f6dff Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Tue, 24 Feb 2015 11:51:37 -0600 Subject: [PATCH 21/27] Module At Mission Start (Issue #148) --- addons/captives/functions/fnc_moduleSurrender.sqf | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 07e7c1b9ad..1c10779220 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -43,10 +43,15 @@ if (local _logic) then { } else { ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); }; - } else {//an editor module - { - ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); - } forEach _units; + } else { + //an editor module + //Modules run before postInit can instal the event handler, so we need to wait a little bit + [{ + PARAMS_1(_units); + { + ["SetSurrendered", [_x], [_x, true]] call EFUNC(common,targetEvent); + } forEach _units; + }, [_units], 0.05, 0.05]call EFUNC(common,waitAndExecute); }; deleteVehicle _logic; From 97d18899716f31d709bd44c72525785cd9a1bb5a Mon Sep 17 00:00:00 2001 From: PabstMirror <pabstmirror@gmail.com> Date: Tue, 24 Feb 2015 12:40:22 -0600 Subject: [PATCH 22/27] Shift Display to Right if Zeus Interface is open --- addons/common/functions/fnc_displayTextStructured.sqf | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 3953f218d0..6e8851a099 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -58,6 +58,12 @@ _xPos = ((safezoneX + safezoneW) - (10 *(((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)); + +//Zeus Interface Open and Display would be under the "CREATE" list +if (!isnull curatorCamera) then { + _xPos = _xPos min ((safezoneX + safezoneW - 12.5 * (((safezoneW / safezoneH) min 1.2) / 40)) - _wPos); +}; + _position = [_xPos, _yPos, _wPos, _size * _hPos]; _ctrlHint ctrlSetPosition _position; From 80ac6d83deba2fd2d8327f7e7191665b326890e7 Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Tue, 24 Feb 2015 12:44:54 -0600 Subject: [PATCH 23/27] Zeus Module Messages --- addons/captives/functions/fnc_moduleSurrender.sqf | 6 +++--- addons/captives/stringtable.xml | 11 ++++++++++- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/addons/captives/functions/fnc_moduleSurrender.sqf b/addons/captives/functions/fnc_moduleSurrender.sqf index 1c10779220..1a335131a8 100644 --- a/addons/captives/functions/fnc_moduleSurrender.sqf +++ b/addons/captives/functions/fnc_moduleSurrender.sqf @@ -35,13 +35,13 @@ if (local _logic) then { ["SetSurrendered", [_mouseOverObject], [_mouseOverObject, false]] call EFUNC(common,targetEvent); }; } else { - ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_OnlyAlive"] call EFUNC(common,displayTextStructured); }; } else { - ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_OnlyInfentry"] call EFUNC(common,displayTextStructured); }; } else { - ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(commmon,displayTextStructured); + ["STR_ACE_Captives_Zeus_NothingSelected"] call EFUNC(common,displayTextStructured); }; } else { //an editor module diff --git a/addons/captives/stringtable.xml b/addons/captives/stringtable.xml index 7d8096b3e6..f03f30a113 100644 --- a/addons/captives/stringtable.xml +++ b/addons/captives/stringtable.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="utf-8"?> -<!-- Edited with tabler - 2015-02-06 --> +<!-- Edited with tabler - 2015-02-24 --> <Project name="ACE"> <Package name="Captives"> <Key ID="STR_ACE_Captives_SetCaptive"> @@ -136,5 +136,14 @@ <Key ID="STR_ACE_Captives_StopSurrendering"> <English>Stop Surrendering</English> </Key> + <Key ID="STR_ACE_Captives_Zeus_OnlyAlive"> + <English>Only use on alive units</English> + </Key> + <Key ID="STR_ACE_Captives_Zeus_OnlyInfentry"> + <English>Only use on dismounted inf</English> + </Key> + <Key ID="STR_ACE_Captives_Zeus_NothingSelected"> + <English>Nothing under mouse</English> + </Key> </Package> </Project> \ No newline at end of file From e10c907454f12750a8a223653dd17c972f095e7c Mon Sep 17 00:00:00 2001 From: Glowbal <thomasskooi@live.nl> Date: Tue, 24 Feb 2015 20:25:34 +0100 Subject: [PATCH 24/27] Added missing header arguments --- addons/common/functions/fnc_displayTextPicture.sqf | 1 + addons/common/functions/fnc_displayTextStructured.sqf | 1 + 2 files changed, 2 insertions(+) diff --git a/addons/common/functions/fnc_displayTextPicture.sqf b/addons/common/functions/fnc_displayTextPicture.sqf index a2c6ec51e1..fadf28b480 100644 --- a/addons/common/functions/fnc_displayTextPicture.sqf +++ b/addons/common/functions/fnc_displayTextPicture.sqf @@ -7,6 +7,7 @@ * 0: Text <ANY> * 1: Image <STRING> * 2: Image color <ARRAY> <OPTIONAL> + * 3: Target Unit. Will only display if target is the player controlled object <OBJECT> <OPTIONAL> * * Return value: * Nothing diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 3953f218d0..f1761c39a7 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -6,6 +6,7 @@ * Argument: * 0: Text <ANY> * 1: Size of the textbox <NUMBER> <OPTIONAL> + * 2: Target Unit. Will only display if target is the player controlled object <OBJECT> <OPTIONAL> * * Return value: * Nothing From 5b50910ef64df20dff80d75474ae688e6e1e4cb6 Mon Sep 17 00:00:00 2001 From: Glowbal <thomasskooi@live.nl> Date: Wed, 25 Feb 2015 11:23:35 +0100 Subject: [PATCH 25/27] Fixed incorrect size --- addons/common/functions/fnc_displayTextStructured.sqf | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_displayTextStructured.sqf b/addons/common/functions/fnc_displayTextStructured.sqf index 1bbb89052e..cfe2feb3cb 100644 --- a/addons/common/functions/fnc_displayTextStructured.sqf +++ b/addons/common/functions/fnc_displayTextStructured.sqf @@ -16,7 +16,7 @@ private ["_text", "_size", "_isShown", "_ctrlHint", "_yPos", "_xPos", "_wPos", "_hPos", "_position", "_target"]; _text = _this select 0; -_size = if (count _this > 1) then {_this select 1} else {0.1;}; +_size = if (count _this > 1) then {_this select 1} else {1.5;}; _target = if (count _this > 2) then {_this select 2} else {ACE_player}; if (_target != ACE_player) exitWith {}; From bf21a8bc917015dd1a650defdd132d4cbd165a6f Mon Sep 17 00:00:00 2001 From: PabstMirror <elephantisaterriblemascot@gmail.com> Date: Fri, 27 Feb 2015 15:28:48 -0600 Subject: [PATCH 26/27] Pull configSetting from upstream --- addons/common/functions/fnc_setSettingFromConfig.sqf | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/addons/common/functions/fnc_setSettingFromConfig.sqf b/addons/common/functions/fnc_setSettingFromConfig.sqf index e68157bfdb..27c727acab 100644 --- a/addons/common/functions/fnc_setSettingFromConfig.sqf +++ b/addons/common/functions/fnc_setSettingFromConfig.sqf @@ -16,7 +16,9 @@ EXPLODE_1_PVT(_this,_optionEntry); _fnc_getValueWithType = { EXPLODE_2_PVT(_this,_optionEntry,_typeName); - _value = if (isNumber (_optionEntry >> "value")) then {getNumber (_optionEntry >> "value")} else {0}; //getNumber on an array throws a warning + + _valueConfig = (_optionEntry >> "value"); + _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 114718e8ae226a9f2350b9429646dbf86251228c Mon Sep 17 00:00:00 2001 From: KoffeinFlummi <koffeinflummi@gmail.com> Date: Sat, 28 Feb 2015 15:22:21 +0100 Subject: [PATCH 27/27] Fix line ending in .editorconf --- .editorconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.editorconfig b/.editorconfig index f6f23b8d1b..0deca3d2ab 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,7 +1,7 @@ root = true [*] -end_of_line = lf +end_of_line = crlf insert_final_newline = true charset = utf-8 indent_style = space