From d7ee4f04694003800c66e0bfcd31a18190e2b273 Mon Sep 17 00:00:00 2001 From: Fara <44729057+Faramour@users.noreply.github.com> Date: Thu, 14 Mar 2024 22:59:49 +0100 Subject: [PATCH 01/12] Implement leader feature --- AMBuilder | 1 + CS2Fixes.vcxproj | 2 + CS2Fixes.vcxproj.filters | 6 + PackageScript | 9 +- .../cs2fixes/leader_defend_mark.vtex_c | Bin 0 -> 89444 bytes assets/particles/cs2fixes/admin_beacon.vpcf_c | Bin 2679 -> 0 bytes .../cs2fixes/admin_beacon_inner.vpcf_c | Bin 2920 -> 0 bytes .../cs2fixes/leader_defend_mark.vpcf_c | Bin 0 -> 3328 bytes .../cs2fixes/leader_defend_mark_ground.vpcf_c | Bin 0 -> 3071 bytes .../particles/cs2fixes/leader_tracer.vpcf_c | Bin 0 -> 2853 bytes .../particles/cs2fixes/player_beacon.vpcf_c | Bin 0 -> 3204 bytes .../cs2fixes/player_beacon_tint.vpcf_c | Bin 0 -> 3090 bytes .../materials/cs2fixes/leader_defend_mark.png | Bin 0 -> 13768 bytes .../cs2fixes/leader_defend_mark.vtex | 46 + .../cs2fixes/leader_defend_mark.vpcf | 1018 +++++++++++++++++ .../cs2fixes/leader_defend_mark_ground.vpcf | 999 ++++++++++++++++ .../particles/cs2fixes/leader_tracer.vpcf | 681 +++++++++++ ...n_beacon_inner.vpcf => player_beacon.vpcf} | 284 ++--- ...in_beacon.vpcf => player_beacon_tint.vpcf} | 324 ++++-- cfg/cs2fixes/cs2fixes.cfg | 11 +- src/adminsystem.cpp | 148 --- src/adminsystem.h | 4 +- src/cs2_sdk/entity/cbaseentity.h | 21 + src/cs2_sdk/entity/cbasemodelentity.h | 1 + src/cs2_sdk/entity/globaltypes.h | 2 + src/cs2fixes.cpp | 11 +- src/events.cpp | 11 + src/gamesystem.cpp | 6 +- src/leader.cpp | 955 ++++++++++++++++ src/leader.h | 44 + src/playermanager.cpp | 131 +++ src/playermanager.h | 25 +- src/zombiereborn.cpp | 52 + src/zombiereborn.h | 2 + 34 files changed, 4440 insertions(+), 354 deletions(-) create mode 100644 assets/materials/cs2fixes/leader_defend_mark.vtex_c delete mode 100644 assets/particles/cs2fixes/admin_beacon.vpcf_c delete mode 100644 assets/particles/cs2fixes/admin_beacon_inner.vpcf_c create mode 100644 assets/particles/cs2fixes/leader_defend_mark.vpcf_c create mode 100644 assets/particles/cs2fixes/leader_defend_mark_ground.vpcf_c create mode 100644 assets/particles/cs2fixes/leader_tracer.vpcf_c create mode 100644 assets/particles/cs2fixes/player_beacon.vpcf_c create mode 100644 assets/particles/cs2fixes/player_beacon_tint.vpcf_c create mode 100644 assets_source/materials/cs2fixes/leader_defend_mark.png create mode 100644 assets_source/materials/cs2fixes/leader_defend_mark.vtex create mode 100644 assets_source/particles/cs2fixes/leader_defend_mark.vpcf create mode 100644 assets_source/particles/cs2fixes/leader_defend_mark_ground.vpcf create mode 100644 assets_source/particles/cs2fixes/leader_tracer.vpcf rename assets_source/particles/cs2fixes/{admin_beacon_inner.vpcf => player_beacon.vpcf} (96%) rename assets_source/particles/cs2fixes/{admin_beacon.vpcf => player_beacon_tint.vpcf} (65%) create mode 100644 src/leader.cpp create mode 100644 src/leader.h diff --git a/AMBuilder b/AMBuilder index 8e8ca0e33..857122cb1 100644 --- a/AMBuilder +++ b/AMBuilder @@ -70,6 +70,7 @@ for sdk_target in MMSPlugin.sdk_targets: 'src/zombiereborn.cpp', 'src/customio.cpp', 'src/entitylistener.cpp', + 'src/leader.cpp', 'sdk/entity2/entitysystem.cpp', 'sdk/entity2/entityidentity.cpp', 'sdk/entity2/entitykeyvalues.cpp', diff --git a/CS2Fixes.vcxproj b/CS2Fixes.vcxproj index 634e59c21..b69fae372 100644 --- a/CS2Fixes.vcxproj +++ b/CS2Fixes.vcxproj @@ -197,6 +197,7 @@ + @@ -249,6 +250,7 @@ + diff --git a/CS2Fixes.vcxproj.filters b/CS2Fixes.vcxproj.filters index ac872f9fe..80c94a03b 100644 --- a/CS2Fixes.vcxproj.filters +++ b/CS2Fixes.vcxproj.filters @@ -113,6 +113,9 @@ Source Files + + Source Files + Source Files\sdk @@ -247,6 +250,9 @@ Header Files + + Header Files + Header Files\cs2_sdk\entity diff --git a/PackageScript b/PackageScript index a00892644..5cd52364b 100644 --- a/PackageScript +++ b/PackageScript @@ -66,6 +66,11 @@ builder.AddCopy(os.path.join('gamedata', 'cs2fixes.games.txt'), gamedata_folder) # Add CS2Fixes-specific compiled asset files particles_cs2f_folder = builder.AddFolder(os.path.join('particles', MMSPlugin.plugin_name)) -builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'admin_beacon.vpcf_c'), particles_cs2f_folder) -builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'admin_beacon_inner.vpcf_c'), particles_cs2f_folder) +materials_cs2f_folder = builder.AddFolder(os.path.join('materials', MMSPlugin.plugin_name)) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'player_beacon.vpcf_c'), particles_cs2f_folder) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'player_beacon_tint.vpcf_c'), particles_cs2f_folder) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'simple_overlay.vpcf_c'), particles_cs2f_folder) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_defend_mark.vpcf_c'), particles_cs2f_folder) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_defend_mark_ground.vpcf_c'), particles_cs2f_folder) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_tracer.vpcf_c'), particles_cs2f_folder) +builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'materials', MMSPlugin.plugin_name, 'leader_defend_mark.vtex_c'), materials_cs2f_folder) diff --git a/assets/materials/cs2fixes/leader_defend_mark.vtex_c b/assets/materials/cs2fixes/leader_defend_mark.vtex_c new file mode 100644 index 0000000000000000000000000000000000000000..a8c5425cf312087812d4744c3d0934f6b03fe47b GIT binary patch literal 89444 zcmeHw3w#q*_WzxkG)?*pw53(Ll443hc`D`MgQkcsL4k^$wrZg%P@qaNwndAI4an|K zR$Wr0h`dEz6@M)1F07B0M)a>B3b_7?DB6^lMNnE=O5eTzb7nGmOtB%fD7te$>EmQ( z?woth`JQ|3xp(eFY6uA-41qs{g`X+6j=L@v{{EdKWL$D;vK{^oSHTy~qPjlq_Q!hl zEc`*e>b9-5-;dd58(GDO$Bb|)S>ZhI1t20wAZZIAWELKfl}%hQM+U){L2&b$P&NFA z)gTLaHr^4gBxlCmIVF~)2g1La{-n3IKM6MwrgxBmjGr-a&ZqrJMDSxIBE&!%)S+-r z82p68j}Cr%z)#Ou5)lzg21k-u(kCjGX!`WRU(xU@A_l&{0=|!6;nC-!v zXnM!SlDi18ntE!8%0LGHffz}|RpZE)eV|G`{KUaeU-)Mx6MeOw^fu^;1}clk%KE*; zL?mcPM1S}haEy8O8aVY@_!$^O>hI3WGR?EhFC3R+$(c7ZXWoq5oC1=UH6>?mc46*A zIk)A`&6$^-mqYTh3v=>wv*#8JnNe`vtlXlUf+2HrvS;SxXU)u+1y^R}W#`{N*fMW6 zTzpqfcK(bxDcOZ{$c%#74`gM}ocX}Kp~O~DIDghGI6g0v)R0@I+yehjpKK}2ePCYp z+z>*diTT!|+=9Y_Fmk7<;E&mP|3ku`AdyLhMTOUp$hRIU%qfB^l4s7$eVl}A8RoI% z{MqyKa^^*ojVamrz$9=u=?~0XSy@?=AIizk&z+ewj?Bp}%!V)elUgoyfhC8G&7GH> zzhLa#2d2Z-9J6NL?3{c{e(t=&aNucN&aCYDa|=mM;S6G$S2&bdW@Q%?l3BS4OpR{N z{G7YyAvw2%O9&sYcM` zEh)sDuTRU#FL;O;^0FexKTM#W!rWQ8Ir(74Tp}SSiIFeJ$?wO6n~3^P`iZ#~{n!VJ z;>ZuT&YSVT%pCol^RwsX7A|<3VYaaPoSE^gu3!-{&dHrSQ_EQ9=g-KwBe&pQW?Onr z_We^piTOG6A_@Bndu#UexjBC&155=s6B1A6&!3)MP>@r2GwD?jMaaucT<*L-ky^HZ zXk)Z$bx2rfm|7hk8Wt8pbebqKBs^S2!u25`8p7N{lEc+%or=7n(P*^c3`4##AM~|Nm@VGH8Eq&0b zrVXUYVR#p=hud$aG5sQ^>o)&z6Wsr)rMu>}|J};OSl`T{^e;{?@0Q-?{!TwR|!@$ewQBo_A>emN*Sb=K234|LOPY($Xbg zy$@z<4M@E1>%8ax{HL1_-Mu$XV|_9sQ{v~7(O{1r`bIhx=#!Z<)VF92)gOKSQqbs?+raLREH=};oNN2!8@3#(sDAX_$hFN)V~!8LJ4N-ug1x2*pXzkG zup-0sjaqEE0brCC~zX@@7cNB4RAi(UtS-3l+@G}(*}%B_|-aHi^{}qBx*wGVjX{<-3t8o zWP0crO5ykxt(G}M?8iRa*GehWza==B1O8qS+5`2UgaOMp5-cpi_$M_r_0>9V`AUO{H5`Ec1>AWC{WLIA z&pZP4>y{)ZCo}99Sf5xw94GBe&ytwGz8Q0a&GNuOs2 zSHeeXKXZ<-mG-|McYr)gOQYiHB0C8&GAc?{ac{g~TLtnV#2zx7g1wNMloWO;Z7DMZ z0RMVoEarL2K;u2yFPsk|KzTq9mP$E0chi*R2Gn;(2G8&MrnQVVzt{)c&wP-a%<`Zt z5P?uXh5A%ay&1EtBO799o`LN_Z zzLB*qy6Ur%Oyp$O)V=lH=t?tLSvKBVM z(pPAIYHAwK0iHblEnTJpI9QgWeLcaw-l4un>C)u`caL3+@$!|rReb!XWwo!Dtt6RM zahm-p8T_7o$nP=(@(UvzeroNWverFAw&VSSgM;}QC-Jyr3LX!F$-*8|XMY=+y*Hv#nFHJ*CwMo5$?K>L&HVo=p-;;uko6 zz!+6M7KNg`u|7*?dbh{FU2U(g>($YsJRG3y(D+h5{IgHPkApla8va@^e7}*4s4PCK z=`rx&jt0%xQEJAjjuzXC=UXz;esk^hC67R|pcMUI1>i*s9b6ze`K&~nFTwc67eC7J zU)NtK@>k^V84oG;pxA?A5AOW_rN#q{pO+gry)d4@?w36a@fZwgaJ+%zPZq`zWM3V{ z`4ph7XBjyE6lc9}ia@6Z3*&*suK5U6Bb;w!+t$H&7tT+F@w`yqdKhmA_0{-C*J1s} zptb9O54b*4s&5_U4>XKPy|g9^zTJzoiB5uPq6=8^*UlM+xVH{GIJ1 z=QudN%NmU1cQ_s`9&dNm$2B9r?KBhfBcLx1+c)4j!>Esi`YO+g`soMX3WXIWbXdKU zB=jhwBk)-d@fZWeJwCyVI!=(m{ozAl{08(OiN<`9*$Q(~UzD`%DXuBQ@iU*EnZl-> zSk?|79Ni>BkUAzW{C(_gLyn)gKyU71vSHGFVDa$Io9s zJ%rgNR*&{%G#c-te-qn}`3uaKxUU!Lv$*N=*XKU|)(WfD%0IQ|gFdbB!S=^PaUaKT z2uY@<6*En%4H(~>%|<)7+Zc8XJ~$r;`JE{D`4tUNpOub&(yD>aO`zXsD4xfmI;)!& z^i%Gpr&e1*r8hShpGktTCdS*-Kw)6-|1ntD_*(}E_K_;rKOKQe3WI#mVx0vF)et@N z&U1#LOT_uJzqrP;kZ<5Z<7q2lv0W8(Q;gXN^&7QzGRn%HPyZlqW1|XY7stE(1^Z9B z!GIMwi=1v??W5O2zDhdoZl9=s;E&89+)&hC1{C@Aa=MKr|J(xhEY-LAm8LSc0r`KV`H&3;8!gVgJ!Nf9zY{$C>Rv?33)@TmN6KwL<&d{O3Py-1!8fZplw-nBS*i z^#LKj=ZF49d!kx^za=bT-=mmagZx@BwCpOI4)a4=7=OF(haQGyXn>LHPr^20dm(?4 z(n0@|MSMv5m*-d7NVJX}X5$tDe&Q27?R7_k9d1qE2j$0D83*K>5=V|4;lBUWYG^&- znwc7KCXinS`vV!XkZ<;+n;}0u(8~6|3H?b{O3G8L$)lKN9uNwIrR1z?7V* zf5JkJSM0w8`zGuWFWTN)^oMT!Z)z-~kOGwS|8yG_@FM8HvLk zr>CZ}OLr}6g%4iut^c~UX#ap0C^{j3$T3iK|{LSM~7& zt(eaSca`YoSLA1N**@A@T@3BllMy3EjC3DI{}1hNN3N{G_#g9?B5iZg0SAg}0^x)D zPf59lU+F{t?)rzn3>AC$e}VR}|JUyU@fQzf!TEUjpG_|b`Cpg*MSh4L`6pzfSDHLZpI zT7}$0JWx)n7z+XPV0;7pB{ypUtxKXUeXxC?ev4fHlc%A5AOuAJ&z^#c$i`uR8;13j zM^Scwj^V`lqWAzUB1)@bLc+*U*+M5C8wFj6XTQ zudo)ce7-OJx5fTpKYR0j4aRHU{xf%i?Tt4!y5)Ic`scET)UZQp21@wn4imNB=$!xJ zOFiO`y0r}S)Xl*pq|(X`MEkR(WMsXjw>Y0g z`35s2XxY>swo3hR1b}XSME}pe zDEbSuXYBvw{gp3z{Y#AwPybKb#CV3%s?p{P;E%R=@DK6Ylb`L(I)D7<^#9t=_v@bd zA~qGgRaB{G|BNFnh|XQ|zA*i}&;NVDSArlVJjQ$sp#jJnza)B;ALQ4IT2xjp-m=qx z>sxTW6-|Y3n5)^2{)c&u=QnHwR|xZ4*uR5&=I;ehPK)2t3fH&ue484)cnUS(`nDo) zFx0GUIKhr*VF8K4_(uF6f6MJ*{J+{9v~Ah;3XqR>%f<7H@%^_T3O0 z))x=$r_bPBYhXMLz1~R}uko~z6E`;VIIPOGlluE5pI7e zfDz=2wO~0v?T(*?<63uoCYP_jbST7U-@fx)1dcxI2Who`41oE>f1S#|scPViwje_8 z2!z3L-i@Xm4UsS7`UCYiqBj|yhxxbR0)1Bi9>3N^DZgb9FgI0=^m}=Demb0guZtGX z?{$S=6qPwk%T&K47Mk$$ZYmk9^HLD;6WJw3d)6F-H>0B zuSW%?$n8ld-L3=v%7L-OWD9MNgJi+`m)8}8-kLZc;;{qPiGR*0-%oywo@hk)+ z%$)mQszF+aJ|X`>=Scn-ZV7bmedC4m9pE33ruT`*yNgbrr9Fdpch+auf7P?5thfgH zcer19VrXxs?ujucuTOaQfSy!VRvHDoK*~WX^7hMValSg_pmaXaW}IL3pb6)({`f~F^o3;|Am#6 zyazO;`yMsINybXLfx;9j<|hM2e(RB+88`zDd-R`zMSz2q`or#~g?x}PrV$oX7oWQW z^M96%UI9P$tobtO@mfP>)vW`-(^?tb6`3DAG3XGk-!>YjPs8;CWQ3WM+Iv2I+pVE4 z{YdMTrSs+T{k_t6J`M2^_E$0cr_UKNvp4pqgw@7>-Sc6=9vt+~!;J7%pGL5UJzI}Y zg?w;m{E8H}z6JesqdlyK9+((uKln{F;Bz3}%~%;<6S8qK>KpUVS^)PIj7VpE49c%8 znkMNl2l8#s^}BL^>9wBZ_o`2n8kUP~pJWfQWLU`>@CSmwWwil628}$krfD5Ssj!~S zO30*b;EdbE{EIezWro`x7C`>XAOC<66fsWu5xsj$G_F@PrhGe6yM5mZ)3bV5ZwUD{ zKyfVDcnj)Z;KyoCk=lp+UW)bFQvJZ2Q2q;P0YB(Z(LeNIM0>#g0@NE2_3wMa23cnr zQ6Fdz8MywfZCN|&kAV)uZ4ZKeJ^X{4*)5s9XfN9k)GyW_3i|HD zi24@qX9RtV>+_KxMc)^XZ^4*RgFc=wI?r)0dx$3^-Tr|vTH5DdwtJoNgvCzC1BmCQ zWv%N$zg%eIiWQh21%0DGw}L}&y~?<3%)(koNhfRK!J)?!(Vq+WCPuTOZ!wpx{BlgMtSI50~rsQSncTe^UID;-3`%BuYT>hl)Q`{Gs9x6@RGs zLzIBhA1M8S(jO@Ofzlr+{ejXS{Pz1p`TA3TX|?b?<#Lte4+abLbu|+0Z+*)7-tmPZ zkN+-t3>5K{E#ZgljsNL{#|H4fuG)jMB0biH<%Yu(-lDKOU4^j!MSMIxEIuExt{V2& zga`DFo|z*&KOxaI^}7Tb*T?bvtEB4O55n^o74Up9&u=93!=A$0cJX++HR?oUEAGEp z{U|XYD+THH?&w)3zwtAN?bm9ctgU^z6nrj`-zpIL?SWEeSr z9q7Xo1r9IjB5=&tfR)?up2q755FeP?8}k{&t|XeKQcsK3O-4*baETUl)q zo_Fake&p>re3S_GwXk|R$jfTg94}cgdP6~9l;;7E=i#HGJl8k87{l{g=I|L~otJ!M z{2o3bo-gssRmIhiq?+*M_`E)!mMXWms6*p7(UyI5s<8h}M?A>+Ri7Hr`e9k?K79U` z=TlQ}s~GRZ6WT+^>yK26_ABx8eU0|4C;w;L#N+rpD-RF2(bYNuPx$;k&p$$_W+6KV zWZ~RjrU>?X(UaF~OW-S^MEk%K7#FL@kF(HEr2S7|{o{G|D{-%vrm#X1%0)j<^Wf8F zuj@fRnUzFcdqrymZIS##>LTQS^5O(M70b^*|Giij3gzPY>1un#>tR0tL7tRO7xqhG zPd_o{1bjs9;kQ#>I~r7R-uu;b&;6zP(T0S3`p^&EF7XTNS)ojB6ZfmY=heKQ*S@g& z{JsB$pC7Rf_X~(Smhkuy_{inCz5$-Ef^y;YiS218cD6rZ?TDYW)XWagi_?`N9`I>^ z&hb#uV27fl4 zPc7l;7mt5@;=yW^?zf}i)ICsLxHj! z0(YOfku|Lt2Os2JD6aPU!aqK7>*iN@eiW*7^C#|?+*R6%f7s6e_shuVFCPDYfgRP{ z{9^os4}f=-Kl%0B-xl}xz<34V&tEM5o$~b9kD+_{#r_|*Q{cNB|H~TbnGJvs>`yaN zES6rf{_>Z@zknyZq#xgSih(BziO2qAzWg&hk7~D);HIUmk;RQkXkCaWb|?w4lUTb5 zCU75q`m62D(9ysa_>r)G1^T;pkv4@1yBuJh6i5E7E(rH47*viAT#Ms3;dv=|ep8}< zuD_yZ(M7?2V&D(bGE*!q%%r!M6b1bazZ1#@_6_V7x*17UH%Y8ui}tF_^PY) zU8msrU(+>OJ=6xx`ziNEao=u_QeTiHXgnbiof`$#2z*j z_S=*2Z)OJz`*}Fqa`?U&cmBhde7kylw4dYuK8SyapYiE==>A(TR-TglTTz~b8`$58KY4q) z3;*a3z}(DB?-Nzr6i&nzC=& zA^=Yke%2b*a2k3|_{EwIw6)N>lU8TkSd+(O*cPz)(?SA(E7cal_ zw#<_V2P;ZtZC&-ru7D3Sty?!Yy&)P0PDFhJk`_}w|+@mKg9W7l=r2^|73{oj+xe~ zB!1}$#)uid_26#RzVQD?Kk@IBr~VMw4@u3;{5g64oV=a#)Jwt`y5a1Qv=+Bdgr_3>7f0`vR?VXO*+g6&{lDO+{-oo=hC4eM5PzT(>z~#yuEQB zZNg~G7oIS}A@&a%i`x+Y5}qzK{^9*XD^=POg4SEk&v(UNC|@lHj=&W^%JB~wL)=e( zk}zUUui=hw3L9ZB%GUT&{U zy)_KuS+REb?N|J7G(HUPAEA?LP15ztF`D<7ukc0R2CI#dOz%$ALj{m-;j`HZn+&%f zakW>@?+wlV<^K|zY29q-vZef=Tt2?!DL>Ah(7vga8Vi5r{B^ber@9F*#C-blOxG=3 z_6GYm!hl)Q5A5++VYI?o&g0lW#V7RZC(+mo2z9uw@1FU8f8+la#*HWNXD&P;x;w`c z?D!6Ny5n3@+rF|^yRcpX=R5qI|7+(U`A@hXrTicJ1xjV;2thXRs|nt3b?hBNa5rAa z_eHVQyEdTgPVc<5#8VTj1i|_H z@~Khm4;P0gj1R1UC(7-A;^sMh6ZCKwj9>l5zq|dAkAwa6-88J{^Pus4*Ms1&`?$A! zJIWJx%(a@^A+u>Dn*KQ6&w%$mzrYo3A2;b@*8jW<^Z$gLYbbWFPX-@E&xxI>u>Q3h zXh&3Pk@-KP@t2wmF7rIR*Ep^)` z-jQ%_+Lyg{5B}Zv^M$AWWBtQZiGZiJMIxRs--dRe zzNM8x&`N=ML`B~!zXfCdIe%V7F=yCm7e~Q()&&T+kkap+$ z{fHj>Tk9i$XPl2IUY?4*eI|@gX@FI8=HyY=_!QpH=e6JSrk`E^o2>~A-O>eq{cYd* z&v&o?h4q$}NBFbk^DkoIgRK{e6aN*Ek7M8kTW))k*O#ra+fVZT_W$rcA1l$?q`P$( zKl_URCH!N&1?&Gi;ZM%*rKa`7YTeB1e@w{l3m;blUGjV}rZah>y}|2!`6|x)eUA;? zJ2suEBqk258_ciVQy(1HnSRdSUTOV5u6~Dfx<@>%?^ZmaKl8*Bu5Uy<*>Js}C!W+q z?TM#hGCaxgANyn5zSjF$lOAfHig?6Ha*y?wzUX$$N-sYP-a{-cJ>c&*jjr`;O&lT5 z)IaOO_i;9(y0iS5++P0#^PS^Nt6bx^#1pXoX`;w4#)H22yVS>b6~ghy))SRb}eE)VhjPTuc>f>T{Ze!efdU8goP8&({W zD!A10^0)p|VU>%f)&6iy4-BF_T45aAnLJx$$G>Nb-b#3^)@6S?*`+0!9`;0Ug8H6a z;j&+!{H1x{zb(|rjsE7S7_S0@@-KW;lm_NA>A!L(#e59o{kGSGLOD~dWAJY6 zg1s-sv~6ZdPoNLQ4K{Kxlyne=<-E_l%Y$6=RpH> z>ZNPeJXjxgsABlb+Xf8?4((@Eh=tYf9@w@un7uiAckz3JKY{n<-c(ip`sSeV zeN59284{Qs4GXLJt=EtgJ<( zMch=?@ctlpK`qt8{EXVhE)>RR>6s(a_rE#}uqtGeVT3tx_WqCi0bL>FLwG*3ko=z~ zomB`gTlP3Utw5y3><`cTqNVE{LIlh65-r{Da;Gy3S=&E7+COpj8rupFdPMqK-6WtT zc{azHAedL3SO@!azzDv4koNH@Ni}yR#a8K-Y_u-21~Qw5G;a*Q0rgb`Ma0L?uYdN1 z7k`h7<1=EH3|8nrjUMmQhWH&a-Myvb&huUK6aLz}d^{-Jk8$UNwl&itRTG-=a+Y)|VhK_xMAUk6T}A^1XS|i260S-fhdE`1lz0X-mYg(sbP4 z;5E3b{xxHGf2#`mD?%)Gm=8+C^J%#Mf|Osv*qC_LUA^YqxKdR8)^3a2P z%o$H$ev8)i37LWN;iFE)S-FITwF&tC#zc4_XKxLF{m4JY+*B3wai!Vvb|Bfb^@jU* zCg6T7k3VwH6i~0NEBR4h_S6wiM%Dl+Y|yMw{KuDf|0kHIhy8b?z4PTA?*~tl%dWq? z`g>r`i$A|MV6MXTKfD)h*x;LBC01hq{qVxo_`yy z66+WhcDiQD!_Tde=*H{IZ1=+Zh#mB3Op4J;9{K@}!23q;-mAy_pvUtI(0_5EKKDa# z`wQ`YzgM~f_D6zDY6{&cXhy&K0IW}k{QQ`0#b<(g=wW;W^Amvg8*~|i&b>Z4X?;U) z$HvMNk3?`8LvA?r;TZJCStFyPR3v|FLg5hzsR&6)NlC@=ZCCIw$G6jdT>TH?u`~PW zh)2KeyQ}#4FTbAg$}e1mK7{Mho}!=w(vTr%o_lA_w;~#ufU5#dTOJl@@tcX^$1C$6 ze*QhlADp`p-Z$H{rWK#h!1v8Qj`N>QTU#H5`A?|N!ymx>(go~~^83O6VhGCZ7I+>M zi+(-e8&GknUGOOy= zBFzT9U}qu*9;D!JuesszEb0Bss14`)xV`%a2J%}T@v*P|UFdHK+lBsI!TaybKg#^U z;0HbZL7ckU%O6bcalCShhd*e$F`*`+>3P8)WWs=fet_n$BiP@8KXC1*R?&b{UX0J@ zqklX80O!xGW(sRrq3AJRg74FAy~!HVSo3AV4w$dU_2G9$#@u+|f3uP>--r0VT9Z*G z;+@}ubP#L)9O+Ro{{rMRp}(JWM9B9$@$RF)^BzwM_=YY*;0k^Tv{(G@E526n{X4_A z5Buq$Z<#;%-cs<+^RD>dYRDIO#s`xlU-tF~!>_Ugmz6qpz<#!=DMljphdMG9@R3;V zxjro$@WXjLuOh}9mn;4q)DQ=7f(D85!u_WZ@9j5}ptF@9!uUK+Qw{+=-&4dpX83B1 zgj}tTx$)fDqX`b0@$t!``z%^UckO}ytxnj!Em>o&EXq)kz7ubF$RE6S(3ijZRn7+y zy8WXfPapoy%O7Y-b&ZIBlpqrjFY^aiPMPuIoBK6$r13&)axV+_PRYL!FKIAf5c^AU ze~0)|Pk#XU0~j#4@%3x_1KiQajdxtHW`Tgd?G~c`@!*Tlzh`U8A)voFE-BVqiB_8bKPelRnnje7=)gBj8=g$07~OY59xD z*C_r$@eh}=e-P()(7pq}A8;W$?n(7b&T0S5H5zY!kQL*dPaOY$ZCl$@!un%AJU!Fm zim!3J5DEhZH~w)2TzC3|LolQ1#yjHM40vy!09ica6R@NqPQyb$zwinipI0YQx_kxV z{ThvT|IUTHU}V@3$k)L^s85=IK{`djJ19(vuYJVVzcc^t?GM<{E4gQ^vy75IP+be- zga2r9rT%iZ%OCW17y&?2PQqjY_yeK8g#m*b|9bETr5^sEZY`YdM|^-D#*KH3=Zz51 zCx1+7S@Bs7_Vm?lFSBrS75*x-0w`_U5o0(d7>o!unYzAhF!-58!!H2?PB`H}yrVyX-J6JZkazwrj0L<4>up4SU_Neo0_-m#;2i>b#ooR3smMc-hd=n2 z+lz_}D_!OE2MqWF9b0XKe4@)AsE2uv7wp%Tl{j{95c+HM2W=yWo;(_k8C%He+lC_m9={hI+2@}fptb|uwxccu< z);jJ0ebz;5$^Kmj+G&#LEr?OUyJDZ+X`hO}Q|w8xCuKbygq%WA{DI;R6n~)j1H~UG z{tzXg^ao0Rp!5eyf1vaSN`IjA2TFga!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8 zJfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg z!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_ zN<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg!~;q^ zpu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&%14=xg!~;q^pu_`8JfOq_N<5&% g14=xg!~;q^pu_`8JfOq_N<5&%14=w_xy1wj9~a;+g8%>k literal 0 HcmV?d00001 diff --git a/assets/particles/cs2fixes/admin_beacon.vpcf_c b/assets/particles/cs2fixes/admin_beacon.vpcf_c deleted file mode 100644 index 9399a6ad1acfcb568c93b596926d0a75f899a9cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2679 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 N1!l0hsJi!u{{b2Dt-1gJ diff --git a/assets/particles/cs2fixes/leader_defend_mark.vpcf_c b/assets/particles/cs2fixes/leader_defend_mark.vpcf_c new file mode 100644 index 0000000000000000000000000000000000000000..0a7900bba257e1c4402c078f2aa6e55daeb308d5 GIT binary patch literal 3328 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 literal 0 HcmV?d00001 diff --git a/assets/particles/cs2fixes/leader_tracer.vpcf_c b/assets/particles/cs2fixes/leader_tracer.vpcf_c new file mode 100644 index 0000000000000000000000000000000000000000..98afc3e25e1338b7eef4e6e81f8176fbae1fc288 GIT binary patch literal 2853 zcmZ9OYj9h|703U3btOwtY`q*?NeGt71E&Q1NScHuVCxwxv89V7J3LC1m9(-ixw==m z561@Dfnk7_=};ga8rm{VTZW;968d0DrfA5Ch zQg-yad$fCY@7}ZLoZXEk3-hVyBNJcN$mI zokk|S#NJ2Gjb4MJ^byNn92i1u#Re>`AS*0?Rwvb6M2H9zkpxahsg4od#Hs|)KyOb1 zeZ2|DvABlVYCmFYh_x@`eSQrots|}_TGhPXcI=F33%w!qx+*McD+!I;>YT`_n$USm z;EJKF!MZilROf{?s0rQ>X4N)%U6?n`wd+k9SQgx@&nn!WMctY)s=U!K^eq^(Y^S*i zVf}V2B3(+8X06z^RYT_*?Nl!gX6IGQwz_az-rB=k55XjrWTT;OM(Aa*`;+F3(-L|w zjw{@x1f{O!;=NGWrp_7co8Fp88?82dx|x_3rbVly#l-N#JQ>JVo2oF$ z)-lCkFfcY{3G)TA`zmzpgTIflpRj~z>|kN5LEk#7YK@Yx49BdC3DtTLuk086P)Rg} zDfDhgCs~%)G||T9ymbq(5spKyXbJlk^jNECzgfSkKa5{m2*d+E-^#AeE`I?1p->3n zkc^l8et#gu82<9_OSGAni|eodx$mNOytF3s=;Fi1kH7oP%~$+&m~;ln+a96%-2l*! zar}1;@IBYvK2Z)c=8+`H!&y-7d}|c#3ol!cQ(d=1$&?vKw=rm59l49CaPp zb?}Zj*=i?F)2nb3v4RNh#**)9FTO-&*^?`XMaQuueeBAl-9z+l!BQ?x!fJw6i?zhn zZtO-?g6Jo%Bi0ieh>gT1;(B6$*i3wixPjP0-1sb(Mg~b3B3#>y5NBrF&wWW#7TW)Zdvn1wrv+5qI#|PL2c>~*@CwXt2 z_3ewZcghp=XL6fFy88$lt?TSl@HM&L*B`Hr-oR0np(m?^<0wn zlW;q62XQBH*Vm;BeV<*)F7(~)J`T`hNvcxEL4p%CqW&W}))>H1L2{FriQ~*H)hclh zacG=|YVP=!`_Spp!7w!T)u$OoPma<`SM;4tU}Z?bs6399euSRK$mm&P%nxZd7DxT~ z++Pnr_V`=p4eH_uu3JnX6lb@D#__X|!eZ`-v#eKo9(`|*OWPw`83s?&yt@X&W5=

rg&dY(d7lp7A=ZfRaf1_K_RK9#4Mjv4bzR%7`9FF`4KFxa1&VF z&~4Mu6obM&ZRkyP#xeOQ!q$ygTC<$cOfjd5Bcz&bsWzn(dR4WkP&Tw|uG3E#jzwO! z4c-GtR1EUM7|wf_6N{3oR_;);)rov1TS`uR3El0r7@15eeRwaN$(OR}3eDTpCRCc2 zYtvkF1T_@sy^T&>ucuGCiThl+&NXf(ZAv>e$6k->w5Z!g4D3la{TMnWn;9G{alK)* zCRM!)Pw{!0rZFditYGkQ)_+ZlMG*e*n)3&WE}<8>^_rDP#foUBe3GudjoSSVML zh2LRYF*6iE_b@RMKzQq3yi_n$ODw1Vljv`1*P>B$Y&r~HfIo&!e4e5($S4X%=0trx z7Me}UOC`P+tQ+1VaEf)C&k0(~lNHCTIdoFg|A-GzDCW!AYGtaFsuqfc>?RB>v=hKD zm{924&KIu3!?e!jG)j@VmR0h(e73X~H#D`wkbjQO)wq6AeG934Yesoml83Oi7RR;; zb#4#NrpbmT&v8ww@%o`HI7R6XM7?#sbn+zaBz}x zeU3lFSO{z@dWM3K-el5Ktapgg)$kYaoL!$44KnqNIK?`;F~H|3Iq$;f$siUTE~~LV zug6i*Q!2L}W2sa=S^gr!ebPuKS$fq?H?@z>rGH^K?U?JBVzo6@Cp+5@Vo0~G?b5M~ z(c-GUypah$--U4gE;+?D^Cn3!h93YI<1P4v@G%jN(uL1ET1>)c+R@^VCIYZNoBj1tN&i&papO6me8KK$yH}ddYTGc?v5zB?~IZ`E=jTWDG5OY-jKWzgolqn3d46s3Pjwr zUfN^whPvOIEZatViun(Cd*|-d>rl`A@4&h!UG`{dFOeeMWELY@aiQeasho3GBt(n&}rkeblbV7B>`GHG8YFVJStG_ZDQ6=MBBex7IDb zfb0EcZ_ykmD+`>as`4T?@&zszbuDixnzglFEtc&i9fQ;3N819{W$9GndsqH=*DH^2 z{}a3Rtx;S4!E1HQlYkN$FixGN>%x9CW*5&eCLlzWM*8`sW{GO{GWJY+83*Ac9vMG< z<64|-psKAQcOQa{U081PP{US3GtokL2_NAP<6?lyAkj*!3e)G&-WEovJq$;%Lq%}4 z3&Ax+=kr+7*3zVP#0^9xpVX=~E5@r_D{-x;aFhBnT$L@Q&J&8tHMzn+QDN6~Rmo?$ zY!v6xvNeaIIjiU8Qc2g$UX{xwQm$#$%A4TR_G1arOq4!UNL4LG*JPD`tQ|A)1;w3F74>smW5x3O7jO!L-hxV|1^{jps=FtI#qISBSCKSeTc# zGoM+af1Oj*Qihv)%_#B-#e5#G?Bnv`3@>woYpoE@vAA4Nc@W(Z zHggs2I$N)3$MHiG?hdykHMKOixZGIp^?Kp+I`E>)<#Kx&!*Bm~m9})nUjKRjhw9Ur zHL=ex9oJv|?l-qwx7Ryp+)bADZ7P?^qI$3&kF5vZvQ6#(t|N?zf*^<@e9|hku>b^y zErJlhXBi%($!@aWW$C&N+qP-jahPy);G}KKwv9J**>)au4ddiiYBmy{VS4Z5c6^nt z6j5pYw65Cf2eKLOYx2vCDoW=@H!hjy=3@oQ5aXve4vO_LqHA)JPqbvS}*! zd|k3tmN{b={}8g&l_T~N)5N}RwC`_1`++o0-c9X;#649;b5DPYs)vaD8R3KA%qTl8 zQ=>o>NsN4nD%?j>lx-332dF$oa*pK`N>obSelpO5&k@ed<2c}th7I>#8kwQ$O*$$dn1t*p$}40!}T z^A;?xS#gsFuPc0>rp7CZMed0{l~1L~$C{R`(arUmNtQbV=OKi1I$3rQSDY)3DxJvZ z4y5DxiDWLGiA+3-)@mmPCL`$(-u1z36Ch1QkTX<4mt>X@SMmYT6yi=MN? z!SAv~S(S~5MQ*H6vo<0>&5M>E1bf1EXSzntYZj+6vR2Y7lZw`YC*=iNrm#ykeK?j? zX0?Q>RAUeW*v5IO1^ttH=?yG9GLflRYBE2WipBHM)KoSXnfe)qQn5ZaTKkCsH++M; z@xqj@n0zIuoWuIEdIL(SnnfYzIk2i_hK~+yv}%1!Xvhg!RSRkZxVb?;O%k;+VVF=2>}CKRr|B3h{`Dbdn@ z>bOX;&Y}YrDU+qft~%J0aFDZq2J9weV!S9Xdhq=OWdsqeG_I&>5BlO-DTqu`%PEy6 z=F9FyAB{gNI#)s53=a)O)asnPAN^_FeBC)Vp%)Ja@bs8$D#b~?&MPlDgonwJE0o3L z^l18Ch@!|dc1mMB;}pE;&*;@R#g_|FRX2HQLf5O89rz+^=y4p&@dc}9aB~mC0T!I| z<2*i=K)%g>|G&xOtHLj`TrDS6wN{B#^x8pZrjXLq#pAf*NNVwNnHTNch1(ekrIZE6 zm2$ae@Nb0Xg(>vfig)`Cg^(^g0*4Tz{Oj!VXR&Z9Nb^8NYcOZb)y8~noUvUWE zVS)#4)#3ER*FO)z2Wj5n_S>;Cv(q3u_`4LzT6*=@qU(LBqyC;Gb~UgbF`dxKUT&v| zAl9OG4r6c+a+J29`mVSf{p8%)EqOeYu+U9ei&OG?JYIjG#UuIYqMEbA>Gw&J6mSNb z{Vh_!FW|J~ce`92G;$j@dAH#)U-NI^_wPU`umh_v`Dm#CEkzf-w}FM4?_oFgo?x$` s%X^3&yhty4q!v$y)9dYUCK2*KfDN?DqwD>FVX!7V?(J}&Sjm(A1L33vIsgCw literal 0 HcmV?d00001 diff --git a/assets/particles/cs2fixes/player_beacon_tint.vpcf_c b/assets/particles/cs2fixes/player_beacon_tint.vpcf_c new file mode 100644 index 0000000000000000000000000000000000000000..1fae25d7b1156367716eb5f3582627420becb557 GIT binary patch literal 3090 zcmZ9OeT*B$6~N!@uJ`Qooxk>SclpA;+>s9m+*e3K6S(td;>2ff*3N~5kImRSzT0NK zYj)SpU6NMekAxJV7C8P0t!Pq&+NvNv6_rSBlZr|})qhGPRH~Ljh1w#~D$OAX6)k;x z5R`W0-_GpJoAKK>Z{ECE7eE&f@B;vkC|RYD!1~Umc4q7#)-Q4ZnPer|g92}&AWp#< zUzE>!|Fq@I2S+~k=6j_%U{1-d(zWq{7cDWsDlU{AY-SF?f)-N5yC+ndpl9J%iSWjyk$H| zZy5pcAy4g@{$v#_bYRodI4}ZI=MXG*2JyxFtZpQPgpmjmO~9oX))LZ#EK2}r(AS%Q zcwYhpsowx;xgVqz$jWEovaRwFkc4K;5zTW*FmnW-_erZWfo6lPFYZ?l|kFq1YI zTr-q2Tyw_i`W!>s8FZf6YL(HNWvZ@jy0^BQwK~o&GiujnW$MmC&6%-Os%e(#3>%DU zIKgpS^|cT&?}f{dR?;Y6Ej3-;GO2-I*9Ql)bGqX?A=s05cF@Ktuu&wbY5E2Tp969% zY0tD8%Br+%r_aNbd%ciDZ{Gb?C0Qn z<_xo&HmV$kW`@;i%Wyx1LrqpguXq4H3YT3RoPpib=LkGa<9YeXK)LaL1;Jl0o!QLn0q#7>(yGClup#f<0dOOO(2L?Vr}muH zbL<2n^uvPZ+@8~S4587s!leMVZ$&zh;C7sNy=Q-pWy!lMAjNjVBKMVhqjWFQw-FXY z{n%KJpdPRix!$$okHg}c0qk6Z3?f6wjmTPL9kL$TfZT-KjBG@1c^VeShOse%j3Q%* zcfdCxw;`Jm&uCkb+mWv!+mP)DZrf5&nuri-5{Q)a!$J!C(n#hH-f35}*vzdWSK~Xn z@Uhc-a}9>K;@)NFEO^1DwEm^eRyFP-ss6VMfwAsbJ~ux``#x5wW-&23&BP-_MrDM(}FSc?1QdB zwOA@<*TVYwW&$G@VKOEI`QjQlfqE_lWIWv~NhP1lXO&%WbKSTfgkM1Sa#%N|zYnQ= zV@7_06GmWVwI4PW^!5&TH;p#5X^t93mDUbzgjX?;r>vH#Ica9T!jU6Hc%789&U1u|QI%74cZZ2(Pg3g5?lD}I>QA0l>3NPo2`HHIGJ+_Y;#P@IBmYH3$ zt9q5^x4^7IHNEA;pi*w)K6jA->UNyBvu$Q(bjQ!bF9qK9;^Jh^u&4^$7*F~Hp(gMr z`R3kYK37tvh6uNbOy+cEoa5b66OHIvzZR4XtI_!&oJ~`FXk{ANSfMi-7wC>NY>OOQ1WI)Z*-93Wf#vU3VfgUEdzcX1SKdZjpi&ph3?wG zOr>I_Bl7JJUeg<({&n$PnuSJQ^&Fs)!&%?ko(q=OTbv}IU!1XA*JHa$R& zr)70IS=gH$gkasrfJ`l z4jYYslb9^KR#W2rqheosL8 zFj|dd!)mobsg_J*{v+~FA#Y~ubyo9IDCQ+bn62Fgt&Co;w;VPOQS;|SN#XI*`h|l@ zrIJq<9upVG3nfKO6|%*Qs$}ItGM$Bh7z|>*fj>+-d}25l3`b+3pcuu1EnmMc8WBY? z=8JVlLt-q-!5J|c@ca95!wsJ#FOZ?|78sO8FTwdQnSb8( literal 0 HcmV?d00001 diff --git a/assets_source/materials/cs2fixes/leader_defend_mark.png b/assets_source/materials/cs2fixes/leader_defend_mark.png new file mode 100644 index 0000000000000000000000000000000000000000..3c41e6cc21f3866a33d392090a3d99b2373656c9 GIT binary patch literal 13768 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 +"CDmeVtex" +{ + "m_inputTextureArray" "element_array" + [ + "CDmeInputTexture" + { + "m_name" "string" "InputTexture0" + "m_fileName" "string" "materials/cs2fixes/leader_defend_mark.png" + "m_colorSpace" "string" "srgb" + "m_typeString" "string" "2D" + "m_imageProcessorArray" "element_array" + [ + "CDmeImageProcessor" + { + "m_algorithm" "string" "None" + "m_stringArg" "string" "" + "m_vFloat4Arg" "vector4" "0 0 0 0" + } + ] + } + ] + "m_outputTypeString" "string" "2D" + "m_outputFormat" "string" "DXT5" + "m_outputClearColor" "vector4" "0 0 0 0" + "m_nOutputMinDimension" "int" "0" + "m_nOutputMaxDimension" "int" "0" + "m_textureOutputChannelArray" "element_array" + [ + "CDmeTextureOutputChannel" + { + "m_inputTextureArray" "string_array" [ "InputTexture0" ] + "m_srcChannels" "string" "rgba" + "m_dstChannels" "string" "rgba" + "m_mipAlgorithm" "CDmeImageProcessor" + { + "m_algorithm" "string" "Box" + "m_stringArg" "string" "" + "m_vFloat4Arg" "vector4" "0 0 0 0" + } + "m_outputColorSpace" "string" "srgb" + } + ] + "m_vClamp" "vector3" "0 0 0" + "m_bNoLod" "bool" "0" +} diff --git a/assets_source/particles/cs2fixes/leader_defend_mark.vpcf b/assets_source/particles/cs2fixes/leader_defend_mark.vpcf new file mode 100644 index 000000000..34345c697 --- /dev/null +++ b/assets_source/particles/cs2fixes/leader_defend_mark.vpcf @@ -0,0 +1,1018 @@ + +{ + _class = "CParticleSystemDefinition" + m_nBehaviorVersion = 12 + m_nMaxParticles = 2 + m_controlPointConfigurations = + [ + { + m_name = "preview" + }, + { + m_name = "game" + m_drivers = + [ + { + m_iAttachType = "PATTACH_WORLDORIGIN" + m_entityName = "self" + }, + { + m_iControlPoint = 1 + m_iAttachType = "PATTACH_WORLDORIGIN" + m_entityName = "self" + }, + ] + }, + ] + m_Emitters = + [ + { + _class = "C_OP_InstantaneousEmitter" + m_nParticlesToEmit = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 1.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + ] + m_Initializers = + [ + { + _class = "C_INIT_InitFloat" + m_InputValue = + { + m_nType = "PF_TYPE_RANDOM_UNIFORM" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 60.0 + m_flRandomMax = 60.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_nOutputField = 1 + }, + { + _class = "C_INIT_CreateWithinSphereTransform" + m_fRadiusMin = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 100.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_fRadiusMax = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 100.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_vecDistanceBias = + { + m_nType = "PVEC_TYPE_LITERAL" + m_vLiteralValue = [ 0.0, 0.0, 1.0 ] + m_LiteralColor = [ 0, 0, 0 ] + m_NamedValue = "" + m_bFollowNamedValue = false + m_nVectorAttribute = 6 + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 0 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 1.0, 1.0, 1.0 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 0.0, 0.0, 0.0 ] + } + m_vecDistanceBiasAbs = [ 0.0, 0.0, 1.0 ] + }, + ] + m_Operators = + [ + { + _class = "C_OP_Decay" + }, + { + _class = "C_OP_OscillateVector" + m_RateMin = [ 0.0, 0.0, 10.0 ] + m_RateMax = [ 0.0, 0.0, 10.0 ] + m_FrequencyMin = [ 1.0, 1.0, 2.5 ] + m_FrequencyMax = [ 1.0, 1.0, 2.5 ] + m_flOscMult = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 20.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + ] + m_Renderers = + [ + { + _class = "C_OP_RenderSprites" + m_vecTexturesInput = + [ + { + m_hTexture = resource:"materials/cs2fixes/leader_defend_mark.vtex" + m_TextureControls = + { + m_bClampUVs = true + } + }, + ] + m_bOnlyRenderInEffecsGameOverlay = true + m_flRadiusScale = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 12.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flSelfIllumAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 5.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flDiffuseAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.7 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_vecColorScale = + { + m_nType = "PVEC_TYPE_CP_VALUE" + m_vLiteralValue = [ 0.0, 0.0, 0.0 ] + m_LiteralColor = [ 255, 255, 255 ] + m_NamedValue = "" + m_bFollowNamedValue = false + m_nVectorAttribute = 6 + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 1 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 0.002, 0.002, 0.002 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 0.0, 0.0, 0.0 ] + } + m_nOutlineAlpha = 136 + m_flOutlineStart0 = 0.1 + m_flOutlineStart1 = 0.3 + m_flOutlineEnd1 = 0.9 + }, + ] + m_Children = + [ + { + m_ChildRef = resource:"particles/cs2fixes/leader_defend_mark_ground.vpcf" + }, + { + m_ChildRef = resource:"particles/cs2fixes/leader_defend_mark_ground.vpcf" + m_flDelay = 0.5 + }, + ] +} \ No newline at end of file diff --git a/assets_source/particles/cs2fixes/leader_defend_mark_ground.vpcf b/assets_source/particles/cs2fixes/leader_defend_mark_ground.vpcf new file mode 100644 index 000000000..3887a5feb --- /dev/null +++ b/assets_source/particles/cs2fixes/leader_defend_mark_ground.vpcf @@ -0,0 +1,999 @@ + +{ + _class = "CParticleSystemDefinition" + m_nBehaviorVersion = 12 + m_nMaxParticles = 16 + m_controlPointConfigurations = + [ + { + m_name = "preview" + }, + ] + m_Emitters = + [ + { + _class = "C_OP_InstantaneousEmitter" + m_nParticlesToEmit = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 16.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + ] + m_Initializers = + [ + { + _class = "C_INIT_RingWave" + m_flParticlesPerOrbit = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 16.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInitialRadius = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 50.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInitialSpeedMin = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 20.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInitialSpeedMax = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 20.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_bEvenDistribution = true + }, + { + _class = "C_INIT_InitFloat" + m_InputValue = + { + m_nType = "PF_TYPE_RANDOM_UNIFORM" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.3 + m_flRandomMax = 0.3 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_nOutputField = 7 + }, + { + _class = "C_INIT_PositionOffset" + m_OffsetMin = + { + m_nType = "PVEC_TYPE_LITERAL" + m_vLiteralValue = [ 0.0, 0.0, -6.0 ] + m_LiteralColor = [ 0, 0, 0 ] + m_NamedValue = "" + m_bFollowNamedValue = false + m_nVectorAttribute = 6 + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 0 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 1.0, 1.0, 1.0 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 0.0, 0.0, 0.0 ] + } + m_OffsetMax = + { + m_nType = "PVEC_TYPE_LITERAL" + m_vLiteralValue = [ 0.0, 0.0, -6.0 ] + m_LiteralColor = [ 0, 0, 0 ] + m_NamedValue = "" + m_bFollowNamedValue = false + m_nVectorAttribute = 6 + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 0 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 1.0, 1.0, 1.0 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 0.0, 0.0, 0.0 ] + } + m_bLocalCoords = true + }, + ] + m_Operators = + [ + { + _class = "C_OP_RestartAfterDuration" + m_flDurationMin = 1.0 + }, + { + _class = "C_OP_Decay" + }, + { + _class = "C_OP_BasicMovement" + }, + { + _class = "C_OP_FadeOutSimple" + m_flFadeOutTime = 0.5 + }, + { + _class = "C_OP_FadeInSimple" + m_flFadeInTime = 0.5 + }, + ] + m_Renderers = + [ + { + _class = "C_OP_RenderRopes" + m_bClosedLoop = true + m_nOrientationType = "PARTICLE_ORIENTATION_WORLD_Z_ALIGNED" + m_vecTexturesInput = + [ + { + m_hTexture = resource:"materials/particle/base_rope.vtex" + }, + ] + m_flSelfIllumAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 4.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flDiffuseAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.5 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_bOnlyRenderInEffecsGameOverlay = true + }, + ] +} \ No newline at end of file diff --git a/assets_source/particles/cs2fixes/leader_tracer.vpcf b/assets_source/particles/cs2fixes/leader_tracer.vpcf new file mode 100644 index 000000000..7b6d14649 --- /dev/null +++ b/assets_source/particles/cs2fixes/leader_tracer.vpcf @@ -0,0 +1,681 @@ + +{ + _class = "CParticleSystemDefinition" + m_nBehaviorVersion = 12 + m_nMaxParticles = 2 + m_controlPointConfigurations = + [ + { + m_name = "preview" + }, + ] + m_Emitters = + [ + { + _class = "C_OP_InstantaneousEmitter" + m_nParticlesToEmit = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 2.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + ] + m_Initializers = + [ + { + _class = "C_INIT_CreateSequentialPathV2" + m_PathParams = + { + m_nStartControlPointNumber = 1 + } + m_flNumToAssign = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 2.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + { + _class = "C_INIT_InitFloat" + m_InputValue = + { + m_nType = "PF_TYPE_RANDOM_UNIFORM" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.1 + m_flRandomMax = 0.1 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_nOutputField = 1 + }, + ] + m_Operators = + [ + { + _class = "C_OP_Decay" + }, + ] + m_Renderers = + [ + { + _class = "C_OP_RenderRopes" + m_vecColorScale = + { + m_nType = "PVEC_TYPE_CP_VALUE" + m_vLiteralValue = [ 255.0, 255.0, 255.0 ] + m_LiteralColor = [ 255, 255, 255 ] + m_NamedValue = "" + m_bFollowNamedValue = false + m_nVectorAttribute = 6 + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 2 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 0.0039, 0.0039, 0.0039 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 255.0, 255.0, 255.0 ] + } + m_vecTexturesInput = + [ + { + m_hTexture = resource:"materials/particle/base_rope.vtex" + }, + ] + m_bOnlyRenderInEffecsGameOverlay = true + m_flAlphaScale = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.8 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flRadiusScale = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.3 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flSelfIllumAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 4.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flDiffuseAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.6 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + }, + ] +} \ No newline at end of file diff --git a/assets_source/particles/cs2fixes/admin_beacon_inner.vpcf b/assets_source/particles/cs2fixes/player_beacon.vpcf similarity index 96% rename from assets_source/particles/cs2fixes/admin_beacon_inner.vpcf rename to assets_source/particles/cs2fixes/player_beacon.vpcf index ccf2e4a4a..fd8940901 100644 --- a/assets_source/particles/cs2fixes/admin_beacon_inner.vpcf +++ b/assets_source/particles/cs2fixes/player_beacon.vpcf @@ -1,8 +1,8 @@ - + { _class = "CParticleSystemDefinition" m_nBehaviorVersion = 12 - m_nMaxParticles = 16 + m_nMaxParticles = 32 m_controlPointConfigurations = [ { @@ -133,7 +133,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 8.0 + m_flLiteralValue = 15.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -188,7 +188,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 250.0 + m_flLiteralValue = 200.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -243,7 +243,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 250.0 + m_flLiteralValue = 200.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -308,8 +308,8 @@ m_nScalarAttribute = 3 m_nVectorAttribute = 6 m_nVectorComponent = 0 - m_flRandomMin = 0.45 - m_flRandomMax = 0.45 + m_flRandomMin = 1.0 + m_flRandomMax = 1.0 m_bHasRandomSignFlip = false m_nRandomSeed = -1 m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" @@ -358,15 +358,30 @@ ] m_Operators = [ + { + _class = "C_OP_RestartAfterDuration" + m_flDurationMin = 1.0 + }, { _class = "C_OP_Decay" }, { - _class = "C_OP_BasicMovement" + _class = "C_OP_FadeAndKill" + m_flEndFadeInTime = 0.15 + m_flStartFadeOutTime = 0.25 + m_flEndFadeOutTime = 0.6 + m_flEndAlpha = -0.1 }, { _class = "C_OP_PositionLock" }, + { + _class = "C_OP_BasicMovement" + }, + { + _class = "C_OP_DampenToCP" + m_flScale = 0.06 + }, ] m_Renderers = [ @@ -377,7 +392,124 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 2.0 + m_flLiteralValue = 1.6 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_vecTexturesInput = + [ + { + m_hTexture = resource:"materials/particle/base_rope.vtex" + }, + ] + m_flSelfIllumAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 4.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_bOnlyRenderInEffecsGameOverlay = true + m_flDiffuseAmount = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.5 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -432,7 +564,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 0.7 + m_flLiteralValue = 0.8 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -485,16 +617,16 @@ } m_vecColorScale = { - m_nType = "PVEC_TYPE_CP_VALUE" + m_nType = "PVEC_TYPE_LITERAL_COLOR" m_vLiteralValue = [ 0.0, 0.0, 0.0 ] - m_LiteralColor = [ 255, 255, 255 ] + m_LiteralColor = [ 200, 200, 200 ] m_NamedValue = "" m_bFollowNamedValue = false m_nVectorAttribute = 6 m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] - m_nControlPoint = 1 + m_nControlPoint = 0 m_nDeltaControlPoint = 0 - m_vCPValueScale = [ 0.0039, 0.0039, 0.0039 ] + m_vCPValueScale = [ 1.0, 1.0, 1.0 ] m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] m_FloatComponentX = @@ -728,123 +860,13 @@ m_vRandomMin = [ 0.0, 0.0, 0.0 ] m_vRandomMax = [ 0.0, 0.0, 0.0 ] } - m_vecTexturesInput = - [ - { - m_hTexture = resource:"materials/particle/base_rope.vtex" - }, - ] - m_flSelfIllumAmount = - { - m_nType = "PF_TYPE_LITERAL" - m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 2.0 - m_NamedValue = "" - m_nControlPoint = 0 - m_nScalarAttribute = 3 - m_nVectorAttribute = 6 - m_nVectorComponent = 0 - m_flRandomMin = 0.0 - m_flRandomMax = 1.0 - m_bHasRandomSignFlip = false - m_nRandomSeed = -1 - m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" - m_flLOD0 = 0.0 - m_flLOD1 = 0.0 - m_flLOD2 = 0.0 - m_flLOD3 = 0.0 - m_nNoiseInputVectorAttribute = 0 - m_flNoiseOutputMin = 0.0 - m_flNoiseOutputMax = 1.0 - m_flNoiseScale = 0.1 - m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] - m_flNoiseOffset = 0.0 - m_nNoiseOctaves = 1 - m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" - m_nNoiseType = "PF_NOISE_TYPE_PERLIN" - m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" - m_flNoiseTurbulenceScale = 1.0 - m_flNoiseTurbulenceMix = 0.5 - m_flNoiseImgPreviewScale = 1.0 - m_bNoiseImgPreviewLive = true - m_flNoCameraFallback = 0.0 - m_bUseBoundsCenter = false - m_nInputMode = "PF_INPUT_MODE_CLAMPED" - m_flMultFactor = 1.0 - m_flInput0 = 0.0 - m_flInput1 = 1.0 - m_flOutput0 = 0.0 - m_flOutput1 = 1.0 - m_flNotchedRangeMin = 0.0 - m_flNotchedRangeMax = 1.0 - m_flNotchedOutputOutside = 0.0 - m_flNotchedOutputInside = 1.0 - m_nBiasType = "PF_BIAS_TYPE_STANDARD" - m_flBiasParameter = 0.0 - m_Curve = - { - m_spline = [ ] - m_tangents = [ ] - m_vDomainMins = [ 0.0, 0.0 ] - m_vDomainMaxs = [ 0.0, 0.0 ] - } - } - m_bOnlyRenderInEffecsGameOverlay = true - m_flDiffuseAmount = - { - m_nType = "PF_TYPE_LITERAL" - m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 0.5 - m_NamedValue = "" - m_nControlPoint = 0 - m_nScalarAttribute = 3 - m_nVectorAttribute = 6 - m_nVectorComponent = 0 - m_flRandomMin = 0.0 - m_flRandomMax = 1.0 - m_bHasRandomSignFlip = false - m_nRandomSeed = -1 - m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" - m_flLOD0 = 0.0 - m_flLOD1 = 0.0 - m_flLOD2 = 0.0 - m_flLOD3 = 0.0 - m_nNoiseInputVectorAttribute = 0 - m_flNoiseOutputMin = 0.0 - m_flNoiseOutputMax = 1.0 - m_flNoiseScale = 0.1 - m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] - m_flNoiseOffset = 0.0 - m_nNoiseOctaves = 1 - m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" - m_nNoiseType = "PF_NOISE_TYPE_PERLIN" - m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" - m_flNoiseTurbulenceScale = 1.0 - m_flNoiseTurbulenceMix = 0.5 - m_flNoiseImgPreviewScale = 1.0 - m_bNoiseImgPreviewLive = true - m_flNoCameraFallback = 0.0 - m_bUseBoundsCenter = false - m_nInputMode = "PF_INPUT_MODE_CLAMPED" - m_flMultFactor = 1.0 - m_flInput0 = 0.0 - m_flInput1 = 1.0 - m_flOutput0 = 0.0 - m_flOutput1 = 1.0 - m_flNotchedRangeMin = 0.0 - m_flNotchedRangeMax = 1.0 - m_flNotchedOutputOutside = 0.0 - m_flNotchedOutputInside = 1.0 - m_nBiasType = "PF_BIAS_TYPE_STANDARD" - m_flBiasParameter = 0.0 - m_Curve = - { - m_spline = [ ] - m_tangents = [ ] - m_vDomainMins = [ 0.0, 0.0 ] - m_vDomainMaxs = [ 0.0, 0.0 ] - } - } + m_nVectorFieldForOrientation = 0 + }, + ] + m_Children = + [ + { + m_ChildRef = resource:"particles/cs2fixes/player_beacon_tint.vpcf" }, ] } \ No newline at end of file diff --git a/assets_source/particles/cs2fixes/admin_beacon.vpcf b/assets_source/particles/cs2fixes/player_beacon_tint.vpcf similarity index 65% rename from assets_source/particles/cs2fixes/admin_beacon.vpcf rename to assets_source/particles/cs2fixes/player_beacon_tint.vpcf index 4c09e2cdb..e34f57866 100644 --- a/assets_source/particles/cs2fixes/admin_beacon.vpcf +++ b/assets_source/particles/cs2fixes/player_beacon_tint.vpcf @@ -1,8 +1,8 @@ - + { _class = "CParticleSystemDefinition" m_nBehaviorVersion = 12 - m_nMaxParticles = 16 + m_nMaxParticles = 32 m_controlPointConfigurations = [ { @@ -133,7 +133,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 15.0 + m_flLiteralValue = 8.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -188,7 +188,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 250.0 + m_flLiteralValue = 230.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -243,7 +243,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 250.0 + m_flLiteralValue = 230.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -308,8 +308,8 @@ m_nScalarAttribute = 3 m_nVectorAttribute = 6 m_nVectorComponent = 0 - m_flRandomMin = 0.45 - m_flRandomMax = 0.45 + m_flRandomMin = 1.0 + m_flRandomMax = 1.0 m_bHasRandomSignFlip = false m_nRandomSeed = -1 m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" @@ -367,6 +367,17 @@ { _class = "C_OP_PositionLock" }, + { + _class = "C_OP_FadeAndKill" + m_flEndFadeInTime = 0.2 + m_flStartFadeOutTime = 0.35 + m_flEndFadeOutTime = 0.75 + m_flEndAlpha = -0.3 + }, + { + _class = "C_OP_DampenToCP" + m_flScale = 0.02 + }, ] m_Renderers = [ @@ -377,7 +388,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 1.3 + m_flLiteralValue = 1.4 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -428,60 +439,250 @@ m_vDomainMaxs = [ 0.0, 0.0 ] } } - m_flAlphaScale = + m_vecColorScale = { - m_nType = "PF_TYPE_LITERAL" - m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 0.8 + m_nType = "PVEC_TYPE_CP_VALUE" + m_vLiteralValue = [ 0.0, 0.0, 0.0 ] + m_LiteralColor = [ 255, 255, 255 ] m_NamedValue = "" - m_nControlPoint = 0 - m_nScalarAttribute = 3 + m_bFollowNamedValue = false m_nVectorAttribute = 6 - m_nVectorComponent = 0 - m_flRandomMin = 0.0 - m_flRandomMax = 1.0 - m_bHasRandomSignFlip = false - m_nRandomSeed = -1 - m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" - m_flLOD0 = 0.0 - m_flLOD1 = 0.0 - m_flLOD2 = 0.0 - m_flLOD3 = 0.0 - m_nNoiseInputVectorAttribute = 0 - m_flNoiseOutputMin = 0.0 - m_flNoiseOutputMax = 1.0 - m_flNoiseScale = 0.1 - m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] - m_flNoiseOffset = 0.0 - m_nNoiseOctaves = 1 - m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" - m_nNoiseType = "PF_NOISE_TYPE_PERLIN" - m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" - m_flNoiseTurbulenceScale = 1.0 - m_flNoiseTurbulenceMix = 0.5 - m_flNoiseImgPreviewScale = 1.0 - m_bNoiseImgPreviewLive = true - m_flNoCameraFallback = 0.0 - m_bUseBoundsCenter = false - m_nInputMode = "PF_INPUT_MODE_CLAMPED" - m_flMultFactor = 1.0 - m_flInput0 = 0.0 - m_flInput1 = 1.0 - m_flOutput0 = 0.0 - m_flOutput1 = 1.0 - m_flNotchedRangeMin = 0.0 - m_flNotchedRangeMax = 1.0 - m_flNotchedOutputOutside = 0.0 - m_flNotchedOutputInside = 1.0 - m_nBiasType = "PF_BIAS_TYPE_STANDARD" - m_flBiasParameter = 0.0 - m_Curve = + m_vVectorAttributeScale = [ 1.0, 1.0, 1.0 ] + m_nControlPoint = 1 + m_nDeltaControlPoint = 0 + m_vCPValueScale = [ 0.0039, 0.0039, 0.0039 ] + m_vCPRelativePosition = [ 0.0, 0.0, 0.0 ] + m_vCPRelativeDir = [ 1.0, 0.0, 0.0 ] + m_FloatComponentX = { - m_spline = [ ] - m_tangents = [ ] - m_vDomainMins = [ 0.0, 0.0 ] - m_vDomainMaxs = [ 0.0, 0.0 ] + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentY = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_FloatComponentZ = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } } + m_FloatInterp = + { + m_nType = "PF_TYPE_LITERAL" + m_nMapType = "PF_MAP_TYPE_DIRECT" + m_flLiteralValue = 0.0 + m_NamedValue = "" + m_nControlPoint = 0 + m_nScalarAttribute = 3 + m_nVectorAttribute = 6 + m_nVectorComponent = 0 + m_flRandomMin = 0.0 + m_flRandomMax = 1.0 + m_bHasRandomSignFlip = false + m_nRandomSeed = -1 + m_nRandomMode = "PF_RANDOM_MODE_CONSTANT" + m_flLOD0 = 0.0 + m_flLOD1 = 0.0 + m_flLOD2 = 0.0 + m_flLOD3 = 0.0 + m_nNoiseInputVectorAttribute = 0 + m_flNoiseOutputMin = 0.0 + m_flNoiseOutputMax = 1.0 + m_flNoiseScale = 0.1 + m_vecNoiseOffsetRate = [ 0.0, 0.0, 0.0 ] + m_flNoiseOffset = 0.0 + m_nNoiseOctaves = 1 + m_nNoiseTurbulence = "PF_NOISE_TURB_NONE" + m_nNoiseType = "PF_NOISE_TYPE_PERLIN" + m_nNoiseModifier = "PF_NOISE_MODIFIER_NONE" + m_flNoiseTurbulenceScale = 1.0 + m_flNoiseTurbulenceMix = 0.5 + m_flNoiseImgPreviewScale = 1.0 + m_bNoiseImgPreviewLive = true + m_flNoCameraFallback = 0.0 + m_bUseBoundsCenter = false + m_nInputMode = "PF_INPUT_MODE_CLAMPED" + m_flMultFactor = 1.0 + m_flInput0 = 0.0 + m_flInput1 = 1.0 + m_flOutput0 = 0.0 + m_flOutput1 = 1.0 + m_flNotchedRangeMin = 0.0 + m_flNotchedRangeMax = 1.0 + m_flNotchedOutputOutside = 0.0 + m_flNotchedOutputInside = 1.0 + m_nBiasType = "PF_BIAS_TYPE_STANDARD" + m_flBiasParameter = 0.0 + m_Curve = + { + m_spline = [ ] + m_tangents = [ ] + m_vDomainMins = [ 0.0, 0.0 ] + m_vDomainMaxs = [ 0.0, 0.0 ] + } + } + m_flInterpInput0 = 0.0 + m_flInterpInput1 = 1.0 + m_vInterpOutput0 = [ 0.0, 0.0, 0.0 ] + m_vInterpOutput1 = [ 1.0, 1.0, 1.0 ] + m_Gradient = + { + m_Stops = [ ] + } + m_vRandomMin = [ 0.0, 0.0, 0.0 ] + m_vRandomMax = [ 0.0, 0.0, 0.0 ] } m_vecTexturesInput = [ @@ -493,7 +694,7 @@ { m_nType = "PF_TYPE_LITERAL" m_nMapType = "PF_MAP_TYPE_DIRECT" - m_flLiteralValue = 2.0 + m_flLiteralValue = 4.0 m_NamedValue = "" m_nControlPoint = 0 m_nScalarAttribute = 3 @@ -600,12 +801,7 @@ m_vDomainMaxs = [ 0.0, 0.0 ] } } - }, - ] - m_Children = - [ - { - m_ChildRef = resource:"particles/cs2fixes/admin_beacon_inner.vpcf" + m_nColorBlendType = "PARTICLE_COLOR_BLEND_REPLACE" }, ] } \ No newline at end of file diff --git a/cfg/cs2fixes/cs2fixes.cfg b/cfg/cs2fixes/cs2fixes.cfg index 14a1f178b..51d41cd61 100644 --- a/cfg/cs2fixes/cs2fixes.cfg +++ b/cfg/cs2fixes/cs2fixes.cfg @@ -14,7 +14,7 @@ cs2f_fix_lag_comp_crash 0 // Whether to fix lag compensation crash with env_e cs2f_flashlight_enable 0 // Whether to enable flashlights cs2f_infinite_reserve_ammo 0 // Whether to enable infinite reserve ammo on weapons cs2f_block_entity_strings 0 // Whether to block adding entries in the EntityNames stringtable -cs2f_admin_beacon_particle "particles/testsystems/test_cross_product.vpcf" // Particle file to be used for admin beacon +cs2f_beacon_particle "particles/cs2fixes/player_beacon.vpcf" // .vpcf file to be precached and used for player beacon // Flashlight settings cs2f_flashlight_shadows 1 // Whether to enable flashlight shadows @@ -68,4 +68,11 @@ zr_human_win_overlay_material "" //Material override for human's win overlay pa zr_human_win_overlay_size 100 //Size of human's win overlay particle zr_zombie_win_overlay_particle "" //Screenspace particle to display when zombie win zr_zombie_win_overlay_material "" //Material override for zombie's win overlay particle -zr_zombie_win_overlay_size 100 //Size of zombie's win overlay particle \ No newline at end of file +zr_zombie_win_overlay_size 100 //Size of zombie's win overlay particle + +// Leader settings +cs2f_leader_enable 0 // Whether to enable Leader features +cs2f_leader_vote_ratio 0.15 // Vote ratio needed for player to become a leader +cs2f_leader_actions_ct_only 1 // Whether to allow leader actions (like !beacon) only from human team +cs2f_leader_mute_ping_no_leader 1 // Whether to mute player pings whenever there's no leader +cs2f_leader_model_path "" // Path to player model to be used for leaders \ No newline at end of file diff --git a/src/adminsystem.cpp b/src/adminsystem.cpp index 025f045ab..d7d2f13f3 100644 --- a/src/adminsystem.cpp +++ b/src/adminsystem.cpp @@ -44,10 +44,6 @@ CAdminSystem* g_pAdminSystem = nullptr; CUtlMap g_CommandList(0, 0, DefLessFunc(uint32)); -static std::string g_sBeaconParticle = "particles/testsystems/test_cross_product.vpcf"; - -FAKE_STRING_CVAR(cs2f_admin_beacon_particle, ".vpcf file to be precached and used for admin beacon", g_sBeaconParticle, false) - void PrintSingleAdminAction(const char* pszAdminName, const char* pszTargetName, const char* pszAction, const char* pszAction2 = "", const char* prefix = CHAT_PREFIX) { ClientPrintAll(HUD_PRINTTALK, "%s" ADMIN_PREFIX "%s %s%s.", prefix, pszAdminName, pszAction, pszTargetName, pszAction2); @@ -971,150 +967,6 @@ CON_COMMAND_CHAT_FLAGS(extend, " - extend current map (negative value r ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX ADMIN_PREFIX "extended map time %i minutes.", pszCommandPlayerName, iExtendTime); } -void PrecacheAdminBeaconParticle(IEntityResourceManifest* pResourceManifest) -{ - pResourceManifest->AddResource(g_sBeaconParticle.c_str()); -} - -void KillBeacon(int playerSlot) -{ - ZEPlayer* pPlayer = g_playerManager->GetPlayer(playerSlot); - - if (!pPlayer) - return; - - CParticleSystem* pParticle = pPlayer->GetBeaconParticle(); - - if (!pParticle) - return; - - pParticle->AcceptInput("DestroyImmediately"); - - // delayed Kill because default particle is being silly and remains floating if not Destroyed first - CHandle hParticle = pParticle->GetHandle(); - new CTimer(0.02f, false, [hParticle]() - { - CParticleSystem* particle = hParticle.Get(); - if (particle) - particle->AcceptInput("Kill"); - return -1.0f; - }); -} - -void CreateBeacon(int playerSlot) -{ - CCSPlayerController* pTarget = CCSPlayerController::FromSlot(playerSlot); - - Vector vecAbsOrigin = pTarget->GetPawn()->GetAbsOrigin(); - - vecAbsOrigin.z += 10; - - CParticleSystem* particle = (CParticleSystem*)CreateEntityByName("info_particle_system"); - - CEntityKeyValues* pKeyValues = new CEntityKeyValues(); - - pKeyValues->SetString("effect_name", g_sBeaconParticle.c_str()); - pKeyValues->SetInt("tint_cp", 1); - pKeyValues->SetVector("origin", vecAbsOrigin); - // ugly angle change because default particle is rotated - if (strcmp(g_sBeaconParticle.c_str(), "particles/testsystems/test_cross_product.vpcf") == 0) - pKeyValues->SetQAngle("angles", QAngle(90, 0, 0)); - - particle->DispatchSpawn(pKeyValues); - particle->SetParent(pTarget->GetPawn()); - - ZEPlayer* pPlayer = g_playerManager->GetPlayer(playerSlot); - - pPlayer->SetBeaconParticle(particle); - - CHandle hParticle = particle->GetHandle(); - - // timer persists through map change so serial reset on StartupServer is not needed - new CTimer(0.0f, true, [playerSlot, hParticle]() - { - CCSPlayerController* pPlayer = CCSPlayerController::FromSlot(playerSlot); - - if (!pPlayer || pPlayer->m_iTeamNum < CS_TEAM_T || !pPlayer->GetPlayerPawn()->IsAlive()) - { - KillBeacon(playerSlot); - return -1.0f; - } - - CParticleSystem* pParticle = hParticle.Get(); - - if (!pParticle) - { - return -1.0f; - } - - // team-based tint of Control Point 1 - if (pPlayer->m_iTeamNum == CS_TEAM_T) - pParticle->m_clrTint->SetColor(185, 93, 63, 255); - else - pParticle->m_clrTint->SetColor(40, 100, 255, 255); - - pParticle->AcceptInput("Start"); - // delayed DestroyImmediately input so particle effect can be replayed (and default particle doesn't bug out) - new CTimer(0.5f, false, [hParticle]() - { - CParticleSystem* particle = hParticle.Get(); - if (particle) - particle->AcceptInput("DestroyImmediately"); - return -1.0f; - }); - - return 1.0f; - }); -} - -void PerformBeacon(int playerSlot) -{ - ZEPlayer *pPlayer = g_playerManager->GetPlayer(playerSlot); - - if (!pPlayer->GetBeaconParticle()) - CreateBeacon(playerSlot); - else - KillBeacon(playerSlot); -} - -CON_COMMAND_CHAT_FLAGS(beacon, "Toggle beacon on a player", ADMFLAG_GENERIC) -{ - if (args.ArgC() < 2) - { - ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !beacon "); - return; - } - - int iCommandPlayer = player ? player->GetPlayerSlot() : -1; - int iNumClients = 0; - int pSlots[MAXPLAYERS]; - - ETargetType nType = g_playerManager->TargetPlayerString(iCommandPlayer, args[1], iNumClients, pSlots); - - if (!iNumClients) - { - ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); - return; - } - - const char *pszCommandPlayerName = player ? player->GetPlayerName() : "Console"; - - for (int i = 0; i < iNumClients; i++) - { - CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlots[i]); - - if (!pTarget) - continue; - - PerformBeacon(pSlots[i]); - - if (nType < ETargetType::ALL) - PrintSingleAdminAction(pszCommandPlayerName, pTarget->GetPlayerName(), "toggled beacon on"); - } - - PrintMultiAdminAction(nType, pszCommandPlayerName, "toggled beacon on"); -} - bool CAdminSystem::LoadAdmins() { m_vecAdmins.Purge(); diff --git a/src/adminsystem.h b/src/adminsystem.h index 287f96270..8371280ce 100644 --- a/src/adminsystem.h +++ b/src/adminsystem.h @@ -156,6 +156,4 @@ class CAdminSystem CUtlVector m_vecInfractions; }; -extern CAdminSystem *g_pAdminSystem; - -void PrecacheAdminBeaconParticle(IEntityResourceManifest* pResourceManifest); \ No newline at end of file +extern CAdminSystem *g_pAdminSystem; \ No newline at end of file diff --git a/src/cs2_sdk/entity/cbaseentity.h b/src/cs2_sdk/entity/cbaseentity.h index 1dfb2214c..5ac98d62b 100644 --- a/src/cs2_sdk/entity/cbaseentity.h +++ b/src/cs2_sdk/entity/cbaseentity.h @@ -91,6 +91,22 @@ class CBodyComponent SCHEMA_FIELD(CGameSceneNode *, m_pSceneNode) }; +class CModelState +{ +public: + DECLARE_SCHEMA_CLASS(CModelState) + + SCHEMA_FIELD(CUtlSymbolLarge, m_ModelName) +}; + +class CSkeletonInstance : CGameSceneNode +{ +public: + DECLARE_SCHEMA_CLASS(CSkeletonInstance) + + SCHEMA_FIELD(CModelState, m_modelState) +}; + class CEntitySubclassVDataBase { public: @@ -217,6 +233,11 @@ class Z_CBaseEntity : public CBaseEntity } const char* GetName() const { return m_pEntity->m_name.String(); } + + const char* GetModelName() + { + return ((CSkeletonInstance*)m_CBodyComponent->m_pSceneNode.Get())->m_modelState().m_ModelName.Get().String(); + } }; class SpawnPoint : public Z_CBaseEntity diff --git a/src/cs2_sdk/entity/cbasemodelentity.h b/src/cs2_sdk/entity/cbasemodelentity.h index 163f30ff4..840e9d0fb 100644 --- a/src/cs2_sdk/entity/cbasemodelentity.h +++ b/src/cs2_sdk/entity/cbasemodelentity.h @@ -30,6 +30,7 @@ class CBaseModelEntity : public Z_CBaseEntity SCHEMA_FIELD(CCollisionProperty , m_Collision) SCHEMA_FIELD(CGlowProperty, m_Glow) SCHEMA_FIELD(Color, m_clrRender) + SCHEMA_FIELD(RenderMode_t, m_nRenderMode) void SetModel(const char *szModel) { diff --git a/src/cs2_sdk/entity/globaltypes.h b/src/cs2_sdk/entity/globaltypes.h index 2311b7a1b..3e8193f07 100644 --- a/src/cs2_sdk/entity/globaltypes.h +++ b/src/cs2_sdk/entity/globaltypes.h @@ -227,7 +227,9 @@ class CGlowProperty SCHEMA_FIELD(Vector, m_fGlowColor) SCHEMA_FIELD(int, m_iGlowType) + SCHEMA_FIELD(int, m_iGlowTeam) SCHEMA_FIELD(int, m_nGlowRange) + SCHEMA_FIELD(int, m_nGlowRangeMin) SCHEMA_FIELD(Color, m_glowColorOverride) SCHEMA_FIELD(bool, m_bFlashing) SCHEMA_FIELD(bool, m_bGlowing) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index f327172e2..f5a697194 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -52,6 +52,8 @@ #include "serversideclient.h" #include "te.pb.h" #include "cs_gameevents.pb.h" +#include "gameevents.pb.h" +#include "leader.h" #define VPROF_ENABLED #include "tier0/vprof.h" @@ -510,6 +512,11 @@ void CS2Fixes::Hook_PostEvent(CSplitScreenSlot nSlot, bool bLocalOnly, int nClie { *(uint64 *)clients &= ~g_playerManager->GetStopDecalsMask(); } + else if (info->m_MessageId == GE_Source1LegacyGameEvent) + { + if (g_bEnableLeader) + Leader_PostEventAbstract_Source1LegacyGameEvent(clients, pData); + } } void CS2Fixes::AllPluginsLoaded() @@ -709,7 +716,9 @@ void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo **ppInfoList, int infoCount // Hide players marked as hidden or ANY dead player, it seems that a ragdoll of a previously hidden player can crash? // TODO: Revert this if/when valve fixes the issue? - if (pSelfZEPlayer->ShouldBlockTransmit(j) || !pPawn->IsAlive()) + // Also do not hide leaders to other players + ZEPlayer *pOtherZEPlayer = g_playerManager->GetPlayer(j); + if (pSelfZEPlayer->ShouldBlockTransmit(j) || !pPawn->IsAlive() || (pOtherZEPlayer && !pOtherZEPlayer->IsLeader())) pInfo->m_pTransmitEntity->Clear(pPawn->entindex()); } } diff --git a/src/events.cpp b/src/events.cpp index 50f639b5a..2551c567c 100644 --- a/src/events.cpp +++ b/src/events.cpp @@ -26,6 +26,8 @@ #include "entity/cgamerules.h" #include "zombiereborn.h" #include "votemanager.h" +#include "leader.h" +#include "recipientfilters.h" #include "tier0/memdbgon.h" @@ -180,6 +182,9 @@ GAME_EVENT_F(round_start) if (g_bEnableZR) ZR_OnRoundStart(pEvent); + if (g_bEnableLeader) + Leader_OnRoundStart(pEvent); + if (!g_bEnableTopDefender) return; @@ -274,4 +279,10 @@ GAME_EVENT_F(round_time_warning) { if (g_bEnableZR) ZR_OnRoundTimeWarning(pEvent); +} + +GAME_EVENT_F(bullet_impact) +{ + if (g_bEnableLeader) + Leader_BulletImpact(pEvent); } \ No newline at end of file diff --git a/src/gamesystem.cpp b/src/gamesystem.cpp index 86d9546d0..838676ee5 100644 --- a/src/gamesystem.cpp +++ b/src/gamesystem.cpp @@ -22,7 +22,8 @@ #include "addresses.h" #include "gamesystem.h" #include "zombiereborn.h" -#include "adminsystem.h" +#include "playermanager.h" +#include "leader.h" extern CGameConfig *g_GameConfig; @@ -69,7 +70,8 @@ GS_EVENT_MEMBER(CGameSystem, BuildGameSessionManifest) // pResourceManifest->AddResource("characters/models/my_character_model.vmdl"); ZR_Precache(pResourceManifest); - PrecacheAdminBeaconParticle(pResourceManifest); + PrecacheBeaconParticle(pResourceManifest); + Leader_Precache(pResourceManifest); } // Called every frame before entities think diff --git a/src/leader.cpp b/src/leader.cpp new file mode 100644 index 000000000..143afee80 --- /dev/null +++ b/src/leader.cpp @@ -0,0 +1,955 @@ +/** + * ============================================================================= + * CS2Fixes + * Copyright (C) 2023-2024 Source2ZE + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#include "leader.h" +#include "common.h" +#include "commands.h" +#include "gameevents.pb.h" +#include "zombiereborn.h" + +#include "tier0/memdbgon.h" + +extern IVEngineServer2 *g_pEngineServer2; +extern CGameEntitySystem *g_pEntitySystem; +extern CGlobalVars *gpGlobals; +extern IGameEventManager2 *g_gameEventManager; + +LeaderColor LeaderColorMap[] = { + {"white", Color(255, 255, 255, 255)}, // default if color finding func doesn't match any other color + {"blue", Color(40, 100, 255, 255)}, // Default CT color and first leader index + {"orange", Color(185, 93, 63, 255)}, // Default T color + {"green", Color(100, 230, 100, 255)}, + {"yellow", Color(200, 200, 0, 255)}, + {"purple", Color(79, 9, 146, 255)}, + {"red", Color(214, 39, 40, 255)}, // Last leader index +}; + +const size_t g_nLeaderColorMapSize = sizeof(LeaderColorMap) / sizeof(LeaderColor); +CUtlVector g_vecLeaders; +int g_iLeaderIndex = 0; + +// CONVAR_TODO +bool g_bEnableLeader = false; +static float g_flLeaderVoteRatio = 0.15; +static bool g_bLeaderActionsHumanOnly = true; +static bool g_bMutePingsIfNoLeader = true; +static std::string g_szLeaderModelPath = ""; + +FAKE_BOOL_CVAR(cs2f_leader_enable, "Whether to enable Leader features", g_bEnableLeader, false, false) +FAKE_FLOAT_CVAR(cs2f_leader_vote_ratio, "Vote ratio needed for player to become a leader", g_flLeaderVoteRatio, 0.2f, false) +FAKE_BOOL_CVAR(cs2f_leader_actions_ct_only, "Whether to allow leader actions (like !ldbeacon) only from human team", g_bLeaderActionsHumanOnly, true, false) +FAKE_BOOL_CVAR(cs2f_leader_mute_ping_no_leader, "Whether to mute player pings whenever there's no leader", g_bMutePingsIfNoLeader, true, false) +FAKE_STRING_CVAR(cs2f_leader_model_path, "Path to player model to be used for leaders", g_szLeaderModelPath, false) + +int Leader_GetNeededLeaderVoteCount() +{ + int iOnlinePlayers = 0; + + for (int i = 0; i < gpGlobals->maxClients; i++) + { + ZEPlayer* pPlayer = g_playerManager->GetPlayer(i); + + if (pPlayer && !pPlayer->IsFakeClient()) + { + iOnlinePlayers++; + } + } + + return (int)(iOnlinePlayers * g_flLeaderVoteRatio) + 1; +} + +Color Leader_ColorFromString(const char* pszColorName) +{ + int iColorIndex = V_StringToInt32(pszColorName, -1); + + if (iColorIndex > -1) + return LeaderColorMap[min(iColorIndex, g_nLeaderColorMapSize-1)].clColor; + + for (int i = 0; i < g_nLeaderColorMapSize; i++) + { + if (!V_stricmp(pszColorName, LeaderColorMap[i].pszColorName)) + { + return LeaderColorMap[i].clColor; + } + } + + return LeaderColorMap[0].clColor; +} + +bool Leader_NoLeaders() +{ + int iValidLeaders = 0; + FOR_EACH_VEC_BACK(g_vecLeaders, i) + { + if (g_vecLeaders[i].IsValid()) + iValidLeaders++; + else + g_vecLeaders.Remove(i); + } + + return !((bool)iValidLeaders); +} + +void Leader_ApplyLeaderVisuals(CCSPlayerPawn *pPawn) +{ + CCSPlayerController *pController = CCSPlayerController::FromPawn(pPawn); + ZEPlayer *pPlayer = g_playerManager->GetPlayer(pController->GetPlayerSlot()); + + if (!g_szLeaderModelPath.empty()) + { + pPawn->SetModel(g_szLeaderModelPath.c_str()); + pPawn->AcceptInput("Skin", 0); + } + + pPawn->m_clrRender = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; +} + +void Leader_RemoveLeaderVisuals(CCSPlayerPawn *pPawn) +{ + g_pZRPlayerClassManager->ApplyPreferredOrDefaultHumanClassVisuals(pPawn); +} + +void Leader_CreateDefendMarker(ZEPlayer *pPlayer, Color clrTint, int iDuration) +{ + CCSPlayerController *pController = CCSPlayerController::FromSlot(pPlayer->GetPlayerSlot()); + CCSPlayerPawn *pPawn = (CCSPlayerPawn *)pController->GetPawn(); + + CParticleSystem *pMarker = (CParticleSystem *)CreateEntityByName("info_particle_system"); + + Vector vecOrigin = pPawn->GetAbsOrigin(); + vecOrigin.z += 10; + + CEntityKeyValues* pKeyValues = new CEntityKeyValues(); + + pKeyValues->SetString("effect_name", "particles/cs2fixes/leader_defend_mark.vpcf"); + pKeyValues->SetInt("tint_cp", 1); + pKeyValues->SetColor("tint_cp_color", clrTint); + pKeyValues->SetVector("origin", vecOrigin); + pKeyValues->SetBool("start_active", true); + + pMarker->DispatchSpawn(pKeyValues); + + UTIL_AddEntityIOEvent(pMarker, "DestroyImmediately", nullptr, nullptr, "", iDuration); + UTIL_AddEntityIOEvent(pMarker, "Kill", nullptr, nullptr, "", iDuration + 0.02f); +} + +void Leader_PostEventAbstract_Source1LegacyGameEvent(const uint64 *clients, const void *pData) +{ + if (!g_bEnableLeader) + return; + + static int player_ping_id = g_gameEventManager->LookupEventId("player_ping"); + + if (((CMsgSource1LegacyGameEvent*)pData)->eventid() != player_ping_id) + return; + + // Don't kill ping visual when there's no leader, only mute the ping depending on cvar + if (Leader_NoLeaders()) + { + if (g_bMutePingsIfNoLeader) + *(uint64 *)clients = 0; + + return; + } + + IGameEvent *pEvent = g_gameEventManager->UnserializeEvent(*(CMsgSource1LegacyGameEvent*)pData); + + ZEPlayer *pPlayer = g_playerManager->GetPlayer(pEvent->GetPlayerSlot("userid")); + CCSPlayerController *pController = CCSPlayerController::FromSlot(pEvent->GetPlayerSlot("userid")); + CBaseEntity *pEntity = g_pEntitySystem->GetBaseEntity(pEvent->GetEntityIndex("entityid")); + + g_gameEventManager->FreeEvent(pEvent); + + // no reason to block zombie pings. sound affected by sound block cvar + if (pController->m_iTeamNum == CS_TEAM_T) + { + if (g_bMutePingsIfNoLeader) + *(uint64 *)clients = 0; + + return; + } + + // allow leader human pings + if (pPlayer->IsLeader()) + return; + + // Remove entity responsible for visual part of the ping + addresses::UTIL_Remove(pEntity); + + // Block clients from playing the ping sound + *(uint64 *)clients = 0; +} + +void Leader_OnRoundStart(IGameEvent *pEvent) +{ + for (int i = 0; i < gpGlobals->maxClients; i++) + { + ZEPlayer *pPlayer = g_playerManager->GetPlayer((CPlayerSlot)i); + + if (pPlayer && !pPlayer->IsLeader()) + pPlayer->SetLeaderTracer(0); + } +} + +// revisit this later with a TempEnt implementation +void Leader_BulletImpact(IGameEvent *pEvent) +{ + ZEPlayer *pPlayer = g_playerManager->GetPlayer(pEvent->GetPlayerSlot("userid")); + + if (!pPlayer) + return; + + int iTracerIndex = pPlayer->GetLeaderTracer(); + + if (!iTracerIndex) + return; + + CCSPlayerPawn *pPawn = (CCSPlayerPawn *)pEvent->GetPlayerPawn("userid"); + CBasePlayerWeapon *pWeapon = pPawn->m_pWeaponServices->m_hActiveWeapon.Get(); + + CParticleSystem* particle = (CParticleSystem*)CreateEntityByName("info_particle_system"); + + // Teleport particle to muzzle_flash attachment of player's weapon + particle->AcceptInput("SetParent", "!activator", pWeapon, nullptr); + particle->AcceptInput("SetParentAttachment", "muzzle_flash"); + + CEntityKeyValues* pKeyValues = new CEntityKeyValues(); + + // Event contains other end of the particle + Vector vecData = Vector(pEvent->GetFloat("x"), pEvent->GetFloat("y"), pEvent->GetFloat("z")); + Color clTint = LeaderColorMap[iTracerIndex].clColor; + + pKeyValues->SetString("effect_name", "particles/cs2fixes/leader_tracer.vpcf"); + pKeyValues->SetInt("data_cp", 1); + pKeyValues->SetVector("data_cp_value", vecData); + pKeyValues->SetInt("tint_cp", 2); + pKeyValues->SetColor("tint_cp_color", clTint); + pKeyValues->SetBool("start_active", true); + + particle->DispatchSpawn(pKeyValues); + + UTIL_AddEntityIOEvent(particle, "DestroyImmediately", nullptr, nullptr, "", 0.1f); + UTIL_AddEntityIOEvent(particle, "Kill", nullptr, nullptr, "", 0.12f); +} + +void Leader_Precache(IEntityResourceManifest *pResourceManifest) +{ + if (!g_szLeaderModelPath.empty()) + pResourceManifest->AddResource(g_szLeaderModelPath.c_str()); + pResourceManifest->AddResource("particles/cs2fixes/leader_tracer.vpcf"); + pResourceManifest->AddResource("particles/cs2fixes/leader_defend_mark.vpcf"); +} + +CON_COMMAND_CHAT(vl, " - Vote for a player to become a leader") +{ + if (!g_bEnableLeader) + return; + + if (!player) + { + ClientPrint(player, HUD_PRINTCONSOLE, CHAT_PREFIX "You cannot use this command from the server console."); + return; + } + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !vl "); + return; + } + + int iPlayerSlot = player->GetPlayerSlot(); + int iNumClients = 0; + int pSlot[MAXPLAYERS]; + + ZEPlayer* pPlayer = g_playerManager->GetPlayer(iPlayerSlot); + + if (pPlayer->GetLeaderVoteTime() + 30.0f > gpGlobals->curtime) + { + int iRemainingTime = (int)(pPlayer->GetLeaderVoteTime() + 30.0f - gpGlobals->curtime); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Wait %i seconds before you can !vl again.", iRemainingTime); + return; + } + + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlot); + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must target a specific player."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + if (!pTarget) + return; + + ZEPlayer* pPlayerTarget = g_playerManager->GetPlayer(pSlot[0]); + + if (pPlayerTarget->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "%s is already a Leader.", pTarget->GetPlayerName()); + return; + } + + if (pPlayerTarget->HasPlayerVotedLeader(pPlayer)) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You have already voted for %s to become a leader.", pTarget->GetPlayerName()); + return; + } + + int iLeaderVoteCount = pPlayerTarget->GetLeaderVoteCount(); + int iNeededLeaderVoteCount = Leader_GetNeededLeaderVoteCount(); + + pPlayer->SetLeaderVoteTime(gpGlobals->curtime); + + if (iLeaderVoteCount + 1 >= iNeededLeaderVoteCount) + { + pPlayerTarget->SetLeader(++g_iLeaderIndex); + pPlayerTarget->PurgeLeaderVotes(); + pPlayerTarget->SetLeaderTracer(g_iLeaderIndex); + g_vecLeaders.AddToTail(pPlayerTarget->GetHandle()); + + if (pTarget->m_iTeamNum == CS_TEAM_CT) + { + CCSPlayerPawn *pPawn = (CCSPlayerPawn *)pTarget->GetPawn(); + Leader_ApplyLeaderVisuals(pPawn); + } + + Message("%s was voted for Leader with %i vote(s). LeaderIndex = %i\n", pTarget->GetPlayerName(), iNeededLeaderVoteCount, g_iLeaderIndex); + + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "%s is now a Leader!", pTarget->GetPlayerName()); + + // apply apparent leader perks (like leader model, glow(?)) here + // also run a timer somewhere (per player or global) to reapply them + + return; + } + + pPlayerTarget->AddLeaderVote(pPlayer); + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "%s wants %s to become a Leader (%i/%i votes).",\ + player->GetPlayerName(), pTarget->GetPlayerName(), iLeaderVoteCount+1, iNeededLeaderVoteCount); +} + +CON_COMMAND_CHAT(defend, "[name|duration] [duration] - place a defend marker on you or target player") +{ + if (!g_bEnableLeader) + return; + + if (!player) + { + ClientPrint(player, HUD_PRINTCONSOLE, CHAT_PREFIX "You cannot use this command from the server console."); + return; + } + + int iPlayerSlot = player->GetPlayerSlot(); + + ZEPlayer* pPlayer = g_playerManager->GetPlayer(iPlayerSlot); + + if (!pPlayer->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a leader to use this command."); + return; + } + + if (player->m_iTeamNum != CS_TEAM_CT && g_bLeaderActionsHumanOnly) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a human to use this command."); + return; + } + + // no arguments, place default duration marker on player + if (args.ArgC() < 2) + { + if (player->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place defend marker on a human."); + return; + } + + Leader_CreateDefendMarker(pPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, 30); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on yourself lasting 30 seconds."); + return; + } + + int iNumClients = 0; + int pSlot[MAXPLAYERS]; + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlot); + + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must target a specific player."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + // 1 argument, check if it's target or duration + if (args.ArgC() == 2) + { + if (iNumClients) // valid target + { + CCSPlayerController *pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + if (!pTarget) + return; + + if (pTarget->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place defend marker on a human."); + return; + } + + ZEPlayer* pTargetPlayer = g_playerManager->GetPlayer(pSlot[0]); + + Leader_CreateDefendMarker(pTargetPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, 30); + + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on %s lasting 30 seconds.", pTarget->GetPlayerName()); + + return; + } + + if (player->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place defend marker on a human."); + return; + } + + int iArg1 = V_StringToInt32(args[1], -1); + + if (iArg1 == -1) // target not found AND assume it's not a valid number + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iArg1 < 1) + { + Leader_CreateDefendMarker(pPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, 30); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on yourself lasting 30 seconds."); + return; + } + + iArg1 = min(iArg1, 60); + + Leader_CreateDefendMarker(pPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, iArg1); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on yourself lasting %i seconds.", iArg1); + return; + } + + // args.ArgC() > 2 + + if (!iNumClients) // 2 args provided, so invalid target is No Target + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + CCSPlayerController *pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + + if (!pTarget) + return; + + if (pTarget->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place defend marker on a human."); + return; + } + + ZEPlayer* pTargetPlayer = g_playerManager->GetPlayer(pSlot[0]); + + + int iArg2 = V_StringToInt32(args[2], -1); + + if (iArg2 < 1) // assume it's not a valid number + { + Leader_CreateDefendMarker(pTargetPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, 30); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on %s lasting 30 seconds.", pTarget->GetPlayerName()); + return; + } + + iArg2 = min(iArg2, 60); + + Leader_CreateDefendMarker(pTargetPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, iArg2); + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on %s lasting %i seconds.", pTarget->GetPlayerName(), iArg2); +} + +CON_COMMAND_CHAT(tracer, " [color] - toggle projectile tracers on a player") +{ + if (!g_bEnableLeader) + return; + + if (!player) + { + ClientPrint(player, HUD_PRINTCONSOLE, CHAT_PREFIX "You cannot use this command from the server console."); + return; + } + + int iPlayerSlot = player->GetPlayerSlot(); + + ZEPlayer* pPlayer = g_playerManager->GetPlayer(iPlayerSlot); + + if (!pPlayer->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a leader to use this command."); + return; + } + + if (player->m_iTeamNum != CS_TEAM_CT && g_bLeaderActionsHumanOnly) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a human to use this command."); + return; + } + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !tracer [color]"); + return; + } + + int iNumClients = 0; + int pSlot[MAXPLAYERS]; + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlot); + + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must target a specific player."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + if (!pTarget) + return; + + if (pTarget->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only toggle tracers on a human."); + return; + } + + ZEPlayer* pPlayerTarget = g_playerManager->GetPlayer(pSlot[0]); + + if (pPlayerTarget->GetLeaderTracer()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Disabled tracers for player %s.", pTarget->GetPlayerName()); + pPlayerTarget->SetLeaderTracer(0); + return; + } + + int iTracerIndex = 0; + if (args.ArgC() < 3) + iTracerIndex = pPlayer->GetLeaderIndex(); + else + { + int iIndex = V_StringToInt32(args[2], -1); + + if (iIndex > -1) + iTracerIndex = min(iIndex, g_nLeaderColorMapSize-1); + else + { + for (int i = 0; i < g_nLeaderColorMapSize; i++) + { + if (!V_stricmp(args[2], LeaderColorMap[i].pszColorName)) + { + iTracerIndex = i; + break; + } + } + } + } + + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Enabled tracers for player %s.", pTarget->GetPlayerName()); + pPlayerTarget->SetLeaderTracer(iTracerIndex); +} + +CON_COMMAND_CHAT(beacon, " [color] - toggle beacon on a player") +{ + int iPlayerSlot = player ? player->GetPlayerSlot() : -1; + ZEPlayer* pPlayer = g_playerManager->GetPlayer((CPlayerSlot)iPlayerSlot); + + bool bIsAdmin; + if (pPlayer) + bIsAdmin = pPlayer->IsAdminFlagSet(ADMFLAG_GENERIC); + else // console + bIsAdmin = true; + + int iNumClients = 0; + int pSlots[MAXPLAYERS]; + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlots); + + if (bIsAdmin) // Admin beacon logic + { + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !beacon [color]"); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + const char* pszCommandPlayerName = player ? player->GetPlayerName() : "Console"; + + Color color; + if (args.ArgC() == 3) + color = Leader_ColorFromString(args[2]); + + for (int i = 0; i < iNumClients; i++) + { + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlots[i]); + + if (!pTarget) + continue; + + // Exception - Use LeaderIndex color if Admin is also a Leader + if (args.ArgC() == 2 && pPlayer && pPlayer->IsLeader()) + color = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; + else if (args.ArgC() == 2) + color = pTarget->m_iTeamNum == CS_TEAM_T ? LeaderColorMap[2].clColor/*orange*/ : LeaderColorMap[1].clColor/*blue*/; + + ZEPlayer *pPlayerTarget = g_playerManager->GetPlayer(pSlots[i]); + + if (!pPlayerTarget->GetBeaconParticle()) + pPlayerTarget->StartBeacon(color, pPlayer->GetHandle()); + else + pPlayerTarget->EndBeacon(); + + if (nTargetType < ETargetType::ALL) + PrintSingleAdminAction(pszCommandPlayerName, pTarget->GetPlayerName(), "toggled beacon on", "", CHAT_PREFIX); + } + + PrintMultiAdminAction(nTargetType, pszCommandPlayerName, "toggled beacon on", "", CHAT_PREFIX); + + return; + } + + // Leader beacon logic + + if (!g_bEnableLeader) + return; + + if (!pPlayer->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a Leader or an Admin to use this command."); + return; + } + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !beacon [color]"); + return; + } + + if (player->m_iTeamNum != CS_TEAM_CT && g_bLeaderActionsHumanOnly) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a human to use this command."); + return; + } + + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must target a specific player."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlots[0]); + + if (!pTarget) + return; + + if (pTarget->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place Leader beacon on a human."); + return; + } + + Color color; + if (args.ArgC() == 3) + color = Leader_ColorFromString(args[2]); + else + color = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; + + ZEPlayer *pPlayerTarget = g_playerManager->GetPlayer(pSlots[0]); + + if (!pPlayerTarget->GetBeaconParticle()) + { + pPlayerTarget->StartBeacon(color, pPlayer->GetHandle()); + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "Leader %s enabled beacon on %s.", player->GetPlayerName(), pTarget->GetPlayerName()); + } + else + { + pPlayerTarget->EndBeacon(); + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "Leader %s disabled beacon on %s.", player->GetPlayerName(), pTarget->GetPlayerName()); + } +} + +CON_COMMAND_CHAT(leaders, "- list all current leaders") +{ + if (!g_bEnableLeader) + return; + + int iDestination = player ? HUD_PRINTTALK : HUD_PRINTCONSOLE; + + if (Leader_NoLeaders()) // also wipes any invalid entries from g_vecLeaders + { + ClientPrint(player, iDestination, CHAT_PREFIX "There are currently no leaders."); + return; + } + + ClientPrint(player, iDestination, CHAT_PREFIX "List of current leaders:"); + + FOR_EACH_VEC(g_vecLeaders, i) + { + ZEPlayer *pLeader = g_vecLeaders[i].Get(); + CCSPlayerController *pController = CCSPlayerController::FromSlot((CPlayerSlot) pLeader->GetPlayerSlot()); + + ClientPrint(player, iDestination, CHAT_PREFIX "%s", pController->GetPlayerName()); + } +} + +CON_COMMAND_CHAT(leaderhelp, "- list leader commands in chat") +{ + if (!g_bEnableLeader) + return; + + int iDestination = player ? HUD_PRINTTALK : HUD_PRINTCONSOLE; + + ClientPrint(player, iDestination, CHAT_PREFIX "List of leader commands:"); + ClientPrint(player, iDestination, CHAT_PREFIX "!beacon [color] - place a beacon on player"); + ClientPrint(player, iDestination, CHAT_PREFIX "!tracer [color] - give player tracers"); + ClientPrint(player, iDestination, CHAT_PREFIX "!defend [name|duration] [duration] - place defend mark on player"); +} + +CON_COMMAND_CHAT(leadercolors, "- list leader colors in chat") +{ + if (!g_bEnableLeader) + return; + + int iDestination = player ? HUD_PRINTTALK : HUD_PRINTCONSOLE; + + ClientPrint(player, iDestination, CHAT_PREFIX "List of leader colors:"); + for (int i = 0; i < g_nLeaderColorMapSize; i++) + { + ClientPrint(player, iDestination, CHAT_PREFIX "%i - %s", i, LeaderColorMap[i].pszColorName); + } +} + +CON_COMMAND_CHAT_FLAGS(forceld, " [color]- forces leader status on a player", ADMFLAG_GENERIC) +{ + if (!g_bEnableLeader) + return; + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !forceld [index]"); + return; + } + + int iPlayerSlot = player ? player->GetPlayerSlot() : -1; + int iNumClients = 0; + int pSlot[MAXPLAYERS]; + + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlot); + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only force specific player to be a leader."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + const char* pszCommandPlayerName = player ? player->GetPlayerName() : "Console"; + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + if (!pTarget) + return; + + ZEPlayer* pPlayerTarget = g_playerManager->GetPlayer(pSlot[0]); + + if (pPlayerTarget->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "%s is already a leader.", pTarget->GetPlayerName()); + return; + } + + if (args.ArgC() < 3) + { + pPlayerTarget->SetLeader(++g_iLeaderIndex); + pPlayerTarget->SetLeaderTracer(g_iLeaderIndex); + } + else + { + int iColorIndex = V_StringToInt32(args[2], -1); + + if (iColorIndex > -1) + { + iColorIndex = min(iColorIndex, g_nLeaderColorMapSize-1); + } + else + { + for (int i = 0; i < g_nLeaderColorMapSize; i++) + { + if (!V_stricmp(args[2], LeaderColorMap[i].pszColorName)) + { + iColorIndex = i; + break; + } + } + } + + if (iColorIndex > -1) + { + pPlayerTarget->SetLeader(iColorIndex); + pPlayerTarget->SetLeaderTracer(iColorIndex); + } + else + { + pPlayerTarget->SetLeader(++g_iLeaderIndex); + pPlayerTarget->SetLeaderTracer(g_iLeaderIndex); + } + } + + if (pTarget->m_iTeamNum == CS_TEAM_CT) + Leader_ApplyLeaderVisuals((CCSPlayerPawn *)pTarget->GetPawn()); + + pPlayerTarget->PurgeLeaderVotes(); + g_vecLeaders.AddToTail(pPlayerTarget->GetHandle()); + + PrintSingleAdminAction(pszCommandPlayerName, pTarget->GetPlayerName(), "forced", " to be a Leader", CHAT_PREFIX); +} + +CON_COMMAND_CHAT_FLAGS(stripld, " - strips leader status from a player", ADMFLAG_GENERIC) +{ + if (!g_bEnableLeader) + return; + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !stripld "); + return; + } + + int iPlayerSlot = player ? player->GetPlayerSlot() : -1; + int iNumClients = 0; + int pSlot[MAXPLAYERS]; + + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlot); + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only strip leader from a specific player."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + const char* pszCommandPlayerName = player ? player->GetPlayerName() : "Console"; + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlot[0]); + + if (!pTarget) + return; + + ZEPlayer* pPlayerTarget = g_playerManager->GetPlayer(pSlot[0]); + + if (!pPlayerTarget->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "%s is not a leader.", pTarget->GetPlayerName()); + return; + } + + pPlayerTarget->SetLeader(0); + pPlayerTarget->SetLeaderTracer(0); + FOR_EACH_VEC(g_vecLeaders, i) + { + if (g_vecLeaders[i] == pPlayerTarget) + { + g_vecLeaders.Remove(i); + break; + } + } + + if (pTarget->m_iTeamNum == CS_TEAM_CT) + Leader_RemoveLeaderVisuals((CCSPlayerPawn *)pTarget->GetPawn()); + + PrintSingleAdminAction(pszCommandPlayerName, pTarget->GetPlayerName(), "stripped leader from ", "", CHAT_PREFIX); +} \ No newline at end of file diff --git a/src/leader.h b/src/leader.h new file mode 100644 index 000000000..9d37cb502 --- /dev/null +++ b/src/leader.h @@ -0,0 +1,44 @@ +/** + * ============================================================================= + * CS2Fixes + * Copyright (C) 2023-2024 Source2ZE + * ============================================================================= + * + * This program is free software; you can redistribute it and/or modify it under + * the terms of the GNU General Public License, version 3.0, as published by the + * Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS + * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more + * details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ + +#pragma once +#include "utils/entity.h" +#include "playermanager.h" +#include "gamesystem.h" +#include "igameevents.h" + +struct LeaderColor +{ + const char* pszColorName; + Color clColor; +}; + +extern LeaderColor LeaderColorMap[]; +extern const size_t g_nLeaderColorMapSize; +extern CUtlVector g_vecLeaders; +extern int g_iLeaderIndex; + +extern bool g_bEnableLeader; + +bool Leader_NoLeaders(); +void Leader_ApplyLeaderVisuals(CCSPlayerPawn *pPawn); +void Leader_PostEventAbstract_Source1LegacyGameEvent(const uint64 *clients, const void* pData); +void Leader_OnRoundStart(IGameEvent *pEvent); +void Leader_BulletImpact(IGameEvent *pEvent); +void Leader_Precache(IEntityResourceManifest *pResourceManifest); \ No newline at end of file diff --git a/src/playermanager.cpp b/src/playermanager.cpp index 4f39d5d7a..ec06f8467 100644 --- a/src/playermanager.cpp +++ b/src/playermanager.cpp @@ -29,6 +29,7 @@ #include "recipientfilters.h" #include "ctimer.h" #include "ctime" +#include "leader.h" #define VPROF_ENABLED #include "tier0/vprof.h" @@ -211,10 +212,12 @@ void ZEPlayer::ToggleFlashLight() static float g_flFloodInterval = 0.75f; static int g_iMaxFloodTokens = 3; static float g_flFloodCooldown = 3.0f; +static std::string g_sBeaconParticle = "particles/cs2fixes/player_beacon.vpcf"; FAKE_FLOAT_CVAR(cs2f_flood_interval, "Amount of time allowed between chat messages acquiring flood tokens", g_flFloodInterval, 0.75f, false) FAKE_INT_CVAR(cs2f_max_flood_tokens, "Maximum number of flood tokens allowed before chat messages are blocked", g_iMaxFloodTokens, 3, false) FAKE_FLOAT_CVAR(cs2f_flood_cooldown, "Amount of time to block messages for when a player floods", g_flFloodCooldown, 3.0f, false) +FAKE_STRING_CVAR(cs2f_beacon_particle, ".vpcf file to be precached and used for beacon", g_sBeaconParticle, false) bool ZEPlayer::IsFlooding() { @@ -245,6 +248,134 @@ bool ZEPlayer::IsFlooding() return false; } +void PrecacheBeaconParticle(IEntityResourceManifest* pResourceManifest) +{ + pResourceManifest->AddResource(g_sBeaconParticle.c_str()); +} + +void ZEPlayer::StartBeacon(Color color, ZEPlayerHandle hGiver/* = 0*/) +{ + CCSPlayerController* pPlayer = CCSPlayerController::FromSlot(m_slot); + + Vector vecAbsOrigin = pPlayer->GetPawn()->GetAbsOrigin(); + + vecAbsOrigin.z += 10; + + CParticleSystem* particle = (CParticleSystem*)CreateEntityByName("info_particle_system"); + + CEntityKeyValues* pKeyValues = new CEntityKeyValues(); + + pKeyValues->SetString("effect_name", g_sBeaconParticle.c_str()); + pKeyValues->SetInt("tint_cp", 1); + pKeyValues->SetVector("origin", vecAbsOrigin); + pKeyValues->SetBool("start_active", true); + + particle->m_clrTint->SetRawColor(color.GetRawColor()); + + particle->DispatchSpawn(pKeyValues); + particle->SetParent(pPlayer->GetPawn()); + + m_hBeaconParticle.Set(particle); + + CHandle hParticle = particle->GetHandle(); + ZEPlayerHandle hPlayer = m_Handle; + int iTeamNum = pPlayer->m_iTeamNum; + bool bLeaderBeacon = false; + + ZEPlayer *pGiver = hGiver.Get(); + if (pGiver && pGiver->IsLeader()) + bLeaderBeacon = true; + + new CTimer(1.0f, true, [hPlayer, hParticle, hGiver, iTeamNum, bLeaderBeacon]() + { + CParticleSystem *pParticle = hParticle.Get(); + + if (!hPlayer.IsValid() || !pParticle) + return -1.0f; + + CCSPlayerController *pPlayer = CCSPlayerController::FromSlot((CPlayerSlot) hPlayer.GetPlayerSlot()); + + if (pPlayer->m_iTeamNum < CS_TEAM_T || !pPlayer->m_hPlayerPawn->IsAlive() || pPlayer->m_iTeamNum != iTeamNum) + { + addresses::UTIL_Remove(pParticle); + return -1.0f; + } + + if (!bLeaderBeacon) + return 1.0f; + + ZEPlayer *pBeaconGiver = hGiver.Get(); + + // Continue beacon, leader is not on the server. No reason to remove the beacon + if (!pBeaconGiver) + return 1.0f; + + // Remove beacon granted by leader if his leader was stripped + if (!pBeaconGiver->IsLeader()) + { + addresses::UTIL_Remove(pParticle); + return -1.0f; + } + + return 1.0f; + }); +} + +void ZEPlayer::EndBeacon() +{ + CParticleSystem *pParticle = m_hBeaconParticle.Get(); + + if (pParticle) + addresses::UTIL_Remove(pParticle); +} + +void ZEPlayer::SetLeader(int leaderIndex) +{ + if (leaderIndex >= g_nLeaderColorMapSize) + { + m_iLeaderIndex = g_iLeaderIndex = 1; + return; + } + + m_iLeaderIndex = leaderIndex; +} + +int ZEPlayer::GetLeaderVoteCount() +{ + int iValidVoteCount = 0; + + for (int i = m_vecLeaderVotes.Count() - 1; i >= 0; i--) + { + if (m_vecLeaderVotes[i].IsValid()) + iValidVoteCount++; + else + m_vecLeaderVotes.Remove(i); + } + + return iValidVoteCount; +} + +bool ZEPlayer::HasPlayerVotedLeader(ZEPlayer *pPlayer) +{ + FOR_EACH_VEC(m_vecLeaderVotes, i) + { + if (m_vecLeaderVotes[i] == pPlayer) + return true; + } + + return false; +} + +void ZEPlayer::AddLeaderVote(ZEPlayer* pPlayer) +{ + m_vecLeaderVotes.AddToTail(pPlayer->GetHandle()); +} + +void ZEPlayer::PurgeLeaderVotes() +{ + m_vecLeaderVotes.Purge(); +} + void CPlayerManager::OnBotConnected(CPlayerSlot slot) { m_vecPlayers[slot.Get()] = new ZEPlayer(slot, true); diff --git a/src/playermanager.h b/src/playermanager.h index a1744669c..963ce89ec 100644 --- a/src/playermanager.h +++ b/src/playermanager.h @@ -25,6 +25,7 @@ #include "bitvec.h" #include "entity/lights.h" #include "entity/cparticlesystem.h" +#include "gamesystem.h" #define DECAL_PREF_KEY_NAME "hide_decals" #define HIDE_DISTANCE_PREF_KEY_NAME "hide_distance" @@ -111,6 +112,9 @@ class ZEPlayer m_iMZImmunity = 0; // out of 100 m_flNominateTime = -60.0f; m_iPlayerState = 1; // STATE_WELCOME is the initial state + m_iLeaderIndex = 0; + m_iLeaderTracerIndex = 0; + m_flLeaderVoteTime = -30.0f; } ~ZEPlayer() @@ -158,6 +162,9 @@ class ZEPlayer void SetFlashLight(CBarnLight *pLight) { m_hFlashLight.Set(pLight); } void SetBeaconParticle(CParticleSystem *pParticle) { m_hBeaconParticle.Set(pParticle); } void SetPlayerState(uint32 iPlayerState) { m_iPlayerState = iPlayerState; } + void SetLeader(int leaderIndex); + void SetLeaderTracer(int tracerIndex) { m_iLeaderTracerIndex = tracerIndex; }; + void SetLeaderVoteTime(float flCurtime) { m_flLeaderVoteTime = flCurtime; } bool IsMuted() { return m_bMuted; } bool IsGagged() { return m_bGagged; } @@ -180,12 +187,22 @@ class ZEPlayer CParticleSystem *GetBeaconParticle() { return m_hBeaconParticle.Get(); } ZEPlayerHandle GetHandle() { return m_Handle; } uint32 GetPlayerState() { return m_iPlayerState; } + bool IsLeader() { return (bool) m_iLeaderIndex; } + int GetLeaderIndex() { return m_iLeaderIndex; } + int GetLeaderTracer() { return m_iLeaderTracerIndex; } + int GetLeaderVoteCount(); + bool HasPlayerVotedLeader(ZEPlayer* pPlayer); + float GetLeaderVoteTime() { return m_flLeaderVoteTime; } void OnAuthenticated(); void CheckAdmin(); void CheckInfractions(); void SpawnFlashLight(); void ToggleFlashLight(); + void StartBeacon(Color color, ZEPlayerHandle Giver = 0); + void EndBeacon(); + void AddLeaderVote(ZEPlayer* pPlayer); + void PurgeLeaderVotes(); private: bool m_bAuthenticated; @@ -217,6 +234,10 @@ class ZEPlayer CHandle m_hBeaconParticle; ZEPlayerHandle m_Handle; uint32 m_iPlayerState; + int m_iLeaderIndex; + CUtlVector m_vecLeaderVotes; + int m_iLeaderTracerIndex; + float m_flLeaderVoteTime; }; class CPlayerManager @@ -274,4 +295,6 @@ class CPlayerManager uint64 m_nUsingStopDecals; }; -extern CPlayerManager *g_playerManager; \ No newline at end of file +extern CPlayerManager *g_playerManager; + +void PrecacheBeaconParticle(IEntityResourceManifest* pResourceManifest); \ No newline at end of file diff --git a/src/zombiereborn.cpp b/src/zombiereborn.cpp index f5d1bbf40..5e552d2c3 100644 --- a/src/zombiereborn.cpp +++ b/src/zombiereborn.cpp @@ -29,6 +29,7 @@ #include "entity/cparticlesystem.h" #include "user_preferences.h" #include +#include "leader.h" #include "tier0/memdbgon.h" @@ -352,6 +353,20 @@ void CZRPlayerClassManager::ApplyBaseClass(ZRClass* pClass, CCSPlayerPawn *pPawn UTIL_AddEntityIOEvent(pPawn, "SetScale", nullptr, nullptr, pClass->flScale); } +// only changes that should not (directly) affect gameplay +void CZRPlayerClassManager::ApplyBaseClassVisuals(ZRClass *pClass, CCSPlayerPawn *pPawn) +{ + Color clrRender; + V_StringToColor(pClass->szColor.c_str(), clrRender); + + pPawn->SetModel(pClass->szModelPath.c_str()); + pPawn->m_clrRender = clrRender; + pPawn->AcceptInput("Skin", pClass->iSkin); + + // This has to be done a bit later + UTIL_AddEntityIOEvent(pPawn, "SetScale", nullptr, nullptr, pClass->flScale); +} + ZRHumanClass* CZRPlayerClassManager::GetHumanClass(const char *pszClassName) { uint16 index = m_HumanClassMap.Find(hash_32_fnv1a_const(pszClassName)); @@ -366,6 +381,19 @@ void CZRPlayerClassManager::ApplyHumanClass(ZRHumanClass *pClass, CCSPlayerPawn CCSPlayerController *pController = CCSPlayerController::FromPawn(pPawn); if (pController) CZRRegenTimer::StopRegen(pController); + + if (!g_bEnableLeader || !pController) + return; + + ZEPlayer *pPlayer = g_playerManager->GetPlayer(pController->GetPlayerSlot()); + + if (pPlayer->IsLeader()) + new CTimer(0.02f, false, [pPawn]() + { + if (pPawn) + Leader_ApplyLeaderVisuals(pPawn); + return -1.0f; + }); } void CZRPlayerClassManager::ApplyPreferredOrDefaultHumanClass(CCSPlayerPawn *pPawn) @@ -392,6 +420,30 @@ void CZRPlayerClassManager::ApplyPreferredOrDefaultHumanClass(CCSPlayerPawn *pPa ApplyHumanClass(humanClass, pPawn); } +void CZRPlayerClassManager::ApplyPreferredOrDefaultHumanClassVisuals(CCSPlayerPawn *pPawn) +{ + CCSPlayerController *pController = CCSPlayerController::FromPawn(pPawn); + if (!pController) return; + + // Get the human class user preference, or default if no class is set + int iSlot = pController->GetPlayerSlot(); + ZRHumanClass* humanClass = nullptr; + const char* sPreferredHumanClass = g_pUserPreferencesSystem->GetPreference(iSlot, HUMAN_CLASS_KEY_NAME); + + // If the preferred human class exists and can be applied, override the default + uint16 index = m_HumanClassMap.Find(hash_32_fnv1a_const(sPreferredHumanClass)); + if (m_HumanClassMap.IsValidIndex(index) && m_HumanClassMap[index]->IsApplicableTo(pController)) { + humanClass = m_HumanClassMap[index]; + } else if (m_vecHumanDefaultClass.Count()) { + humanClass = m_vecHumanDefaultClass[rand() % m_vecHumanDefaultClass.Count()]; + } else if (!humanClass) { + Warning("Missing default human class or valid preferences!\n"); + return; + } + + ApplyBaseClassVisuals((ZRClass *)humanClass, pPawn); +} + ZRZombieClass* CZRPlayerClassManager::GetZombieClass(const char *pszClassName) { uint16 index = m_ZombieClassMap.Find(hash_32_fnv1a_const(pszClassName)); diff --git a/src/zombiereborn.h b/src/zombiereborn.h index e06f68560..80c56f64c 100644 --- a/src/zombiereborn.h +++ b/src/zombiereborn.h @@ -197,9 +197,11 @@ class CZRPlayerClassManager m_HumanClassMap.SetLessFunc(DefLessFunc(uint32)); }; void LoadPlayerClass(); + void ApplyBaseClassVisuals(ZRClass *pClass, CCSPlayerPawn *pPawn); ZRHumanClass* GetHumanClass(const char *pszClassName); void ApplyHumanClass(ZRHumanClass *pClass, CCSPlayerPawn *pPawn); void ApplyPreferredOrDefaultHumanClass(CCSPlayerPawn *pPawn); + void ApplyPreferredOrDefaultHumanClassVisuals(CCSPlayerPawn *pPawn); ZRZombieClass* GetZombieClass(const char*pszClassName); void ApplyZombieClass(ZRZombieClass *pClass, CCSPlayerPawn *pPawn); void ApplyPreferredOrDefaultZombieClass(CCSPlayerPawn *pPawn); From 7dba321ab6e2739aca16f5adce4cccb0c22028cc Mon Sep 17 00:00:00 2001 From: Fara <44729057+Faramour@users.noreply.github.com> Date: Thu, 14 Mar 2024 23:42:14 +0100 Subject: [PATCH 02/12] Add chat print to becoming a leader --- src/leader.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/leader.cpp b/src/leader.cpp index 143afee80..c866585cb 100644 --- a/src/leader.cpp +++ b/src/leader.cpp @@ -345,6 +345,8 @@ CON_COMMAND_CHAT(vl, " - Vote for a player to become a leader") Message("%s was voted for Leader with %i vote(s). LeaderIndex = %i\n", pTarget->GetPlayerName(), iNeededLeaderVoteCount, g_iLeaderIndex); ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "%s is now a Leader!", pTarget->GetPlayerName()); + + ClientPrint(pTarget, HUD_PRINTTALK, CHAT_PREFIX "You became a leader! Use !leaderhelp and !leadercolors commands to list available leader commands and colors"); // apply apparent leader perks (like leader model, glow(?)) here // also run a timer somewhere (per player or global) to reapply them From 0893c838b0cabb6035dc48725c9886928e9d35d0 Mon Sep 17 00:00:00 2001 From: Fara <44729057+Faramour@users.noreply.github.com> Date: Fri, 15 Mar 2024 00:06:21 +0100 Subject: [PATCH 03/12] Replace windows-only macro --- src/leader.cpp | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/leader.cpp b/src/leader.cpp index c866585cb..1319f8ede 100644 --- a/src/leader.cpp +++ b/src/leader.cpp @@ -79,7 +79,7 @@ Color Leader_ColorFromString(const char* pszColorName) int iColorIndex = V_StringToInt32(pszColorName, -1); if (iColorIndex > -1) - return LeaderColorMap[min(iColorIndex, g_nLeaderColorMapSize-1)].clColor; + return LeaderColorMap[MIN(iColorIndex, g_nLeaderColorMapSize-1)].clColor; for (int i = 0; i < g_nLeaderColorMapSize; i++) { @@ -461,8 +461,7 @@ CON_COMMAND_CHAT(defend, "[name|duration] [duration] - place a defend marker on ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on yourself lasting 30 seconds."); return; } - - iArg1 = min(iArg1, 60); + iArg1 = MIN(iArg1, 60); Leader_CreateDefendMarker(pPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, iArg1); ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on yourself lasting %i seconds.", iArg1); @@ -501,7 +500,7 @@ CON_COMMAND_CHAT(defend, "[name|duration] [duration] - place a defend marker on return; } - iArg2 = min(iArg2, 60); + iArg2 = MIN(iArg2, 60); Leader_CreateDefendMarker(pTargetPlayer, LeaderColorMap[pPlayer->GetLeaderIndex()].clColor, iArg2); ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Placed defend marker on %s lasting %i seconds.", pTarget->GetPlayerName(), iArg2); @@ -590,7 +589,7 @@ CON_COMMAND_CHAT(tracer, " [color] - toggle projectile tracers on a player int iIndex = V_StringToInt32(args[2], -1); if (iIndex > -1) - iTracerIndex = min(iIndex, g_nLeaderColorMapSize-1); + iTracerIndex = MIN(iIndex, g_nLeaderColorMapSize-1); else { for (int i = 0; i < g_nLeaderColorMapSize; i++) @@ -855,7 +854,7 @@ CON_COMMAND_CHAT_FLAGS(forceld, " [color]- forces leader status on a playe if (iColorIndex > -1) { - iColorIndex = min(iColorIndex, g_nLeaderColorMapSize-1); + iColorIndex = MIN(iColorIndex, g_nLeaderColorMapSize-1); } else { From 6f6303abb41ce4f7e0d6f363f790bfe3b8632f62 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Fri, 29 Mar 2024 17:46:57 +0100 Subject: [PATCH 04/12] move GetModelName to cbasemodelentity.h --- src/cs2_sdk/entity/cbaseentity.h | 5 ----- src/cs2_sdk/entity/cbasemodelentity.h | 5 +++++ 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/cs2_sdk/entity/cbaseentity.h b/src/cs2_sdk/entity/cbaseentity.h index 5ac98d62b..315f1143f 100644 --- a/src/cs2_sdk/entity/cbaseentity.h +++ b/src/cs2_sdk/entity/cbaseentity.h @@ -233,11 +233,6 @@ class Z_CBaseEntity : public CBaseEntity } const char* GetName() const { return m_pEntity->m_name.String(); } - - const char* GetModelName() - { - return ((CSkeletonInstance*)m_CBodyComponent->m_pSceneNode.Get())->m_modelState().m_ModelName.Get().String(); - } }; class SpawnPoint : public Z_CBaseEntity diff --git a/src/cs2_sdk/entity/cbasemodelentity.h b/src/cs2_sdk/entity/cbasemodelentity.h index 840e9d0fb..7c7600355 100644 --- a/src/cs2_sdk/entity/cbasemodelentity.h +++ b/src/cs2_sdk/entity/cbasemodelentity.h @@ -36,4 +36,9 @@ class CBaseModelEntity : public Z_CBaseEntity { addresses::CBaseModelEntity_SetModel(this, szModel); } + + const char* GetModelName() + { + return ((CSkeletonInstance*)m_CBodyComponent->m_pSceneNode.Get())->m_modelState().m_ModelName.Get().String(); + } }; \ No newline at end of file From df14d8e8493c00bec811642d6585b8b341b9d006 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sun, 31 Mar 2024 18:02:35 +0200 Subject: [PATCH 05/12] add nullcheck --- src/zombiereborn.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/zombiereborn.cpp b/src/zombiereborn.cpp index 5e552d2c3..d63e592b6 100644 --- a/src/zombiereborn.cpp +++ b/src/zombiereborn.cpp @@ -387,7 +387,7 @@ void CZRPlayerClassManager::ApplyHumanClass(ZRHumanClass *pClass, CCSPlayerPawn ZEPlayer *pPlayer = g_playerManager->GetPlayer(pController->GetPlayerSlot()); - if (pPlayer->IsLeader()) + if (pPlayer && pPlayer->IsLeader()) new CTimer(0.02f, false, [pPawn]() { if (pPawn) From 9e684ab18677c13152ae90c33f4c6bde45b625da Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sat, 6 Apr 2024 21:58:17 +0100 Subject: [PATCH 06/12] add glow command --- src/cs2fixes.cpp | 6 ++ src/leader.cpp | 141 +++++++++++++++++++++++++++++++++++++++++- src/playermanager.cpp | 90 +++++++++++++++++++++++++++ src/playermanager.h | 7 ++- 4 files changed, 242 insertions(+), 2 deletions(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index f5a697194..618a8eb17 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -721,6 +721,12 @@ void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo **ppInfoList, int infoCount if (pSelfZEPlayer->ShouldBlockTransmit(j) || !pPawn->IsAlive() || (pOtherZEPlayer && !pOtherZEPlayer->IsLeader())) pInfo->m_pTransmitEntity->Clear(pPawn->entindex()); } + + // Don't transmit glow model to it's owner + CBaseModelEntity *pGlowModel = pSelfZEPlayer->GetGlowModel(); + + if (pGlowModel) + pInfo->m_pTransmitEntity->Clear(pGlowModel->entindex()); } VPROF_EXIT_SCOPE(); diff --git a/src/leader.cpp b/src/leader.cpp index 1319f8ede..9a565f6b2 100644 --- a/src/leader.cpp +++ b/src/leader.cpp @@ -36,7 +36,7 @@ LeaderColor LeaderColorMap[] = { {"orange", Color(185, 93, 63, 255)}, // Default T color {"green", Color(100, 230, 100, 255)}, {"yellow", Color(200, 200, 0, 255)}, - {"purple", Color(79, 9, 146, 255)}, + {"purple", Color(164, 73, 255, 255)}, {"red", Color(214, 39, 40, 255)}, // Last leader index }; @@ -256,6 +256,142 @@ void Leader_Precache(IEntityResourceManifest *pResourceManifest) pResourceManifest->AddResource("particles/cs2fixes/leader_defend_mark.vpcf"); } +CON_COMMAND_CHAT(glow, " [duration] - toggle glow on a player") +{ + int iPlayerSlot = player ? player->GetPlayerSlot() : -1; + ZEPlayer* pPlayer = g_playerManager->GetPlayer((CPlayerSlot)iPlayerSlot); + + bool bIsAdmin; + if (pPlayer) + bIsAdmin = pPlayer->IsAdminFlagSet(ADMFLAG_GENERIC); + else // console + bIsAdmin = true; + + Color color; + int iDuration = 0; + if (args.ArgC() == 3) + iDuration = V_StringToInt32(args[2], 0); + + int iNumClients = 0; + int pSlots[MAXPLAYERS]; + ETargetType nTargetType = g_playerManager->TargetPlayerString(iPlayerSlot, args[1], iNumClients, pSlots); + + if (bIsAdmin) // Admin command logic + { + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !glow [duration]"); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + const char* pszCommandPlayerName = player ? player->GetPlayerName() : "Console"; + + for (int i = 0; i < iNumClients; i++) + { + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlots[i]); + + if (!pTarget) + continue; + + if (pTarget->m_iTeamNum < CS_TEAM_T) + continue; + + // Exception - Use LeaderIndex color if Admin is also a Leader + if (pPlayer && pPlayer->IsLeader()) + color = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; + else + color = pTarget->m_iTeamNum == CS_TEAM_T ? LeaderColorMap[2].clColor/*orange*/ : LeaderColorMap[1].clColor/*blue*/; + + ZEPlayer *pPlayerTarget = g_playerManager->GetPlayer(pSlots[i]); + + if (!pPlayerTarget->GetGlowModel()) + pPlayerTarget->StartGlow(color, iDuration); + else + pPlayerTarget->EndGlow(); + + if (nTargetType < ETargetType::ALL) + PrintSingleAdminAction(pszCommandPlayerName, pTarget->GetPlayerName(), "toggled glow on", "", CHAT_PREFIX); + } + + PrintMultiAdminAction(nTargetType, pszCommandPlayerName, "toggled glow on", "", CHAT_PREFIX); + + return; + } + + // Leader command logic + + if (!g_bEnableLeader) + return; + + if (!pPlayer->IsLeader()) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a Leader or an Admin to use this command."); + return; + } + + if (args.ArgC() < 2) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Usage: !glow [duration]"); + return; + } + + if (player->m_iTeamNum != CS_TEAM_CT && g_bLeaderActionsHumanOnly) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must be a human to use this command."); + return; + } + + if (nTargetType > ETargetType::SELF) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You must target a specific player."); + return; + } + + if (!iNumClients) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "Target not found."); + return; + } + + if (iNumClients > 1) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "More than one player fit the target name."); + return; + } + + CCSPlayerController* pTarget = CCSPlayerController::FromSlot(pSlots[0]); + + if (!pTarget) + return; + + if (pTarget->m_iTeamNum != CS_TEAM_CT) + { + ClientPrint(player, HUD_PRINTTALK, CHAT_PREFIX "You can only place Leader glow on a human."); + return; + } + + color = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; + + ZEPlayer *pPlayerTarget = g_playerManager->GetPlayer(pSlots[0]); + + if (!pPlayerTarget->GetGlowModel()) + { + pPlayerTarget->StartGlow(color, iDuration); + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "Leader %s enabled glow on %s.", player->GetPlayerName(), pTarget->GetPlayerName()); + } + else + { + pPlayerTarget->EndGlow(); + ClientPrintAll(HUD_PRINTTALK, CHAT_PREFIX "Leader %s disabled glow on %s.", player->GetPlayerName(), pTarget->GetPlayerName()); + } +} + CON_COMMAND_CHAT(vl, " - Vote for a player to become a leader") { if (!g_bEnableLeader) @@ -649,6 +785,9 @@ CON_COMMAND_CHAT(beacon, " [color] - toggle beacon on a player") if (!pTarget) continue; + if (pTarget->m_iTeamNum < CS_TEAM_T) + continue; + // Exception - Use LeaderIndex color if Admin is also a Leader if (args.ArgC() == 2 && pPlayer && pPlayer->IsLeader()) color = LeaderColorMap[pPlayer->GetLeaderIndex()].clColor; diff --git a/src/playermanager.cpp b/src/playermanager.cpp index ec06f8467..6ec729f20 100644 --- a/src/playermanager.cpp +++ b/src/playermanager.cpp @@ -376,6 +376,96 @@ void ZEPlayer::PurgeLeaderVotes() m_vecLeaderVotes.Purge(); } +void ZEPlayer::StartGlow(Color color, int duration) +{ + CCSPlayerController *pController = CCSPlayerController::FromSlot(m_slot); + CCSPlayerPawn *pPawn = (CCSPlayerPawn*)pController->GetPawn(); + + const char *pszModelName = pPawn->GetModelName(); + + CBaseModelEntity *pModelGlow = (CBaseModelEntity*)CreateEntityByName("prop_dynamic"); + CBaseModelEntity *pModelRelay = (CBaseModelEntity*)CreateEntityByName("prop_dynamic"); + CEntityKeyValues *pKeyValuesRelay = new CEntityKeyValues(); + + pKeyValuesRelay->SetString("model", pszModelName); + pKeyValuesRelay->SetInt64("spawnflags", 256U); + pKeyValuesRelay->SetInt("rendermode", kRenderNone); + + CEntityKeyValues *pKeyValuesGlow = new CEntityKeyValues(); + pKeyValuesGlow->SetString("model", pszModelName); + pKeyValuesGlow->SetInt64("spawnflags", 256U); + pKeyValuesGlow->SetColor("glowcolor", color); + pKeyValuesGlow->SetInt("glowrange", 5000); + pKeyValuesGlow->SetInt("glowteam", -1); + pKeyValuesGlow->SetInt("glowstate", 3); + pKeyValuesGlow->SetInt("renderamt", 1); + + pModelGlow->DispatchSpawn(pKeyValuesGlow); + pModelRelay->DispatchSpawn(pKeyValuesRelay); + pModelRelay->AcceptInput("FollowEntity", "!activator", pPawn); + pModelGlow->AcceptInput("FollowEntity", "!activator", pModelRelay); + + m_hGlowModel.Set(pModelGlow); + + CHandle hGlowModel = m_hGlowModel; + CHandle hPawn = pPawn->GetHandle(); + int iTeamNum = hPawn->m_iTeamNum(); + + // check if player's team or model changed + new CTimer(0.5f, false, [hGlowModel, hPawn, iTeamNum]() + { + CBaseModelEntity *pModel = hGlowModel.Get(); + CCSPlayerPawn *pawn = hPawn.Get(); + + if (!pawn || !pModel) + return -1.0f; + + if (pawn->m_iTeamNum != iTeamNum || strcmp(pModel->GetModelName(), pawn->GetModelName())) + { + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + + if (pModelParent) + addresses::UTIL_Remove(pModelParent); + + return -1.0f; + } + + return 0.5f; + }); + + // kill glow after duration, if provided + if (duration < 1) + return; + + new CTimer((float)duration, false, [hGlowModel]() + { + CBaseModelEntity *pModel = hGlowModel.Get(); + + if (!pModel) + return -1.0f; + + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + + if (pModelParent) + addresses::UTIL_Remove(pModelParent); + + return -1.0f; + }); +} + +void ZEPlayer::EndGlow() +{ + CBaseModelEntity *pGlowModel = m_hGlowModel.Get(); + + if (!pGlowModel) + return; + + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pGlowModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + + if (pModelParent) + addresses::UTIL_Remove(pModelParent); +} + void CPlayerManager::OnBotConnected(CPlayerSlot slot) { m_vecPlayers[slot.Get()] = new ZEPlayer(slot, true); diff --git a/src/playermanager.h b/src/playermanager.h index 963ce89ec..329369142 100644 --- a/src/playermanager.h +++ b/src/playermanager.h @@ -163,8 +163,9 @@ class ZEPlayer void SetBeaconParticle(CParticleSystem *pParticle) { m_hBeaconParticle.Set(pParticle); } void SetPlayerState(uint32 iPlayerState) { m_iPlayerState = iPlayerState; } void SetLeader(int leaderIndex); - void SetLeaderTracer(int tracerIndex) { m_iLeaderTracerIndex = tracerIndex; }; + void SetLeaderTracer(int tracerIndex) { m_iLeaderTracerIndex = tracerIndex; } void SetLeaderVoteTime(float flCurtime) { m_flLeaderVoteTime = flCurtime; } + void SetGlowModel(CBaseModelEntity *pModel) { m_hGlowModel.Set(pModel); } bool IsMuted() { return m_bMuted; } bool IsGagged() { return m_bGagged; } @@ -193,6 +194,7 @@ class ZEPlayer int GetLeaderVoteCount(); bool HasPlayerVotedLeader(ZEPlayer* pPlayer); float GetLeaderVoteTime() { return m_flLeaderVoteTime; } + CBaseModelEntity *GetGlowModel() { return m_hGlowModel.Get(); } void OnAuthenticated(); void CheckAdmin(); @@ -203,6 +205,8 @@ class ZEPlayer void EndBeacon(); void AddLeaderVote(ZEPlayer* pPlayer); void PurgeLeaderVotes(); + void StartGlow(Color color, int duration); + void EndGlow(); private: bool m_bAuthenticated; @@ -238,6 +242,7 @@ class ZEPlayer CUtlVector m_vecLeaderVotes; int m_iLeaderTracerIndex; float m_flLeaderVoteTime; + CHandle m_hGlowModel; }; class CPlayerManager From 2f3cd74b128a582e407f7a4527c5c53014aea374 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sat, 6 Apr 2024 22:03:50 +0100 Subject: [PATCH 07/12] add glow cmd to leaderhelp --- src/leader.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/leader.cpp b/src/leader.cpp index 9a565f6b2..35d29b30d 100644 --- a/src/leader.cpp +++ b/src/leader.cpp @@ -256,7 +256,7 @@ void Leader_Precache(IEntityResourceManifest *pResourceManifest) pResourceManifest->AddResource("particles/cs2fixes/leader_defend_mark.vpcf"); } -CON_COMMAND_CHAT(glow, " [duration] - toggle glow on a player") +CON_COMMAND_CHAT(glow, " [duration] - toggle glow highlight on a player") { int iPlayerSlot = player ? player->GetPlayerSlot() : -1; ZEPlayer* pPlayer = g_playerManager->GetPlayer((CPlayerSlot)iPlayerSlot); @@ -917,6 +917,7 @@ CON_COMMAND_CHAT(leaderhelp, "- list leader commands in chat") ClientPrint(player, iDestination, CHAT_PREFIX "!beacon [color] - place a beacon on player"); ClientPrint(player, iDestination, CHAT_PREFIX "!tracer [color] - give player tracers"); ClientPrint(player, iDestination, CHAT_PREFIX "!defend [name|duration] [duration] - place defend mark on player"); + ClientPrint(player, iDestination, CHAT_PREFIX "!glow [duration] - toggle glow highlight on a player") } CON_COMMAND_CHAT(leadercolors, "- list leader colors in chat") From 7d6c53d6d24d1cd7a3a885597b824a74127f25e5 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sun, 7 Apr 2024 12:58:28 +0100 Subject: [PATCH 08/12] fix build failure --- AMBuilder | 4 ++++ src/leader.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/AMBuilder b/AMBuilder index 0b2b25176..af421dc60 100644 --- a/AMBuilder +++ b/AMBuilder @@ -65,6 +65,10 @@ for sdk_target in MMSPlugin.sdk_targets: 'src/customio.cpp', 'src/entitylistener.cpp', 'src/leader.cpp', + 'sdk/entity2/entitysystem.cpp', + 'sdk/entity2/entityidentity.cpp', + 'sdk/entity2/entitykeyvalues.cpp', + 'sdk/tier1/keyvalues3.cpp', ] protoc_builder = builder.tools.Protoc(protoc = sdk_target.protoc, sources = [ diff --git a/src/leader.cpp b/src/leader.cpp index 35d29b30d..4330629b0 100644 --- a/src/leader.cpp +++ b/src/leader.cpp @@ -917,7 +917,7 @@ CON_COMMAND_CHAT(leaderhelp, "- list leader commands in chat") ClientPrint(player, iDestination, CHAT_PREFIX "!beacon [color] - place a beacon on player"); ClientPrint(player, iDestination, CHAT_PREFIX "!tracer [color] - give player tracers"); ClientPrint(player, iDestination, CHAT_PREFIX "!defend [name|duration] [duration] - place defend mark on player"); - ClientPrint(player, iDestination, CHAT_PREFIX "!glow [duration] - toggle glow highlight on a player") + ClientPrint(player, iDestination, CHAT_PREFIX "!glow [duration] - toggle glow highlight on a player"); } CON_COMMAND_CHAT(leadercolors, "- list leader colors in chat") From eab707faddf32c28fdc4525bd9cd2f87b06f42a1 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sun, 7 Apr 2024 16:29:04 +0100 Subject: [PATCH 09/12] fix build failure v2 --- PackageScript | 1 - 1 file changed, 1 deletion(-) diff --git a/PackageScript b/PackageScript index 335b684ac..bc6508fc6 100644 --- a/PackageScript +++ b/PackageScript @@ -68,7 +68,6 @@ builder.AddCopy(os.path.join('gamedata', 'cs2fixes.games.txt'), gamedata_folder) particles_cs2f_folder = builder.AddFolder(os.path.join('particles', MMSPlugin.plugin_name)) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'player_beacon.vpcf_c'), particles_cs2f_folder) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'player_beacon_tint.vpcf_c'), particles_cs2f_folder) -builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'simple_overlay.vpcf_c'), particles_cs2f_folder) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_defend_mark.vpcf_c'), particles_cs2f_folder) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_defend_mark_ground.vpcf_c'), particles_cs2f_folder) builder.AddCopy(os.path.join(builder.sourcePath, 'assets', 'particles', MMSPlugin.plugin_name, 'leader_tracer.vpcf_c'), particles_cs2f_folder) From d3443b9b93ffae58616beb968571ef47c34b4ebb Mon Sep 17 00:00:00 2001 From: Fara <44729057+Faramour@users.noreply.github.com> Date: Tue, 9 Apr 2024 21:18:22 +0200 Subject: [PATCH 10/12] add nullcheck to glowmodel parent retrieving --- src/playermanager.cpp | 21 ++++++++++++++++++--- 1 file changed, 18 insertions(+), 3 deletions(-) diff --git a/src/playermanager.cpp b/src/playermanager.cpp index d20d7510e..533e399ee 100644 --- a/src/playermanager.cpp +++ b/src/playermanager.cpp @@ -422,7 +422,12 @@ void ZEPlayer::StartGlow(Color color, int duration) if (pawn->m_iTeamNum != iTeamNum || strcmp(pModel->GetModelName(), pawn->GetModelName())) { - CBaseModelEntity *pModelParent = (CBaseModelEntity*)pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + CGameSceneNode *pParentSceneNode = pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent(); + + if (!pParentSceneNode) + return -1.0f; + + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pParentSceneNode->m_pOwner(); if (pModelParent) addresses::UTIL_Remove(pModelParent); @@ -444,7 +449,12 @@ void ZEPlayer::StartGlow(Color color, int duration) if (!pModel) return -1.0f; - CBaseModelEntity *pModelParent = (CBaseModelEntity*)pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + CGameSceneNode *pParentSceneNode = pModel->m_CBodyComponent()->m_pSceneNode()->m_pParent(); + + if (!pParentSceneNode) + return -1.0f; + + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pParentSceneNode->m_pOwner(); if (pModelParent) addresses::UTIL_Remove(pModelParent); @@ -460,7 +470,12 @@ void ZEPlayer::EndGlow() if (!pGlowModel) return; - CBaseModelEntity *pModelParent = (CBaseModelEntity*)pGlowModel->m_CBodyComponent()->m_pSceneNode()->m_pParent()->m_pOwner(); + CGameSceneNode *pParentSceneNode = pGlowModel->m_CBodyComponent()->m_pSceneNode()->m_pParent(); + + if (!pParentSceneNode) + return; + + CBaseModelEntity *pModelParent = (CBaseModelEntity*)pParentSceneNode->m_pOwner(); if (pModelParent) addresses::UTIL_Remove(pModelParent); From 32272cd93dbd6b512764e5674e4c0c0383fd0356 Mon Sep 17 00:00:00 2001 From: Faramour <44729057+Faramour@users.noreply.github.com> Date: Sun, 14 Apr 2024 16:17:42 +0100 Subject: [PATCH 11/12] fix hide condition --- src/cs2fixes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 3cf1865d2..01147d115 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -709,7 +709,7 @@ void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo **ppInfoList, int infoCount // TODO: Revert this if/when valve fixes the issue? // Also do not hide leaders to other players ZEPlayer *pOtherZEPlayer = g_playerManager->GetPlayer(j); - if (pSelfZEPlayer->ShouldBlockTransmit(j) || !pPawn->IsAlive() || (pOtherZEPlayer && !pOtherZEPlayer->IsLeader())) + if ((pSelfZEPlayer->ShouldBlockTransmit(j) && !pOtherZEPlayer->IsLeader()) || !pPawn->IsAlive()) pInfo->m_pTransmitEntity->Clear(pPawn->entindex()); } From 4828205b6acaf0bb7bdf2f1e05439d0ae0c58e64 Mon Sep 17 00:00:00 2001 From: Fara <44729057+Faramour@users.noreply.github.com> Date: Mon, 15 Apr 2024 18:21:25 +0200 Subject: [PATCH 12/12] add nullcheck to hide condition --- src/cs2fixes.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cs2fixes.cpp b/src/cs2fixes.cpp index 01147d115..8eccb9587 100644 --- a/src/cs2fixes.cpp +++ b/src/cs2fixes.cpp @@ -709,7 +709,7 @@ void CS2Fixes::Hook_CheckTransmit(CCheckTransmitInfo **ppInfoList, int infoCount // TODO: Revert this if/when valve fixes the issue? // Also do not hide leaders to other players ZEPlayer *pOtherZEPlayer = g_playerManager->GetPlayer(j); - if ((pSelfZEPlayer->ShouldBlockTransmit(j) && !pOtherZEPlayer->IsLeader()) || !pPawn->IsAlive()) + if ((pSelfZEPlayer->ShouldBlockTransmit(j) && (pOtherZEPlayer && !pOtherZEPlayer->IsLeader())) || !pPawn->IsAlive()) pInfo->m_pTransmitEntity->Clear(pPawn->entindex()); }